// BS PDP v2 — deploy z commita 7dfaf55 dopóki motyw czeka na Pull w Plesk.
// Po git pull na serwerze: DEZAKTYWUJ ten snippet (reguły CSS/JS i tak
// wchodzą wtedy z plików motywu — duplikat jest nieszkodliwy, ale zbędny).
// 2026-09-17: osie wariantow OSKAR z BL = Strona + Kod odcienia (pa_strona /
// pa_kod-odcienia); swatche odcieni z tilia-XX-300x300.jpg + etykiety nazw.
add_filter('woocommerce_ajax_variation_threshold', function () { return 100; });
add_filter('woocommerce_product_tabs', function ($tabs) {
if (isset($tabs['description'])) { $tabs['description']['priority'] = 10; }
if (isset($tabs['additional_information'])) {
$tabs['additional_information']['title'] = 'Specyfikacja';
$tabs['additional_information']['priority'] = 20;
}
$tabs['bs_delivery'] = [
'title' => 'Dostawa i zwroty',
'priority' => 30,
'callback' => function () {
echo '
Dostawa Meble wysyłamy kurierem z opcją wniesienia. Darmowa dostawa przy zamówieniach od 150 zł. Czas realizacji widoczny przy produkcie przed dodaniem do koszyka.
Zwroty Masz 14 dni na zwrot bez podania przyczyny. Mebel odbieramy kurierem — napisz do nas, a zorganizujemy odbiór.
Płatności BLIK, karta płatnicza, przelew oraz płatności odroczone. Wszystkie transakcje są szyfrowane.
';
},
];
return $tabs;
});
add_filter('woocommerce_product_description_heading', '__return_empty_string');
add_filter('woocommerce_product_additional_information_heading', '__return_empty_string');
$bs_pdp_css = <<<'BS_CSS'
/* ── Single Product (PDP) — Warm Editorial Premium ─────────────────
Paleta: bg #F7F4F0 / sekcje #EDE7DF / tekst #1C1C1C / wtórny #6B6258
akcent #A8754F / hover #8B5E3C / sukces #5A7A4E / wyprzedaż #B8483A
Nagłówki: Fraunces · Body: Inter/Hanken · Ceny: tabular-nums
Scoped: body.bs-pdp + .bs-single-product (nie rusza kart dywanów)
─────────────────────────────────────────────────────────────── */
body.bs-pdp {
background: #F7F4F0;
}
.bs-single-product {
max-width: 1440px;
margin: 0 auto;
padding: 1.5rem 2rem 5rem;
}
.bs-breadcrumbs {
font-size: 0.6875rem;
text-transform: uppercase;
letter-spacing: 0.18em;
color: #6B6258;
margin-bottom: 2.5rem;
}
.bs-breadcrumbs a {
color: #6B6258;
text-decoration: none;
transition: color 0.2s ease;
}
.bs-breadcrumbs a:hover { color: #A8754F; }
/* 60/40 editorial layout */
.bs-pdp-grid {
display: grid !important;
grid-template-columns: minmax(0, 3fr) minmax(0, 2fr) !important;
gap: clamp(2rem, 5vw, 5rem) !important;
align-items: start;
}
@media (max-width: 1024px) {
.bs-pdp-grid {
grid-template-columns: 1fr !important;
gap: 2.5rem !important;
}
}
/* Gallery */
.bs-pdp-gallery .woocommerce-product-gallery {
margin-bottom: 0;
max-width: 100%;
}
.bs-pdp-gallery .woocommerce-product-gallery__image {
background: #EDE7DF;
}
.bs-pdp-gallery .woocommerce-product-gallery__image img {
width: 100%;
aspect-ratio: 4/3;
object-fit: cover;
display: block;
}
.bs-pdp-gallery .woocommerce-product-gallery__trigger {
background: rgba(247, 244, 240, 0.9);
border-radius: 50%;
width: 40px;
height: 40px;
line-height: 40px;
text-align: center;
color: #1C1C1C;
}
.bs-pdp-gallery .flex-control-thumbs {
display: flex;
gap: 0.75rem;
margin: 0.875rem 0 0;
list-style: none;
padding: 0;
}
.bs-pdp-gallery .flex-control-thumbs li {
flex: 0 0 84px;
width: 84px;
}
.bs-pdp-gallery .flex-control-thumbs img {
width: 84px;
height: 63px;
object-fit: cover;
cursor: pointer;
opacity: 0.55;
transition: opacity 0.2s ease, box-shadow 0.2s ease;
}
.bs-pdp-gallery .flex-control-thumbs img.flex-active {
opacity: 1;
box-shadow: 0 0 0 1px #F7F4F0, 0 0 0 3px #A8754F;
}
.bs-pdp-gallery .flex-control-thumbs img:hover {
opacity: 1;
}
.bs-pdp-gallery .flex-direction-nav { display: none; }
/* Panel (sticky) */
.bs-pdp-panel {
position: sticky;
top: 100px;
}
.bs-pdp-title {
font-family: "Fraunces", Georgia, serif !important;
font-size: clamp(1.9rem, 2.6vw, 2.625rem) !important;
font-weight: 500 !important;
letter-spacing: -0.01em !important;
line-height: 1.15 !important;
color: #1C1C1C !important;
margin: 0 0 1.25rem !important;
}
.bs-pdp-price {
font-family: "Inter", "Hanken Grotesk", sans-serif !important;
font-size: clamp(1.5rem, 2vw, 1.875rem) !important;
font-weight: 600 !important;
font-variant-numeric: tabular-nums;
color: #1C1C1C !important;
margin-bottom: 0.75rem !important;
}
.bs-pdp-price del {
color: #6B6258;
font-weight: 400;
font-size: 1.125rem;
margin-right: 0.75rem;
}
.bs-pdp-price ins {
color: #B8483A;
text-decoration: none;
}
/* Stock indicator */
.bs-pdp-stock {
margin-bottom: 1.5rem;
}
.bs-pdp-stock .wc-block-components-product-stock-indicator,
.bs-pdp-stock p {
font-size: 0.8125rem;
font-weight: 500;
color: #5A7A4E;
margin: 0;
display: flex;
align-items: center;
gap: 0.5rem;
}
.bs-pdp-stock .wc-block-components-product-stock-indicator::before,
.bs-pdp-stock p::before {
content: "";
width: 8px;
height: 8px;
border-radius: 50%;
background: #5A7A4E;
flex-shrink: 0;
}
.bs-pdp-stock .wc-block-components-product-stock-indicator--out-of-stock,
.bs-pdp-stock .out-of-stock {
color: #B8483A;
}
.bs-pdp-stock .wc-block-components-product-stock-indicator--out-of-stock::before {
background: #B8483A;
}
.bs-pdp-rating {
font-size: 0.8125rem;
color: #6B6258;
margin-bottom: 1.5rem;
}
.bs-pdp-short-desc {
font-size: 0.9375rem;
line-height: 1.75;
color: #6B6258;
margin-bottom: 2rem;
}
.bs-pdp-short-desc p { margin: 0 0 0.75rem; }
/* ── Variations: labels + swatches ─────────────────────────────── */
.bs-pdp-add-to-cart {
margin-bottom: 1.5rem;
}
.bs-pdp-add-to-cart .variations {
width: 100%;
margin-bottom: 1.25rem;
}
.bs-pdp-add-to-cart .variations tbody,
.bs-pdp-add-to-cart .variations tr,
.bs-pdp-add-to-cart .variations th,
.bs-pdp-add-to-cart .variations td {
display: block;
width: 100%;
padding: 0;
border: 0;
}
.bs-pdp-add-to-cart .variations tr {
margin-bottom: 1.5rem;
}
.bs-pdp-add-to-cart .variations th.label {
font-size: 0.6875rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.18em;
color: #6B6258;
text-align: left;
margin-bottom: 0.625rem;
}
.bs-pdp-add-to-cart .variations th.label label {
font: inherit;
color: inherit;
}
.bs-swatch-selected {
font-weight: 500;
text-transform: none;
letter-spacing: 0.01em;
color: #1C1C1C;
}
/* Original select stays in DOM for Woo JS — hidden visually */
.bs-swatch-hidden {
position: absolute !important;
width: 1px !important;
height: 1px !important;
opacity: 0 !important;
pointer-events: none !important;
}
.bs-swatches {
display: flex;
flex-wrap: wrap;
gap: 0.625rem;
}
.bs-swatch {
padding: 0;
border: 0;
background: none;
cursor: pointer;
transition: box-shadow 0.15s ease, opacity 0.15s ease, transform 0.15s ease;
}
.bs-swatch--img {
width: 52px;
height: 52px;
border-radius: 50%;
overflow: hidden;
box-shadow: 0 0 0 2px #F7F4F0, 0 0 0 3px #D4CCC0;
}
.bs-swatch--img img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
pointer-events: none;
}
.bs-swatch--img:hover {
box-shadow: 0 0 0 2px #F7F4F0, 0 0 0 3px #A8754F;
}
.bs-swatch--img.is-active {
box-shadow: 0 0 0 2px #F7F4F0, 0 0 0 4px #A8754F;
}
.bs-swatch--text {
padding: 0.625rem 1.375rem;
border: 1px solid #D4CCC0;
border-radius: 999px;
font-family: "Inter", "Hanken Grotesk", sans-serif;
font-size: 0.8125rem;
font-weight: 500;
color: #1C1C1C;
background: transparent;
}
.bs-swatch--text:hover { border-color: #A8754F; color: #A8754F; }
.bs-swatch--text.is-active {
background: #1C1C1C;
border-color: #1C1C1C;
color: #F7F4F0;
}
.bs-swatch.is-disabled {
opacity: 0.3;
cursor: not-allowed;
}
.bs-pdp-add-to-cart .reset_variations {
display: inline-block;
margin-top: 0.5rem;
font-size: 0.75rem;
color: #6B6258;
text-decoration: underline;
text-underline-offset: 3px;
}
.bs-pdp-add-to-cart .reset_variations:hover { color: #A8754F; }
/* Fallback select styling (non-swatch attributes) */
.bs-pdp-add-to-cart .variations select:not(.bs-swatch-hidden) {
width: 100%;
border: 1px solid #D4CCC0;
border-radius: 0;
padding: 0.875rem 1rem;
font-size: 0.9375rem;
font-family: inherit;
background: #ffffff;
color: #1C1C1C;
}
/* Selected variation summary (price + availability) */
.bs-pdp-add-to-cart .single_variation_wrap {
margin-bottom: 1.25rem;
}
.bs-pdp-add-to-cart .single_variation {
padding: 1rem 0;
border-top: 1px solid #D4CCC0;
}
.bs-pdp-add-to-cart .woocommerce-variation-price .price {
font-family: "Inter", "Hanken Grotesk", sans-serif;
font-size: 1.375rem;
font-weight: 600;
font-variant-numeric: tabular-nums;
color: #1C1C1C;
}
.bs-pdp-add-to-cart .woocommerce-variation-availability .stock {
font-size: 0.8125rem;
font-weight: 500;
color: #5A7A4E;
margin: 0.25rem 0 0;
}
.bs-pdp-add-to-cart .woocommerce-variation-availability .out-of-stock {
color: #B8483A;
}
.bs-pdp-add-to-cart .woocommerce-variation-description {
font-size: 0.875rem;
color: #6B6258;
}
/* Quantity stepper + CTA row */
.bs-pdp-add-to-cart .woocommerce-variation-add-to-cart {
display: flex;
gap: 0.75rem;
align-items: stretch;
}
.bs-pdp-add-to-cart .quantity {
display: inline-flex;
align-items: stretch;
border: 1px solid #D4CCC0;
background: #ffffff;
}
.bs-qty-btn {
width: 42px;
border: 0;
background: transparent;
font-size: 1.125rem;
color: #6B6258;
cursor: pointer;
transition: color 0.15s ease, background 0.15s ease;
}
.bs-qty-btn:hover { color: #A8754F; background: #F7F4F0; }
.bs-pdp-add-to-cart .qty,
.bs-pdp-add-to-cart .quantity input.qty {
width: 52px;
border: 0;
border-radius: 0;
padding: 0;
text-align: center;
font-family: "Inter", "Hanken Grotesk", sans-serif;
font-size: 0.9375rem;
font-variant-numeric: tabular-nums;
color: #1C1C1C;
background: transparent;
-moz-appearance: textfield;
appearance: textfield;
}
.bs-pdp-add-to-cart .quantity input.qty::-webkit-outer-spin-button,
.bs-pdp-add-to-cart .quantity input.qty::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
.bs-pdp-add-to-cart .single_add_to_cart_button {
flex: 1;
background: #A8754F;
color: #ffffff;
font-size: 0.8125rem;
font-weight: 600;
letter-spacing: 0.14em;
text-transform: uppercase;
padding: 1.125rem 2rem;
border: none;
border-radius: 0;
cursor: pointer;
transition: background 0.2s ease;
}
.bs-pdp-add-to-cart .single_add_to_cart_button:hover {
background: #8B5E3C;
}
.bs-pdp-add-to-cart .single_add_to_cart_button:disabled {
background: #D4CCC0;
cursor: not-allowed;
}
/* Trust badges */
.bs-trust-pdp {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem 1.5rem;
margin-top: 1.75rem;
padding-top: 1.75rem;
border-top: 1px solid #D4CCC0;
}
.bs-trust-item {
display: flex;
align-items: center;
gap: 0.625rem;
font-size: 0.8125rem;
color: #6B6258;
}
.bs-trust-item svg { color: #A8754F; flex-shrink: 0; }
/* Meta (SKU, kategorie) */
.bs-pdp-meta {
margin-top: 1.5rem;
font-size: 0.75rem;
color: #6B6258;
}
.bs-pdp-meta a { color: #A8754F; text-decoration: none; }
.bs-pdp-meta a:hover { color: #8B5E3C; }
/* ── Tabs (Opis / Specyfikacja / Dostawa i zwroty) ─────────────── */
.bs-pdp-details {
margin-top: clamp(3rem, 7vw, 5.5rem);
}
.bs-pdp-details .woocommerce-tabs ul.tabs {
display: flex;
flex-wrap: wrap;
gap: 2.25rem;
list-style: none;
margin: 0;
padding: 0;
border-bottom: 1px solid #D4CCC0;
}
.bs-pdp-details .woocommerce-tabs ul.tabs li {
margin: 0;
padding: 0;
background: none;
border: 0;
}
.bs-pdp-details .woocommerce-tabs ul.tabs li::before,
.bs-pdp-details .woocommerce-tabs ul.tabs li::after { display: none; }
.bs-pdp-details .woocommerce-tabs ul.tabs li a {
display: inline-block;
padding: 0 0 0.875rem;
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.18em;
color: #6B6258;
text-decoration: none;
border-bottom: 2px solid transparent;
margin-bottom: -1px;
transition: color 0.2s ease, border-color 0.2s ease;
}
.bs-pdp-details .woocommerce-tabs ul.tabs li a:hover { color: #1C1C1C; }
.bs-pdp-details .woocommerce-tabs ul.tabs li.active a {
color: #1C1C1C;
border-bottom-color: #A8754F;
}
.bs-pdp-details .woocommerce-Tabs-panel {
padding: 2.25rem 0 0;
max-width: 760px;
font-size: 0.9375rem;
line-height: 1.75;
color: #6B6258;
}
.bs-pdp-details .woocommerce-Tabs-panel > h2:first-child { display: none; }
.bs-pdp-details .woocommerce-Tabs-panel p { margin: 0 0 1rem; }
/* Specyfikacja — tabela atrybutów */
.bs-pdp-details .shop_attributes {
width: 100%;
border: 0;
border-top: 1px solid #D4CCC0;
}
.bs-pdp-details .shop_attributes tr {
border-bottom: 1px solid #D4CCC0;
}
.bs-pdp-details .shop_attributes th,
.bs-pdp-details .shop_attributes td {
padding: 0.875rem 0;
border: 0;
vertical-align: top;
}
.bs-pdp-details .shop_attributes th {
width: 220px;
font-size: 0.6875rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.15em;
color: #6B6258;
text-align: left;
}
.bs-pdp-details .shop_attributes td {
font-family: "Inter", "Hanken Grotesk", sans-serif;
font-size: 0.9375rem;
color: #1C1C1C;
}
.bs-pdp-details .shop_attributes td p { margin: 0; }
/* Dostawa i zwroty */
.bs-delivery-tab {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 2.5rem;
max-width: none;
}
.bs-delivery-item h3 {
font-family: "Fraunces", Georgia, serif;
font-size: 1.25rem;
font-weight: 500;
color: #1C1C1C;
margin: 0 0 0.625rem;
}
.bs-delivery-item p {
font-size: 0.875rem;
line-height: 1.7;
color: #6B6258;
margin: 0;
}
/* Related products */
.bs-related {
max-width: 1440px;
margin: clamp(3rem, 7vw, 5.5rem) auto 0;
padding: 0;
}
.bs-related .wp-block-heading {
font-family: "Fraunces", Georgia, serif !important;
font-size: clamp(1.5rem, 3vw, 2rem) !important;
font-weight: 500 !important;
letter-spacing: -0.01em !important;
color: #1C1C1C !important;
margin-bottom: 2rem;
}
/* ukryj duplikat z pluginu yayswatches (nasz bs-swatch-selected zostaje) */
.bs-pdp .yay-swatches-attribute-preview-wrapper { display: none !important; }
BS_CSS;
$bs_pdp_js = <<<'BS_JS'
document.addEventListener("DOMContentLoaded", function () {
/* ── 9. PDP — attribute swatches + qty stepper ─────────────────── */
var variationsForm = document.querySelector('form.variations_form');
if (variationsForm && document.body.classList.contains('bs-pdp')) {
// Variation data (embedded when <= threshold; threshold bumped to 100 in functions.php)
var variationsData = [];
try {
variationsData = JSON.parse(variationsForm.getAttribute('data-product_variations')) || [];
} catch (e) { variationsData = []; }
// Attributes that get image swatches (fabric/color/shade-like)
var IMAGE_ATTR = /tkanina|kod-odcienia|odcien|kolor|color|material|obicia|fabric/i;
// Nazwy odcieni TILIA wg BaseLinker (produkt 690927524) — etykieta swatcha
var TILIA_NAMES = {'01':'ecru','03':'beż jasny','08':'beż piaskowy','11':'camel jasny','17':'taupe','37':'oliwka','39':'zieleń butelkowa','52':'cegła','56':'karmel','62':'róż przykurzony','75':'petrol','77':'granat','83':'greige','85':'szary','86':'szary jasny','90':'grafit','100':'czarny'};
// Ladna etykieta opcji: "TILIA 77 — granat" dla kodu odcienia, "Lewy" dla strony
function prettyLabel(sel, text) {
var name = sel.getAttribute('data-attribute_name') || '';
var t = String(text).trim();
if (/kod-odcienia/i.test(name) && TILIA_NAMES[t]) return 'TILIA ' + t + ' — ' + TILIA_NAMES[t];
return t.charAt(0).toUpperCase() + t.slice(1);
}
function variationImageFor(attrName, value) {
for (var i = 0; i < variationsData.length; i++) {
var attrs = variationsData[i].attributes || {};
var v = attrs[attrName];
if (v === value || v === '' || (v && v.toLowerCase() === String(value).toLowerCase())) {
var img = variationsData[i].image;
if (img) return img.gallery_thumbnail_src || img.thumb_src || img.src;
}
}
return null;
}
// Fabric texture swatch: "TILIA 01 Ecru" lub sam kod "01" -> tilia-01-300x300.jpg
function fabricSwatchSrc(label, fallback) {
var m = label.match(/TILIA\s*(\d+)/i) || label.match(/^(\d{1,3})$/);
if (!m) return fallback;
var probe = variationsData[0] && variationsData[0].image && variationsData[0].image.src;
if (!probe) return fallback;
var dir = probe.slice(0, probe.lastIndexOf('/') + 1);
return dir + 'tilia-' + m[1] + '-300x300.jpg';
}
var cssEscape = window.CSS && CSS.escape ? CSS.escape : function (v) {
return String(v).replace(/"/g, '\\"');
};
function refreshSwatches() {
variationsForm.querySelectorAll('select[data-attribute_name]').forEach(function (sel) {
var wrap = sel.parentNode.querySelector('.bs-swatches');
if (!wrap) return;
wrap.querySelectorAll('.bs-swatch').forEach(function (b) {
var active = sel.value === b.dataset.value;
b.classList.toggle('is-active', active);
b.setAttribute('aria-pressed', active ? 'true' : 'false');
// Woo prunes s for unavailable combos — mirror that state
var opt = sel.querySelector('option[value="' + cssEscape(b.dataset.value) + '"]');
b.classList.toggle('is-disabled', !opt);
});
var row = sel.closest('tr');
var lbl = row && row.querySelector('.bs-swatch-selected');
if (lbl) {
lbl.textContent = sel.value ? '— ' + prettyLabel(sel, sel.options[sel.selectedIndex].text) : '';
}
});
}
variationsForm.querySelectorAll('select[data-attribute_name]').forEach(function (sel) {
if (sel.classList.contains('bs-swatch-hidden')) return; // juz zainicjowane (np. theme JS + snippet)
var attrName = sel.getAttribute('data-attribute_name');
var useImages = IMAGE_ATTR.test(attrName);
var swatches = document.createElement('div');
swatches.className = 'bs-swatches';
swatches.setAttribute('role', 'group');
// selected-value readout next to the label
var row = sel.closest('tr');
var labelCell = row && row.querySelector('th.label');
if (labelCell) {
var selSpan = document.createElement('span');
selSpan.className = 'bs-swatch-selected';
labelCell.appendChild(selSpan);
}
Array.prototype.forEach.call(sel.options, function (opt) {
if (!opt.value) return;
var btn = document.createElement('button');
btn.type = 'button';
btn.className = 'bs-swatch';
btn.dataset.value = opt.value;
var label = prettyLabel(sel, opt.text);
btn.setAttribute('aria-label', label);
btn.setAttribute('aria-pressed', 'false');
btn.title = label;
var imgSrc = useImages ? fabricSwatchSrc(opt.text, variationImageFor(attrName, opt.value)) : null;
if (imgSrc) {
var img = document.createElement('img');
img.src = imgSrc;
img.onerror = (function (b, fb) {
return function () {
if (!fb || b.dataset.fbDone) return;
b.dataset.fbDone = '1';
b.querySelector('img').src = fb;
};
})(btn, useImages ? variationImageFor(attrName, opt.value) : null);
img.alt = '';
img.loading = 'lazy';
btn.appendChild(img);
btn.classList.add('bs-swatch--img');
} else {
var txt = document.createElement('span');
txt.className = 'bs-swatch-label';
txt.textContent = label;
btn.appendChild(txt);
btn.classList.add('bs-swatch--text');
}
btn.addEventListener('click', function () {
if (btn.classList.contains('is-disabled')) return;
sel.value = btn.dataset.value;
if (window.jQuery) jQuery(sel).trigger('change');
else sel.dispatchEvent(new Event('change', { bubbles: true }));
refreshSwatches();
});
swatches.appendChild(btn);
});
sel.parentNode.insertBefore(swatches, sel.nextSibling);
sel.classList.add('bs-swatch-hidden');
sel.setAttribute('aria-hidden', 'true');
sel.tabIndex = -1;
});
if (window.jQuery) {
jQuery(variationsForm).on(
'woocommerce_update_variation_values check_variations found_variation reset_data',
function () { setTimeout(refreshSwatches, 0); }
);
}
refreshSwatches();
}
/* ── 10. PDP — quantity stepper ────────────────────────────────── */
if (document.body.classList.contains('bs-pdp')) {
document.querySelectorAll('form.cart .quantity').forEach(function (q) {
var input = q.querySelector('input.qty');
if (!input || q.querySelector('.bs-qty-btn')) return;
var minus = document.createElement('button');
minus.type = 'button';
minus.className = 'bs-qty-btn bs-qty-minus';
minus.setAttribute('aria-label', 'Zmniejsz ilość');
minus.textContent = '−';
var plus = document.createElement('button');
plus.type = 'button';
plus.className = 'bs-qty-btn bs-qty-plus';
plus.setAttribute('aria-label', 'Zwiększ ilość');
plus.textContent = '+';
q.insertBefore(minus, input);
q.appendChild(plus);
function step(delta) {
var min = parseFloat(input.min) || 0;
var max = parseFloat(input.max) || Infinity;
var stepSize = parseFloat(input.step) || 1;
var val = (parseFloat(input.value) || min || 1) + delta * stepSize;
input.value = Math.min(Math.max(val, min), max);
input.dispatchEvent(new Event('change', { bubbles: true }));
}
minus.addEventListener('click', function () { step(-1); });
plus.addEventListener('click', function () { step(1); });
});
}
/* Galeria per wariant: kazdy wariant ma w BL pelna galerie 8 ujec w tym
samym porzadku co galeria rodzica — zamieniamy wszystkie slajdy 1:1
(glowne + miniaturki + lightbox). Fallback: podmiana samego slajdu 1. */
var BS_GAL_CDN = 'https://upload.cdn.baselinker.com/products/5047759/';
var BS_VAR_GALLERIES={"7973":["57c4c7884b3cb2e36ad7a6fb9550d14d","3430096eda6b0b63062a9f8db0c886f4","b8bfc8b74428d1aa592a1a2c019d5489","0bc384092d25cf914c4bd0ae37ce58ec","aa60852e7d6b96e7eaf335feaa67cf6c","d1b807e7ddb6177ad5e0bfce37155a71","3cbbe641de716ae393b588acff362a7b","648508855c4bb27e99fe6f5d4d4b42e5"],"7970":["8381437e29e833ebe71cd18072659aec","39acec351bbf5632fd929ec191ce6993","ae5d45183242fdff5bd7333bab2f09f6","161511c79e77430d72642bc9a5d8128e","2fba74e86c14e43b1bf710787fc22231","2b339947a08aea1e309e533ad92efcfc","d92bec586e25876101ce3e07d6675c43","6bc80edd40e0036825b22790614600e9"],"7967":["a3d08a981ff8ba13901ac10c7718a5b9","d54dc3d24daa2ea197766eb8f972a467","f290169353b7b52fc4c29d2350f538e6","337a2c13d00418ecff4d1f8b8eb566e3","6e64d80e8e0d570b67b7cdd96364d0d5","8d5f7b0f997bb2e694d76f4bb56356fd","14709833937dd547ad3256be9fe28f11","7bea7d8194a377f6b2d8d48d6ab79cdb"],"7964":["657db2f4e72263285e27a47a3b163461","6f3551fa2e5725cf995dfdeb626b736f","06ed3da64f46ebb7f15303c06d212bee","d892f00dcd48a4c121079c0cfa9228e6","380aff412fef698f022adf35ed56974e","6148abcc49fc3a1bd17af3e198c09d44","ebfe1894962c4a44be754b937cf13e4f","e6d2c6f2ac1bdca5c4500fb052c6d688"],"7961":["ab1ec3ee19746012be662d328117e3e4","69a813887eb036b1af1cd79b1652189c","9837a585c32c35847ff630dfdc18ddec","1f481c4190dab4ccf2141ee5e04fccf6","741b95b4d5d0fc35a3c700f00cdaf6da","949697570b398a549449cf18dba703f4","1f84c33b1213812e864ae9d39ac6de51","1e3d77981ec6a4d3a13e89d6eba4161c"],"7958":["8dc215ffe34178cccc2e1bbe09aa79da","7377518b2e46a103c8099443aae2cc93","aa7508bea9d581981a9a9b74a299926e","f08188d055dab325d20ed65d086928df","4d8de9244ad42e71b807cc9e8cd09c6d","0baf5fa27e6aed4e8c6e99d6f9b49182","1fe3b90070b8731188d338fd54bb1dcf","0182d9bd755f818f841cec63ca3f8974"],"7955":["9cfcacdf170d13be7b451981e9507fbd","4335d9cce27488166a9727258f64c232","ce941480c8ebacfa71d123558306ad34","aff24a4d2f1f17f2c27cd64e2ace30af","25af2fd41886018dbb72f88d1a4650eb","a352b35a67b6736c56a37503c872ffeb","ca5b51497cfaf400203bb21f6e18bcea","a8de34f2045ac79ec2355800194c8c4e"],"7952":["4387188cba53ec78f73463cb2247339a","8fada168082c222a0946d5aa8520a59f","3fac942fbf58da8c2c66cf55f99bc47f","911591d86ddf24e53f64295124a5cf5c","0ac8f123d6ea920d976224bfef5a1b23","286d077a3d72608b5bccc18579390f3d","498a0a63303f164138b3181ba9929c07","055941b7a8ef9497544ae43bbfae62ed"],"7949":["33ab6a0ea17ab39bf9679fface647cf3","fd90e51338e0ac7180709503e5c80b95","c151336fd3751113438d542c22874d1a","5c5a79c772eb5dae6a89cbd212799b2b","a342d0e404fcd6fa473a69bca8e7e2f4","d947d5b457b9b4e7994036283f798b67","edfe00f3290c9eab7cbb01128af9c5db","ef1dc1598c957b9020a6ad7c93d470d3"],"7946":["ad69070f4341ce21d511282cf40c5adb","fff1593bba8fbe39284ba8f0a6b250e6","cab317d38b6ec0c978aa276371ad6a39","e33ffd45c5f13c43df0a2de0ad13cc70","20889165dddf808c554b4e9ded9ba461","4802c503069fd322871085003c9b7d3c","1e2a48c358ba44085401dd21020bc87e","024fe5fe93fab99eb23a3b690ae5c5c1"],"7943":["799a0de92f6a5afc4f62d2e06bd9b105","2800aab07cfbeb9998b2c18432ea1464","e295b626542d73d3989592ca66478101","f4268fc030160255a75c0813a9245325","3a7fb90b40e4e4a44ae7cc654c11f51e","d82674f42dc7354bf144dfa4f5f6697a","19bbddac0ac1aa229e63c2549aab6164","050bac09e8810088ea53c9c408ae438d"],"7940":["ffaedb51314c9ac6c897f14f0a1f8242","e59ce55f9b7749c62238093258e4d86f","abc43f20a9b38c4fb9db280c53ba8686","510c72321fd1fa26b513725473d100ca","7853f7d69261fb28f6394d7f56702b8d","5689ea71308ed3d3389e4dda8eac8fcc","2096d027b39b9c9a4af25062c8973443","3760c946da0b6adcf9b72779b2bc046f"],"7937":["caff764efcb4e74c9c68871680195e00","8d38809d941fadb4a205207cdf3e1dc9","722724e154f6e78e387445a4de72086e","5bdeba9ce5651c9ca299468bab84cae7","7bbf98a30964d53a7b3a6e4db148f2c1","690ef62ea17f535c068f83857820dc54","3275c2b3592ca18ecf30ebad33e7edcb","0c900ebd22d474f552086f7388cfd53a"],"7934":["213929a1a1172b982a4fd229c9f4f53d","0feade51ef141cce2e39f1905aec75b5","45668d6cf46efe4c0e5b2bf3850add9b","12597d7ef83d000ba43c0b43c3a9b8ac","af135af32de19609d510c38bee2304bb","d30cdcecd50977528d85448b94d0852d","23620c7e6a66adcbb37a6f0c8d60320b","ea5c4bb603d19cd12ba3c21c0c9f6521"],"7931":["10f0c00f9d2160baa999c735f6f5236d","f10ffa17e4b6c9a00e9ac9ed18ae99f0","7019418aae68e387c31e3064662445f5","c3f425e73fc375bbe2548cc5ff7dacc9","ba2fcda88a86400c080996b66042fe95","82b1187f4c6459b9a7242daef594d7f2","b205adfbf97b15b9690121e38987570c","b0cc1645803237402395cf2d6e0297ec"],"7928":["55d5b1b1d62e3b00012c02896910f4cb","47864689b8091f11ea9adf3bc47ac1aa","0e2ec12e46f495548d4f300850d98d56","d9353e4748f1b8d79b839034c46ff507","b4d549829030a8a6a48c3ae0d67ddffa","9719a9285a49eb27386b41ae5b31bbb1","931ef0788ed41d17574050c22303a4ba","130a0544ceb93539d66252de92b6b6c6"],"7925":["b13103f020130bc3099e6592a7915cde","51d7af814e72484e33684cb4e1f4cde3","ba9e9eb716caf3312b560d0d29e77d5e","d974cf437d611e0fb53b678b40e3133a","81c100ed2830e5c98c955d3c4af313dd","879f0750643a169888ca59096b0961fb","c45c4258118f9bc7e073d5d90c3c2cb0","97db7d3e6da6b35258757e3f3655cde8"],"7922":["f155e1254afd3c69cc9380d4468e7415","906924ed9fb43b2c680ef71b0c9e3f11","d97ee0d1ed9cdb0b79d625ab86eaed1e","e19faa3f1f45e936f2186a3c00c1e13e","34c8c7d2d223e96a338d1ef9331b628f","ad8e078b3356f6a7e06ee147890ae48e","ca19f50a8ebde7520e300c6c66774e35","d1b36388cb1f61735b91aae71b9a4cfd"],"7919":["7d5088008167699942f52fb0a3d675d6","0098b6e61d0067ea7d6290647124b374","d32c4b3d1cadfa79b96a61f14e0afaa0","f5033551a1a9a12c81972aeb1b450d34","f196ab96dd50d8b87d8f5d8c76efac26","f1f11cee886e5f768e3752d34e750784","1c8ae23905f6846f70a1da020a8cd0b0","602a033a807f3799679fce7d6e02e425"],"7916":["c7beb9d09d32eef5d2ff676afa518f6c","a8830aae4e233ccf644e70ccb56fabbe","2de0f0eb30198a4fee240ee7cc7393f0","75d7691a3891564adc8728db154df99b","d9ef4435e839c4388b40976d140fcc22","bf1dca2504888664da29db3f0366dd93","df2db27044fa4d8a399e692a6d6b6db5","eeb9a432e3446f9d9b99503492d52703"],"7913":["90b5e1fa11b15714cba69f49d48a0836","22c94d48ee3bbdbad516330f1882dcd5","b53f140a1da6351c2f5e0af19845af59","504d93de3b7e8da465268d8623b84072","7f762c1f1bce5b41f6b83abe5a7e2ccc","f449eacd49b5e27df9de918875efcf5d","7a273fb543fea303f0437f15b5846f83","77661b6058fe99bf48d7415aa4e23e5c"],"7910":["2532f0f16918edccddca2f83800231c3","15b896f998d92f2fdfabeaffc2d906d3","fb3b1c7ff778179c81533de9eb5f72cb","a601235fd8b6b7f7025ef29018257dc6","328806f8d6c8aa17a3410fadfd49b486","a43b4bfc5ec375dac0f8cbf36e2d338d","a266923ba35ab3183768d2259a0b6498","b3c7f4287f1e4c976550f5c3edde1fbd"],"7907":["ba3a6f6d11df6fc15acb15c2aa858d6a","f64174cccdfac6f1fa43d09e7db482ab","6c3328b62d99d9bab96e9505625949de","12029db8424870e8c8de9aa623a32283","9f2517688a38815be4dbf576d61ce7cf","fc3445a81fab623ba0b4655af0920a61","0519e56b737165dc7da49b3dcd41a2cf","a09ce7370c4b5de51ae6ece7dab56e20"],"7904":["206e0ffccf26cc00e3cf2d99bf2bb361","c9268f867fba803827d2dda1bbf55bcf","89ed38d949295ecef4d3fe7ca439f12f","0f8143a71966764f0439dda6f4a0ede9","dbb7f6c36d2c0d261ec2767b044883b7","232bcf6a7cdf25bb692e7d00037b8e8e","b6c45f9ebf05d94dd8e58310114b515e","a49cb559ad587e594011e3a2af26f52b"],"7901":["d438767502e78117e916a647194b0360","1d66ed5982dadffd6903e25138b1da10","2591a7f94f9225bab346d3c7878ca8d2","a59f050df144fd16b57403735053efb4","0f51311ec9cf881e5e013811b994a6fc","2d429e8f57711304d724fc88cf81078e","093b2c5a2d8ef66107f2f28be38b766a","6fc41b209369c57dd0f0b188f3ca979c"],"7898":["a27d2ac11d5571d825ea26c1fb4b5317","9106aa68e05471adb2e14c830876eb4f","afa345dc189b16fb9122871c9775cf00","688de33ef780938aa989ada1f34c9734","9cfa699af868054ecc99b12be99f4ac8","0d7edc48b2f8b2f96c045063c15269f8","0c1f320cfbf7cfc808d1ea83bdcda452","e093b1bdeb1679385f0c8d1560533cc9"],"7895":["b0acedb3df283f5fc9e9ee8e1a204f64","87b7793e56bcb9ba6d82c6c97f54bc05","2c26c2db5f842b9e215538e964cca7a6","1a6b63cc743f9768d7e9c5256d2e861f","0f2fc1fed59108633a03252949013895","6b91580992f86a3d01e4e0c192ca4800","52632992a3c3c72d2903cbaa84e74721","2823464100c80743e1737211c89b3b60"],"7892":["a202b24fac7da0ba2955cf51b7e66033","599c388f0954affbd34e04c08374d1b8","2da7823f277350947701e5ee154e4037","117e6b95e1564b769b8fda0762b293a5","d0628462a50bf39150a16c01a0c0979c","e5f4b0c65280170e47302c05210f3605","5197f7886a467779aae481b667ce3074","087c635dc877f726430e4bb0f1801044"],"7889":["f58b85cd50cd5543eb9eca6eb217960f","0cc76043d915dbcf22f49ef8bad92852","b19287ad9fd93f9417d74acd0f6834b1","a2b51beba82f38dc5d9a29df31972735","394cbeb9bd943d32f8431f63e63c21f2","6c3eb7814925683005a570af3b6912d6","076f1ad987c89801800ecf84c0151456","315d2a01d7e221498cdcc0d502b27bcc"],"7886":["3f42b0f9c8fe136cc9f595171f9735cb","7d1f21447d858727e2793886040313d6","e7821c96f92f0436ddb830cb1fa26596","150c525be263a66b382324997ae13a56","e3e865b1975611ff571a53b7c8e9bf16","a2f33ae38cccd22b7185b182fc51498e","4f29a99781afb8e70b0a8fede8d8c4ec","2f8d261fd71253bfc7ae8fe9a820bdb9"],"7883":["a12144751b0c300dbfc0a034f362dff0","9b645bb890e89c2d633788f0d9286212","7e453717f18a08f3edb888538656e714","3bed7f503cfabdd606e27955fdfade17","bca463a586954492a9552d0eada4de6a","79866286f36d768d98555dae054761af","294014831742fcf0db2d1960fdd59d5a","a816070b6aaf8379b6c3df167cffd89a"],"7880":["a619a27a7ba3816ac8aa698c3a91a59c","2efe0d312c2f741855dbda508a7b8d8d","8774e4b683c8a36d908c8c30887933a5","19422bf298f24d64d43134d78f26622c","fc48d473ffacb23ee616500886d3bc7a","bc66d15c508892650b2989f9c6902318","0d3a933f3e5fddac12fc5323ef327ac6","3e138bd12711616266b4e8877d6f2425"],"7877":["6432238b59d294c44f0f770b41fc5344","ef7f84092c503948d194ba4814dcbf59","cc0e98dbe74f00dcbd3f5d2212907e84","ec6dca46d5694747bb20b0a660dae897","1fe15aef4ad702517434c542d42786b2","f85f53709ca28b0f099d7afda0867094","fa06cb888eec6a0bcc0b90b94adb22d4","8c8e0f5733c5b906887b2b9c88919fdd"],"7874":["6d1ba059c8c37184bb1cd0ebf85afb88","0fc1b6431aff1771429b3d0624ac88e9","733b954fc2814beda2625d0322e9df6f","ee01786417dd69d5221d2cfeabb7ab9b","e952689eafcd6c3f5d5638c3315ec35e","fe5719e63642b106a7f1785bc0f74a24","9e8511757fb1083a4f37a4662db45f8a","9a93661b2d62dc1623484ecf9d7ddbfd"]};
var _bsOdcien = variationsForm.querySelector('select[data-attribute_name="attribute_pa_kod-odcienia"]')
|| variationsForm.querySelector('select[data-attribute_name="attribute_tkanina"]');
var _bsStrona = variationsForm.querySelector('select[data-attribute_name="attribute_pa_strona"]')
|| variationsForm.querySelector('select[data-attribute_name="attribute_kierunek"]');
var _bsSlides = [].slice.call(document.querySelectorAll('.woocommerce-product-gallery__wrapper .woocommerce-product-gallery__image'));
var _bsOrigSlides = null;
if (_bsSlides.length) {
_bsOrigSlides = _bsSlides.map(function (sl) {
var img = sl.querySelector('img'), a = sl.querySelector('a');
return {
src: img && img.getAttribute('src'), srcset: img && img.getAttribute('srcset'),
dataSrc: img && img.getAttribute('data-src'), large: img && img.getAttribute('data-large_image'),
lw: img && img.getAttribute('data-large_image_width'), lh: img && img.getAttribute('data-large_image_height'),
href: a && a.getAttribute('href'),
thumb: sl.getAttribute('data-thumb'), thumbSrcset: sl.getAttribute('data-thumb-srcset')
};
});
}
function _bsThumbImgs() {
return [].slice.call(document.querySelectorAll('.flex-control-thumbs li img, .flex-control-nav li img'));
}
function _bsSetSlide(i, url, w, h) {
var sl = _bsSlides[i];
if (!sl || !url) return;
var img = sl.querySelector('img'), a = sl.querySelector('a');
if (img) {
img.removeAttribute('srcset');
img.setAttribute('src', url);
img.setAttribute('data-src', url);
img.setAttribute('data-large_image', url);
img.setAttribute('data-large_image_width', w || 1184);
img.setAttribute('data-large_image_height', h || 880);
}
if (a) a.setAttribute('href', url);
sl.setAttribute('data-thumb', url);
sl.removeAttribute('data-thumb-srcset');
var t = _bsThumbImgs()[i];
if (t) { t.removeAttribute('srcset'); t.setAttribute('src', url); }
}
function _bsRestoreGallery() {
if (!_bsOrigSlides) return;
var thumbs = _bsThumbImgs();
_bsSlides.forEach(function (sl, i) {
var o = _bsOrigSlides[i];
if (!o) return;
var img = sl.querySelector('img'), a = sl.querySelector('a');
if (img) {
img.setAttribute('src', o.src);
if (o.srcset) img.setAttribute('srcset', o.srcset); else img.removeAttribute('srcset');
img.setAttribute('data-src', o.dataSrc);
img.setAttribute('data-large_image', o.large);
img.setAttribute('data-large_image_width', o.lw);
img.setAttribute('data-large_image_height', o.lh);
}
if (a) a.setAttribute('href', o.href);
sl.setAttribute('data-thumb', o.thumb);
if (o.thumbSrcset) sl.setAttribute('data-thumb-srcset', o.thumbSrcset);
if (thumbs[i]) { thumbs[i].removeAttribute('srcset'); thumbs[i].setAttribute('src', o.thumb); }
});
}
function _bsGalleryFor(vd) {
var g = vd && BS_VAR_GALLERIES[vd.variation_id];
return g ? g.map(function (h) { return BS_GAL_CDN + h + '.jpg'; }) : null;
}
function _bsApplyVariantGallery(vd) {
var g = _bsGalleryFor(vd);
if (g) { g.forEach(function (u, j) { _bsSetSlide(j, u); }); return; }
var img = vd && vd.image;
if (img && img.src) _bsSetSlide(0, img.full_src || img.src, img.full_src_w, img.full_src_h);
}
var _bsOdcienKey = _bsOdcien && _bsOdcien.getAttribute('data-attribute_name');
var _bsStronaKey = _bsStrona && _bsStrona.getAttribute('data-attribute_name');
/* Synchronizuje galerie z aktualnym wyborem: pelny wariant > podglad odcienia > oryginal.
Woo przy czesciowym wyborze wywoluje reset_data i przywraca oryginal —
dlatego zamiast samego restore na reset_data re-aplikujemy podglad. */
function _bsApplyGallery() {
var code = _bsOdcien && _bsOdcien.value;
var side = _bsStrona && _bsStrona.value;
if (!code) { _bsRestoreGallery(); return; }
for (var i = 0; i < variationsData.length; i++) {
var vd = variationsData[i];
var a = vd.attributes || {};
if (a[_bsOdcienKey] !== code) continue;
if (side && _bsStronaKey && a[_bsStronaKey] !== side) continue;
_bsApplyVariantGallery(vd);
return;
}
}
if (window.jQuery) {
jQuery(variationsForm).on('found_variation', function (e, variation) {
_bsApplyVariantGallery(variation);
});
jQuery(variationsForm).on('reset_data', function () { setTimeout(_bsApplyGallery, 0); });
if (_bsOdcien) jQuery(_bsOdcien).on('change', _bsApplyGallery);
if (_bsStrona) jQuery(_bsStrona).on('change', _bsApplyGallery);
}
});
BS_JS;
add_action('wp_enqueue_scripts', function () use ($bs_pdp_css, $bs_pdp_js) {
wp_enqueue_style('bs-font-inter', 'https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap', [], null);
wp_add_inline_style('bs-style', $bs_pdp_css);
wp_add_inline_script('bs-frontend', $bs_pdp_js, 'after');
}, 30);