/*
  nc-product.css — nowa karta produktu damidomo.pl
  Port z projektu Lovable (Tailwind → vanilla CSS)
  Prefiks: nc- (new-card) — izolacja od istniejących styli
*/

/* Poppins — ten sam font co reszta sklepu (ładowany lokalnie przez tpl-parts/font/font.tpl, wagi 300-700) */

/* ─────────────────────────────────────────────
  THEME OVERRIDES — reset stylów motywu
  ───────────────────────────────────────────── */
html,
body {
  overflow-x: clip !important;
}

/* Rezerwuje na stałe miejsce na pionowy scrollbar, niezależnie od tego, czy
  akurat jest widoczny. Bez tego: każde zablokowanie scrolla tła pod
  modalem/drawerem (overflow:hidden na body — patrz bulb-sidebar.js,
  ajax-cart.js/sideCartDrawer) usuwa scrollbar, strona fizycznie robi się
  szersza o jego szerokość, i cała karta "skacze" w prawo na ułamek
  sekundy przy otwieraniu/zamykaniu, zanim ręczna kompensacja (JS dopisujący
  padding-right) zdąży to wyrównać. Gutter zarezerwowany na stałe = ta
  szerokość nigdy się nie zmienia, więc nie ma czego kompensować ani co
  ma "skoczyć". */
html { scrollbar-gutter: stable; }

#nc-product-page { font-family: 'Poppins', system-ui, -apple-system, sans-serif !important; }

/* h1 w nowej karcie — reset ALL CAPS z motywu */
#nc-product-page h1.nc-product-title {
  text-transform: none !important;
  letter-spacing: -0.01em !important;
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-size: 18px !important;
  font-weight: 700 !important;
  line-height: 1.3 !important;
  color: hsl(0 0% 12%) !important;
  margin: 0 !important;
  padding: 0 !important;
  border: none !important;
}
@media (min-width: 1024px) {
  #nc-product-page h1.nc-product-title { font-size: 20px !important; }
}

/* Reset inputów z motywu */
#nc-product-page input.nc-qty-input {
  border-left: 1px solid var(--nc-border) !important;
  border-right: 1px solid var(--nc-border) !important;
  border-top: none !important;
  border-bottom: none !important;
  box-shadow: none !important;
  outline: none !important;
  background: transparent !important;
  font-family: 'Poppins', system-ui, sans-serif !important;
}

/* Reset przycisków z motywu */
#nc-product-page button.nc-btn,
#nc-product-page button.nc-qty-btn,
#nc-product-page button.nc-tertiary-btn,
#nc-product-page button.nc-delivery-row,
#nc-product-page button.nc-accordion-trigger {
  font-family: 'Poppins', system-ui, sans-serif !important;
  border-radius: var(--nc-radius) !important;
  text-transform: none !important;
  letter-spacing: normal !important;
  box-shadow: none !important;
}

/* Reset ceny z motywu */
#nc-product-page .nc-price-current {
  font-family: 'Poppins', system-ui, sans-serif !important;
  color: hsl(0, 0%, 0%) !important;
}

/* Upewnij się że grid działa bez zakłóceń */
#nc-product-page .nc-product-grid {
  display: grid !important;
  gap: 1.5rem !important;
}
@media (min-width: 1024px) {
  #nc-product-page .nc-product-grid {
    grid-template-columns: minmax(0, 1fr) 440px !important;
    gap: 2.5rem !important;
  }
}

/* Galeria — upewnij się że działa */
#nc-product-page .nc-gallery-desktop {
  display: none !important;
}
@media (min-width: 1024px) {
  #nc-product-page .nc-gallery-desktop {
    display: grid !important;
    grid-template-columns: repeat(2, 1fr) !important;
    gap: 0.75rem !important;
  }
}
#nc-product-page .nc-gallery-mobile {
  display: flex !important;
  flex-direction: column-reverse !important;
  gap: 0.75rem !important;
}
@media (min-width: 1024px) {
  #nc-product-page .nc-gallery-mobile { display: none !important; }
}

/* ─────────────────────────────────────────────
  DESIGN TOKENS (port z index.css Lovable)
  ───────────────────────────────────────────── */
#nc-product-page,
.nc-lightbox,
.nc-modal,
.nc-bulbs-drawer,
.nc-sticky-mobile,
.nc-sticky-desktop,
#blockviewed-wrapper {
  --nc-bg:          hsl(0 0% 100%);
  --nc-fg:          hsl(0 0% 12%);
  --nc-card:        hsl(0 0% 100%);

  /* damidomo bordo */
  --nc-primary:     hsl(283 76% 43.7%);
  --nc-primary-hover: hsl(283 76% 37.7%);
  --nc-primary-fg:  hsl(0 0% 100%);

  --nc-secondary:   hsl(36 30% 96%);
  --nc-product-bg:  hsl(36 30% 96%);
  --nc-muted:       hsl(30 12% 95%);
  --nc-muted-fg:    hsl(0 0% 38%);
  --nc-success:     hsl(142 60% 35%);
  --nc-border:      hsl(30 10% 88%);
  --nc-radius:      0.5rem;

  --nc-shadow-card: 0 1px 2px 0 hsl(0 0% 0% / .04), 0 4px 12px -2px hsl(0 0% 0% / .06);
  --nc-shadow-sticky: 0 10px 30px -12px hsl(283 30% 20% / .18);

  /* Layout */
  --nc-container-max: 1400px;
  --nc-gap-section: 2rem;          /* 32px */
}

/* ─────────────────────────────────────────────
  UTILITIES
  ───────────────────────────────────────────── */
.nc-sr-only {
  position: absolute;
  width: 1px; height: 1px;
  padding: 0; margin: -1px;
  overflow: hidden;
  clip: rect(0,0,0,0);
  white-space: nowrap;
  border: 0;
}

/* ─────────────────────────────────────────────
  RESET / SCOPE — tylko wewnątrz nc-page
  ───────────────────────────────────────────── */
#nc-product-page *,
.nc-lightbox *,
.nc-modal * {
  box-sizing: border-box;
}

/* ─────────────────────────────────────────────
  LAYOUT — container + grid
  ───────────────────────────────────────────── */
.nc-container {
  padding-left: 5px !important;
  padding-right: 5px !important;
}
@media (min-width: 640px) { .nc-container { padding-inline: 1rem; } }
@media (min-width: 1024px) { .nc-container { padding-inline: 1.5rem; } }

/* #columns.container — to jest ZEWNĘTRZNY kontener motywu (global.css: ".container
{ padding-left:15px; padding-right:15px }"), przodek #nc-product-page, nie jego
  potomek — #nc-product-page .nc-container (wyżej) nigdy go nie dosięgnie, bo
  scoping działa tylko w dół drzewa DOM. :has() ogranicza override wyłącznie do
  stron z nową kartą produktu (zamiast psuć margines #columns wszędzie indziej
  w sklepie, gdzie ta sama klasa .container jest używana masowo). Tylko mobile —
  na desktopie zostaje domyślne 15px. */
@media (max-width: 767px) {
  #columns.container:has(#nc-product-page) {
    padding-left: 5px !important;
    padding-right: 5px !important;
  }
}

/* .nc-main { padding-bottom: calc(56px + env(safe-area-inset-bottom)); } */
@media (min-width: 1024px) { .nc-main { padding-bottom: 0; } }

/* Główna siatka: galeria | panel */
.nc-product-grid {
  display: grid;
  gap: 1.5rem;
  padding-bottom: 2.5rem;
}
@media (min-width: 1024px) {
  .nc-product-grid {
    grid-template-columns: minmax(0, 1fr) 440px;
    gap: 2.5rem;
  }
}

.nc-col-gallery,
.nc-col-purchase { min-width: 0; }

.nc-key-specs-wrap { margin-bottom: 2rem; }
.nc-tabs-wrap { margin-bottom: 2rem; }
.nc-bulbs-section {
  padding-block: 1.75rem;
  scroll-margin-top: 8rem;
}
@media (min-width: 640px) { .nc-bulbs-section { padding-block: 2.5rem; } }

/* ─────────────────────────────────────────────
  BREADCRUMBS WRAP
  ───────────────────────────────────────────── */
.nc-breadcrumbs-wrap {
  max-width: var(--nc-container-max);
  /* margin-inline: auto; */
  padding-inline: 0.75rem;
  /* padding-block: 0.5rem; */
}

/* ─────────────────────────────────────────────
  GALERIA — DESKTOP (siatka 2 kolumn)
  ───────────────────────────────────────────── */
.nc-gallery-desktop {
  display: none;
  grid-template-columns: repeat(2, 1fr);
  gap: 0.75rem;
}
@media (min-width: 1024px) { .nc-gallery-desktop { display: grid; } }

.nc-gallery-thumb {
  position: relative;
  aspect-ratio: 1;
  border-radius: var(--nc-radius);
  overflow: hidden;
  background: var(--nc-product-bg);
  border: 1px solid var(--nc-border);
  cursor: pointer;
  transition: border-color .15s;
  padding: 0;
}
@media (hover: hover) and (pointer: fine) {
.nc-gallery-thumb:hover { border-color: hsl(0 0% 50%); }
}


.nc-gallery-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  padding: 0;
}

.nc-gallery-img,
.nc-main-img,
.nc-thumb-btn img,
.nc-lb-rail-thumb img,
.nc-lb-thumb-mobile img,
.nc-xs-thumb img,
.nc-fb-thumb-img {
  background-color: var(--nc-product-bg);
  opacity: 0;
  transition: opacity .15s ease;
}
.nc-gallery-img.nc-cropped,
.nc-main-img.nc-cropped,
.nc-thumb-btn img.nc-cropped,
.nc-lb-rail-thumb img.nc-cropped,
.nc-lb-thumb-mobile img.nc-cropped,
.nc-xs-thumb img.nc-cropped,
.nc-fb-thumb-img.nc-cropped {
  opacity: 1;
}

/* Zdjęcia lifestyle/aranżacyjne (produkt w kontekście wnętrza — tło nie
  jest jednolicie białe, więc squareCropImage w nc-product.js świadomie
  zostawia oryginalny plik nietknięty, patrz komentarz tam) — domyślne
  object-fit:cover (wyżej, przy każdym z tych selektorów) przycinałoby
  taką fotografię do kwadratu kafla, obcinając np. górę/dół kompozycji.
  object-fit:contain pokazuje całe zdjęcie, z listwami w kolorze tła
  kafla (var(--nc-product-bg), ten sam background-color co reguła
  .nc-cropped wyżej) zamiast przycięcia. */
.nc-gallery-img.nc-lifestyle,
.nc-main-img.nc-lifestyle,
.nc-thumb-btn img.nc-lifestyle,
.nc-lb-rail-thumb img.nc-lifestyle,
.nc-lb-thumb-mobile img.nc-lifestyle,
.nc-xs-thumb img.nc-lifestyle,
.nc-fb-thumb-img.nc-lifestyle {
  object-fit: contain;
}

/* Podglądnięte u konkurencji (luminadeco.pl, ten sam silnik/szablon) —
  zamiast przemalowywać tło NA PIKSELACH w JS (canvas, patrz zakomentowane
  NCImageCrop.recolorBackground w nc-product.js — porzucone po serii
  "plam"/"smug" opisanych tam), zostawiamy oryginalne, prawie-białe tło
  zdjęcia nietknięte i każemy przeglądarce przebarwić je SAMEJ, ciągle,
  piksel-po-pikselu: "darken" bierze ciemniejszy z dwóch kolorów kanał po
  kanale — jaśniejszy od beżu piksel (biel studyjnego tła, miękki cień)
  przegrywa z tłem RODZICA (background-color: var(--nc-product-bg) na
  .nc-gallery-thumb/.nc-thumb-btn/.nc-gallery-main/.nc-lb-rail-thumb —
  malowane POD tym <img>), a ciemniejszy piksel samego produktu zostaje
  sobą. Bez żadnego twardego progu nie ma się czego "przeciąć" — miękki
  gradient cienia płynnie wtapia się w beż. Klasa nadawana w JS
  (squareCropImage) TYLKO na ścieżce prawdziwego studyjnego białego tła +
  wymuszonego fillColor — świadomie NIE na .nc-lifestyle (tło bywa
  dowolnym kolorem, blend by je zafałszował) ani na ręcznych wyjątkach
  (NC_RAW_IMAGE_EXCEPTIONS w nc-product.js). */
.nc-bg-blend {
  mix-blend-mode: darken;
}

.nc-gallery-zoom-hint {
  position: absolute;
  bottom: 0.75rem;
  right: 0.75rem;
  display: flex;
  align-items: center;
  gap: 0.375rem;
  background: hsl(0 0% 100% / .9);
  color: var(--nc-fg);
  font-size: 12px;
  font-weight: 500;
  padding: 0.375rem 0.625rem;
  border-radius: 6px;
  box-shadow: var(--nc-shadow-card);
  opacity: 0;
  transition: opacity .15s;
  pointer-events: none;
}
@media (hover: hover) and (pointer: fine) {
.nc-gallery-thumb:hover .nc-gallery-zoom-hint { opacity: 1; }
}


/* ─────────────────────────────────────────────
  GALERIA — MOBILE
  ───────────────────────────────────────────── */
.nc-gallery-mobile { display: flex; flex-direction: column-reverse; gap: 0.75rem; }
@media (min-width: 1024px) { .nc-gallery-mobile { display: none; } }

/* Pasek miniatur — większe kafle (~4.5 widoczne naraz, sygnalizuje że da
  się przewinąć dalej), bez widocznego paska przewijania.
  Świadomie BEZ scroll-snap: aktywna miniatura ma się wyśrodkowywać w
  pasku (patrz setActive w nc-product.js, ręczne liczenie scrollLeft) —
  scroll-snap-type:x mandatory (poprzednia wersja) po każdym takim scrollu
  dociągał przeglądarkę do najbliższego punktu snap (start krawędzi
  NAJBLIŻSZEJ miniatury), nadpisując wyliczone centrowanie z JS-a. */
.nc-gallery-thumbs-row {
  display: flex;
  gap: 0.5rem;
  overflow-x: auto;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
}
.nc-gallery-thumbs-row::-webkit-scrollbar { display: none; }

.nc-thumb-btn {
  flex: 0 0 calc((100% - 4 * 0.5rem) / 4.5);
  aspect-ratio: 1;
  border-radius: 10px;
  overflow: hidden;
  border: 1px solid var(--nc-border);
  background: var(--nc-product-bg);
  cursor: pointer;
  padding: 0;
  transition: border-color .15s;
}
.nc-thumb-btn.is-active { border: 2px solid var(--nc-primary); }
.nc-thumb-btn img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* Główne zdjęcie */
.nc-gallery-main-wrap {}

.nc-gallery-main {
  position: relative;
  aspect-ratio: 1;
  border-radius: var(--nc-radius);
  overflow: hidden;
  background: var(--nc-product-bg);
  cursor: pointer;
}

/* Tor slajdów — wszystkie zdjęcia obok siebie w jednym rzędzie (flex,
  bez zawijania), JS przesuwa go o wielokrotność 100% (translateX) przy
  zmianie zdjęcia (strzałki/miniatury/swipe) — patrz Gallery w
  nc-product.js. cubic-bezier daje płynne, lekko "doskakujące" dojście do
  celu (ease-out z overshoot), zamiast twardej podmiany src. Podczas
  przeciągania palcem JS zdejmuje transition (.nc-dragging), żeby tor
  podążał za palcem 1:1 bez opóźnienia. */
.nc-gallery-main-track {
  display: flex;
  width: 100%;
  height: 100%;
  transition: transform 0.35s cubic-bezier(0.25, 1, 0.5, 1);
  will-change: transform;
}
.nc-gallery-main-track.nc-dragging {
  transition: none;
}

.nc-main-img {
  flex: 0 0 100%;
  width: 100%;
  height: 100%;
  object-fit: contain;
  display: block;
}

.nc-gallery-counter {
  position: absolute;
  top: 0.75rem;
  right: 0.75rem;
  background: hsl(0 0% 12% / .85);
  color: #fff;
  font-size: 12px;
  font-weight: 700;
  padding: 0.5rem 0.75rem;
  border-radius: 7px;
  backdrop-filter: blur(4px);
}

.nc-gallery-nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  width: 3.5rem;
  height: 3.5rem;
  border-radius: var(--nc-radius);
  background: var(--nc-card);
  border: 1px solid var(--nc-border);
  box-shadow: none;
  display: grid;
  place-items: center;
  cursor: pointer;
  transition: border-color .15s, background .15s;
  padding: 0;
  color: var(--nc-fg);
}
@media (hover: hover) and (pointer: fine) {
.nc-gallery-nav:hover { background: var(--nc-secondary); border-color: hsl(0 0% 70%); }
}

.nc-gallery-nav:active { transform: translateY(-50%) scale(.95); }
.nc-gallery-nav svg { width: 26px; height: 26px; display: block; }
.nc-gallery-nav--prev { left: 0.5rem; }
.nc-gallery-nav--next { right: 0.5rem; }
.nc-gallery-nav:disabled { display: none; }

/* ─────────────────────────────────────────────
  LIGHTBOX (MOBILE CUSTOM)
  ───────────────────────────────────────────── */
.nc-lightbox {
  position: fixed;
  inset: 0;
  z-index: 1000;
  background: #fcfbfa; /* 1. Tło modala — kremowy odcień */
  display: flex;
  flex-direction: column;
}
.nc-lightbox[hidden] { display: none; }

/* Górny pasek nagłówkowy */
.nc-lb-toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  padding-inline: 1rem;
  height: 4rem;
  flex-shrink: 0;
  /* usunięto border-bottom dla lżejszego wyglądu */
}
@media (min-width: 640px) { .nc-lb-toolbar { padding-inline: 1.25rem; } }

/* 2. Wskaźnik numeru zdjęcia (np. "1 / 6") — mały, szary font */
.nc-lb-counter {
  font-size: 13px;
  font-weight: 500;
  color: #999;
  font-variant-numeric: tabular-nums;
  font-family: 'Poppins', system-ui, sans-serif;
}

.nc-lb-toolbar-actions { display: flex; gap: 0.5rem; }

/* 3 & 4. Przyciski (Close, Zoom, Nav) — biała ramka, zaokrąglone, cienki border, cień, czarne ikony */
.nc-lb-btn {
  width: 2.75rem;
  height: 2.75rem;
  border-radius: 10px;
  border: 1px solid #e5e5e5;
  background: #fff;
  color: #333;
  display: grid;
  place-items: center;
  cursor: pointer;
  transition: background .15s, border-color .15s;
  padding: 0;
  box-shadow: 0 2px 6px 0 rgba(0,0,0,.06), 0 1px 2px -1px rgba(0,0,0,.06);
}
@media (hover: hover) and (pointer: fine) {
.nc-lb-btn:hover { background: #f8f8f8; color: #111; }
}

.nc-lb-btn:active { background: #eee; transform: scale(0.96); }
.nc-lb-btn svg { width: 20px; height: 20px; stroke-width: 2; }
@media (min-width: 640px) { .nc-lb-btn { width: 3rem; height: 3rem; } }

.nc-lb-body { flex: 1; min-height: 0; display: flex; }

/* Rail miniatur (desktop - ukryty na mobile, ale zachowujemy style na wszelki wypadek) */
.nc-lb-rail {
  display: none;
  width: 120px;
  flex-shrink: 0;
  border-right: 1px solid var(--nc-border);
  background: transparent;
  flex-direction: column;
  align-items: stretch;
  padding-block: 0.75rem;
}
@media (min-width: 1024px) { .nc-lb-rail { display: flex; } }

.nc-lb-rail-scroll {
  margin-inline: auto;
  margin-block: 0.25rem;
}

.nc-lb-rail-track {
  flex: 1;
  overflow-y: auto;
  padding-inline: 0.75rem;
  scrollbar-width: none;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}
.nc-lb-rail-track::-webkit-scrollbar { display: none; }

.nc-lb-rail-thumb {
  aspect-ratio: 1;
  width: 100%;
  border-radius: 8px;
  overflow: hidden;
  border: 3px solid transparent;
  background: var(--nc-product-bg);
  cursor: pointer;
  padding: 0;
  transition: border-color .15s;
  flex-shrink: 0;
}
.nc-lb-rail-thumb.is-active { border-color: var(--nc-primary); }
@media (hover: hover) and (pointer: fine) {
.nc-lb-rail-thumb:hover:not(.is-active) { border-color: hsl(0 0% 80%); }
}

.nc-lb-rail-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; border-radius: 5px; }

/* Obszar głównego zdjęcia */
.nc-lb-image-area {
  position: relative;
  flex: 1;
  min-width: 0;
  display: grid;
  place-items: center;
  padding: 0.5rem; /* Zmniejszony padding aby powiększyć zdjęcie */
  background: transparent; /* Tło dziedziczone z głównego modala (#fcfbfa) */
}
@media (min-width: 640px) { .nc-lb-image-area { padding: 1.5rem; } }

.nc-lb-image-wrap {
  width: 100%;
  height: 100%;
  display: grid;
  place-items: center;
  overflow: hidden;
  cursor: zoom-in;
}
.nc-lb-image-wrap.is-zoomed { cursor: zoom-out; }

.nc-lb-img {
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  user-select: none;
  transition: transform .2s ease-out;
}

.nc-lb-nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}
/* Specyficzne wielkości ikon dla strzałek nawigacji */
.nc-lb-nav svg { width: 24px; height: 24px; stroke-width: 2.5; }

.nc-lb-nav--prev { left: 0.75rem; }
@media (min-width: 640px) { .nc-lb-nav--prev { left: 1.25rem; } }
.nc-lb-nav--next { right: 0.75rem; }
@media (min-width: 640px) { .nc-lb-nav--next { right: 1.25rem; } }

/* 5. Pasek miniatur poziomy (mobile) */
.nc-lb-thumbs-mobile {
  display: flex;
  gap: 0.75rem; /* Zwiększony odstęp między miniaturami */
  justify-content: flex-start; /* Pozwala na scroll, jeśli jest dużo miniatur */
  padding: 1rem;
  background: transparent; /* Tło modala */
  overflow-x: auto;
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  scroll-snap-type: x mandatory;
  flex-shrink: 0;
}
.nc-lb-thumbs-mobile::-webkit-scrollbar { display: none; }
@media (min-width: 1024px) { .nc-lb-thumbs-mobile { display: none; } }

.nc-lb-thumb-mobile {
  flex-shrink: 0;
  width: 4rem; /* Nieco większe na mobile */
  aspect-ratio: 1;
  border-radius: 8px; /* Zaokrąglone rogi miniatur */
  overflow: hidden;
  border: 3px solid transparent;
  background: var(--nc-card);
  cursor: pointer;
  padding: 0;
  transition: border-color .15s;
  scroll-snap-align: center;
}
@media (min-width: 640px) { .nc-lb-thumb-mobile { width: 4.5rem; } }
/* Czerwona ramka aktywnej miniaturki */
.nc-lb-thumb-mobile.is-active { border-color: var(--nc-primary); }
.nc-lb-thumb-mobile img { width: 100%; height: 100%; object-fit: cover; display: block; }

/* ─────────────────────────────────────────────
  PANEL ZAKUPOWY
  ───────────────────────────────────────────── */
.nc-purchase {
  display: flex;
  flex-direction: column;
  gap: 1.25rem;
}
@media (min-width: 1024px) {
  .nc-purchase {
    position: sticky;
    top: 1rem;
  }
}

/* Badges */
.nc-badges { display: flex; flex-wrap: wrap; gap: 0.375rem; }
.nc-badge {
  display: inline-flex;
  align-items: center;
  white-space: nowrap;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .06em;
  padding: 0.25rem 0.5rem;
  border-radius: 4px;
}
.nc-badge--dark { background: var(--nc-fg); color: hsl(45 75% 60%); }
.nc-badge--success { background: hsl(142 60% 35% / .15); color: hsl(142 60% 30%); }
.nc-badge--warn { background: hsl(48 95% 96%); color: hsl(38 70% 28%); border: 1px solid hsl(45 80% 78%); }

/* "Dostawa: darmowa" — wiersz zamiast osobnego badge'a "Darmowa dostawa"
  w .nc-badges (patrz purchase-panel.tpl). */
.nc-delivery-free-note {
  margin: 0.25rem 0 0;
  font-size: 13px;
  line-height: 1.35;
}
.nc-delivery-free-note-label {
  font-weight: 600;
  color: var(--nc-fg);
}
.nc-delivery-free-note-badge {
  display: inline-block;
  font-weight: 600;
  border-radius: 4px;
  padding: 0.125rem 0.375rem;
  background: rgb(233, 247, 239);
  color: rgb(28, 95, 56);
}

/* "Dostępność: ostatnie sztuki" — ten sam wzorzec co .nc-delivery-free-note
  wyżej, tylko z żółtawą/brązową paletą (ostrzegawczy, nie pozytywny sygnał)
  — kolory 1:1 ze zrzutu użytkownika. Pokazywany tylko przy niskim stanie
  magazynowym (1-5 szt.), niezależnie od tego, czy produkt akurat ma
  promocję (w przeciwieństwie do .nc-stock-urgency w .nc-price-saving,
  które pokazuje się tylko wewnątrz bloku "Oszczędzasz"). */
.nc-availability-note {
  margin: 0.25rem 0 0;
  font-size: 13px;
  line-height: 1.35;
}
.nc-availability-note-label {
  font-weight: 600;
  color: var(--nc-fg);
}
.nc-availability-note-badge {
  display: inline-block;
  font-weight: 600;
  border-radius: 4px;
  padding: 0.125rem 0.375rem;
  background: rgb(253, 248, 236);
  color: rgb(143, 82, 20);
}

/* Identyfikacja produktu */
.nc-product-identity { display: flex; flex-direction: column; gap: 0.75rem; }

.nc-product-title {
  font-size: 20px;
  font-weight: 700;
  line-height: 1.3;
  color: var(--nc-fg);
  margin: 0;
}
@media (min-width: 1024px) { .nc-product-title { font-size: 22px; } }

.nc-product-dims { font-size: 13px; color: var(--nc-muted-fg); margin: 0; }

/* Rating */
.nc-rating-row {
  display: flex;
  flex-direction: column;
  gap: 0.25rem;
}
@media (min-width: 640px) {
  .nc-rating-row {
    flex-direction: row;
    align-items: center;
    gap: 0.75rem;
  }
}

.nc-stars-link {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  text-decoration: none;
  font-size: 14px;
}
.nc-stars { display: inline-flex; }
.nc-star--filled { color: hsl(38 95% 52%); }
.nc-rating-value { font-weight: 600; color: var(--nc-fg); }
.nc-rating-count { color: var(--nc-muted-fg); }
@media (hover: hover) and (pointer: fine) {
.nc-stars-link:hover .nc-rating-count { color: var(--nc-primary); text-decoration: underline; }
}


.nc-rating-sep {
  display: none;
  width: 1px;
  height: 1rem;
  background: var(--nc-border);
}
@media (min-width: 640px) { .nc-rating-sep { display: block; } }

.nc-social-proof { font-size: 13px; color: hsl(0 0% 35%); }
.nc-social-proof strong { font-weight: 600; color: var(--nc-fg); }

/* Cena */
.nc-price-block { display: flex; flex-direction: column; gap: 0.25rem; }
.nc-price-row { display: flex; align-items: baseline; gap: 0.75rem; flex-wrap: wrap; }
.nc-price-current { font-size: 1.875rem; font-weight: 700; color: var(--nc-primary); }
.nc-price-old { font-size: 1rem; color: var(--nc-muted-fg); text-decoration: line-through; }
.nc-price-saving { font-size: 15px; font-weight: 600; letter-spacing: -.01em; color: hsl(0 0% 30%); margin: 0; }
.nc-price-omnibus { font-size: 12px; color: var(--nc-muted-fg); margin: 0; }
.nc-price-omnibus-val { font-weight: 500; color: var(--nc-fg); }

/* Warianty */
.nc-variants { display: flex; flex-direction: column; gap: 0.5rem; }
.nc-variants-label { display: flex; align-items: baseline; gap: 0.5rem; flex-wrap: wrap; }
.nc-variants-label-key { font-size: 14px; font-weight: 600; color: var(--nc-fg); }
.nc-variants-label-val { font-size: 14px; font-weight: 500; color: var(--nc-fg); }

.nc-swatches { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.nc-swatch {
  position: relative;
  width: 3rem;
  height: 3rem;
  border-radius: var(--nc-radius);
  border: 2px solid var(--nc-border);
  overflow: hidden;
  cursor: pointer;
  transition: border-color .15s;
  padding: 0;
  background: var(--nc-card);
}
@media (hover: hover) and (pointer: fine) {
.nc-swatch:hover { border-color: hsl(0 0% 40%); }
}

.nc-swatch.is-active { border-color: var(--nc-primary); }
.nc-swatch-inner {
  position: absolute;
  inset: 3px;
  border-radius: 4px;
  display: block;
}

/* Seria wariantów */
.nc-select {
  width: 100%;
  height: 2.75rem;
  padding-inline: 0.75rem;
  border: 1px solid var(--nc-border);
  border-radius: var(--nc-radius);
  background: var(--nc-bg);
  font-size: 14px;
  color: var(--nc-fg);
  font-family: inherit;
  cursor: pointer;
}
.nc-select:focus { outline: none; border-color: var(--nc-primary); }

/* Radio swatch (wariant tekstowy) */
.nc-swatch--radio { border: none; padding: 0; }
.nc-swatch--radio .nc-swatch-inner { display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600; }

/* Availability */
.nc-availability-now { font-size: 13px; font-weight: 600; color: hsl(142 60% 30%); margin: 0; }
.nc-availability-later { font-size: 13px; color: var(--nc-muted-fg); margin: 0; }

/* ─────────────────────────────────────────────
  NC-XSELL-WRAP — kontener cross-sell w nowej karcie
  Stylizuje stary xsell layout (one-line-label, xsell-grid)
  ───────────────────────────────────────────── */
.nc-xsell-wrap {
  margin-top: 4px;
}
.nc-xsell-wrap:empty { display: none; }

.nc-xsell-wrap .one-line-label {
  display: block;
  font-size: 13px;
  font-weight: 600;
  color: var(--nc-fg);
  font-family: 'Poppins', system-ui, sans-serif;
  margin: 0 0 8px;
  letter-spacing: .01em;
}

.nc-xsell-wrap .xsell-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin: 0;
}

.nc-xsell-wrap .xsell-color-container {
  margin: 0;
}

/* Kwadratowe kafle, jak reszta miniatur produktowych na tej karcie
  (galeria, żarówki, "Ostatnio przeglądane" itd.) — poprzednie 48×60
  (prostokąt, myślany pod płaskie próbki koloru) nie pasowało do
  rzeczywistych danych: seigixsell tu renderuje pełne zdjęcia produktu
  (inny wariant/model), nie płaskie swatch'e koloru, więc 48×60 +
  object-fit:cover (patrz niżej) obcinało zdjęcia lampy losowo z boków. */
.nc-xsell-wrap .xsell-color-option {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 64px;
  height: 64px;
  border: 2px solid transparent;
  border-radius: 6px;
  overflow: hidden;
  transition: border-color .15s;
  margin: 0;
  padding: 4px;
  background: var(--nc-product-bg);
}

/* object-fit:contain (nie cover) — to pełne zdjęcia produktów, nie płaskie
  próbki koloru; cover obcinałby kompozycję lampy w losowym miejscu.
  Tło kafla (--nc-product-bg, jak wyżej) wypełnia ewentualne puste pasy. */
.nc-xsell-wrap .xsell-color-option img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: contain;
  border: none !important;
  border-radius: 4px;
}

.nc-xsell-wrap .xsell-color-option.active {
  border-color: var(--nc-primary) !important;
}
@media (hover: hover) and (pointer: fine) {
.nc-xsell-wrap .xsell-color-option:hover {
  border-color: var(--nc-primary) !important;
}
}


.nc-xsell-wrap .xsell-color-option.active img {
  border-color: var(--nc-primary) !important;
}

/* Przycisk "Zobacz +N" */
.nc-xsell-wrap .show-more-box {
  display: inline-flex;
}
.nc-xsell-wrap .remaining-box {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 64px;
  height: 64px;
  text-align: center;
  font-size: 12px;
  font-weight: 600;
  color: var(--nc-fg);
  background: var(--nc-secondary);
  border-radius: 6px;
  cursor: pointer;
}

/* ─────────────────────────────────────────────
  SEIGIXSELL — selektor wariantów (lumina_colors)
  Dwa tryby: --colors (chipy) i --models (miniatury)
  ───────────────────────────────────────────── */
.nc-xs-section {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

/* Etykieta "Kolor: Mosiądz/biały" */
.nc-xs-label {
  display: flex;
  align-items: baseline;
  gap: 0.375rem;
  flex-wrap: wrap;
}
.nc-xs-label-key {
  font-size: 14px;
  font-weight: 600;
  color: var(--nc-fg);
  font-family: 'Poppins', system-ui, sans-serif;
}
.nc-xs-label-val {
  font-size: 14px;
  font-weight: 400;
  color: var(--nc-fg);
  font-family: 'Poppins', system-ui, sans-serif;
}

/* Wspólna siatka */
.nc-xs-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

/* Tryb modeli — grid 5 kolumn zamiast flex-wrap ze stałą szerokością kafelków;
  kafelki rozciągają się do pełnej szerokości rzędu (do krawędzi przycisku
  "Dobierz żarówki"), odstęp między nimi zostaje bez zmian (gap: 8px z .nc-xs-grid) */
.nc-xs-grid.nc-xs-grid--models {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
}

/* ── KOLOR: chipy ── */
.nc-xs-item--color {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 50px;
  height: 50px;
  border-radius: 10px;
  border: 2px solid var(--nc-border);
  background: var(--nc-card);
  padding: 3px;
  cursor: pointer;
  text-decoration: none;
  transition: border-color .15s;
  flex-shrink: 0;
}
@media (hover: hover) and (pointer: fine) {
.nc-xs-item--color:hover { border-color: hsl(0 0% 45%); }
}

.nc-xs-item--color.is-active {
  border-color: var(--nc-primary);
  padding: 2px;
  background-clip: content-box;
  box-shadow: none;
}

/* Kolorowy kwadrat wewnątrz */
.nc-xs-chip {
  display: block;
  width: 100%;
  height: 100%;
  border-radius: 5px;
  flex-shrink: 0;
}
/* "More" chip w trybie kolorów */
.nc-xs-chip--more {
  background: var(--nc-secondary) !important;
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 11px;
  font-weight: 700;
  color: var(--nc-muted-fg);
  line-height: 1;
}

/* ── MODEL: miniatury ── */
.nc-xs-item--model {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 74px;
  height: 74px;
  border-radius: 8px;
  border: 1px solid var(--nc-border);
  /* Beż (nie białe) — zdjęcie w środku dostaje nc-bg-blend (squareCropImage
    w nc-product.js, initXsellImageAutocrop), które mix-blend-mode:darken
    przebarwia białe studyjne tło na kolor TEGO tła, więc musi być beżowe,
    żeby faktycznie zlało się ze zdjęciem zamiast zostawiać białą ramkę. */
  background: var(--nc-product-bg);
  padding: 1px;
  cursor: pointer;
  text-decoration: none;
  transition: border-color .15s;
  flex-shrink: 0;
  overflow: hidden;
}
/* W trybie grid (.nc-xs-grid--models) kafelek rozciąga się na całą kolumnę —
  width/height auto zamiast stałych 74px, aspect-ratio:1 utrzymuje kwadrat */
.nc-xs-grid--models .nc-xs-item--model {
  width: auto;
  height: auto;
  aspect-ratio: 1;
}
@media (hover: hover) and (pointer: fine) {
.nc-xs-item--model:hover { border-color: hsl(0 0% 45%); }
}

.nc-xs-item--model.is-active {
  border: 2px solid var(--nc-primary);
  box-shadow: none;
}

/* Miniatura obrazka */
.nc-xs-thumb {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
}
.nc-xs-thumb img {
  width: 100%;
  height: 100%;
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  display: block;
}

/* Kafel "rozwiń" w trybie modeli */
.nc-xs-item--expand.nc-xs-item--model {
  flex-direction: column;
  gap: 2px;
  background: hsl(36 20% 96%);
  border-style: solid;
}
.nc-xs-expand-count {
  font-size: 12px;
  font-weight: 700;
  color: var(--nc-fg);
  line-height: 1.2;
  text-align: center;
}
.nc-xs-expand-sub {
  font-size: 11px;
  color: var(--nc-primary);
  display: flex;
  align-items: center;
  gap: 2px;
  font-weight: 500;
}
/* Strzałka toggle rozwiń/zwiń (kafelek modeli, .nc-xs-item--expand) — ten
  sam SVG dla obu stanów, obracany o 180° zamiast podmieniany, na bazie
  aria-expanded ustawianego w JS (initXsellTwoRows, nc-product.js). */
.nc-xs-expand-sub svg {
  transition: transform .2s ease;
}
.nc-xs-item--expand[aria-expanded="true"] .nc-xs-expand-sub svg {
  transform: rotate(180deg);
}

/* Ukryte elementy (zanim rozwinięte) */
.nc-xs-hidden { display: none !important; }

@media (max-width: 639px) {
  .nc-xs-item--model { width: 64px; height: 64px; }
  .nc-xs-item--color { width: 50px; height: 50px; }
}
.nc-minimal-qty-msg { font-size: 12px; color: var(--nc-muted-fg); margin: 0; }
.nc-add-to-cart-cta { flex: 1; }
/* Wrappery widoczności "Dodaj do koszyka" / "Powiadom o dostawie" — to one,
  nie .nc-add-to-cart-cta, są teraz bezpośrednimi dziećmi flexa
  .nc-add-to-cart-row, więc to im trzeba dać flex-grow. */
#nc-add-to-cart-visible,
#nc-oos-notify-visible { flex: 1; display: flex; }

/* Specs table group header */
.nc-specs-group-header {
  background: var(--nc-secondary);
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .08em;
  color: var(--nc-muted-fg);
  padding: 0.5rem 1rem;
  text-align: left;
  border-top: 2px solid var(--nc-border);
}
.nc-specs-table + .nc-specs-table { margin-top: 1rem; }

.nc-series { display: flex; flex-direction: column; gap: 0.5rem; }
.nc-series-grid {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 0.375rem;
}

/* Żarówki trigger */
.nc-bulbs-trigger-wrap {}

/* Buttons */
.nc-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.625rem;
  border-radius: var(--nc-radius);
  font-weight: 700;
  font-size: 13px;
  letter-spacing: .04em;
  cursor: pointer;
  transition: background .15s, border-color .15s;
  border: none;
  white-space: nowrap;
}
@media (min-width: 640px) { .nc-btn { font-size: 14px; } }

.nc-btn--primary {
  background: var(--nc-primary);
  color: var(--nc-primary-fg);
  box-shadow: 0 1px 2px hsl(0 0% 0% / .08);
}
@media (hover: hover) and (pointer: fine) {
.nc-btn--primary:hover { background: var(--nc-primary-hover); }
}


.nc-btn--outline {
  background: var(--nc-secondary);
  border: 1.5px solid hsl(0 0% 0% / .15);
  color: var(--nc-fg);
}
@media (hover: hover) and (pointer: fine) {
.nc-btn--outline:hover { background: hsl(36 30% 92%); }
}


.nc-btn--full { width: 100%; }

.nc-btn--bulbs {
  width: 100%;
  height: 2.75rem;
  font-size: 14px;
}

.nc-btn--add-to-cart {
  flex: 1;
  height: 3rem;
}
@media (min-width: 640px) { .nc-btn--add-to-cart { height: 3.25rem; } }

/* Niedostępność — "Powiadom o dostawie" w miejscu "Dodaj do koszyka".
  To prawdziwy przycisk modułu mailalerts (hook DisplayProductButtonsTop,
  .mailalerts-modal-button) — fancybox (globalny bind w footer.tpl) otwiera
  #mailalerts-modal z formularzem zapisu maila. Tu tylko dopasowujemy wygląd
  do nc-btn--primary/nc-btn--add-to-cart. Widoczność sterowana przez
  #nc-oos-notify-visible / #nc-add-to-cart-visible w purchase-panel.tpl —
  celowo NIE przez .nc-add-to-cart-cta, bo ta klasa ma gdzie indziej regułę
  `display: flex !important`, która nadpisywałaby ukrywanie inline-style'em. */
#nc-oos-notify-visible .content_prices { width: 100%; margin: 0; }
#nc-oos-notify-visible .mailalerts-modal-button {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.625rem;
  width: 100%;
  height: 4.5rem;
  border-radius: var(--nc-radius);
  font-weight: 700;
  font-size: 13px;
  letter-spacing: .04em;
  border: none;
  cursor: pointer;
  background: var(--nc-primary);
  color: var(--nc-primary-fg);
  text-decoration: none;
  text-transform: none;
  font-family: 'Poppins', system-ui, sans-serif;
}
@media (min-width: 640px) {
  #nc-oos-notify-visible .mailalerts-modal-button { font-size: 14px; height: 4.5rem; }
}
#nc-oos-notify-visible .mailalerts-modal-button:focus {
  background: var(--nc-primary-hover);
  color: var(--nc-primary-fg);
}
@media (hover: hover) and (pointer: fine) {
#nc-oos-notify-visible .mailalerts-modal-button:hover {
  background: var(--nc-primary-hover);
  color: var(--nc-primary-fg);
}
}

#nc-oos-notify-visible .mailalerts-modal-button span {
  display: flex;
  align-items: center;
  gap: 0.625rem;
  color: inherit;
}

/* Ilość + dodaj do koszyka */
.nc-add-to-cart-row {
  display: flex;
  align-items: stretch;
  gap: 0.625rem;
}
@media (min-width: 640px) { .nc-add-to-cart-row { gap: 0.75rem; } }

.nc-qty {
  display: inline-flex;
  align-items: stretch;
  border: 1px solid var(--nc-border);
  border-radius: var(--nc-radius);
  background: var(--nc-card);
  overflow: hidden;
  flex-shrink: 0;
  height: 3rem;
  width: 8rem;
}
@media (min-width: 640px) {
  .nc-qty { height: 3.25rem; width: 8.75rem; }
}

.nc-qty--sm { height: 2.5rem; width: 7rem; }

.nc-qty-btn {
  width: 2.5rem;
  display: grid;
  place-items: center;
  background: transparent;
  border: none;
  cursor: pointer;
  color: var(--nc-fg);
  transition: background .12s;
  flex-shrink: 0;
}
@media (min-width: 640px) { .nc-qty-btn { width: 2.75rem; } }
@media (hover: hover) and (pointer: fine) {
.nc-qty-btn:hover { background: var(--nc-secondary); }
}


.nc-qty-input {
  flex: 1;
  min-width: 0;
  text-align: center;
  font-size: 15px;
  font-weight: 700;
  background: transparent;
  border: none;
  border-inline: 1px solid var(--nc-border);
  color: var(--nc-fg);
  -moz-appearance: textfield;
}
.nc-qty-input::-webkit-inner-spin-button,
.nc-qty-input::-webkit-outer-spin-button { -webkit-appearance: none; }
.nc-qty-input:focus { outline: none; }

/* Wishlist + Zapytaj */
.nc-tertiary-actions {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.25rem;
  padding-top: 0.25rem;
  font-size: 14px;
}

.nc-tertiary-btn {
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  padding: 0.5rem 0.75rem;
  border-radius: var(--nc-radius);
  color: var(--nc-muted-fg);
  cursor: pointer;
  background: transparent;
  border: none;
  font-size: 14px;
  transition: color .15s, background .15s;
}
@media (hover: hover) and (pointer: fine) {
.nc-tertiary-btn:hover { color: var(--nc-primary); }
}

.nc-tertiary-btn.is-wished { color: var(--nc-primary); }
.nc-heart-icon { transition: fill .15s; }
.nc-tertiary-btn.is-wished .nc-heart-icon { fill: var(--nc-primary); }

.nc-tertiary-sep { display: block; width: 1px; height: 1rem; background: var(--nc-border); }

/* Dostawa i zwroty */
.nc-delivery { border-top: 1px solid var(--nc-border); padding-top: 1rem; }

.nc-delivery-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  margin-bottom: 0.5rem;
}

.nc-delivery-title { font-size: 14px; font-weight: 700; color: var(--nc-fg); }

.nc-stock-urgency {
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  padding: 0.25rem 0.625rem;
  border-radius: 999px;
  border: 1px solid hsl(45 80% 78%);
  background: hsl(48 95% 96%);
  color: hsl(38 70% 28%);
  font-size: 11px;
  font-weight: 600;
  letter-spacing: .04em;
  line-height: 1;
}

.nc-delivery-rows { display: flex; flex-direction: column; gap: 0; font-size: 13px; color: hsl(0 0% 20%); }

.nc-delivery-row {
  width: 100%;
  display: flex;
  align-items: center;
  gap: 0.625rem;
  text-align: left;
  padding: 0.375rem 0.5rem;
  margin-inline: -0.5rem;
  border-radius: var(--nc-radius);
  border: none;
  background: transparent;
  cursor: pointer;
  color: hsl(0 0% 20%);
  font-size: 13px;
  transition: background .12s;
  width: calc(100% + 1rem);
}
/* Tylko urządzenia z prawdziwym hoverem (mysz) — na dotyku (hover:none)
  tap w wiersz akordeonu (patrz initDeliveryAccordion w nc-product.js)
  "zapalał" to tło i zostawało ono widoczne aż do kolejnego dotknięcia
  gdzie indziej (:hover na touchscreenach nie znika po puszczeniu palca,
  tylko trwa do następnego dotyku) — wyglądało jak zablokowany, podświetlony
  przycisk zamiast czystego stanu otwarte/zamknięte. */
@media (hover: hover) and (pointer: fine) {
  .nc-delivery-row:hover { background: hsl(36 30% 94%); }

}
.nc-delivery-row[aria-expanded="true"] .nc-chevron { transform: rotate(180deg); }

.nc-delivery-icon { flex-shrink: 0; color: var(--nc-primary); }
.nc-delivery-row-text { flex: 1; display: flex; flex-wrap: wrap; align-items: center; gap: 0.375rem; }
.nc-delivery-row-muted { color: var(--nc-muted-fg); }
.nc-delivery-row-val { font-weight: 600; color: var(--nc-fg); }
/* fill:none !important — bez tego jakaś reguła spoza tego pliku (motyw/moduł)
  potrafi wymusić fill na <polyline>, co domyka jej kształt i zamienia
  cienki, otwarty chevron w wypełniony trójkąt. Chcemy tu tylko obrys. */
.nc-chevron { flex-shrink: 0; color: var(--nc-muted-fg); fill: none !important; stroke: currentColor !important; transition: transform .2s; }

.nc-delivery-panel { margin-left: 1.5rem; margin-right: 0.25rem; margin-bottom: 0.25rem; }
.nc-delivery-panel p {
  margin: 0;
  padding: 0.625rem 0.75rem;
  border-radius: var(--nc-radius);
  background: hsl(36 30% 96%);
  border: 1px solid var(--nc-border);
  font-size: 12px;
  line-height: 1.6;
  color: hsl(0 0% 25%);
}
.nc-delivery-panel[hidden] { display: none; }

/* Kontakt */
.nc-help-block {
  border-top: 2px solid hsl(0 0% 0% / .08);
  padding-top: 1.25rem;
  margin-top: 0.5rem;
}
.nc-help-block--mobile-only { display: block; }
@media (min-width: 1024px) { .nc-help-block--mobile-only { display: none; } }

.nc-help-label { font-size: 10.5px; text-transform: uppercase; letter-spacing: .1em; font-weight: 600; color: var(--nc-muted-fg); margin-bottom: 0.25rem; }
.nc-help-title { font-size: 14px; font-weight: 700; color: var(--nc-fg); }
.nc-help-hours { font-size: 11px; color: var(--nc-muted-fg); margin-top: 2px; }
.nc-help-hours span { color: hsl(0 0% 30%); font-weight: 500; }

.nc-help-contacts { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.625rem; margin-top: 0.75rem; }

.nc-contact-tile {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.625rem;
  border: 1px solid var(--nc-border);
  border-radius: var(--nc-radius);
  background: var(--nc-card);
  padding: 0.625rem 0.75rem;
  text-decoration: none;
  min-width: 0;
  transition: border-color .15s, background .15s;
  color: var(--nc-muted-fg);
}
@media (hover: hover) and (pointer: fine) {
.nc-contact-tile:hover { border-color: hsl(0 0% 40%); background: var(--nc-secondary); }
}

.nc-contact-tile svg { flex-shrink: 0; }
.nc-contact-tile > span { display: flex; flex-direction: column; text-align: left; min-width: 0; }
.nc-contact-tile-label { font-size: 10.5px; text-transform: uppercase; letter-spacing: .1em; font-weight: 600; color: var(--nc-muted-fg); }
.nc-contact-tile-val { font-size: 13px; font-weight: 700; color: var(--nc-fg); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ─────────────────────────────────────────────
  KEY SPECS
  ───────────────────────────────────────────── */
.nc-key-specs {}

.nc-key-specs-header {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  /* margin-bottom: 0.5rem; */
  padding-inline: 0.25rem;
}
.nc-key-specs-title {
  font-size: 11px;
  text-transform: uppercase;
  letter-spacing: .12em;
  font-weight: 700;
  color: var(--nc-muted-fg);
  white-space: nowrap;
}
.nc-key-specs-line {
  flex: 1;
  height: 1px;
  background: var(--nc-border);
  display: block;
}

.nc-key-specs-footer {
  margin-top: 0.5rem;
  display: flex;
  justify-content: flex-end;
  padding-inline: 0.25rem;
}
.nc-key-specs-link {
  display: inline-flex;
  align-items: center;
  gap: 0.25rem;
  font-size: 11px;
  color: var(--nc-muted-fg);
  text-decoration: none;
  transition: color .15s;
}
@media (min-width: 640px) { .nc-key-specs-link { font-size: 12px; } }
@media (hover: hover) and (pointer: fine) {
.nc-key-specs-link:hover { color: var(--nc-fg); text-decoration: underline; text-underline-offset: 4px; }
}

.nc-key-specs-link svg { width: 12px; height: 12px; flex-shrink: 0; }

.nc-key-specs-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
}
@media (min-width: 640px) { .nc-key-specs-grid { grid-template-columns: repeat(4, 1fr); } }

.nc-key-spec-tile {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.875rem 1rem;
  text-align: left;
  min-width: 0;
}
@media (min-width: 640px) { .nc-key-spec-tile { padding: 1rem 1.25rem; } }

/* borders between tiles */
.nc-key-specs-grid .nc-key-spec-tile:nth-child(1),
.nc-key-specs-grid .nc-key-spec-tile:nth-child(2) { border-bottom: 1px solid var(--nc-border); }
@media (min-width: 640px) {
  .nc-key-specs-grid .nc-key-spec-tile:nth-child(1),
  .nc-key-specs-grid .nc-key-spec-tile:nth-child(2) { border-bottom: none; }
}
.nc-key-specs-grid .nc-key-spec-tile:nth-child(2) { border-left: 1px solid var(--nc-border); }
.nc-key-specs-grid .nc-key-spec-tile:nth-child(4) { border-left: 1px solid var(--nc-border); }
@media (min-width: 640px) {
  .nc-key-specs-grid .nc-key-spec-tile:nth-child(2),
  .nc-key-specs-grid .nc-key-spec-tile:nth-child(4) { border-left: none; }
  .nc-key-specs-grid .nc-key-spec-tile:not(:last-child) { border-right: 1px solid var(--nc-border); }
}

.nc-key-spec-icon {
  flex-shrink: 0;
  width: 2.75rem;
  height: 2.75rem;
  border-radius: 999px;
  background: var(--nc-secondary);
  display: grid;
  place-items: center;
  color: hsl(0 0% 25%);
}
@media (min-width: 640px) { .nc-key-spec-icon { width: 3rem; height: 3rem; } }
.nc-key-spec-icon svg { fill: none !important; stroke: currentColor !important; }

.nc-key-spec-body { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.nc-key-spec-label {
  font-size: 10.5px;
  text-transform: uppercase;
  letter-spacing: .12em;
  font-weight: 600;
  color: var(--nc-muted-fg);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
@media (min-width: 640px) { .nc-key-spec-label { font-size: 11px; } }
.nc-key-spec-value { font-size: 13px; font-weight: 700; color: var(--nc-fg); line-height: 1.3; }
@media (min-width: 640px) { .nc-key-spec-value { font-size: 14px; } }
.nc-key-spec-value-sub {
  display: block;
  font-size: 10.5px;
  font-weight: 400;
  color: var(--nc-muted-fg);
  line-height: 1.3;
  margin-top: 1px;
}
@media (min-width: 640px) { .nc-key-spec-value-sub { font-size: 12px; } }

/* ─────────────────────────────────────────────
  PRODUKTY PODOBNE
  ───────────────────────────────────────────── */
.nc-related {
  background: var(--nc-secondary);
  padding-block: 2rem;
  margin-block: 2rem;
}
@media (min-width: 640px) { .nc-related { padding-block: 2.5rem; } }

.nc-section-header { margin-bottom: 1.25rem; }
.nc-section-title {
  font-size: 18px;
  font-weight: 700;
  color: var(--nc-fg);
  display: flex;
  align-items: center;
  gap: 0.5rem;
  margin: 0 0 0.25rem;
}
@media (min-width: 640px) { .nc-section-title { font-size: 20px; } }
.nc-section-subtitle { font-size: 13px; color: var(--nc-muted-fg); margin: 0; }

.nc-related-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 0.75rem;
}
@media (min-width: 640px) { .nc-related-grid { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1024px) { .nc-related-grid { grid-template-columns: repeat(4, 1fr); } }

.nc-related-tile {
  background: var(--nc-card);
  border-radius: var(--nc-radius);
  border: 1px solid var(--nc-border);
  overflow: hidden;
  text-decoration: none;
  color: var(--nc-fg);
  transition: box-shadow .15s, border-color .15s;
  display: flex;
  flex-direction: column;
}
@media (hover: hover) and (pointer: fine) {
.nc-related-tile:hover { box-shadow: var(--nc-shadow-card); border-color: hsl(0 0% 60%); }
}


.nc-related-img-wrap { aspect-ratio: 1; background: var(--nc-product-bg); overflow: hidden; }
.nc-related-img { width: 100%; height: 100%; object-fit: contain; display: block; transition: transform .2s; }
@media (hover: hover) and (pointer: fine) {
.nc-related-tile:hover .nc-related-img { transform: scale(1.04); }
}


.nc-related-info { padding: 0.75rem; display: flex; flex-direction: column; gap: 0.25rem; flex: 1; }
.nc-related-name { font-size: 13px; font-weight: 500; color: var(--nc-fg); line-height: 1.4; }
.nc-related-price { font-size: 14px; font-weight: 700; color: var(--nc-primary); }

/* ─────────────────────────────────────────────
  ZAKŁADKI
  ───────────────────────────────────────────── */
#nc-tabs-sentinel { height: 0; }

/* --nc-tabs-top: wystawiane z JS (initMegamenuAutoHide, nc-product.js) na
  bieżącą, realną wysokość #stickybar — spada, gdy pasek kategorii się
  chowa przy scrollu w dół, wraca, gdy kategorie są znów widoczne. Wartości
  60px/134px niżej to tylko fallback na czas zanim JS się wykona (i dla
  stanu "jeszcze nie sticky", gdy zmienna jest świadomie usuwana). */
.nc-tabs-nav {
  position: sticky;
  /* `top` jest teraz STAŁE (tylko #stickybar, bez --nc-search-h) — miejsce
    na chowany/pokazywany pasek wyszukiwania dokładamy niżej WYŁĄCZNIE
    przez `transform: translateY(...)`, nie przez `top`. `top` na
    position:sticky jest właściwością layoutu (przelicza się przy każdej
    zmianie sticky constraint), więc jej animowanie co scroll-down/scroll-up
    (a te klasy potrafią przełączać się kilka razy na sekundę przy drobnym
    bujaniu scrolla/momentum) dawało realny reflow całej strony — stąd
    zgłoszone "drganie"/layout shift. `transform` jest kompozytowany przez
    GPU (bez reflow) i NIE zmienia bazowej pozycji sticky, więc obliczenia
    celu scrolla (offset w initTabs) mogą bezpiecznie zakładać, że TOC
    zawsze osiada na tej samej, stałej wartości `top` — patrz komentarz
    przy --nc-search-h niżej. */
  top: var(--nc-tabs-top, 60px);
  transform: translateY(0);
  /* Musi być NIŻEJ niż #header (global.css: "#header { z-index:5003 }") —
    TOC ma się chować pod głównym paskiem (logo/wyszukiwarka) i pod menu
    kategorii (#stickybar/#iqitmegamenu-horizontal), oba żyjące w tej samej
    warstwie #header, nigdy na nich nie leżeć. Wcześniej było tu 5010
    (świadomie WYŻEJ niż header), żeby TOC wygrywał z paskiem wyszukiwania
    mobile — ten problem rozwiązuje teraz samo pozycjonowanie
    (--nc-tabs-top/--nc-search-h, patrz niżej), więc z-index może już
    poprawnie odzwierciedlać kolejność wizualną: header/kategorie > TOC. */
  z-index: 10;
  background: var(--nc-bg);
  /* border-t + border-b RAZEM, w jednym miejscu, od startu — tak jak w
    ProductTabs.tsx (Lovable): "border-t border-b border-border" na tym
    samym wrapperze, bez osobnych patchy per-breakpoint. Wcześniej
    border-top był dopisywany osobno w media queries (mobile/desktop) —
    teraz jedno źródło prawdy dla obu krawędzi. */
  border-top: 1px solid #e5e4e2;
  border-bottom: 2px solid var(--nc-border);
  box-shadow: 0 1px 3px hsl(0 0% 0% / .04);
  margin-bottom: 2rem;
  transition: background-color .3s ease, border-color .3s ease, box-shadow .3s ease, transform .25s ease;
}
@media (min-width: 1024px) {
  /* Fallback 0px (nie zgadywana wysokość headera) — tak jak Lovable
    (SiteHeader.tsx: --sticky-header-h liczone TYLKO po scrollu, 0 przed
    nim). Bez znaczenia wizualnego: dopóki #page nie ma klasy .sticky,
    --nc-tabs-top jest świadomie usuwane (patrz syncTabsTop w nc-product.js),
    a nav i tak nie jest jeszcze blisko "przyklejenia" na tym etapie. */
  .nc-tabs-nav { top: var(--nc-tabs-top, 0px); }
}

/* --nc-search-h: stabilna wysokość #search_block_top, wystawiana z JS
  (syncSearchHeight, nc-product.js) — zmienia się tylko przy resize/layout,
  NIGDY przy samym scrollu, więc nie ma tu wyścigu z klasą scroll-down.
  Dosuwamy TOC o tę wysokość TYLKO gdy pasek wyszukiwania jest akurat
  widoczny (czyli "body:not(.scroll-down)" — dokładnie ten sam selektor,
  którego global.css używa do pokazania/ukrycia samego paska: "body.
  scroll-down #search_block_top { opacity:0 }"). To reaguje SYNCHRONICZNIE
  z tą samą zmianą klasy co CSS-owe pokazanie paska. WYŁĄCZNIE przez
  transform (patrz komentarz w .nc-tabs-nav wyżej) — bazowe `top` (a więc i
  sticky constraint, i punkt odniesienia dla scroll-to/scrollspy w JS)
  zostaje przy tym całkowicie nietknięte. Tylko mobile — na desktopie nie
  ma paska wyszukiwania nachodzącego na TOC.
  .is-stuck WYMAGANE w selektorze — bez tego transform aplikował się też,
  gdy TOC był jeszcze w normalnym biegu strony (pod blokiem parametrów,
  position:sticky jeszcze nieaktywne/niezadokowane). Sam scroll-down/up na
  body przełącza się cały czas podczas przewijania strony, niezależnie od
  tego, czy TOC zdążył już dotrzeć do sticky offsetu — więc TOC "skakał"
  (nagłe przesunięcie o --nc-search-h w pionie, widoczne jako tąpnięcie
  treści pod nim) zanim w ogóle był przyklejony. .is-stuck (ustawiane
  WYŁĄCZNIE przez IntersectionObserver na #nc-tabs-sentinel — patrz initTabs
  w nc-product.js, jedyne rzeczywiste źródło prawdy o stanie zadokowania)
  ogranicza ten efekt do momentu, gdy pasek faktycznie jest przyklejony pod
  górną krawędzią ekranu. */
@media (max-width: 768px) {
  body:not(.scroll-down) .nc-tabs-nav.is-stuck {
    transform: translateY(var(--nc-search-h, 56px));
  }
}

/* Blokada nakładana z JS (initTabs, nc-product.js) na czas programowego
  przewijania wywołanego kliknięciem w zakładkę — bez tego niezależny
  plugin global.js mógł w trakcie tego scrolla przełączyć klasę
  scroll-down/scroll-up (np. przy drobnym wahnięciu prędkości scrolla) i
  przesunąć TOC transformem POD NOGAMI trwającej animacji, co psuło tak
  scrollspy, jak i wyliczony wcześniej cel przewijania. */
.nc-tabs-nav--lock {
  transform: translateY(0) !important;
  transition: none !important;
}

/* Liquid glass — tylko gdy pasek faktycznie jest "przyklejony"
  (IntersectionObserver na #nc-tabs-sentinel w nc-product.js;
  position:sticky nie ma natywnego selektora na ten stan).
  Subtelniejsza wersja — mniej blura/cienia niż pierwsza próba.

  PEŁNA SZEROKOŚĆ — trzecie podejście, po dwóch nieudanych próbach z
  width:100vw + margin-inline (najpierw calc(50% - 50vw), potem korekta o
  zmierzoną w JS szerokość paska przewijania) — obie wciąż dawały drobny,
  ale widoczny rozjazd w lewo na niektórych rozdzielczościach (zgłoszone
  powtórnie przy 1197×811 mimo poprawki). Zamiast dalej gonić kolejne
  źródło błędu w arytmetyce vw/%, ELEMENT (.nc-tabs-nav, razem z
  .nc-tabs-nav-scroller w środku) W OGÓLE NIE ZMIENIA szerokości między
  stanami — zostaje na stałe tak szeroki, jak .nc-container, więc treść
  (przyciski zakładek) fizycznie nie ma jak się przesunąć. Pełna szerokość
  ekranu to WYŁĄCZNIE wizualne tło na osobnym ::before (position:absolute
  względem .nc-tabs-nav, które już jest "positioned" dzięki position:sticky) —
  transform+left:50% jest tu bezpieczne, bo dotyczy zwykłego elementu
  absolute, NIE samego sticky (to właśnie ta kombinacja była wcześniej
  opisana jako niestabilna). */
.nc-tabs-nav.is-stuck {
  top: var(--nc-tabs-top, 60px) !important;
  /* Tak samo jak w bazowej regule wyżej — NIŻEJ niż #header (5003), również
    w stanie "przyklejonym" (is-stuck). !important tylko po to, by wygrać
    ze specyficznością reguły "body:not(.scroll-down) .nc-tabs-nav" niżej
    w pliku (ta ustawia inny `top`, nie z-index, ale i tak jest tu dla
    spójności z resztą bloku is-stuck). */
  z-index: 10 !important;
  border-bottom-color: transparent;
}
/* Miejsce na pasek wyszukiwania dokłada teraz WYŁĄCZNIE reguła transformu
  przy bazowym .nc-tabs-nav (patrz "body:not(.scroll-down) .nc-tabs-nav"
  wyżej) — dotyczy jej też w stanie is-stuck (ten sam selektor .nc-tabs-nav
  go obejmuje), bez potrzeby osobnego, zdublowanego override'u tutaj. */
.nc-tabs-nav.is-stuck::before {
  content: '';
  position: absolute;
  inset: 0;
  left: 50%;
  width: 100vw;
  transform: translateX(-50%);
  /* Dopasowane do ProductTabs.tsx (Lovable): "bg-card/95 backdrop-blur
    supports-[backdrop-filter]:bg-card/85" — 95% krycia jako fallback
    (przeglądarki bez backdrop-filter), 85% gdy blur faktycznie działa
    (więcej widać "przez" pasek), domyślny Tailwind backdrop-blur = 8px,
    bez dodatkowego saturate (oryginał go nie ma). */
  background: hsl(0 0% 100% / .85);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  box-shadow:
    inset 0 1px 0 hsl(0 0% 100% / .5),
    0 1px 0 hsl(0 0% 100% / .3),
    0 6px 16px -8px hsl(0 0% 0% / .08);
  z-index: -1;
}
@supports (backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px)) {
  .nc-tabs-nav.is-stuck::before {
    background: hsl(0 0% 100% / .65);
  }
}

/* Nieaktywne od czasu obniżenia .nc-tabs-nav do z-index:10 (patrz komentarz
  tam) — #header (5003) już zawsze wygrywa z TOC bez potrzeby dodatkowego
  podbicia. Zostawione (nieszkodliwe, wciąż stawia #header wyżej niż
  bazowe 5003) na wypadek, gdyby to podbicie było też potrzebne z innego
  powodu niż kolizja z TOC. */
@media (max-width: 768px) {
  body:not(.scroll-down) #header {
    z-index: 5015;
  }
}

/* Jak wyżej — nieaktywne względem TOC (5003 > 10 już wystarcza), zostawione
  na wypadek innej kolizji z-index podczas otwartego flyoutu kategorii. */
#header:has(.cbp-hropen) {
  z-index: 6000 !important;
}

/* Górne menu kategorii (.iqitmegamenu-wrapper > #iqitmegamenu-horizontal)
  — cały pasek #stickybar (logo+menu+kontakt) przykleja się do góry przez
  .sticky #stickybar (global.css, klasa .sticky na #page ustawiana w
  footer.tpl przy scrollTop > 0) i to ZOSTAJE bez zmian. Chowamy tylko
  samą listę kategorii (initMegamenuAutoHide w nc-product.js): scroll w
  dół → .iqitmegamenu-wrapper kolapsuje się do wysokości 0 (jak showCats
  w Lovable SiteHeader.tsx: h-0), scroll w górę → wraca. overflow:hidden
  ustawiane inline TYLKO na czas kolapsu (nie na stałe w CSS) — na stałe
  obcinałoby flyouty podkategorii (.cbp-hrsub), które muszą wystawać
  poza wysokość samego paska. Tylko od 1000px — poniżej menu jest i tak
  position:static (patrz modules/iqitmegamenu/css/front.css). */
@media (min-width: 1000px) {
  .iqitmegamenu-wrapper {
    transition: height .25s ease;
  }
  #iqitmegamenu-horizontal {
    transition: opacity .2s ease;
  }
}

.nc-tabs-nav-scroller {
  position: relative;
  display: flex;
  gap: 40px;
  overflow-x: auto;
  scrollbar-width: none;
  /* Programowe przewijanie do aktywnej zakładki (scrollTo({behavior:'smooth'})
    w initTabs, nc-product.js) już samo animuje — scroll-behavior:smooth tu
    jako uzupełnienie dla wszelkiego INNEGO przewijania tego paska (np.
    klawiaturą/scrollIntoView), żeby też było płynne, nie tylko to sterowane z JS. */
  scroll-behavior: smooth;
  max-width: var(--nc-container-max);
  margin-inline: auto;
  padding-block: 5px;
}
.nc-tabs-nav-scroller::-webkit-scrollbar { display: none; }
/* Bez osobnego paddingu na .is-stuck — .nc-tabs-nav (patrz wyżej) już nigdy
  nie zmienia szerokości między stanami (pełna szerokość ekranu to tylko
  tło na ::before), więc .nc-container cały czas dostarcza ten sam padding
  w obu stanach; dublowanie go tutaj ponownie przesuwałoby treść. */

/* Wspólny, przesuwający się wskaźnik aktywnej zakładki — pozycja/szerokość
  ustawiane w JS (updateTabIndicator w initTabs, nc-product.js) na bazie
  offsetLeft/offsetWidth aktywnego .nc-tab-btn względem .nc-tabs-nav-scroller
  (stąd position:relative wyżej). Zastępuje wcześniejszy ::after na każdym
  przycisku z osobna — ten nie umiałby animować PRZESUNIĘCIA między
  przyciskami (tylko włączać/wyłączać się w miejscu, bez ślizgu). */
.nc-tab-indicator {
  position: absolute;
  left: 0;
  bottom: 0;
  height: 3px;
  width: 0;
  border-radius: 2px 2px 0 0;
  background: var(--nc-primary);
  transform: translateX(0);
  transition: transform .25s cubic-bezier(.4, 0, .2, 1), width .25s cubic-bezier(.4, 0, .2, 1);
  pointer-events: none;
}

.nc-tab-btn {
  position: relative !important;
  flex-shrink: 0;
  padding: 0.875rem 1rem;
  font-size: 14px;
  font-weight: 600 !important;
  color: var(--nc-muted-fg) !important;
  background: transparent;
  border: none;
  cursor: pointer;
  transition: color .15s;
  white-space: nowrap;
}
/* Mobile: mniejszy odstęp między zakładkami i ciaśniejszy padding, żeby
  więcej pozycji ("Opis", "Dane techniczne", "Podobne", "Opinie") mieściło
  się w pierwszym widocznym ekranie, zanim trzeba przewinąć w prawo. */
@media (max-width: 767px) {
  .nc-tabs-nav-scroller { gap: 22px; }
  .nc-tab-btn { padding: 0.75rem 0.625rem; font-size: 13.5px; }
}
@media (hover: hover) and (pointer: fine) {

.nc-tab-btn:hover { color: var(--nc-fg) !important; }
}

.nc-tab-btn.is-active {
  color: hsl(0 0% 12%) !important;
  font-weight: 600 !important;
}

/* scroll-margin-top oparty o --nc-tabs-top — stałą, niezależną od paska
  wyszukiwania wysokość bazową headera (patrz komentarz przy .nc-tabs-nav
  i --nc-search-h wyżej) — zamiast osobnej, sztywnej wartości, która
  musiałaby być ręcznie dostrajana pod każdą zmianę wysokości nagłówka.
  Fallback (60px) i doliczony margines (~3.5rem = wysokość samego paska
  TOC + odstęp) trafiają tu tylko zanim JS zdąży wystawić realną wartość
  --nc-tabs-top. Celowo bez --nc-search-h: scroll-margin-top ma sens
  głównie dla natywnego przewijania (kotwice, powrót przez historię
  przeglądarki) — w tych przypadkach pasek wyszukiwania i tak nie jest
  akurat pokazywany (użytkownik wraca w trakcie przewijania w dół/do
  konkretnej sekcji), więc zakładamy ten sam, "osiadły" stan co przy
  programowym scrollu z initTabs (patrz offset liczony tam). */
.nc-tab-section { scroll-margin-top: calc(var(--nc-tabs-top, 60px) + 3.5rem); margin-bottom: 3rem; }
/* Clearfix — #idTabRevws (natywny markup modułu revws, global.css starej
  karty) ma "float: left; width: 100%" — bez wyczyszczenia floata ta
  sekcja (#section-opinie) kolapsowała do wysokości 0, więc kolejna
  sekcja ("Lampy z tej samej serii") renderowała się wizualnie w tym
  samym miejscu, nakładając się na wciąż-widoczną (ale wypchniętą poza
  normalny flow przez float) treść opinii. */
.nc-tab-section::after { content: ""; display: table; clear: both; }
.nc-tab-content { font-size: 15px; line-height: 1.75; color: hsl(0 0% 18%); }
/* max-height — bez tego bardzo wysokie/portretowe zdjęcie w opisie (kolumna
  opisu bywa szeroka, nawet ~1300px) rozciągało całą sekcję "Opis" na
  ekran wypełniony jednym zdjęciem. object-fit:contain zamiast ucinania —
  zdjęcie po prostu robi się węższe, nie ucięte; bez wymuszonego tła
  letterboxu (na wyraźne życzenie), więc ewentualne puste pasy pozostają
  przezroczyste/białe (kolor samego zdjęcia). */
.nc-description img {
  max-width: 100%;
  height: auto;
  max-height: 700px;
  object-fit: contain;
  border-radius: var(--nc-radius);
}
@media (max-width: 639px) {
  .nc-description img { max-height: 500px; }
}

.nc-empty-section { color: var(--nc-muted-fg); font-size: 14px; font-style: italic; }

/* ── OPIS — heading + stylowanie PSE content ── */
.nc-desc-heading {
  font-size: 22px;
  font-weight: 700;
  color: var(--nc-fg);
  margin: 0 0 1.5rem;
  line-height: 1.3;
}
#section-opis .nc-desc-heading { margin-bottom: 0.75rem; }

/* Blok "Najważniejsze cechy produktu" — przenoszony z opisu przez JS (initDescHighlights) */
.nc-desc-highlights { display: none; }
.nc-desc-highlights.nc-desc-highlights--visible {
  display: block;
  position: relative;
  margin: 0 0 0.75rem;
  padding: 1.25rem 1.5rem;
  background: var(--nc-secondary);
  border: 1px solid var(--nc-border);
  border-radius: var(--nc-radius);
}
/* Mgła (gradient fade) przed przyciskiem "Pokaż pełny opis" — jak w sekcji Parametry.
  Blok "W skrócie" jest siblingiem PRZED .nc-desc-full-wrap (nie po), więc zwykły
  selektor ~ nie zadziała wstecz — użyty :has() do wykrycia stanu rozwiniętego. */
.nc-desc-highlights.nc-desc-highlights--visible::after {
  content: "";
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  height: 3rem;
  background: linear-gradient(to bottom, transparent, var(--nc-bg));
  pointer-events: none;
  border-radius: 0 0 var(--nc-radius) var(--nc-radius);
  transition: opacity .3s;
}
.nc-desc-highlights.nc-desc-highlights--visible:has(~ .nc-desc-full-wrap.is-expanded)::after {
  opacity: 0;
}
.nc-desc-highlights h1,
.nc-desc-highlights h2,
.nc-desc-highlights h3,
.nc-desc-highlights h4 {
  font-size: 19px;
  font-weight: 700;
  color: var(--nc-fg);
  margin: 0 0 0.75rem;
  line-height: 1.3;
  text-transform: none;
  letter-spacing: normal;
}
.nc-desc-highlights ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.9rem;
}
.nc-desc-highlights li {
  font-size: 15.5px;
  line-height: 1.55;
  color: hsl(0 0% 25%);
  padding-left: 1.25rem;
  position: relative;
}
/* Fallback bez nagłówka/listy (initDescHighlights, nc-product.js) — box
  pokazuje wtedy zwykły akapit zamiast <ul>. Ten sam rozmiar/interlinia/
  kolor co bullet pointy wyżej, bez left-paddingu (nie ma kropki do
  zrobienia miejsca). */
.nc-desc-highlights > p,
.nc-desc-highlights-text > p {
  font-size: 15.5px;
  line-height: 1.55;
  color: hsl(0 0% 25%);
  margin: 0;
}
.nc-desc-highlights li::before {
  content: '';
  position: absolute;
  left: 0;
  top: 0.55em;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--nc-primary);
}
.nc-desc-highlights strong,
.nc-desc-highlights b {
  font-weight: 600;
  color: var(--nc-fg);
}
.nc-desc-highlights a {
  color: inherit;
  text-decoration: underline;
  text-underline-offset: 2px;
}
@media (hover: hover) and (pointer: fine) {
.nc-desc-highlights a:hover {
  color: var(--nc-primary);
}
}


/* Wariant ze zdjęciem obok (zabranym z sąsiedniej kolumny siatki PSE) */
.nc-desc-highlights.nc-desc-highlights--with-media {
  display: grid;
  grid-template-columns: 1fr;
  gap: 1.5rem;
  /* center, nie stretch — gdy tekst jest krótszy niż zdjęcie (które ma
    własny min-height, patrz .nc-desc-highlights-media niżej), blok tekstu
    ma się wyśrodkować w pionie względem wysokości wiersza (wyznaczonej
    przez zdjęcie) zamiast rozciągać się na całą jej wysokość z pustym
    miejscem u dołu. */
  align-items: center;
  background: transparent;
  border: none;
  padding: 0;
}
@media (min-width: 768px) {
  .nc-desc-highlights.nc-desc-highlights--with-media {
    grid-template-columns: 0.85fr 1.15fr;
  }
  .nc-desc-highlights-media { min-height: 550px; }
}
/* Mobile: zdjęcie zostaje widoczne, tylko jako osobny wiersz siatki POD
  tekstem (grid-template-columns:1fr w bazowej regule wyżej już je stackuje
  pionowo w kolejności z markupu: tekst, potem zdjęcie) — własna wysokość
  zamiast dziedziczonej przez align-items:stretch z sąsiedniej kolumny na
  desktopie. */
@media (max-width: 767px) {
  .nc-desc-highlights-media { 
    height: 220px; 
    min-height: 320px !important;
  }
}
.nc-desc-highlights-text {
  padding: 1.25rem 1.5rem;
  background: var(--nc-secondary);
  border: 1px solid var(--nc-border);
  border-radius: var(--nc-radius);
}
.nc-desc-highlights-media {
  position: relative;
  border-radius: var(--nc-radius);
  overflow: hidden;
  height: 100%;
  /* min-height: 220px; */
}
/* Obrazek jako position:absolute — nie może wpływać na auto-wysokość wiersza siatki
  (bez tego zdjęcie samo ustalało wysokość kolumny przez swój naturalny format,
  przez co blok tekstowy obok nie dorównywał mu wysokością).
  !important konieczne — moduł pshoweditor ładuje własny CSS z regułą
  ".pse-div img, .pse-figure img { height: auto !important }" bez wymogu
  przodka .pse-grid, więc nadpisuje zwykłe reguły nawet po przeniesieniu
  obrazka przez JS poza .pse-grid. */
#nc-product-page .nc-desc-highlights-media .pse-figure,
#nc-product-page .nc-desc-highlights-media .pse-div {
  position: absolute !important;
  inset: 0 !important;
}
#nc-product-page .nc-desc-highlights-media img {
  position: absolute !important;
  inset: 0 !important;
  width: 100% !important;
  height: 100% !important;
  max-width: 100% !important;
  max-height: none !important;
  object-fit: contain !important;
  object-position: center !important;
  display: block !important;
  border-radius: var(--nc-radius) !important;
}
/* Siatka PSE, z której zabrano kolumnę ze zdjęciem — pozostała kolumna na całą szerokość */
.pse-grid.nc-pse-grid--single {
  grid-template-columns: 1fr !important;
}

/* PSE grid (PrestaShow Editor) — 2 kolumny z wyrównaniem
  Każdy selektor niżej (aż do końca bloku "Plain HTML z TinyMCE") jest
  PODWÓJNIE scope'owany: ".nc-description" ORAZ "#nc-desc-full .nc-tab-content"
  naraz. Powód: opis produktu renderuje się DWIEMA różnymi ścieżkami
  (product-tabs.tpl), które dają RÓŻNY markup:
    - Hook::exec('DisplayProductAdditionalDesc1') (rzeczywista, używana
      ścieżka) → <div class="nc-tab-content"> — BEZ klasy .nc-description,
    - fallback $product->description (gdy hook nic nie zwróci) →
      <div class="nc-tab-content nc-description"> — z klasą.
  Scope'owanie WYŁĄCZNIE przez ".nc-description" (jak było wcześniej)
  działa więc tylko dla fallbacku, który w praktyce prawie nigdy się nie
  uruchamia — cała typografia PSE (nagłówki/akapity/listy) milczkiem nie
  miała żadnego efektu na realnych kartach produktów (widoczne np. jako
  dziedziczony, obcy styl `p { font-size:14px; letter-spacing:.8px }`
  zamiast naszego). "#nc-desc-full .nc-tab-content" (ten sam selektor,
  którego JS initDescHighlights w nc-product.js już używa do namierzenia
  treści opisu) pokrywa ścieżkę hookową. */
#nc-product-page .nc-description .pse-grid,
#nc-product-page #nc-desc-full .nc-tab-content .pse-grid {
  display: grid !important;
  grid-template-columns: 1fr !important;
  gap: 1.5rem !important;
  /* margin-top i -bottom (nie sam margin-bottom) — .pse-grid jest zwykłym
    blokiem w przepływie, więc jego margin-top KOLIDUJE (collapse) z
    margin-bottom poprzedzającego akapitu (.pse-p: 0.5rem) zamiast się
    do niego dodawać, dając symetryczny odstęp góra/dół niezależnie od
    tego, czy sąsiad ma własny margines. Wcześniej (sam margin-bottom)
    odstęp NAD wierszem-obrazkiem (np. baner "Kolekcja DORA") sprowadzał
    się do samego 0.5rem akapitu nad nim, a POD nim był pełne 2.5rem —
    stąd rażąca asymetria zgłoszona na zrzucie. */
  margin: 1.25rem 0 !important;
  align-items: center !important;
}
@media (min-width: 768px) {
  #nc-product-page .nc-description .pse-grid,
  #nc-product-page #nc-desc-full .nc-tab-content .pse-grid {
    grid-template-columns: 1fr 1fr !important;
    gap: 2rem !important;
  }
  /* Wiersze PSE bywają 3- albo 4-kolumnowe (np. karty "zdjęcie + nagłówek +
    opis" x3 w jednym rzędzie) — sztywne "1fr 1fr" wyżej dawało wtedy 2
    kolumny + 3. element zepchnięty samotnie do nowego wiersza (rozjazd na
    2 nierówne rzędy). ":has()" liczy realną liczbę kolumn w KONKRETNYM
    .pse-grid i dobiera do niej siatkę, więc 2-kolumnowy zygzak (tekst/
    zdjęcie) zostaje bez zmian, a rząd z 3+ kolumnami dostaje tyle torów,
    ile faktycznie ma dzieci.
    Ogólny kombinator sąsiedztwa (~), NIE :nth-child() — na produkcji
    rozszerzenie Grammarly wstrzykuje własne <grammarly-extension> jako
    RODZEŃSTWO .column wewnątrz .pse-grid (przed pierwszą kolumną), co
    przesuwało numerację :nth-child i selektor nigdy nie trafiał. "~"
    liczy tylko wcześniejsze .column, ignorując cokolwiek wstrzyknięte
    pomiędzy nimi przez rozszerzenia przeglądarki. */
  /* align-items: start (nie odziedziczone "center" z bazowej reguły) —
    przy 3+ kolumnach każda to osobna "karta" zdjęcie+nagłówek+tekst, a
    "center" wyśrodkowywało całą kolumnę względem najwyższej (różna
    długość tekstu pod zdjęciem), przez co same zdjęcia lądowały na
    różnej wysokości od góry zamiast równo w linii. */
  #nc-product-page .nc-description .pse-grid:has(> .column ~ .column ~ .column),
  #nc-product-page #nc-desc-full .nc-tab-content .pse-grid:has(> .column ~ .column ~ .column) {
    grid-template-columns: repeat(3, 1fr) !important;
    align-items: start !important;
  }
  #nc-product-page .nc-description .pse-grid:has(> .column ~ .column ~ .column ~ .column),
  #nc-product-page #nc-desc-full .nc-tab-content .pse-grid:has(> .column ~ .column ~ .column ~ .column) {
    grid-template-columns: repeat(4, 1fr) !important;
    align-items: start !important;
  }
}
#nc-product-page .nc-description .pse-grid .column,
#nc-product-page #nc-desc-full .nc-tab-content .pse-grid .column {
  width: 100% !important;
  float: none !important;
  padding: 0 !important;
  /* Moduł PSE (front.css) ładuje własne ".pse-grid .column-N { grid-column-end:
    span N }" na podstawie SWOJEJ 12-kolumnowej siatki (grid-template-columns:
    repeat(12, 1fr) w PSE) — bez !important, więc nic dotąd z nią nie
    konkurowało. Nasz grid ma tylko 2 kolumny (1fr 1fr), więc np. "column-6"
    próbujące zająć 6 torów zajmowało cały dostępny wiersz, spychając drugą
    kolumnę na nowy wiersz siatki — stąd zdjęcie i tekst stackowały się mimo
    poprawnego grid-template-columns. Reset do "1 kolumna = 1 tor". */
  grid-column: auto !important;
}

/* Wymuszenie kolejności Tekst -> Zdjęcie w wierszach opisu na mobile,
  niezależnie od kolejności źródłowej HTML (edytor PSE) — inaczej naprzemienny
  układ (zygzak) na desktopie po zwinięciu do jednej kolumny daje np.
  tekst -> zdjęcie -> zdjęcie -> tekst. */
@media (max-width: 767px) {
  #nc-product-page .nc-description .pse-grid .column:has(img, .pse-figure, video, iframe),
  #nc-product-page #nc-desc-full .nc-tab-content .pse-grid .column:has(img, .pse-figure, video, iframe) {
    order: 2;
  }
  #nc-product-page .nc-description .pse-grid .column:not(:has(img, .pse-figure, video, iframe)),
  #nc-product-page #nc-desc-full .nc-tab-content .pse-grid .column:not(:has(img, .pse-figure, video, iframe)) {
    order: 1;
  }
}

/* Duplikat tytułu produktu (H1) + akapit "Kod produktu:" — edytor PSE
  wstawia je automatycznie jako pierwszy blok opisu, ale tytuł produktu i
  tak wyświetla się już osobno jako h1.nc-product-title nad galerią.
  [data-arx-first-level] istnieje TYLKO w DOM-ie edytora (tryb
  contenteditable w adminie) — nie jest zapisywane do treści produktu, więc
  na froncie nigdy nie ma jak trafić w ten atrybut. Element do ukrycia
  (akapit "Kod produktu:") jest więc wykrywany po TREŚCI w JS
  (initDescHighlights, nc-product.js — dopasowanie tekstu, nie da się tego
  zrobić czystym CSS) i oznaczany tą klasą. Technika "visually hidden" (jak
  .nc-sr-only wyżej w tym pliku), NIE display:none — element zostaje w
  źródle HTML/DOM (dostępny dla wyszukiwarek i czytników ekranu jako
  metadane), po prostu nie zajmuje miejsca ani nie jest widoczny dla
  klienta. */
.nc-desc-meta-hidden {
  position: absolute !important;
  width: 1px !important;
  height: 1px !important;
  padding: 0 !important;
  margin: -1px !important;
  overflow: hidden !important;
  clip: rect(0,0,0,0) !important;
  white-space: nowrap !important;
  border: 0 !important;
}

/* PSE zdjęcia */
#nc-product-page .nc-description .pse-figure,
#nc-product-page #nc-desc-full .nc-tab-content .pse-figure {
  margin: 0 !important;
  border-radius: var(--nc-radius) !important;
  overflow: hidden !important;
}
/* max-height — ten sam powód co przy .nc-description img wyżej w tym pliku
  (bardzo wysokie/portretowe zdjęcia w opisie rozciągały całą sekcję) —
  object-fit:contain zamiast ucinania, bez wymuszonego tła letterboxu. */
#nc-product-page .nc-description .pse-img,
#nc-product-page #nc-desc-full .nc-tab-content .pse-img {
  width: 100% !important;
  height: auto !important;
  max-height: 700px !important;
  object-fit: contain !important;
  display: block !important;
  border-radius: var(--nc-radius) !important;
}
@media (max-width: 639px) {
  #nc-product-page .nc-description .pse-img,
  #nc-product-page #nc-desc-full .nc-tab-content .pse-img {
    max-height: 500px !important;
  }
}

/* PSE nagłówki — ta sama skala co .nc-desc-highlights-text (kafelek "W
  skrócie"): akapit/li = 15.5px to punkt odniesienia dla całej reszty
  opisu, nagłówki proporcjonalnie większe wg poziomu (h1 > h2 > h3 > h4,
  każdy wyraźnie ponad 15.5px, malejąco). .pse-h2 zdefiniowane PRZED
  .pse-h1 — realne treściowe nagłówki w PSE (np. "Kolor i materiał")
  noszą WYŁĄCZNIE klasę .pse-h2; edytor dokleja .pse-h1 tylko do
  duplikatu tytułu produktu na samym początku opisu (element wtedy ma
  OBIE klasy naraz: class="pse-h2 pse-h1") — ale ten duplikat i tak jest
  trwale ukrywany jako metadana (patrz .nc-desc-meta-hidden, initDescHighlights
  w nc-product.js), więc w praktyce widoczny jest zawsze tylko .pse-h2.
  Kolejność (.pse-h1 na końcu) zostaje wyłącznie jako zabezpieczenie na
  przyszłość — przy równej specyficzności i obu klasach na jednym
  elemencie wygrywa reguła zdefiniowana później w pliku, więc to .pse-h1
  (właściwy, większy rozmiar) miałby pierwszeństwo, gdyby kiedyś jednak
  coś z klasą .pse-h1 zostało pokazane. */
#nc-product-page .nc-description .pse-h2,
#nc-product-page #nc-desc-full .nc-tab-content .pse-h2 {
  font-size: 19.5px !important;
  font-weight: 700 !important;
  color: var(--nc-fg) !important;
  margin: 1.25rem 0 0.75rem !important;
  line-height: 1.3 !important;
  text-transform: none !important;
}
#nc-product-page .nc-description .pse-h2:first-child,
#nc-product-page #nc-desc-full .nc-tab-content .pse-h2:first-child {
  margin-top: 0 !important;
}
#nc-product-page .nc-description .pse-h1,
#nc-product-page #nc-desc-full .nc-tab-content .pse-h1 {
  font-size: 22px !important;
  font-weight: 700 !important;
  color: var(--nc-fg) !important;
  margin: 0 0 0.5rem !important;
  line-height: 1.3 !important;
  text-transform: none !important;
}

/* PSE akapity — 15.5px/1.55, identycznie jak tekst w kafelku "W skrócie"
  (.nc-desc-highlights li) — jeden wspólny rozmiar bazowy dla całego opisu. */
#nc-product-page .nc-description .pse-p,
#nc-product-page #nc-desc-full .nc-tab-content .pse-p {
  font-size: 15.5px !important;
  line-height: 1.55 !important;
  color: hsl(0 0% 25%) !important;
  margin: 0 0 0.5rem !important;
}

/* PSE listy — ta sama typografia co paragrafy wyżej */
#nc-product-page .nc-description .pse-ul,
#nc-product-page #nc-desc-full .nc-tab-content .pse-ul {
  list-style: disc !important;
  padding-left: 1.25rem !important;
  margin: 0 0 0.75rem !important;
  display: flex !important;
  flex-direction: column !important;
  gap: 0.5rem !important;
}
#nc-product-page .nc-description .pse-li,
#nc-product-page #nc-desc-full .nc-tab-content .pse-li {
  font-size: 15.5px !important;
  line-height: 1.55 !important;
  color: hsl(0 0% 25%) !important;
  padding-left: 0.25rem !important;
}
#nc-product-page .nc-description .pse-strong,
#nc-product-page #nc-desc-full .nc-tab-content .pse-strong,
#nc-product-page .nc-description .pse-b,
#nc-product-page #nc-desc-full .nc-tab-content .pse-b {
  font-weight: 600 !important;
  color: var(--nc-fg) !important;
}

/* cvProductAdditionalDesc wrapper — reset marginesów */
#nc-product-page .nc-description .cvProductAdditionalDesc,
#nc-product-page #nc-desc-full .nc-tab-content .cvProductAdditionalDesc {
  font-family: 'Poppins', system-ui, -apple-system, sans-serif !important;
}

/* ── Plain HTML z TinyMCE (h1-h4/p/ul/a) — bez PSE ──
  Ta sama skala co blok PSE wyżej i kafelek "W skrócie": akapit/li bazowo
  15.5px, nagłówki proporcjonalnie większe malejąco wg poziomu (h1 22px >
  h2 19.5px > h3 18px > h4 16.5px), wszystkie wyraźnie ponad tekstem
  akapitu, żeby hierarchia była czytelna niezależnie od tego, ile
  poziomów nagłówków dany opis faktycznie wykorzystuje. */
#nc-product-page .nc-description h1,
#nc-product-page #nc-desc-full .nc-tab-content h1,
#nc-product-page .nc-description-short h1 {
  font-size: 22px !important;
  font-weight: 700 !important;
  color: var(--nc-fg) !important;
  margin: 1.25rem 0 0.625rem !important;
  line-height: 1.3 !important;
  text-transform: none !important;
  letter-spacing: normal !important;
}
#nc-product-page .nc-description h2,
#nc-product-page #nc-desc-full .nc-tab-content h2,
#nc-product-page .nc-description-short h2 {
  font-size: 19.5px !important;
  font-weight: 700 !important;
  color: var(--nc-fg) !important;
  margin: 1.25rem 0 0.625rem !important;
  line-height: 1.3 !important;
  text-transform: none !important;
  letter-spacing: normal !important;
}
#nc-product-page .nc-description h3,
#nc-product-page #nc-desc-full .nc-tab-content h3,
#nc-product-page .nc-description-short h3 {
  font-size: 18px !important;
  font-weight: 700 !important;
  color: var(--nc-fg) !important;
  margin: 1.25rem 0 0.625rem !important;
  line-height: 1.3 !important;
  text-transform: none !important;
  letter-spacing: normal !important;
}
#nc-product-page .nc-description h4,
#nc-product-page #nc-desc-full .nc-tab-content h4,
#nc-product-page .nc-description-short h4 {
  font-size: 16.5px !important;
  font-weight: 700 !important;
  color: var(--nc-fg) !important;
  margin: 1.25rem 0 0.625rem !important;
  line-height: 1.3 !important;
  text-transform: none !important;
  letter-spacing: normal !important;
}
#nc-product-page .nc-description h1:first-child,
#nc-product-page #nc-desc-full .nc-tab-content h1:first-child,
#nc-product-page .nc-description h2:first-child,
#nc-product-page #nc-desc-full .nc-tab-content h2:first-child,
#nc-product-page .nc-description h3:first-child,
#nc-product-page #nc-desc-full .nc-tab-content h3:first-child,
#nc-product-page .nc-description h4:first-child,
#nc-product-page #nc-desc-full .nc-tab-content h4:first-child,
#nc-product-page .nc-description-short h1:first-child,
#nc-product-page .nc-description-short h2:first-child,
#nc-product-page .nc-description-short h3:first-child,
#nc-product-page .nc-description-short h4:first-child { margin-top: 0 !important; }

#nc-product-page .nc-description p,
#nc-product-page #nc-desc-full .nc-tab-content p,
#nc-product-page .nc-description-short p {
  font-size: 15.5px !important;
  line-height: 1.55 !important;
  margin: 0 0 0.625rem !important;
  color: hsl(0 0% 25%) !important;
}
#nc-product-page .nc-description ul,
#nc-product-page #nc-desc-full .nc-tab-content ul,
#nc-product-page .nc-description ol,
#nc-product-page #nc-desc-full .nc-tab-content ol {
  list-style: disc !important;
  padding-left: 1.25rem !important;
  margin: 0 0 1rem !important;
  display: flex !important;
  flex-direction: column !important;
  gap: 0.375rem !important;
}
#nc-product-page .nc-description li,
#nc-product-page #nc-desc-full .nc-tab-content li {
  font-size: 15.5px !important;
  line-height: 1.55 !important;
  color: hsl(0 0% 25%) !important;
  padding-left: 0.25rem !important;
}
#nc-product-page .nc-description strong,
#nc-product-page #nc-desc-full .nc-tab-content strong,
#nc-product-page .nc-description b,
#nc-product-page #nc-desc-full .nc-tab-content b {
  font-weight: 600 !important;
  color: var(--nc-fg) !important;
}
#nc-product-page .nc-description a,
#nc-product-page #nc-desc-full .nc-tab-content a,
#nc-product-page .nc-description-short a {
  color: var(--nc-primary) !important;
  text-decoration: none !important;
}
@media (hover: hover) and (pointer: fine) {
#nc-product-page .nc-description a:hover,
#nc-product-page #nc-desc-full .nc-tab-content a:hover,
#nc-product-page .nc-description-short a:hover { text-decoration: underline !important; }
}


/* Pokaż pełny opis — toggle */
.nc-desc-full-wrap {
  margin-top: 1.5rem;
  padding-bottom: 1.5rem;
  border-bottom: 1px solid var(--nc-border);
}
#section-opis .nc-desc-highlights--visible + .nc-desc-full-wrap { margin-top: 0.5rem; }

/* Mgła na boksie "Najważniejsze parametry" — mask-image zamiast gradientu
  na osobnym ::after. Maskuje CAŁY box (treść + border + box-shadow) naraz,
  więc obramowanie znika razem z resztą zamiast prześwitywać spod warstwy
  nałożonej tylko na wnętrze — to był źródłowy problem poprzedniego podejścia
  (::after nie mógł zakryć border/box-shadow rodzica, bo są rysowane na jego
  krawędzi, poza obszarem, na którym leżał pseudoelement).
  8rem = 80px strefy zanikania (przy zmierzonej wysokości wiersza 36.8px to
  ponad 2 wiersze), reszta od góry w pełni widoczna (czarna maska = widoczne). */
.nc-specs-box {
  -webkit-mask-image: linear-gradient(to bottom, black calc(100% - 8rem), transparent 100%);
  mask-image: linear-gradient(to bottom, black calc(100% - 8rem), transparent 100%);
}
.nc-specs.is-expanded .nc-specs-box {
  -webkit-mask-image: none;
  mask-image: none;
}

/* Mgła na opisie krótkim */
.nc-description-short {
  position: relative;
}
.nc-description-short::after {
  content: "";
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  height: 3rem;
  background: linear-gradient(to bottom, transparent, var(--nc-bg));
  pointer-events: none;
  border-radius: 0 0 var(--nc-radius) var(--nc-radius);
  transition: opacity .3s;
}
.nc-desc-full-wrap.is-expanded ~ .nc-description-short::after,
section.is-expanded .nc-description-short::after {
  opacity: 0;
}

.nc-desc-toggle {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  width: auto;
  margin: 1.25rem auto 0;
  padding: 1rem 2.5rem;
  border: 1px solid var(--nc-border);
  border-radius: var(--nc-radius);
  background: var(--nc-secondary);
  font-size: 14px;
  font-weight: 600;
  color: var(--nc-fg);
  cursor: pointer;
  transition: background .15s, border-color .15s;
  font-family: inherit;
}
.nc-desc-toggle[data-nc-toggle="nc-specs-extra"] { padding: 1rem 2.5rem; }
@media (hover: hover) and (pointer: fine) {
.nc-desc-toggle:hover { background: hsl(36 25% 92%); border-color: hsl(0 0% 70%); }
}

.nc-desc-toggle[aria-expanded="true"] .nc-chevron { transform: rotate(180deg); }

/* Płynna animacja rozwijania */
.nc-desc-full,
.nc-specs-extra {
  overflow: hidden;
  transition: max-height .4s ease, opacity .3s ease;
  max-height: 0;
  opacity: 0;
}
.nc-desc-full.is-open,
.nc-specs-extra.is-open {
  opacity: 1;
}
.nc-desc-full[hidden],
.nc-specs-extra[hidden] {
  display: block !important;
  max-height: 0 !important;
  opacity: 0 !important;
  overflow: hidden !important;
}
.nc-desc-full { margin-bottom: 1rem; }

/* Tabela specyfikacji — styl React
  Bez overflow-x:auto — per spec CSS Overflow, gdy jedna oś ma overflow inny
  niż visible, przeglądarka wymusza auto na DRUGIEJ osi (nie da się mieć
  overflow-x:auto + overflow-y:visible), stąd nieoczekiwany pionowy scrollbar
  gdy zawartość przekroczyła wysokość kontenera o parę pikseli. .nc-specs-box
  ma już overflow:hidden, więc pozioma treść i tak nie ucieknie. */
.nc-specs {
  overflow: visible;
}
.nc-specs-box {
  box-shadow: inset 0 0 0 1px var(--nc-border);
  border-radius: var(--nc-radius);
  overflow: hidden;
  margin-bottom: 1.75rem;
  border: 1px solid rgba(217, 219, 221, 0.5);
}
.nc-specs-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 14px;
}
.nc-specs-table + .nc-specs-table { margin-top: 0; }
.nc-specs-group-header {
  background: var(--nc-secondary) !important;
  border-top: 1px solid var(--nc-border) !important;
  border-bottom: 1px solid var(--nc-border) !important;
  padding: 0.75rem 1rem 0.375rem !important;
  font-size: 12px !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: .1em !important;
  color: var(--nc-fg) !important;
}
.nc-specs-table:first-child .nc-specs-group-header {
  border-top: none !important;
}
.nc-specs-row:nth-child(odd) { background: var(--nc-bg); }
.nc-specs-row:nth-child(even) { background: hsl(36 25% 97%); }
.nc-specs-key {
  width: 40%;
  padding: 0.75rem 1rem;
  font-weight: 400;
  color: var(--nc-muted-fg);
  border-bottom: none;
  text-align: left;
  vertical-align: top;
  font-size: 14px;
}
.nc-specs-val {
  padding: 0.75rem 1rem;
  color: var(--nc-fg);
  font-weight: 600;
  border-bottom: none;
  border: 1px solid rgba(217, 219, 221, 0.5);
  vertical-align: top;
  font-size: 14px;
}

.nc-accordion { display: flex; flex-direction: column; }
.nc-accordion-item { border-bottom: 1px solid var(--nc-border); }

.nc-accordion-trigger {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1rem;
  padding: 1rem 0;
  background: transparent;
  border: none;
  font-size: 15px;
  font-weight: 600;
  color: var(--nc-fg);
  cursor: pointer;
  text-align: left;
}
@media (hover: hover) and (pointer: fine) {
.nc-accordion-trigger:hover { color: var(--nc-primary); }
}

.nc-accordion-trigger[aria-expanded="true"] .nc-chevron { transform: rotate(180deg); }

.nc-accordion-panel { padding-bottom: 1rem; }
.nc-accordion-panel p { font-size: 14px; line-height: 1.7; color: hsl(0 0% 20%); margin: 0; }
.nc-accordion-panel[hidden] { display: none; }

/* ─────────────────────────────────────────────
  ŻARÓWKI
  ───────────────────────────────────────────── */
.nc-bulbs {}
.nc-bulbs-grid {
  display: grid;
  grid-template-columns: repeat(2, 1fr);
  gap: 0.75rem;
}
@media (min-width: 640px) { .nc-bulbs-grid { grid-template-columns: repeat(3, 1fr); } }
@media (min-width: 1024px) { .nc-bulbs-grid { grid-template-columns: repeat(4, 1fr); } }

.nc-bulb-tile {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--nc-border);
  border-radius: var(--nc-radius);
  overflow: hidden;
  text-decoration: none;
  color: var(--nc-fg);
  background: var(--nc-card);
  transition: box-shadow .15s;
}
@media (hover: hover) and (pointer: fine) {
.nc-bulb-tile:hover { box-shadow: var(--nc-shadow-card); }
}

.nc-bulb-img-wrap { aspect-ratio: 1; background: var(--nc-product-bg); }
.nc-bulb-img-wrap img { width: 100%; height: 100%; object-fit: contain; display: block; }
.nc-bulb-info { padding: 0.625rem; display: flex; flex-direction: column; gap: 0.25rem; }
.nc-bulb-name { font-size: 12px; font-weight: 500; }
.nc-bulb-price { font-size: 14px; font-weight: 700; color: var(--nc-primary); }

/* ─────────────────────────────────────────────
  MODAL (Zapytaj o produkt)
  ───────────────────────────────────────────── */
.nc-modal {
  position: fixed;
  inset: 0;
  z-index: 900;
  display: flex;
  align-items: flex-end;
  justify-content: center;
}
.nc-modal[hidden] { display: none; }
@media (min-width: 640px) { .nc-modal { align-items: center; } }

.nc-modal-backdrop {
  position: absolute;
  inset: 0;
  background: hsl(0 0% 12% / .4);
  cursor: pointer;
  /* Przyciemnienie wchodzi płynnie razem z panelem — .is-open jest
    ustawiane na rodzicu (.nc-modal), patrz initAskModal/initAskFormModal
    w nc-product.js (ten sam wzorzec co initBulbsDrawer: hidden=false →
    rAF dodaje .is-open → transitionend zdejmuje hidden przy zamykaniu).
    Nasłuch transitionend celowo wisi na TYM elemencie (nie na panelu) —
    ta reguła obowiązuje na WSZYSTKICH szerokościach, więc zawsze się
    odpali, w przeciwieństwie do transform panelu, który na desktopie
    się nie zmienia (patrz .nc-modal-panel niżej). */
  opacity: 0;
  transition: opacity .3s cubic-bezier(.16, 1, .3, 1);
}
.nc-modal.is-open .nc-modal-backdrop { opacity: 1; }

.nc-modal-panel {
  z-index: 1;
  background: var(--nc-card);
  max-height: 90vh;
  overflow-y: auto;
  display: flex;
  flex-direction: column;
}

/* Mobile: "bottom sheet" — panel jest SAM position:fixed, przyklejony do
  dołu viewportu, niezależnie od flex/align-items na rodzicu (.nc-modal) —
  position:fixed liczy się od viewportu (żaden przodek w tym poddrzewie
  nie ma transform/filter/perspective, patrz initAskModal — modal jest
  portalowany do <body> właśnie po to, by to zagwarantować). */
@media (max-width: 639px) {
  .nc-modal-panel {
    position: fixed;
    left: 0;
    right: 0;
    bottom: 0;
    top: auto;
    width: 100%;
    max-width: 100%;
    height: auto;
    max-height: 90vh;
    border-radius: 20px 20px 0 0;
    padding-bottom: calc(1rem + env(safe-area-inset-bottom));
    transform: translateY(100%);
    transition: transform .3s cubic-bezier(.16, 1, .3, 1);
  }
  .nc-modal.is-open .nc-modal-panel {
    transform: translateY(0);
  }
  /* Uchwyt "drag handle" — czysto wizualny (przeciąganie gestem nie jest
    zaimplementowane), sygnalizuje bottom-sheet; ten sam dla obu modali
    ("Zapytaj o produkt" i sub-panelu "Formularz kontaktowy"). */
  .nc-modal-panel::before {
    content: '';
    flex-shrink: 0;
    display: block;
    width: 38px;
    height: 4px;
    border-radius: 999px;
    background: #d1d5db;
    margin: 8px auto 4px;
  }
}

/* Desktop: wycentrowany dialog */
@media (min-width: 640px) {
  .nc-modal-panel {
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    width: min(560px, calc(100vw - 2rem));
    border-radius: 12px;
    border: 1px solid var(--nc-border);
    box-shadow: 0 20px 60px hsl(0 0% 0% / .2);
  }
}

.nc-modal-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 0.75rem;
  padding: 1rem 1rem 0.75rem;
  border-bottom: 1px solid var(--nc-border);
  flex-shrink: 0;
}
@media (min-width: 640px) { .nc-modal-header { padding: 1.25rem 1.5rem 0.75rem; } }

.nc-modal-title { font-size: 17px; font-weight: 700; color: var(--nc-fg); margin: 0 0 0.25rem; line-height: 1.3; }
@media (min-width: 640px) { .nc-modal-title { font-size: 18px; } }
.nc-modal-subtitle { font-size: 12.5px; color: var(--nc-muted-fg); line-height: 1.5; margin: 0; }
@media (min-width: 640px) { .nc-modal-subtitle { font-size: 13px; } }

.nc-modal-close {
  flex-shrink: 0;
  width: 2.5rem;
  height: 2.5rem;
  border-radius: var(--nc-radius);
  border: 1px solid hsl(0 0% 0% / .1);
  background: var(--nc-card);
  box-shadow: 0 1px 3px hsl(0 0% 0% / .06);
  display: grid;
  place-items: center;
  cursor: pointer;
  color: var(--nc-fg);
  transition: background .12s;
}
@media (hover: hover) and (pointer: fine) {
.nc-modal-close:hover { background: var(--nc-secondary); }
}


/* ─────────────────────────────────────────────
  MODAL "ZAPYTAJ O PRODUKT" — wybór formy kontaktu
  Bottom-sheet na mobile / wycentrowany na desktopie, jak każdy .nc-modal
  (patrz reguły .nc-modal-panel wyżej) — align-items tu bez realnego efektu
  (panel jest position:fixed, poza flow rodzica), zostaje z przyzwyczajenia
  do wcześniejszej wersji. z-index bardzo wysoki (999999) — ma wygrywać z
  absolutnie wszystkim na stronie (sticky nav, header itd.), scroll strony
  w tle NIE jest blokowany (patrz initAskModal w nc-product.js — świadomie
  bez body.overflow:hidden).
  ───────────────────────────────────────────── */
.nc-ask-modal {
  align-items: center !important;
  z-index: 999999;
}
.nc-ask-modal .nc-modal-backdrop {
  background: rgba(0, 0, 0, 0.4);
}
.nc-ask-modal .nc-modal-header {
  padding: 24px 24px 16px;
  border-bottom: none;
}

/* Sub-panel "Formularz kontaktowy" — pozycjonowanie/animacja (mobile
  bottom-sheet, desktop wycentrowany dialog) dziedziczy z generycznych
  reguł .nc-modal-panel (patrz wyżej, przy .nc-modal) — te same co kafelek
  wyboru formy kontaktu (#nc-ask-modal). Jedyna różnica: węższy dialog na
  desktopie. */
@media (min-width: 640px) {
  #nc-ask-form-modal .nc-modal-panel { width: min(520px, calc(100vw - 2rem)); }
}

#nc-ask-form-modal .nc-modal-header {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  padding: 16px 16px 12px;
  border-bottom: 1px solid var(--nc-border);
}
@media (min-width: 640px) {
  #nc-ask-form-modal .nc-modal-header { padding: 16px 20px 12px; }
}
#nc-ask-form-back,
#nc-ask-form-close,
#nc-ask-close {
  border-radius: 8px;
  border-color: var(--nc-border);
}
#nc-ask-form-back { width: 36px; height: 36px; }
#nc-ask-form-close,
#nc-ask-close { width: 40px; height: 40px; box-shadow: 0 1px 2px hsl(0 0% 0% / .06); }
#nc-ask-form-back svg,
#nc-ask-form-close svg,
#nc-ask-close svg { width: 18px; height: 18px; }
#nc-ask-form-modal .nc-modal-title { line-height: 1.25 !important; }
#nc-ask-form-modal .nc-modal-subtitle {
  margin-top: 2px !important;
  font-size: 12.5px !important;
  line-height: 1.375 !important;
}

/* Nagłówek sub-panelu formularza — przycisk "Wstecz" po lewej (ten sam
  styl co "X", patrz .nc-modal-close), tytuł/podtytuł wypełniają resztę
  miejsca (flex:1), zamknięcie zostaje przy prawej krawędzi. */
.nc-ask-form-header-text { flex: 1; min-width: 0; }
/* Typografia dokładnie wg zmierzonych wartości z referencji (Poppins,
  wagi/rozmiary/tracking/kolor per element) — jawny font-family + weight,
  bo Font Ninja wstrzykuje własne (ten sam powód co FIXUPS v18/v19 wyżej
  w tym pliku). */
.nc-ask-modal .nc-modal-title {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 17px !important;
  line-height: 21.3px !important;
  letter-spacing: -0.3px !important;
  color: #1F1F1F !important;
}
.nc-ask-modal .nc-modal-subtitle {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
  font-size: 12px !important;
  line-height: 17.2px !important;
  letter-spacing: -0.1px !important;
  color: #616161 !important;
}

.nc-ask-tiles {
  padding: 0 24px 20px;
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.nc-ask-tile {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 10px 12px;
  border: 1px solid #e5e7eb;
  border-radius: 12px;
  background: var(--nc-card);
  text-align: left;
  text-decoration: none;
  color: inherit;
  font-family: inherit;
  width: 100%;
}
.nc-ask-tile--ctx { 
  background: var(--nc-card); 
  background-color: rgba(248, 245, 242, 0.5);
}
.nc-ask-tile--action {
  cursor: pointer;
  transition: border-color .15s, background .15s;
}
@media (hover: hover) and (pointer: fine) {
.nc-ask-tile--action:hover {
  border-color: hsl(0 0% 55%);
  background: hsl(36 20% 98%);
}
}


.nc-ask-tile-icon {
  flex-shrink: 0;
  width: 44px;
  height: 44px;
  border-radius: 10px;
  background: #f5f5f4;
  display: grid;
  place-items: center;
  color: var(--nc-fg);
  overflow: hidden;
}
.nc-ask-tile-thumb img { width: 100%; height: 100%; object-fit: contain; display: block; }

.nc-ask-tile-body { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.nc-ask-tile-eyebrow {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 600 !important;
  font-size: 10px !important;
  line-height: 15px !important;
  letter-spacing: 0.5px !important;
  color: #616161 !important;
  text-transform: uppercase;
}
.nc-ask-tile-title {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 700 !important;
  color: #1F1F1F !important;
}
/* Nazwa produktu (kafelek kontekstu) — mniejsza niż tytuły kafelków akcji */
.nc-ask-tile--ctx .nc-ask-tile-title {
  font-size: 13px !important;
  line-height: 17.9px !important;
  letter-spacing: -0.1px !important;
}
.nc-ask-tile--action .nc-ask-tile-title {
  font-size: 14px !important;
  line-height: 17.5px !important;
  letter-spacing: -0.1px !important;
}
.nc-ask-tile-sub {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
  font-size: 12px !important;
  line-height: 17.2px !important;
  letter-spacing: -0.1px !important;
  color: #616161 !important;
}

.nc-ask-modal-footer {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 14px 24px;
  border-top: 1px solid var(--nc-border);
  font-size: 12.5px;
  color: var(--nc-muted-fg);
}
.nc-ask-modal-footer svg { flex-shrink: 0; color: var(--nc-muted-fg); }

/* fill:none !important — ikony w tym modalu mają być czystym obrysem
  (stroke), nie wypełnionym kształtem; sam atrybut fill="none" w markupie
  nie zawsze wygrywa (patrz analogiczne fixupy przy .nc-chevron/.nc-delivery-icon
  wyżej w tym pliku), więc dobijamy to jawnie w CSS z !important. */
.nc-modal-close svg,
.nc-ask-tile-icon svg,
.nc-ask-modal-footer svg {
  fill: none !important;
}

#nc-ask-form-modal .nc-ask-form { padding: 1rem; display: flex; flex-direction: column; gap: 0.875rem; overflow-y: auto; flex: 1; }

/* Komunikat sukcesu/błędu po wysyłce (AJAX do sendtoafriend_ajax.php,
  patrz initAskFormModal w nc-product.js) */
.nc-ask-form-status {
  padding: 0.625rem 0.75rem;
  border-radius: var(--nc-radius);
  font-size: 13px;
  line-height: 1.5;
}
.nc-ask-form-status--success {
  background: hsl(142 55% 95%);
  color: hsl(142 60% 25%);
  border: 1px solid hsl(142 45% 80%);
}
.nc-ask-form-status--error {
  background: hsl(4 90% 96%);
  color: hsl(4 70% 35%);
  border: 1px solid hsl(4 70% 85%);
}
@media (min-width: 640px) { #nc-ask-form-modal .nc-ask-form { padding: 1rem 1.25rem; } }

.nc-ask-product-ctx {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  border-radius: 6px;
  background: hsl(36 30% 96% / .5);
  border: 1px solid var(--nc-border);
  padding: 0.625rem;
}
.nc-ask-product-thumb {
  flex-shrink: 0;
  width: 4.25rem;
  height: 4.25rem;
  border-radius: 6px;
  background: var(--nc-product-bg);
  overflow: hidden;
  border: 1px solid var(--nc-border);
}
.nc-ask-product-thumb img { width: 100%; height: 100%; object-fit: contain; display: block; }
.nc-ask-product-ctx-label { font-size: 10px; text-transform: uppercase; letter-spacing: .05em; font-weight: 600; color: var(--nc-muted-fg); }
.nc-ask-product-ctx-name {
  font-size: 13px;
  font-weight: 700;
  line-height: 1.375;
  color: var(--nc-fg);
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

.nc-form-field { display: flex; flex-direction: column; gap: 0.25rem; }
.nc-form-label { display: block; font-size: 12px; font-weight: 600; color: var(--nc-fg); }
.nc-required { color: var(--nc-primary); }
.nc-optional { font-weight: 400; color: var(--nc-muted-fg); }

.nc-input,
.nc-textarea {
  width: 100%;
  padding-inline: 0.75rem;
  border: 1px solid var(--nc-border);
  border-radius: 6px;
  background: var(--nc-bg);
  font-size: 14px;
  color: var(--nc-fg);
  font-family: inherit;
  transition: border-color .15s, box-shadow .15s;
}
.nc-input { height: 4.25rem; }
.nc-textarea { padding-block: 0.625rem; min-height: 6rem; resize: vertical; }
.nc-input:focus,
.nc-textarea:focus {
  outline: none;
  box-shadow: 0 0 0 2px hsl(283 76% 43.7% / .4);
}
/* iOS Safari auto-zoomuje CAŁĄ stronę po wejściu w focus na input/textarea
  z font-size < 16px (ignoruje user-scalable=0 z meta viewport — to
  ograniczenie dotyczy tylko pinch-zoomu, nie tego automatycznego). Efekt:
  treść (w tym placeholder) "skacze" i powiększa się przy kliknięciu w
  pole. 16px na mobile eliminuje to zjawisko u źródła; wygląd (14px)
  zostaje bez zmian od 640px w górę. */
@media (max-width: 639px) {
  .nc-input,
  .nc-textarea {
    font-size: 16px;
  }
}

.nc-form-check {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  cursor: pointer;
}
/* Font Ninja wstrzykuje własny font-family/weight (patrz FIXUPS v18/v19
  wyżej w tym pliku) — jawne nadpisanie z !important, ten sam wzorzec. */
.nc-form-check span {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
  font-size: 12px !important;
  line-height: 1.4 !important;
  color: var(--nc-muted-fg) !important;
}

/* Custom checkbox — natywny <input>, wtyczka Uniform (autoload/15-jquery.
  uniform-modified.js, globalnie owija WSZYSTKIE checkboxy w motywie we
  własny <span class="checker"> i chowa oryginalny input) jest dla NIEGO
  wyłączona wprost w tamtym pliku (selektor :not(.nc-check-input)) —
  dlatego można to swobodne stylować przez appearance:none, bez walki z
  DOM-em wstrzykiwanym przez uniform.js. */
.nc-check-input {
  appearance: none;
  -webkit-appearance: none;
  flex-shrink: 0;
  width: 16px;
  height: 16px;
  margin: 0;
  margin-top: 2px;
  border: 1.5px solid #6b7280;
  border-radius: 4px;
  background-color: #ffffff;
  cursor: pointer;
  transition: background-color .15s, border-color .15s;
}
@media (hover: hover) and (pointer: fine) {
.nc-check-input:hover { border-color: #4b5563; }
}

.nc-check-input:checked {
  background-color: var(--nc-primary);
  border-color: var(--nc-primary);
  background-repeat: no-repeat;
  background-position: center;
  background-size: 11px 11px;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'/%3E%3C/svg%3E");
}
.nc-check-input:focus-visible {
  outline: none;
  box-shadow: 0 0 0 2px hsl(283 76% 43.7% / .3);
}

#nc-ask-form-submit {
  width: 100%;
  height: 4.75rem;
  border-radius: 6px;
  font-size: 14px;
  font-weight: 700;
  letter-spacing: .025em;
  box-shadow: 0 1px 2px hsl(0 0% 0% / .06);
}

.nc-ask-alt-contacts { padding-top: 0.75rem; border-top: 1px solid var(--nc-border); }
.nc-ask-alt-label { font-size: 11px; text-transform: uppercase; letter-spacing: .08em; font-weight: 600; color: var(--nc-muted-fg); text-align: center; margin-bottom: 0.5rem; }
.nc-ask-alt-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.5rem; }
.nc-ask-alt-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  height: 2.5rem;
  border-radius: var(--nc-radius);
  border: 1px solid var(--nc-border);
  background: var(--nc-card);
  font-size: 13px;
  font-weight: 600;
  color: var(--nc-fg);
  text-decoration: none;
  transition: border-color .15s, background .15s;
}
@media (hover: hover) and (pointer: fine) {
.nc-ask-alt-btn:hover { border-color: hsl(0 0% 40%); background: var(--nc-secondary); }
}

.nc-ask-alt-hours { margin-top: 0.5rem; font-size: 11.5px; color: var(--nc-muted-fg); text-align: center; }
.nc-ask-alt-hours strong { font-weight: 600; color: var(--nc-fg); }

/* ─────────────────────────────────────────────
  STICKY BARS
  ───────────────────────────────────────────── */

/* Mobile sticky */
.nc-sticky-mobile {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 50;
  background: var(--nc-bg);
  border-top: 1px solid var(--nc-border);
  box-shadow: var(--nc-shadow-sticky);
  padding: 0.625rem 1rem;
  padding-bottom: calc(0.625rem + env(safe-area-inset-bottom));
}
.nc-sticky-mobile[hidden] { display: none; }
@media (min-width: 1024px) { .nc-sticky-mobile { display: none !important; } }

.nc-sticky-mobile-inner {
  display: flex;
  align-items: center;
  gap: 0.625rem;
}
.nc-sticky-mobile-thumb {
  flex-shrink: 0;
  width: 4.5rem;
  height: 4.5rem;
  border-radius: 8px;
  overflow: hidden;
  background: var(--nc-product-bg);
  border: 1px solid var(--nc-border);
}
.nc-sticky-mobile-thumb img { width: 100%; height: 100%; object-fit: contain; display: block; }
.nc-sticky-mobile-info { flex: 1; display: flex; flex-direction: column; gap: 0.125rem; min-width: 0; }
/* Pisownia (Sentence case zamiast ALL CAPS, z wyjątkami np. "LED") ustawiana
  w JS na treści węzła — ncTitleCase/applyTitleCase w nc-product.js (nie
  text-transform w CSS, nie umiałoby wyjątków). */
.nc-sticky-mobile-name { font-size: 11px; font-weight: 700; color: var(--nc-muted-fg); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nc-sticky-mobile-price-row { display: flex; align-items: baseline; gap: 0.375rem; }
.nc-sticky-mobile-price { font-size: 15px; font-weight: 700; color: var(--nc-fg); }
.nc-sticky-mobile-price-old { font-size: 11px; font-weight: 400; color: var(--nc-muted-fg); text-decoration: line-through; }
.nc-sticky-mobile-cta {
  flex-shrink: 0;
  padding-inline: 12px;
  height: 4rem;
  font-size: 12px;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: .03em !important;
}

/* Desktop sticky — wsuwana od dołu belka "Dodaj do koszyka" (Lovable:
  DesktopStickyBar.tsx), pojawia się gdy .nc-add-to-cart-row w prawej
  kolumnie wychodzi z viewportu (patrz initStickyBars w nc-product.js).
  Widoczność sterowana WYŁĄCZNIE klasą .is-visible (transform+opacity),
  nie atrybutem [hidden] — [hidden] daje display:none, co uniemożliwiłoby
  animację (nie da się animować przejścia OD display:none). Domyślny stan
  (poza ekranem, translateY(100%)) i tak jest niewidoczny bez potrzeby
  dodatkowego display:none; pointer-events:none na tym etapie zabezpiecza
  przed przypadkowym fokusem/klikiem w element leżący poza viewportem. */
.nc-sticky-desktop {
  position: fixed;
  bottom: 0;
  left: 0;
  right: 0;
  z-index: 100;
  background: #FFFFFF;
  border-top: 1px solid #E5E7EB;
  box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.05);
  transform: translateY(100%);
  opacity: 0;
  pointer-events: none;
  transition: transform .25s ease, opacity .25s ease;
}
.nc-sticky-desktop.is-visible {
  transform: translateY(0);
  opacity: 1;
  pointer-events: auto;
}
@media (max-width: 1023px) { .nc-sticky-desktop { display: none !important; } }

.nc-sticky-desktop-inner {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 1.25rem;
  /* Więcej przestrzeni niż poprzednio (0.875rem) — pasek ma "oddychać",
    nie sprawiać wrażenia ściśniętego. */
  padding-block: 1.125rem;
  padding-inline: 42px;
}

.nc-sticky-desktop-thumb {
  flex-shrink: 0;
  width: 64px;
  height: 64px;
  border-radius: 8px;
  overflow: hidden;
  border: 1px solid #E5E7EB;
}
.nc-sticky-desktop-thumb img { width: 100%; height: 100%; object-fit: contain; display: block; }

/* Tytuł + podtytuł (wariant/materiał + punkty światła) — hierarchia
  ciemny/pogrubiony vs stonowany szary, jak w reszcie buy-boxa. */
.nc-sticky-desktop-info {
  display: flex;
  flex-direction: column;
  gap: 2px;
  flex: 1;
  min-width: 0;
}
.nc-sticky-desktop-name {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-size: 13px !important;
  font-weight: 700 !important;
  line-height: 19.5px !important;
  letter-spacing: -0.1px !important;
  color: #1F1F1F !important;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.nc-sticky-desktop-subtitle {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-size: 11px !important;
  font-weight: 400 !important;
  line-height: 16.5px !important;
  letter-spacing: -0.1px !important;
  color: #616161 !important;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Cena — aktualna pogrubiona/duża, stara przekreślona obok, "cena
  regularna" jako mały dopisek pod spodem. */
.nc-sticky-desktop-price-wrap {
  display: flex;
  align-items: baseline;
  gap: 8px;
  flex-shrink: 0;
  white-space: nowrap;
}
.nc-sticky-desktop-price-row {
  display: flex;
  align-items: baseline;
  gap: 8px;
}
.nc-sticky-desktop-price {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-size: 20px !important;
  font-weight: 700 !important;
  line-height: 30px !important;
  letter-spacing: -0.1px !important;
  color: #000000 !important;
}
.nc-sticky-desktop-price-old {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-size: 13px !important;
  font-weight: 400 !important;
  line-height: 19.5px !important;
  letter-spacing: -0.1px !important;
  color: #616161 !important;
  text-decoration: line-through;
}
.nc-sticky-desktop-price-label {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-size: 10px !important;
  font-weight: 500 !important;
  line-height: 15.8px !important;
  letter-spacing: -0.1px !important;
  color: #616161 !important;
}

.nc-sticky-desktop-actions { display: flex; align-items: center; gap: 0.75rem; flex-shrink: 0; }

/* Wishlist — kwadratowy przycisk-obrys obok CTA, ten sam wzorzec co
  .nc-tertiary-btn w głównym buy-boxie (serce, .is-wished wypełnia je
  kolorem marki) — patrz initWishlist w nc-product.js, wspólny stan
  [data-nc-wishlist] między tym przyciskiem a głównym. */
.nc-sticky-desktop-wishlist {
  flex-shrink: 0;
  width: 44px;
  height: 44px;
  display: grid;
  place-items: center;
  border: 1px solid #E5E7EB;
  border-radius: 8px;
  background: transparent;
  color: var(--nc-muted-fg);
  cursor: pointer;
  transition: color .15s, border-color .15s, background .15s;
}
@media (hover: hover) and (pointer: fine) {
.nc-sticky-desktop-wishlist:hover { color: var(--nc-primary); border-color: hsl(0 0% 60%); }
}

.nc-sticky-desktop-wishlist .nc-heart-icon { fill: none !important; }
.nc-sticky-desktop-wishlist.is-wished { color: var(--nc-primary); }
.nc-sticky-desktop-wishlist.is-wished .nc-heart-icon { fill: var(--nc-primary) !important; }

#nc-sticky-desktop-cta {
  flex: 0 0 auto;
  padding: 12px 24px;
}
#nc-sticky-desktop-cta {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-size: 15px !important;
  font-weight: 600 !important;
  line-height: 22.5px !important;
  letter-spacing: -0.1px !important;
  color: #FFFFFF !important;
}

/* ─────────────────────────────────────────────
  BULBS DRAWER — szuflada doboru żarówek
  ───────────────────────────────────────────── */
.nc-drawer-backdrop {
  position: fixed;
  inset: 0;
  z-index: 200;
  background: hsl(0 0% 12% / .4);
  cursor: pointer;
}
.nc-drawer-backdrop[hidden] { display: none; }

.nc-bulbs-drawer {
  position: fixed;
  inset: 0;
  z-index: 201;
  background: var(--nc-card);
  display: flex;
  flex-direction: column;
  overflow: hidden;
}
.nc-bulbs-drawer[hidden] { display: none; }
@media (min-width: 1024px) {
  .nc-bulbs-drawer {
    left: auto;
    width: 460px;
    border-left: 1px solid var(--nc-border);
    box-shadow: -4px 0 40px hsl(0 0% 0% / .12);
  }
}

/* Slide-in animacja */
@media (prefers-reduced-motion: no-preference) {
  .nc-bulbs-drawer { transform: translateX(100%); transition: transform .3s cubic-bezier(.4,0,.2,1); }
  .nc-bulbs-drawer.is-open { transform: translateX(0); }
  @media (max-width: 1023px) {
    .nc-bulbs-drawer { transform: translateX(0) translateY(100%); }
    .nc-bulbs-drawer.is-open { transform: translateX(0) translateY(0); }
  }
}

.nc-bulbs-drawer-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.75rem;
  padding-inline: 1rem;
  height: 3.5rem;
  border-bottom: 1px solid var(--nc-border);
  flex-shrink: 0;
}
@media (min-width: 640px) { .nc-bulbs-drawer-header { padding-inline: 1.25rem; } }

.nc-bulbs-drawer-title-row { display: flex; align-items: center; gap: 0.625rem; min-width: 0; }
.nc-bulbs-drawer-icon { flex-shrink: 0; color: var(--nc-primary); fill: none !important; stroke: currentColor !important; }
.nc-bulbs-drawer-title { font-size: 15px; font-weight: 700; color: var(--nc-fg); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin: 0; }
@media (min-width: 640px) { .nc-bulbs-drawer-title { font-size: 16px; } }

.nc-bulbs-drawer-close {
  width: 2.5rem;
  height: 2.5rem;
  display: grid;
  place-items: center;
  border-radius: var(--nc-radius);
  border: none;
  background: transparent;
  color: hsl(0 0% 40%);
  cursor: pointer;
  flex-shrink: 0;
  transition: background .12s, color .12s;
}
@media (hover: hover) and (pointer: fine) {
.nc-bulbs-drawer-close:hover { background: var(--nc-secondary); color: var(--nc-fg); }
}


/* Filtry barwy */
.nc-bulbs-drawer-filters {
  padding: 0.75rem 1rem;
  border-bottom: 1px solid var(--nc-border);
  background: hsl(36 30% 97%);
  flex-shrink: 0;
}
@media (min-width: 640px) { .nc-bulbs-drawer-filters { padding: 0.75rem 1.25rem; } }

.nc-bulbs-drawer-compat {
  font-size: 12.5px;
  color: hsl(0 0% 25%);
  margin: 0 0 0.625rem;
  line-height: 1.5;
}
.nc-bulbs-drawer-compat strong { color: var(--nc-fg); }

.nc-bulbs-filter-label {
  display: block;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--nc-muted-fg);
  margin: 0 0 0.5rem;
}

.nc-bulbs-temp-tabs {
  display: inline-flex;
  flex-wrap: wrap;
  align-items: stretch;
  gap: 0.5rem;
  padding: 0;
  border-radius: 0;
  background: transparent;
  border: none;
}

.nc-temp-tab {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  text-align: left;
  padding: 0.625rem 0.75rem 0.875rem;
  border-radius: var(--nc-radius);
  border: 1px solid var(--nc-border);
  background: var(--nc-card);
  overflow: hidden;
  cursor: pointer;
  transition: background .12s, border-color .12s;
  font-family: inherit;
}
@media (hover: hover) and (pointer: fine) {
.nc-temp-tab:hover { background: hsl(36 30% 96%); border-color: hsl(0 0% 65%); }
}

.nc-temp-tab[aria-selected="true"] { background: var(--nc-secondary); border-color: hsl(0 0% 55%); }

.nc-temp-tab-name { font-size: 13px; font-weight: 700; color: var(--nc-fg); line-height: 1.3; }
.nc-temp-tab-desc { font-size: 11px; color: var(--nc-muted-fg); line-height: 1.3; margin-top: 1px; }

.nc-temp-tab-bar {
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 3px;
  border-radius: 0;
  opacity: 1;
  transition: opacity .15s;
}
.nc-temp-bar--neutral { background: hsl(0 0% 22%); }
.nc-temp-bar--warm { background: hsl(32 95% 55%); }
.nc-temp-bar--cold { background: hsl(210 80% 60%); }

/* Lista żarówek — WYCOFANE ograniczenie max-height "ok. 4,5 wiersza"
  (próbowane w dwóch wariantach, 45rem i 32rem) — stopka szuflady ma
  `margin-top: auto !important` (patrz #bulb-sidebar-wrapper
  .nc-bulbs-drawer-footer w FIXUPS v16 niżej), więc i tak zawsze przykleja
  się do samego dołu szuflady, NIEZALEŻNIE od wysokości listy. Skoro lista
  z max-height przestawała wypełniać flex:1, między jej skróconym dołem a
  przyklejoną do dołu stopką powstawała pusta, nieuzasadniona przerwa
  (zgłoszone jako "za duży margines" + zbędny dodatkowy scroll) — zamiast
  spójnego, przewidywalnego wyglądu. Lista z powrotem wypełnia całą
  dostępną wysokość (flex:1); jeśli żarówek jest dużo, przewija się
  WEWNĄTRZ siebie (overflow-y:auto), ale bez sztucznego obcinania na
  z góry ustaloną liczbę wierszy. */
.nc-bulbs-list {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  overscroll-behavior: contain;
  touch-action: pan-y;
  padding: 0.75rem;
  display: flex;
  flex-direction: column;
  gap: 0.625rem;
}
@media (min-width: 640px) { .nc-bulbs-list { padding: 0.75rem 1rem; } }

/* Kafelek żarówki */
/* height: var(--nc-bulb-row-h) — ustawiane w JS (bulb-drawer-rows.js) tak,
  żeby dokładnie ok. 4,5 wiersza wypełniało dostępną (zmienną, zależną od
  wysokości ekranu) wysokość .nc-bulbs-list, bez pustej przerwy przed
  stopką szuflady (patrz komentarz w bulb-drawer-rows.js — poprzednia
  próba, stały max-height na samej liście, dawała dokładnie taką przerwę).
  display:flex na tym elemencie (razem z .nc-bulb-row-main{flex:1} niżej)
  pozwala treści wiersza ROZCIĄGNĄĆ SIĘ, gdy wymuszona wysokość jest
  większa niż naturalna (wysoki ekran) — przycisk "Szczegóły" i tak
  zostaje przy dolnej krawędzi wiersza. */
.nc-bulb-row {
  border-radius: var(--nc-radius);
  border: 1px solid var(--nc-border);
  background: var(--nc-card);
  overflow: hidden;
  flex-shrink: 0;
  height: var(--nc-bulb-row-h, auto);
  display: flex;
  flex-direction: column;
  transition: border-color .15s;
}
/* Rozwinięte "Szczegóły" muszą móc wyjść poza wymuszoną wysokość wiersza —
  inaczej treść panelu byłaby przycięta przez overflow:hidden wyżej.
  Selektor celowo NIE sprawdza atrybutu [hidden] na samym panelu — stary
  moduł bulbselection (#bulb-sidebar-wrapper, bulb-sidebar.js) przełącza
  widoczność panelu inline stylem (style="display:none" / usunięty inline
  style), NIGDY atrybutem hidden. ":not([hidden])" było więc PRAWDZIWE dla
  KAŻDEGO wiersza przez cały czas (nie ma czego negować), przez co ta
  reguła nadpisywała height/overflow bezwarunkowo, na wszystkich wierszach,
  niezależnie od stanu — JS-owa wysokość wiersza (--nc-bulb-row-h,
  bulb-drawer-rows.js) nigdy realnie nie obowiązywała (potwierdzone w
  DevTools: reguła zawsze wygrywała, przekreślając height/overflow bazowej
  .nc-bulb-row). aria-expanded na przycisku "Szczegóły" jest natomiast
  niezawodne w OBU wariantach (na nim opiera się już działająca rotacja
  chevronu wyżej w tym pliku), więc to jego używamy zamiast stanu panelu. */
.nc-bulb-row:has(.nc-bulb-details-toggle[aria-expanded="true"]) {
  height: auto;
  overflow: visible;
}
@media (hover: hover) and (pointer: fine) {
.nc-bulb-row:hover { border-color: hsl(0 0% 60%); }
}

/* --nc-bulb-scale — jak bardzo wiersz jest wyższy niż jego naturalna
  wysokość (105px na tej — new-card — wielkości kafelków; kompaktowa
  wersja starej karty ma własny, mniejszy baseline, patrz override w
  "#bulb-sidebar-wrapper .nc-bulb-row" w sekcji FIXUPS v16). Zamiast
  zostawiać wymuszoną wysokość jako pustą przerwę przed stopką (dawne
  .nc-bulb-row-footer{margin-top:auto} pochłaniało tę różnicę samo, robiąc
  duży odstęp — zgłoszone jako "ten margin") tą różnicą "płacimy" za
  powiększenie treści wiersza: zdjęcia, ceny, przycisku "Dobierz" itd.
  (patrz calc(...* var(--nc-bulb-scale)) przy tych elementach niżej i w
  sekcjach FIXUPS v16/v20). Mnożnik *0.9 i przedział 0,9–1,5 (zamiast
  pierwotnego 1–1,8) — na wyraźne życzenie, żeby całość (zdjęcie, cena,
  przycisk) była delikatnie mniejsza niż w pierwszej wersji, zarówno przy
  naturalnej wysokości wiersza (0,9×), jak i przy maksymalnym powiększeniu
  na bardzo wysokich ekranach (1,5× zamiast 1,8×). */
.nc-bulb-row {
  --nc-bulb-scale: clamp(0.9, calc(var(--nc-bulb-row-h, 105px) / 105px * 0.9), 1.5);
}


.nc-bulb-row-main {
  display: flex;
  align-items: stretch;
  flex: 1;
  min-height: 0;
  gap: 0.75rem;
  padding: 0.625rem;
}

.nc-bulb-row-img {
  flex-shrink: 0;
  width: calc(5rem * var(--nc-bulb-scale, 1));
  height: calc(5rem * var(--nc-bulb-scale, 1));
  border-radius: var(--nc-radius);
  background: var(--nc-product-bg);
  overflow: hidden;
  display: grid;
  place-items: center;
  padding: 0.5rem;
}
/* Bez paddingu tutaj — squareCropImage (nc-product.js, initBulbSidebarImageAutocrop)
  wykrywa realny bounding-box żarówki na canvasie i sam dopełnia wynik do
  kwadratu równym marginesem ze wszystkich stron. Zwykły, symetryczny CSS
  padding tego nie potrafi: zdjęcie samo w sobie ma żarówkę przesuniętą
  względem środka kadru (widać to na przycięciach producenta), więc nawet
  równe odstępy pudełka wokół obrazka i tak dają nierówny odstęp od
  faktycznej treści — potwierdzone zrzutem z podświetloną (czerwoną)
  ramką pokazującym więcej miejsca u góry niż na dole mimo padding:0.5rem.
  Tło samego <img> zostaje białe (fillColor przekazywany do squareCropImage,
  patrz initBulbSidebarImageAutocrop) — to .nc-bulb-row-img (kafelek) ma
  beżowe tło, nie treść samego zdjęcia po docięciu. */
.nc-bulb-row-img img { width: 100%; height: 100%; object-fit: contain; display: block; background: #fff; }

.nc-bulb-row-body { flex: 1; min-width: 0; display: flex; flex-direction: column; }
/* Dzieci treści wiersza nie mogą się zapadać przy ciasnej wysokości wiersza
  (--nc-bulb-row-h). h3 z line-clamp ma overflow:hidden, więc jego min-height
  w flexboksie wynosi 0 i przy za małym wierszu znikał cały tytuł, podczas gdy
  meta/stopka (min-height:auto) zostawały na miejscu. */
.nc-bulb-row-body > * { flex-shrink: 0; }

.nc-bulb-value-badge {
  align-self: flex-start;
  font-size: 9.5px;
  font-weight: 700;
  letter-spacing: .04em;
  padding: 2px 6px;
  border-radius: 3px;
  margin-bottom: 0.25rem;
}
.nc-bulb-value-badge--recommended { background: hsl(142 60% 35% / .12); color: hsl(142 60% 28%); }
.nc-bulb-value-badge--value { background: hsl(210 80% 50% / .1);  color: hsl(210 80% 35%); }
.nc-bulb-value-badge--premium { background: hsl(45 90% 55% / .15);  color: hsl(38 70% 30%); }

.nc-bulb-row-name {
  font-size: calc(13px * var(--nc-bulb-scale, 1));
  font-weight: 600;
  color: var(--nc-fg);
  line-height: 1.3;
  margin-top: 0;
  display: block;
  /* Pisownia (pierwsza litera duża, reszta mała, z wyjątkami np. "LED")
    ustawiana teraz w JS na treści węzła — ncTitleCase w nc-product.js,
    wołane przy budowie wiersza w BulbsDrawer.buildRow — nie przez
    text-transform w CSS (nie umiałoby wyjątków, patrz komentarz w JS). */
}

.nc-bulb-row-meta { margin-top: 0.25rem; display: flex; align-items: center; gap: 0.375rem; font-size: calc(11px * var(--nc-bulb-scale, 1)); color: var(--nc-muted-fg); }
.nc-bulb-row-meta-dot { width: 4px; height: 4px; border-radius: 50%; background: var(--nc-border); display: inline-block; }

.nc-bulb-row-footer {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 0.5rem;
  padding-top: 0.375rem;
  margin-top: auto;
}

.nc-bulb-row-price-wrap {}
.nc-bulb-row-price-label { font-size: 10px; color: var(--nc-muted-fg); }
.nc-bulb-row-price { font-size: calc(15px * var(--nc-bulb-scale, 1)); font-weight: 800; color: var(--nc-primary); line-height: 1.1; }
.nc-bulb-row-price-unit { font-size: calc(11px * var(--nc-bulb-scale, 1)); font-weight: 400; color: var(--nc-muted-fg); }

.nc-bulb-badge {
  align-self: flex-start;
  display: inline-block;
  font-size: 10px;
  font-weight: 700;
  line-height: 1.4;
  padding: 0.2rem 0.5rem;
  border-radius: 3px;
  margin-bottom: 0.25rem;
  border: 1px solid transparent;
}
.nc-bulb-badge--polecane { background: hsl(4 90% 96%);   color: hsl(4 70% 42%);   border-color: hsl(4 70% 85%); }
.nc-bulb-badge--popularne { background: hsl(4 90% 96%);   color: hsl(4 70% 42%);   border-color: hsl(4 70% 85%); }
.nc-bulb-badge--dobra-cena { background: hsl(142 55% 95%); color: hsl(142 60% 28%); border-color: hsl(142 45% 80%); }
.nc-bulb-badge--cena-jakość { background: hsl(142 55% 95%); color: hsl(142 60% 28%); border-color: hsl(142 45% 80%); }
.nc-bulb-badge--premium { background: hsl(38 55% 93%);  color: hsl(30 45% 32%);  border-color: hsl(38 45% 78%); }

.nc-bulb-add-btn {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  height: calc(2.25rem * var(--nc-bulb-scale, 1));
  padding-inline: calc(0.75rem * var(--nc-bulb-scale, 1));
  border-radius: var(--nc-radius);
  border: none;
  font-size: calc(12px * var(--nc-bulb-scale, 1));
  font-weight: 600;
  cursor: pointer;
  background: var(--nc-primary);
  color: var(--nc-primary-fg);
  transition: background .15s;
  font-family: inherit;
}
@media (hover: hover) and (pointer: fine) {
.nc-bulb-add-btn:hover { background: var(--nc-primary-hover); }
}

.nc-bulb-add-btn.is-added { background: hsl(142 60% 35%); }

/* Szczegóły — rozwijane */
.nc-bulb-details-toggle {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 0.5rem;
  padding: 0.5rem 0.625rem;
  border-top: 1px solid var(--nc-border);
  border: none;
  border-top: 1px solid var(--nc-border);
  background: transparent;
  font-size: 12px;
  font-weight: 600;
  color: hsl(0 0% 35%);
  cursor: pointer;
  text-align: left;
  font-family: inherit;
  transition: background .12s;
}
@media (hover: hover) and (pointer: fine) {
.nc-bulb-details-toggle:hover { background: var(--nc-secondary); }
}

.nc-bulb-details-toggle[aria-expanded="true"] .nc-chevron { transform: rotate(180deg); }

.nc-bulb-details-panel {
  padding: 0.75rem;
  border-top: 1px solid var(--nc-border);
  background: hsl(36 30% 97%);
}
.nc-bulb-details-panel[hidden] { display: none; }

.nc-bulb-specs-dl {
  display: grid;
  grid-template-columns: auto 1fr;
  gap: 0.25rem 0.75rem;
  font-size: 12px;
  margin: 0 0 0.75rem;
}
.nc-bulb-specs-dt { color: var(--nc-muted-fg); }
.nc-bulb-specs-dd { font-weight: 600; color: var(--nc-fg); text-align: right; margin: 0; }

/* Skala barwy */
.nc-bulb-scale-wrap { margin-bottom: 0.75rem; }
.nc-bulb-scale-label { font-size: 11px; color: var(--nc-muted-fg); margin-bottom: 0.25rem; }
.nc-bulb-scale-track {
  position: relative;
  height: 10px;
  border-radius: 999px;
}
.nc-bulb-scale-track--kelvin {
  background: linear-gradient(to right, #FFA94D 0%, #FFE9B0 40%, #FFFEF5 55%, #DCEEFF 75%, #6FA8DC 100%);
}
.nc-bulb-scale-track--lumens { background: var(--nc-border); opacity: .6; }

.nc-bulb-scale-marker {
  position: absolute;
  top: -2px;
  width: 2px;
  height: 14px;
  background: var(--nc-fg);
  border-radius: 999px;
  transform: translateX(-50%);
}
.nc-bulb-scale-value {
  margin-top: 0.5rem;
  display: flex;
  justify-content: center;
}
.nc-bulb-scale-chip {
  display: inline-flex;
  align-items: center;
  padding: 0.25rem 0.625rem;
  border-radius: var(--nc-radius);
  border: 1px solid var(--nc-border);
  background: var(--nc-card);
  font-size: 11px;
  font-weight: 700;
  color: var(--nc-fg);
}

/* Footer szuflady */
.nc-bulbs-drawer-footer {
  padding: 0.75rem 1rem;
  border-top: 1px solid var(--nc-border);
  background: hsl(36 30% 97%);
  font-size: 12px;
  color: hsl(0 0% 35%);
  display: flex;
  align-items: center;
  gap: 0.5rem;
  flex-shrink: 0;
}
.nc-bulbs-drawer-footer svg { flex-shrink: 0; color: var(--nc-primary); fill: none !important;}
.nc-bulbs-drawer-footer strong { color: var(--nc-fg); font-weight: 700; }

/* Wskazówka — po ostatniej żarówce */
.nc-bulbs-hint {
  display: flex;
  align-items: flex-start;
  gap: 0.5rem;
  flex-shrink: 0;
  margin: 0.25rem 0 0;
  padding: 0.75rem 0;
  border-radius: var(--nc-radius);
  font-size: 11px;
  line-height: 1.5;
}
.nc-bulbs-hint svg { flex-shrink: 0; margin-top: 1px; color: var(--nc-muted-fg); }
.nc-bulbs-hint strong { color: var(--nc-fg); font-weight: 600; }

/* ─────────────────────────────────────────────
  DODATKOWE ELEMENTY — hooki i moduły
  ───────────────────────────────────────────── */

/* Seigi cross-sell w buy-boxie */
#nc-product-page .nc-purchase > div:empty { display: none; }

/* Extra left / załączniki */
.nc-extra-left { margin-top: 0.5rem; padding-top: 0.75rem; border-top: 1px solid var(--nc-border); }
.nc-attachments { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 0.375rem; }
.nc-attachments li a {
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  font-size: 13px;
  font-weight: 500;
  color: var(--nc-primary);
  text-decoration: none;
}
@media (hover: hover) and (pointer: fine) {
.nc-attachments li a:hover { text-decoration: underline; }
}

.nc-attachments li p { font-size: 12px; color: var(--nc-muted-fg); margin: 0.125rem 0 0 1.375rem; }

/* Zakładka pliki do pobrania */
.nc-attachments-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  flex-direction: column;
  gap: 0.75rem;
}
.nc-attachments-list li { display: flex; flex-direction: column; }
.nc-attachments-list a {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  font-size: 14px;
  font-weight: 600;
  color: var(--nc-primary);
  text-decoration: none;
}
@media (hover: hover) and (pointer: fine) {
.nc-attachments-list a:hover { text-decoration: underline; }
}

.nc-attachments-list p { font-size: 13px; color: var(--nc-muted-fg); margin: 0.25rem 0 0 1.5rem; }

/* Opis krótki + długi (fallback bez PSE) */
.nc-description-short {
  margin-bottom: 1.5rem;
  padding: 1.5rem;
  border: 1px dashed var(--nc-border);
  border-radius: var(--nc-radius);
  font-size: 15.5px;
  line-height: 1.55;
  color: hsl(0 0% 25%);
}
.nc-description-short strong,
.nc-description-short b {
  font-weight: 600;
  color: var(--nc-fg);
}
.nc-description-short ul {
  list-style: disc;
  padding-left: 1.25rem;
  margin: 0;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}
.nc-description-short li {
  padding-left: 0.25rem;
}

/* Product actions hook */
.nc-product-actions { margin-bottom: 1.5rem; }

/* PayU raty — ukryj sekcję gdy pusta */
#zakupy-na-raty.is-empty { display: none; }

/* ─────────────────────────────────────────────
  FIXUPS — integracja z modułami PS
  ───────────────────────────────────────────── */

/* Revws — gwiazdki inline i małe */
#nc-product-page .revws-product-custom-placement {
  display: inline-flex !important;
  align-items: center !important;
  gap: 0.5rem !important;
  font-size: 14px !important;
}
#nc-product-page .revws-product-custom-placement b { font-weight: 600 !important; }
#nc-product-page .revws-product-custom-placement-link {
  display: inline-flex !important;
  align-items: center !important;
  gap: 0.375rem !important;
  text-decoration: none !important;
  color: var(--nc-fg) !important;
}
#nc-product-page .revws-grading-product {
  display: inline-flex !important;
  align-items: center !important;
}
#nc-product-page .revws-grade-wrap {
  display: inline-flex !important;
  width: 16px !important;
  height: 16px !important;
  flex-shrink: 0 !important;
}
#nc-product-page svg.revws-grade {
  width: 16px !important;
  height: 16px !important;
  fill: hsl(38 95% 52%) !important;
}
#nc-product-page svg.revws-grade-off { fill: hsl(0 0% 85%) !important; }
#nc-product-page .revws-count-text {
  color: var(--nc-muted-fg) !important;
  font-size: 14px !important;
}

/* Ukryj duplikaty przycisków z HOOK_EXTRA_RIGHT — na damidomo.pl ten sam
  hook (tam: blockwishlist) dublował się z przyciskiem już renderowanym
  przez {hook h="CustomBelowName"}. Na luminadeco.pl $HOOK_EXTRA_RIGHT to
  JEDYNE źródło serca "Dodaj do listy życzeń" (moduł nxtalwishlist, patrz
  komentarz w purchase-panel.tpl) — bez wyjątku :not(:has(...)) ta sama
  reguła chowała je całkowicie, bo moduł owija swój markup dokładnie w te
  same klasy Bootstrapa (.col-xs-12.col-sm-6.col-md-12.col-lg-6, patrz
  themes/modula/modules/nxtalwishlist/views/templates/front/1.6/html.tpl). */
#nc-product-page .nc-tertiary-actions .col-xs-12:not(:has(.nxtal-wishlist-icon)),
#nc-product-page .nc-tertiary-actions .col-sm-6:not(:has(.nxtal-wishlist-icon)),
#nc-product-page .nc-tertiary-actions .col-md-12:not(:has(.nxtal-wishlist-icon)),
#nc-product-page .nc-tertiary-actions .col-lg-6:not(:has(.nxtal-wishlist-icon)) {
  display: none !important;
}

/* nxtalwishlist — wygląd 1:1 z resztą .nc-tertiary-actions (ikona + tekst,
  stonowany szary, bordo na hover/aktywne) zamiast domyślnego,
  zewnętrznego wyglądu modułu. Bootstrapowy wrapper (.col-xs-12 itp.,
  patrz wyjątek :not(:has(...)) wyżej) i .wishlist_icon w środku są tylko
  strukturalne — display:contents "spłaszcza" je, żeby .nxtal-wishlist-icon
  trafił jako bezpośredni flex-item .nc-tertiary-actions, obok "Zapytaj
  o produkt". */
#nc-product-page .nc-tertiary-actions > div:has(.nxtal-wishlist-icon),
#nc-product-page .nc-tertiary-actions .wishlist_icon {
  display: contents;
}
/* #product .nxtal-wishlist-icon w autoload/cv_custom.css (stary wygląd —
  obramowana "kafelkowa" belka) ma wyższą specyficzność niż zwykła klasa
  .nc-tertiary-btn, więc trzeba jawnie zresetować border/background/width/
  padding/letter-spacing, których nasza reguła wcześniej nie nadpisywała. */
#nc-product-page .nc-tertiary-actions .nxtal-wishlist-icon {
  display: inline-flex;
  align-items: center;
  justify-content: flex-start;
  gap: 0.375rem;
  width: auto;
  padding: 0.5rem 0.75rem;
  border: none;
  border-radius: var(--nc-radius);
  background: transparent;
  cursor: pointer;
  font-size: 14px;
  font-weight: 400;
  letter-spacing: normal;
  text-transform: none;
  color: var(--nc-muted-fg);
  transition: color .15s, background .15s;
}
@media (hover: hover) and (pointer: fine) {
  #nc-product-page .nc-tertiary-actions .nxtal-wishlist-icon:hover {
    color: var(--nc-primary);
    border-color: transparent;
  }
}
/* Dwa SVG serca (pełne/puste) są w DOM-ie zawsze naraz — moduł przełącza
  tylko klasę .active na rodzicu, nie podmienia zawartości. */
#nc-product-page .nc-tertiary-actions .nxtal-wishlist-icon svg {
  width: 16px;
  height: 16px;
  min-width: 0;
  margin-right: 0;
  flex-shrink: 0;
  display: none;
}
#nc-product-page .nc-tertiary-actions .nxtal-wishlist-icon .heart-empty { display: block; }
#nc-product-page .nc-tertiary-actions .nxtal-wishlist-icon.active .heart-empty { display: none; }
#nc-product-page .nc-tertiary-actions .nxtal-wishlist-icon.active .heart-filled { display: block; }
#nc-product-page .nc-tertiary-actions .nxtal-wishlist-icon .wishlist-title { white-space: nowrap; }

/* Social proof — usuń nadmiarowe <b> wewnątrz <strong> */
#nc-product-page .nc-social-proof b { font-weight: inherit; }

/* nc-extra-left — ukryj ukryte formularze modułów (send_friend etc.) */
#nc-product-page .nc-extra-left > div[style*="display: none"] { display: none !important; }

/* ─────────────────────────────────────────────
  FIXUPS v2 — dopracowanie wyglądu
  ───────────────────────────────────────────── */

/* Przycisk jako <a> (Dobierz żarówki) — bez podkreślenia */
#nc-product-page a.nc-btn { text-decoration: none !important; }
@media (hover: hover) and (pointer: fine) {
#nc-product-page a.nc-btn:hover { text-decoration: none !important; }
}


/* Etykiety modułu (BLACK FRIDAY itp.) w jednym rzędzie z badge */
#nc-product-page .nc-badges { align-items: center; }
#nc-product-page .cv-product-labels { display: inline-flex; gap: 0.375rem; margin: 0; }
/* Hook displayProductPriceBlock (patrz purchase-panel.tpl) łapie WSZYSTKIE
  podpięte moduły naraz — oprócz etykiet (cv_product_label) także
  gm_omniprice ("Najniższa cena z 30 dni przed promocją") — tę informację
  już pokazujemy osobno, ładniej, w .nc-price-omnibus, więc tu jest tylko
  niechcianym duplikatem. Ukrywamy TYLKO ten jeden moduł, zostawiając
  resztę hooka (etykiety) bez zmian. */
#nc-product-page .nc-badges .gm_omniprice { display: none !important; }
#nc-product-page .cv-product-label {
  display: inline-flex;
  align-items: center;
  white-space: nowrap;
  font-size: 11px !important;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .06em;
  padding: 0.25rem 0.5rem;
  border-radius: 4px;
  line-height: 1;
}

/* Separator pionowy między widgetem oceny a social proof — zawsze widoczny
  (nie tylko desktop), minimalnie ciemniejszy szary niż --nc-border i z
  trochę większym odstępem od obu elementów po bokach. */
#nc-product-page .nc-rating-row .nc-social-proof {
  position: relative;
  padding-left: 0.875rem;
}
/* Brak separatora, gdy nie ma czego oddzielać — widget ocen chowa się
  w JS (initRcReviewsGate, nc-product.js) gdy produkt ma 0 opinii, ale
  ta pionowa kreska sama w sobie nie zależy od CSS [hidden], więc bez
  tej reguły "wisiałaby" osierocona przed social-proof. */
#nc-product-page .nc-rating-row .nc-rc-widget-wrap[hidden] + .nc-social-proof {
  padding-left: 0;
}
#nc-product-page .nc-rating-row .nc-rc-widget-wrap[hidden] + .nc-social-proof::before {
  content: none;
}
#nc-product-page .nc-rating-row .nc-social-proof::before {
  content: "";
  position: absolute;
  left: 0;
  top: 50%;
  transform: translateY(-50%);
  width: 1px;
  height: 1rem;
  background: hsl(30 8% 72%);
}

/* Ikony dostawy — lżejsze, neutralne zamiast bordo */
#nc-product-page .nc-delivery-icon { color: hsl(0 0% 45%) !important; }

/* ─────────────────────────────────────────────
  FIXUPS v3 — breadcrumbs, badge, oceny
  ───────────────────────────────────────────── */

/* Breadcrumbs — bliżej lewej + ciaśniejsze odstępy */
#nc-product-page .nc-breadcrumbs-wrap { padding-inline: 0; }
#nc-product-page .nc-breadcrumbs-wrap .breadcrumb {
  margin: 0;
  padding: 2px 8px 2px 0px;
  background: none;
  display: flex;
  /* flex-wrap: wrap; */
  align-items: center;
  gap: 0.25rem;
  overflow-y: hidden !important;
  scrollbar-width: none;
  /* Poppins Regular 12px/16px, -0.1px tracking, #616161 — patrz FIXUPS
    Font Ninja: trzeba jawnie nadpisać font-family/weight, bo plugin
    wstrzykuje własne. */
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
  font-size: 12px !important;
  line-height: 16px !important;
  letter-spacing: -0.1px !important;
  color: #616161 !important;
}
#nc-product-page .nc-breadcrumbs-wrap .breadcrumb a {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
  color: var(--nc-muted-fg);
  text-decoration: none;
}
@media (hover: hover) and (pointer: fine) {
#nc-product-page .nc-breadcrumbs-wrap .breadcrumb a:hover { color: var(--nc-primary); }
}

#nc-product-page .nc-breadcrumbs-wrap .navigation-pipe {
  margin: 0 0.125rem;
  color: hsl(0 0% 70%);
}
@media (max-width: 767px) {
  #nc-product-page .nc-breadcrumbs-wrap .navigation-pipe {
  margin: 0 0.5rem;
  color: hsl(0 0% 70%);
}
}

/* Mobile — dokładnie jak stara karta (patrz global.css: .breadcrumb tam ma
  po prostu overflow:hidden, ŻADNEGO scrolla dotykowego). Wcześniejsza
  wersja robiła z tego poziomy scroll (żeby nie zajmować miejsca w pionie),
  ale niezależnie od kombinacji overflow/touch-action/overscroll-behavior
  dawało się złapać i przeciągać pionowo — bo to w ogóle jest zbędna
  komplikacja, której stara karta nie ma. Zamiast dalej gonić idealne
  zablokowanie scrolla, wracamy do prostego zawijania (flex-wrap:wrap już
  jest w bazowej regule .breadcrumb wyżej) — nie ma kontenera przewijalnego,
  więc nie ma czego przeciągać, punkt. */

/* Etykiety BLACK FRIDAY / DARMOWA DOSTAWA — większe (szersze + wyższe) */
#nc-product-page .cv-product-label,
#nc-product-page .nc-badge {
  font-size: 13px !important;
  padding: 0.5rem 0.875rem !important;
  border-radius: 6px !important;
  letter-spacing: .04em !important;
}

/* Oceny — usuń słowo "Opinie:" i wyśrodkuj w pionie z social proof */
#nc-product-page .revws-product-custom-placement > b { display: none !important; }
#nc-product-page .nc-rating-row {
  align-items: center !important;
}
#nc-product-page .revws-grading-product,
#nc-product-page .revws-grade-wrap,
#nc-product-page svg.revws-grade {
  vertical-align: middle !important;
}
#nc-product-page .revws-product-custom-placement-link {
  line-height: 1 !important;
}

/* ─────────────────────────────────────────────
  FIXUPS v4 — oceny (poprawny selektor ID)
  revws-product-custom-placement to ID, nie klasa!
  ───────────────────────────────────────────── */
#nc-product-page #revws-product-custom-placement {
  display: inline-flex !important;
  align-items: center !important;
  gap: 0.5rem !important;
  font-size: 14px !important;
}
/* Ukryj słowo "Opinie:" */
#nc-product-page #revws-product-custom-placement > b { display: none !important; }
/* Link z gwiazdkami + licznik — wyrównane w pionie */
#nc-product-page #revws-product-custom-placement .revws-product-custom-placement-link {
  display: inline-flex !important;
  align-items: center !important;
  gap: 0.375rem !important;
}

/* ─────────────────────────────────────────────
  FIXUPS v5 — pionowe wyrównanie oceny (ostateczne)
  ───────────────────────────────────────────── */
#nc-product-page .nc-rating-row {
  display: flex !important;
  flex-direction: row !important;
  align-items: center !important;
  flex-wrap: wrap !important;
  gap: 0.5rem 0.75rem !important;
}
/* Wszystkie wewnętrzne kontenery revws w jednej linii, wyśrodkowane */
#nc-product-page #revws-product-custom-placement,
#nc-product-page #revws-product-custom-placement .revws-product-custom-placement-link,
#nc-product-page #revws-product-custom-placement .revws-grading,
#nc-product-page #revws-product-custom-placement .revws-grading-product {
  display: inline-flex !important;
  align-items: center !important;
  line-height: 1 !important;
}
/* Gwiazdki — wrap i svg dokładnie wyśrodkowane */
#nc-product-page #revws-product-custom-placement .revws-grade-wrap {
  display: inline-flex !important;
  align-items: center !important;
  justify-content: center !important;
}
#nc-product-page #revws-product-custom-placement svg.revws-grade {
  display: block !important;
  vertical-align: middle !important;
}
/* Licznik "(2 opinie)" — wyśrodkowany, bez własnego marginesu */
#nc-product-page #revws-product-custom-placement .revws-count-text {
  display: inline-flex !important;
  align-items: center !important;
  line-height: 1 !important;
  margin: 0 !important;
}
/* Social proof — zwykły inline tekst, NIE flex: .nc-social-proof zawiera
  mieszankę elementu (<strong>) i zwykłego tekstu (" wybrało ten model")
  — w kontenerze inline-flex przeglądarka traktuje ten tekst jako osobny
  anonimowy flex item i przycina jego wiodącą spację na granicy z <strong>,
  przez co "17 klientów" i "wybrało" sklejały się bez odstępu. Zwykły
  inline (jak reszta tekstu w rating-row) nie ma tego problemu, a pionowe
  wyrównanie z gwiazdkami i tak zapewnia line-height wspólny dla całego
  .nc-rating-row. */
#nc-product-page .nc-rating-row .nc-social-proof {
  display: inline !important;
}

/* ─────────────────────────────────────────────
  FIXUPS v6 — wersja użytkownika (poprawiona)
  Reguły 1+2 wg propozycji; reguła 3 zmieniona tak,
  by NIE przywracała ukrytego "Opinie:".
  ───────────────────────────────────────────── */

/* 1. Link z gwiazdkami + tekst */
#nc-product-page .revws-product-custom-placement-link {
  display: inline-flex !important;
  align-items: center !important;
  gap: 0.5rem !important;
}

/* 2. Same gwiazdki */
#nc-product-page .revws-grading-product {
  display: inline-flex !important;
  align-items: center !important;
}

/* 3. Tekst o zakupach trzyma linię — ALE "Opinie:" zostaje ukryte */
#nc-product-page .nc-rating-row span:not(.revws-count-text) {
  /* display: inline-flex !important; */
  align-items: center !important;
}
#nc-product-page #revws-product-custom-placement > b { display: none !important; }

/* Zeruj margin-top z product.css motywu (psuje wyrównanie rzędu ocen) */
#nc-product-page #revws-product-custom-placement { margin-top: 0 !important; }

/* ═══════════════════════════════════════════════
  OPINIE — styl React (revws module override)
  ═══════════════════════════════════════════════ */

/* Ukryj sekcję revws — opinie obsługuje Rating Captain
  TYMCZASOWO WYŁĄCZONE (2026-09) — powrót do natywnych opinii revws w
  miejsce RC, patrz komentarz przy initRevwsMove w nc-product.js oraz
  purchase-panel.tpl/product-tabs.tpl. Reguły restylujące markup revws
  (poniżej w tym pliku, sekcja "OPINIE — styl React") NIE były usuwane
  przy przejściu na RC, więc nie trzeba ich teraz przywracać osobno. */
/* #nc-product-page #revws-section { display: none !important; } */

/* Lista opinii */
/* #nc-product-page .revws-review-list {
  display: flex !important;
  flex-direction: column !important;
  gap: 1rem !important;
} */

/* Karta opinii — jeden wspólny wiersz: gwiazdki + imię + badge + tytuł
  opinii, do lewej (tak jak na starej karcie produktu), treść i akcje
  osobno pod spodem. Moduł revws zagnieżdża tytuł głęboko
  (.revws-review-details > .revws-review-review > .revws-review-box >
  .revws-review-title), więc te trzy pośrednie kontenery są spłaszczone
  przez display:contents — dzięki temu .revws-review-title trafia jako
  bezpośredni flex-item do TEGO SAMEGO wiersza co .revws-review-author
  (też spłaszczony), zamiast lądować jako osobny blok pod spodem.
  (Potwierdzone: to faktyczny markup revws, nie pozostałość po Rating
  Captain — patrz odciski itemprop="review"/schema.org/Review.) */
/* #nc-product-page .revws-review {
  border: 1px solid var(--nc-border) !important;
  border-radius: var(--nc-radius) !important;
  padding: 1.25rem !important;
  background: var(--nc-card) !important;
  display: flex !important;
  flex-direction: row !important;
  flex-wrap: wrap !important;
  align-items: center !important;
  column-gap: 0.5rem !important;
  row-gap: 0.5rem !important;
}
#nc-product-page .revws-review-author,
#nc-product-page .revws-review-details,
#nc-product-page .revws-review-review,
#nc-product-page .revws-review-box {
  display: contents !important;
}
#nc-product-page .revws-review-title {
  order: 4 !important;
  font-size: 14px !important;
  font-weight: 700 !important;
  color: var(--nc-fg) !important;
  margin: 0 !important;
}
#nc-product-page .revws-review-content {
  order: 5 !important;
  flex-basis: 100% !important;
  width: 100% !important;
}
#nc-product-page .revws-actions {
  order: 6 !important;
  flex-basis: 100% !important;
  width: 100% !important;
}
#nc-product-page .revws-review-author-name {
  font-size: 14px !important;
  font-weight: 700 !important;
  color: var(--nc-fg) !important;
  order: 2 !important;
}
#nc-product-page .revws-review .revws-grading {
  order: 1 !important;
  display: inline-flex !important;
}
#nc-product-page .revws-review .revws-grade-wrap {
  padding: 0 1px !important;
}
#nc-product-page .revws-review svg.revws-grade {
  width: 16px !important;
  height: 16px !important;
  fill: hsl(38 95% 52%) !important;
} */

/* Badge "Zweryfikowany zakup" */
#nc-product-page .revws-verified-buyer-badge {
  order: 3 !important;
  font-size: 11px !important;
  font-weight: 600 !important;
  color: hsl(142 60% 30%) !important;
  background: none !important;
  padding: 0 !important;
  display: inline-flex !important;
  align-items: center !important;
  gap: 0.25rem !important;
}
#nc-product-page .revws-verified-buyer-badge::before {
  content: "✓" !important;
  font-weight: 700 !important;
}

/* Treść opinii */
/* #nc-product-page .revws-review-details {
  margin: 0 !important;
  padding: 0 !important;
}
#nc-product-page .revws-review-box {
  background: none !important;
  border: none !important;
  padding: 0 !important;
  margin: 0 !important;
}
#nc-product-page .revws-review-content {
  font-size: 14px !important;
  line-height: 1.7 !important;
  color: hsl(0 0% 20%) !important;
  margin: 0 !important;
  font-style: normal !important;
}
#nc-product-page .revws-review-content::before {
  content: "\201E" !important;
}
#nc-product-page .revws-review-content::after {
  content: "\201D" !important;
} */

/* Akcje: zachowujemy domyślny styl modułu revws */

/* Przycisk "Napisz swoją opinię" */
#nc-product-page #revws-portal-product-reviews .form-group {
  margin-top: 1.5rem !important;
}
#nc-product-page #revws-portal-product-reviews .btn-primary {
  background: var(--nc-primary) !important;
  color: var(--nc-primary-fg) !important;
  border: none !important;
  border-radius: var(--nc-radius) !important;
  padding: 0.75rem 1.5rem !important;
  font-size: 14px !important;
  font-weight: 600 !important;
  font-family: 'Poppins', system-ui, sans-serif !important;
  text-transform: none !important;
  letter-spacing: normal !important;
  cursor: pointer !important;
  transition: background .15s !important;
}
@media (hover: hover) and (pointer: fine) {
#nc-product-page #revws-portal-product-reviews .btn-primary:hover {
  background: var(--nc-primary-hover) !important;
}
}


/* ═══════════════════════════════════════════════
  FIXUPS v8 — spacing, typografia ceny, przyciski
  ═══════════════════════════════════════════════ */

/* 1. SPACING — więcej powietrza między sekcjami */
/* #nc-product-page .nc-purchase { gap: 0.75rem !important; } */
#nc-product-page .nc-product-identity { gap: 1rem !important; }
#nc-product-page .nc-badges { margin-bottom: 0.25rem !important; }
#nc-product-page .nc-price-block { gap: 0.375rem !important; margin-top: 0.25rem !important; }
#nc-product-page #buy_block {
  display: flex !important;
  flex-direction: column !important;
  gap: 1.25rem !important;
  margin: 0 !important;
}
#nc-product-page .nc-delivery { padding-top: 1.5rem !important; margin-top: 0.25rem !important; }

/* 2. CENA — większa, mocniejsza */
#nc-product-page .nc-price-current {
  font-size: 3rem !important;
  font-weight: 800 !important;
  line-height: 1.1 !important;
  color: hsl(0, 0%, 0%) !important;
}
#nc-product-page .nc-price-row { gap: 0.625rem !important; align-items: baseline !important; }
#nc-product-page .nc-price-old {
  font-size: 1rem !important;
  color: hsl(0 0% 60%) !important;
  font-weight: 500 !important;
}
/* "Oszczędzasz" + omnibus — lżejsze, mniejsze */
#nc-product-page .nc-price-saving {
  font-size: 13px !important;
  font-weight: 600 !important;
  color: hsl(142 45% 35%) !important;
  margin: 0 !important;
}
#nc-product-page .nc-price-omnibus {
  font-size: 11px !important;
  color: hsl(0 0% 55%) !important;
  font-weight: 400 !important;
  margin: 0 !important;
}

/* 3. DOBIERZ ŻARÓWKI — minimalny outline */
#nc-product-page .nc-btn--bulbs {
  background: transparent !important;
  border: 1px solid var(--nc-border) !important;
  color: hsl(0 0% 25%) !important;
  font-weight: 600 !important;
  box-shadow: none !important;
}
@media (hover: hover) and (pointer: fine) {
#nc-product-page .nc-btn--bulbs:hover {
  background: hsl(0 0% 98%) !important;
  border-color: hsl(0 0% 60%) !important;
}
}

#nc-product-page .nc-btn--bulbs svg { stroke: currentColor !important; fill: none !important; }

/* 4. ILOŚĆ + KOSZYK — równa wysokość, czyste krawędzie */
#nc-product-page .nc-add-to-cart-row { align-items: stretch !important; }
#nc-product-page .nc-qty {
  height: 3.25rem !important;
  border: 1px solid var(--nc-border) !important;
}
#nc-product-page .nc-btn--add-to-cart {
  height: 3.25rem !important;
  text-shadow: none !important;
  box-shadow: none !important;
  font-weight: 700 !important;
}
#nc-product-page .nc-btn--add-to-cart svg { stroke: currentColor !important; fill: none !important; }
#nc-product-page .nc-qty-btn svg { stroke: currentColor !important; fill: none !important; }

/* 5. AKCJE DOLNE — outline ikony, lżejszy tekst, większy odstęp */
#nc-product-page .nc-tertiary-actions { gap: 1rem !important; padding-top: 0.5rem !important; padding-bottom: 1.75rem !important;}
#nc-product-page .nc-tertiary-btn {
  font-size: 13px !important;
  color: hsl(0 0% 50%) !important;
}
#nc-product-page .nc-tertiary-btn svg { stroke: currentColor !important; fill: none !important; }
#nc-product-page .nc-tertiary-btn.is-wished .nc-heart-icon { fill: var(--nc-primary) !important; }

/* ═══════════════════════════════════════════════
  FIXUPS v9 — dopasowanie 1:1 do projektu React
  (cofa przesadę z v8, ustawia wartości jak w Lovable)
  ═══════════════════════════════════════════════ */

/* SPACING jak React: buy box space-y-5 (1.25rem), cluster space-y-3 (0.75rem) */
/* #nc-product-page .nc-purchase { gap: 1.25rem !important; } */
#nc-product-page .nc-product-identity { gap: 0.75rem !important; }
#nc-product-page #buy_block { gap: 1.25rem !important; }

/* CENA jak React: text-3xl (1.875rem) bold primary */
#nc-product-page .nc-price-current {
  font-size: 1.875rem !important;
  font-weight: 700 !important;
  color: hsl(0, 0%, 0%) !important;
}
#nc-product-page .nc-price-row { gap: 0.75rem !important; }
#nc-product-page .nc-price-old {
  font-size: 1rem !important;
  color: var(--nc-muted-fg) !important;
  font-weight: 400 !important;
}

/* "Oszczędzasz" — ciemnoszary (foreground/75), NIE zielony; pill obok w linii */
#nc-product-page .nc-price-saving {
  display: inline-flex !important;
  align-items: center !important;
  gap: 0.625rem !important;
  flex-wrap: wrap !important;
  font-size: 15px !important;
  font-weight: 600 !important;
  letter-spacing: -.01em !important;
  color: hsl(0 0% 30%) !important;
  margin: 0.25rem 0 0 !important;
}
#nc-product-page .nc-price-saving .nc-stock-urgency { font-weight: 600 !important; }

/* Omnibus jak React: text-xs muted */
#nc-product-page .nc-price-omnibus {
  font-size: 12px !important;
  color: var(--nc-muted-fg) !important;
  margin: 0.375rem 0 0 !important;
}
#nc-product-page .nc-price-omnibus-val { font-weight: 500 !important; color: var(--nc-fg) !important; }

/* KOSZYK — szeroki (flex-1) jak React; stepper stała szerokość */
#nc-product-page .nc-add-to-cart-row { display: flex !important; align-items: stretch !important; }
#nc-product-page .nc-add-to-cart-cta { flex: 1 1 auto !important; display: flex !important; }
#nc-product-page .nc-btn--add-to-cart { flex: 1 1 auto !important; width: 100% !important; }
#nc-product-page .nc-qty { flex: 0 0 auto !important; }

/* ═══════════════════════════════════════════════
  FIXUPS v10 — więcej powietrza + większe przyciski
  (świadomie większe niż React: spacing + wysokości CTA)
  ═══════════════════════════════════════════════ */

/* 1. SPACING — więcej oddechu między sekcjami */
#nc-product-page .nc-purchase { gap: 0rem !important; }
#nc-product-page .nc-product-identity { gap: 1rem !important; }
#nc-product-page #buy_block { gap: 1rem !important; }
#nc-product-page .nc-delivery { padding-top: 1.75rem !important; }
#nc-product-page .nc-badges { margin-bottom: 0.25rem !important; }

/* 2. CENA — wyraźnie większa */
#nc-product-page .nc-price-current {
  font-size: 2.15rem !important;
  font-weight: 700 !important;
  line-height: 1.05 !important;
  color: hsl(0, 0%, 0%) !important;
}
#nc-product-page .nc-price-old { font-size: 1.6rem !important; }

/* 3. DOBIERZ ŻARÓWKI — wyższy (52px), minimal outline */
#nc-product-page .nc-btn--bulbs {
  height: 3.25rem !important;
  background: transparent !important;
  border: 1px solid var(--nc-border) !important;
  color: hsl(0 0% 22%) !important;
  font-weight: 600 !important;
  box-shadow: none !important;
}
@media (hover: hover) and (pointer: fine) {
#nc-product-page .nc-btn--bulbs:hover { background: hsl(0 0% 98%) !important; border-color: hsl(0 0% 55%) !important; }
}


/* 4. ILOŚĆ + KOSZYK — duże i równe (52px) */
#nc-product-page .nc-qty,
#nc-product-page .nc-btn--add-to-cart,
#nc-product-page .nc-add-to-cart-cta {
  height: 3.25rem !important;
  min-height: 3.25rem !important;
}
#nc-product-page .nc-btn--add-to-cart {
  font-size: 14px !important;
  font-weight: 700 !important;
  text-shadow: none !important;
  box-shadow: none !important;
}

/* 5. AKCJE DOLNE — większy odstęp, lżejszy tekst (outline ikony już ustawione) */
#nc-product-page .nc-tertiary-actions { gap: 1.25rem !important; padding-top: 0.5rem !important; }
#nc-product-page .nc-tertiary-btn { font-size: 13px !important; color: hsl(0 0% 50%) !important; }

/* ═══════════════════════════════════════════════
  FIXUPS v11 — dokładnie wg React (h-11 vs h-[52px])
  ═══════════════════════════════════════════════ */

/* DOBIERZ ŻARÓWKI — React h-11 (44px), bg-secondary/50, border 1.5px */
#nc-product-page .nc-btn--bulbs {
  height: 4.5rem !important;
  min-height: 2.75rem !important;
  background: hsl(36 30% 97%) !important;
  border: 1.5px solid hsl(0 0% 38% / .25) !important;
  color: var(--nc-fg) !important;
  font-weight: 600 !important;
  font-size: 14px !important;
  box-shadow: none !important;
}
@media (hover: hover) and (pointer: fine) {
#nc-product-page .nc-btn--bulbs:hover { background: hsl(36 30% 92%) !important; }
}


/* ILOŚĆ + KOSZYK — React h-[52px] (3.25rem), większe niż żarówki */
#nc-product-page .nc-qty,
#nc-product-page .nc-btn--add-to-cart,
#nc-product-page .nc-add-to-cart-cta {
  height: 5.25rem !important;
  min-height: 3.25rem !important;
}
/* Mobile: React h-12 (48px) */
@media (max-width: 639px) {
  #nc-product-page .nc-qty,
  #nc-product-page .nc-btn--add-to-cart,
  #nc-product-page .nc-add-to-cart-cta {
    height: 4rem !important;
    min-height: 3rem !important;
  }
}

/* KOSZYK — React: font-bold, shadow-sm (subtelny cień ZOSTAJE), bez text-shadow */
#nc-product-page .nc-btn--add-to-cart {
  font-size: 14px !important;
  font-weight: 700 !important;
  letter-spacing: .03em !important;
  gap: 10px !important;
  box-shadow: 0 1px 2px hsl(0 0% 0% / .08) !important;
  text-shadow: none !important;
}

/* Stepper — delikatnie szerszy (kosztem koszyka) */
#nc-product-page .nc-qty { width: 12rem !important; }
@media (max-width: 639px) { #nc-product-page .nc-qty { width: 9rem !important; } }
#nc-product-page .nc-qty-btn { width: 4rem !important; }
@media (max-width: 639px) { #nc-product-page .nc-qty-btn { width: 2.75rem !important; } }

/* ═══════════════════════════════════════════════
  FIXUPS v13 — badge "Ostatnie sztuki" wg React
  jasny żółty #FFD054, ciemny tekst, bez ramki, rounded-md
  ═══════════════════════════════════════════════ */
#nc-product-page .nc-stock-urgency {
  background: rgb(255 208 84) !important;
  color: rgb(31 31 31) !important;
  border: none !important;
  border-radius: 6px !important;
  padding: 0.25rem 0.5rem !important;
  font-size: 11px !important;
  font-weight: 600 !important;
  letter-spacing: .03em !important;
  line-height: 1 !important;
}
#nc-product-page .nc-stock-urgency svg { width: 12px !important; height: 12px !important; stroke: currentColor !important; fill: none !important; }

/* ═══════════════════════════════════════════════
  FIXUPS v14 — sekcja "Dostawa i zwroty"
  ═══════════════════════════════════════════════ */

/* Wiersze — więcej powietrza, wyśrodkowane w pionie */
#nc-product-page .nc-delivery-rows { gap: 0.25rem !important; }
#nc-product-page .nc-delivery-row {
  align-items: center !important;
  gap: 0.5rem !important;
  padding: 0.625rem 0.5rem !important;
}

/* Ikony — outline, bordo (brand) */
#nc-product-page .nc-delivery-icon {
  color: #000000 !important;
  stroke: #000000 !important;
  fill: none !important;
  flex-shrink: 0 !important;
}

/* Tekst — jaśniejszy szary; NIE rozpycha się (chevron tuż obok) */
#nc-product-page .nc-delivery-row-text {
  flex: 0 1 auto !important;
  color: hsl(0 0% 40%) !important;
  font-size: 13px !important;
}
#nc-product-page .nc-delivery-row-muted { color: hsl(0 0% 45%) !important; }

/* Pierwszy wiersz — data, ciemna */
#nc-product-page .nc-delivery-row-val {
  font-weight: 600 !important;
  color: hsl(0 0% 12%) !important;
}

/* Chevron — INLINE tuż po tekście, mały szary */
#nc-product-page .nc-delivery-row .nc-chevron {
  flex-shrink: 0 !important;
  width: 13px !important;
  height: 13px !important;
  color: hsl(0 0% 65%) !important;
  stroke: hsl(0 0% 65%) !important;
  margin-left: 0 !important;
}

/* Mobile: gdy tekst zawija się do 2. linii, strzałka ma iść od razu za
  ostatnim słowem (naturalny text flow), a nie wisieć wyśrodkowana przy
  prawej krawędzi całego wiersza (flex). Cała zawartość przycisku staje
  się jednym ciągiem inline — ikona, tekst i chevron płyną jak akapit. */
@media (max-width: 767px) {
  #nc-product-page .nc-delivery-row {
    display: block !important;
  }
  #nc-product-page .nc-delivery-icon {
    display: inline-block !important;
    vertical-align: -2px !important;
    margin-right: 0.5rem !important;
  }
  #nc-product-page .nc-delivery-row-text,
  #nc-product-page .nc-delivery-row-muted,
  #nc-product-page .nc-delivery-row-val {
    display: inline !important;
  }
  /* Na mobile ta sekcja (dostawa/zwroty/pakowanie/płatności) ginęła —
    13px/regular na jasnoszarym (hsl(0 0% 40%)) tle jest zbyt subtelne na
    małym ekranie, w porównaniu z resztą karty. O jeden stopień grubsza
    i ciemniejsza czcionka bez zmiany layoutu (tylko mobile — damidomo na
    razie zostaje bez zmian, patrz reguła bazowa .nc-delivery-row-text
    wyżej w pliku). */
  #nc-product-page .nc-delivery-row-text {
    font-size: 13.5px !important;
    font-weight: 500 !important;
    color: hsl(0 0% 28%) !important;
  }
  #nc-product-page .nc-delivery-row-muted {
    font-weight: 500 !important;
    color: hsl(0 0% 33%) !important;
  }
  #nc-product-page .nc-delivery-row-val {
    font-weight: 700 !important;
  }
  /* Wartość (data) nie łamie się w środku — jeśli cały wiersz się nie
    mieści, ma przejść w całości do 2. linii zaraz po etykiecie
    "Przewidywana dostawa:", a nie łamać się np. między "czw., 06.08" a
    "– ndz., 07.08". */
  #nc-product-page .nc-delivery-row-val {
    white-space: nowrap !important;
  }
  #nc-product-page .nc-delivery-row .nc-chevron {
    display: inline-block !important;
    vertical-align: middle !important;
    margin-left: 0.375rem !important;
  }
}

/* ═══════════════════════════════════════════════
  FIXUPS v15 — galeria jako anchory fancybox
  ═══════════════════════════════════════════════ */
#nc-product-page a.nc-gallery-thumb {
  display: block !important;
  text-decoration: none !important;
  color: inherit !important;
}

/* ═══════════════════════════════════════════════
  FIXUPS v16 — sidebar żarówek (moduł bulbselection)
  Mapowanie klasy .active (bulb-sidebar.js) na nc-bulbs-drawer
  ═══════════════════════════════════════════════ */

/* Overlay — ukryty dopóki nieaktywny; nad topbarem/navbarem/wyszukiwarką */
#bulb-sidebar-overlay.nc-drawer-backdrop { display: none !important; z-index: 2147483646 !important; }
#bulb-sidebar-overlay.nc-drawer-backdrop.active { display: block !important; }

/* Panel — bazowo poza ekranem (z prawej), .active wsuwa; nad wszystkim */
#bulb-sidebar-wrapper.nc-bulbs-drawer {
  display: flex !important;
  flex-direction: column !important;
  z-index: 2147483647 !important;
  transform: translateX(100%);
  transition: transform .3s cubic-bezier(.4,0,.2,1);
  visibility: hidden;
  right: 0;
  left: auto;
}
#bulb-sidebar-wrapper.nc-bulbs-drawer.active {
  transform: translateX(0);
  visibility: visible;
}
/* Mobile: wsuwanie z dołu (pełny ekran) */
@media (max-width: 1023px) {
  #bulb-sidebar-wrapper.nc-bulbs-drawer { transform: translateY(100%); }
  #bulb-sidebar-wrapper.nc-bulbs-drawer.active { transform: translateY(0); }
}

/* Reset stylów linków wewnątrz kart żarówek (nazwa, obraz) */
#bulb-sidebar-wrapper .nc-bulb-row-img a { text-decoration: none !important; color: inherit !important; display: block; }
/* Line-clamp musi siedzieć na elemencie z TEKSTEM (a), nie na h3 — gdy dziecko
  ma display:block, -webkit-line-clamp chowa je całkowicie (zostaje tylko
  zarezerwowana, pusta przestrzeń po tytule). */
#bulb-sidebar-wrapper .nc-bulb-row-name {
  display: block !important;
  -webkit-line-clamp: unset !important;
  overflow: visible !important;
  height: auto !important;
  min-height: 0 !important;
  max-height: none !important;
  padding: 0 !important;
  border: 0 !important;
  border-radius: 0 !important;
  background: transparent !important;
  box-shadow: none !important;
  box-sizing: content-box !important;
  margin-top: 0 !important;
  margin-bottom: 0 !important;
  flex: none !important;
}
#bulb-sidebar-wrapper .nc-bulb-row-name a {
  text-decoration: none !important;
  color: inherit !important;
  display: -webkit-box !important;
  -webkit-box-orient: vertical !important;
  -webkit-line-clamp: 2 !important;
  overflow: hidden !important;
}
#bulb-sidebar-wrapper .nc-bulb-add-btn { text-decoration: none !important; }
/* Rozwinięte szczegóły (moduł toggluje display:block inline) */
#bulb-sidebar-wrapper .bulb-sidebar-properties.nc-bulb-details-panel { padding: 0.75rem; }

/* Bez paddingu 20px z CSS modułu — wewnętrzne sekcje mają własne odstępy */
#bulb-sidebar-wrapper.nc-bulbs-drawer { padding: 0 !important; }

/* Wymuszenie scrollowania listy żarówek — stary bulb-sidebar.css (moduł)
  ustawia na tym samym elemencie (.bulb-sidebar-wrapper) własną wysokość
  (height:100%, bez top/bottom:0) i nie ma pewności co do kolejności
  ładowania arkuszy względem nc-product.css, więc wymuszamy tu jawnie
  ograniczoną wysokość szuflady i scroll wewnętrzny na liście — inaczej
  po rozwinięciu "Szczegółów" treść po prostu rośnie poza widoczny obszar
  bez możliwości scrollowania.

  100vh na mobile Chrome/Safari to wysokość "dużego" viewportu (jakby pasek
  adresu był schowany) — gdy pasek jest widoczny, szuflada i tak rezerwuje
  sobie pełne 100vh, więc jej dolna krawędź (stopka "Kupujesz więcej lamp?")
  ląduje POD spodem realnie widocznego ekranu, zasłonięta przez pasek
  adresu (zgłoszone: stopka znika, dopóki pasek adresu nie schowa się po
  przewinięciu). 100dvh ("dynamic viewport height") śledzi RZECZYWISTĄ,
  aktualnie widoczną wysokość i kurczy/rośnie razem z pokazywaniem/
  chowaniem paska — pierwsza deklaracja (100vh) zostaje jako fallback dla
  starszych przeglądarek bez obsługi dvh (nieznana jednostka = cała
  deklaracja ignorowana, więc bezpiecznie spada z powrotem na 100vh). */
#bulb-sidebar-wrapper.nc-bulbs-drawer {
  position: fixed !important;
  top: 0 !important;
  bottom: 0 !important;
  height: 100vh !important;
  height: 100dvh !important;
  max-height: 100vh !important;
  max-height: 100dvh !important;
  display: flex !important;
  flex-direction: column !important;
  overflow: hidden !important;
}
/* Nagłówek/filtry/stopka nie mogą się ściskać — tylko lista poniżej scrolluje */
#bulb-sidebar-wrapper .nc-bulbs-drawer-header,
#bulb-sidebar-wrapper .nc-bulbs-drawer-filters,
#bulb-sidebar-wrapper .nc-bulbs-drawer-footer {
  flex-shrink: 0 !important;
}
#bulb-sidebar-wrapper .nc-bulbs-list {
  flex: 1 1 auto !important;
  min-height: 0 !important;
  overflow-y: auto !important;
  -webkit-overflow-scrolling: touch !important;
}

/* Header — kompaktowy, żeby zostawić więcej miejsca liście żarówek */
#bulb-sidebar-wrapper .nc-bulbs-drawer-header {
  height: 4.25rem !important;
}

/* Pasek filtrów — kompaktowy */
#bulb-sidebar-wrapper .nc-bulbs-drawer-filters {
  padding-top: 0.625rem !important;
  padding-bottom: 0.625rem !important;
}
#bulb-sidebar-wrapper .nc-bulbs-drawer-compat { margin-bottom: 0.375rem !important; }
#bulb-sidebar-wrapper .nc-bulbs-filter-label { margin-bottom: 0.25rem !important; }

/* Filtry barwy — na całą szerokość, docelowo 3 kolumny tej samej szerokości.
  flex:1 1 0 (poprzednio) dzieliło dostępną szerokość po równo między
  FAKTYCZNIE wyrenderowane zakładki — przy 1-2 dostępnych barwach (nie
  wszystkie produkty mają wszystkie 3) każda wychodziła szersza niż przy
  3, zamiast zostać tej samej szerokości i wyrównać się do lewej. Stały
  flex-basis liczony pod 3 kolumny (ten sam wzorzec co #nc-bsi-filter-tabs
  niżej w tym pliku) naprawia to niezależnie od liczby zakładek. */
#bulb-sidebar-wrapper .nc-bulbs-temp-tabs {
  display: flex !important;
  flex-wrap: nowrap !important;
  width: 100% !important;
}
#bulb-sidebar-wrapper .nc-temp-tab {
  flex: 0 0 calc((100% - 2 * 0.5rem) / 3) !important;
  min-width: 0 !important;
  padding: 0.35rem 0.5rem 0.45rem !important;
}
#bulb-sidebar-wrapper .nc-temp-tab-name {
  line-height: 1.1 !important;
}

/* Karty żarówek — niższe, żeby zmieścić min. 4 na ekran desktop */
#bulb-sidebar-wrapper .nc-bulb-row-main { padding: 0.625rem !important; }
/* Kompaktowy baseline (92px) zamiast ogólnego 105px z bazowej reguły
  ".nc-bulb-row" (BULBS DRAWER wyżej) — tutaj kafelki startują mniejsze
  (obrazek 4.25rem, nie 5rem), więc przy tej samej wymuszonej wysokości
  wiersza (--nc-bulb-row-h) powiększenie ma wychodzić z mniejszego punktu
  startowego, żeby proporcje zostały spójne z bazowym rozmiarem. */
#bulb-sidebar-wrapper .nc-bulb-row {
  --nc-bulb-scale: clamp(0.9, calc(var(--nc-bulb-row-h, 92px) / 92px * 0.9), 1.5);
}
#bulb-sidebar-wrapper .nc-bulb-row-img {
  width: calc(4.25rem * var(--nc-bulb-scale, 1)) !important;
  height: calc(4.25rem * var(--nc-bulb-scale, 1)) !important;
}
#bulb-sidebar-wrapper .nc-bulbs-list { gap: 0.5rem !important; }
#bulb-sidebar-wrapper .nc-bulb-details-toggle {
  padding: 0.375rem 0.625rem !important;
  font-size: 11px !important;
}
#bulb-sidebar-wrapper .nc-bulb-details-toggle svg {
  width: 14px !important;
  height: 14px !important;
}

/* Przycisk "Do koszyka" — kompaktowy, ale też rośnie razem z resztą treści
  wiersza (patrz --nc-bulb-scale wyżej) — inaczej "Dobierz" zostawałby
  maleńki obok wyraźnie większego zdjęcia/ceny na wysokim ekranie. */
#bulb-sidebar-wrapper .nc-bulb-add-btn {
  height: calc(2.75rem * var(--nc-bulb-scale, 1)) !important;
  padding-inline: calc(0.875rem * var(--nc-bulb-scale, 1)) !important;
  font-size: calc(12px * var(--nc-bulb-scale, 1)) !important;
}

/* Footer — przyklejony do dołu, wyśrodkowany, bez ikony */
#bulb-sidebar-wrapper .nc-bulbs-drawer-footer {
  margin-top: auto !important;
  justify-content: center !important;
  text-align: center !important;
  padding-block: 1rem !important;
}

/* ═══════════════════════════════════════════════
  FIXUPS v17 — sticky panel zakupowy (StickySidebar, ta sama biblioteka co
  stara karta — patrz footer.tpl, `new StickySidebar('#sidebar', {...})`).
  Pozycjonowanie (fixed/absolute, przejścia między stanami) robi w całości
  JS na .inner-wrapper-sticky wewnątrz .nc-col-purchase — patrz
  initPurchaseStickySidebar w nc-product.js. Żadne CSS position tutaj nie
  jest potrzebne; .nc-product-grid zostaje przy domyślnym align-items:stretch
  (biblioteka liczy granice sama z containerSelector: '.nc-product-grid',
  nie zależy od tego, czy komórki grida są rozciągnięte czy nie).
  ═══════════════════════════════════════════════ */

/* ═══════════════════════════════════════════════
  INSPIRACJE — sekcja z Doofinder (produkty podobne)
  Styl wzorowany na React-owym designie
  ═══════════════════════════════════════════════ */

/* Sekcja wrapper — full-bleed na całą szerokość viewportu */
#nc-product-page .nc-inspiracje {
  background: var(--nc-secondary);
  padding-block: 2rem;
  margin-top: 0;
  margin-bottom: 2rem;
  /* width: 100vw; */
  max-width: 100vw;
  position: relative;
  left: 50%;
  transform: translateX(-50%);
  /* Dokładnie ten sam padding co .nc-container (bez wyliczanego centrowania
    "max(..., calc((100vw - max-width)/2 + ...))") — nic dodatkowego, ta
    sekcja ma się wyrównywać identycznie jak reszta strony ("Lampy z tej
    samej serii"/"Żarówki", obie w .nc-container). */
  padding-inline: 5px;
  box-sizing: border-box;
  overflow-x: hidden !important;
}
@media (min-width: 640px) {
  #nc-product-page .nc-inspiracje {
    padding-block: 2.5rem;
    padding-inline: 2rem;
  }
}
@media (min-width: 1024px) {
  #nc-product-page .nc-inspiracje {
    padding-inline: 2.5rem;
  }
}

/* Key-specs — zmniejsz dolny margines gdy Inspiracje tuż pod spodem */
#nc-product-page .nc-key-specs-wrap:has(+ .nc-inspiracje) {
  /* margin-bottom: 0 !important; */
}

/* Eyebrow "ZOBACZ TAKŻE" — prosty czerwony tekst bez tła */
#nc-product-page .nc-inspiracje-eyebrow {
  display: block;
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .18em;
  color: var(--nc-primary);
  padding: 0;
  background: none;
  border: none;
  margin-bottom: 0.25rem;
  line-height: 1.2;
}

/* Nagłówek sekcji */
#nc-product-page .nc-inspiracje .nc-section-title {
  font-size: 16px;
  font-weight: 700;
  color: var(--nc-fg);
  margin: 0 0 0.25rem;
  white-space: nowrap;
  line-height: 1.3;
}
@media (min-width: 640px) {
  #nc-product-page .nc-inspiracje .nc-section-title { font-size: 18px; }
}
#nc-product-page .nc-inspiracje .nc-section-subtitle {
  font-size: 13px;
  color: var(--nc-muted-fg);
  margin: 0;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
  line-height: 1.6;
}
#nc-product-page .nc-inspiracje .nc-section-header {
  margin-bottom: 1.25rem;
}
/* Zarezerwuj miejsce po prawej na 2 strzałki (5.25rem + 5.25rem + 1rem gap
  + odrobina zapasu), żeby jednoliniowy tytuł/opis nigdy nie wchodził pod
  przyciski. */
@media (min-width: 640px) {
  #nc-product-page .nc-inspiracje .nc-section-header {
    padding-right: 12rem;
  }
}

/* Doofinder host — reset */
#nc-product-page .dfwidget-host {
  font-family: 'Poppins', system-ui, -apple-system, sans-serif;
}

/* Ukryj tytuł Doofindera — nagłówek jest w szablonie */
#nc-product-page .dfwidget-host .titleborderh5 {
  display: none !important;
}

/* Carousel wrapper — reset starych styli; static żeby strzałki uciekły do .nc-inspiracje */
#nc-product-page .dfwidget-host .dfwidget-carousel {
  width: 100% !important;
  background: transparent !important;
  border: none !important;
  padding: 0 !important;
  margin: 0 !important;
  position: static !important;
}

/* Carousel content — gap-based layout */
#nc-product-page .dfwidget-host .carousel-content {
  gap: 0.75rem !important;
  scroll-padding-left: 0.75rem;
  cursor: grab;
  /* scroll-snap widgetu Doofindera "odbijał" ręczne przewijanie (wheel/drag)
    z powrotem do najbliższego punktu zaczepienia — trzeba było scrollować
    kilka razy, żeby przełamać próg snapowania. Wyłączone na stałe, nie tylko
    podczas przeciągania. */
  scroll-snap-type: none !important;
}
/* Blokada natywnego przeciągania linków/obrazków (patrz dragstart w JS) */
#nc-product-page .dfwidget-host .carousel-content a,
#nc-product-page .dfwidget-host .carousel-content img {
  -webkit-user-drag: none;
}
/* Przeciąganie myszą (bindDragScroll w nc-product.js) */
#nc-product-page .dfwidget-host .carousel-content.nc-dragging {
  cursor: grabbing !important;
  scroll-behavior: auto !important;
  user-select: none;
}
#nc-product-page .dfwidget-host .carousel-content.nc-dragging * {
  pointer-events: none;
}

/* Karty produktów — bez boxów, zlewane z tłem */
#nc-product-page .dfwidget-host .dfwidget-card {
  background: transparent !important;
  border-radius: var(--nc-radius) !important;
  border: none !important;
  overflow: hidden !important;
  padding: 0 !important;
  margin: 0 !important;
  box-shadow: none !important;
  display: flex !important;
  flex-direction: column !important;
  position: relative !important;
  cursor: pointer !important;
  transition: opacity .15s !important;
  /* Container query dla cen (patrz .price-display .price/.old-price/.sale_price
    niżej) — karta ma kilka różnych stałych szerokości zależnie od breakpointu
    (20%/25%/33%/50%/2.5-w-rzędzie, patrz media queries wyżej), więc zwykłe
    media query na font-size cen nie nadążałoby idealnie za każdą z nich.
    inline-size pozwala fontowi cen skalować się płynnie względem RZECZYWISTEJ
    szerokości KARTY, nie viewportu. */
  container-type: inline-size;
}
#nc-product-page .dfwidget-host .dfwidget-card:not(:first-child) {
  margin-left: 0 !important;
}
@media (hover: hover) and (pointer: fine) {
#nc-product-page .dfwidget-host .dfwidget-card:hover {
  box-shadow: none !important;
  opacity: .92 !important;
}
}


/* Rozmiary kart — responsive */
@media (min-width: 1201px) {
  #nc-product-page .dfwidget-host .dfwidget-card {
    flex: 0 0 calc(20% - 12px) !important;
    min-width: calc(20% - 12px) !important;
  }
}
@media (min-width: 1025px) and (max-width: 1200px) {
  #nc-product-page .dfwidget-host .dfwidget-card {
    flex: 0 0 calc(25% - 12px) !important;
    min-width: calc(25% - 12px) !important;
  }
}
@media (min-width: 769px) and (max-width: 1024px) {
  #nc-product-page .dfwidget-host .dfwidget-card {
    flex: 0 0 calc(33.33% - 12px) !important;
    min-width: calc(33.33% - 12px) !important;
  }
}
@media (min-width: 481px) and (max-width: 768px) {
  #nc-product-page .dfwidget-host .dfwidget-card {
    flex: 0 0 calc(33.33% - 8px) !important;
    min-width: calc(33.33% - 8px) !important;
  }
}
@media (max-width: 480px) {
  #nc-product-page .dfwidget-host .dfwidget-card {
    flex: 0 0 calc((100% - 18px) / 2.5) !important;
    min-width: calc((100% - 18px) / 2.5) !important;
  }
}

/* Zdjęcie produktu */
#nc-product-page .dfwidget-host .card-media {
  aspect-ratio: 1 !important;
  background: var(--nc-card) !important;
  overflow: hidden !important;
}
#nc-product-page .dfwidget-host .card-media-thumbnail {
  width: 100% !important;
  height: 100% !important;
}
#nc-product-page .dfwidget-host .card-media-thumbnail img {
  width: 100% !important;
  height: 100% !important;
  object-fit: contain !important;
  display: block !important;
  padding: 0.75rem !important;
}

/* Treść karty */
#nc-product-page .dfwidget-host .card-content {
  padding: 0.75rem !important;
  /* border-top: 1px solid var(--nc-border) !important; */
  display: flex !important;
  flex-direction: column !important;
  gap: 0.25rem !important;
  flex: 1 !important;
}

/* Tytuł produktu */
#nc-product-page .dfwidget-host .card-title {
  font-size: 13px !important;
  font-weight: 500 !important;
  color: var(--nc-fg) !important;
  line-height: 1.4 !important;
  text-align: left !important;
  letter-spacing: normal !important;
  display: -webkit-box !important;
  -webkit-line-clamp: 2 !important;
  -webkit-box-orient: vertical !important;
  overflow: hidden !important;
  /* Pisownia (pierwsza litera duża, reszta mała, z wyjątkami np. "LED",
    "Lumina Deco") ustawiana teraz w JS na treści węzła — ncTitleCase w
    nc-product.js, wołane przez applyTitleCase (initDoofinderMove) — nie
    przez text-transform w CSS (nie umiałoby wyjątków). */
}

/* Opis — ukryty */
#nc-product-page .dfwidget-host .card-description {
  display: none !important;
}

/* Flexible spacer */
#nc-product-page .dfwidget-host .card-content > .flexible {
  flex: 1 !important;
}

/* Cena — ZAWSZE w jednej linii: aktualna + stara, bez obcinania. Zamiast
  text-overflow:ellipsis (obcinało starą cenę na wąskich kartach) font-size
  obu cen skaluje się płynnie razem z RZECZYWISTĄ szerokością karty przez
  container query (container-type:inline-size na .dfwidget-card wyżej) —
  clamp(min, baza_px + przyrost_cqw, max): 1cqw = 1% szerokości karty, więc
  im węższa karta, tym mniejszy font, aż do dolnego limitu w clamp(). Druga
  deklaracja font-size (px) PRZED clamp() to fallback dla przeglądarek bez
  obsługi jednostek cqw — clamp() z nieznaną jednostką jest "guaranteed-
  invalid" i cała deklaracja jest wtedy ignorowana, więc zostaje wcześniejsza,
  stała wartość (ten sam wzorzec co inne fallbacki var()/@supports w tym
  pliku). flex-wrap:nowrap + white-space:nowrap — obie ceny mają zostać w
  jednym wierszu, nigdy nie łamać się do kolejnej linii. min-width:0 pozwala
  elementom flex faktycznie się skurczyć (domyślne min-width:auto na
  flex-item blokowałoby to niezależnie od font-size). */
#nc-product-page .dfwidget-host .price-display {
  text-align: left !important;
  margin: 0.25rem 0 0 !important;
  padding: 0 !important;
  display: flex !important;
  flex-direction: row !important;
  flex-wrap: nowrap !important;
  align-items: baseline !important;
  gap: 0.375rem !important;
  min-width: 0 !important;
  width: 100% !important;
}
#nc-product-page .dfwidget-host .price-display .price {
  font-size: 14px !important;
  font-size: clamp(8px, calc(7cqw - 2px), 17px) !important;
  font-weight: 700 !important;
  color: var(--nc-primary) !important;
  order: 1 !important;
  white-space: nowrap !important;
  min-width: 0 !important;
}
#nc-product-page .dfwidget-host .price-display .old-price {
  font-size: 12px !important;
  font-size: clamp(7px, calc(5.6cqw - 1.4px), 14px) !important;
  font-weight: 400 !important;
  color: var(--nc-muted-fg) !important;
  text-decoration: line-through !important;
  order: 2 !important;
  white-space: nowrap !important;
  min-width: 0 !important;
}

/* Wariant markupu widgetu Doofindera z klasami .price/.sale_price (zamiast
  .price/.old-price wyżej) — role klas są tu ODWRÓCONE względem nazw: .price
  to cena PRZED obniżką, .sale_price to cena PO obniżce. Te same reguły co
  wyżej, ale zamienione: .sale_price dostaje styl, jaki wyżej ma .price
  (wyróżniona, pogrubiona), a .price dostaje styl, jaki wyżej ma .old-price
  (wyszarzona, przekreślona) — TYLKO gdy .sale_price faktycznie występuje
  obok (produkt w promocji). Bez promocji Doofinder renderuje samo .price
  (pusty <span class="sale_price"></span> albo brak go wcale) — wtedy .price
  to JEDYNA cena i ma wyglądać jak zwykła, wyróżniona cena (tak jak
  .sale_price przy przecenie), a nie jak wyszarzona/przekreślona "stara
  cena" bez żadnej aktualnej obok. */
#nc-product-page .dfwidget-host .price-display:has(.sale_price:not(:empty)) .sale_price {
  font-size: 14px !important;
  font-size: clamp(8px, calc(7cqw - 2px), 17px) !important;
  font-weight: 700 !important;
  color: rgb(0, 0, 0) !important;
  order: 1 !important;
  white-space: nowrap !important;
  min-width: 0 !important;
}
#nc-product-page .dfwidget-host .price-display:has(.sale_price:not(:empty)) .price {
  font-size: 12px !important;
  font-size: clamp(7px, calc(5.6cqw - 1.4px), 14px) !important;
  font-weight: 400 !important;
  color: var(--nc-muted-fg) !important;
  text-decoration: line-through !important;
  order: 2 !important;
  white-space: nowrap !important;
  min-width: 0 !important;
}
#nc-product-page .dfwidget-host .price-display:not(:has(.sale_price:not(:empty))) .price {
  font-size: 14px !important;
  font-size: clamp(8px, calc(7cqw - 2px), 17px) !important;
  font-weight: 700 !important;
  color: rgb(0, 0, 0) !important;
  text-decoration: none !important;
  order: 1 !important;
  white-space: nowrap !important;
}

/* Link karty — pełne pokrycie */
#nc-product-page .dfwidget-host .card-link {
  position: absolute !important;
  inset: 0 !important;
  z-index: 1 !important;
}

/* Strzałki karuzeli — wyśrodkowane w pionie względem bloku nagłówka
  (eyebrow + tytuł + jednoliniowy opis, ~66px wysokości przy zadeklarowanych
  powyżej line-height). Padding sekcji 2.5rem (40px od 640px) + połowa
  wysokości nagłówka (~33px) − połowa wysokości przycisku (48px) ≈ 25px. */
#nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow {
  position: absolute !important;
  top: 1.9rem !important;
  transform: none !important;
  z-index: 2 !important;
  width: 4.5rem !important;
  height: 4.5rem !important;
  padding: 1rem !important;
  border-radius: 8px !important;
  background: var(--nc-card) !important;
  border: 1px solid #f0f0f0 !important;
  box-shadow: none !important;
  display: grid !important;
  place-items: center !important;
  cursor: pointer !important;
  transition: background .15s, border-color .15s !important;
  opacity: 1 !important;
}
@media (min-width: 640px) {
  #nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow { top: 1.9rem !important; }
}
@media (hover: hover) and (pointer: fine) {
#nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow:hover {
  background: hsl(0 0% 97%) !important;
  border-color: hsl(0 0% 88%) !important;
}
}

#nc-product-page .dfwidget-host .carousel-arrow svg {
  width: 22px !important;
  height: 22px !important;
  fill: var(--nc-fg) !important;
}
/* Ikona strzałek Inspiracji — Doofinder wstrzykuje tu SWÓJ własny SVG
  (grubszy kształt "papierowego samolotu", inny niż reszta karty), którego
  ścieżki nie możemy podmienić w markupie (renderowane przez ich widget,
  nie przez nasz szablon). Zamiast tego: chowamy wstrzyknięty <svg>, a w
  jego miejsce rysujemy WŁASNY kształt — ten sam smukły chevron co przycisk
  strzałki w sekcji "Z tej samej serii" (button.carousel-arrow, ta sama
  ścieżka SVG) — przez CSS mask-image (background-color steruje kolorem,
  działa identycznie dla stanu aktywnego/disabled). */
#nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow svg {
  display: none !important;
}
#nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow::after {
  content: '';
  display: block;
  width: 24px;
  height: 24px;
  background-color: var(--nc-fg);
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-size: contain;
  mask-size: contain;
}
#nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow-right::after {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M8.59 16.59 10 18l6-6-6-6-1.41 1.41L13.17 12z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M8.59 16.59 10 18l6-6-6-6-1.41 1.41L13.17 12z'/%3E%3C/svg%3E");
}
#nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow-left::after {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M15.41 7.41 14 6l-6 6 6 6 1.41-1.41L10.83 12z'/%3E%3C/svg%3E");
}
/* Strzałka na krańcu toru (bindArrowState w nc-product.js) */
#nc-product-page .dfwidget-host .carousel-arrow.nc-arrow-disabled {
  opacity: .35 !important;
  pointer-events: none !important;
  cursor: default !important;
}
@media (hover: hover) and (pointer: fine) {
#nc-product-page .dfwidget-host .carousel-arrow.nc-arrow-disabled:hover {
  background: var(--nc-card) !important;
  border-color: var(--nc-border) !important;
}
}

#nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow-right {
  right: max(0.75rem, calc((100vw - var(--nc-container-max)) / 4)) !important;
}
#nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow-left {
  right: calc(max(0.75rem, calc((100vw - var(--nc-container-max)) / 4)) + 5.25rem) !important;
  left: auto !important;
}
@media (min-width: 640px) {
  #nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow-right {
    right: max(1rem, calc((100vw - var(--nc-container-max)) / 4)) !important;
  }
  #nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow-left {
    right: calc(max(1rem, calc((100vw - var(--nc-container-max)) / 4)) + 5.25rem) !important;
  }
}
@media (min-width: 1024px) {
  #nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow-right {
    right: max(1.5rem, calc((100vw - var(--nc-container-max)) / 4)) !important;
  }
  #nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow-left {
    right: calc(max(1.5rem, calc((100vw - var(--nc-container-max)) / 4)) + 5.25rem) !important;
  }
}

/* Mobile: większe, wyraźne kafelki strzałek, osunięte w dół i wyśrodkowane
  w pionie względem bloku tekstowego (eyebrow+tytuł+opis), z zapasem po
  prawej w nagłówku, żeby tekst nie wchodził pod strzałki — analogicznie
  do sekcji "Z tej samej serii" niżej. */
@media (max-width: 639px) {
  #nc-product-page .nc-inspiracje .nc-section-header {
    padding-right: 6.5rem;
  }
  #nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow {
    top: 1.1rem !important;
    width: 4.25rem !important;
    height: 4.25rem !important;
    border-radius: 9px !important;
  }
  #nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow::after {
    width: 24px;
    height: 24px;
  }
  #nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow-left {
    right: 5.75rem !important;
  }
  /* Lewa (poprzednia) strzałka na starcie karuzeli jest .nc-arrow-disabled
    (bindArrowState w nc-product.js) — ogólna reguła dla tej klasy ścisza
    opacity CAŁEGO przycisku (tło+ramka+ikona) do .35, przez co wygląda na
    wyblakły/niewidoczny kafelek zamiast pełnego białego z jedynie
    przygaszoną ikoną. Tu nadpisujemy: tło/ramka zostają pełne jak w prawej
    strzałce, przygaszona jest tylko sama ikona (::after — patrz wyżej,
    wstrzyknięty <svg> Doofindera jest ukryty na rzecz maski CSS). */
  #nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow.nc-arrow-disabled {
    opacity: 1 !important;
    background: var(--nc-card) !important;
    border-color: #f0f0f0 !important;
  }
  #nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow.nc-arrow-disabled::after {
    background-color: hsl(0 0% 60%) !important;
  }
}

/* Pasek przewijania pod karuzelą */
#nc-product-page .dfwidget-host .carousel-content {
  scrollbar-width: thin !important;
  scrollbar-color: var(--nc-border) transparent !important;
  padding-bottom: 0.75rem !important;
  background-color: rgb(248, 245, 242);
}
#nc-product-page .dfwidget-host .carousel-content::-webkit-scrollbar {
  height: 6px !important;
}
#nc-product-page .dfwidget-host .carousel-content::-webkit-scrollbar-track {
  background: transparent !important;
}
#nc-product-page .dfwidget-host .carousel-content::-webkit-scrollbar-thumb {
  background: hsl(0 0% 75%) !important;
  border-radius: 3px !important;
}
@media (hover: hover) and (pointer: fine) {
#nc-product-page .dfwidget-host .carousel-content::-webkit-scrollbar-thumb:hover {
  background: hsl(0 0% 55%) !important;
}
}



/* ═══════════════════════════════════════════════
  Z TEJ SAMEJ SERII — sekcja z drugim widgetem Doofinder
  ═══════════════════════════════════════════════ */
#nc-product-page .nc-seria {
  border-top: 1px solid var(--nc-border);
  padding-top: 2rem;
}
#nc-product-page .nc-seria-header {
  margin-bottom: 1.25rem;
}
#nc-product-page .nc-seria-eyebrow {
  display: block;
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--nc-primary);
  padding: 0;
  background: none;
  border: none;
  margin-bottom: 0.25rem;
}

/* Pigułki filtrów wg typu lampy (Wszystkie/Wiszące/Żyrandole/...) —
  budowane dynamicznie przez initSeriaFilters() w nc-product.js,
  wstawiane zaraz po .nc-seria-header, przed karuzelą kart. */
#nc-product-page .nc-seria-filters {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
  margin-bottom: 1.25rem;
}
#nc-product-page .nc-seria-filter-pill {
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  padding: 1rem 1.25rem;
  border-radius: 6px;
  border: 1px solid #e5e7eb;
  background: var(--nc-card);
  color: var(--nc-fg);
  font-size: 13px;
  font-weight: 400;
  cursor: pointer;
  transition: border-color .15s, background .15s, color .15s;
  font-family: inherit;
  white-space: nowrap;
  line-height: 1.2;
}
@media (hover: hover) and (pointer: fine) {
#nc-product-page .nc-seria-filter-pill:hover { border-color: #d1d5db; }
}

#nc-product-page .nc-seria-filter-pill.is-active {
  border-color: #ddd6c8;
  background: #f7f5f0;
  color: hsl(0 0% 15%);
  font-weight: 700;
}
#nc-product-page .nc-seria-filter-count {
  font-size: 12px;
  font-weight: 400;
  color: var(--nc-muted-fg);
}
#nc-product-page .nc-seria-filter-pill.is-active .nc-seria-filter-count {
  color: hsl(0 0% 15%);
  font-weight: 700;
}

/* Strzałki serii — analogicznie do Inspiracji */
#nc-product-page .nc-seria .dfwidget-host .carousel-arrow {
  position: absolute !important;
  top: 29px !important;
  transform: none !important;
  z-index: 2 !important;
  width: 4.5rem !important;
  height: 4.5rem !important;
  border-radius: 6px !important;
  background: var(--nc-card) !important;
  border: 1px solid var(--nc-border) !important;
  box-shadow: none !important;
  display: grid !important;
  place-items: center !important;
  cursor: pointer !important;
  transition: background .15s, border-color .15s !important;
  opacity: 1 !important;
}
#nc-product-page .nc-seria .dfwidget-host .carousel-arrow svg {
  width: 24px !important;
  height: 24px !important;
}
#nc-product-page .nc-seria .dfwidget-host .carousel-arrow-right {
  right: 0 !important;
}
#nc-product-page .nc-seria .dfwidget-host .carousel-arrow-left {
  right: 5rem !important;
  left: auto !important;
}
#nc-product-page .nc-seria .dfwidget-host .dfwidget-carousel {
  position: static !important;
}
#nc-product-page .nc-seria {
  position: relative;
}

/* Mobile: mniejsze strzałki + zarezerwowane miejsce po prawej w headerze,
  żeby tekst nagłówka (zawinięty lub nie) nigdy nie lądował pod nimi.
  Próg 1023px — tak samo jak "mobilka" jest zdefiniowana wszędzie indziej
  w tym pliku (Fancybox, sticky sidebar itd.). MUSI być zdefiniowane PO
  powyższej bazowej regule strzałek (nie przed) — obie strony mają
  !important przy tej samej specyficzności, więc o wygranej decyduje
  wyłącznie kolejność w pliku, nie sama obecność media query. */
@media (max-width: 1023px) {
  #nc-product-page .nc-seria-header {
    padding-right: 5.5rem;
  }
  #nc-product-page .nc-seria .dfwidget-host .carousel-arrow {
    top: 1.25rem !important;
    width: 4.25rem !important;
    height: 4.25rem !important;
    right: 5px;
  }
  #nc-product-page .nc-seria .dfwidget-host .carousel-arrow svg {
    width: 24px !important;
    height: 24px !important;
  }
  #nc-product-page .nc-seria .dfwidget-host .carousel-arrow-left {
    /* right: 2.75rem !important; */
  }
}

/* ═══════════════════════════════════════════════
  MONTAŻ — accordion z instrukcją krok po kroku
  ═══════════════════════════════════════════════ */
.nc-montaz-accordion {
  border: 1px solid var(--nc-border);
  border-radius: var(--nc-radius);
  overflow: hidden;
}

.nc-montaz-trigger {
  width: 100%;
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 1rem 1.25rem;
  background: var(--nc-secondary);
  border: none;
  cursor: pointer;
  font-family: inherit;
  font-size: 14px;
  font-weight: 600;
  color: var(--nc-fg);
  text-align: left;
  transition: background .15s;
}
@media (hover: hover) and (pointer: fine) {
.nc-montaz-trigger:hover { background: hsl(36 25% 92%); }
}

.nc-montaz-trigger[aria-expanded="true"] .nc-montaz-chevron { transform: rotate(180deg); }

.nc-montaz-trigger-icon {
  flex-shrink: 0;
  color: rgba(31, 31, 31, 0.7);
}
.nc-montaz-trigger-icon svg {
  fill: none;
  stroke: currentColor;
}
.nc-montaz-trigger-text { flex: 1; }
.nc-montaz-chevron {
  flex-shrink: 0;
  color: var(--nc-muted-fg);
  transition: transform .3s ease;
}

/* Panel — płynna animacja */
.nc-montaz-panel {
  overflow: hidden;
  transition: max-height .4s ease, opacity .3s ease;
  max-height: 0;
  opacity: 0;
}
.nc-montaz-panel.is-open {
  opacity: 1;
}
.nc-montaz-panel[hidden] {
  display: block !important;
  max-height: 0 !important;
  opacity: 0 !important;
  overflow: hidden !important;
}

.nc-montaz-content {
  padding: 2rem 1.75rem;
  font-size: 15px;
  line-height: 1.8;
  color: hsl(0 0% 25%);
}

.nc-montaz-intro {
  margin: 0 0 1rem;
  font-size: 15px;
}
.nc-montaz-intro strong { color: var(--nc-fg); }

.nc-montaz-note {
  margin: 0 0 1.5rem;
  font-size: 14px;
  color: var(--nc-muted-fg);
}

/* Wersja CMS (slug "montaz-informacje") tej samej treści — patrz
  product-tabs.tpl i buildSingleCms() w ProductController.php. Treść to
  JEDEN blok tekstowy edytowalny z adminu (zwykłe <p> z edytora CMS), więc
  nie ma tu osobnych klas .nc-montaz-intro/.nc-montaz-note do nadania w
  markupie — pierwszy akapit dostaje styl "wstępu", każdy kolejny styl
  "notki" (:not(:first-child)), 1:1 odzwierciedlając dawny układ
  dwóch zaszytych na sztywno paragrafów. */
.nc-montaz-cms p {
  margin: 0 0 1rem;
  font-size: 15px;
  color: hsl(0 0% 25%);
}
.nc-montaz-cms p:last-child { margin-bottom: 1.5rem; }
.nc-montaz-cms p strong { color: var(--nc-fg); }
.nc-montaz-cms p:not(:first-child) {
  font-size: 14px;
  color: var(--nc-muted-fg);
}

/* Przyciski PDF — jeden na każdy załącznik (instrukcja ogólna producenta +
  instrukcja modelu, gdy oba są podpięte w PS), obok siebie; zawijają się
  na wąskich ekranach zamiast wychodzić poza kontener. */
.nc-montaz-download {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 0.75rem;
  margin-bottom: 1.5rem;
}
.nc-montaz-pdf-btn {
  display: inline-flex;
  align-items: center;
  gap: 0.5rem;
  padding: 1rem 1.25rem;
  border-radius: var(--nc-radius);
  background: var(--nc-fg);
  color: var(--nc-primary-fg);
  font-size: 13px;
  font-weight: 600;
  text-decoration: none;
  transition: background .15s;
}
/* !important na kolor/tekst — motyw ma globalne "a:hover { color: var(--nc-primary) }",
  które bez tego przebijało białe litery/ikonę na czerwono (--nc-primary)
  przy najechaniu na ten link. */
.nc-montaz-pdf-btn:focus {
  background: hsl(0 0% 25%) !important;
  color: #ffffff !important;
  text-decoration: none !important;
}
@media (hover: hover) and (pointer: fine) {
.nc-montaz-pdf-btn:hover {
  background: hsl(0 0% 25%) !important;
  color: #ffffff !important;
  text-decoration: none !important;
}
}

.nc-montaz-pdf-btn svg { fill: none !important; }
.nc-montaz-pdf-btn:focus svg {
  stroke: #ffffff !important;
  color: #ffffff !important;
}
@media (hover: hover) and (pointer: fine) {
.nc-montaz-pdf-btn:hover svg {
  stroke: #ffffff !important;
  color: #ffffff !important;
}
}


/* Kroki montażu */
.nc-montaz-steps {
  list-style: none;
  counter-reset: montaz-step;
  padding: 0;
  margin: 0 0 1.5rem;
  display: flex;
  flex-direction: column;
  gap: 0;
}
.nc-montaz-steps li {
  counter-increment: montaz-step;
  position: relative;
  padding: 1.25rem 0 1.25rem 4rem;
  border-top: 1px solid var(--nc-border);
}
.nc-montaz-steps li:last-child { border-bottom: 1px solid var(--nc-border); }

.nc-montaz-steps li::before {
  content: counter(montaz-step);
  position: absolute;
  left: 0;
  top: 1.25rem;
  width: 2.5rem;
  height: 2.5rem;
  border-radius: 50%;
  background: linear-gradient(135deg, hsl(0, 0%, 0%), hsl(0, 0%, 0%));
  color: #fff;
  font-size: 14px;
  font-weight: 700;
  display: grid;
  place-items: center;
}

.nc-montaz-steps li strong {
  display: block;
  font-size: 15px;
  font-weight: 700;
  color: var(--nc-fg);
  margin-bottom: 0.375rem;
}
.nc-montaz-steps li p {
  margin: 0;
  font-size: 14px;
  line-height: 1.7;
  color: hsl(0 0% 35%);
}

/* Ostrzeżenie bezpieczeństwa */
.nc-montaz-safety {
  display: flex;
  align-items: flex-start;
  gap: 0.75rem;
  padding: 1rem;
  border-radius: var(--nc-radius);
  background: hsl(38 90% 96%);
  border: 1px solid hsl(38 90% 65% / .4);
  margin: 0.75rem 0 0;
}
.nc-montaz-safety svg {
  flex-shrink: 0;
  color: hsl(32 55% 32%);
  margin-top: 2px;
}
.nc-montaz-safety-text {
  margin: 0;
  font-size: 14px;
  line-height: 1.6;
  color: hsl(28 45% 22%);
}
.nc-montaz-safety-text strong { color: hsl(28 45% 22%); font-weight: 700; }

/* Linia oddzielająca montaż od serii */
#nc-product-page #section-montaz {
  border-top: 1px solid var(--nc-border);
  padding-top: 2rem;
}

/* ═══════════════════════════════════════════════
  FAQ — x13faq moduł w stylu React
  ═══════════════════════════════════════════════ */
#nc-product-page #section-faq {
  border-top: 1px solid var(--nc-border);
  padding-top: 2rem;
}

/* Nadpisanie zmiennych CSS modułu — neutralne kolory */
#nc-product-page #nc-faq-wrap {
  --x13faq-headings_bg_color: transparent;
  --x13faq-headings_text_color: var(--nc-fg);
  --x13faq-headings_bg_color_active: transparent;
  --x13faq-headings_text_color_active: var(--nc-fg);
}

/* Reset domyślnych styli x13faq */
#nc-product-page .x13faq__block-title { display: none !important; }
#nc-product-page .x13-faq-container {
  margin: 0 !important;
  padding: 0 !important;
}

/* Wrapper — bez ramki (każde pytanie ma własną kartę) */
#nc-product-page #nc-faq-wrap .x13faq__block {
  border: none !important;
  border-radius: 0 !important;
  overflow: visible !important;
  background: transparent !important;
  margin: 0 !important;
  padding: 0 !important;
}

/* Pytanie — osobna karta z ramką */
#nc-product-page #nc-faq-wrap .x13faq__question-wrapper {
  border: 1px solid var(--nc-border) !important;
  border-radius: var(--nc-radius) !important;
  margin: 0 0 0.75rem !important;
  padding: 0 !important;
  overflow: hidden !important;
  background: var(--nc-card) !important;
}
#nc-product-page #nc-faq-wrap .x13faq__question-wrapper:last-child {
  margin-bottom: 0 !important;
}

/* Trigger pytania */
#nc-product-page .x13faq__question {
  display: flex !important;
  align-items: center !important;
  justify-content: space-between !important;
  width: 100% !important;
  padding: 1.125rem 1.5rem !important;
  margin: 0 !important;
  background: transparent !important;
  border: none !important;
  border-top: none !important;
  color: var(--nc-fg) !important;
  cursor: pointer !important;
  font-size: 15px !important;
  font-weight: 700 !important;
  font-family: 'Poppins', system-ui, sans-serif !important;
  text-align: left !important;
  text-transform: none !important;
  letter-spacing: normal !important;
  line-height: 1.4 !important;
  transition: background .12s !important;
}
@media (hover: hover) and (pointer: fine) {
#nc-product-page .x13faq__question:hover {
  background: var(--nc-secondary) !important;
  color: var(--nc-fg) !important;
}
}


/* Ukryj oryginalną ikonę modułu (X po lewej) */
#nc-product-page .x13faq__question svg {
  display: none !important;
}

/* Tekst pytania — pełna szerokość */
#nc-product-page .x13faq__question span {
  flex: 1 !important;
  padding-right: 0.75rem !important;
}

/* Chevron po prawej — CSS border trick */
#nc-product-page .x13faq__question::after {
  content: '' !important;
  flex-shrink: 0 !important;
  display: inline-block !important;
  width: 9px !important;
  height: 9px !important;
  border-right: 2px solid var(--nc-muted-fg) !important;
  border-bottom: 2px solid var(--nc-muted-fg) !important;
  transform: rotate(45deg) translateY(-2px) !important;
  transition: transform .25s ease !important;
}
#nc-product-page .x13faq__question-wrapper.open .x13faq__question::after {
  transform: rotate(-135deg) translateY(2px) !important;
}

/* Otwarte pytanie — brak zmian wizualnych triggera */
#nc-product-page .x13faq__question-wrapper.open .x13faq__question {
  background: transparent !important;
  color: var(--nc-fg) !important;
  border-top: none !important;
  border-bottom: none !important;
}

/* Odpowiedź — brak obramowań z modułu, padding wyrównany z tekstem */
#nc-product-page .x13faq__question-content {
  border: none !important;
  background: transparent !important;
}
#nc-product-page [data-display_type^="accordion"] .x13faq__question-wrapper.open .x13faq__question-content {
  border: none !important;
}
#nc-product-page .x13faq__answer {
  margin: 0 !important;
  padding: 0 !important;
}
#nc-product-page .x13faq__question-content,
#nc-product-page [data-display_type^="accordion"] .x13faq__question-content {
  padding: 0 1.5rem 1.25rem !important;
  margin: 0 !important;
}
#nc-product-page .x13faq__answer {
  font-size: 14px !important;
  line-height: 1.7 !important;
  color: hsl(0 0% 30%) !important;
}
#nc-product-page .x13faq__answer p {
  margin: 0 0 0.5rem !important;
}
#nc-product-page .x13faq__answer p:last-child {
  margin-bottom: 0 !important;
}

/* Like/unlike — zachowaj domyślne */
#nc-product-page .x13faq__question-rate {
  margin-top: 0.75rem !important;
}

/* CTA "Nie znalazłeś odpowiedzi?" */
.nc-faq-cta {
  text-align: center;
  font-size: 14px;
  color: var(--nc-muted-fg);
  margin-top: 1.25rem;
}
.nc-faq-cta-link {
  color: var(--nc-fg);
  font-weight: 600;
  text-decoration: none;
}
@media (hover: hover) and (pointer: fine) {
.nc-faq-cta-link:hover {
  text-decoration: underline;
}
}


/* Neutralizacja box-shadow z cv_custom.css (czerwona linia u góry otwartego pytania) */
#nc-product-page #nc-faq-wrap .x13faq__question-wrapper,
#nc-product-page #nc-faq-wrap .x13faq__question-wrapper.open {
  box-shadow: none !important;
}

/* Neutralizacja border + padding z cv_custom.css na block_content */
#nc-product-page #nc-faq-wrap .x13faq__block-content.block_content {
  border: none !important;
  padding: 0 !important;
  background: transparent !important;
}

/* FAQ grid — wymuś jedną kolumnę zamiast dwóch */
#nc-product-page #nc-faq-wrap .x13faq__block-questions {
  display: flex !important;
  flex-direction: column !important;
}
#nc-product-page #nc-faq-wrap .x13faq__block-questions > .col-sm-12,
#nc-product-page #nc-faq-wrap .x13faq__block-questions > .col-md-6 {
  width: 100% !important;
  max-width: 100% !important;
  flex: none !important;
  padding: 0 !important;
  float: none !important;
}

/* FAQ — ukryj pytania po 3. (w tym samym boxie) */
#nc-product-page .nc-faq-collapsed .nc-faq-hidden-item {
  display: none !important;
}

/* Wymuszenie zamknięcia wszystkich odpowiedzi domyślnie (moduł otwiera "first") */
#nc-product-page #nc-faq-wrap .x13faq__question-content {
  display: none !important;
}
#nc-product-page #nc-faq-wrap .x13faq__question-wrapper.open .x13faq__question-content {
  display: block !important;
}

/* Przycisk "Pokaż wszystkie pytania" */
.nc-faq-toggle {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 0.5rem;
  margin: 1rem auto 0;
  padding: 0.75rem 1.5rem;
  border: 1px solid var(--nc-border);
  border-radius: var(--nc-radius);
  background: var(--nc-card);
  font-size: 14px;
  font-weight: 600;
  color: var(--nc-fg);
  cursor: pointer;
  transition: background .15s, border-color .15s;
  font-family: inherit;
}
@media (hover: hover) and (pointer: fine) {
.nc-faq-toggle:hover { background: var(--nc-secondary); border-color: hsl(0 0% 70%); }
}

.nc-faq-toggle[aria-expanded="true"] .nc-faq-toggle-chevron { transform: rotate(180deg); }
.nc-faq-toggle-chevron {
  transition: transform .2s ease;
}
.nc-faq-toggle-icon {
  color: var(--nc-muted-fg);
}

/* ═══════════════════════════════════════════════════════════════
  OSTATNIO PRZEGLĄDANE (#blockviewed-wrapper)
  ════════════════════════════════════════════════════════════ */

/* Sekcja — tło i padding: outer wrapper (zawsze) + inner nc-viewed-section (po AJAX na 852) */
#blockviewed-wrapper,
.nc-viewed-section {
  background: var(--nc-secondary) !important;
  padding-block: 1.5rem !important;
  padding-inline: max(1rem, calc((100vw - var(--nc-container-max, 1200px)) / 2 + 1rem)) !important;
  margin: 0 !important;
  box-sizing: border-box !important;
}
#blockviewed-wrapper #blockviewed-wrapper,
#blockviewed-wrapper .nc-viewed-section,
.nc-viewed-section .nc-viewed-section {
  padding-inline: 0 !important;
}
/* @media (min-width: 640px) {
  #blockviewed-wrapper, .nc-viewed-section { padding-block: 3rem !important; }
} */

/* Ukryj stary nagłówek PS6 — tylko "linie ozdobne", h2 zostawiamy (stylowane niżej) */
#blockviewed-wrapper .titleborderout1,
#blockviewed-wrapper .titleborder2,
.nc-viewed-section h2:not(.nc-viewed-title),
.nc-viewed-section .titleborderout1,
.nc-viewed-section .titleborder2 {
  display: none !important;
}

/* Header — tytuł + strzałki w jednym wierszu */
.nc-viewed-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 1rem;
  margin-bottom: 1.5rem;
}
.nc-viewed-header-text { min-width: 0; }

/* Eyebrow */
.nc-viewed-eyebrow {
  display: flex;
  align-items: center;
  gap: 0.375rem;
  font-size: 13px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--nc-primary);
  margin-bottom: 0.25rem;
  font-family: 'Poppins', system-ui, sans-serif;
}
.nc-viewed-eyebrow svg { flex-shrink: 0; fill: none !important; }

/* Tytuł sekcji */
.nc-viewed-title {
  font-size: 20px !important;
  font-weight: 700 !important;
  color: var(--nc-fg) !important;
  margin: 0 0 0.25rem !important;
  border: none !important;
  background: transparent !important;
  padding: 0 !important;
  text-transform: none !important;
  font-family: 'Poppins', system-ui, sans-serif !important;
}
@media (min-width: 640px) { .nc-viewed-title { font-size: 22px !important; } }

/* Podtytuł */
.nc-viewed-subtitle {
  font-size: 14px;
  color: var(--nc-muted-fg);
  margin: 0;
}

/* Strzałki nawigacyjne — w headerze */
.nc-viewed-nav {
  display: flex;
  gap: 0.5rem;
  flex-shrink: 0;
  padding-top: 0.375rem;
}
/* #blockviewed-wrapper .nc-viewed-nav .nc-viewed-nav-btn — musi mieć WYŻSZĄ specyficzność
  (ID + 2 klasy) niż #blockviewed-wrapper .round-arrow-button (ID + 1 klasa, dalej w pliku,
  position:absolute). Przy równej specyficzności wygrywałaby reguła zdefiniowana później —
  a .round-arrow-button jest zdefiniowana niżej — więc oba przyciski traciły flex layout
  i lądowały jeden na drugim (widoczny tylko ostatni w DOM, czyli prawy). */
/* Ta sama stylistyka co strzałki karuzeli w Inspiracjach
  (#nc-product-page .nc-inspiracje .dfwidget-host .carousel-arrow) —
  rozmiar/border/hover/ikona 1:1, tylko position:static zamiast absolute
  (tu siedzą w zwykłym flex-rzędzie nagłówka, nie nad karuzelą). */
#blockviewed-wrapper .nc-viewed-nav .nc-viewed-nav-btn {
  width: 4.5rem !important;
  height: 4.5rem !important;
  min-width: 4.5rem !important;
  padding: 1rem !important;
  border-radius: 8px !important;
  border: 1px solid #f0f0f0 !important;
  background: var(--nc-card) !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  cursor: pointer !important;
  transition: border-color .15s, background .15s !important;
  box-shadow: none !important;
  /* override theme's absolute positioning */
  position: static !important;
  top: auto !important;
  left: auto !important;
  right: auto !important;
  transform: none !important;
  margin: 0 !important;
}
@media (hover: hover) and (pointer: fine) {
.nc-viewed-nav-btn:hover {
  background: hsl(0 0% 97%) !important;
  border-color: hsl(0 0% 88%) !important;
  box-shadow: none !important;
}
}

.nc-viewed-nav-btn svg {
  width: 24px !important;
  height: 24px !important;
  fill: var(--nc-fg) !important;
  display: block !important;
  stroke: none !important;
}
/* Tak jak w Inspiracjach/Serii (patrz komentarz przy .nc-arrow-disabled
  tam) — bez ściszania opacity CAŁEGO przycisku (tło+ramka+ikona), co
  wygląda na wyblakły/niewidoczny kafelek. Tło i ramka zostają pełne,
  przygaszona jest tylko sama ikona. */
#blockviewed-wrapper .nc-viewed-nav-btn.swiper-button-disabled {
  display: flex !important;
  opacity: 1 !important;
  background: var(--nc-card) !important;
  border-color: #f0f0f0 !important;
  cursor: default !important;
  pointer-events: none !important;
}
#blockviewed-wrapper .nc-viewed-nav-btn.swiper-button-disabled svg {
  fill: hsl(0 0% 60%) !important;
}
@media (max-width: 639px) {
  #blockviewed-wrapper .nc-viewed-nav .nc-viewed-nav-btn {
    width: 4.25rem !important;
    height: 4.25rem !important;
    min-width: 4.25rem !important;
    padding: 1rem !important;
  }
  .nc-viewed-nav-btn svg {
    width: 24px !important;
    height: 24px !important;
  }
}

/* Swiper container — reset */
#blockviewed_box {
  position: relative !important;
  overflow: hidden !important;
  padding: 0 !important;
  margin: 0 !important;
  background: transparent !important;
}

/* Cienki, minimalistyczny pasek — dopasowany 1:1 do wyglądu scrollbara w
  karuzelach "Sprawdź inne"/"Z tej samej serii" (dfwidget-host
  .carousel-content, patrz #nc-product-page .dfwidget-host .carousel-content
  ::-webkit-scrollbar* wyżej w tym pliku): 6px, przezroczysty tor, szary
  uchwyt hsl(0 0% 75%). Poprzednia wersja tej reguły całkiem chowała pasek
  (display:none) w błędnym przekonaniu, że tamte karuzele w ogóle go nie
  pokazują — w rzeczywistości mają identyczny, tylko cienki pasek, więc
  "Ostatnio przeglądane" ma teraz dokładnie to samo, zamiast braku paska.
  .chekcedLately-scrollbar/.swiper-scrollbar-drag to NIE natywny scrollbar
  przeglądarki, tylko własny, przeciągalny element Swipera (tor/uchwyt) —
  stąd zwykłe reguły background/height zamiast ::-webkit-scrollbar*. */
.chekcedLately-scrollbar {
  height: 6px !important;
  border-radius: 9999px !important;
  background: #f1f1f1 !important;
  margin-top: 16px !important;
  margin-bottom: 8px !important;
}
.chekcedLately-scrollbar .swiper-scrollbar-drag {
  height: 100% !important;
  border-radius: 9999px !important;
  background: #d8d8d8 !important;
  transition: background-color 0.2s ease;
}
@media (hover: hover) and (pointer: fine) {
.chekcedLately-scrollbar:hover .swiper-scrollbar-drag {
  background: #9ca3af !important;
}
}


/* Trójkątne wskaźniki na obu końcach toru — sygnalizują, że pasek to
  faktycznie tor przewijania (nie tylko dekoracyjna kreska), tak jak w
  referencyjnym zrzucie. Wycentrowane względem 6px wysokości toru. */
#blockviewed-wrapper .swiper-scrollbar {
  position: relative !important;
  overflow: visible !important;
}
#blockviewed-wrapper .swiper-scrollbar::before {
  content: "" !important;
  position: absolute !important;
  left: -9px !important;
  top: 50% !important;
  transform: translateY(-50%) !important;
  width: 0 !important;
  height: 0 !important;
  border-style: solid !important;
  border-width: 3.5px 4.5px 3.5px 0 !important;
  border-color: transparent #d8d8d8 transparent transparent !important;
}
#blockviewed-wrapper .swiper-scrollbar::after {
  content: "" !important;
  position: absolute !important;
  right: -9px !important;
  top: 50% !important;
  transform: translateY(-50%) !important;
  width: 0 !important;
  height: 0 !important;
  border-style: solid !important;
  border-width: 3.5px 0 3.5px 4.5px !important;
  border-color: transparent transparent transparent #d8d8d8 !important;
}
@media (hover: hover) and (pointer: fine) {
#blockviewed-wrapper .swiper-scrollbar:hover::before {
  border-right-color: #9ca3af !important;
}
}
@media (hover: hover) and (pointer: fine) {
#blockviewed-wrapper .swiper-scrollbar:hover::after {
  border-left-color: #9ca3af !important;
}
}


/* Karty produktów — tylko nowy design */
/* #blockviewed-wrapper.nc-viewed-section (ID+klasa razem) — musi wygrać specyficznością
  z regułą samego #blockviewed-wrapper niżej w pliku (border/zoom dla starej karty),
  bo ten sam <section> ma jednocześnie i to ID, i tę klasę także w nowej karcie. */
#blockviewed-wrapper.nc-viewed-section .swiper-slide.product-box.item {
  container-type: inline-size;
  display: flex !important;
  flex-direction: column !important;
  background: transparent !important;
  border: none !important;
  border-radius: var(--nc-radius) !important;
  overflow: hidden !important;
  box-shadow: none !important;
  transition: box-shadow .15s, border-color .15s !important;
  padding: 0 !important;
}
@media (hover: hover) and (pointer: fine) {
#blockviewed-wrapper.nc-viewed-section .swiper-slide.product-box.item:hover {
  box-shadow: none !important;
}
}


/* Ukryj pusty ostatni slide */
.nc-viewed-section .swiper-last-no-border { display: none !important; }

/* Liczba widocznych kart (2,4 mobile / 6,5 desktop) — PRZENIESIONA stąd do
  swiper-init.js (slidesPerView w konfiguracji Swipera, dedykowanej tylko
  dla ".nc-viewed-section .chekcedLately"). Poprzednio wymuszaliśmy
  szerokość karty tu, przez CSS !important, niezależnie od tego, co Swiper
  sam sobie policzył — ale Swiper WEWNĘTRZNIE i tak liczy przewijanie
  (transform: translate3d na .swiper-wrapper) na podstawie WŁASNYCH,
  nieprzeliczonych przez nasz CSS szerokości. Rozjazd między tym, co
  faktycznie widać (CSS), a tym, o ile Swiper przesuwa tor (JS), dawał
  ścieśniony/połamany render — zgłoszone na zrzucie (tekst łamiący się do
  pojedynczych liter, malutkie, obcięte zdjęcia). Konfigurując slidesPerView
  wprost w Swiperze zamiast nadpisywać wynik przez CSS, szerokość karty i
  matematyka przewijania nigdy się nie rozjadą — to też jedyne, poprawne
  rozwiązanie problemu z małą liczbą produktów (świeże incognito): Swiper
  liczy szerokość slajdu jako (szerokość kontenera / slidesPerView),
  NIEZALEŻNIE od tego, ile faktycznie jest slajdów — więc karta ma zawsze
  tę samą wielkość, z pustym miejscem na torze zamiast ściśniętej karty.

  Poniższe reguły ZAKOMENTOWANE (nie usunięte) — na wypadek gdyby trzeba
  było wrócić do podejścia CSS-owego. Każda reguła osobno w osobnym bloku
  komentarza (CSS nie zagnieżdża komentarzy, więc jeden wspólny blok na
  całość zamknąłby się przedwcześnie na pierwszym opisowym komentarzu
  w środku). */

/*
@media (min-width: 1024px) {
  #blockviewed-wrapper.nc-viewed-section .swiper-slide.product-box.item {
    width: calc((100% - 6 * 16px) / 10.5) !important;
    max-width: calc((100% - 6 * 16px) / 10.5) !important;
  }
}
*/
/*
@media (max-width: 639px) {
    #blockviewed-wrapper.nc-viewed-section .swiper-slide.product-box.item {
    width: calc((100% - 6 * 16px) / 14.5) !important;
    max-width: calc((100% - 6 * 16px) / 14.5) !important;
  }
}
*/
/*
#blockviewed-wrapper.nc-viewed-section #blockviewed_box .swiper-wrapper {
  min-width: 100% !important;
}
*/

/* Obrazek — biały kafel z oddechem wokół produktu (padding na img), 1:1 —
  dokładnie jak .card-media/.card-media-thumbnail img w sekcji "Z tej samej
  serii" (zdjęcia mają zostać kwadratowe — cała karta jest mniejsza przez
  mniejszą szerokość, patrz komentarz przy width wyżej, nie przez
  spłaszczenie zdjęcia). #blockviewed-wrapper.nc-viewed-section (ID+klasa)
  — musi wygrać specyficznością z regułą #blockviewed-wrapper .product-image
  niżej w pliku (stara karta), z tego samego powodu co border/zoom wyżej. */
#blockviewed-wrapper.nc-viewed-section .product-image {
  display: block !important;
  aspect-ratio: 1/1 !important;
  background: var(--nc-card) !important;
  overflow: hidden !important;
  flex-shrink: 0 !important;
}
.nc-viewed-section .product-image img {
  width: 100% !important;
  height: 100% !important;
  max-width: 100% !important;
  object-fit: contain !important;
  display: block !important;
  margin: 0 !important;
  padding: 0.75rem !important;
  box-sizing: border-box !important;
}
/* Kasuje zoom ze starej reguły #blockviewed-wrapper .swiper-slide:hover .product-image img
  (osobny selektor :hover — nie da się go "wyłączyć" przez samo pominięcie, trzeba nadpisać) */@media (hover: hover) and (pointer: fine) {
#blockviewed-wrapper.nc-viewed-section .swiper-slide:hover .product-image img {
  transform: none !important;
}
}


/* Blok informacyjny pod zdjęciem — jak .card-content w Serii */
.nc-viewed-info {
  padding: 0.75rem !important;
  display: flex !important;
  flex-direction: column !important;
  gap: 0.25rem !important;
  flex: 1 !important;
}

/* Nazwa produktu — jak .card-title w Serii: 2 linie (nie 3), bez sztywno
  zarezerwowanej wysokości — kafelek ma hugować treść, nie zostawiać
  pustego miejsca przy krótkich nazwach. Reset wysokości narzuconej przez
  global.css #blockviewed_box.swiper-horizontal .product-name.
  #blockviewed-wrapper.nc-viewed-section (ID+klasa) — musi wygrać
  specyficznością z regułą fallback #blockviewed-wrapper .product-name a
  niżej w pliku (ID bije dowolną liczbę klas — sam .nc-viewed-section bez
  ID przegrywał, dokładnie ten sam mechanizm co wcześniej przy strzałkach
  Serii). */
#blockviewed-wrapper.nc-viewed-section .product-name,
.nc-viewed-section .product-name {
  height: auto !important;
  font-size: 13px !important;
  font-weight: 500 !important;
  line-height: 1.4 !important;
  margin: 0 !important;
  text-transform: none !important;
}
#blockviewed-wrapper.nc-viewed-section .product-name a,
.nc-viewed-section .product-name a {
  color: var(--nc-fg) !important;
  text-decoration: none !important;
  /* Pisownia ustawiana w JS na treści węzła — ncTitleCase/applyTitleCase
    w nc-product.js (nie text-transform w CSS, nie umiałoby wyjątków
    typu "LED"). */
  font-size: 13px !important;
  display: -webkit-box !important;
  -webkit-line-clamp: 2 !important;
  line-clamp: 2 !important;
  -webkit-box-orient: vertical !important;
  overflow: hidden !important;
  text-overflow: ellipsis !important;
  text-align: left !important;
  text-transform: none !important;
}
@media (hover: hover) and (pointer: fine) {
.nc-viewed-section .product-name a:hover { text-decoration: underline !important; }
}


/* Cena — jak .price-display w Serii: jeden wiersz, cena+stara cena obok
  siebie, bez sztywnej wysokości/kolumnowego stackowania na mobile (to
  wcześniej odróżniało wygląd od Serii — tu ujednolicone na wszystkich
  szerokościach, tak jak tam). */
#blockviewed-wrapper.nc-viewed-section .price_display,
.nc-viewed-section .price_display {
  display: flex !important;
  flex-direction: row !important;
  flex-wrap: nowrap !important;
  align-items: baseline !important;
  gap: 0.375rem !important;
  height: auto !important;
  min-height: 0 !important;
  width: auto !important;
  text-align: left !important;
  margin: 0.25rem 0 0 !important;
  padding: 0 !important;
}
#blockviewed-wrapper.nc-viewed-section .price_display .price,
.nc-viewed-section .price_display .price {
  display: inline !important;
  width: auto !important;
  text-align: left !important;
  order: 1 !important;
  font-size: 14px !important;
  font-size: clamp(8px, calc(7cqw - 2px), 17px) !important;
  font-weight: 700 !important;
  color: rgb(0, 0, 0) !important;
  white-space: nowrap !important;
  margin: 0 !important;
  padding: 0 !important;
}
#blockviewed-wrapper.nc-viewed-section .price_display .old-price,
.nc-viewed-section .price_display .old-price {
  display: inline !important;
  width: auto !important;
  text-align: left !important;
  order: 2 !important;
  font-size: 12px !important;
  font-size: clamp(7px, calc(5.6cqw - 1.4px), 14px) !important;
  font-weight: 400 !important;
  color: var(--nc-muted-fg) !important;
  text-decoration: line-through !important;
  white-space: nowrap !important;
  overflow: visible !important;
  margin: 0 !important;
  padding: 0 !important;
}

/* Ukryj stary <br> */
.nc-viewed-section br { display: none !important; }

/* Full-bleed fallback — działa wszędzie, niezależnie od kontekstu (#nc-product-page lub nie).
  Niższa specyficzność niż reguła full-bleed poniżej, więc na stronie 852 to ONA wygrywa;
  tutaj chodzi o strony BEZ #nc-product-page/.nc-container, gdzie tamta reguła w ogóle
  się nie odpala i tło zostaje ograniczone do szerokości #center_column.
  Wartości px zamiast var(--nc-container-max) — zmienne CSS nie istnieją poza #nc-product-page.
  Moduł renderuje dwa zagnieżdżone #blockviewed-wrapper (placeholder + treść wstawiona przez AJAX),
  więc — tak jak w regule poniżej dla strony 852 — zewnętrzny dostaje full-bleed,
  a wewnętrzny (selektor potomny, wyższa specyficzność) jest resetowany do 100%. */
#blockviewed-wrapper {
  /* width: 100vw !important; */
  position: relative !important;
  left: 50% !important;
  transform: translateX(-50%) !important;
  box-sizing: border-box !important;
  padding-inline: max(15px, calc((100vw - 750px) / 2 + 15px)) !important;
  overflow-x: hidden !important;
}
@media (min-width: 992px) {
  #blockviewed-wrapper { padding-inline: max(15px, calc((100vw - 970px) / 2 + 15px)) !important; }
}
@media (min-width: 1200px) {
  #blockviewed-wrapper { padding-inline: max(15px, calc((100vw - 1170px) / 2 + 15px)) !important; }
}
#blockviewed-wrapper #blockviewed-wrapper {
  width: 100% !important;
  position: relative !important;
  left: auto !important;
  transform: none !important;
  padding-inline: 0 !important;
}

/* ── BLOCKVIEWED — fix selektorów do rzeczywistego HTML modułu ── */

/* Full-bleed jak Inspiracje — tylko bezpośrednie dziecko .nc-container
  (moduł renderuje dwa zagnieżdżone #blockviewed-wrapper; descendant selector
  trafiałby w oba i podwajał transformację) */
#nc-product-page .nc-container > #blockviewed-wrapper {
  /* width: 100vw !important; */
  position: relative !important;
  left: 50% !important;
  transform: translateX(-50%) !important;
  /* Płaski padding jak .nc-inspiracje (bez wyliczanego centrowania
    "max(..., calc(...))") — tylko trochę większy: 2rem/2.5rem zamiast
    1rem/1.5rem, na wyraźne życzenie (ta sekcja ma odrobinę więcej
    oddechu niż "Lampy z tej samej serii"/"Żarówki"). Baza (mobile)
    zostaje 5px, tak samo jak reszta stron. */
  padding-inline: 5px !important;
  box-sizing: border-box !important;
  /* 100vw nie uwzględnia szerokości paska przewijania strony — o te kilka
    pikseli treść full-bleed (i karuzela Swiper w środku) potrafi wystawać
    poza prawą krawędź, dając stronie poziomy scroll. Przycinamy tutaj. */
  overflow-x: hidden !important;
}
@media (min-width: 640px) {
  #nc-product-page .nc-container > #blockviewed-wrapper {
    padding-inline: 2rem !important;
  }
}
@media (min-width: 1024px) {
  #nc-product-page .nc-container > #blockviewed-wrapper {
    padding-inline: 2.5rem !important;
  }
}
/* Wewnętrzny #blockviewed-wrapper — reset full-bleed + positioning context dla strzałek */
#nc-product-page .nc-container > #blockviewed-wrapper > #blockviewed-wrapper {
  width: 100% !important;
  position: relative !important;
  left: auto !important;
  transform: none !important;
  padding-inline: 0 !important;
}

/* Odkryj h2, nadaj styl jak nagłówek Inspiracji
  (:not(.nc-viewed-title) — wersja nc_new_card ma już własny .nc-viewed-eyebrow,
  ta reguła jest tylko dla surowego markupu modułu blockviewed) */
#blockviewed-wrapper h2:not(.nc-viewed-title) {
  display: block !important;
  position: static !important;
  z-index: auto !important;
  margin: 0 0 1.5rem !important;
}
#blockviewed-wrapper h2:not(.nc-viewed-title) {
  padding-right: 88px !important;
}
#blockviewed-wrapper h2:not(.nc-viewed-title)::before {
  content: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%23941114' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='10'/><polyline points='12 6 12 12 16 14'/></svg>") " Twoja historia";
  display: flex !important;
  align-items: center !important;
  gap: 0.375rem !important;
  font-size: 12px !important;
  font-weight: 700 !important;
  text-transform: uppercase !important;
  letter-spacing: .1em !important;
  color: var(--nc-primary) !important;
  margin-bottom: 0.125rem !important;
  font-family: 'Poppins', system-ui, sans-serif !important;
}
#blockviewed-wrapper .titleborderh5 {
  display: block !important;
  position: static !important;
  z-index: auto !important;
  font-size: 18px !important;
  font-weight: 700 !important;
  line-height: 1.3 !important;
  color: var(--nc-fg) !important;
  text-transform: none !important;
  letter-spacing: normal !important;
  border: none !important;
  background: transparent !important;
  padding: 0 !important;
  /* float/height/margin-top — reszta reset'u #product .page-product-box
    .titleborderh5 z autoload/cv_custom.css (starokartowa "belka tabu",
    patrz identyczny problem przy #revws-section wcześniej w tym pliku)
    NIE była dotąd nadpisywana. Float wyciągał ten div z normalnego
    przepływu bez clearfixa (ta sekcja, w przeciwieństwie do zakładek
    #section-*, nie jest owinięta w .nc-tab-section, więc generyczny
    clearfix tamtych sekcji jej nie obejmuje) — karuzela "Ostatnio
    przeglądane" wjeżdżała wtedy na tytuł zamiast zacząć się pod nim,
    a sztywne height:47px/line-height:47px ucinało wyższy, 2-wierszowy
    tytuł. */
  float: none !important;
  height: auto !important;
  margin: 0 !important;
  left: auto !important;
  font-family: 'Poppins', system-ui, sans-serif !important;
}
@media (min-width: 640px) {
  #blockviewed-wrapper .titleborderh5 { font-size: 20px !important; }
}
#blockviewed-wrapper .titleborderh5::after {
  content: "Wróć do lamp, które wcześniej Cię zainteresowały — porównaj je obok siebie i wybierz tę idealną.";
  display: block !important;
  position: static !important;
  font-size: 13px !important;
  font-weight: 400 !important;
  color: var(--nc-muted-fg) !important;
  margin-top: 0.25rem !important;
  text-transform: none !important;
  letter-spacing: normal !important;
  font-family: 'Poppins', system-ui, sans-serif !important;
}

/* Karty produktów — target rzeczywisty HTML */
#blockviewed-wrapper .swiper-slide.product-box.item {
  display: flex !important;
  flex-direction: column !important;
  background: var(--nc-card) !important;
  border: 1px solid var(--nc-border) !important;
  border-radius: var(--nc-radius) !important;
  overflow: hidden !important;
  box-shadow: none !important;
  transition: box-shadow .15s, border-color .15s !important;
  padding: 0 !important;
}
@media (hover: hover) and (pointer: fine) {
#blockviewed-wrapper .swiper-slide.product-box.item:hover {
  box-shadow: var(--nc-shadow-card) !important;
  border-color: hsl(0 0% 60%) !important;
}
}


/* Obrazek */
#blockviewed-wrapper .product-image {
  display: block !important;
  aspect-ratio: 1/1 !important;
  background: var(--nc-product-bg) !important;
  overflow: hidden !important;
  flex-shrink: 0 !important;
}
#blockviewed-wrapper .product-image img {
  width: 100% !important;
  height: 100% !important;
  object-fit: contain !important;
  display: block !important;
  transition: transform .2s !important;
  margin: 0 !important;
  max-width: 100% !important;
}
@media (hover: hover) and (pointer: fine) {
#blockviewed-wrapper .swiper-slide:hover .product-image img {
  transform: scale(1.04) !important;
}
}


/* Nazwa — reset ALL CAPS (i wysokości narzuconej przez global.css #blockviewed_box.swiper-horizontal .product-name) */
#blockviewed-wrapper .product-name {
  height: auto !important;
  /* padding: 0.75rem 0.875rem 0 !important; */
  margin: 0 !important;
  border: none !important;
  overflow: hidden !important;
  text-transform: none !important;
}
#blockviewed-wrapper .product-name a {
  font-size: 14px !important;
  font-weight: 500 !important;
  line-height: 1.4 !important;
  color: var(--nc-fg) !important;
  text-decoration: none !important;
  /* Pisownia ustawiana w JS na treści węzła — ncTitleCase/applyTitleCase
    w nc-product.js (nie text-transform w CSS, nie umiałoby wyjątków
    typu "LED"). */
  display: -webkit-box !important;
  -webkit-line-clamp: 3 !important;
  line-clamp: 3 !important;
  -webkit-box-orient: vertical !important;
  overflow: hidden !important;
  text-overflow: ellipsis !important;
  text-transform: none !important;
}
@media (hover: hover) and (pointer: fine) {
#blockviewed-wrapper .product-name a:hover { text-decoration: underline !important; }
}

@media (max-width: 767px) {
  #blockviewed-wrapper .product-name a {
    -webkit-line-clamp: 3 !important;
    line-clamp: 3 !important;
    min-height: 4.2em !important;
    height: 4.2em !important;
  }
  #blockviewed-wrapper .price_display {
    flex-direction: row !important;
    align-items: baseline !important;
    justify-content: flex-start !important;
    gap: 0.375rem !important;
    min-height: 0 !important;
    height: auto !important;
  }
}

/* Cena — neutralizuje wysokość narzuconą przez global.css #blockviewed_box.swiper-horizontal .price_display;
  cena i przekreślona cena w jednym wierszu, dociśnięte do dołu karty */
#blockviewed-wrapper .price_display {
  height: auto !important;
  padding: 0.375rem 0.875rem 0.625rem !important;
  margin: 0 !important;
  margin-top: auto !important;
  border: none !important;
  background: transparent !important;
  display: flex !important;
  flex-direction: row !important;
  flex-wrap: nowrap !important;
  align-items: baseline !important;
  gap: 0.3rem !important;
  min-width: 0 !important;
}
#blockviewed-wrapper .price_display .price {
  order: -1 !important;
  font-size: 16px !important;
  font-weight: 700 !important;
  color: var(--nc-primary) !important;
  white-space: nowrap !important;
  flex-shrink: 0 !important;
}
#blockviewed-wrapper .price_display .old-price {
  order: 0 !important;
  font-size: 13px !important;
  color: var(--nc-muted-fg) !important;
  text-decoration: line-through !important;
  white-space: nowrap !important;
  overflow: hidden !important;
  text-overflow: ellipsis !important;
}
#blockviewed-wrapper br { display: none !important; }

/* Strzałki nawigacyjne — .round-arrow-button (Swiper PS6) */
#blockviewed-wrapper .round-arrow-button {
  width: 36px !important;
  height: 36px !important;
  min-width: 36px !important;
  border-radius: var(--nc-radius) !important;
  border: 1px solid var(--nc-border) !important;
  background: var(--nc-card) !important;
  box-shadow: none !important;
  display: flex !important;
  align-items: center !important;
  justify-content: center !important;
  cursor: pointer !important;
  transition: border-color .15s, background .15s !important;
  position: absolute !important;
  top: 1rem !important;
  transform: none !important;
  margin: 0 !important;
}
@media (hover: hover) and (pointer: fine) {
#blockviewed-wrapper .round-arrow-button:hover {
  background: var(--nc-card) !important;
  border-color: hsl(0 0% 70%) !important;
  box-shadow: 0 1px 3px hsl(0 0% 0% / .06) !important;
}
}

/* Ta sama specyficzność co #blockviewed-wrapper .nc-viewed-nav-btn.swiper-button-disabled
  wyżej w pliku (ID+2 klasy) — element ma OBIE klasy naraz, więc bez tego
  przedefiniowania tutaj (dalej w pliku = wygrywa) opacity:.35 z powrotem
  ściszałoby cały przycisk zamiast tylko ikony (patrz komentarz wyżej przy
  .nc-viewed-nav-btn.swiper-button-disabled). */
#blockviewed-wrapper .round-arrow-button.swiper-button-disabled {
  display: flex !important;
  opacity: 1 !important;
  background: var(--nc-card) !important;
  border-color: #f0f0f0 !important;
  cursor: default !important;
  pointer-events: none !important;
}
#blockviewed-wrapper .round-arrow-button.swiper-button-disabled svg {
  fill: hsl(0 0% 60%) !important;
}
#blockviewed-wrapper .swiper_blockviewed-button-left {
  right: 44px !important;
  left: auto !important;
}
#blockviewed-wrapper .swiper_blockviewed-button-right {
  right: 0 !important;
  left: auto !important;
}
#blockviewed-wrapper .swiper_blockviewed-button-left svg {
  transform: rotate(180deg) !important;
}

/* Swiper — nie może być positioning context; strzałki uciekają do inner wrapper */
#blockviewed-wrapper #blockviewed_box {
  position: static !important;
  overflow: hidden !important;
  padding-inline: 0 !important;
  background: var(--nc-secondary) !important;
}

/* ═══════════════════════════════════════════════════════════════
  BLOG "WIEDZA"
  ════════════════════════════════════════════════════════════ */

.nc-blog-section {
  padding-block: 2rem;
}
@media (min-width: 640px) { .nc-blog-section { padding-block: 2.5rem; } }

/* Nagłówek sekcji */
.nc-blog-header { margin-bottom: 1.5rem; }

.nc-blog-eyebrow {
  display: block;
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .18em;
  color: var(--nc-primary);
  margin-bottom: 0.25rem;
  font-family: 'Poppins', system-ui, sans-serif;
}

.nc-blog-title {
  font-size: 18px;
  font-weight: 700;
  color: var(--nc-fg);
  margin: 0 0 0.25rem;
  font-family: 'Poppins', system-ui, sans-serif;
}
@media (min-width: 640px) { .nc-blog-title { font-size: 20px; } }

.nc-blog-subtitle {
  font-size: 13px;
  color: var(--nc-muted-fg);
  margin: 0;
}

/* Mobile: slider poziomy (scroll-snap), karta ~82% szerokości żeby widoczny był
  skrawek kolejnej jako podpowiedź do przewijania. Od 640px w górę — z powrotem
  statyczny grid jak wcześniej (2 kolumny, 3 od 1024px), bez przewijania. */
.nc-blog-grid {
  display: flex;
  gap: 1.25rem;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  -webkit-overflow-scrolling: touch;
  padding-bottom: 0.25rem;
  scrollbar-width: none;
  cursor: grab;
}
.nc-blog-grid::-webkit-scrollbar { display: none; }
/* Przeciąganie myszą (bindów w nc-product.js) — na desktopie/w symulatorach
  mobile nie ma natywnych zdarzeń dotykowych, więc samo overflow-x:auto nie
  wystarcza do przewijania "chwyć i przesuń". */
.nc-blog-grid.nc-dragging {
  cursor: grabbing !important;
  scroll-snap-type: none !important;
  scroll-behavior: auto !important;
  user-select: none;
}
.nc-blog-card,
.nc-blog-card-img { -webkit-user-drag: none; }
@media (min-width: 640px) {
  .nc-blog-grid {
    display: grid;
    grid-template-columns: repeat(2, 1fr);
    overflow-x: visible;
    scroll-snap-type: none;
    padding-bottom: 0;
  }
}
@media (min-width: 1024px) { .nc-blog-grid { grid-template-columns: repeat(3, 1fr); } }

/* Karta artykułu — bez ramki/tła, treść leży bezpośrednio na tle strony;
  zaokrąglenie i przycinanie tylko na obrazku (patrz .nc-blog-card-img-wrap). */
.nc-blog-card {
  flex: 0 0 82%;
  scroll-snap-align: start;
  display: flex;
  flex-direction: column;
  text-decoration: none;
  color: var(--nc-fg);
  border: none;
  border-radius: 0;
  background: transparent;
  transition: opacity .15s;
}
@media (hover: hover) and (pointer: fine) {
.nc-blog-card:hover {
  opacity: .92;
  color: var(--nc-fg);
  text-decoration: none;
}
}


/* Obrazek — jedyny element z zaokrągleniem/przycięciem w karcie */
.nc-blog-card-img-wrap {
  aspect-ratio: 4/3;
  overflow: hidden;
  border-radius: var(--nc-radius);
  background: var(--nc-secondary);
  flex-shrink: 0;
}
.nc-blog-card-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
  transition: transform .3s ease;
}
@media (hover: hover) and (pointer: fine) {
.nc-blog-card:hover .nc-blog-card-img { transform: scale(1.04); }
}


/* Treść karty — bez poziomego paddingu, wyrównana do krawędzi obrazka */
.nc-blog-card-body {
  padding: 0.875rem 0 0;
  display: flex;
  flex-direction: column;
  gap: 0.375rem;
  flex: 1;
}

/* Kategoria */
.nc-blog-card-cat {
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--nc-primary);
}

/* Tytuł artykułu */
.nc-blog-card-title {
  font-size: 15px;
  font-weight: 700;
  line-height: 1.4;
  color: var(--nc-fg);
  margin: 0;
}

/* Opis */
.nc-blog-card-desc {
  font-size: 13px;
  line-height: 1.65;
  color: var(--nc-muted-fg);
  margin: 0;
  flex: 1;
}

/* CTA link */
.nc-blog-card-cta {
  display: inline-flex;
  align-items: center;
  gap: 0.375rem;
  font-size: 13px;
  font-weight: 600;
  color: var(--nc-fg);
  margin-top: 0.375rem;
  text-decoration: underline;
  text-underline-offset: 2px;
}
@media (hover: hover) and (pointer: fine) {
.nc-blog-card:hover .nc-blog-card-cta { color: var(--nc-primary); }
}


/* Informacja o producencie (GPSR) — mały, jasnoszary tekst pod sekcją */
.nc-blog-footnote {
  margin: 1.5rem 0 0;
  font-size: 12px;
  color: hsl(0 0% 60%);
}
.nc-blog-footnote a {
  color: hsl(0 0% 60%);
  text-decoration: underline;
  text-underline-offset: 2px;
}
@media (hover: hover) and (pointer: fine) {
.nc-blog-footnote a:hover { color: hsl(0 0% 40%); }
}



/* ═══════════════════════════════════════════════════════════════
  BULB SECTION INLINE  (nc-bsi-*)
  Sekcja "Żarówki do tej lampy" — poziomy scroll kart
  ═══════════════════════════════════════════════════════════════ */

/* ── Nagłówek ── */
/* Grid, nie flex: eyebrow+tytuł w kolumnie 1 (wiersze 1-2), strzałki nav
  w kolumnie 2 (obok, na tej samej wysokości co eyebrow+tytuł), a podtytuł
  w osobnym, PEŁNOSZEROKIM wierszu 3 pod spodem (grid-column: 1/-1) —
  niezależnie od szerokości zajętej przez nav. .nc-bsi-header-text jest
  przez display:contents "spłaszczony": jego dzieci (eyebrow/tytuł/
  podtytuł) stają się bezpośrednimi elementami tej siatki, więc każde z
  nich można umieścić w innym wierszu/kolumnie. Wcześniej (display:flex,
  header-text jako jeden blok obok nav) podtytuł był ograniczony do
  szerokości header-text (całość minus miejsce na strzałki) i się nie
  "ciągnął" pod przyciskami, mimo że tam było wolne miejsce. */
.nc-bsi-header {
  display: grid;
  grid-template-columns: 1fr auto;
  column-gap: 1rem;
  row-gap: 0.25rem;
  align-items: start;
  margin-bottom: 1rem;
}

.nc-bsi-header-text { display: contents; }

.nc-bsi-eyebrow {
  grid-column: 1;
  grid-row: 1;
  display: inline-flex;
  align-items: center;
  gap: 0.4rem;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: .1em;
  color: var(--nc-primary);
  margin-bottom: 0;
}

.nc-bsi-title {
  grid-column: 1;
  grid-row: 2;
  font-size: 18px !important;
  font-weight: 700 !important;
  color: var(--nc-fg) !important;
  margin: 0 !important;
  padding: 0 !important;
  border: none !important;
  box-shadow: none !important;
  background: none !important;
  line-height: 1.3 !important;
}
@media (min-width: 640px) { .nc-bsi-title { font-size: 20px !important; } }

.nc-bsi-subtitle {
  grid-column: 1 / -1;
  grid-row: 3;
  font-size: 13px;
  color: var(--nc-muted-fg);
  margin: 0;
  line-height: 1.55;
}

/* ── Strzałki nav ── */
.nc-bsi-nav {
  grid-column: 2;
  grid-row: 1 / span 2;
  align-self: start;
  display: flex;
  gap: 0.5rem;
  flex-shrink: 0;
}

.nc-bsi-nav-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 4.5rem;
  height: 4.5rem;
  border-radius: var(--nc-radius);
  border: 1px solid var(--nc-border);
  background: #fff;
  cursor: pointer;
  transition: border-color .2s, background .2s;
  padding: 0;
  color: var(--nc-fg);
}
@media (hover: hover) and (pointer: fine) {
.nc-bsi-nav-btn:hover { border-color: var(--nc-primary); background: var(--nc-secondary); }
}

/* Ikona ma inline width/height="24px" w markupie (bulb-section-inline.tpl)
  — nadpisujemy, żeby dorównać powiększonym strzałkom w innych sliderach. */
.nc-bsi-nav-btn svg { width: 26px !important; height: 26px !important; }
.nc-bsi-nav-btn--disabled,
.nc-bsi-nav-btn:disabled { opacity: .35; cursor: default; }

/* ── Filter tabs: override for inline context ── */
#section-zarowki .nc-bsi-filter-tabs {
  margin-bottom: 1rem;
}
/* Stała szerokość zakładek (trochę większa niż domyślna, dopasowana do treści) —
  zamiast auto-sizingu do zawartości. */
#nc-bsi-filter-tabs.nc-bsi-filter-tabs .nc-temp-tab {
  width: 160px;
  flex: 0 0 auto;
}
/* Mobile: 3 × 160px się nie mieści w jednym wierszu (łamie się do kolejnej linii).
  Zakładki dzielą pełną szerokość rzędu na TRZY równe kolumny (docelowa liczba
  przycisków), niezależnie od tego, ile faktycznie się renderuje — przy 1 lub 2
  dostępnych barwach zakładki mają zostać tej samej szerokości, co przy 3,
  wyrównane do lewej (justify-content:flex-start, wartość domyślna flexa),
  zamiast rozciągać się i dzielić dostępną przestrzeń po równo (flex:1 1 0
  dawało np. dwa przyciski po 50% szerokości zamiast 1/3 każdy). */
@media (max-width: 639px) {
  #section-zarowki .nc-bulbs-temp-tabs.nc-bsi-filter-tabs {
    display: flex;
    width: 100%;
    flex-wrap: nowrap;
  }
  #nc-bsi-filter-tabs.nc-bsi-filter-tabs .nc-temp-tab {
    width: auto;
    flex: 0 0 calc((100% - 2 * 0.5rem) / 3);
    min-width: 0;
    padding-left: 0.5rem;
    padding-right: 0.5rem;
  }
}

/* ── Scroll track ── */
.nc-bsi-track-wrap {
  overflow: hidden;
}

.nc-bsi-track {
  display: flex;
  gap: 1rem;
  overflow-x: auto;
  scroll-snap-type: x mandatory;
  scroll-behavior: smooth;
  padding-bottom: 0.5rem;
  -webkit-overflow-scrolling: touch;
}
/* hide scrollbar */
.nc-bsi-track::-webkit-scrollbar { display: none; }
.nc-bsi-track { scrollbar-width: none; }

/* ── Karta ── */
.nc-bsi-card {
  flex: 0 0 180px;
  width: 180px;
  scroll-snap-align: start;
  display: flex;
  flex-direction: column;
  border: none;
  border-radius: var(--nc-radius);
  overflow: hidden;
  background: var(--nc-card);
  transition: box-shadow .2s;
}
/* Poniżej 480px bazowa reguła wyżej (stała szerokość 180px) dawała
  niedeterministyczną liczbę widocznych kart zależnie od szerokości
  ekranu (na typowym telefonie wychodziło ~2 + wąski skrawek trzeciej).
  Wymuszamy dokładnie 2,5 karty widocznej — ta sama formuła co
  .dfwidget-card w Inspiracjach/Serii: (100% - (n-1)*gap) / n, dla n=2,5
  i gap=1rem (.nc-bsi-track { gap: 1rem }). */
@media (max-width: 480px) {
  .nc-bsi-card {
    flex: 0 0 calc((100% - 24px) / 2.5);
    width: calc((100% - 24px) / 2.5);
  }
}
/* Progresywnie w stronę 5 kart w rzędzie na pełnej szerokości kontenera
  (ten sam schemat co .dfwidget-card w Inspiracjach) */
@media (min-width: 480px) { .nc-bsi-card { flex: 0 0 calc(50% - 0.5rem - 10px);     width: calc(50% - 0.5rem - 10px); } }
@media (min-width: 640px) { .nc-bsi-card { flex: 0 0 calc(33.333% - 0.667rem - 10px); width: calc(33.333% - 0.667rem - 10px); } }
@media (min-width: 900px) { .nc-bsi-card { flex: 0 0 calc(25% - 0.75rem - 10px);    width: calc(25% - 0.75rem - 10px); } }
@media (min-width: 1100px) { .nc-bsi-card { flex: 0 0 calc(20% - 0.8rem - 10px);     width: calc(20% - 0.8rem - 10px); } }
@media (hover: hover) and (pointer: fine) {

.nc-bsi-card:hover { box-shadow: none; }
}


.nc-bsi-card-img-link { display: block; position: relative; }

.nc-bsi-card-badge {
  position: absolute;
  top: 0.5rem;
  left: 0.5rem;
  z-index: 1;
  border-radius: 5px !important;
  padding: 0.1875rem 0.5rem !important;
  font-weight: 600 !important;
  margin-bottom: 0;
}

.nc-bsi-card-img {
  width: 100%;
  aspect-ratio: 1 / 1;
  object-fit: contain;
  background: #fcfbfa;
}

/* ── Treść karty ── */
.nc-bsi-card-body {
  display: flex;
  flex-direction: column;
  gap: 0.35rem;
  padding: 0.65rem 0.75rem 0.75rem;
  flex: 1;
}

.nc-bsi-card-name {
  display: -webkit-box;
  -webkit-line-clamp: 3;
  -webkit-box-orient: vertical;
  overflow: hidden;
  font-size: 13px;
  font-weight: 500;
  line-height: 1.4;
  color: var(--nc-fg);
  text-decoration: none;
  /* Pisownia ustawiana w JS na treści węzła — ncTitleCase/applyTitleCase
    w nc-product.js (nie text-transform w CSS, nie umiałoby wyjątków
    typu "LED"). */
}
@media (hover: hover) and (pointer: fine) {
.nc-bsi-card-name:hover { text-decoration: underline; color: var(--nc-fg); }
}


/* ── Meta: barwa + tech ── */
.nc-bsi-card-meta {
  display: flex;
  flex-direction: column;
  gap: 0.15rem;
  margin-top: 0.1rem;
}

.nc-bsi-card-meta-temp {
  font-size: 11px;
  font-weight: 400;
  color: var(--nc-muted-fg);
  line-height: 1.4;
  text-transform: none;
  letter-spacing: normal;
}

.nc-bsi-card-meta-tech {
  font-size: 11px;
  color: var(--nc-muted-fg);
  line-height: 1.4;
}

/* ── Footer karty: cena + koszyk ── */
.nc-bsi-card-footer {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 0.5rem;
  margin-top: auto;
  padding-top: 0.5rem;
}

.nc-bsi-card-price-wrap { display: flex; flex-direction: column; gap: 0; }

.nc-bsi-card-price {
  font-size: 16px;
  font-weight: 700;
  line-height: 1.25;
  color: rgb(0, 0, 0);
  white-space: normal;
}
.nc-bsi-card-price-qty {
  font-size: 12px;
  font-weight: 600;
  color: rgb(0, 0, 0);
  white-space: nowrap;
}

.nc-bsi-card-price-unit {
  display: block;
  font-size: 11px;
  font-weight: 400;
  color: var(--nc-muted-fg);
  line-height: 1.3;
  margin-top: 1px;
}

/* ── Przycisk koszyka — pełna szerokość, outline bordo ── */
.nc-bsi-card-add-full {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 3.75rem;
  margin-top: 0.375rem;
  border: 1px solid #951bc4;
  border-radius: 8px;
  background: transparent;
  color: #951bc4;
  font-size: 12px;
  font-weight: 600;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  transition: background .15s, color .15s;
  font-family: inherit;
}
@media (hover: hover) and (pointer: fine) {
.nc-bsi-card-add-full:hover {
  background: #951bc4;
  color: #fff;
  text-decoration: none;
}
}


/* ═══════════════════════════════════════════════
  RATING CAPTAIN — widget inline (tylko tekst, bez ramki)
  TYMCZASOWO WYŁĄCZONE (2026-09, powrót do revws — patrz komentarz przy
  initRevwsMove w nc-product.js) — każda reguła zakomentowana osobno
  (CSS nie zagnieżdża komentarzy, więc jeden wspólny blok komentarza na
  całość nie zadziałałby przez opisowe komentarze jednolinijkowe w
  środku — zamknąłby się przedwcześnie na pierwszym z nich), nie
  usunięta, dla łatwego powrotu do RC.
  ═══════════════════════════════════════════════ */

/* Zmniejsz gap w identity — 1rem tworzy duże przerwy gdy iframe wyrasta do 52px */
/*
#nc-product-page .nc-product-identity {
  gap: 0.75rem !important;
}
*/

/* Rating row — wyśrodkowany, bez pionowych przerw */
/*
#nc-product-page .nc-rating-row {
  margin: 0 !important;
  padding: 0 !important;
  gap: 0 0.5rem !important;
}
*/

/* Wrapper — wyrównany w pionie z resztą rating-row; flex: 0 0 auto żeby nie rozciągał się na całą linię */
/*
#nc-product-page .nc-rc-widget-wrap {
  display: inline-flex !important;
  align-items: center !important;
  flex: 0 0 auto !important;
  line-height: 0 !important;
}
*/

/* RC iframe ma wstrzykniętý inline "width:100%" — nadpisujemy, żeby nie rozciągał flex row */
/*
#nc-product-page .nc-rc-widget-wrap iframe {
  width: auto !important;
  max-width: 200px !important;
}
*/

/* [data-widget] div też ma być tylko tak szeroki jak treść */
/*
#nc-product-page .nc-rc-widget-wrap [data-widget] {
  width: 160px !important;
  display: inline-block !important;
}
*/

/* Kontener widgetu — usuń box, tło, ramkę */
/*
#nc-product-page .nc-rc-widget-wrap [data-widget] > *,
#nc-product-page .nc-rc-widget-wrap .rc-widget,
#nc-product-page .nc-rc-widget-wrap .widget-container,
#nc-product-page .nc-rc-widget-wrap .rc-widget-container,
#nc-product-page .nc-rc-widget-wrap .ratingcaptain-widget {
  background: transparent !important;
  border: none !important;
  box-shadow: none !important;
  border-radius: 0 !important;
  padding: 0 !important;
  margin: 0 !important;
  display: inline-flex !important;
  align-items: center !important;
  gap: 0.375rem !important;
}
*/

/* Wynik numeryczny (4.71) */
/*
#nc-product-page .nc-rc-widget-wrap .rc-score,
#nc-product-page .nc-rc-widget-wrap .rc-rating-score,
#nc-product-page .nc-rc-widget-wrap [class*="score"],
#nc-product-page .nc-rc-widget-wrap [class*="rating-value"] {
  font-size: 14px !important;
  font-weight: 700 !important;
  color: var(--nc-fg) !important;
  line-height: 1 !important;
}
*/

/* Liczba opinii */
/*
#nc-product-page .nc-rc-widget-wrap .rc-reviews-count,
#nc-product-page .nc-rc-widget-wrap [class*="count"],
#nc-product-page .nc-rc-widget-wrap [class*="reviews"] {
  font-size: 14px !important;
  color: var(--nc-muted-fg) !important;
  line-height: 1 !important;
}
*/

/* Gwiazdki — kolor złoty jak revws */
/*
#nc-product-page .nc-rc-widget-wrap [class*="star"],
#nc-product-page .nc-rc-widget-wrap .rc-stars {
  color: hsl(38 95% 52%) !important;
  fill: hsl(38 95% 52%) !important;
}
*/

.padding div:last-child {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
  font-size: 14px !important;
  line-height: 20px !important;
  letter-spacing: -0.1px !important;
  color: #951bc4 !important;
}

/* ═══════════════════════════════════════════════
  UKRYJ moduł "Produkty z tej samej serii" (blockproductscategory)
  — zastąpiony przez własną sekcję "Z tej samej serii" z Doofinder
  ═══════════════════════════════════════════════ */
#nc-product-page .page-product-box.blockproductscategory { display: none !important; }

/* .gmgapser (moduł gmgapser, GPSR — "Dane producenta") — renderowany
  przez {$HOOK_PRODUCT_FOOTER} w product.tpl, gdzie ląduje razem z inną
  treścią (szuflada żarówek); JS (initGmgapserMove w nc-product.js)
  przenosi go do #nc-gmgapser-slot pod sekcją "Wiedza" — dokładnie tam,
  gdzie na starej karcie stoi link "Dane producenta". Styl bazowy
  (spacing/well) już dostarcza cv_custom.css (autoload, sitewide) —
  tutaj tylko dopasowanie typografii do .nc-blog-footnote. */
#nc-gmgapser-slot:empty { display: none; }
.gmgapser > a {
  font-family: 'Poppins', system-ui, sans-serif;
  font-size: 12px;
  color: hsl(0 0% 60%);
  text-decoration: underline;
  text-underline-offset: 2px;
  cursor: pointer;
}
@media (hover: hover) and (pointer: fine) {
.gmgapser > a:hover { color: hsl(0 0% 40%); }
}

.gmgapser .well {
  font-family: 'Poppins', system-ui, sans-serif;
  font-size: 12.5px;
  line-height: 1.6;
  color: hsl(0 0% 30%);
  background: var(--nc-secondary);
  border: 1px solid var(--nc-border);
  border-radius: var(--nc-radius);
}
.gmgapser .well b { color: var(--nc-fg); }
.gmgapser .well a { color: var(--nc-primary); }

/* ═══════════════════════════════════════════════
  FIXUPS v18 — wagi czcionek (nadpisanie Font Ninja)
  Font Ninja podmienia font-weight/font-family przez własne klasy
  (.fontsninja-font, data-ninja-font) — !important + wysoka specyficzność
  wygrywa niezależnie od tego, w jakiej kolejności ładują się arkusze.
  ═══════════════════════════════════════════════ */

/* Omnibus ("Najniższa cena z 30 dni...") — tekst bazowy Regular, wartość (span) Medium */
#nc-product-page .nc-price-omnibus {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
}
#nc-product-page .nc-price-omnibus-val {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 500 !important;
}

/* Social proof ("18 osób kupiło") — Poppins Regular, liczba (strong) Semibold */
#nc-product-page .nc-social-proof {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
}
#nc-product-page .nc-social-proof strong,
#nc-product-page .nc-social-proof b {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 600 !important;
}

/* Tytuł produktu (h1) — Poppins Bold */
#nc-product-page h1.nc-product-title {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 700 !important;
}

/* Cena aktualna — Poppins Bold */
#nc-product-page .nc-price-current {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 700 !important;
}

/* Etykieta wariantu ("Kolor: biały") — klucz Semibold, wartość Medium */
#nc-product-page .nc-xs-label-key {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 600 !important;
}
#nc-product-page .nc-xs-label-val {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 500 !important;
}

/* "Powiadom o dostawie" — Poppins Medium */
#nc-product-page .mailalerts-modal-button,
#nc-product-page .mailalerts-modal-button span {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 500 !important;
}

/* ═══════════════════════════════════════════════
  FIXUPS v19 — zgodność typografii z Lovable (źródło prawdy:
  /home/jakubb/www/lovable/src/components/*.tsx)
  Część rozjazdów to realne pomyłki w wartościach (złe rozmiary/wagi
  względem oryginału), część to podejrzenie ingerencji wtyczki Font
  Ninja (patrz FIXUPS v18) — stąd bezwarunkowe wymuszenie font-family +
  letter-spacing:normal nawet tam, gdzie liczby już się zgadzały.
  ═══════════════════════════════════════════════ */

/* Reset — Poppins + normalny letter-spacing (nadpisany niżej tam, gdzie
  Lovable faktycznie zakłada tracking, np. eyebrow/section-title). */
#nc-product-page .nc-price-omnibus,
#nc-product-page .nc-price-omnibus-val,
#nc-product-page .nc-price-current,
#nc-product-page .nc-price-old,
#nc-product-page .nc-rating-value,
#nc-product-page .nc-rating-count,
#nc-product-page .nc-social-proof,
#nc-product-page .nc-xs-label-key,
#nc-product-page .nc-xs-label-val,
#nc-product-page .nc-desc-heading,
#nc-product-page .nc-tab-btn,
#nc-product-page .nc-section-title,
#nc-product-page .nc-section-subtitle,
#nc-product-page .nc-inspiracje-eyebrow,
#nc-product-page .nc-seria-eyebrow,
#nc-product-page .nc-viewed-eyebrow,
#nc-product-page .nc-viewed-title,
#nc-product-page .nc-viewed-subtitle,
#nc-product-page .nc-bsi-eyebrow,
#nc-product-page .nc-bsi-title,
#nc-product-page .nc-bsi-subtitle,
#nc-product-page .nc-bsi-card-name,
#nc-product-page .nc-bsi-card-meta-temp,
#nc-product-page .nc-bsi-card-meta-tech,
#nc-product-page .nc-bsi-card-price,
#nc-product-page .nc-bsi-card-price-label,
#nc-product-page .nc-temp-tab-name,
#nc-product-page .nc-temp-tab-desc,
#nc-product-page .nc-bulb-value-badge {
  font-family: 'Poppins', system-ui, sans-serif !important;
  letter-spacing: normal !important;
}

/* Stara (przekreślona) cena — Poppins Regular, jak reszta ceny */
#nc-product-page .nc-price-old { font-weight: 400 !important; }

/* Social proof — Lovable text-[13px] sm:text-[13.5px] */
@media (min-width: 640px) {
  #nc-product-page .nc-social-proof { font-size: 13.5px !important; }
}

/* Blok Opis/Dane techniczne — nagłówek h2: Lovable text-xl(20px) mb-5(1.25rem) */
#nc-product-page .nc-desc-heading {
  font-size: 20px !important;
  margin: 0 0 1.25rem !important;
}

/* Pasek zakładek (Opis/Dane techniczne/...) — Lovable text-[15px] sm:text-base */
#nc-product-page .nc-tab-btn { font-size: 15px !important; }
@media (min-width: 640px) {
  #nc-product-page .nc-tab-btn { font-size: 16px !important; }
}

/* Nagłówki sekcji sliderów (Inspiracje/Seria) — Lovable text-xl sm:text-2xl
  font-bold tracking-tight (20/24px, -0.025em) */
#nc-product-page .nc-section-title {
  font-size: 20px !important;
  letter-spacing: -0.025em !important;
}
@media (min-width: 640px) {
  #nc-product-page .nc-section-title { font-size: 24px !important; }
}
#nc-product-page .nc-section-subtitle { font-size: 13px !important; }
@media (min-width: 640px) {
  #nc-product-page .nc-section-subtitle { font-size: 14px !important; }
}

/* Eyebrow nad tytułem sekcji (Skompletuj wnętrze / Zobacz także / Twoja
  historia / Akcesoria) — Lovable text-[13px] sm:text-[14px] font-bold
  tracking-[0.22em] uppercase, identyczne we wszystkich sliderach. */
#nc-product-page .nc-inspiracje-eyebrow,
#nc-product-page .nc-seria-eyebrow,
#nc-product-page .nc-viewed-eyebrow,
#nc-product-page .nc-bsi-eyebrow {
  font-size: 13px !important;
  letter-spacing: .22em !important;
}
@media (min-width: 640px) {
  #nc-product-page .nc-inspiracje-eyebrow,
  #nc-product-page .nc-seria-eyebrow,
  #nc-product-page .nc-viewed-eyebrow,
  #nc-product-page .nc-bsi-eyebrow {
    font-size: 14px !important;
  }
}

/* Ostatnio przeglądane / Żarówki — te same rozmiary tytułu/podtytułu co
  .nc-section-title/.nc-section-subtitle wyżej, tylko osobne klasy. */
#nc-product-page .nc-viewed-title,
#nc-product-page .nc-bsi-title {
  font-size: 20px !important;
  letter-spacing: -0.025em !important;
}
@media (min-width: 640px) {
  #nc-product-page .nc-viewed-title,
  #nc-product-page .nc-bsi-title {
    font-size: 24px !important;
  }
}
#nc-product-page .nc-viewed-subtitle,
#nc-product-page .nc-bsi-subtitle {
  font-size: 13px !important;
}
@media (min-width: 640px) {
  #nc-product-page .nc-viewed-subtitle,
  #nc-product-page .nc-bsi-subtitle {
    font-size: 14px !important;
  }
}

/* Filtr barwy w sliderze żarówek — Lovable font-semibold (600), nie bold (700) */
#nc-product-page .nc-temp-tab-name { font-weight: 600 !important; }

/* Cena na karcie żarówki — Lovable font-extrabold (800), nie bold (700) */
#nc-product-page .nc-bsi-card-price { font-weight: 800 !important; }

/* Etykiety wartości (Polecane/Dobra cena/Premium) — Lovable font-semibold
  (600) tracking-wide (~0.025em), nie bold (700) z .04em */
#nc-product-page .nc-bulb-value-badge {
  font-weight: 600 !important;
  letter-spacing: .025em !important;
}

.bottom-logos {
    display: none;
}

.sticky .header-container {
      margin-bottom: 126.94px !important;
}

.fancybox__caption {
  display: none;
}

/* Podpowiedź dla przeglądarki, żeby tor slajdów, pojedyncze slajdy i pasek
  miniatur od razu dostały własną warstwę kompozycji GPU (biblioteka i tak
  pozycjonuje je przez translate3d, ale bez will-change/backface-visibility
  przeglądarka mobilna potrafiła dociągać tę warstwę dopiero w trakcie
  pierwszego przesunięcia — stąd mikrozacięcie widoczne akurat pod koniec
  pierwszych przejść między zdjęciami). */
.fancybox__track,
.fancybox__slide,
.fancybox__thumbs .f-thumbs__track {
  will-change: transform;
  backface-visibility: hidden;
}

/* ═══════════════════════════════════════════════
  FANCYBOX LIGHTBOX — overrides
  Tło modala na beżowe (zgodnie z prośbą)
  ═══════════════════════════════════════════════ */

/* 1. Tło modala — konkretny szaro-beżowy odcień podany wprost przez
      użytkownika (zmierzony z realnego renderu Fancyboksa). Ta sama wartość
      na mobile i desktop. */
html.with-fancybox .fancybox__container {
  --fancybox-bg: rgb(227, 224, 221);
}
html.with-fancybox .fancybox__backdrop {
  --fancybox-bg: rgb(227, 224, 221);
}

/* Strzałki prev/next na krańcach galerii (pierwsze/ostatnie zdjęcie) —
  Fancybox (Carousel: {infinite:false}, patrz initFancybox w nc-product.js)
  samo dodaje natywny atrybut [disabled] i tylko przygasza ikonę
  (fancybox.css: ".f-button[disabled] svg { opacity: var(--f-button-svg-
  disabled-opacity) }") — sam przycisk zostaje w pełni widoczny jako
  wyszarzony kafelek. Chcemy, żeby w tym stanie znikał całkowicie. */
.fancybox__nav .f-button:disabled,
.f-carousel__nav .f-button:disabled {
  display: none !important;
}

/* ═══════════════════════════════════════════════
  FIXUPS — mobilny widok powiększenia zdjęcia (Fancybox modal)
  Uwaga: modal Fancyboksa jest dopinany do <body>, NIE do #nc-product-page
  (poza naszym DOM) — stąd brak scope'owania przez #nc-product-page.
  Tylko mobilka — desktop świadomie bez zmian względem stanu wcześniejszego.
  ═══════════════════════════════════════════════ */
@media (max-width: 1023px) {
  /* Biały pasek na samej górze modala (nagłówek z licznikiem i przyciskiem zamknięcia) */
  .fancybox__toolbar {
    position: absolute !important;
    top: 0 !important;
    left: 0 !important;
    right: 0 !important;
    width: 100% !important;
    height: 48px !important;
    background: #ffffff !important;
    border-bottom: 1px solid #e4e4e4 !important;
    padding: 0 1rem !important;
    display: flex !important;
    align-items: center !important;
    justify-content: space-between !important;
    z-index: 30 !important;
    box-sizing: border-box !important;
    pointer-events: auto !important;
  }

  .fancybox__toolbar__column {
    display: flex !important;
    align-items: center !important;
  }

  .fancybox__infobar {
    display: inline-flex !important;
    align-items: center !important;
    font-size: 15px !important;
    letter-spacing: -0.4px !important;
    padding: 0 2px !important;
    border-radius: 7px !important;
    backdrop-filter: blur(4px) !important;
    -webkit-backdrop-filter: blur(4px) !important;
    line-height: 1 !important;
    margin: 0 !important;
    text-shadow: none !important;
    font-variant-numeric: tabular-nums !important;
    height: 3rem !important;
  }
  /* Font Ninja wstrzykuje data-ninja-font i wymusza nim Segoe UI —
    !important + font-family tutaj to nadpisuje (ten sam mechanizm co
    FIXUPS v18/v19 gdzie indziej w tym pliku). Jednolita waga (Poppins
    Medium) dla całego licznika — pogrubiony bieżący numer wyglądał
    niepotrzebnie ciężko na tle reszty. */
  .fancybox__infobar [data-fancybox-current-index] {
    font-family: 'Poppins', system-ui, sans-serif !important;
    font-weight: 500 !important;
    color: #1F1F1F !important;
  }
  .fancybox__infobar fontsninja-text,
  .fancybox__infobar [data-fancybox-count] {
    font-family: 'Poppins', system-ui, sans-serif !important;
    font-weight: 500 !important;
    color: #1F1F1F !important;
  }

  .fancybox__toolbar .f-button {
    border-radius: 6px !important;
    width: 40px !important;
    height: 40px !important;
  }

  .fancybox__toolbar .f-button svg {
    stroke: #333333 !important;
    width: 18px !important;
    height: 18px !important;
  }

  /* Odstęp i maksymalne powiększenie zdjęcia — pod pakiem górnym.
    Boki/dół celowo tylko 3px — zdjęcie ma wypełniać szerokość lub
    wysokość ekranu + dokładnie te 3px, nie więcej (górny odstęp
    54px zostaje, to miejsce na pasek z licznikiem/zamknięciem). */
  .fancybox__slide.has-image {
    padding: 54px 3px 3px !important;
    background-color: rgb(248, 245, 242);
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    box-sizing: border-box !important;
  }

  .fancybox__slide.has-image > .fancybox__content {
    width: 100% !important;
    height: 100% !important;
    max-width: 100% !important;
    max-height: 100% !important;
    margin: 0 !important;
    padding: 0 !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    background: transparent !important;
  }

  .fancybox__slide.has-image .fancybox-image,
  .fancybox__slide.has-image > .fancybox__content > img {
    width: 100% !important;
    height: 100% !important;
    max-width: 100% !important;
    max-height: 100% !important;
    object-fit: contain !important;
  }
}

/* Desktop — licznik ukryty */
@media (min-width: 1024px) {
  .fancybox__infobar {
    display: none;
  }
}

/* ═══════════════════════════════════════════════
  FANCYBOX — WŁASNA szyna miniatur (.nc-fb-thumbs)
  Zastępuje wbudowany, wirtualizowany plugin biblioteki (Thumbs:'classic',
  teraz Thumbs:false w footer.tpl) — ten usuwał/dodawał <img> poza wąskim
  oknem widoczności i repozycjonował resztę inline stylem `top` na każdej
  klatce scrolla, co dawało "przeskakiwanie" + biały błysk niezależnie od
  tuningu friction/dragFriction/preload (patrz initFancyboxCustomThumbs w
  nc-product.js — pełne wyjaśnienie tam). Markup budowany w JS (ten sam
  plik, ta sama funkcja), doklejany do `.fancybox__footer` (SIBLING
  `.fancybox__carousel`, patrz bazowy szablon biblioteki — stąd stretch na
  całą wysokość modala w trybie pionowym poniżej, bez potrzeby własnego
  position:fixed/height:100vh).

  Dwa tryby, ten sam próg co przełączenie samego `.fancybox__container`
  na `flex-direction:row-reverse` (patrz reguła wyżej w tym pliku,
  min-width:640px) — poniżej tego progu pasek leży POD zdjęciem (poziomy,
  footer jest ostatnim blokiem w kolumnowym układzie), powyżej z BOKU
  (pionowy, footer staje się kolumną obok karuzeli w wierszu row-reverse).
  ═══════════════════════════════════════════════ */

.nc-fb-thumbs {
  scrollbar-width: none;
  -webkit-overflow-scrolling: touch;
  scroll-behavior: smooth;
}
.nc-fb-thumbs::-webkit-scrollbar { display: none; }

.nc-fb-thumb {
  display: block;
  flex-shrink: 0;
  padding: 0;
  margin: 0;
  border-radius: 8px;
  overflow: hidden;
  border: 1.5px solid #e5e7eb;
  background-color: #fafafa;
  cursor: pointer;
  transition: border-color 0.15s ease;
}
.nc-fb-thumb.is-active {
  /* Wartość wprost, NIE var(--nc-primary) — ta zmienna jest zdefiniowana
    tylko na #nc-product-page/.nc-modal/itp. (patrz DESIGN TOKENS na
    początku tego pliku), a modal Fancyboksa jest doklejany bezpośrednio
    do <body>, poza tym zakresem. Niezdefiniowany var() bez fallbacku
    czyni całą deklarację "guaranteed-invalid" — border-color spada wtedy
    na wartość początkową (currentColor, czyli de facto czarny), stąd
    zgłoszona czarna zamiast bordowej ramka aktywnej miniatury. */
  border-color: hsl(283 76% 43.7%);
  border-width: 2px;
}
.nc-fb-thumb-img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  /* Zdjęcia "home_default" bywają pionowe (np. 270×335), podczas gdy
    produkt (np. szeroki żyrandol) jest wizualnie osadzony nisko w kadrze
    (długi pręt montażowy u góry, klosze/kule u dołu) — domyślne
    object-position:50% 50% przycina symetrycznie góra/dół, obcinając
    więcej z dołu (gdzie jest właściwa treść) niż z pustego pręta u góry.
    35% zamiast 50% przesuwa punkt odniesienia w dół kadru, zostawiając
    więcej dolnej części widoczną kosztem pustego marginesu u góry. */
  object-position: center 50%;
  display: block;
  /* Tło #fafafa bezpośrednio na <img> (nie tylko na .nc-fb-thumb pod
    spodem) — w krótkiej chwili między wstawieniem elementu a zdekodowaniem
    jego src przeglądarka prześwituje przez PUSTY (domyślnie biały)
    obszar <img>, widoczny jako krótki błysk (ten sam efekt, który
    zgłaszał "biały pasek" przy wbudowanym pasku biblioteki). Tu jest już
    w praktyce nieistotny — WSZYSTKIE miniatury są zamontowane od razu
    (żadnej wirtualizacji/podmiany src), więc dekodują się raz, przy
    pierwszym otwarciu — ale zostaje jako zabezpieczenie na wolniejszych
    urządzeniach/połączeniach.  */
  background-color: #fafafa;
}

/* --- Pasek POZIOMY (mobile/wąski desktop, <640px) --- */
@media (max-width: 639px) {
  .nc-fb-thumbs {
    width: 100%;
    overflow-x: auto;
    overflow-y: hidden;
  }
  .nc-fb-thumbs-track {
    display: flex;
    gap: 8px;
    padding: 12px 16px;
  }
  /* ~4,5 kafla widoczne naraz — ten sam wzorzec co .nc-thumb-btn w pasku
    miniatur galerii mobilnej (nc-gallery-thumbs-row) niżej w tym pliku:
    piąty kafel naturalnie "docięty", czytelny sygnał że da się przewinąć
    dalej, bez dodatkowej ikony/podpowiedzi. */
  .nc-fb-thumb {
    width: calc((100vw - 32px - 4 * 8px) / 4.5);
    height: calc((100vw - 32px - 4 * 8px) / 4.5);
  }
}

/* --- Szyna PIONOWA (desktop, >=640px) ---
  Rozmiar kafla dostosowuje się do wysokości ekranu, żeby pionowo
  mieściło się ok. 4,5 miniatury naraz (ten sam "peek" co w pasku
  poziomym, tylko liczony z wysokości) — --f-thumb-size na szynie steruje
  naraz jej własną szerokością i wymiarami każdego kafla, zawsze się
  zgadzają. 16px 0 pionowego paddingu szyny odjęte w formule; clamp
  trzyma rozmiar w rozsądnych widełkach na bardzo niskich/wysokich
  ekranach. */
@media (min-width: 640px) {
  .nc-fb-thumbs {
    --f-thumb-size: clamp(100px, calc((100vh - 32px - 4 * 8px) / 4.5), 190px);
    width: calc(var(--f-thumb-size) + 32px);
    height: 100%;
    padding: 16px 0;
    overflow-y: auto;
    overflow-x: hidden;
    outline: 1px solid #edeef0;
    box-sizing: border-box;
  }
  .nc-fb-thumbs-track {
    display: flex;
    flex-direction: column;
    gap: 8px;
    padding: 0 16px;
  }
  .nc-fb-thumb {
    width: var(--f-thumb-size);
    height: var(--f-thumb-size);
  }
}

.banner {
  height: 10px !important;
}

/* Widget czatu Smartsupp — pływający okrągły przycisk (position:fixed,
  wstrzykiwany globalnie przez ich skrypt, poza naszym DOM). Ten plik CSS
  ładuje się WYŁĄCZNIE na tej konkretnej karcie produktu (patrz header.tpl,
  warunek nc_new_card_id), więc selektor nie musi być dodatkowo scope'owany
  przez #nc-product-page — i tak dotyczy tylko tej strony. Tylko mobile —
  na desktopie widget zostaje bez zmian. */
@media (max-width: 767px) {
  [data-testid="widgetButtonFrame"] {
    display: none !important;
  }
}


/* ═══════════════════════════════════════════════
  FIXUPS v20 — bulb sidebar (#bulb-sidebar-wrapper, modules/bulbselection)
  typography, matched against the Lovable reference component.
  NOT scoped under #nc-product-page like most other FIXUPS blocks in this
  file — bulb-sidebar.tpl's hook renders #bulb-sidebar-wrapper OUTSIDE that
  container (a detached drawer, same pattern as #side-cart-drawer), so any
  earlier #nc-product-page-scoped rule for .nc-temp-tab-name etc. never
  reached it. These are the same shared classes (nc-bulbs-drawer-title,
  nc-temp-tab-name, etc.) used elsewhere, so fixing the base (unscoped)
  rule benefits every consumer, not just this one drawer instance.
  ═══════════════════════════════════════════════ */

.nc-bulbs-drawer-title {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 14px !important;
  line-height: 20px !important;
  letter-spacing: -0.3px !important;
  color: #1F1F1F !important;
}
.nc-bulbs-drawer-compat {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
  font-size: 11px !important;
  line-height: 15.8px !important;
  letter-spacing: -0.1px !important;
  color: #1F1F1F !important;
}
.nc-bulbs-drawer-compat strong {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 600 !important;
  color: #1F1F1F !important;
}
.nc-bulbs-filter-label {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 600 !important;
  font-size: 10px !important;
  line-height: 15px !important;
  letter-spacing: 0.3px !important;
  color: #616161 !important;
}
/* Lovable's actual markup uses font-bold (700) here — an earlier FIXUPS
  pass (further up this file) assumed font-semibold (600) and forced that
  weight; this corrects it back to match the reference. */
.nc-temp-tab-name {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 700 !important;
  font-size: 11.5px !important;
  line-height: 14.4px !important;
  letter-spacing: -0.1px !important;
  color: rgba(31, 31, 31, .9) !important;
}
.nc-temp-tab-desc {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
  font-size: 10px !important;
  line-height: 12.5px !important;
  letter-spacing: -0.1px !important;
  color: #616161 !important;
}
.nc-bulb-badge {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 600 !important;
  font-size: 9px !important;
  line-height: 13.5px !important;
  letter-spacing: 0.2px !important;
}
/* "Polecane"/"Popularne" — Lovable uses bg-primary/10 + text-primary
  (the brand red, --nc-primary), not the unrelated orange-red these two
  badge variants had before. */
.nc-bulb-badge--polecane,
.nc-bulb-badge--popularne {
  background: hsl(283 76% 43.7% / .1) !important;
  color: var(--nc-primary) !important;
  border-color: hsl(283 76% 43.7% / .3) !important;
}
.nc-bulb-row-name {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 600 !important;
  font-size: calc(12px * var(--nc-bulb-scale, 1)) !important;
  line-height: 16.5px !important;
  letter-spacing: normal !important;
  color: #1F1F1F !important;
}
@media (min-width: 1024px) {
  .nc-bulb-row-name {
    font-size: calc(11.5px * var(--nc-bulb-scale, 1)) !important;
    line-height: 15.8px !important;
  }
}
.nc-bulb-row-meta {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
  font-size: calc(10.5px * var(--nc-bulb-scale, 1)) !important;
  letter-spacing: -0.1px !important;
  color: #616161 !important;
  text-transform: lowercase !important;
}
.nc-bulb-row-price {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 800 !important;
  font-size: calc(14px * var(--nc-bulb-scale, 1)) !important;
  line-height: 16.9px !important;
  letter-spacing: -0.1px !important;
}
@media (min-width: 1024px) {
  .nc-bulb-row-price { font-size: calc(13.5px * var(--nc-bulb-scale, 1)) !important; }
}
.nc-bulb-row-price-unit {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
  font-size: calc(10px * var(--nc-bulb-scale, 1)) !important;
  letter-spacing: -0.1px !important;
  color: #616161 !important;
}
.nc-bulb-details-toggle {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 600 !important;
  font-size: 11.5px !important;
  line-height: 16.5px !important;
  letter-spacing: -0.1px !important;
  color: rgba(31, 31, 31, .75) !important;
}
@media (min-width: 1024px) {
  .nc-bulb-details-toggle { font-size: 11px !important; }
}
.nc-bulb-specs-dt {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
  font-size: 11.5px !important;
  line-height: 17.3px !important;
  letter-spacing: -0.1px !important;
  color: #616161 !important;
}
.nc-bulb-specs-dd {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 600 !important;
  font-size: 11.5px !important;
  line-height: 17.3px !important;
  letter-spacing: -0.1px !important;
  color: #1F1F1F !important;
}
.nc-bulbs-drawer-footer {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 400 !important;
  font-size: 11px !important;
  line-height: 15.8px !important;
  letter-spacing: -0.1px !important;
  color: #616161 !important;
}
.nc-bulbs-drawer-footer strong {
  font-family: 'Poppins', system-ui, sans-serif !important;
  font-weight: 600 !important;
  color: #1F1F1F !important;
}

/* ═══════════════════════════════════════════════
  FIXUPS v21 — ilość + koszyk (.nc-add-to-cart-row), wymiary 1:1 z referencji
  Nadpisuje ostatecznie stos FIXUPS v8→v9→v10→v11 wyżej w tym pliku (te
  cztery bloki kolejno przebijały się nawzajem tym samym selektorem
  #nc-product-page .nc-qty/.nc-btn--add-to-cart/.nc-add-to-cart-cta +
  !important, więc o wyniku decydowała wyłącznie kolejność w pliku — stąd
  realna wysokość wiersza urosła do 84px/64px zamiast zamierzonych 52px/48px).
  Ten blok, jako ostatni w pliku przy tej samej specyficzności, wygrywa
  z nimi wszystkimi naraz.
  ═══════════════════════════════════════════════ */

#nc-product-page .nc-add-to-cart-row {
  display: flex !important;
  align-items: stretch !important;
  gap: 10px !important;
  height: 48px !important;
}
@media (min-width: 640px) {
  #nc-product-page .nc-add-to-cart-row {
    gap: 12px !important;
    height: 52px !important;
  }
}

#nc-product-page .nc-qty {
  width: 128px !important;
  min-width: 128px !important;
  flex: 0 0 128px !important;
  height: 100% !important;
  min-height: 0 !important;
}
@media (min-width: 640px) {
  #nc-product-page .nc-qty {
    width: 140px !important;
    min-width: 140px !important;
    flex: 0 0 140px !important;
  }
}
#nc-product-page .nc-qty-btn {
  width: 40px !important;
  height: auto !important;
}
@media (min-width: 640px) {
  #nc-product-page .nc-qty-btn { width: 44px !important; }
}
#nc-product-page .nc-qty-input {
  flex: 1 !important;
  min-width: 0 !important;
  text-align: center !important;
  font-size: 15px !important;
  font-weight: 700 !important;
  border-inline: 1px solid var(--nc-border) !important;
  border-top: none !important;
  border-bottom: none !important;
}

#nc-product-page #nc-add-to-cart-visible {
  /* Bez display:!important — inline style="display:none" (ustawiany przez
    initStockVisibilitySync() w nc-product.js) musi móc ukryć ten wrapper. */
  flex: 1 !important;
  width: 100% !important;
  height: 100% !important;
  min-height: 0 !important;
}
#nc-product-page .nc-add-to-cart-cta {
  flex: 1 !important;
  display: flex !important;
  width: 100% !important;
  height: 100% !important;
  min-height: 0 !important;
}
#nc-product-page .nc-btn--add-to-cart {
  flex: 1 !important;
  width: 100% !important;
  height: 100% !important;
  min-height: 0 !important;
  font-size: 13px !important;
  font-weight: 700 !important;
  gap: 10px !important;
  border-radius: 6px !important;
}
@media (min-width: 640px) {
  #nc-product-page .nc-btn--add-to-cart { font-size: 14px !important; }
}

.nc-bulb-row-name {
    margin-bottom: 0 !important;
}

/* ═══════════════════════════════════════════════
  FIXUPS v22 — stan "żarówki dobrane" na .nc-btn--bulbs
  (purchase-panel.tpl: .nc-btn-bulbs-icon/.nc-btn-bulbs-label,
  przełączane przez updateSidebarSelectionUI w bulb-sidebar.js).
  Musi być !important, żeby wygrać z bazowym
  #nc-product-page .nc-btn--bulbs { background/border: ... !important }
  (FIXUPS v11 wyżej) — bez tego stan "dobrane" był niewidoczny mimo
  poprawnie przełączanej klasy .is-added. */
.nc-btn-bulbs-icon { display: inline-flex; align-items: center; }
.nc-btn-bulbs-icon svg { display: block; }
.nc-montaz-safety svg {fill: none !important;}
#nc-product-page .nc-btn--bulbs.is-added {
  background: hsl(142 55% 95%) !important;
  border-color: hsl(142 55% 55%) !important;
  color: hsl(142 60% 25%) !important;
}
@media (hover: hover) and (pointer: fine) {
#nc-product-page .nc-btn--bulbs.is-added:hover {
  background: hsl(142 55% 90%) !important;
}
}


.cart_block .cart-info {
  padding-right: 10px !important;
}

/* ═══════════════════════════════════════════════
  FIXUPS v23 — blockwishlist w nowej karcie (buy-box)
  {hook h="CustomBelowName"} w purchase-panel.tpl renderuje DWA przyciski
  naraz z theme override'ów (…-extra.tpl w themes/modula/modules/), gałąź
  {if $tpl_override_product === 'var1'} (ta sama, którą stara karta
  dostaje): blockwishlist (#wishlist_button, prawdziwy, działający —
  onclick="WishlistCart(...)") i sendtoafriend (#send_friend_button).
  Oba przychodzą owinięte w identyczny bootstrap-grid div (.col-xs-12
  .col-sm-6 .col-md-12 .col-lg-6), więc trzeba je rozróżnić po ID
  przycisku W ŚRODKU (:has()). #send_friend_button zostaje ukryty — "Zapytaj
  o produkt" ma tu już własny modal (#nc-ask-btn/#nc-ask-modal), nie
  fancybox sendtoafriend. #wishlist_button jest odkrywany i przestylowany
  na wygląd wcześniejszego (czysto wizualnego) placeholdera serca —
  własny SVG heart (mask-image, ten sam trik co strzałki karuzeli w
  Inspiracjach/Serii) zamiast fontowej ikony modułu (<i class="licon-hearth">).
  Brak stanu active/wished — blockwishlist to czysty przycisk "dodaj"
  (potwierdzenie przez fancybox, jak na starej karcie), nie toggle. ───────────────────────────────────────────── */
#nc-product-page .nc-tertiary-actions .col-xs-12:has(#send_friend_button) {
  display: none !important;
}
#nc-product-page .nc-tertiary-actions .col-xs-12:has(#wishlist_button) {
  display: inline-flex !important;
  width: auto !important;
  padding: 0 !important;
  margin: 0 !important;
}
#nc-product-page .nc-tertiary-actions .col-xs-12:has(#wishlist_button) > div {
  display: contents !important;
}
#nc-product-page .nc-tertiary-actions #wishlist_button {
  display: inline-flex !important;
  align-items: center !important;
  gap: 0.375rem !important;
  padding: 0.5rem 0.75rem !important;
  border-radius: var(--nc-radius) !important;
  color: var(--nc-muted-fg) !important;
  cursor: pointer !important;
  background: transparent !important;
  border: none !important;
  box-shadow: none !important;
  font-size: 14px !important;
  font-family: 'Poppins', system-ui, sans-serif !important;
  text-transform: none !important;
  transition: color .15s, background .15s !important;
}
@media (hover: hover) and (pointer: fine) {
  #nc-product-page .nc-tertiary-actions #wishlist_button:hover { color: var(--nc-primary) !important; }
}
#nc-product-page .nc-tertiary-actions #wishlist_button span {
  display: inline-flex !important;
  align-items: center !important;
  gap: 0.375rem !important;
  color: inherit !important;
}
/* Własny SVG heart zamiast fontowej ikony modułu — .licon-hearth w gałęzi
  var1 (patrz wyżej), .icon-heart-empty w gałęzi {else} tego samego tpl
  (kiedy $tpl_override_product !== 'var1' — oba warianty obsłużone na
  wszelki wypadek, mimo że w praktyce na tym sklepie renderuje się var1). */
#nc-product-page .nc-tertiary-actions #wishlist_button .licon-hearth,
#nc-product-page .nc-tertiary-actions #wishlist_button .icon-heart-empty {
  display: none !important;
}
#nc-product-page .nc-tertiary-actions #wishlist_button span::before {
  content: '';
  flex-shrink: 0;
  display: block;
  width: 16px;
  height: 16px;
  background-color: currentColor;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-size: contain;
  mask-size: contain;
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2'%3E%3Cpath d='M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z'/%3E%3C/svg%3E");
}

/* Sticky pasek desktop — duplikat serca z buy-boxa (#nc-sticky-desktop-wishlist),
  patrz initStickyWishlistSync w nc-product.js: klik na nim po prostu klika
  za użytkownika w prawdziwy #wishlist_button (ten sam WishlistCart(...),
  bez duplikowania id produktu/kombinacji tutaj). Zostaje inline SVG
  (.nc-heart-icon) już w tpl, bez toggle stanu — jak wyżej, to przycisk
  "dodaj", nie toggle. Domyślnie [hidden] (desktop-sticky-bar.tpl) —
  odkrywany dopiero w JS, gdy w buy-boxie faktycznie istnieje
  #wishlist_button (blockwishlist aktywny). !important konieczne: bazowa
  reguła ".nc-sticky-desktop-wishlist { display:grid }" (wyżej w tym
  pliku, bez !important) i tak wygrywa z UA-owym "[hidden]{display:none}"
  (autorski styl bije user-agent niezależnie od kolejności/specyficzności
  przy remisie), więc bez tego przycisk byłby widoczny na starcie, zanim
  JS zdąży cokolwiek sprawdzić. */
#nc-sticky-desktop-wishlist[hidden] { display: none !important; }

#product .columns-container {
  padding-top: 0 !important;
}