// 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