/* Karta produktu.
   Hover: krawędź --line → --line-strong, cień 1 → 2, karta unosi się 2 px,
   zdjęcie scale(1.03), ulubione się pojawia, przycisk koszyka wypełnia się czerwienią.
   Zdjęcia to wycinki na białym — stąd mix-blend-mode: multiply. */

.ff-products {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: var(--grid-gap-lg);
  list-style: none;
  margin: 0;
  padding: 0;
}

/* WooCommerce układa siatkę na floatach z procentową szerokością (22.05% itd.).
   W gridzie te reguły rozjeżdżają kolumny, więc je zdejmujemy. */
.woocommerce ul.products.ff-products,
.woocommerce-page ul.products.ff-products { margin: 0; }
.woocommerce ul.products.ff-products li.product,
.woocommerce-page ul.products.ff-products li.product {
  float: none;
  width: auto;
  margin: 0;
  clear: none;
}
/* Clearfix Woo (`ul.products::before`) staje się w gridzie pustą komórką i przesuwa
   cały wiersz. Selektor musi mieć specyficzność nie niższą niż reguła Woo. */
.woocommerce ul.products.ff-products::before,
.woocommerce ul.products.ff-products::after,
.woocommerce-page ul.products.ff-products::before,
.woocommerce-page ul.products.ff-products::after,
.ff-products::before,
.ff-products::after { content: none; display: none; }

@media (max-width: 1279px) { .ff-products { grid-template-columns: repeat(3, 1fr); } }
@media (max-width: 767px)  { .ff-products { grid-template-columns: repeat(2, 1fr); gap: var(--grid-gap); } }

.ff-product-card {
  display: flex;
  flex-direction: column;
  background: var(--surface-card);
  border: var(--border-w) solid var(--line);
  border-radius: var(--radius-3);
  box-shadow: var(--shadow-1);
  overflow: hidden;
  transition:
    border-color var(--dur-2) var(--ease-standard),
    box-shadow var(--dur-2) var(--ease-standard),
    transform var(--dur-2) var(--ease-standard);
}
.ff-product-card:hover {
  border-color: var(--line-strong);
  box-shadow: var(--shadow-2);
  transform: translateY(-2px);
}

/* Proporcja 3:2, nie 4:3. Zdjęcia produktowe to często wąskie paski (belka LED,
   listwa), które przy wyższym kadrze zostawiają pod sobą pustkę i spychają opis
   na dół karty. */
.ff-product-card__media {
  position: relative;
  background: var(--surface-0);
  padding: var(--space-4);
  aspect-ratio: 3 / 2;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}
/* Kadr centrujemy na samym zdjęciu, nie na linku. Przy `height: 100%` na linku
   zdjęcie lądowało przy górnej krawędzi, a cała wolna przestrzeń zbierała się pod
   nim — opis karty wyglądał wtedy na zepchnięty w dół. */
.ff-product-card__image {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 100%;
}
.ff-product-card__image img {
  width: auto;
  height: auto;
  max-width: 100%;
  max-height: 100%;
  object-fit: contain;
  mix-blend-mode: multiply;
  transition: transform var(--dur-2) var(--ease-standard);
}
.ff-product-card:hover .ff-product-card__image img { transform: scale(1.03); }

.ff-product-card__badges {
  position: absolute;
  top: var(--space-3);
  left: var(--space-3);
  z-index: 2;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: var(--space-1);
}

.ff-product-card__fav {
  position: absolute;
  top: var(--space-3);
  right: var(--space-3);
  z-index: 2;
  width: 34px;
  height: 34px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border: var(--border-w) solid var(--line);
  border-radius: var(--radius-2);
  background: var(--surface-0);
  color: var(--ink-600);
  cursor: pointer;
  opacity: 0;
  transition: opacity var(--dur-2) var(--ease-standard), color var(--dur-1) var(--ease-standard), border-color var(--dur-1) var(--ease-standard);
}
.ff-product-card:hover .ff-product-card__fav,
.ff-product-card__fav:focus-visible { opacity: 1; }
.ff-product-card__fav:hover { color: var(--red-500); border-color: var(--red-500); }

.ff-product-card__body {
  flex: 1 1 auto;
  display: flex;
  flex-direction: column;
  gap: var(--space-2);
  padding: var(--card-pad);
  border-top: var(--border-w) solid var(--line-soft);
}

.ff-product-card__brand {
  font-family: var(--font-condensed);
  font-size: var(--label-sm-size);
  letter-spacing: var(--label-sm-ls);
  text-transform: uppercase;
  color: var(--red-500);
}

.ff-product-card__title {
  font-size: var(--h4-size);
  line-height: 1.25;
  text-transform: none;
  margin: 0;
}
.ff-product-card__title a:hover { color: var(--red-500); }

.ff-product-card__meta,
.ff-product-card__tags {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--space-2) var(--space-3);
}
.ff-product-card__sku { color: var(--ink-400); }

.ff-product-card__foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--space-3);
  padding: var(--card-pad);
  border-top: var(--border-w) solid var(--line-soft);
  background: var(--surface-0);
  flex-wrap: wrap;
}

.ff-product-card__add { flex: 0 0 auto; }
.ff-product-card:hover .ff-product-card__add {
  background: var(--red-500);
  border-color: var(--red-500);
  color: var(--surface-0);
}

.ff-product-card__foot .ff-price--quote { flex: 1 1 100%; }
.ff-product-card__foot .ff-btn--full { flex: 1 1 100%; }

/* Woo wstrzykuje własny komunikat „Zobacz koszyk" — w projekcie jest drawer. */
.ff-product-card .added_to_cart { display: none; }

@media (max-width: 767px) {
  .ff-product-card__foot { flex-direction: column; align-items: stretch; }
  .ff-product-card__add { width: 100%; }
}
