/**
 * KS Variation Manager — Frontend CSS.
 *
 * Styles for variation cards in product loops and any frontend visual adjustments.
 *
 * @package KS_Variation_Manager
 */

/* ──────────────────────────────
 *  Variation Cards in Loop
 * ────────────────────────────── */

/*
 * Variation cards in the shop/archive loop should look identical to
 * regular product cards. These rules provide subtle differentiators
 * and ensure proper display without conflicting with the Botiga theme.
 */

/* Variation badge — subtle indicator that this is a specific variation. */
ul.products li.product.type-product_variation .ks-vm-variation-badge {
    display: inline-block;
    font-size: 11px;
    font-weight: 500;
    background: #f0f0f1;
    color: #50575e;
    padding: 2px 8px;
    border-radius: 3px;
    margin-bottom: 6px;
}

/* Variation title — may be longer, so allow wrapping. */
ul.products li.product.type-product_variation .woocommerce-loop-product__title {
    word-wrap: break-word;
    overflow-wrap: break-word;
    hyphens: auto;
}

/* "Sepete Ekle" button — variation cards get a direct add-to-cart. */
ul.products li.product.type-product_variation a.add_to_cart_button {
    /* Already styled by theme — just ensure it's not hidden. */
    display: inline-block !important;
    opacity: 1 !important;
}

/* Hide "Select options" text that WooCommerce may show for variable products. */
ul.products li.product.type-product_variation a.product_type_variable {
    display: none;
}

/* ──────────────────────────────
 *  Single Product — Variation URL
 * ────────────────────────────── */

/* No additional styling needed for single product pages.
 * The variation pre-selection is handled via JavaScript.
 * Existing theme + VillaTheme Swatches styles apply. */

/* ──────────────────────────────
 *  Single Product — Dynamic Price
 * ────────────────────────────── */

/* Smooth transition when price updates. */
.product .summary .price.ks-vm-price-updated,
.product .entry-summary .price.ks-vm-price-updated,
.elementor-widget-wl-single-product-price .price.ks-vm-price-updated,
.elementor-widget-woocommerce-product-price .price.ks-vm-price-updated {
    transition: opacity 0.2s ease;
}

/* Quantity breakdown note shown when qty > 1. */
.ks-vm-qty-note {
    display: block;
    font-size: 0.75em;
    font-weight: 400;
    color: #666;
    margin-top: 4px;
    line-height: 1.4;
}

/* Sale price styling within the updated summary price. */
.price.ks-vm-price-updated del {
    opacity: 0.6;
    font-size: 0.9em;
    margin-right: 6px;
}

.price.ks-vm-price-updated ins {
    text-decoration: none;
    font-weight: 700;
}

/* Hide WooCommerce's default variation price that renders inside the add-to-cart
 * area (just above the button) once a variation is chosen. The live price now
 * always lives in our summary block (#ks-vm-summary "Tutar"), so this WC copy is a
 * duplicate. Unconditional + scoped-specific so it beats the theme/Elementor/
 * VillaTheme rules without depending on the JS style injection having run. */
.woocommerce div.product .single_variation_wrap .woocommerce-variation-price,
.woocommerce div.product .single_variation .woocommerce-variation-price {
    display: none !important;
}

/* ──────────────────────────────
 *  Botiga Theme Compatibility
 * ────────────────────────────── */

/* Botiga quick-view: disable for variation cards (they link directly). */
.type-product_variation .botiga-quick-view-button {
    display: none !important;
}

/* ──────────────────────────────
 *  Responsive
 * ────────────────────────────── */

@media screen and (max-width: 768px) {
    ul.products li.product.type-product_variation .woocommerce-loop-product__title {
        font-size: 14px;
    }
}

/* ══════════════════════════════════════════
 *  v2.0.0 — Reset Button Removal
 * ══════════════════════════════════════════ */

/* Hide "Clear/Temizle" reset variations link (CSS fallback for PHP filter). */
.reset_variations {
    display: none !important;
}

/* ══════════════════════════════════════════
 *  v2.0.0 — Variation Page: Hide-Until-Ready
 * ══════════════════════════════════════════ */

/* Hide variation selectors until JS confirms correct state. */
.ks-vm-variation-page .variations_form:not(.ks-vm-ready) .variations {
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.15s ease;
}

/* Reveal when ready. */
.ks-vm-variation-page .variations_form.ks-vm-ready .variations {
    opacity: 1;
    pointer-events: auto;
}

/* Bypass WC slideDown animation on variation pages — show price/add-to-cart immediately. */
.ks-vm-variation-page .single_variation {
    display: block !important;
    animation: none !important;
}

.ks-vm-variation-page .single_variation_wrap {
    display: block !important;
}

/* ══════════════════════════════════════════
 *  (KALDIRILDI) Loop mini adet sayacı — v2.287.0
 * ══════════════════════════════════════════
 * `.ks-vm-loop-qty-wrap` / `.ks-vm-qty-minus` / `.ks-vm-qty-plus` /
 * `.ks-vm-qty-input` kuralları buradaydı. Sayaç, "sepeti güncelle" modeliyle
 * birlikte kaldırıldı (operatör, 16 Ağu 2026); markup'ı üreten iki yer de yok:
 * KS_VM_Cart::loop_add_to_cart_link (silindi) ve cart-aware.js::buildStepperHtml
 * (silindi). `.ks-vm-cart-updating` DURUYOR — onu sepet sayfası da kullanıyor.
 * ══════════════════════════════════════════ */

.ks-vm-cart-updating {
    opacity: 0.6;
    pointer-events: none;
}

/* Disable-state only for add-to-cart buttons (no loader/check visuals). */
.add_to_cart_button[disabled],
.single_add_to_cart_button[disabled],
.add_to_cart_button.loading,
.single_add_to_cart_button.loading {
    opacity: 0.6;
    pointer-events: none;
}

/* "Hemen Satın Al" disabled until a full variation is chosen — same behaviour
 * as the WooCommerce add-to-cart button (toggled from cart-aware.js). */
.ks-vm-buy-now-btn:disabled,
.ks-vm-buy-now-btn.ks-vm-btn-disabled {
    opacity: 0.5;
    cursor: not-allowed;
    pointer-events: none;
}

/* Hide WooCommerce injected "View cart / Sepetim" forward link. */
a.added_to_cart.wc-forward {
    display: none !important;
}

/* Hide the theme/WC loader/check pseudo-elements (they sit on the RIGHT); we draw
 * our own spinner on the LEFT of the label instead (below). */
.add_to_cart_button.loading::after,
.single_add_to_cart_button.loading::after,
.ks-vm-atc-btn.loading::after,
.add_to_cart_button.added::after,
.single_add_to_cart_button.added::after {
    display: none !important;
    content: none !important;
}

/* Spinner shown immediately to the LEFT of the button label while an add / update
 * is in flight. The add-to-cart button carries `.loading` for the whole ajax add
 * (Woolentor sets it on click, removed on added_to_cart) — and since an update is
 * just an add with the set-qty flag, the same spinner covers "Sepeti Güncelle". */
/* 🚨 YALNIZ İKONSUZ butonlarda. İkonu olanlarda spinner ikonun KENDİ KUTUSUNA
 * çizilir (aşağıdaki `.ks-vm-icon-swap::before` bloğu) — yoksa kutu boyutu
 * değişir ve etiket yerinden oynar. */
.add_to_cart_button.loading:not(:has(.ks-vm-icon-swap))::before,
.single_add_to_cart_button.loading:not(:has(.ks-vm-icon-swap))::before,
.ks-vm-atc-btn.loading:not(:has(.ks-vm-icon-swap))::before,
.ks-vm-buy-now-btn.ks-vm-buy-now-loading:not(:has(.ks-vm-icon-swap))::before {
    content: "";
    display: inline-block;
    width: 1em;
    height: 1em;
    margin-right: 0.5em;
    /* not: flex butonlarda bu margin aşağıda sıfırlanır (gap zaten var) */
    vertical-align: -0.15em;
    border: 2px solid currentColor;
    border-top-color: transparent;
    border-radius: 50%;
    box-sizing: border-box;
    animation: ks-vm-btn-spin 0.6s linear infinite;
}

/* Ürün sayfası butonları flex + gap:0.5em — spinner'ın kendi margin'i gap'le
 * ÜST ÜSTE binip 1em'lik boşluk yaratıyordu; flex olanlarda margin gereksiz. */
.single_add_to_cart_button.loading::before,
.ks-vm-atc-btn.loading::before,
.ks-vm-buy-now-btn.ks-vm-buy-now-loading::before {
    margin-right: 0;
}

@keyframes ks-vm-btn-spin {
    to { transform: rotate(360deg); }
}

/* ── Button icons (KS_VM_Icons — Lucide/Feather inline SVG) ── */

/* Product-page buttons render icon + label as a centred flex row, so the icon is
 * always vertically centred with the text (an inline vertical-align is only ever
 * approximate). !important to win over the theme/Elementor button display. */
.single_add_to_cart_button,
.ks-vm-atc-btn,
.ks-vm-buy-now-btn {
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
}
/* Sync the add-to-cart button's hover COLOUR change with the icon cross-fade (0.2s):
 * Elementor/theme give this button a 0.3s transition, so its colours lagged the icon.
 * transition-duration only touches timing, leaving the transitioned properties intact. */
.single_add_to_cart_button,
.ks-vm-atc-btn {
    transition-duration: 0.2s !important;
}
/* ⭐ OPTİK ORTALAMA — etiket "1-2px aşağıda" görünüyordu (operatör, 15 Ağu 2026).
 *
 * Ölçüm (canvas TextMetrics, Plus Jakarta Sans 600/700): metrik kutu
 * ascent 1.04em / descent 0.22em, büyük harf yüksekliği 0.745em. CSS bir satırı
 * ortalarken METRİK kutuyu ortalar; o kutu yukarı doğru şişkin olduğu için
 * harflerin kendisi merkezin ALTINA düşüyor:
 *
 *     (1.04 − 0.22 − 0.745) / 2 = 0.0375em   → 15.2px yazıda 0.57px
 *
 * Ekran 1x iken bu sapma 1px'e yuvarlanıyor, yani gözle görülüyor. Aşağıdaki
 * transform tam o farkı geri alır: büyük harf kutusunun merkezi butonun
 * merkezine oturur, ikonun 1em kutusuyla da hizalanır.
 *
 * 🚨 Sabit px DEĞİL em: sapma yazı boyutuyla ölçekleniyor (13.6px etikette
 * 0.51px). 🚨 vertical-align DEĞİL transform: flex satırında vertical-align
 * etkisizdir ve komşulardan etkilenir (aynı ders KDV notunda alınmıştı).
 * 🚨 Yalnız ETİKET kaydırılır; ikon zaten kendi kutusunda ortalı.
 *
 * Metin uzunluğuna/harflerine göre DEĞİŞMEZ: düzeltme yazı tipinin sabiti,
 * dizginin değil. "Buy Now"daki y'nin kuyruğu etiketi yukarı ittirmez. */
.ks-vm-btn-label {
    transform: translateY(-0.0375em);
}
/* THE simple-vs-variable difference: Botiga sizes the add-to-cart button UP on
 * variable products only — a variable-scoped rule
 * (.single-product .woocommerce-variation-add-to-cart .button{font-size:1.6rem;
 * padding-top:1.55rem;padding-bottom:1.59rem}) that a simple product never matches,
 * because the .woocommerce-variation-add-to-cart element only exists for variable
 * products. So the button — and, through the row's align-items:stretch, every button's
 * height and label position — came out different on the two product types. Pin the
 * button to the SAME box as the buy-now button on BOTH types (!important to beat that
 * theme rule), so simple and variable render identically. */
/* `.ks-vm-atc-btn` (the detached [ks_add_to_cart_buttons] proxy) shares this
 * declaration rather than repeating the numbers: it stands in for the real
 * button, so the two must be the same box. Measured before adding it, everything
 * already matched EXCEPT font-size (15.2px vs 14px) and min-height. */
.single_add_to_cart_button,
.ks-vm-atc-btn {
    min-height: 46px !important;
    padding-top: 0 !important;
    padding-bottom: 0 !important;
    font-size: 0.95em !important;
    line-height: 1.4 !important;
    min-width: 185px !important;
}

/* Sized to the text and coloured with it. fill:currentColor is set explicitly (not
 * just via the SVG attribute) so the icon tracks the label's colour — including the
 * button's hover colour transition — identically. */
.ks-vm-icon {
    display: inline-block;
    width: 1em;
    height: 1em;
    fill: currentColor;
    flex: 0 0 auto;
    vertical-align: middle;
    transition: fill 0.2s ease;
}

/* Force the icon to the button's own text colour — i.e. exactly the label's colour
 * (currentColor === the button's `color`) — overriding the svg's fill presentation
 * attribute and any stray fill rule. Targets the svg AND its path. */
.single_add_to_cart_button .ks-vm-icon,
.single_add_to_cart_button .ks-vm-icon path,
.ks-vm-atc-btn .ks-vm-icon,
.ks-vm-atc-btn .ks-vm-icon path,
.ks-vm-buy-now-btn .ks-vm-icon,
.ks-vm-buy-now-btn .ks-vm-icon path,
.ks-btn .ks-vm-icon,
.ks-btn .ks-vm-icon path {
    fill: currentColor !important;
    color: inherit;
}

/* ⭐ LOADER ETİKETİ OYNATMAZ — spinner İKONUN KUTUSUNUN İÇİNE çizilir.
 *
 * Operatör iki kez bildirdi (önce Sepete Ekle, 15 Ağu'da Hemen Satın Al):
 * "loader açılınca ikon ile label arası bir anda açılıyor". Önceki çözüm
 * ikonu ve sarmalayıcısını `display:none` yapıp spinner'ı BUTONUN ::before'una
 * çiziyordu; ölçüm o yaklaşımın KÖKTEN kusurlu olduğunu gösterdi:
 *
 *   ikon sarmalayıcısı  17.47px   (`.ks-vm-icon-swap{font-size:1.15em}`)
 *   buton ::before      15.19px   (butonun 1em'i)
 *   → içerik 2.28px daralıyor, ortalanmış satırda etiket 1.14px kayıyor
 *
 * Doğru çözüm kutuya HİÇ DOKUNMAMAK: sarmalayıcı yerinde ve aynı boyutta
 * kalır, içindeki ikonlar `visibility:hidden` olur (yer kaplamaya devam
 * ederler), spinner de sarmalayıcının içine mutlak konumla çizilir. Böylece
 * düzen bir piksel bile değişmez.
 *
 * 🚨 Sarmalayıcının `font-size:1.15em`i sayesinde buradaki `1em` ikonun
 * boyutunun TA KENDİSİ — spinner ikonla birebir aynı yeri kaplar. İkon
 * boyutu değişirse spinner kendiliğinden uyar.
 * 🚨 İkonsuz butonlar (loop'taki `.add_to_cart_button`, mini sepet footer'ı)
 * eski yolu kullanmaya devam eder: yukarıdaki `:not(:has(.ks-vm-icon-swap))`. */
.single_add_to_cart_button.loading .ks-vm-icon,
.add_to_cart_button.loading .ks-vm-icon,
.ks-vm-atc-btn.loading .ks-vm-icon,
.ks-vm-buy-now-btn.ks-vm-buy-now-loading .ks-vm-icon,
.ks-vm-notify-btn.ks-vm-notify-loading .ks-vm-icon { /* Depoya talep gönder: aynı spinner (7 Eyl 2026) */
    visibility: hidden;
}
.single_add_to_cart_button.loading .ks-vm-icon-swap::before,
.add_to_cart_button.loading .ks-vm-icon-swap::before,
.ks-vm-atc-btn.loading .ks-vm-icon-swap::before,
.ks-vm-buy-now-btn.ks-vm-buy-now-loading .ks-vm-icon-swap::before,
.ks-vm-notify-btn.ks-vm-notify-loading .ks-vm-icon-swap::before {
    content: "";
    position: absolute;
    inset: 0;
    margin: auto;
    width: 1em;
    height: 1em;
    border: 2px solid currentColor;
    border-top-color: transparent;
    border-radius: 50%;
    box-sizing: border-box;
    animation: ks-vm-btn-spin 0.6s linear infinite;
}

/* Regular → filled on hover, CROSS-FADED (not instantly swapped) so the icon changes
 * in step with the button's 0.2s colour transition instead of popping first. KS_VM_Icons
 * wraps the two weights in .ks-vm-icon-swap; the filled svg is stacked on top of the
 * regular one, and hover fades one out while the other fades in over the same 0.2s. */
.ks-vm-icon-swap {
    position: relative;
    display: inline-flex;
    flex: 0 0 auto;
    vertical-align: middle;
}
/* Yalnız `opacity` geçişli — `fill` BİLEREK yok (27 Tem 2026).
 * İkonlar `fill: currentColor` kullanıyor, yani butonun `color` geçişini zaten
 * birebir takip ediyorlar. Üstüne bir de `fill` geçişi koymak, hâlihazırda
 * animasyonlu bir değeri ikinci kez yumuşatıyor ve ikon rengi label'ın birkaç
 * kare gerisinde kalıyordu. Operatör isteği: ikon ve label rengi AYNI ANDA
 * değişsin. Cross-fade (regular→filled) opacity üzerinden sürüyor. */
.ks-vm-icon-swap .ks-vm-icon {
    transition: opacity 0.2s ease;
}
.ks-vm-icon-swap .ks-vm-icon--fill {
    position: absolute;
    top: 0;
    left: 0;
    margin: 0;
    opacity: 0;
}
.single_add_to_cart_button:hover .ks-vm-icon--reg,
.ks-vm-atc-btn:hover .ks-vm-icon--reg,
.ks-vm-buy-now-btn:hover .ks-vm-icon--reg,
.ks-vm-notify-btn:hover .ks-vm-icon--reg,
.ks-btn:hover .ks-vm-icon--reg {
    opacity: 0;
}
.single_add_to_cart_button:hover .ks-vm-icon--fill,
.ks-vm-atc-btn:hover .ks-vm-icon--fill,
.ks-vm-buy-now-btn:hover .ks-vm-icon--fill,
.ks-vm-notify-btn:hover .ks-vm-icon--fill,
.ks-btn:hover .ks-vm-icon--fill {
    opacity: 1;
}

/* ── İKON ↔ ETİKET BOŞLUĞU ──
 * The gap lives on the CONTAINER as a flex gap, never as a margin on
 * .ks-vm-icon. The same icon markup is used by buttons AND by the panel
 * headings, which want different spacing: a global margin on the icon forces
 * every other consumer to un-set it, and tightening one place silently empties
 * the others — exactly how the Sepete Ekle / Hemen Satın Al gap disappeared when
 * the panel heading was tightened.
 * Each container now owns its own value, so they cannot affect each other:
 *   .ks-panel-head → 8px (declared with the panel)
 *   buttons        → 0.5em, scaling with the button's own font-size
 * Icon-only buttons (wishlist) are single-child flex boxes, so a gap has
 * nothing to apply to and they stay unaffected. */
.single_add_to_cart_button,
.ks-vm-atc-btn,
.ks-vm-buy-now-btn,
.ks-vm-notify-btn,
.ks-btn {
    gap: 0.5em;
}

/* ═══════════════════════════════════════════════
 *  Buy Now Button — Single Product Page
 * ═══════════════════════════════════════════════ */

/* (The add-to-cart + buy-now 50/50 row lives in one consolidated block further
 * down — search "share the row 50/50". Old conflicting layout rules removed.) */

.ks-vm-buy-now-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0 24px;
    min-height: 46px;
    /* Typography matched to the WooCommerce add-to-cart button (Elementor widget:
     * 0.95em / capitalize) so the two buttons read as a set.
     *
     * ⚠️ AĞIRLIK 600, 500 DEĞİL (operatör, 27 Tem 2026). Bu yorum eskiden "500"
     * diyordu ama Sepete Ekle o değeri kullanmıyor: onun 600'ü, devralınan
     * Elementor widget bloğundaki `font-weight: 600 !important` kuralından
     * geliyor (dosyada "ELEMENTOR WIDGET'INDAN DEVRALINAN STİLLER"). İkisi
     * yıllardır 500/600 diye ayrışmıştı — ölçüldü, tipografide başka HİÇBİR fark
     * yoktu (15.2px, Plus Jakarta Sans, 0.3px letter-spacing, capitalize,
     * line-height 15.2px hepsi eşitti).
     *
     * Sepete Ekle'nin ağırlığını değiştirirseniz burayı da güncelleyin; iki değer
     * ayrı yerlerde duruyor çünkü biri Elementor'dan devralınan blokta. */
    font-family: inherit;
    font-size: 0.95em;
    font-weight: 600;
    /* Sepete Ekle ile aynı buton ailesi kuralı (operatör 15 Ağu: etiket
     * "Buy Now" — sözcük başları büyük). Etiketin kendisi de öyle yazılı,
     * yani capitalize kalksa bile görünüm değişmez. */
    text-transform: capitalize;
    line-height: 1.4;
    letter-spacing: 0.3px;
    cursor: pointer;
    transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease, opacity 0.2s ease;
    white-space: nowrap;
    vertical-align: middle;
    /* Outline in the Elementor Global "Button Tertiary" (#DA6900), filled with it
     * on hover. Retune from Elementor → Site Ayarları → Renkler → Button Tertiary.
     *
     * ⚠️ 27 Tem 2026: bu kural ESKİDEN `--e-global-color-9b6e6c7` kullanıyordu ve
     * o global o tarihte **Button Primary Hover (#FFD73B)** olarak yeniden
     * tanımlandı — yani buton sessizce SARIYA döndü (ölçüldü: border ve metin
     * rgb(255,215,59), ekran görüntüsüyle de doğrulandı). Elementor global'leri
     * ID ile referanslandığı için yeniden adlandırma sessiz bir kaymaya yol açıyor;
     * bu dosyada o ID'yi kullanan HER yer gözden geçirildi. */
    background: transparent !important;
    border: 2px solid var(--e-global-color-f410e05, #DA6900) !important;
    border-radius: 100px !important;
    color: var(--e-global-color-f410e05, #DA6900) !important;
}

/* Hover: Button Tertiary ile DOLAR, ikon ve label saf beyaz.
 * Beyaz bilerek `#fff` — bir global değil: turuncu dolgunun üstünde okunurluğu
 * garanti eden tek değer bu, ve marka paletindeki bir renge bağlansaydı operatör
 * onu değiştirdiğinde kontrast sessizce bozulabilirdi. */
.ks-vm-buy-now-btn:hover,
.ks-vm-buy-now-btn:focus {
    background: var(--e-global-color-f410e05, #DA6900) !important;
    color: #fff !important;
    outline: none;
}

.ks-vm-buy-now-btn:active {
    opacity: 0.85;
}

/* Loading state — same visual as the add-to-cart button: the icon is replaced by
 * a spinner (::before) and the label stays. */
.ks-vm-buy-now-btn.ks-vm-buy-now-loading {
    opacity: 0.6;
    pointer-events: none;
}
/* Spinner + ikon gizleme ARTIK ORTAK KURALLARDA (bkz. `.loading::before`
 * bloğu ~270. satır). Burada kopyası duruyordu ve o kopyada `margin-right`
 * sıfırlanmıyor, `.ks-vm-icon-swap` de gizlenmiyordu → loader açılınca
 * spinner ile etiket arası bir anda açılıyordu. */

/* Shake animation when no variation is selected */
@keyframes ks-vm-shake {
    0%, 100% { transform: translateX(0); }
    15%, 45%, 75% { transform: translateX(-4px); }
    30%, 60%, 90% { transform: translateX(4px); }
}

.ks-vm-shake {
    animation: ks-vm-shake 0.5s ease;
}

/* ── Adet products: the adet dropdown IS the quantity, so hide the native box ──
 * Body flag `ks-vm-adet-active` is set by KS_VM_Adet::body_class only when the
 * product actually has adet options (post-migration: pa_adet non-variation).
 * The <input name="quantity"> stays in the DOM so it still submits — the server
 * (force_adet_quantity) and adet.js both keep it equal to the chosen adet. We
 * target the `.quantity` wrapper wherever the theme puts it (standard WC, the
 * variation grouping, and Elementor's add-to-cart holder), never the holder
 * itself (that also contains the add-to-cart button). Tune from Additional CSS. */
body.ks-vm-adet-active form.cart .quantity,
body.ks-vm-adet-active .woocommerce-variation-add-to-cart .quantity,
body.ks-vm-adet-active .e-atc-qty-button-holder .quantity {
    display: none !important;
}

/* ── "İstek Listesine Ekle" (wishlist) — icon-only button next to Buy Now ──
 * Styled like the buy-now button FOR NOW (transparent + accent border, filled on
 * hover) — a single standalone rule so its look can be differentiated later without
 * touching Buy Now. It carries only the Phosphor bookmark-simple icon: regular by
 * default, filled on hover AND while the product is in the wishlist
 * (.ks-vm-in-wishlist, toggled + persisted by cart-aware.js). */
.ks-vm-wishlist-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    /* Always a square: aspect-ratio ties width to height, padding:0 keeps the box
     * square, and min-width == min-height so it never collapses to a sliver. In the
     * button row align-self:stretch (grid rule above) makes the height match the other
     * buttons, so the square scales with them. border-radius:100px on a square = a
     * circular icon button, echoing the pill buttons. */
    aspect-ratio: 1 / 1;
    padding: 0;
    min-height: 47px;
    min-width: 47px;
    box-sizing: border-box;
    font-size: 1.1em;
    cursor: pointer;
    transition: background 0.2s ease, color 0.2s ease, border-color 0.2s ease, opacity 0.2s ease;
    vertical-align: middle;
    background: transparent !important;
    /* #ddd = eski --ks-sc-border token'ının değeri; token side cart'la birlikte
     * kaldırıldı (v2.182.0), görünüm birebir aynı kalsın diye sabitlendi. */
    border: 2px solid #ddd !important;
    border-radius: 100px !important;
    color: var(--e-global-color-primary) !important;
}
.ks-vm-wishlist-btn:hover,
.ks-vm-wishlist-btn:focus {
    background: var(--e-global-color-primary) !important;
    border: 2px solid #ddd !important;
    color: #fff !important;
    outline: none;
}
.ks-vm-wishlist-btn:active {
    opacity: 0.85;
}
/* Icon-only: no label gap; sized to sit comfortably centred in the square. */
.ks-vm-wishlist-btn .ks-vm-icon {
    margin: 0;
    width: 1.8em;
    height: 1.6em;
    padding-left: 2px;
}
/* Regular by default; filled on hover AND once the product is in the wishlist. The
 * in-wishlist state keeps the outlined button (filled bookmark in the accent colour),
 * so "saved" reads differently from a hover (filled bookmark on the filled bg). */
.ks-vm-wishlist-btn:hover .ks-vm-icon--reg,
.ks-vm-wishlist-btn.ks-vm-in-wishlist .ks-vm-icon--reg {
    opacity: 0;
}
.ks-vm-wishlist-btn:hover .ks-vm-icon--fill,
.ks-vm-wishlist-btn.ks-vm-in-wishlist .ks-vm-icon--fill {
    opacity: 1;
}

/* ── Mobilde KÜÇÜLTME YOK (27 Tem 2026, operatör) ──
 * Burada eskiden ≤480px için `padding:0 14px; font-size:13px; min-height:42px`
 * vardı. İki sorunu birden yaratıyordu:
 *   • Dokunmatik hedef 46px'ten 42px'e iniyordu — mobil tam tersini ister.
 *   • YALNIZ buy-now'a uygulanıyordu; Sepete Ekle'de karşılığı yoktu, yani iki
 *     buton mobilde 15.2px/46px ve 13px/42px diye AYRIŞIYORDU (ölçüldü).
 * Wishlist'in 42px'i de aynı sebeple kaldırıldı; artık her yerde tek ölçü.
 *
 * Aynı turda VillaTheme'in swatch küçültmesi de kapatıldı — ama o CSS'ten değil,
 * eklentinin kendi ayarından: WooCommerce → Variation Swatches → (her tasarım)
 * → "Reduce size / Mobile %". 85 idi, BOŞ bırakıldı. CSS'le ezilmedi çünkü o
 * blok ayarlardan üretiliyor ve boşken hiç basılmıyor; 100 yazmak da işe
 * yaramazdı (oran kodda iki kez uygulanıyor, iç kutu masaüstündeki 34px yerine
 * 46px olurdu). Eski değer: ["85","85","85"]. */

/* ══════════════════════════════════════════
 *  Elementor header ↔ Botiga gap fix
 * ══════════════════════════════════════════
 * Botiga reserves space for its sticky header with a body padding-top even when
 * an Elementor Theme Builder header replaces it (Botiga renders no header, but
 * the padding stays) — leaving a big empty gap above the Elementor header.
 * The body class is added server-side only on pages whose conditions resolve to
 * an Elementor header (see KS_VM_Frontend::elementor_header_body_class). */
body.ks-vm-elementor-header-active:not(.header-transparent) {
    padding-top: 0 !important;
}

/* ══════════════════════════════════════════
 *  EPro MİNİ CART (header hover sepeti, v2.183.0)
 * ══════════════════════════════════════════
 * Widget'ın kendi görünüm ayarları Elementor'da (header şablonu → Menu Cart);
 * buradakiler yalnız KS ekleri: panel başlığı + × butonunun başlıkla aynı
 * satıra alınması + tek-fiyat satırının okunurluğu. */

/* İLK BOYAMA FLASH'I — KÖK ÇÖZÜM PHP'DE (v2.183.4): EPro "improved CSS
 * loading" widget CSS'ini + şablon değişken dosyasını (post-4991.css) gövdede
 * geç basıyordu; KS_VM_Frontend::enqueue_assets ikisini artık HEAD'e alıyor —
 * operatör Elementor'dan stili değiştirse de ilk boyama hep güncel. (v2.183.1-2'nin
 * buradaki değer-kopyası yaklaşımı terk edildi: operatör widget'ı yeniden
 * stilleyince kopya bayatlayıp kendisi flash kaynağı oluyordu.)
 * Aşağıdaki tek kural DEĞER İÇERMEYEN yapısal emniyet kemeri: enqueue yolu bir
 * gün kırılırsa bile panel ilk boyamada açık BOYANAMAZ. */
body.elementor-default .elementor-widget-woocommerce-menu-cart:not(.elementor-menu-cart--shown) .elementor-menu-cart__container {
    transform: scale(0);
}

/* ═══════════════════════════════════════════════════════════════════
 * SEPET TOGGLE (cart ikonu) + SAYAÇ ROZETİ — TEK KAYNAK BU BÖLÜM
 * (operatör kararı, v2.191.0)
 * ═══════════════════════════════════════════════════════════════════
 * Toggle'ın ve sayacın TÜM görünümü buradan yönetilir; kurallar Elementor
 * widget kontrollerini (post-4991 şablon CSS'i) BİLİNÇLİ ezer — Elementor'dan
 * yapılacak toggle/sayaç stil değişiklikleri artık UYGULANMAZ, buradan yapın.
 * 🚨 Sayaç dairesi EPro'da EM tabanlıdır: font-size'ı değiştirmek daireyi ve
 * ofsetleri orantılı büyütür; sabit px width/height YAZMAYIN (yenilir). */

/* — NORMAL durum: buton kabuğu —
 * (geçiş süresi ikon+sayaçla AYNI olmalı; farklı süreler durum geçişinde
 * renklerin farklı anlarda değişmesine yol açıyordu — kötü UX, v2.191.1) */
.elementor-widget-woocommerce-menu-cart .elementor-menu-cart__toggle .elementor-menu-cart__toggle_button,
.elementor-widget-woocommerce-menu-cart .elementor-menu-cart__toggle .elementor-menu-cart__toggle_button:hover {
    background-color: transparent !important;
    width: 42px !important;
    height: 42px !important;
    padding: 0 !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    border: none !important;
    border-radius: 100px !important;
    transition: background-color 0.2s ease !important;
}
/* — NORMAL durum: ikon —
 * translate = eski asimetrik padding'in optik ortalaması; KAP'a uygulanır ki
 * sayaç rozeti ikonla birlikte kaysın. 🚨 i'ye transform VERME: rozet DOM'da
 * ikondan ÖNCE duran absolute kardeş — i'ye transform stacking context açıp
 * ikonu rozetin ÜSTÜNE boyuyor (yaşandı). */
.elementor-widget-woocommerce-menu-cart .elementor-menu-cart__toggle .elementor-button-icon {
    transform: translate(0.5px, 1.5px);
}
.elementor-widget-woocommerce-menu-cart .elementor-menu-cart__toggle .elementor-button-icon i {
    font-size: 30px !important;
    color: var(--e-global-color-primary, #000) !important;
    transition: color 0.2s ease !important;
}
/* — NORMAL durum: sayaç rozeti —
 * Boyut = font-size (daire em ile türer). Konum/dikey hiza da BURADAN:
 * top = dikey, inset-inline-end = yatay ofset, line-height = rakamın daire
 * içindeki dikey oturuşu (hepsi em → font-size ile orantılı ölçeklenir). */
.elementor-widget-woocommerce-menu-cart.elementor-menu-cart--items-indicator-bubble .elementor-menu-cart__toggle .elementor-button-icon .elementor-button-icon-qty[data-counter] {
    font-size: 11px;
    font-weight: 600;
    min-width: 18px;
    max-width: 18px;
    height: 18px;
    line-height: 18px;
    top: -0.75em;
    inset-inline-end: -0.75em;
    background-color: #DA6900;
    color: #fff;
    transition: background-color 0.2s ease, color 0.2s ease;
    text-align: center;
    padding-left: 1px;
}

/* — AKTİF durum (panel açık, --shown): Elementor'da bu durumun kontrolü yok.
 * Kaynak sırası gereği bu kurallar normal+hover kurallarından SONRA durmalı. */
.elementor-widget-woocommerce-menu-cart.elementor-menu-cart--shown .elementor-menu-cart__toggle .elementor-menu-cart__toggle_button,
.elementor-widget-woocommerce-menu-cart.elementor-menu-cart--shown .elementor-menu-cart__toggle .elementor-menu-cart__toggle_button:hover {
    background-color: var(--e-global-color-secondary, #F27A1A) !important;
}
.elementor-widget-woocommerce-menu-cart.elementor-menu-cart--shown .elementor-menu-cart__toggle .elementor-button-icon i {
    color: #fff !important;
}
.elementor-widget-woocommerce-menu-cart.elementor-menu-cart--shown.elementor-menu-cart--items-indicator-bubble .elementor-menu-cart__toggle .elementor-button-icon .elementor-button-icon-qty[data-counter] {
    background-color: var(--e-global-color-primary, #000);
    color: #fff;
}

/* 🚨 Elementor STICKY SPACER hayaleti (v2.188.4): header sabitlenirken
 * Elementor yerini korumak için header'ın visibility:hidden DERİN KLONUNU
 * basar (.elementor-sticky__spacer) — panel açıkken klon --shown sınıfıyla
 * kopyalanır ve aşağıdaki stepper kurallarının `visibility:visible!important`
 * force'u klonda da çalışıp SADECE −/+ oklarını hayalet gibi gösteriyordu
 * (sayfayla birlikte kayan çift oklar). Klondaki panel layout'a katkısız
 * (dropdown absolute) → komple kapat; tıklama/delege handler sızıntısı da
 * biter. */
.elementor-sticky__spacer .elementor-menu-cart__container {
    display: none !important;
}

/* YÜKLENİYOR durumu (operatör, v2.193.0): sayfa açılışında WC fragment
 * teyidi gelene dek panel içeriği güvenilir değil — mini-cart.js widget'a
 * .ks-vm-mc-loading basar (teyit/5sn emniyetinde kalkar); içerik gizli,
 * ortada spinner. Başlık satırı görünür kalır (content div'inin dışında). */
.elementor-menu-cart--cart-type-mini-cart.ks-vm-mc-loading .elementor-menu-cart__main {
    position: relative;
    min-height: 300px;
}
.elementor-menu-cart--cart-type-mini-cart.ks-vm-mc-loading .widget_shopping_cart_content {
    visibility: hidden;
}
.elementor-menu-cart--cart-type-mini-cart.ks-vm-mc-loading .elementor-menu-cart__main::after {
    content: "";
    position: absolute;
    top: 50%;
    left: 50%;
    width: 28px;
    height: 28px;
    margin: -14px 0 0 -14px;
    box-sizing: border-box;
    border: 2px solid rgba(0, 0, 0, 0.12);
    border-top-color: var(--e-global-color-secondary, #F27A1A);
    border-radius: 50%;
    animation: ks-vm-btn-spin 0.6s linear infinite;
}

/* BOŞ SEPET (operatör, v2.189.1): panel 300px; ph-smiley (regular) ikonu +
 * "Sepetiniz henüz boş…" metni (gettext penceresi, TR/EN) panelde dikey+yatay
 * ortalı. İkon CSS ::before — şablon metni esc_attr ile bastığından HTML
 * enjekte edilemez, glyph doğrudan Phosphor font'undan basılır. */
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__main:has(.woocommerce-mini-cart__empty-message) {
    min-height: 300px;
    display: flex;
    flex-direction: column;
}
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__main:has(.woocommerce-mini-cart__empty-message) .widget_shopping_cart_content {
    flex: 1 1 auto;
    display: flex;
}
.elementor-menu-cart--cart-type-mini-cart .woocommerce-mini-cart__empty-message {
    flex: 1 1 auto;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    gap: 8px;
    /* Panelin iç padding'i asimetrik (sol 20 / sağ 8, Elementor cart_padding)
     * — sağdan 12px daraltarak blok merkezi PANEL merkezine oturur. */
    margin: 0 12px 0 0;
    padding: 0 80px;
    text-align: center !important;
    line-height: 1.4em;
    /* Kit MUTED rengi (operatör) — EPro mesaj rengini kendi (0,3,0)
     * kuralında --empty-message-color değişkeninden okur, düz color burada
     * yenilir; değişkeni beslemek her özgüllükte kazanır. ::before ikonu
     * currentColor'dan devralır. */
    --empty-message-color: var(--e-global-color-01631af, #727272);
}
/* İkon = Phosphor smiley LIGHT ağırlık (operatör "daha ince" istedi; sitede
 * yalnız regular font seti yüklü → tek ikon için font ailesi eklemek yerine
 * light SVG'si data-URI MASK olarak basılıyor, renk currentColor'dan). */
.elementor-menu-cart--cart-type-mini-cart .woocommerce-mini-cart__empty-message::before {
    content: "";
    width: 54px;
    height: 54px;
    opacity: 0.8;
    background-color: currentColor;
    -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 256'%3E%3Cpath d='M173.19,155c-9.92,17.16-26.39,27-45.19,27s-35.27-9.84-45.19-27a6,6,0,0,1,10.38-6c7.84,13.54,20.2,21,34.81,21s27-7.46,34.81-21a6,6,0,1,1,10.38,6ZM230,128A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128ZM92,118a10,10,0,1,0-10-10A10,10,0,0,0,92,118Zm72-20a10,10,0,1,0,10,10A10,10,0,0,0,164,98Z'/%3E%3C/svg%3E") no-repeat center / contain;
    mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 256 256'%3E%3Cpath d='M173.19,155c-9.92,17.16-26.39,27-45.19,27s-35.27-9.84-45.19-27a6,6,0,0,1,10.38-6c7.84,13.54,20.2,21,34.81,21s27-7.46,34.81-21a6,6,0,1,1,10.38,6ZM230,128A102,102,0,1,1,128,26,102.12,102.12,0,0,1,230,128Zm-12,0a90,90,0,1,0-90,90A90.1,90.1,0,0,0,218,128ZM92,118a10,10,0,1,0-10-10A10,10,0,0,0,92,118Zm72-20a10,10,0,1,0,10,10A10,10,0,0,0,164,98Z'/%3E%3C/svg%3E") no-repeat center / contain;
}
/* Metin bir tık ince (600→400). Ayrı (0,3,0) kural: post-4991 şablon CSS'i
 * aynı (0,2,0) özgüllükle weight bastığından kaynak sırasına bırakmıyoruz. */
.elementor-menu-cart--cart-type-mini-cart .widget_shopping_cart_content .woocommerce-mini-cart__empty-message {
    font-weight: 400;
}

/* Ara Toplam satırı GİZLİ (operatör, v2.188.6) — satır toplamları zaten
 * görünür, panel sade kalsın. mini-cart.js'in mc_subtotal_html yaması div'i
 * güncellemeye devam eder (zararsız); geri istenirse bu kuralı sil. */
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__subtotal {
    display: none;
}

/* Footer butonlarında tıklama sonrası loader (operatör, 4 Ağu) — sepete ekle
 * butonundaki .loading::before halkasının aynısı (currentColor ile buton
 * yazı rengini alır). Durumu mini-cart.js basar (yalnız navigasyon gerçekten
 * başlıyorsa; ks-auth kapısı popup açtıysa basılmaz), pageshow/20sn temizler.
 *
 * 🚨 8 Ağu 2026: kanca artık <html>'de (`.ks-vm-mc-navigating` +
 * `data-ks-mc-nav`), butonun kendisinde DEĞİL. EPro paneli
 * wc_fragments_refreshed'te baştan basıyor ve butonu değiştiriyor; sınıf
 * butondayken loader navigasyon bitmeden sönüyordu. Ayrıntı: mini-cart.js.
 *
 * Navigasyon sürerken footer butonları tıklanamaz — ikinci bir tıklama
 * yarışan bir navigasyon başlatmasın; imleç de "çalışıyor" desin. */
html.ks-vm-mc-navigating .elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__footer-buttons a {
    pointer-events: none;
    cursor: progress;
}

html.ks-vm-mc-navigating[data-ks-mc-nav="checkout"] .elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__footer-buttons a.elementor-button--checkout::before,
html.ks-vm-mc-navigating[data-ks-mc-nav="cart"] .elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__footer-buttons a.elementor-button--view-cart::before {
    content: "";
    display: inline-block;
    width: 1em;
    height: 1em;
    margin-right: 0.5em;
    vertical-align: -0.15em;
    border: 2px solid currentColor;
    border-top-color: transparent;
    border-radius: 50%;
    box-sizing: border-box;
    animation: ks-vm-btn-spin 0.6s linear infinite;
}

/* Kapanış fade'inde ürün görselleri bir an "büyüyor" gibi görünüyordu
 * (v2.188.5): kapanış saf opacity animasyonu (ölçüldü — boyut/transform
 * kare kare sabit), görülen şey animasyon BAŞINDA tarayıcının paneli kendi
 * compositing katmanına alıp yeniden rasterize etmesi (özellikle tarayıcı
 * zoom'u %100 değilken bir karelik boyut/netlik kayması). Panel kalıcı kendi
 * katmanında tutulur → animasyon başında re-raster olmaz. */
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__container {
    will-change: transform, opacity;
}

/* Panel başlığı — PHP'de widget_shopping_cart_content'in DIŞINA basılıyor
 * (KS_VM_Frontend::inject_mini_cart_title), fragment tazelemesi silemez. */
.elementor-menu-cart--cart-type-mini-cart .ks-vm-mc-title {
    margin: 0;
    font-size: 16px;
    font-weight: 700;
    color: var(--e-global-color-primary, #000);
    line-height: 1.3;
}

/* Başlık satırı: [Alışveriş Sepeti ........ kapat] — mini-cart.js başlıkla
 * kapatma butonunu bu sarmalayıcıda birleştirir (buildTitleRow); flex dikey
 * ortalama sayesinde operatör kapatma ikonunun boyutunu/paddingi Elementor'dan
 * değiştirse de hiza bozulmaz. Kapatma butonu iki sınıfla gelebilir: EPro'nun
 * çizili ×'i (close-button) ya da özel ikon (close-button-custom). */
.elementor-menu-cart--cart-type-mini-cart .ks-vm-mc-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    flex-shrink: 0;
}
.elementor-menu-cart--cart-type-mini-cart .ks-vm-mc-head .elementor-menu-cart__close-button,
.elementor-menu-cart--cart-type-mini-cart .ks-vm-mc-head .elementor-menu-cart__close-button-custom {
    position: static;
    margin: 0;
    align-self: auto;
    flex: 0 0 auto;
}

/* Alt satır: [miktar kontrolü][spinner] ....... [fiyat] — tek flex hizası
 * (operatör). Fiyatı sağa auto-margin iter; böylece spinner kontrolün hemen
 * sağında durur (space-between olsaydı ortaya savrulurdu). EPro'nun fiyat
 * hücresine (product-price) filtreden basılıyor. */
.elementor-menu-cart--cart-type-mini-cart .ks-vm-mc-row {
    display: flex;
    align-items: center;
    justify-content: flex-start;
    gap: 8px;
    margin-top: 12px;
}
/* Satır yüksekliğini SOL kolon (3:4 görsel + altındaki Kaldır) belirler; sağ
 * kolon ondan kısa. EPro fiyat hücresini satır dibine yaslar (align-self:end)
 * ve görselin taşan boyu grid'in 1. satırına da dağılır → ad ile qty/fiyat
 * arasında kocaman boşluk (v2.188.1'de rozet kalkınca görünür oldu). Fix:
 * 1. satır = ad kadar (auto), artan boy tamamen 2. satıra (1fr) + fiyat
 * hücresi üste — qty/fiyat satırı adın hemen altında (aradaki 6px,
 * .ks-vm-mc-row'un bilinçli margin'i). */
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__product {
    grid-template-rows: auto 1fr;
}
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__product .elementor-menu-cart__product-price {
    align-self: start;
}
.elementor-menu-cart--cart-type-mini-cart .ks-vm-mc-row .ks-vm-mc-price {
    margin-inline-start: auto;
}

/* Satır fiyatı = [ks_bar_price] dili (rozet + üstü çizili + yeni; kargo
 * rozeti YOK — sunucu basmıyor), mini cart için küçültülmüş, satırın sağına
 * yaslı. Renk/ağırlık .ks-vm-bar-total'dan (secondary, 600) gelir. */
.elementor-menu-cart--cart-type-mini-cart .ks-vm-mc-price {
    font-size: 12px;
    overflow: visible;
    text-overflow: clip;
    flex: 0 0 auto;
}
/* İndirimsiz satır fiyatı kit TEXT renginde (operatör, v2.193.3) — secondary
 * yalnız indirimli fiyata kalır. İndirimsizde value tek çocuk taşır
 * (.ks-vm-summary-new); indirimlide rozet+del+ins kardeşler → kural düşmez. */
.elementor-menu-cart--cart-type-mini-cart .ks-vm-mc-price .ks-vm-bar-total-value > .ks-vm-summary-new:only-child {
    color: var(--e-global-color-text, #000);
    /* OPTİK orta hizası (operatör, 5 Ağu): kutu merkezleri stepper'la birebir
     * aynı ÖLÇÜLDÜ ama rakamlarda alt çıkıntı (descender) olmadığından glyph
     * görsel merkezi kutu merkezinin ~1px üstünde kalıyor; indirimli satırda
     * dolu rozet göz çapası olduğundan fark yalnız TEK fiyatlı satırda seziliyor.
     * 1px aşağı nudge = optik düzeltme; :only-child dışına SIZDIRMA. */
    position: relative;
    top: 1px;
}
/* (Kargo Bedava rozeti mini cart'tan KALDIRILDI — v2.188.1, operatör.
 * Ürün sayfası bar'ındaki/panellerdeki rozet aynen duruyor.) */

/* ── Satır içi MİKTAR KONTROLLERİ (v2.185.0) — sepet sayfası kontrollerinin
 * kompakt kopyası: perakende −/+ stepper, pack adet dropdown'ı. Ölçüler
 * .woocommerce-cart-form'daki 40px/130px kalıbın 28px/96px küçültmesi;
 * görsel dil (pill, tipografi, disabled durumu) birebir aynı. ── */
.elementor-menu-cart--cart-type-mini-cart .ks-vm-mc-qty {
    flex: 0 1 auto;
    min-width: 0;
}

/* Kaldır — ürün görselinin HEMEN ALTINDA ortalı METİN linki (operatör,
 * v2.188.0; önceki köşe ×-chip'inden dönüştürüldü, sepet sayfasındaki
 * .ks-vm-cart-remove diliyle aynı). mini-cart.js kaldırma hücresini her
 * çizimde görsel hücresine taşır (placeRemoveChips); metin sunucudan
 * anchor'ın içine basılır (mini_cart_remove_link). Burada EPro'nun chip
 * iskeleti nötrlenir: mutlak konum + yuvarlak çerçeve + pseudo × çizgileri. */
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__product-image .elementor-menu-cart__product-remove {
    position: static;
    width: auto;
    height: auto;
    margin-top: 6px;
    border: 0;
    border-radius: 0;
    background: none;
    overflow: visible;
    text-align: center;
    line-height: 1;
}
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__product-image .elementor-menu-cart__product-remove::before,
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__product-image .elementor-menu-cart__product-remove::after {
    content: none;
}
/* Görünmez kaplama anchor → görünür metin. display'e DOKUNMA: EPro aktif
 * anchor'ı (remove_from_cart_button / elementor_…) kendi CSS değişkenleriyle
 * seçiyor, ikisi de etiketli basılır ama yalnız aktifi görünür. :visited pin
 * ŞART — Botiga çıplak a:visited'ı #212121 boyuyor. */
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__product-image .elementor-menu-cart__product-remove > a,
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__product-image .elementor-menu-cart__product-remove > a:visited {
    position: static;
    opacity: 1;
    width: auto;
    height: auto;
    overflow: visible;
    font-size: 11px;
    font-weight: 400;
    line-height: 1.2;
    color: #999;
    text-decoration: underline;
    text-underline-offset: 2px;
    transition: color 0.15s;
}
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__product-image .elementor-menu-cart__product-remove > a:hover {
    color: #e74c3c;
}
/* Kaldırma hücresi görselin altına taşındığı için satırın sağında pay gereksiz. */
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__product {
    padding-inline-end: 0;
}
.elementor-menu-cart--cart-type-mini-cart .ks-vm-mc-qty .ks-vm-cart-qty {
    max-width: 110px;
    min-width: 110px;
}
/* Pack satırı: retail ile aynı kompakt −/+ sayaç (paket sayısı) — ek stil yok. */
.elementor-menu-cart__products div.quantity {
    box-sizing: border-box !important;
    display: flex !important;
    width: 100% !important;
    max-width: 104px !important;
    height: 34px !important;
    min-height: 34px !important;
    align-items: center !important;
    justify-content: space-between !important;
    /* Pack dropdown'la aynı pill kimliği (tema bağlamı dışında da garanti). */
    border: 1px solid #ccc;
    border-radius: 100px;
    background: #fff;
}
.elementor-menu-cart__products div.quantity .botiga-quantity-minus,
.elementor-menu-cart__products div.quantity .botiga-quantity-plus {
    /* Botiga anchor'ları .show sınıfı JS'le gelene dek gizler
     * (opacity:0 + visibility:hidden + display:none). Botiga'nın JS'i burada
     * bilinçli kilitli (data-qty-initialized) → .show hiç gelmez; üçünü de
     * kendimiz açıyoruz. */
    opacity: 1 !important;
    visibility: visible !important;
    flex: 0 0 auto;
    width: 26px !important;
    height: 100% !important;
    padding: 0 0 3px 0 !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    line-height: 1 !important;
    font-size: 16px !important;
    color: #212121;
    text-decoration: none;
}
.elementor-menu-cart__products div.quantity input.qty {
    flex: 1 1 auto;
    width: auto !important;
    min-width: 0;
    height: 100% !important;
    min-height: 0 !important;
    padding: 0 !important;
    border: 0 !important;
    background: transparent;
    text-align: center;
    font-size: 13px !important;
    font-weight: 500 !important;
    font-family: inherit !important;
    line-height: 1 !important;
    color: #212121 !important;
}
.elementor-menu-cart__products div.quantity input.qty[readonly] {
    cursor: default;
    background: transparent;
}
.elementor-menu-cart__products .botiga-quantity-plus.ks-vm-qty-disabled,
.elementor-menu-cart__products .botiga-quantity-minus.ks-vm-qty-disabled {
    opacity: 0.3;
    cursor: not-allowed;
    pointer-events: none;
}
/* Pack dropdown: cart sayfası pill'inin (40px) 34px kompakt kesimi; metin
 * dikeyde ortalı (line-height + simetrik dikey padding). */
.elementor-menu-cart__products select.ks-vm-cart-qty-select {
    min-width: 110px;
    max-width: 110px;
    height: 34px;
    min-height: 34px;
    padding: 5px 25px 5px 12px;
    font-size: 13px;
    line-height: 1.4;
    background-position: calc(100% - 12px) 50%;
    background-size: 10px;
}
/* Açılan panel — adet-dropdown.js paneli scroll kabından kaçırmak için
 * __main'e taşır (satır-içi scroll hatası); kompakt option stilleri artık o
 * scope'ta. */
.elementor-menu-cart__main > .ks-vm-adet-panel .ks-vm-adet-option {
    font-size: 13px;
    padding: 8px 12px;
}
/* Güncelleme yolda: yalnız DEĞİŞEN satırın tutarı soluklaşır ve kontrolün
 * sağındaki spinner döner — diğer satırlar net kalır (operatör). Kontroller
 * kilitlenmez; istekleri mini-cart.js kuyruğu tekilleştirir. */
.elementor-menu-cart__product.ks-vm-mc-line-busy .ks-vm-mc-price {
    opacity: 0.45;
    transition: opacity 0.15s ease;
}
.ks-vm-mc-spin {
    display: none;
    flex: 0 0 auto;
    width: 16px;
    height: 16px;
    box-sizing: border-box;
    border: 2px solid rgba(0, 0, 0, 0.12);
    /* Fiyatlarla aynı renk: kit SECONDARY (operatör, 3 Ağu — eski 9b6e6c7
     * sarısı değil; .ks-vm-bar-total ile aynı değişken, otomatik izler). */
    border-top-color: var(--e-global-color-secondary, #d83b3b);
    border-radius: 50%;
    animation: ks-vm-btn-spin 0.6s linear infinite;
}
.elementor-menu-cart__product.ks-vm-mc-line-busy .ks-vm-mc-spin {
    display: inline-block;
}

/* SEPET SAYFASINDA panel açılmaz (operatör, 2 Ağu): ikon + sayaç durur ama
 * hover/tık hiçbir şey yapmaz. pointer-events:none → fare olayları toggle'a
 * hiç ulaşmaz (EPro'nun mouseover/click handler'ları tetiklenmez, imleç de
 * default kalır); konteyner gizleme de klavyeyle (Tab+Enter) açılma ihtimalini
 * kapatan emniyet kemeri. Eski KS side cart'taki v2.96.2 kararının devamı. */
body.woocommerce-cart .elementor-widget-woocommerce-menu-cart .elementor-menu-cart__toggle {
    pointer-events: none;
}
body.woocommerce-cart .elementor-widget-woocommerce-menu-cart .elementor-menu-cart__container {
    display: none !important;
}

/* Görsel kolonu — EPro varsayılanı %28; operatör iki kademede küçülttü
 * (2 Ağu: 22% → 17%). Oran korunur: img aşağıda aspect-ratio ile kendini
 * kolona göre boyutlar, metin kolonu kazanılan yeri alır. */
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__product {
    grid-template-columns: 17% auto;
}

/* Ürün görseli = ürün sayfası galeri thumbnail'ının tıpkısı (operatör):
 * 3:4 + cover + 1px Elementor "Border" global rengi + 8px radius — değerler
 * "ÜRÜN GALERİSİ — DAİMA 3:4" bölümündeki thumbnail kurallarıyla birebir.
 * Kaynak dosya da zaten 3:4 (woocommerce_thumbnail 420×560). */
.elementor-menu-cart--cart-type-mini-cart .elementor-menu-cart__product-image img {
    aspect-ratio: 3 / 4;
    width: 100%;
    height: auto;
    object-fit: cover;
    object-position: center;
    display: block;
    border: 1px solid var(--e-global-color-dcb0b6a, #d1d1d1);
    border-radius: 8px;
    box-sizing: border-box;
}

/* ═══════════════════════════════════════════════════════════════════
 * HESAP MENÜSÜ — header user dropdown (v2.195.0) — TEK KAYNAK BU BÖLÜM
 * ═══════════════════════════════════════════════════════════════════
 * Eski "Hesabım" butonunun yerini alan user-ikonlu toggle + mini cart'ın
 * birebir görsel dilinde küçük menü paneli. Toggle görünümü yukarıdaki
 * "SEPET TOGGLE" kurallarının eşidir ve aynı sözleşme geçerlidir: Elementor
 * button kontrolleri (post-4991 CSS'i) BİLİNÇLİ ezilir — buton stili
 * Elementor'dan değil buradan değiştirilir. Panel mekaniği EPro mini cart
 * container/main ikilisinin KS kopyası (scale kapısı + 0.3s translateY
 * fade; kart: beyaz, 8px radius, 0 0 20px gölge, 10px üst boşluk). Markup
 * wp_footer'da basılır (KS_VM_Frontend::render_account_menu_source),
 * account-menu.js butonun içine taşır. */

/* Panel butona demirlenir. */
.elementor-widget-button.ks-vm-account {
    position: relative;
}

/* — Toggle: buton kabuğu (mini cart toggle ile aynı değerler) — */
.elementor-widget-button.ks-vm-account .elementor-button,
.elementor-widget-button.ks-vm-account .elementor-button:hover,
.elementor-widget-button.ks-vm-account .elementor-button:focus,
.elementor-widget-button.ks-vm-account .elementor-button:visited {
    background: transparent !important;
    width: 42px !important;
    height: 42px !important;
    padding: 0 !important;
    display: inline-flex !important;
    align-items: center !important;
    justify-content: center !important;
    border: none !important;
    border-radius: 100px !important;
    box-shadow: none !important;
    transition: background-color 0.2s ease !important;
}
/* Buton metni ("Hesabım") yalnız ekran okuyucuya — ikon-only görünüm ama
 * erişilebilir ad korunur; icon_indent boşluğu da anlamsızlaşır. */
.elementor-widget-button.ks-vm-account .elementor-button .elementor-button-text {
    position: absolute;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    border: 0;
    clip-path: inset(50%);
    overflow: hidden;
    white-space: nowrap;
}
.elementor-widget-button.ks-vm-account .elementor-button .elementor-button-icon {
    margin: 0 !important;
}
/* — Toggle: ikon — (translate = eski asimetrik padding'in optik ortalaması) */
.elementor-widget-button.ks-vm-account .elementor-button .elementor-button-icon i {
    font-size: 28px !important;
    color: var(--e-global-color-primary, #000) !important;
    display: inline-block;
    transform: translate(0.5px, 1.5px);
    transition: color 0.2s ease !important;
}
/* — AKTİF durum (panel açık) = mini cart --shown eşi. Kaynak sırası gereği
 * normal+hover kurallarından SONRA durmalı. — */
.elementor-widget-button.ks-vm-account.ks-vm-am-open .elementor-button,
.elementor-widget-button.ks-vm-account.ks-vm-am-open .elementor-button:hover {
    background: var(--e-global-color-secondary, #F27A1A) !important;
}
.elementor-widget-button.ks-vm-account.ks-vm-am-open .elementor-button .elementor-button-icon i {
    color: #fff !important;
}

/* — Panel mekaniği: container = konum + scale kapısı (kapanış fade'i bitene
 * dek yerinde kalır — EPro'nun 0s 0.4s gecikme hilesi), main = görünen kart
 * (0.3s opacity + translateY). Toggle gibi sağ kenara demirli. — */
.ks-vm-account .ks-vm-am-container {
    position: absolute;
    top: 100%;
    inset-inline: auto 0;
    z-index: 9998;
    transform: scale(0);
    transition: transform 0s 0.4s;
}
.ks-vm-account.ks-vm-am-open .ks-vm-am-container {
    transform: scale(1);
    transition: transform 0s;
}
.ks-vm-am-main {
    background: #fff;
    border-radius: 8px;
    box-shadow: 0 0 20px rgba(0, 0, 0, 0.2);
    margin-top: 10px;
    min-width: 220px;
    padding: 16px 0 8px;
    opacity: 0;
    transform: translateY(-10px);
    transition: 0.3s;
    will-change: transform, opacity;
}
.ks-vm-account.ks-vm-am-open .ks-vm-am-main {
    opacity: 1;
    transform: translateY(0);
}

/* Başlık satırı — mini cart .ks-vm-mc-head'in eşi: [Hesabım ..... kapat],
 * dikey ortalı; kapatma ikonu başlıkla aynı satırda sağ kenarda. */
.ks-vm-am-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 12px;
    padding: 0 20px 10px;
}
/* Başlık — mini cart panel başlığıyla aynı dil (.ks-vm-mc-title). */
.ks-vm-am-title {
    margin: 0;
    font-size: 16px;
    font-weight: 700;
    color: var(--e-global-color-primary, #000);
    line-height: 1.3;
}
/* Kapatma — mini cart'ın custom close'uyla birebir (canlıdan ölçüldü):
 * ph-arrow-up 27px, resting #B4B4B4, hover secondary, 0.3s renk geçişi.
 * İkon rengi currentColor'dan iner. */
.ks-vm-am-close {
    margin: 0;
    padding: 0;
    border: 0;
    background: none;
    cursor: pointer;
    line-height: 1;
    color: #B4B4B4;
    transition: color 0.3s;
}
.ks-vm-am-close i {
    display: block;
    font-size: 27px;
    line-height: 1;
}
.ks-vm-am-close:hover {
    color: var(--e-global-color-secondary, #F27A1A);
}

/* Öğeler — tam satır tıklanır; :visited pin ŞART (Botiga çıplak a:visited'ı
 * #212121 boyuyor). Hover: hafif zemin + secondary metin (ikon currentColor
 * ile birlikte döner). */
.ks-vm-am-nav {
    display: flex;
    flex-direction: column;
}
.ks-vm-am-nav .ks-vm-am-item,
.ks-vm-am-nav .ks-vm-am-item:visited {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px 20px;
    font-size: 14px;
    font-weight: 500;
    line-height: 1.3;
    color: var(--e-global-color-primary, #000);
    text-decoration: none;
    white-space: nowrap;
    transition: background-color 0.15s ease, color 0.15s ease;
}
.ks-vm-am-nav .ks-vm-am-item:hover {
    background: rgba(0, 0, 0, 0.04);
    color: var(--e-global-color-secondary, #F27A1A);
}
.ks-vm-am-nav .ks-vm-am-item i {
    font-size: 19px;
    line-height: 1;
    flex: 0 0 auto;
}
/* Çıkış üstü ayraç — kit Border rengi. */
.ks-vm-am-sep {
    margin: 6px 0;
    border-top: 1px solid var(--e-global-color-dcb0b6a, #D1D1D1);
}

/* Sticky spacer klonunda panel ölü kalmalı (v2.188.4 dersi — klon görünmez
 * ama visibility force'ları/absolute paneller sızabilir). */
.elementor-sticky__spacer .ks-vm-am-container {
    display: none !important;
}

/* ═══════════════════════════════════════════════════════════
 *  Adet — "how many strands in the package" selector
 *
 *  The row lives inside WooCommerce's own .variations table and reuses its
 *  th.label / td.value markup, so the theme styles it exactly like the length,
 *  colour and gramaj rows. Deliberately almost no CSS here: anything we add is
 *  something that can drift away from the rows above it.
 * ═══════════════════════════════════════════════════════════ */

/* Pack-info line: ℹ "Bu ürün 100 × 0.8 gr = 80 gr ağırlığında" (operatör,
 * 1 Eyl 2026): başta info ikonu, {agirlik} KALIN, font 0.875em. Satır YALNIZ
 * [ks_pack_info] shortcode'uyla basılır (otomatik form-içi basım operatör
 * kararıyla kaldırıldı) → konum ve boşluk Elementor'un işi, burada marj yok.
 * (Eski form-içi hiza kuralları — 123px sol + row-gap'e bağlı negatif calc —
 * otomatik basımla birlikte silindi.) JS display'i show() ile açar → flex
 * geçerli olur. */
.ks-vm-paket-info,
.ks-vm-stock-info {
    display: flex;
    /* Operatör: ikon metne göre TAM ORTALI (önceki flex-start + ofset denemesi
     * "biraz üstte" durdu — geri alındı). */
    align-items: center;
    gap: 6px;
    margin: 0;
    font-size: 0.875em;
    /* opacity DEĞİL renk: parent opacity'si strong'u da soluklaştırıyordu,
     * kalın değer tam koyu basılabilsin diye yumuşaklık renkten geliyor. */
    color: #777;
}
.ks-vm-paket-info .ks-vm-paket-info-ic,
.ks-vm-stock-info .ks-vm-paket-info-ic {
    flex: none;
    width: 1.2em;
    height: 1.2em;
    color: var(--e-global-color-secondary);
}
.ks-vm-paket-info strong {
    font-weight: 700;
    color: #212121;
}

/* ═══════════════════════════════════════════════════════════════════════════
 *  KS PANEL — ÜRÜN SAYFASI BİLGİ BLOKLARININ ORTAK KABUĞU
 *
 *  ⭐ TEK KONTROL NOKTASI. `[ks_delivery_info]` (Teslimat Bilgileri) ve
 *  `[ks_volume_discounts]` (Ürün İndirimleri) aynı kabuğu paylaşır: kutu,
 *  başlık, ikon, iç boşluk BURADAN yönetilir. Bir bloğun görünümünü tek başına
 *  değiştirmek isterseniz aşağıdaki `.ks-panel--delivery` / `.ks-panel--discounts`
 *  istisna bloklarını kullanın; ortak görünüm için burayı düzenleyin.
 *
 *  Markup (KS_VM_Panel::open/close):
 *    .ks-panel.ks-panel--{slug}.{bloğun-kendi-sınıfı}
 *      └ .ks-panel-head   → svg.ks-vm-icon + span.ks-panel-title
 *      └ .ks-panel-body   → bloğa özel satırlar
 *
 *  Yeni bir bilgi bloğu eklerken KS_VM_Panel::open() çağırın; kutuyu, başlığı ve
 *  çeviriyi hazır devralır.
 * ═══════════════════════════════════════════════════════════════════════════ */
/* The BOX itself carries no inner spacing — its two sections do (below). That is
 * what lets the heading's separator run edge to edge on its own, with no
 * negative margins and no value that has to be kept in sync with another. */
.ks-panel {
    margin: 0;
    padding: 0;
    border: 1px solid var(--e-global-color-dcb0b6a);
    border-radius: 8px;
    background: transparent;
    font-size: 0.9em;
    line-height: 1.45;
}

/* ⭐ İÇ BOŞLUK — TEK DEĞER, TEK YER. Both sections are inset by the same amount,
 * so the heading and the content line up and the box reads as one. Change this
 * one declaration to retune every panel's padding. */

.ks-panel-head {
    display: flex;
    align-items: center;
    gap: 6px;
    /* The head is a full-width block, so its bottom border already spans the box
     * edge to edge — no pulling out and pushing back needed. Same colour as the
     * row separators inside the panels, so it reads as one ruled list rather
     * than a title stuck on top of a table. */
    border-bottom: 1px solid var(--e-global-color-dcb0b6a);
    font-size: .9em;
    font-weight: 700;
    padding: 12px 12px 9px;
    line-height: 1em; 
}

/* Accent, not primary: Elementor's primary global on this site is near-black
 * (what the solid buttons use), so the mark would read as plain text. 9b6e6c7
 * is the orange accent the buy-now button and focus rings already use. */
.ks-panel-head .ks-vm-icon {
    flex: 0 0 auto;
    font-size: 1.25em;
    color: var(--e-global-color-secondary, #DA6900);
}

.ks-panel-title {
    min-width: 0;
}

.ks-panel-body {
    padding: 14px 14px 10px;
}

/* The two blocks fill the body themselves; it exists so the head can never be
 * caught by a descendant rule meant for the content. */
.ks-panel-body > :first-child {
    margin-top: 0;
}
.ks-panel-body > :last-child {
    margin-bottom: 0;
}

/* Stacked in the same column, the panels need one rhythm between them — the
 * first one hugs whatever is above it (buttons / add-to-cart). */
.ks-panel + .ks-panel {
    margin-top: 12px;
}

/* ══════════════════════════════════════════
 *  Merchant Volume Discounts — sade bilgi listesi (KS override)
 *
 *  Bu blok artık kendi tablosunu KURMUYOR: satırları "Gönderim Seçenekleri"
 *  panelinin satırlarının AYNISI (`.ks-vm-delivery-row` / `-name` / `-time`,
 *  yukarıdaki teslimat bölümünde tanımlı). Yani adet kolonu kargo adıyla,
 *  indirim kolonu kargo süresiyle birebir aynı — değerler kopyalanmadığı için
 *  biri elle değişince ikisi ayrışamaz (operatör isteği, 26 Tem 2026).
 *
 *  Kolon başlığı satırı da kaldırıldı; "N+ adet → %X" satırı kendini anlatıyor.
 *
 *  Botiga'nın genel tablo kenarlıklarını (`table th, table td, table tr`)
 *  sıfırlayan ~40 satır da bu yüzden GİTTİ — artık tablo yok, sıfırlanacak
 *  kenarlık da yok.
 * ══════════════════════════════════════════ */

/* Tek fark: eşik metni asla satır atlamasın ("100+ adet"). */
.ks-vd-qty {
    white-space: nowrap;
}

/* ═══════════════════════════════════════════════════════════
 *  Simple products — quantity shown as a variation-style row
 *
 *  KS_VM_Frontend::open_simple_qty_row wraps a simple product's quantity box in
 *  WooCommerce's own table.variations markup. Botiga styles `table.variations`
 *  unscoped, so the label/field already look like the variation rows. These
 *  rules only (a) replicate the label column Botiga scopes to `.variations_form`
 *  (which a simple product's form is NOT) and (b) let the row sit full-width
 *  above the add-to-cart button inside Elementor's flex holder.
 *  Fine-tune from Customizer → Additional CSS.
 * ═══════════════════════════════════════════════════════════ */
/* ⚠️ Dikey boşluk BURADA DEĞİL: satır aralıkları tek bir `gap`ten geliyor
 * (bkz. "SATIR RİTMİ" bölümü, --ks-atc-row-gap). Buraya margin eklemek o tek
 * kontrol noktasını böler. */
.ks-vm-simple-qty-table {
    margin: 0;
    border-collapse: collapse;
}

/* Match the label column width used by a variable product's rows (100px —
 * see the LABEL COLUMN WIDTH block near the summary table). */
.ks-vm-simple-qty-table th.label {
    width: 115px;
    text-align: start;
    padding: 0 15px 0 0;
    vertical-align: middle;
}
.ks-vm-simple-qty-table th.label label {
    margin: 0;
    vertical-align: middle;
}
.ks-vm-simple-qty-table td.value {
    vertical-align: middle;
}

/* Elementor Pro wraps [quantity + button] in a flex .e-atc-qty-button-holder;
 * let our full-width row break onto its own line so the button drops below it,
 * exactly as the variations table sits above the button on a variable page.
 * (Harmless if the holder is not flex — the block table is full-width anyway.) */
body.ks-vm-simple-qty .e-atc-qty-button-holder {
    flex-wrap: wrap;
}
/* Both the quantity row AND the summary block take a full line of their own,
 * so the add-to-cart button never shares a flex line with the (tall) summary
 * block — otherwise align-items:stretch blows the button up to its height. */
body.ks-vm-simple-qty .ks-vm-simple-qty-table,
body.ks-vm-simple-qty #ks-vm-summary {
    flex: 1 0 100%;
    width: 100%;
}

/* ── Add-to-cart + Buy-now: share the row 50/50 on tablet & desktop, stack to
 *    full width on mobile. ──
 *
 * VERIFIED live DOM (browser DevTools + faithful CLI render). The BOTIGA theme wraps
 * the add-to-cart area in .botiga-single-addtocart-wrapper (a flex COLUMN, width:100%)
 * on woocommerce_before/after_add_to_cart_button — NOT Elementor's holder. That real
 * parent is the same on both product types; only its contents differ:
 *
 *   VARIABLE (#643):                        SIMPLE (#5123):
 *   .woocommerce-variation-add-to-cart      form.cart
 *     input[hidden]                           input[hidden]
 *     .botiga-single-addtocart-wrapper        .botiga-single-addtocart-wrapper
 *       .quantity   (none on adet)              table.ks-vm-simple-qty-table (quantity)
 *       .single_add_to_cart_button             #ks-vm-summary          (stock/total)
 *       .ks-vm-buy-now-btn                     .single_add_to_cart_button
 *     input[hidden] × 3                        .ks-vm-buy-now-btn
 *
 * Making the wrapper a 2-col grid gives 50/50 buttons on the variable/adet product
 * (only the two buttons are visible). But on a simple product the SAME wrapper also
 * holds the quantity table and the summary block, so a naive 2-col grid tiled the
 * summary next to a button and pushed buy-now onto its own row.
 *
 * Robust fix: in every button container, EVERYTHING spans the full width by default,
 * and ONLY the two buttons are pulled back to one column each. So any child — the
 * quantity, the summary, a nested wrapper, or something added later — automatically
 * takes its own full-width row, and the two buttons are always the lone 50/50 pair.
 * !important beats the theme/Elementor/Botiga display+flex+width on these elements. */
.botiga-single-addtocart-wrapper,
.e-atc-qty-button-holder,
.woocommerce-variation-add-to-cart {
    display: grid !important;
    /* Sepete Ekle (1fr) | Hemen Satın Al (1fr) | wishlist (auto, icon-only). With no
     * wishlist button the trailing auto column collapses to 0, leaving the two 1fr
     * buttons at a clean 50/50. */
    grid-template-columns: 1fr 1fr auto;
    align-items: stretch;
    /* One uniform, tight gap between every button (column-gap between the three on a
     * row, row-gap between the add-to-cart row and the buy-now/wishlist row on mobile).
     * !important is REQUIRED: Botiga sets the gap with a more specific selector
     * (.product-gallery-summary .botiga-single-addtocart-wrapper{gap:20px} = 0,2,0),
     * which out-specifies a plain .botiga-single-addtocart-wrapper rule, so without
     * !important our value is ignored and the gap stays at Botiga's 20px.
     *
     * ⚠️ `gap` KISALTMASI DEĞİL, iki ayrı bildirim: bu ızgara yalnız butonları
     * değil, ürün tipine göre Adet tablosunu ve Tutar bloğunu da barındırıyor
     * (aşağıdaki şemaya bak). Dolayısıyla DİKEY boşluğu satır ritmi yönetmeli
     * (--ks-atc-row-gap), yatay boşluk ise butonlara ait 8px olarak kalmalı.
     * Fallback 8px: bu sarmalayıcı [ks_add_to_cart_form] dışında da (Elementor
     * widget'ıyla) kullanılabiliyor, orada değişken tanımlı değil. */
    column-gap: 8px !important;
    row-gap: var(--ks-atc-row-gap, 8px) !important;
}
/* Default: every direct child spans the full row. Covers the quantity box/table, the
 * summary block, a nested Botiga-wrapper/Elementor-holder, Botiga headings, hidden
 * inputs — no enumeration needed. */
.botiga-single-addtocart-wrapper > *,
.e-atc-qty-button-holder > *,
.woocommerce-variation-add-to-cart > * {
    grid-column: 1 / -1;
}
/* Exception: the two labelled buttons each take one 1fr column — add-to-cart + buy-now
 * share the halves. Also strips the width/margin the theme/Elementor/Botiga forces
 * (Botiga sets .button{width:100%}); min-width:0 lets a long label shrink to its cell. */
.botiga-single-addtocart-wrapper > .single_add_to_cart_button,
.botiga-single-addtocart-wrapper > .ks-vm-buy-now-btn,
.e-atc-qty-button-holder > .single_add_to_cart_button,
.e-atc-qty-button-holder > .ks-vm-buy-now-btn,
.woocommerce-variation-add-to-cart > .single_add_to_cart_button,
.woocommerce-variation-add-to-cart > .ks-vm-buy-now-btn {
    grid-column: auto;
    width: auto !important;
    max-width: none !important;
    min-width: 0;
    margin: 0 !important;
    box-sizing: border-box;
}
/* The wishlist icon takes the trailing auto column and stays a PERFECT SQUARE:
 * align-self:stretch fills the row height, and aspect-ratio:1 (on .ks-vm-wishlist-btn)
 * ties its width to that height → width == height, matched to the other buttons. */
.botiga-single-addtocart-wrapper > .ks-vm-wishlist-btn,
.e-atc-qty-button-holder > .ks-vm-wishlist-btn,
.woocommerce-variation-add-to-cart > .ks-vm-wishlist-btn {
    grid-column: auto;
    align-self: stretch;
    margin: 0 !important;
}
@media screen and (max-width: 767px) {
    .botiga-single-addtocart-wrapper,
    .e-atc-qty-button-holder,
    .woocommerce-variation-add-to-cart {
        grid-template-columns: 1fr auto; /* Hemen Al (1fr) | wishlist (auto) */
    }
    /* Sepete Ekle takes the full first row; Hemen Al + the wishlist icon share the
     * next row, so the icon button stays next to Buy Now on mobile. */
    .botiga-single-addtocart-wrapper > .single_add_to_cart_button,
    .e-atc-qty-button-holder > .single_add_to_cart_button,
    .woocommerce-variation-add-to-cart > .single_add_to_cart_button {
        grid-column: 1 / -1;
    }
}

/* ═══════════════════════════════════════════════════════════
 *  DAR KONTEYNER (< 400px) — @container, viewport DEĞİL
 *
 *  The add-to-cart widget is not always as wide as the screen: it can be placed
 *  in a narrow Elementor column, a two-column split or a sidebar, and there it
 *  needs the compact layout even on a 1440px desktop. So this responds to the
 *  FORM's OWN inline size rather than the viewport:
 *
 *    - every variation label moves ABOVE its options instead of sitting beside
 *      them (a 100px label column would leave almost nothing for the swatches)
 *    - "Sepete Ekle" gets a full row to itself; "Hemen Satın Al" + the wishlist
 *      icon share the row underneath
 *
 *  `form.cart` is the container (named `ks-atc`). The ≤767px media query above
 *  is kept as the no-@container fallback: it sets the SAME button layout, so the
 *  two can never disagree — on a phone both apply and agree.
 *
 *  Eşiği değiştirmek isterseniz: aşağıdaki tek `400px` değeri.
 * ═══════════════════════════════════════════════════════════ */
form.cart {
    container-type: inline-size;
    container-name: ks-atc;
}

@container ks-atc (max-width: 400px) {
    /* ── Etiketler seçeneklerin ÜSTÜNE ──
     * 🔑 These rows are NOT laid out as table cells. VillaTheme Swatches turns
     * every variation <tr> into `display: grid !important` with
     * `grid-template-columns: 2fr 8fr` (label | options) and `gap: 8px` — the
     * <table> markup is vestigial. So stacking is one declaration: collapse the
     * row to a single column and the row's own 8px gap becomes the space
     * between the label and its options. (Unwinding the table with
     * `display:block` does NOT work — VillaTheme's `display:grid` carries
     * !important and wins.)
     * The label also drops its fixed width, which otherwise keeps reserving a
     * fifth of the row for a one-word label. */
    form.cart table.variations:not(.ks-vm-summary-table) tr {
        grid-template-columns: 1fr;
        /* Side by side the 8px is a COLUMN gap; stacked it becomes the space
         * between a label and ITS OWN control — a different (and deliberately
         * smaller) distance than the row-to-row gap, so it has its own knob.
         * GRUPLAMA: bu değer --ks-atc-row-gap'ten KÜÇÜK kalmalı, yoksa etiket
         * kendi seçeneklerine değil ÜSTTEKİ satıra ait gibi okunur. */
        row-gap: var(--ks-atc-label-gap);
    }
    /* ⚠️ Hücrelerin dikey dolgusu ARTIK YOK (bkz. "SATIR RİTMİ" bölümü), o yüzden
     * buradaki eski `th.label { padding-bottom: 0 !important }` yaması kaldırıldı:
     * gruplama farkını artık yalnız yukarıdaki row-gap üretiyor.
     * `width` / `padding-inline` de burada DEĞİL — onlar (0,3,0)'lık
     * `.variations_form.cart .variations .label` tarafından eziliyordu ve ikinci
     * `@container` bloğuna taşındı (v2.119.2). */

    /* Tutar stays on one line — its value is short — but the label hugs its
     * text instead of holding a 2fr column, so the row still lines up at x=0
     * with the stacked options above it.
     *
     * ⚠️ Bu satırın GEOMETRİSİ ARTIK BURADA DEĞİL — hem `grid-template-columns`
     * hem th genişliği/padding'i ikinci `@container ks-atc` bloğuna taşındı:
     * burada yazılan hâlleri (0,2,2) v2.118.1'in devralınan-Elementor bloğu
     * (0,4,3) ve bu dosyanın "LABEL COLUMN WIDTH" kuralı (0,3,0) tarafından
     * eziliyordu, yani sessizce ölüydüler. Değiştirmeden önce oradaki notu
     * okuyun; buraya geri yazmak işe YARAMAZ. */

    /* ── Butonlar: Sepete Ekle üstte tek, altında Hemen Al + wishlist ── */
    form.cart .botiga-single-addtocart-wrapper,
    form.cart .e-atc-qty-button-holder,
    form.cart .woocommerce-variation-add-to-cart {
        grid-template-columns: 1fr auto; /* Hemen Al (1fr) | wishlist (auto) */
    }
    form.cart .botiga-single-addtocart-wrapper > .single_add_to_cart_button,
    form.cart .e-atc-qty-button-holder > .single_add_to_cart_button,
    form.cart .woocommerce-variation-add-to-cart > .single_add_to_cart_button {
        grid-column: 1 / -1;
    }
}

/* ═══════════════════════════════════════════════════════════
 *  Single-product template — stay centred when the summary is sparse
 *
 *  Botiga renders the single product as a flex child of `.main-row`
 *  (`.row.main-row > .product`), and that `.product` has no width set, so it
 *  sizes to its CONTENT. A rich product (wide variations/volume table) fills
 *  the row and reads as centred; a sparse product ([ks_volume_discounts] empty
 *  when no discount applies, no description) shrinks to its narrow content and,
 *  with the flex row's default justify-content:flex-start, collapses hard-left
 *  ("içerik yoksa tüm iç şablon sola yaslı"). Forcing the wrapper to full width
 *  makes every product fill the row; the Elementor boxed container inside then
 *  centres its own max-width via margin:auto, exactly like a full product.
 *  Scoped to the single-product wrapper (direct child of .main-row), so shop
 *  archives and related-products grids are untouched.
 * ═══════════════════════════════════════════════════════════ */
.single-product .main-row > .product {
    width: 100%;
    flex: 1 1 100%;
}

/* Headline WL: Product Price widget — hidden when the product has no price
 * range (a single-price/simple product); the live total lives in the block below. */
.ks-vm-price-hidden {
    display: none !important;
}

/* ═══════════════════════════════════════════════════════════
 *  Add-to-cart summary block — stock + live total (or "select options")
 *
 *  Printed by KS_VM_Frontend::render_summary_block below the options/quantity
 *  and above the buttons; filled live by frontend.js. Colours reuse the shared
 *  KS tokens, so they can be retuned from Customizer → Additional CSS.
 * ═══════════════════════════════════════════════════════════ */
/* No extra margin/padding of our own: the row spacing must come from the SAME
 * source as the option rows (VillaTheme's 10px swatch-row margin, copied onto
 * our rows in JS) so the block sits flush with the variations, not one gap
 * further down. */
.ks-vm-summary {
    margin: 0;
}
.ks-vm-summary-table {
    width: 100%;
    border-collapse: collapse;
    margin: 0;
}
/* Elementor's add-to-cart widget puts margin-bottom:24px on EVERY .variations
 * table (spacing before the buttons). Our summary block now sits between the
 * options and the buttons, so on the OPTIONS table that 24px opens a big gap
 * right above our block — drop it there. Our own summary table keeps its 24px,
 * which is now exactly the space before the buttons. !important because the
 * widget's selector (tied to its element id) far outweighs a plain rule. */
form.cart .variations:not(.ks-vm-summary-table) {
    margin-bottom: 0 !important;
}
/* ── LABEL COLUMN WIDTH (add-to-cart bloğu) ─────────────────
 * The label column ("Renk", "Uzunluk", "Adet", "Tutar" …) is 100px wide.
 *
 * THREE rules feed that one column and they must not drift apart:
 *   1. Botiga's own `.variations_form.cart .variations .label` (woocommerce.min.css,
 *      hardcoded 125px) — covers the real attribute rows on a VARIABLE product.
 *   2. `.ks-vm-summary-table th.label` — our Tutar row.
 *   3. `.ks-vm-simple-qty-table th.label` — the simple/retail-variable Adet row
 *      (declared further up, kept in step).
 * Botiga's rule is overridden below with the same selector rather than a heavier
 * one: ks-vm-frontend.css is enqueued AFTER botiga-woocommerce-style, so equal
 * specificity wins on order and no !important is needed.
 * Değeri değiştirmek isterseniz: aşağıdaki iki kural + yukarıdaki
 * .ks-vm-simple-qty-table th.label — üçü birlikte.
 *
 * ⚠️ Bu 100px YALNIZ geniş görünüm içindir. `@container ks-atc (max-width:400px)`
 * altında iptal ediliyor (th metnine yapışır) — çünkü dar bir kolonda 100px'lik
 * etiket kolonu "Tutar"ın yanında koca bir boşluk bırakıyordu. Dikkat: buradaki
 * ilk seçici `.variations_form` içerdiği için (0,3,0) yalnız VARIABLE üründe
 * eşleşir ve dar-görünüm kurallarını EZER; o yüzden oradaki iptal (0,5,4)
 * yazılmak zorunda kaldı. Bu bloğa dokunacaksanız orayı da kontrol edin.
 * ─────────────────────────────────────────────────────────── */
.variations_form.cart .variations .label,
.ks-vm-summary-table th.label {
    width: 115px;
    text-align: start;
    /* Logical padding, matching what Botiga declares on its own rows, so the
     * override changes the width and nothing else. */
    padding-block: 0;
    padding-inline: 0 15px;
    vertical-align: middle;
}
.ks-vm-summary-table th.label label {
    margin: 0;
    vertical-align: middle;
}
.ks-vm-summary-table td.value {
    padding: 0;
    text-align: start;
    vertical-align: middle;
}
/* ⚠️ Eskiden burada basit ürüne özel bir `padding-top:10px` vardı ("swatch
 * satırı olmadığı için boşluk kaybolmasın"). KALDIRILDI: satır arası boşluk artık
 * ürün tipinden bağımsız olarak tek bir gap'ten geliyor (bkz. "SATIR RİTMİ"),
 * o yama basit üründe Tutar satırını 10px aşağı iten TEK ürün-tipine-bağlı
 * istisnaydı — yani "düzen standart değil" şikâyetinin kaynaklarından biri. */
/* ═══════════════════════════════════════════════════════════════
 *  SINGLE PRODUCT — Tutar bloğu fiyat parçaları (.ks-vm-summary-*)
 *  YALNIZ ürün sayfasının add-to-cart özetinde kullanılır. Sepet sayfasının
 *  fiyat bloğu AYRI sınıflar taşır (.ks-vm-cart-price-*, dosyanın sonundaki
 *  CART PAGE bölümü) — burada yapılan değişiklik sepeti ETKİLEMEZ.
 *  Fiyatı büyütmek/küçültmek için: .ks-vm-summary-total-value font-size.
 * ═══════════════════════════════════════════════════════════════ */

/* The "select options" placeholder and the real total read identically — same
 * size, colour and weight. Flex centring keeps every piece (badge, struck old
 * price, current price, "(KDV Dahil)") on ONE vertical axis: with plain inline
 * flow the KDV note hung off the parent baseline while del/ins were
 * middle-aligned, so its height depended on which siblings were present —
 * measured 1.5px low on sale prices but 4.4px low on regular ones. */
.ks-vm-summary-total-value {
    font-size: 0.9em;
    font-weight: 500;
    display: inline-flex;
    align-items: center;
    flex-wrap: wrap;
    column-gap: 4px;
}
/* Fiyatın PUNTOSU — TEK KURAL (operatör, 1 Ağu akşam: "indirimliyken büyük,
 * indirimsizken normal yazıyordu; eşitlensin, iki ayrı kurala bağlı olmasın").
 * Liste iki yolu da kapsar: düz tutar (kabın doğrudan çocuğu) ve indirimli
 * tutarın içindeki rakamlar. Çizili eski tutar BİLEREK dışarıda — o kendi
 * küçük boyutunu (.ks-vm-summary-old) korur. .ks-vm-summary-new'e AYRICA
 * font-size verme: buradakiyle bileşir ve indirimliyi yine büyütür. */
.ks-vm-summary-total-value > .woocommerce-Price-amount,
.ks-vm-summary-new .woocommerce-Price-amount {
    font-size: 1.4em;
    font-weight: 700;
}
/* `.ks-vm-summary-vat` (the "(KDV Dahil)" note) KALDIRILDI — 27 Tem 2026,
 * operatör isteği. Kuralı da sildik: markup'ı üreten tek yer
 * frontend.js::renderSummary() idi, orası da temizlendi. */

/* Sale markup nests the amounts in del/ins; centre their contents too so the
 * current price sits on exactly the same axis as a plain (non-sale) price. */
.ks-vm-summary-total-value del,
.ks-vm-summary-total-value ins {
    display: inline-flex;
    align-items: center;
}

/* Volume-discount deal: struck normal total + campaign total + rate badge. */
.ks-vm-summary-old {
    /* [ks_bar_price] .ks-vm-bar-price-old'dan KOPYA (operatör, 1 Ağu akşam:
     * "bar stillerini form tutarına kopyala") — iki alan aynı görünür.
     * line-height açık: bar'da kaptan 1.3 geliyor, formda kap 1.85'ti. */
    color: #999;
    font-weight: 600;
    text-decoration: line-through;
    padding: 0 3px;
    font-size: 1em;
    line-height: 1.3;
}
.ks-vm-summary-new {
    /* [ks_bar_price] .ks-vm-bar-price-new'den KOPYA (operatör, 1 Ağu akşam).
     * WP'nin ins sarı vurgusu kapalı kalır (31 Tem). */
    font-weight: 700;
    text-decoration: none;
    vertical-align: middle;
    /* font-size YOK: rakamların boyutu yukarıdaki TEK kuraldan gelir. */
    background: transparent;
    letter-spacing: -0.3px;
    line-height: 1;
    padding: 0; /* bar'la aynı: yan padding yok */
}

/* Tutar rengi KOŞULLU (operatör, 1 Ağu akşam — 31 Tem'deki "daima secondary"
 * kararının revizyonu): İNDİRİM VARSA secondary, YOKSA Elementor text rengi.
 * Ayrım :has ile — indirimli içerik .ks-vm-summary-new taşır, düz tutar
 * taşımaz (basit ürünün JS-yazımı düz metni dahil). Çizili eski tutar kendi
 * grisini korur; is-prompt (yönlendirme cümlesi) normal renge döner. Bar
 * tarafı aynı kuralı zaten uyguluyor (--plain modifier'ı). */
.ks-vm-summary-total-value {
    color: var(--e-global-color-text, #212121);
}
.ks-vm-summary-total-value:has(.ks-vm-summary-new) {
    color: var(--e-global-color-secondary, #d83b3b);
}
.ks-vm-summary-total-value.is-prompt {
    color: inherit;
}
.ks-vm-summary-badge {
    /* [ks_bar_price] .ks-vm-bar-price-badge'den KOPYA (operatör, 1 Ağu akşam).
     * Renk Elementor Global Secondary — marka değişince otomatik uyar. */
    display: inline-block;
    margin: 0 2px;
    padding: 4px;
    line-height: 1;
    font-size: 1em;
    font-weight: 700;
    color: #fff;
    background: var(--e-global-color-secondary, #d83b3b);
    border-radius: 4px;
    white-space: nowrap;
    vertical-align: middle;
}

/* Single warning shown above the buttons on an incomplete add-to-cart click. */
.ks-vm-summary-warning {
    margin: 10px 0 0;
    padding: 8px 12px;
    font-size: 13px;
    font-weight: 600;
    color: #a94442;
    background: #fdecea;
    border: 1px solid #f5c6cb;
    border-radius: 8px;
}
.ks-vm-summary-warning[hidden] {
    display: none;
}

/* Eksik-seçim uyarısının BALONU KALDIRILDI (27 Tem 2026, operatör isteği).
 * Uyarı artık KSToast ile veriliyor (cart-aware.js::warnIncompleteSelection);
 * seçeneklerin shake efekti korundu. Balon butona `position:fixed` ile
 * sabitleniyordu ve ayrık butonlar sayfanın başka yerine taşınabildiğinden
 * bazen seçeneklerden kopuk kalıyordu. `.ks-vm-tooltip` kuralları da silindi —
 * markup'ı üreten tek yer o metottu. (Teslimat ipuçlarındaki `.ks-vm-tip`
 * BAŞKA bir bileşendir, ona dokunulmadı.) */

/* ═══════════════════════════════════════════════════════════════════════════
 *  ⚠️ ELEMENTOR WIDGET'INDAN DEVRALINAN STİLLER  (26 Tem 2026, v2.118.1)
 *
 *  Add-to-cart alanı Elementor'un `woocommerce-product-add-to-cart` widget'ıyla
 *  basılırken, o widget'ın 29 stil ayarı `post-775.css` içine WIDGET ID'SİNE
 *  bağlı olarak yazılıyordu (`.elementor-element-8689351 …`). Widget şablondan
 *  kaldırılıp yerine [ks_add_to_cart_form] konduğunda o CSS de yok oldu →
 *  sarı Sepete Ekle butonu, 100px pill dropdown'lar ve varyasyon tipografisi
 *  tema varsayılanına düştü.
 *
 *  Aşağıdakiler o kuralların BİREBİR karşılığı. Değerler tahmin değil: widget
 *  geçici olarak geri konup Elementor'a CSS'i yeniden ürettirildi ve üretilen
 *  bildirimler buraya taşındı. Elementor global renk değişkenleri korundu
 *  (`--e-global-color-*`), böylece operatör Site Ayarları'ndan marka rengini
 *  değiştirdiğinde burası da takip ediyor; fallback'ler o değişken bir gün
 *  kaybolursa diye.
 *
 *  🔑 Bu blok artık TEK KAYNAK: değeri Elementor'dan değil buradan değiştirin.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* ── Sepete Ekle: altın dolgu / siyah etiket, hover'da turuncu + beyaz ──
 * Elementor kuralı `.cart button, .cart .button` idi (formdaki TÜM butonlar);
 * buy-now ve wishlist kendi KS stillerini zaten daha yüksek özgüllükle
 * kazandığı için burada yalnız Sepete Ekle'yi ve onun ayrık vekilini boyuyoruz.
 * !important: Botiga bu butona `.single-product .woocommerce-variation-add-to-cart
 * .button` (0,2,1) ile renk veriyor ve yalnız variable üründe eşleşiyor —
 * !important olmadan simple/variable arasında renk farkı doğuyor. */
.single_add_to_cart_button,
.ks-vm-atc-btn {
    background-color: var(--e-global-color-cdea875, #F3C924) !important;
    color: var(--e-global-color-text, #000000) !important;
    border-style: none !important;
    text-transform: capitalize !important;
    font-weight: 600 !important;
    letter-spacing: 0.3px !important;
}
/* Hover'da YALNIZ arkaplan değişir (operatör, 27 Tem 2026): dolgu Button Primary
 * → Button Primary Hover'a geçer, yazı ve ikon Text renginde KALIR.
 *
 * `--e-global-color-9b6e6c7` burada doğru: o global artık "Button Primary Hover"
 * (#FFD73B) ve istenen de bu. Aynı ID'nin başka yerlerde turuncu anlamında
 * kullanılıyor olması ayrı bir sorundu, o kullanımlar f410e05'e taşındı.
 *
 * Eski `color:#FFFFFF` KALDIRILDI — sarı üstünde beyaz yazı hem okunmuyordu hem
 * de "sadece arkaplan değişsin" kuralını bozuyordu. */
.single_add_to_cart_button:hover,
.single_add_to_cart_button:focus,
.ks-vm-atc-btn:hover,
.ks-vm-atc-btn:focus {
    background-color: var(--e-global-color-9b6e6c7, #FFD73B) !important;
}

/* ── Varyasyon satırları ──
 * Seçiciler `.variations_form.cart .variations .label` kuralını (0,4,0) geçmek
 * ZORUNDA — Elementor'un kendi kuralı da 0,4,4 idi ve satır dolgusunu o
 * kazanıyordu. `form.cart.variations_form` iki sınıfı birlikte kullanmak
 * sayıyı 4'e çıkarıyor. */
/* ── Varyasyon tablosu TAM GENİŞLİK ──
 * `table.variations`'a genişlik veren HİÇBİR kural yok (tema, WooCommerce,
 * Elementor — üçünde de grep'ledim). Tablolar shrink-to-fit olduğundan genişlik
 * tamamen içeriğe kalıyor: ön yüzde VillaTheme satırları `display:grid` +
 * `2fr 8fr` ile 516px'e ulaşıyor, ama **Elementor editöründe tablo ~110px'e
 * çöküyor** → seçenek kolonu 40px → her swatch alt alta düşüyor ve "50 cm" iki
 * satıra kırılıyor (operatörün editör ekran görüntüsü). Formun kendisi geniş,
 * çöken yalnız tablo.
 *
 * Belirli bir genişlik vermek her iki bağlamı da aynı yapıyor: ön yüzde zaten
 * 516px'ti, orada no-op. */
.ks-vm-atc-form form.cart table.variations {
    width: 100%;
    /* ⚠️ `display:block` on the TABLE and TBODY — measured from the operator's
     * Elementor editor, where the layout collapsed:
     *
     *     tablo 565px  ·  tr 160px  ·  grid-template-columns: 100px 52.28px
     *
     * VillaTheme makes every variation <tr> a `display:grid` with `2fr 8fr`. A
     * grid box inside table internals gets wrapped in an anonymous table-cell,
     * and in the editor that cell's inline size comes out INDEFINITE — so the
     * `fr` tracks resolve like max-content and the options column shrinks to
     * ~52px, one swatch per line. (Front end it happened to be definite: the
     * form is a block there, while Elementor's stylesheet makes a non-variable
     * form `display:flex`, and a table flex-item keeps auto table layout for its
     * columns — that is the whole difference between the two contexts.)
     *
     * Taking table + tbody out of the table formatting context removes the
     * anonymous cell entirely: the grid rows become plain block children with a
     * definite 100% width, so `fr` resolves the same way everywhere. Rows that
     * are NOT grid (our simple-product Adet row) are block children too, which
     * is what they already looked like. `border-collapse` etc. are irrelevant —
     * every border in these tables was reset long ago. */
    display: block;
}
/* tbody = SATIRLARIN KABI → satır arası boşluk buradan gelir (blok değil ızgara;
 * bkz. "SATIR RİTMİ"). Grid tek kolonlu olduğu için satırlar eskisi gibi tam
 * genişlikte kalır, yalnız aralarına gap girer. */
.ks-vm-atc-form form.cart table.variations > tbody {
    display: grid;
    width: 100%;
    row-gap: var(--ks-atc-row-gap);
}
/* ── KS'İN KENDİ SATIRLARININ GEOMETRİSİ — CSS'te, JS'te DEĞİL ──
 * VillaTheme her varyasyon `<tr>`'sini `display:grid; 2fr 8fr; gap:8px` yapıyor.
 * KS'in kendi satırları (Adet, Tutar, basit ürünün Adet'i) o sınıfı ALMIYOR;
 * `adet.js` / `frontend.js` içindeki matchSwatchRowLayout() onu bir komşudan
 * KOPYALIYOR — yani satır geometrisi JS'e bağlıydı.
 *
 * 🚨 Elementor editöründe o JS sırasını hiç almıyor (widget AJAX ile yeniden
 * render ediliyor) → satırlar grid olmuyor → değer kolonları swatch satırlarına
 * göre ~20px sola kayıyor (operatörün editör ekran görüntüsü). Basit üründe ise
 * kopyalanacak komşu HİÇ yok, orada blok tbody içinde anonim tabloya düşüp
 * td 100px'e daralıyor ve `.quantity{max-width:25%}` yüzünden stepper 25px
 * çiziliyordu.
 *
 * Bu yüzden geometri artık burada, açıkça. Değerler VillaTheme'inkiyle birebir
 * aynı, dolayısıyla JS sınıfı geldiğinde de bir şey değişmiyor — o kopya artık
 * yalnız swatch'ın yatay/dikey varyantını taşıyor (bizim satırlarda swatch yok,
 * o varyantın etkisi de yok). */
.ks-vm-atc-form form.cart table.variations > tbody > tr.ks-vm-adet-row,
.ks-vm-atc-form form.cart table.variations > tbody > tr.ks-vm-option-row,
.ks-vm-atc-form form.cart table.variations > tbody > tr.ks-vm-summary-row,
.ks-vm-atc-form form.cart table.variations > tbody > tr.ks-vm-simple-qty-row {
    display: grid;
    grid-template-columns: 2fr 8fr;
    column-gap: 8px;
    align-items: center;
    /* This row carries ~10px inline padding of its own (the swatch rows have it
     * reset by VillaTheme). Left in, it pushed the whole row 10px right and made
     * its tracks 20px narrower than the Tutar row above it — measured thSol 602
     * vs 592. Zero it so all rows share one left edge. */
    padding-inline: 0;
}

/* ── Opsiyon satırlarının DİKEY padding'i (27 Tem 2026, v2.121.5 → 28 Tem'de
 *    KALDIRILDI) ──
 * Buradaki `padding-block: 0 4px` artık YOK: satır arası boşluk tek bir gap'ten
 * geliyor (bkz. "SATIR RİTMİ"), satırın kendi dolgusu sıfırlanıyor. Aşağıdaki
 * teşhis, aynı tuzağa bir daha düşülmesin diye duruyor.
 *
 * Operatör: "Uç Tipi ve Form satırlarının alt-üst padding'i diğerleri gibi
 * değil". Doğru — ölçüldü: opsiyon satırları 10px/10px, diğer HEPSİ 0/4px.
 *
 * Zinciri Chromium'un eşleşen-kural dökümüyle çıkardım (tahminle değil):
 *   1. tema      `table th, table td, table tr { padding: 10px }`      ← kaynak
 *   2. VillaTheme `.vi-wpvs-variation-style { padding: 0 !important }` ← sıfırlar
 *   3. Additional CSS (operatör)
 *      `.vi-wpvs-variation-style-horizontal { padding-bottom: 4px !important }`
 *
 * Adet ve Tutar satırları o VillaTheme sınıflarını JS ile bir swatch komşusundan
 * KOPYALADIKLARI için 2 ve 3'ü alıyorlar; opsiyon satırları kopyalamıyor, o
 * yüzden 1'de kalmışlardı. Yukarıdaki blok yalnız `padding-inline`'ı sıfırlıyordu
 * — dikey olan aynen duruyordu.
 *
 * Çözüm neden CSS, neden JS class-kopyası DEĞİL: bu dosyanın hemen üstteki
 * kararı gereği KS satırlarının geometrisi açıkça CSS'te duruyor, çünkü Elementor
 * editöründe o kopyalama JS'i hiç sırasını almıyor ve satırlar orada kayıyor.
 *
 * ⚠️ O 4px operatörün Customizer → Additional CSS'inden geliyordu (Botiga onu
 * `uploads/botiga/custom-styles.css` içine derliyor). Aşağıdaki sıfırlama onu da
 * eziyor; Additional CSS'teki
 * `.vi-wpvs-variation-style.vi-wpvs-variation-style-horizontal{padding-bottom:4px}`
 * satırı artık ETKİSİZ, silinebilir. */

/* Widget'ın "Variations Spacing" 29px'i BİLEREK taşınmadı: yukarıdaki
 * `form.cart .variations:not(.ks-vm-summary-table){margin-bottom:0 !important}`
 * kuralı onu zaten eziyordu (Tutar bloğu araya girdiğinden o boşluk seçeneklerin
 * hemen altında koca bir aralık açıyordu). Yani widget'lı hâlde de efektif değer
 * 0'dı — ölçümle teyitli. Geri eklemek eski bir kararı bozardı.
 *
 * ⚠️ Sarmalayıcı sınıf BİLEREK iki kez yazıldı: `.variations_form.cart
 * .variations .label` kuralı (0,4,0) bu satır dolgusunu yenerdi. Sınıfı
 * tekrarlamak sayıyı 4'e çıkarıp (0,4,4) yapıyor — Elementor'un kendi
 * özgüllüğünün aynısı. `form.cart.variations_form` yazmak daha temiz görünürdü
 * AMA o sınıf yalnız variable üründe var; BASİT ürünün Adet satırı da
 * `table.variations` (ks-vm-simple-qty-table) olduğu ve widget onu da
 * stillediği için basit ürün stilsiz kalıyordu. */
.ks-vm-atc-form.ks-vm-atc-form form.cart table.variations tr th,
.ks-vm-atc-form.ks-vm-atc-form form.cart table.variations tr td {
    /* Elementor "Space Between" 15px'ini satırın altına ve üstüne yarı yarıya
     * dağıtıyordu (calc(15px/2) = 7.5px). ARTIK 0: satır arası boşluğun TEK
     * kaynağı `--ks-atc-row-gap` (bkz. "SATIR RİTMİ"). Hücre dolgusu ile gap
     * birlikte çalışırsa aralıklar satırın içeriğine göre değişir — şikâyetin
     * kökü tam olarak buydu.
     * Kural SİLİNMİYOR: silinirse temanın `table th, table td { padding: 10px }`
     * kuralı geri gelir. */
    padding-block: 0;
}
.ks-vm-atc-form.ks-vm-atc-form form.cart table.variations label {
    color: var(--e-global-color-text, #000000);
    font-size: 0.9em;
    line-height: 36px;
}
.ks-vm-atc-form.ks-vm-atc-form form.cart table.variations td.value select,
.ks-vm-atc-form.ks-vm-atc-form form.cart table.variations td.value:before,
/* Yorum sıralaması aynı kutuyu kullanıyor (operatör, 30 Tem): tek kaynak. */
.ks-vm-reviews-toolbar select.botiga-reviews-orderby {
    font-size: 0.9em;
    font-weight: 500;
    border-radius: 100px;
}

/* ── BASİT ürün: Adet satırı tam genişlik ──
 * Elementor'un stylesheet'i variable OLMAYAN formu `display:flex` yapıyor ve
 * yönü SATIR bırakıyordu; formun tek esnek çocuğu Botiga'nın sarmalayıcısı ve
 * `flex-grow:0` olduğu için içeriğine göre 308px'te kalıyordu → Adet tablosu
 * daralıyor → Additional CSS'teki `.quantity{max-width:25%}` de onun %25'i
 * olduğundan stepper 104px yerine 52px çiziliyordu. Ölçüldü. Basit ve variable
 * ürünün aynı görünmesi bu projede açık bir karar (bkz. .single_add_to_cart_button
 * bloğu).
 * ⓘ Formun yönünü aşağıdaki "SATIR RİTMİ" bloğu artık HER ürün tipinde `column`
 * yapıyor; sütun düzeninde çapraz eksen zaten geriyor, yani genişlik kendiliğinden
 * %100. Taban `auto` bırakıldı: `100%` bir sütun flex'inde YÜKSEKLİĞE bakar. */
.ks-vm-atc-form form.cart:not(.variations_form) > .botiga-single-addtocart-wrapper {
    flex: 0 0 auto;
}

/* ═══════════════════════════════════════════════════════════════════════════
 *  ⭐ SATIR RİTMİ — TÜM SATIR ARALIKLARI TEK BİR `gap` DEĞERİNDEN (28 Tem 2026)
 *
 *  Operatör: "varyasyon satırları, adet dropdown'ı ve Tutar satırı arasındaki
 *  boşluklar iç padding'ler yüzünden standart değil; hepsi tek bir gap ayarıyla
 *  yönetilsin."
 *
 *  ÖNCEKİ DURUM (ölçüldü, 3 ürün tipi) — aralığı ÜÇ farklı mekanizma üretiyordu:
 *    • hücre dolgusu           th/td padding-block 7.5px  (Elementor "Space Between")
 *    • satır dolgusu           tr    padding-bottom 4px   (Customizer Additional CSS)
 *                              tr    padding-block  10px  (tema `table tr{padding:10px}`,
 *                                                          VillaTheme'in dokunmadığı
 *                                                          KS satırlarında canlı kalıyordu)
 *    • sarmalayıcı gap'i       .botiga-single-addtocart-wrapper gap:8px
 *    • ürün tipine özel yama   body.ks-vm-simple-qty …{padding-top:10px}
 *  Sonuç: seçenek↔seçenek 19px, seçenek↔Adet 29px, Adet↔Tutar 33px — ve değerler
 *  satırın hangi eklentiden geldiğine göre değişiyordu.
 *
 *  ŞİMDİ: satırların ve hücrelerin KENDİ dikey dolgusu/marjı YOK; boşluk yalnız
 *  satırları TAŞIYAN kapların `row-gap`'inden gelir. Kaplar (ürün tipine göre
 *  farklı iç içe geçmeler, hepsi aynı değişkeni kullanır):
 *
 *    form.cart                          seçenek tablosu ↔ Tutar ↔ varyasyon sarmalayıcı
 *    table.variations > tbody           seçenek satırı ↔ seçenek satırı ↔ Adet satırı
 *    .ks-vm-summary                     Tutar tablosu ↔ uyarı satırı
 *    .botiga-single-addtocart-wrapper   Adet tablosu ↔ Tutar bloğu (perakende/basit)
 *    .woocommerce-variation-add-to-cart  (aynı, bir üst katman)
 *
 *  🔑 AYAR NOKTASI — TEK YER: aşağıdaki `--ks-atc-row-gap`.
 *     Customizer → Additional CSS'ten de ezilebilir, !important gerekmez:
 *         .ks-vm-atc-form { --ks-atc-row-gap: 20px; }
 *
 *  `--ks-atc-label-gap` AYRI bir ölçüdür: dar konteynerde (<400px) etiket kendi
 *  kontrolünün ÜSTÜNE geçtiğinde aradaki mesafe. Gruplamanın doğru okunması için
 *  satır aralığından KÜÇÜK kalmalı — yoksa etiket üstteki satıra ait görünür.
 * ═══════════════════════════════════════════════════════════════════════════ */
.ks-vm-atc-form {
    --ks-atc-row-gap: 20px;
    --ks-atc-label-gap: 6px;
}

/* ── MOBİL RİTİM (18 Ağu 2026, operatör) ──
 * Etiketler seçeneklerin ÜSTÜNE geçtiği anda masaüstünün ritmi ters okunuyordu:
 * ölçüm → etiket ile kendi kutusu arası 7px, grup ile grup arası 24px. Etiket
 * neredeyse kutusuna yapışık, gruplar ise gereğinden uzaktı; form parça parça
 * görünüyordu. Operatör kararı: iç boşluk 10px, gruplar arası 16px.
 *
 * Buradaki DEĞİŞKENLER 9/12; ekranda ölçülen boşluklar 10/16 çıkıyor. Fark
 * sabit: etiket metninin üstünde `th`ın satır yüksekliğinden gelen ~4px, altında
 * ~1px ölü alan var. Yani bir sonraki ayarda hedefi değişkene çevirmek için
 * "iç = değişken + 1", "gruplar arası = değişken + 4" diye hesaplayın.
 *
 * Neden @media, neden @container DEĞİL: kap `form.cart`'ın KENDİSİ, ve bir
 * `@container` kuralı kabın kendisini seçemez — değişkeni orada tanımlayamıyoruz.
 * Masaüstünde dar bir Elementor kolonuna konursa 20/6 devam eder; oran hâlâ
 * doğru yönde olduğu için bu bir gerileme değil.
 *
 * ⚠️ GRUPLAMA KURALI korunuyor: label-gap < row-gap (9 < 12). İkisini eşitlemek
 * ya da ters çevirmek etiketi ÜSTTEKİ gruba aitmiş gibi gösterir. */
@media (max-width: 767px) {
    .ks-vm-atc-form {
        --ks-atc-row-gap: 12px;
        --ks-atc-label-gap: 9px;
    }
}

/* ── 1) Satırların ve hücrelerin KENDİ dikey boşluğu sıfır ──
 * `!important` + (0,4,3): yenmesi gereken en yüksek bildirim, Customizer'dan gelen
 * `.vi-wpvs-variation-style.vi-wpvs-variation-style-horizontal{padding-bottom:4px
 * !important}` (0,2,0 !important) — özgüllük farkıyla yeniliyor. Yatay dolguya
 * DOKUNULMUYOR: etiket kolonunun sağındaki 15px oradan geliyor. */
.ks-vm-atc-form.ks-vm-atc-form form.cart table.variations > tbody > tr {
    padding-block: 0 !important;
    margin-block: 0 !important;
}

/* ── 2) Satır bloklarının (tablo / özet kutusu) kendi marjı sıfır ──
 * Elementor'un add-to-cart widget'ı HER `.variations` tablosuna margin-bottom:24px
 * basıyor; Botiga da `.ks-vm-simple-qty-table` gibi tablolara margin veriyor. */
.ks-vm-atc-form form.cart table.variations,
.ks-vm-atc-form form.cart .ks-vm-summary {
    margin-block: 0 !important;
}

/* ── 3) Boşluğu ÜRETEN kaplar ──
 * form.cart: Botiga zaten `.variations_form.cart{flex-direction:column}` diyor ama
 * BASİT üründe yön `row` kalıyordu (Elementor) ve ≤1024px'te form blok oluyordu —
 * yani kap her ürün tipinde/genişlikte aynı davranmıyordu. Burada tek bir sütun
 * flex'ine sabitleniyor; `row-gap`i başka hiçbir kural bildirmediği için
 * !important gerekmedi. */
.ks-vm-atc-form form.cart {
    display: flex;
    flex-direction: column;
    row-gap: var(--ks-atc-row-gap);
}
.ks-vm-atc-form form.cart .ks-vm-summary {
    display: grid;
    row-gap: var(--ks-atc-row-gap);
}

/* ── 4) İçi tamamen boşalan sarmalayıcı gap YEMESİN ──
 * #643 gibi ürünlerde (adet satırı ana varyasyon tablosunda + butonlar ayrık)
 * `.single_variation_wrap` sıfır yükseklikte kalıyor ama yine de bir flex ögesi
 * olduğu için formun sonuna bir satır boşluğu kadar ölü alan ekliyor.
 * Koşullar bilerek dar: YALNIZ butonlar ayrıkken (form içindekiler gizli) VE adet
 * modu aktifken (WC'nin kendi `.quantity` kutusu da gizli) VE içinde satır taşıyan
 * bir tablo yokken. İçindeki gizli input'lar (variation_id vb.) `display:none`
 * altında da gönderilir ve JS onları okumaya devam eder.
 * `!important` ŞART: WooCommerce'in varyasyon JS'i init'te
 * `$singleVariationWrap.show()` diyerek satır-içi `display:block` basıyor. */
body.ks-vm-adet-active.ks-vm-detached-atc .ks-vm-atc-form form.cart > .single_variation_wrap:not(:has(table.variations)),
body.ks-vm-adet-active:has(.ks-vm-detached-buttons) .ks-vm-atc-form form.cart > .single_variation_wrap:not(:has(table.variations)) {
    display: none !important;
}

/* ── DAR KONTEYNER: Adet satırı da üste alınır, kontrol TAM GENİŞLİK ──
 * Bu blok, dosyanın başındaki `@container ks-atc` bloğunun DEVAMI; buraya
 * konması zorunlu çünkü hemen yukarıdaki açık grid kuralı (0,4,4) oradaki genel
 * kuralı (0,3,3) yeniyor — o yüzden v2.118.8'den sonra swatch satırları dar
 * görünümde üste geçerken Adet satırı iki kolonda kalıyordu (ölçüm: swatch
 * `1fr` iken Adet `74.8px 299.3px`).
 *
 * Sarmalayıcı sınıf iki kez yazılı: yukarıdaki kuralla EŞİT değil, ONDAN YÜKSEK
 * olması gerekiyor. Aynı özgüllükte kalıp sıraya güvenmek, ileride kurallar
 * yeniden sıralanırsa sessizce bozulurdu.
 *
 * Operatör isteği: bu görünümde Adet kontrolü — dropdown da olsa +/- stepper da
 * olsa — satırın tamamını kaplasın. Bu yüzden hem select'in 155px tavanı hem
 * stepper'ın `max-width:25%`'i (Additional CSS) burada kaldırılıyor. */
@container ks-atc (max-width: 400px) {
    .ks-vm-atc-form.ks-vm-atc-form form.cart table.variations > tbody > tr.ks-vm-adet-row,
    .ks-vm-atc-form.ks-vm-atc-form form.cart table.variations > tbody > tr.ks-vm-option-row,
    .ks-vm-atc-form.ks-vm-atc-form form.cart table.variations > tbody > tr.ks-vm-simple-qty-row {
        grid-template-columns: 1fr;
        /* Etiket ↔ kendi kontrolü; satır↔satır aralığı DEĞİL (bkz. SATIR RİTMİ). */
        row-gap: var(--ks-atc-label-gap);
        /* Kontrol satırı doldurunca ortalamak yerine gerdirmek gerekiyor. */
        align-items: stretch;
    }

    /* ── Etiket ↔ kendi içeriği arasındaki boşluk (operatör: fazlaydı) ──
     * Ölçüm: görünen boşluk 17px iken satır↔satır boşluğu 15px'ti — neredeyse
     * eşit, o yüzden etiket kendi seçeneklerine ait gibi okunmuyordu. İki
     * kaynağı vardı:
     *   • Elementor'dan devralınan `table.variations label{line-height:36px}` —
     *     yan yana düzende dikey ortalama için gerekli, ama üst üste geçince
     *     metnin ALTINDA ~11px ölü alan bırakıyor;
     *   • hücrenin 7.5px üst padding'i.
     * İkisi de yalnız bu görünümde kısıldı → ~7px. Satır↔satır 15px'te kaldığı
     * için gruplama artık doğru yönde (7 < 15).
     *
     * `!important`: devralınan kural (0,5,4) ile bu blok aynı özgüllükte, sıraya
     * güvenmek istemiyoruz. Özet tablosu hariç tutuldu — Tutar satırı bu
     * görünümde hâlâ yan yana duruyor, onun ritmi değişmemeli. */
    .ks-vm-atc-form.ks-vm-atc-form form.cart table.variations:not(.ks-vm-summary-table) th.label,
    .ks-vm-atc-form.ks-vm-atc-form form.cart table.variations:not(.ks-vm-summary-table) th.label label {
        line-height: 1.4 !important;
    }

    /* ── Tutar satırı: etiket DEĞERİNE yapışsın (27 Tem 2026, v2.119.0) ──
     * Operatör: dar görünümde "Tutar" ile tutarın arası fazla.
     *
     * 🚨 Bu kural, dosyanın başındaki `@container` bloğunda ZATEN yazılmıştı
     * (`form.cart .ks-vm-summary-table tr {grid-template-columns: auto 1fr}`,
     * 0,2,2) ama v2.118.1'de eklenen devralınan-Elementor bloğu KENDİ satır
     * geometrisini 0,4,3 ile bastırdığından (yukarıdaki
     * `… > tbody > tr.ks-vm-summary-row {grid-template-columns: 2fr 8fr}`) o
     * kural sessizce ölüydü — yani Tutar satırı dar görünümde de 2fr/8fr
     * kolonda kalıyordu. Etiket kolonu satırın %20'sini tutuyor, "Tutar" onun
     * yarısını doldurmuyor; görülen boşluğun büyük kısmı 8px gap DEĞİL, o boş
     * track'ti. Adet satırında aynı tuzağa v2.118.8'de düşülmüş ve bu blokta
     * çözülmüştü; Tutar satırı atlanmış.
     *
     * `auto` = etiket kendi metni kadar, `1fr` = kalan her şey değere. Geriye
     * yalnızca satırın kendi 8px column-gap'i kalır — AMA bu tek başına yetmedi,
     * hemen aşağıdaki th genişlik kuralı olmadan `auto` track 100px'te kalıyor.
     *
     * Sarmalayıcı sınıf yine iki kez: (0,5,4) > devralınan bloğun (0,4,3)'ü.
     * Aralığı ayarlamak isterseniz TEK değer: aşağıdaki column-gap. */
    .ks-vm-atc-form.ks-vm-atc-form form.cart table.variations.ks-vm-summary-table > tbody > tr {
        grid-template-columns: auto 1fr;
        column-gap: 8px;
    }

    /* ── th.label GENİŞLİĞİ: 100px'i bırak, metnine yapış (v2.119.2) ──
     * Operatör: "dar görünümde th yine 100px alıyor, o yüzden hâlâ uzak."
     * Doğru gözlem — `auto` track'i yukarıda vermek YETMEZ, çünkü bir grid
     * ögesinin `auto` track'e katkısı kendi belirtilmiş genişliğidir; th 100px
     * dediği sürece track de 100px oluyor.
     *
     * 🚨 Suçlu Botiga DEĞİL, bu dosyanın kendi "LABEL COLUMN WIDTH" bloğu:
     *     .variations_form.cart .variations .label  →  width:100px; padding-inline:0 15px
     * Özgüllüğü (0,3,0), bloğun başındaki `form.cart .ks-vm-summary-table
     * th.label {width:auto; padding-inline:0}` kuralından (0,2,2) YÜKSEK →
     * o kural da sessizce ölüydü. Aynı sebeple 15px'lik son-padding de duruyordu,
     * yani metinden sonra 15px + 8px gap = 23px ölü alan vardı.
     * Not: o seçici `.variations_form` içerdiği için yalnız VARIABLE üründe
     * eşleşiyor — basit üründe zaten sorun yoktu, şikâyetin ürüne göre
     * değişmesinin sebebi bu.
     *
     * ⓘ İstenen "30px" yerine `auto`: "Tutar" kelimesi 0.9em'de ~38px, yani
     * 30px kendi metninden DAR — kutu ya taşar ya kelime kırılır. `auto` bu
     * bağlamda 30px'ten de sıkı sonuç verir: etiket tam metni kadar, ardından
     * yalnız 8px gap. Gerçekten sabit bir değer isterseniz buradaki `auto`
     * yerine yazın (ve gerekirse `white-space:nowrap` ekleyin).
     *
     * Özet tablosu HARİÇ TUTULMADI: kural iki tabloyu da kapsıyor. Üst üste
     * dizilen varyasyon satırlarında etiket zaten tek kolonun solunda, orada
     * görsel etkisi yok — ama iki satır tipi tek kuralda kaldığından bir daha
     * ayrışamazlar. */
    .ks-vm-atc-form.ks-vm-atc-form form.cart table.variations th.label {
        width: auto;
        padding-inline: 0;
    }

    /* Dropdown: ürün sayfası select'i + adet select'i + onu barındıran hücre
     * (masaüstü panel `left:0;right:0` ile hücreye bağlı, ikisi ayrışmasın). */
    .ks-vm-atc-form.ks-vm-atc-form form.cart .variations select,
    .ks-vm-atc-form.ks-vm-atc-form form.cart .ks-vm-adet-select,
    .ks-vm-atc-form.ks-vm-atc-form form.cart .ks-vm-adet-host {
        max-width: none;
    }

    /* +/- stepper: kutu tam genişlik, ortadaki input boşluğu yutar.
     * `!important` şart — Additional CSS'te `form.cart .quantity{max-width:25%
     * !important}` (0,2,1) ve bizim `input.qty{width:34px !important}` var. */
    .ks-vm-atc-form.ks-vm-atc-form form.cart div.quantity {
        max-width: none !important;
        width: 100% !important;
    }
    .ks-vm-atc-form.ks-vm-atc-form form.cart div.quantity input.qty {
        flex: 1 1 auto;
        width: auto !important;
    }
}

/* Detached add-to-cart / buy-now buttons ([ks_add_to_cart_buttons]) — placeable
 * anywhere; they drive the single product form on the page. Fine-tune the look
 * from Elementor / Additional CSS. */
.ks-vm-detached-buttons {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    /* Its OWN container, so the stacking below reacts to the width this block
     * actually has — see the @container note under the flex rules. */
    container-type: inline-size;
    container-name: ks-atc-buttons;
}
/* Equal halves (flex-basis:0 → both grow from nothing to the same size), matching
 * the main add-to-cart / buy-now pair. min-width:0 lets a long label shrink to its
 * half instead of pushing past 50%.
 *
 * Targeted by the buttons' OWN classes, not `.button`: the detached buy-now no
 * longer carries the theme's `button alt` classes (they made it read uppercase /
 * 14px / 2px letter-spacing while the in-form button it stands for is capitalize
 * / 15.2px / 0.3px — 6 measured differences). */
/* ⚠️ Taban `0` DEĞİL, `calc(50% - 5px)` (5px = 10px gap'in yarısı) — v2.123.0.
 * `flex-basis:0` + `box-sizing:border-box` ile taban genişlik, kutunun
 * padding+border zeminine KIRPILIYOR: Sepete Ekle 16+16+0 = 32px, Hemen Al
 * 24+24+2+2 = 52px. Serbest alan eşit bölüşülse bile o 20px'lik fark sonuna
 * kadar taşınıyordu — ölçüldü: 255,28px vs 275,28px, farkı tam 20px.
 * Yüzdeli taban ikisini de aynı kesin değere sabitliyor: 50%+50% - 10px = tam
 * konteyner genişliği, yani dağıtılacak serbest alan sıfır ve padding farkı
 * sonuca sızamıyor.
 * Alt alta düzende bu taban aşağıdaki `flex-basis:100%` kurallarıyla eziliyor
 * (kaynak sırası: onlar sonra geliyor). */
.ks-vm-detached-buttons .ks-vm-atc-btn,
.ks-vm-detached-buttons .ks-vm-buy-now-btn {
    flex: 1 1 calc(50% - 5px);
    min-width: 0;
    margin: 0;
}
@media screen and (max-width: 767px) {
    .ks-vm-detached-buttons .ks-vm-atc-btn,
    .ks-vm-detached-buttons .ks-vm-buy-now-btn {
        flex-basis: 100%; /* stack full width on mobile, like the main pair */
    }
}

/* ── DAR GÖRÜNÜM: butonlar da alt alta (27 Tem 2026, v2.119.0) ──
 *
 * Operatör isteği: [ks_add_to_cart_form] dar görünüme geçip etiketleri
 * seçeneklerinin ÜSTÜNE aldığı ANDA, bu ayrık butonlar da yan yana değil alt
 * alta dizilsin.
 *
 * 🔑 Neden `ks-atc` DEĞİL de kendi container'ı: container query yalnızca
 * container'ın SOYUNA uygulanır. `ks-atc` container'ı `form.cart`; bu blok
 * formun içinde değil, ayrı bir Elementor widget'ı — yani `@container ks-atc`
 * buraya HİÇBİR ZAMAN ulaşmaz (yazılsa sessizce ölü kural olurdu).
 *
 * Bunun yerine blok kendi kendinin container'ı oluyor ve AYNI 400px eşiği
 * kullanılıyor. İkisi şablonda (775) aynı Elementor container'ının kardeş
 * çocukları — `#ca1cf02 > shortcode#98df73f` (form) ve `> shortcode#2464339`
 * (butonlar) — dolayısıyla satır-içi genişlikleri birebir eşit ve iki blok
 * TAM AYNI anda dar düzene geçiyor. Butonlar bir gün başka genişlikte bir
 * kolona taşınırsa, eşiği orada kendi genişliğine göre uygular; yine doğru
 * davranış, sadece formla eşzamanlılık garantisi kalkar.
 *
 * Eşiği değiştirirseniz yukarıdaki `@container ks-atc` bloğundaki 400px ile
 * birlikte değiştirin — ikisi eşleşmezse düzenler ayrışır.
 *
 * Üstteki ≤767px media query'si @container'sız tarayıcılar için fallback
 * olarak duruyor ve AYNI sonucu veriyor, ikisi çelişemez. */
@container ks-atc-buttons (max-width: 400px) {
    .ks-vm-detached-buttons > .ks-vm-atc-btn,
    .ks-vm-detached-buttons > .ks-vm-buy-now-btn {
        flex-basis: 100%;
    }
}
.ks-vm-atc-btn.loading {
    opacity: 0.6;
    pointer-events: none;
}
/* When the detached buttons are on the page, hide the ones inside the form —
 * whichever renders it: Elementor's add-to-cart widget, or our own
 * [ks_add_to_cart_form] (.ks-vm-atc-form). The real add-to-cart button stays in
 * the DOM (just hidden) so the detached button can still proxy it.
 *
 * The wishlist is in this list too: render_buy_now_button() prints buy-now AND
 * wishlist on the same hook, so without it the page showed TWO bookmark icons
 * once the detached shortcode was used. Since v2.119.0 the detached block no
 * longer prints one at all, which makes this rule the ONLY thing keeping the
 * bookmark icon off the add-to-cart area — don't drop it as "redundant". */
/* 🔑 `body:has(…)` FIRST, `body.ks-vm-detached-atc` only as the fallback.
 *
 * The body class is added by cart-aware.js on DOM-ready, so for one paint the
 * form's own three buttons were VISIBLE and then vanished — the operator saw
 * the buttons flash in at the top of the page on every first load. `:has()` is
 * evaluated during the first style pass, so with it there is no frame in which
 * they exist. The JS class stays for browsers without :has() (pre-2023), where
 * the flash is the lesser evil versus duplicate buttons. */
body:has(.ks-vm-detached-buttons) .ks-vm-atc-form :is(.single_add_to_cart_button, .ks-vm-buy-now-btn, .ks-vm-wishlist-btn),
body:has(.ks-vm-detached-buttons) .elementor-widget-woocommerce-product-add-to-cart :is(.single_add_to_cart_button, .ks-vm-buy-now-btn, .ks-vm-wishlist-btn),
body:has(.ks-vm-detached-buttons) .e-atc-qty-button-holder :is(.single_add_to_cart_button, .ks-vm-buy-now-btn, .ks-vm-wishlist-btn),
body.ks-vm-detached-atc .ks-vm-atc-form :is(.single_add_to_cart_button, .ks-vm-buy-now-btn, .ks-vm-wishlist-btn),
body.ks-vm-detached-atc .elementor-widget-woocommerce-product-add-to-cart :is(.single_add_to_cart_button, .ks-vm-buy-now-btn, .ks-vm-wishlist-btn),
body.ks-vm-detached-atc .e-atc-qty-button-holder :is(.single_add_to_cart_button, .ks-vm-buy-now-btn, .ks-vm-wishlist-btn) {
    display: none !important;
}

/* Our block shows stock now, so hide WooCommerce's own variation availability
 * line to avoid a duplicate (and, on adet products, a misleading per-strand
 * "1 in stock"). */
.single_variation_wrap .woocommerce-variation-availability {
    display: none;
}

/* ═══════════════════════════════════════════════════════════
 *  Stock Notify — "Gelince haber ver"
 *
 *  When the requested quantity exceeds available stock on a notify-backorder
 *  product, JS reveals .ks-vm-notify-btn and puts .ks-vm-notify-mode on the
 *  form, which hides the add-to-cart/buy-now/wishlist buttons. Same box as the
 *  other buttons (46px pill) but SOLID Elementor Global Primary + white label,
 *  bell-ringing icon (regular → filled on hover, via the shared swap rules).
 *  Retune the colour from Customizer → Additional CSS.
 * ═══════════════════════════════════════════════════════════ */
.ks-vm-notify-btn[hidden] {
    display: none;
}
.ks-vm-notify-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 0 24px;
    min-height: 46px;
    font-family: inherit;
    font-size: 0.95em;
    /* 600 — Sepete Ekle ve Hemen Satın Al ile aynı (operatör, 27 Tem 2026).
     * Bu buton stok yetersizken o ikisinin YERİNE geçiyor, farklı ağırlıkta
     * olması aynı yerde iki farklı tipografi demekti. */
    font-weight: 600;
    text-transform: capitalize;
    line-height: 1.4;
    letter-spacing: 0.3px;
    cursor: pointer;
    white-space: nowrap;
    vertical-align: middle;
    transition: background 0.2s ease, color 0.2s ease, opacity 0.2s ease;
    /* !important beats Elementor's `.cart button` rule (this is a button in form.cart). */
    background: var(--e-global-color-primary, #111) !important;
    border: 2px solid var(--e-global-color-primary, #111) !important;
    border-radius: 100px !important;
    color: #fff !important;
}
.ks-vm-notify-btn:hover,
.ks-vm-notify-btn:focus {
    opacity: 0.9;
    outline: none;
}
.ks-vm-notify-btn:active {
    opacity: 0.8;
}
/* Gönderim sırasında (operatör, 7 Eyl 2026): düğme disabled, ikon yerinde
 * spinner (ortak kural ~370. satır), etiket OLDUĞU GİBİ kalır; yanıt gelince
 * eski hâline döner. Sepete Ekle / Hemen Satın Al ile aynı görünüm. */
.ks-vm-notify-btn.ks-vm-notify-loading {
    opacity: 0.6;
    pointer-events: none;
}

.ks-vm-notify-btn .ks-vm-icon,
.ks-vm-notify-btn .ks-vm-icon path {
    fill: currentColor !important;
    color: inherit;
}

/* Notify mode: the notify button (and its confirmation) replace the buy buttons;
 * the WISHLIST stays visible in its trailing column — a customer filing a
 * back-in-stock request is exactly who wants to bookmark the product. The class
 * goes on form.cart AND on any .ks-vm-detached-buttons container
 * ([ks_add_to_cart_buttons] shortcode), whose add-to-cart uses .ks-vm-atc-btn. */
.ks-vm-notify-mode .single_add_to_cart_button,
.ks-vm-notify-mode .ks-vm-atc-btn,
.ks-vm-notify-mode .ks-vm-buy-now-btn {
    display: none !important;
}
/* The live "Tutar" row hides with the buy buttons: an over-stock request is a
 * back-in-stock enquiry, and the restock may be sold at a different price — so
 * no price promise while the notify button is up. The second selector mirrors
 * VillaTheme's high-specificity grid rule on the copied swatch row classes. */
.ks-vm-notify-mode .ks-vm-summary-total-line,
.woocommerce div.product.elementor form.cart.ks-vm-notify-mode .ks-vm-summary-table tr.ks-vm-summary-total-line {
    display: none !important;
}
/* Satır gizlenince onu saran özet bloğu 0px yükseklikte formda KALIYORDU ve
 * form.cart'ın 20px satır aralığı (gap) ona da uygulanıyordu → Adet satırı ile
 * paket bilgisi arasında boş bir şerit (operatör, 7 Eyl 2026: "tutar alanında
 * boşluk kalıyor"). Tek satırı Tutar olan özet bloğu notify modunda bütünüyle
 * çekilir; başka bir satırı (indirim vb.) varsa blok kalır, yalnız Tutar gizlenir. */
.ks-vm-notify-mode .ks-vm-summary:not(:has(tr:not(.ks-vm-summary-total-line))) {
    display: none !important;
}
/* With the buy buttons display:none they leave the grid, and auto-placement
 * would drop the wishlist into column 1 with the notify button wrapping to a
 * second row (measured in a real render). Pin the wishlist to the trailing
 * column explicitly, and let the grid backfill (dense) so the notify button
 * takes columns 1-2 of the SAME row — sparse flow cannot step back to the
 * hole the wishlist leaves, because the wishlist precedes it in the DOM. */
.ks-vm-notify-mode .ks-vm-wishlist-btn {
    grid-column: -2 / -1;
}
.ks-vm-notify-mode .botiga-single-addtocart-wrapper,
.ks-vm-notify-mode .e-atc-qty-button-holder,
.ks-vm-notify-mode .woocommerce-variation-add-to-cart {
    grid-auto-flow: dense;
}
/* Ayrık düğmeler ([ks_add_to_cart_buttons]) sayfadaysa formun kendi düğme kabı
 * `.single_variation_wrap` kuralıyla GİZLİ; stock-notify.js haber-ver düğmesini
 * ve onay mesajını init'te bu kaba TAŞIR (7 Eyl 2026 — aksi hâlde notify modunda
 * sayfada hiç düğme kalmıyordu). Flex kapta tam satır. */
.ks-vm-detached-buttons > .ks-vm-notify-btn {
    flex: 1 1 100%;
    min-width: 0;
    margin: 0;
}
/* Stokta olmayan seçim (notify modu): dört bilgi paneli sayfadan ÇEKİLİR
 * (operatör, 7 Eyl 2026). Panelin kendisi değil, onu taşıyan Elementor
 * widget'ı gizlenir — yoksa 0px'lik widget konteynerin gap'ini yemeye devam
 * eder (Tutar satırındaki aynı tuzak). Ürün bütünüyle stoksuzsa PHP zaten
 * basmaz (ks_vm_product_unavailable); bu kural varyasyon bazlı hâl içindir. */
body.ks-vm-out-of-stock .elementor-widget-shortcode:has(.ks-panel--handover),
body.ks-vm-out-of-stock .elementor-widget-shortcode:has(.ks-panel--shipping),
body.ks-vm-out-of-stock .elementor-widget-shortcode:has(.ks-panel--discounts),
body.ks-vm-out-of-stock .elementor-widget-shortcode:has(.ks-panel--payments),
body.ks-vm-out-of-stock .ks-panel--handover,
body.ks-vm-out-of-stock .ks-panel--shipping,
body.ks-vm-out-of-stock .ks-panel--discounts,
body.ks-vm-out-of-stock .ks-panel--payments {
    display: none !important;
}
/* Stoksuz seçim ÖNERİLERİ: `ks-vm-oos-only` konteynerleri (Loop Grid
 * "Şu an stokta olanlar" / "Benzer ürünler") yalnız stoksuz düzende görünür;
 * body sınıfını notify modu (JS) ya da ürün bütünüyle stoksuzsa PHP basar. */
/* Editör önizlemesi de bu CSS'i yükler; orada konteynerler HEP görünür kalsın
 * (operatör 7 Eyl: "editörde belirmiyor") → `.elementor-editor-active` istisnası. */
body:not(.ks-vm-out-of-stock):not(.elementor-editor-active) .ks-vm-oos-only {
    display: none !important;
}
.ks-vm-notify-mode .ks-vm-notify-btn {
    /* Span the add-to-cart + buy-now columns and leave the trailing auto column
     * to the wishlist square, which stays visible in notify mode. */
    grid-column: 1 / -2;
    width: 100%;
    /* Theme spacing between the paired buttons adds margin-left:10px; at full
     * row width that margin pushed the button 10px past the container's right
     * edge (measured in a real render). The grid gap provides all spacing. */
    margin: 0 !important;
}

/* ── Compact quantity controls (operator request) ──
 * The retail +/- stepper (~48px) and the adet pill (~50px) both read a size
 * larger than the rest of the form; trim them to ~40/42px. Scoped to form.cart
 * so the loop mini-stepper and cart-page inputs keep their own sizing. */
form.cart div.quantity {
    height: 42px !important;
    min-height: 42px !important;
}
form.cart div.quantity .botiga-quantity-minus,
form.cart div.quantity .botiga-quantity-plus {
    width: 32px !important;
    height: 100% !important;
    font-size: 20px !important;
}
form.cart div.quantity input.qty {
    width: 34px !important;
    height: 100% !important;
    font-size: 0.9em !important;
}
/* `.ks-vm-option-select` (varyasyon-dışı ürün opsiyonları, KS_VM_Product_Options)
 * bu kutuyu Adet ile PAYLAŞIR — operatör: "tüm dropdown'lar Adet'teki gibi
 * olmalı". Aşağıdaki padding'ler onlarda da şart: chevron'a yer açan kural
 * yalnız `.ks-vm-adet-select`'e yazılıydı, o yüzden "Uç Tipi"nde ok metnin
 * üstünden geçiyordu (operatörün ekran görüntüsü). Tek fark max-width; onu
 * bir sonraki blok anlatıyor. */
form.cart .ks-vm-adet-select,
form.cart .ks-vm-option-select,
form.cart .ks-vm-tone-select, /* Ton Grubu dropdown'ı (2 Eyl 2026) */
form.cart .variations .vi-wpvs-variation-wrap-wrap[data-swatch_type="viwpvs_default"] > select, /* Set Tipi: swatches 'varsayılan' tipi = WC select (5 Eyl 2026) */
.ks-vm-reviews-toolbar select.botiga-reviews-orderby {
    padding-top: 8px !important;
    padding-bottom: 8px !important;
    /* ⚠️ Chevron'a YER AYIRIR. Tema ok işaretini arka plan görseli olarak
     * `background-position: calc(100% - 18px) 50%` ile basıyor ama sağ padding'i
     * 16px bırakıyor — yani metin okun ALTINDAN geçiyor. Ölçüm: kutu 140px,
     * "Bir seçim yapın" 105px, metin x=121'de bitiyor, ok x≈112'de başlıyor.
     * 18px (okun sağdan uzaklığı) + ~10px (ok genişliği) + 6px nefes = 34px. */
    padding-right: 34px !important;
    cursor: pointer !important;
}

/* ── Select genişliği (operatör isteği) ────────────────────────────────────
 * Hücreyi doldurmaya devam ediyor (width:100% temadan geliyordu, artık burada
 * açıkça yazılı) ama 205px'i geçmiyor: geniş bir kolonda tek satırlık bir
 * dropdown'ın 400px'e uzaması formu dengesiz gösteriyordu.
 *
 * `.ks-vm-adet-host` de aynı tavanı alıyor. O sınıf ayrı bir sarmalayıcı DEĞİL,
 * doğrudan `<td class="value ks-vm-adet-host">` hücresinin kendisi; masaüstü
 * seçenek paneli `position:absolute; left:0; right:0` ile ona bağlı. Hücre 406px
 * kalsaydı kapalı kutu 205px, açılan panel 406px olur ve ikisi hizasız görünürdü.
 * Ölçüldü: ikisi de 205px, sol kenar 711/711.
 *
 * Tema `select{width:100%}` + jenerik `max-width:100%` bastığı için buradaki
 * seçiciler onları özgüllükle geçiyor; !important gerekmiyor. */
/* ⚠️ 140px → 155px (26 Tem): 140'ta en uzun etiket kutuya SIĞMIYOR. Aritmetik,
 * ölçülen değerlerle: 16px sol padding + 105px "Bir seçim yapın" + 34px sağ
 * padding (chevron alanı dahil, yukarıya bak) = **155px minimum**. 140'ta metin
 * kırpılıyordu. Daha dar istersen bu değeri düşürmek yetmez — placeholder
 * metnini de kısaltmak gerekir. */
form.cart .variations select,
form.cart .ks-vm-adet-select,
form.cart .ks-vm-adet-host {
    width: 100%;
    max-width: 200px;
}

/* ── Ürün opsiyonları: aynı kutu, SABİT 200px tavan (operatör, v2.121.3) ──
 * Kutunun geri kalanı (yükseklik, padding, pill radius, tipografi) Adet ile
 * ortak — bkz. yukarıdaki padding bloğu ve `td.value select` kuralı. Değişen
 * TEK şey genişlik tavanı.
 *
 * İki ayrı değer olmasının sebebi: Adet'in 155px'i "200 adet" gibi kısa
 * etiketlere göre hesaplanmıştı (16 sol + 105 metin + 34 chevron) ve operatör
 * onu ÖYLE İSTİYOR. Opsiyon terimleri ise uzun ("Permalı/Kıvırcık", "Boncuk
 * Kaynak"), 155px'te kırpılıyorlardı.
 *
 * 200 SABİT bir karar, 155'in türevi DEĞİL (bir ara "iki katı" olarak 310px
 * yazılmıştı, operatör 200'de karar kıldı). Yani Adet'in tavanı değişirse
 * burası kendiliğinden takip ETMEMELİ.
 *
 * ⚠️ Seçici `.variations select` İÇERMEK ZORUNDA: yukarıdaki 155px kuralı
 * (0,2,2) bu select'lere de uyuyor ve düz `form.cart .ks-vm-option-select`
 * (0,2,1) ondan DÜŞÜK kalır — tavan sessizce 155px'e yenilirdi. Buradaki hâli
 * (0,3,2). Basit üründe satırlar `.ks-vm-options-table` içinde ama o tablo da
 * `variations` sınıfını taşıyor, dolayısıyla iki ürün tipinde de eşleşiyor.
 *
 * DAR GÖRÜNÜM DEĞİŞMEZ: `@container ks-atc (max-width:400px)` bloğundaki
 * `max-width:none` (0,5,3) buradan yüksek, yani etiket üstte + kontrol tam
 * genişlik düzeni aynen korunuyor.
 *
 * 🚨 HÜCRE DE OLMAK ZORUNDA — v2.121.2'nin sessizce çalışmamasının sebebi buydu.
 * `adet-dropdown.js` formdaki HER dropdown'ı geliştiriyor ve ana hücresine
 * `ks-vm-adet-host` sınıfını basıyor; o sınıf da yukarıdaki 155px tavanını
 * taşıyor. Yani select'e 200px vermek hiçbir şey değiştirmiyordu: hücre 155px'te
 * kalıyor, `width:100%` olan select de onu geçemiyordu. Ölçümle saptandı
 * (kolon izi 426px, hücre 155px, computed max-width 200px — üçü birden).
 * Statik CSS aramasıyla görünmez, çünkü sınıfı JS ekliyor.
 *
 * Hücre ile kutunun EŞİT kalması ayrıca şart: masaüstü seçenek paneli hücreye
 * `left:0; right:0` ile bağlı, ikisi ayrışırsa panel kutudan geniş açılır. */
form.cart .variations select.ks-vm-option-select,
form.cart .variations select.ks-vm-tone-select,
form.cart .variations td.ks-vm-option-host {
    max-width: 200px;
}

/* ── Adet dropdown: desktop styled panel ──
 * The native select stays the (already pill-styled) closed control; on
 * fine-pointer devices adet-dropdown.js suppresses the unstylable native
 * option list and opens this panel instead. Touch devices never see it —
 * they get the platform's own picker. */
.ks-vm-adet-host {
    position: relative;
}
.ks-vm-adet-panel {
    position: absolute;
    top: calc(100% + 6px);
    left: 0;
    right: 0;
    z-index: 60;
    margin: 0;
    padding: 6px;
    list-style: none;
    background: #fff;
    border: 1px solid #e3e3e3;
    border-radius: 16px;
    box-shadow: 0 12px 32px rgba(0, 0, 0, 0.10);
    max-height: 320px;
    overflow-y: auto;
}
.ks-vm-adet-panel[hidden] {
    display: none;
}
.ks-vm-adet-option {
    padding: 8px 14px;
    border-radius: 10px;
    cursor: pointer;
    /* Kapalı kutudaki değerle AYNI punto (operatör, 30 Tem): tetikleyici
     * `0.9em` = 14.4px iken panel seçenekleri 0.95em ile 15.2px çıkıyordu,
     * açılan liste kutudan iri duruyordu. Panelin kabı da 16px olduğu için
     * aynı çarpan ikisini eşitliyor (ölçüldü: hem ATC hem sıralama). */
    font-size: 0.9em;
    color: #222;
    transition: background 0.12s ease;
}
.ks-vm-adet-option:hover {
    background: #f5f5f5;
}
.ks-vm-adet-option.is-selected {
    background: var(--e-global-color-primary, #111);
    color: #fff;
}
/* While the panel is open the select's chevron flips to signal state. */
.ks-vm-adet-open .ks-vm-adet-select {
    border-color: #bbb;
}

/* ═══════════════════════════════════════════════════════════════════════════
 *  ⭐ KS DROPDOWN — SİTENİN TEK DROPDOWN GÖRÜNÜMÜ (27 Eyl 2026)
 *
 *  Operatör: "tüm dropdown'lar için referansımız aynı olmalı, hepsi aynı look
 *  and feel". REFERANS = ürün formundaki varyasyon select'i (ölçüldü,
 *  ks-tests/probe-dd-reference.mjs): hap kutu 42px, 1px #ccc, 100px köşe,
 *  16/34px yatay dolgu, 18px'te 12px chevron, Plus Jakarta Sans 14.4px/500.
 *  Açılan liste = yukarıdaki `.ks-vm-adet-panel` (adet-dropdown.js; masaüstü
 *  ince imleç), dokunmatikte platformun native seçicisi.
 *
 *  KULLANIM: select'e `ks-dd` sınıfı ver (sonradan üretiliyorsa ardından
 *  `$(document.body).trigger('ks_vm_dropdowns_refresh')`). Yeni kopya deri
 *  YAZMA — değer değişecekse BURADA değişir.
 *  Kapsam (27 Eyl): Dil ve Konum popup'ı, Hesabım adres defteri + sipariş
 *  filtreleri. Checkout/eski teslimat penceresi hâlâ select2 (operatör kararı).
 *
 *  🚨 `.ks-vm-co` (ks-fields.css) içindeki select'ler `border-width
 *  !important` alıyor → ikinci seçici (0,2,2) + !important ile geçiliyor.
 * ═══════════════════════════════════════════════════════════════════════════ */
body select.ks-dd,
body .ks-vm-co select.ks-dd {
    -webkit-appearance: none;
    appearance: none;
    box-sizing: border-box;
    display: block;
    width: 100%;
    height: auto;
    min-height: 0;
    margin: 0;
    padding: 8px 34px 8px 16px;
    font-family: "Plus Jakarta Sans", sans-serif;
    font-size: 14.4px;
    font-weight: 500;
    line-height: 1.68;
    letter-spacing: normal;
    color: var(--e-global-color-text, #000000);
    background: #ffffff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%23212121' viewBox='0 0 448 512'%3E%3Cpath d='M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z' /%3E%3C/svg%3E") no-repeat calc(100% - 18px) 50%;
    border: 1px solid #cccccc;
    border-radius: 100px;
    box-shadow: none;
    outline: none;
    cursor: pointer;
}
body .ks-vm-co select.ks-dd {
    border-width: 1px !important;
}
/* POPUP İÇİNDE (Elementor popup'ları + adres defteri penceresi) kutu yanındaki metin
 * kutularıyla AYNI BOY (operatör, 27 Eyl: "popup içlerindeki dropdown'lar biraz daha
 * yüksek"). Yükseklik input'un KENDİ ölçülerinden türetilir (ks-tokens --ks-field-*):
 * satır × punto + 2 × dikey dolgu + 2 × 1px (input'un 1.5px token'ı tarayıcıda 1px
 * çiziliyor — ölçüldü: input 48.39px, DPR 1 ve 2). Ürün formu / sıralama / Hesabım
 * sipariş filtreleri popup DEĞİL → referansın 42px'i. */
body .elementor-popup-modal select.ks-dd,
body .ks-vm-ab-ov select.ks-dd {
    height: calc(var(--ks-field-font-size, 16px) * var(--ks-field-line-height, 1.4) + 2 * var(--ks-field-pad-y, 12px) + 2px);
    padding-top: 0;
    padding-bottom: 0;
}
body select.ks-dd:has(option[value=""]:checked) {
    color: var(--e-global-color-01631af, #727272);
}
body select.ks-dd option[value=""] {
    color: var(--e-global-color-01631af, #868686);
}
body select.ks-dd option:not([value=""]) {
    color: var(--e-global-color-text, #000000);
}
/* Odak: referansla aynı — kenarlık değişmez (ortak form derisinin turuncu odak halkası
 * .ks-vm-co içinde (0,2,2) geliyordu; bu (0,3,2) onu geçer). */
body select.ks-dd:focus,
body .ks-vm-co select.ks-dd:focus {
    border-color: #cccccc;
    box-shadow: none;
    outline: none;
}
body select.ks-dd:disabled {
    cursor: default;
    opacity: .6;
}
/* Paneli taşıyan kap: panel `left:0; right:0` ile ona bağlı, seçenek puntosu
 * (0.9em) referanstaki gibi 16px tabandan 14.4px çıksın diye taban sabit. */
.ks-dd-host {
    position: relative;
    display: block;
    font-size: 16px;
}

/* Uzun listelerde (≥15 seçenek) panelin üstünde arama — kutuyla aynı hap dili.
 * Panel kayarken üstte kalır (sticky; panel dolgusu 6px olduğu için top:-6px). */
.ks-vm-adet-search {
    position: sticky;
    top: -6px;
    z-index: 1;
    margin: -6px -6px 6px;
    padding: 6px 6px 0;
    background: #fff;
    list-style: none;
}
/* 🚨 Tema (Botiga) metin kutularına kare köşe + odakta kalın siyah kenarlık basıyor — seçici
 * `input[type="text"]` + body önekiyle (0,2,2) onu geçer (ölçüldü: önce 0px köşe, 2px siyah). */
body .ks-vm-adet-search input[type="text"] {
    box-sizing: border-box;
    width: 100%;
    height: auto;
    min-height: 0;
    margin: 0;
    padding: 7px 14px;
    font-family: "Plus Jakarta Sans", sans-serif;
    font-size: 14.4px;
    font-weight: 500;
    line-height: 1.5;
    color: #222;
    background: #fff;
    border: 1px solid #e3e3e3;
    border-radius: 100px;
    box-shadow: none;
    outline: none;
}
body .ks-vm-adet-search input[type="text"]:focus {
    border: 1px solid #cccccc;
    box-shadow: none;
    outline: none;
}
.ks-vm-adet-empty {
    padding: 8px 14px;
    font-size: 0.9em;
    color: var(--e-global-color-01631af, #727272);
    list-style: none;
}
.ks-vm-adet-option[hidden],
.ks-vm-adet-empty[hidden] {
    display: none;
}

/* Kalan stok satırı: YALNIZ [ks_stock_info] shortcode'u (operatör, 7 Eyl 2026;
 * adet kutusunun içindeki/sağındaki eski `.ks-vm-stock-left` notu kaldırıldı).
 * Görünüm [ks_pack_info] ile birebir — kurallar aşağıda ortak seçiciyle. */
/* Metin ikonla AYNI renk (operatör, 7 Eyl 2026): Elementor secondary; paket
 * satırının gri #777'sini burada ezer (o kural yukarıda, ortak seçicide). */
.ks-vm-stock-info,
.ks-vm-stock-info strong {
    color: var(--e-global-color-secondary);
}
.ks-vm-stock-info strong {
    font-weight: 700;
}
/* Keep it on the SAME line as the retail/free stepper (it's a narrow pill, so
 * there is room to its right). A full-width adet dropdown has none, so the note
 * naturally wraps beneath it there — the only sensible spot. */
.ks-vm-simple-qty-table td.value {
    white-space: nowrap;
}
.ks-vm-simple-qty-table td.value .quantity {
    display: inline-flex;
    vertical-align: middle;
}

/* ═══════════════════════════════════════════════════════════
 *  Merchant one-step checkout — KS düzenlemeleri
 * ═══════════════════════════════════════════════════════════ */

/* Logged-in checkout: the whole "Contact Information" block is redundant —
 * the popup gate funnels shoppers through login, and for a logged-in customer
 * Merchant renders the account e-mail as a HIDDEN billing_email input (which
 * still POSTs when the block is display:none) plus a mere greeting line.
 * GUESTS keep the block: the visible e-mail field there is REQUIRED for their
 * order. :has() is safe in every 2024+ browser; where unsupported the block
 * simply stays visible (graceful). */
body.logged-in .merchant-pro-sc .merchant-pro-sc-content-item-block:has(.merchant-pro-sc-contact-information) {
    display: none;
}

/* ═══════════════════════════════════════════════════════════
 *  Dil değiştirici (.ks-lang) — KS_VM_Frontend::render_language_switcher
 *  Native <details>: TIKLAMA ile açılır (hover değil), JS yok (kapatma
 *  ks-lang.js). Tetikleyicide bayrak + SVG caret; dil İSİMLERİ açılan menüde;
 *  menüde tüm diller, mevcut DISABLED. Radius 6px, her şey dikeyde tam ortalı.
 *  NOT: tema/Elementor <summary> ve img kurallarını ezmek için !important
 *  (ks-auth.css'in Botiga'yı ezme deseni) — toggle <summary> olduğundan şart.
 * ═══════════════════════════════════════════════════════════ */
.ks-lang {
    display: flex;
}

/* <summary> reset — varsayılan disclosure üçgenini kaldır. */
.ks-lang > summary {
	list-style: none;
}
.ks-lang > summary::-webkit-details-marker {
	display: none;
}
.ks-lang > summary::marker {
	content: "";
	display: none;
}

/* Tetikleyici — küçük pill (bayrak + caret), her ikisi dikeyde tam ortalı. */
.ks-lang .ks-lang__toggle {
	display: inline-flex !important;
	align-items: center !important;
	justify-content: center;
	gap: 7px;
	margin: 0;
	padding: 0;
	border: none;
	background: transparent;
	font-family: inherit;
	font-size: 13px;
	font-weight: 600;
	line-height: 1;
	cursor: pointer;
	box-shadow: none;
	transition: border-color 0.15s ease, background 0.15s ease;
	-webkit-appearance: none;
	appearance: none;
}

.ks-lang:not(.ks-lang--solo) .ks-lang__toggle:hover,
.ks-lang[open] .ks-lang__toggle {
	border-color: var(--ks-accent, #da6900) !important;
}

.ks-lang--solo .ks-lang__toggle {
	cursor: default;
}

/* Bayrak — sabit boyut (tema img{height:auto}'yu ez), dikeyde ortalı blok. */
.ks-lang .ks-lang__flag {
	display: block;
	flex-shrink: 0;
	width: 24px;
	height: 16px;
	max-width: none;
	border-radius: 2px;
	object-fit: cover;
}

.ks-lang .ks-lang__name {
	display: inline-block;
	line-height: 1;
	white-space: nowrap;
}

/* Caret — SVG chevron, viewBox'ta merkezli → align-items ile tam ortalı.
   Açılınca 180° döner. */
.ks-lang .ks-lang__caret {
	display: block;
	flex-shrink: 0;
	width: 13px;
	height: 12px;
	color: var(--ks-muted, #6a6a6a);
	transition: transform 0.15s ease;
}

.ks-lang[open] .ks-lang__caret {
	transform: rotate(180deg);
}

/* Açılan menü — beyaz kart, düşük radius + yumuşak gölge, sağa hizalı. */
.ks-lang .ks-lang__menu {
	position: absolute;
	top: calc(100% + 6px);
	right: 0;
	left: auto;
	z-index: 100;
	min-width: max-content;
	margin: 0 !important;
	padding: 4px !important;
	list-style: none !important;
	border: 1px solid var(--ks-line, #e0e0e0);
	border-radius: 8px;
	background: var(--ks-surface, #fff);
	box-shadow: 0 12px 28px rgba(0, 0, 0, 0.12);
}

.ks-lang .ks-lang__menu li {
	margin: 0 !important;
	padding: 0 !important;
	list-style: none !important;
}

/* Menü satırları — bayrak + isim, dikeyde tam ortalı. */
.ks-lang .ks-lang__item {
	display: flex !important;
	align-items: center !important;
	gap: 7px;
	margin: 0;
	padding: 8px 10px !important;
	border-radius: 4px;
	color: var(--ks-ink, #1a1a1a);
	font-size: 13px;
	font-weight: 500;
	line-height: 1;
	text-decoration: none;
	white-space: nowrap;
	transition: background 0.15s ease, color 0.15s ease;
}

.ks-lang a.ks-lang__item:hover,
.ks-lang a.ks-lang__item:focus {
	background: var(--ks-accent, #da6900);
	color: #fff;
}

/* Mevcut dil — disabled: muted, tıklanamaz, hover yok. */
.ks-lang .ks-lang__item--current {
	color: var(--ks-muted, #6a6a6a);
	font-weight: 600;
	cursor: default;
	opacity: 0.7;
	pointer-events: none;
}

/* ═══════════════════════════════════════════════════════════════
 *  CART PAGE (KS_VM_Cart_Page) — Botiga layout2 restyle
 *
 *  TAMAMEN BAĞIMSIZ bölüm: sepetin fiyat bloğu kendi sınıflarını taşır
 *  (.ks-vm-cart-price-value/-badge/-old/-new) ve bütün stiller burada, düz
 *  değerlerle durur. Ürün sayfasının Tutar bloğu (.ks-vm-summary-*, yukarıda
 *  SINGLE PRODUCT bölümü) ile hiçbir paylaşım yok — orada fiyatı büyütmek,
 *  burada küçültmek birbirini etkilemez.
 *  Sepette fiyat boyutu: .ks-vm-cart-price-value font-size.
 * ═══════════════════════════════════════════════════════════════ */

/* ── Product images: the mini cart thumbnail's bigger twin (operator, 4 Ağu:
 * satırlar mini cart düzeninin büyüğü) — 3:4 + cover + 1px Elementor Border
 * global rengi + 8px radius, galeri thumbnail'larıyla aynı dil. Kolon
 * genişliği Botiga'da 100px'ti; 14 Ağu (operatör: biraz küçült) kolonu 84px'e
 * çektik → görsel 84×112 (oran korunur, aspect-ratio hesaplar). ── */
.woocommerce-cart .shop_table td.product-thumbnail {
    width: 84px;
}
.woocommerce-cart .shop_table td.product-thumbnail img {
    aspect-ratio: 3 / 4;
    width: 100%;
    object-fit: cover;
    object-position: center;
    height: auto;
    display: block;
    border: 1px solid var(--e-global-color-dcb0b6a, #d1d1d1);
    border-radius: 8px;
    box-sizing: border-box;
}
/* Satır dikey boşluğu — Botiga her hücreye 30px üst+alt basıyor, operatör:
 * çok fazla (14 Ağu) → 18px (satır ~194→170px). Yalnız dikey; yatay padding
 * Botiga'da kalır. tr.cart_item kapsamı: başlık satırı ve td.actions
 * (güncelle butonu, zaten gizli) etkilenmez.
 * vertical-align: ad + fiyat yığını küçük resimle ORTADAN hizalı (operatör,
 * 14 Ağu; Botiga top basıyordu). Görsel hücresi normal table-cell → middle
 * yeter; AD hücresi layout2'de display:flex KOLON → vertical-align'ı YOK
 * SAYAR, ortalama justify-content'ten gelir. (v2.276.0: Kaldır görselin
 * altından çıkınca hücrede yalnız görsel kaldı → eski 48px alt-padding
 * telafisi de gitti; iki hücre ortası artık kendiliğinden çakışır.) */
.woocommerce-cart .shop_table tr.cart_item td {
    padding-top: 18px;
    padding-bottom: 18px;
    vertical-align: middle;
}
.shop-table-layout2 .shop_table tr.cart_item td.product-name {
    justify-content: center;
}

/* ("Alışveriş Sepeti" sayfa başlığı v2.276.0'da kaldırıldı — başlık artık
 * Elementor'dan; .ks-vm-cart-title kuralları da onunla gitti.) */

/* Drop the left column's top gap (the form carries a 25px margin-top) so the
 * heading sits flush with the top of the content area (operator). */
.woocommerce-cart .woocommerce-cart-form {
    margin-top: 0 !important;
    padding-right: 50px !important;
}

/* Unit-price column retired — the line price lives under the title now. */
.woocommerce-cart .shop_table th.product-price,
.woocommerce-cart .shop_table td.product-price {
    display: none !important;
}

/* Name-cell stack (td.product-name is a flex column in Botiga layout2):
 * head row (title, order 1) → qty/fiyat satırı adın HEMEN altında (3) — mini
 * cart'taki gibi (eski margin-top:auto dip-yaslaması kalktı, 4 Ağu). */
.shop-table-layout2 .shop_table .product-name .ks-vm-cart-head     { order: 1; }
.shop-table-layout2 .shop_table .product-name .ks-vm-cart-bottom   { order: 3; }
/* Paket bilgi satırı: adın hemen altı, qty/fiyat satırının üstü. */
.shop-table-layout2 .shop_table .product-name .ks-vm-cart-paket-info { order: 2; }
.ks-vm-cart-paket-info {
    margin-top: 0;
}

/* ── Head row: yalnız başlık (fiyat alt satıra indi — mini cart düzeni) ── */
.woocommerce-cart .product-name .ks-vm-cart-head {
    display: flex;
    align-items: flex-start;
    gap: 24px;
    width: 100%;
}

/* ── Title ── */
.woocommerce-cart .shop_table .product-name .ks-vm-cart-item-name {
    flex: 1 1 auto;
    min-width: 0;
    font-size: 1em;
    font-weight: 600;
    color: inherit;
    line-height: 1.4em;
}

/* ── Bottom row = mini cart'ın .ks-vm-mc-row'unun büyüğü: [miktar kontrolü]
 * ....... [fiyat] tek flex hizası; fiyatı sağa .ks-vm-cart-price'ın
 * margin-left:auto'su iter (spinner ::after kontrolün hemen sağında kalır). ── */
.ks-vm-cart-bottom {
    display: flex;
    align-items: center;
    flex-wrap: wrap;         /* narrow screens: price drops below, stays right */
    gap: 8px 12px;
    margin-top: 14px !important;
}

/* ── Line price block — mini cart fiyatının (bar dili) büyütülmüş kopyası,
 * sepetin KENDİ sınıflarıyla: İNDİRİMLİYSE secondary, DÜZSE text rengi;
 * rozet + üstü çizili eski + 1.4em yeni tutar. Satırın sağına yaslı. ── */
.ks-vm-cart-price {
    display: flex;
    flex: 0 0 auto;
    margin-left: auto;       /* satır sağına (mini cart'taki margin-inline-start:auto) */
    text-align: right;
    color: var(--e-global-color-secondary, #d83b3b);
}
/* Fiyat parçalarını tek eksende toplayan konteyner — sepet fiyat BOYUTU burada.
 * flex + align-items:center → rozet, eski ve yeni fiyat TEK yatay çizgide,
 * ortadan hizalı (farklı font-size'lara rağmen). line-through, aşağıda
 * amount/bdi seviyesinde AÇIKÇA tanımlandığı için flex içinde de görünür
 * (flex konteyner decoration'ı çocuklarına GEÇİRMEZ; o yüzden her parçaya
 * ayrı ayrı verilir). */
.ks-vm-cart-price-value {
    font-size: 0.8em;        /* 12.8px taban → yeni tutar ~18px (14 Ağu, operatör:
                              * biraz küçült; önceki 0.9em/20px). Tüm blok buradan
                              * ölçeklenir (rozet/eski/yeni em-oranlı). */
    font-weight: 600;
    display: inline-flex;
    align-items: center;
    flex-wrap: wrap;
    justify-content: flex-end;
    column-gap: 6px;
}
/* İndirimsiz satır fiyatı text renginde — mini cart'taki :only-child kuralının
 * eşi (indirimsizde value TEK çocuk taşır; indirimlide rozet+del+ins kardeş). */
.ks-vm-cart-price-value > .ks-vm-cart-price-new:only-child {
    color: var(--e-global-color-text, #212121);
    /* Optik orta hizası — mini cart'taki :only-child nudge'ının eşi (rakam
     * descender'sızlığı; kutu merkezi stepper'la birebir, glyph ~1px yukarıda). */
    position: relative;
    top: 1px;
}
/* Üstü çizili eski (indirimsiz) satır toplamı. line-through'un fiyat rakamının
 * ÜSTÜNDE görünmesi için amount/bdi INLINE kalmalı ve decoration onlara da
 * doğrudan verilmeli. */
.ks-vm-cart-price-old,
.ks-vm-cart-price-old .woocommerce-Price-amount,
.ks-vm-cart-price-old bdi {
    text-decoration: line-through !important;
}
.ks-vm-cart-price-old .woocommerce-Price-amount,
.ks-vm-cart-price-old bdi {
    display: inline;
}
.ks-vm-cart-price-old {
    font-size: 1em;          /* mini cart oranı: eski tutar = taban boyut */
    font-weight: 600;
    color: #999;
    line-height: 1;
    padding: 0;
}
/* Ödenen satır toplamı — mini cart oranı (1.4em), renk kapsayıcıdan
 * (indirimliyse secondary, düzse yukarıdaki :only-child text'i). Sepette
 * HİÇBİR fiyatta highlight (arka plan) yok. */
.ks-vm-cart-price-new {
    font-size: 1.4em;
    font-weight: 700;
    color: inherit;
    background: none;
    text-decoration: none;
    letter-spacing: -0.3px;
    line-height: 1;
    padding: 0;
}
/* İndirim oranı rozeti — mini cart'taki .ks-vm-summary-badge ile aynı oranlar. */
.ks-vm-cart-price-badge {
    display: inline-flex;
    align-items: center;
    font-size: 1em;
    font-weight: 700;
    line-height: 1;
    color: #fff;
    background: var(--e-global-color-secondary, #d83b3b);
    border-radius: 4px;
    padding: 4px;
    white-space: nowrap;
}

/* ── Quantity controls ──
 * Both controls share ONE width: the wrapper is capped at 130px and each control
 * fills it 100% (operator: dropdown and +/- stepper must be equal, width:100%
 * max-width:130px). The wrapper's definite basis is what lets the children's
 * width:100% resolve to 130px. */
.ks-vm-cart-qty {
    position: relative;      /* hosts the adet panel (.ks-vm-adet-host) */
    flex: 0 1 130px;
    width: 100%;
    max-width: 130px;
}

/* Pack satırı (operatör, 1 Eyl 2026): boy dropdown'u YOK — satır kontrolü
 * retail ile AYNI görünümde tek −/+ sayaç (kaç paket), .ks-vm-cart-qty-stepper
 * kalıbını olduğu gibi kullanır. Tek fark: sarmalayıcı data-qty-initialized
 * taşıdığı için Botiga'nın JS'i .show sınıfını HİÇ basmaz (tema anchor'ları
 * .show gelene dek opacity:0+visibility:hidden tutar) — mini cart'taki çözümün
 * aynısıyla ikisini de kendimiz açıyoruz. */
.woocommerce-cart-form .ks-vm-pack-count .botiga-quantity-minus,
.woocommerce-cart-form .ks-vm-pack-count .botiga-quantity-plus {
    opacity: 1 !important;
    visibility: visible !important;
}

/* Retail stepper (!important: wins over Botiga's own sizing). 40px compact
 * height (border-box → a true 40px); fills the 130px wrapper with the +/-
 * pinned to the ends and the number cell flexing to fill the middle;
 * align-items:center vertically centres all three cells. */
.woocommerce-cart-form div.quantity {
    box-sizing: border-box !important;
    width: 100% !important;
    /* !important beats Botiga's `.shop-table-layout2 .shop_table .quantity`
     * (0,3,0) max-width:105px, which otherwise wins over our 130px. */
    max-width: 130px !important;
    height: 40px !important;
    min-height: 40px !important;
    align-items: center !important;
    justify-content: space-between !important;
}
/* −/+ glyphs: flex-centre the character, with a 4px bottom padding that lifts
 * the ink onto the number's optical centreline. The value is measured, not
 * guessed — with it the −, the digit and the + share one horizontal line (ink
 * midpoints 50.0 / 50.3 / 50.9 % of the 40px box). Botiga's own asymmetric
 * .show padding (2px/6px, tuned for its taller 50px stepper) is overridden. */
.woocommerce-cart-form div.quantity .botiga-quantity-minus,
.woocommerce-cart-form div.quantity .botiga-quantity-plus {
    flex: 0 0 auto;
    width: 30px !important;
    height: 100% !important;
    padding: 0 0 4px 0 !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    line-height: 1 !important;
    font-size: 20px !important;
}
.woocommerce-cart-form div.quantity input.qty {
    flex: 1 1 auto;
    width: auto !important;
    min-width: 0;
    height: 100% !important;
    text-align: center;
    /* Match the pack dropdown's text exactly (operator): size, weight, family and
     * colour. WooCommerce/theme force a system font stack + weight 400 on qty
     * inputs; the dropdown inherits the theme font at weight 500, so without this
     * the number renders in a different typeface. */
    font-size: 0.9em !important;
    font-weight: 500 !important;
    font-family: inherit !important;
    color: #212121 !important;
}
/* Read-only value box (JS makes it +/- only): no text caret, no editing tint. */
.woocommerce-cart-form div.quantity input.qty[readonly] {
    cursor: default;
    background: transparent;
}
/* A +/- button at the line's min (1) or stock max: greyed and inert (operator:
 * "gerekirse + iconunu disabled yaparak"). pointer-events:none also stops
 * Botiga's own step handler, so the line can never pass its stock ceiling. */
.woocommerce-cart-form .botiga-quantity-plus.ks-vm-qty-disabled,
.woocommerce-cart-form .botiga-quantity-minus.ks-vm-qty-disabled {
    opacity: 0.3;
    cursor: not-allowed;
    pointer-events: none;
}

/* Pack line: the adet dropdown as the quantity — same pill as the product
 * page's add-to-cart adet select (100px radius, 1px #ccc, SVG chevron), a
 * touch smaller (operator). Values measured from the live product-page select;
 * the desktop styled panel (.ks-vm-adet-panel) is shared, so only the closed
 * control needs matching here. */
select.ks-vm-cart-qty-select {
    box-sizing: border-box;
    width: 100%;
    min-width: 0;
    max-width: 130px;
    height: 40px;
    /* Override the theme's blanket min-height:51px on every <select>, or the pill
     * ignores the 40px height and stays tall (measured). */
    min-height: 40px;
    padding: 6px 42px 6px 16px;
    font-size: 0.9em;
    font-weight: 500;
    line-height: 1.4;
    color: #212121;
    border: 1px solid #ccc;
    border-radius: 100px;
    background-color: #fff;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%23212121' viewBox='0 0 448 512'%3E%3Cpath d='M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z' /%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: calc(100% - 16px) 50%;
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    cursor: pointer;
}

/* Open panel: the shared styles resolve against the cart cell's 16px base and
 * read larger/roomier than the closed pill. In the cart, match the pill's
 * 14.4px text and trim the option padding (operator: text + inner padding too
 * big). panel 4px + option-left 12px = 16px → the option text lines up with the
 * closed pill's 16px left padding. Scoped to .ks-vm-cart-qty so the product-page
 * panel is untouched. */
.ks-vm-cart-qty .ks-vm-adet-panel {
    padding: 4px;
}
.ks-vm-cart-qty .ks-vm-adet-panel .ks-vm-adet-option {
    font-size: 0.9em;
    padding: 5px 12px;
}

/* ── Remove (v2.276.0): başlık satırının sağında İKON BUTON — görünüm kayıtlı
 * kart/adres kartlarının çöp butonuyla TEK kaynak (`ks-vm-opt-ic
 * ks-vm-opt-ic-del`, ks-options.css; glif ::before mask). Burada yalnız
 * yerleşim + <a> renk pinleri: Botiga a/:visited'ı #212121'e boyar, mask
 * currentColor'dan beslendiği için glif de kararırdı. ── */
.woocommerce-cart .ks-vm-cart-head a.ks-vm-cart-remove,
.woocommerce-cart .ks-vm-cart-head a.ks-vm-cart-remove:visited {
    flex: none;
    margin-left: auto;       /* adın sağına, satırın sağ kenarına */
    color: #9a9a9a;          /* .ks-vm-opt-ic rengi (pin) */
    text-decoration: none;
}
.woocommerce-cart .ks-vm-cart-head a.ks-vm-cart-remove:hover {
    color: var(--ks-danger, #c8321f);
}

/* A line on its way out (quantity zeroed, AJAX in flight). Görünüm ADET
 * DEĞİŞİMİYLE AYNI (operatör, 4 Ağu): fiyat soluklaşması + spinner zaten
 * remove handler'ın da bastığı .ks-vm-cart-loading'den gelir; burada yalnız
 * tıklama kilidi kalır — eski satır-geneli opacity .4 kalktı (spinner'ı da
 * soluklaştırıyor, farklı bir "disabled satır" dili yaratıyordu). */
.ks-vm-cart-removing {
    pointer-events: none;
}

/* Update in flight: no full-module fade. Any residual blockUI overlay (WC
 * cart.js fallback paths, shipping-method refresh) keeps blocking clicks but
 * turns invisible; our own signals below carry the feedback instead. */
.woocommerce-cart .blockUI.blockOverlay {
    opacity: 0 !important;
}

/* Changed row: small spinner right of the quantity control + dimmed price. */
.ks-vm-cart-loading .ks-vm-cart-price {
    opacity: 0.45;
}
.ks-vm-cart-loading .ks-vm-cart-qty::after {
    content: '';
    position: absolute;
    right: -28px;
    top: 50%;
    width: 16px;
    height: 16px;
    margin-top: -9px;
    /* Renkler mini cart spinner'ıyla (.ks-vm-mc-spin) birebir: soluk halka +
     * kit SECONDARY üst — fiyatlarla aynı değişken, kit'ten otomatik izler. */
    border: 2px solid rgba(0, 0, 0, 0.12);
    border-top-color: var(--e-global-color-secondary, #d83b3b);
    border-radius: 50%;
    animation: ks-vm-btn-spin 0.6s linear infinite;
}

/* Totals box while the fresh numbers are on their way. */
.cart_totals.ks-vm-totals-loading .shop_table {
    opacity: 0.5;
    transition: opacity 0.15s;
}

/* ═══════════════════════════════════════════════════════════
 *  SAĞ KOLON (cart_totals) — TEK KAYNAK
 *  Sağ özet kutusunun TÜM görünümü artık buradan yönetilir: kutu, satırlar,
 *  ayraçlar, etiketler, değerler, toplam ve ödeme butonu düzeni. Değerler
 *  Botiga temasından (woocommerce.min.css) birebir taşındı ve frontend.css
 *  temadan SONRA yüklendiği için aynı seçicilerle temayı ezer. Kutuyu buradan
 *  değiştir. (Additional CSS hâlâ en sonda uygulanır → canlı ince ayar için.)
 * ═══════════════════════════════════════════════════════════ */

/* Kutu + iki-kolon yerleşimi (sağ kolon) */
.woocommerce-cart .cart-collaterals {
    margin-top: 30px;
}
.woocommerce-cart .cart_totals {
    width: 100%;
    max-width: 445px;
    float: right;
    margin-top: 90px;
    padding: 25px;
    padding-top: 20px;
    background-color: #f2f2f2;
    border-radius: 16px;
}
/* İki-kolon yerleşimi temanın responsive kademelerinden BİREBİR taşındı — bu
 * @media'lar olmadan kutu tam-genişlik olup sol kolonun altına düşer. */
@media (min-width: 992px) {
    /* Masaüstü: sağ kolon %30 (sol form %70'in yanında). */
    .woocommerce-cart .cart_totals {
        width: 30%;
        margin-top: 0;
    }
}
@media (max-width: 991px) {
    .woocommerce-cart .cart_totals {
        max-width: none;
        margin: 5px 0 40px;
    }
}
@media (max-width: 767px) {
    /* Mobil: alt alta yığılır. */
    .woocommerce-cart .cart_totals {
        float: none;
        max-width: 100%;
        margin-top: 40px;
        padding: 15px;
    }
}

/* Satırlar — ayraç YOK (operatör). Değer hücrelerinin altındaki çizgiyi Botiga
 * `!important` + yüksek özgüllükle basıyor (bu yüzden Additional CSS'ten
 * kaldırılamıyordu); aynı seçicilerle + !important + sonra-yüklenerek kapatılır. */
.woocommerce-cart .cart_totals table {
    margin: 0;
    border: 0;
}
.woocommerce-cart .cart_totals tr {
    border: 0;
}
.woocommerce-cart .cart_totals th,
.woocommerce-cart .cart_totals td {
    padding: 5px 0;          /* satır aralığı azaltıldı (15→10) */
    border: 0;
    background: transparent;
    /* baseline (v2.277.1, operatör): etiket FİYAT satırıyla aynı yazı
     * hattında — middle'da KDV notu ortalamaya dahil olup etiketi iki
     * satırın ortasına indiriyordu (checkout'un align-items:baseline eşi). */
    vertical-align: baseline;
}
.woocommerce-cart div.cart_totals table tr.cart-subtotal td,
.woocommerce-cart div.cart_totals table tr.shipping td,
.woocommerce-cart div.cart_totals table tr.cart-discount td,
.woocommerce-cart div.cart_totals table tr td,
.woocommerce-cart div.cart_totals table tr th {
    border-bottom: 0 !important;
    border-top: 0 !important;
}

/* v2.277.0 (operatör): kutu TEK SATIR — "Ara Toplam" + değeri; Toplam,
 * Teslimat Yeri, Kargo ve diğer satırların hepsi kalktı (buffer_totals_end
 * eler). Satır checkout'un Toplam satırının kılığında, yalnız AYRAÇ
 * ÇİZGİSİZ: etiket 15px/700, değer 16.5px/700, değerin altında WC-native
 * "(… KDV dahil)" notu (gerçek tutar). */
.woocommerce-cart .cart_totals th {
    text-align: left;
    text-transform: none;
    font-size: 15px;
    font-weight: 500;        /* operatör (v2.277.1): kalın olmak zorunda değil */
    letter-spacing: normal;
    color: var(--ks-ink, #1a1a1a);
}
/* "Ara Toplam (N ürün)" — adet notu etiketle BİREBİR aynı görünsün (span th'den
 * renk/boyut/ağırlık miras alır; özel stil YOK — operatör, checkout'taki
 * .ks-vm-co-trow-count ile aynı sözleşme). */

.woocommerce-cart .cart_totals td {
    text-align: right;
    font-size: 16.5px;
    font-weight: 700;
    color: var(--ks-ink, #1a1a1a);
    line-height: 1.2;    /* checkout'un .ks-vm-co-trow-value strong'u gibi sıkı */
}
/* KDV notu = checkout'un `.ks-vm-co-trow--total .includes_tax` kuralının
 * aynısı: kendi blok satırında, 12.5px / 400 / muted. */
.woocommerce-cart .cart_totals td .includes_tax {
    display: block;
    font-size: 12.5px;
    font-weight: 400;
    color: var(--ks-muted, #6a6a6a);
    /* checkout'ta not gövdenin 1.85'ini kalıtıyor (ölçüldü: 23.125px kutu) —
     * fiyat-not mesafesi birebir aynı olsun diye aynı değer (td 1.2 kalıtımı
     * kutuyu sıkıştırıyordu). */
    line-height: 1.85;
}

/* Operatörün #cart-navi Elementor kapsayıcısı (totals+buton kolonu) BOŞ
 * sepette tamamen gizli (operatör, 15 Ağu 2026). Gövde sınıfını
 * KS_VM_Cart_Page::add_empty_cart_body_class basar; sepet AJAX'la boşalınca
 * cart-page.js sayfayı yenilediği için sınıf bayatlamaz. */
.ks-vm-cart-empty #cart-navi {
    display: none;
}

/* Boş sepet metni (v2.278.0): bilgi kutusu değil düz, davetkâr paragraf;
 * bağlantılar cümle içinde. "Mağazaya geri dön" butonu cart-empty.php'de
 * koşulsuz gömülü olduğundan burada gizlenir (operatör: buton olmayacak). */
.ks-vm-cart-empty .return-to-shop {
    display: none;
}
.ks-vm-empty-cart p {
    margin: 0;
    /* Genişlik sınırı YOK (operatör): metin, içinde bulunduğu Elementor
     * kapsayıcısının tam genişliğine yayılır. */
    font-size: 15px;
    line-height: 1.7;
    color: var(--ks-ink, #1a1a1a);
}
.ks-vm-empty-cart a,
.ks-vm-empty-cart a:visited {
    color: var(--e-global-color-primary, #da6900);
    font-weight: 600;
    text-decoration: underline;
    text-underline-offset: 2px;
}
.ks-vm-empty-cart a:hover {
    color: var(--ks-ink, #1a1a1a);
}

/* ── Split sepet (Elementor kolonları): her shortcode KENDİ kapsayıcısını
 * full-width doldurur — genişlik Elementor kolonundan gelir, Botiga'nın 70/30
 * float bölünmesinden değil. Yalnız .ks-vm-cart-split gövde sınıfında (yani
 * [ks_vm_cart_totals] sayfadayken); klasik tek-[woocommerce_cart] düzeni
 * Botiga kolonlarını korur. */
.ks-vm-cart-split .woocommerce-cart-form {
    width: 100% !important;
    max-width: none !important;
    float: none !important;
    padding-right: 0 !important;
}
.ks-vm-cart-split .cart_totals {
    width: 100% !important;
    max-width: none !important;
    float: none !important;
    /* Split modda kutu ÇIPLAK basılır — [ks_checkout_totals] gibi (operatör,
     * 14 Ağu 2026): gri zemin, padding, radius ve dış boşluklar YOK; kutu
     * görünümü istenirse Elementor kapsayıcısından verilir. !important:
     * responsive @media kademeleri margin/padding'i özgüllük eşitliğinde
     * basıyor, kaynak sırasına bırakılmaz. */
    margin: 0 !important;
    padding: 0 !important;
    background: transparent !important;
    border-radius: 0 !important;
}

/* Ödeme butonu = checkout'un #place_order butonuyla BİREBİR (operatör,
 * 14 Ağu 2026): ks-checkout.css'teki `body .ks-vm-co #place_order` bloğunun
 * aynısı, AYNI token'lardan (--ks-btn-* / --ks-submit-*) — checkout butonu
 * değişirse burası otomatik izler. place_order gibi text-transform YOK
 * (etiket casing'i PHP'de yazıldığı gibi basılır). :visited pin ŞART — bu
 * buton <a>, Botiga :visited'ı #212121'e boyuyor (#place_order <button>
 * olduğundan checkout'ta bu pine gerek yoktu). */
.woocommerce-cart .cart_totals .checkout-button,
.woocommerce-cart .cart_totals .checkout-button:visited,
.woocommerce-cart .ks-vm-cart-submit .checkout-button,
.woocommerce-cart .ks-vm-cart-submit .checkout-button:visited {
    box-sizing: border-box;
    display: flex;
    width: 100%;
    align-items: center;
    justify-content: center;
    min-height: var(--ks-btn-min-height, 46px);
    /* Checkout'ta totals içindeki #place_order mesafesi. */
    margin-top: 14px;
    padding: var(--ks-btn-optical-nudge, 0px) var(--ks-btn-pad-x, 24px) 0;
    /* !important pinleri checkout'un #place_order bloğuyla AYNI — burada da
     * gerekli: Elementor kit'in link rengi (#151515) pin'siz color'ı eziyordu
     * (parity probe'uyla yakalandı). */
    background: var(--ks-submit-bg, #f3c924) !important;
    color: var(--ks-submit-text, #000) !important;
    border: none !important;
    border-radius: var(--ks-btn-radius, 999px);
    font-size: var(--ks-btn-font-size, 0.95em);
    font-weight: var(--ks-btn-font-weight, 600);
    letter-spacing: var(--ks-btn-letter-spacing, 0.3px);
    line-height: var(--ks-btn-line-height, 1.4);
    text-align: center;
    text-transform: none !important;
    transition: background 0.2s, color 0.2s;
}
.woocommerce-cart .cart_totals .checkout-button:hover,
.woocommerce-cart .cart_totals .checkout-button:focus,
.woocommerce-cart .ks-vm-cart-submit .checkout-button:hover,
.woocommerce-cart .ks-vm-cart-submit .checkout-button:focus {
    background: var(--ks-submit-hover-bg, #da6900) !important;
    color: var(--ks-submit-hover-text, #fff) !important;
}
/* Ayrık buton bloğu [ks_vm_cart_submit]: 14px kutu-içi düzenin kalıntısı —
 * aralık artık Elementor kapsayıcısından verilir. */
.woocommerce-cart .ks-vm-cart-submit .checkout-button {
    margin-top: 0;
}

/* ── "Teslimat Yeri" row: location value (link) ── 🚨 INLINE ŞART (v2.276.2):
 * dar/mobil görünümde WC stacked-tablo modu etiketi td::before float'u olarak
 * basar; block'lu değer float'ın ALTINA düşüyordu (operatör: değer etiketin
 * altında). Inline değer, diğer totals satırlarının düz metin değerleri gibi
 * etiketin karşısında kalır. (Eski block, kargo bedeli aynı hücredeyken
 * kalmıştı; bedel v2.24x'ten beri kendi satırında.) */
.ks-vm-delivery-row .ks-vm-delivery-value {
    display: inline;
}
/* 🚨 KÖK NEDEN (v2.276.2): sınıf ÇAKIŞMASI — `.ks-vm-delivery-row` aynı
 * zamanda ürün sayfasındaki [ks_delivery_info] satırlarının sınıfı ve oradaki
 * `display:flex; flex-wrap:wrap; justify-content:space-between` + `@media
 * ≤480px { flex-direction:column }` kuralları BU tabloya da sızıyordu:
 * telefonda değer etiketin ALTINA düşüyor (operatör şikâyeti), masaüstünde de
 * hücre içerik genişliğine büzüşüyordu. Sepet kapsamında satır normal tablo
 * satırına döner — diğer totals satırlarıyla birebir aynı davranış (etiket
 * solda, değer td'nin text-align:right'ıyla satır sağında; Botiga'nın dar
 * ekran stacked modu da diğer satırlarla aynı işler). */
.woocommerce-cart .cart_totals tr.ks-vm-delivery-row {
    display: table-row;
}
/* Vergi notu satırı data-title'sız → Botiga'nın stacked-mod td::before'u boş
 * '": "' artığı basıyordu; bu satırda pseudo-etiket kapalı. */
@media (max-width: 768px) {
    .woocommerce-cart .cart_totals .ks-vm-tax-note td::before {
        display: none !important;
    }
}
.woocommerce-cart .cart_totals a.ks-vm-delivery-loc,
.woocommerce-cart .cart_totals a.ks-vm-delivery-loc:visited {
    color: #212121;
    font-weight: 600;
    text-decoration: underline;
    text-underline-offset: 2px;
    cursor: pointer;
}
.woocommerce-cart .cart_totals a.ks-vm-delivery-loc:hover {
    color: var(--e-global-color-primary, #DA6900);
}
.woocommerce-cart .cart_totals a.ks-vm-delivery-loc--empty {
    color: var(--e-global-color-primary, #DA6900);
    font-weight: 600;
}
/* The "Kargo" cost row is a normal totals row (same look as Ara Toplam); no
 * extra styling needed — it inherits the theme's totals-table row rules. */

/* ── Teslimat Yeri popup ── */
.ks-vm-dl-overlay {
    position: fixed;
    inset: 0;
    z-index: 100000;
    display: none;
    align-items: center;
    justify-content: center;
    padding: 20px;
    background: rgba(0, 0, 0, 0.45);
}
.ks-vm-dl-overlay.ks-vm-dl-open {
    display: flex;
}
.ks-vm-dl-modal {
    position: relative;
    width: 100%;
    max-width: 360px;
    background: #fff;
    border-radius: 16px;
    padding: 24px 22px 22px;
    box-shadow: 0 20px 60px rgba(0, 0, 0, 0.25);
}
.ks-vm-dl-close {
    position: absolute;
    top: 10px;
    right: 12px;
    width: 32px;
    height: 32px;
    border: 0;
    background: none;
    font-size: 26px;
    line-height: 1;
    color: #999;
    cursor: pointer;
}
.ks-vm-dl-close:hover {
    color: #212121;
}
/* 🚨 Modal scope'lu (0,2,0): ÜRÜN SAYFASINDA Botiga'nın
 * `body.botiga-custom-shop-single h1…h6 { margin: 0 }` kuralı (0,1,2) tek
 * sınıflı `.ks-vm-dl-title`ı (0,1,0) yeniyor ve başlığın alt boşluğunu
 * SIFIRLIYORDU — sepette doğru, üründe yapışık görünüyordu (ölçüldü).
 * KS popup başlıkları bu sayfalarda hep modal-scope'lu yazılmalı. */
.ks-vm-dl-modal .ks-vm-dl-title {
    /* Başlık ile ilk alan arası nefes payı (operatör, 10 Ağu 2026). */
    margin: 0 0 24px;
    font-size: 1.2rem;
    font-weight: 600;
}
/* Alan görünümü BURADA TANIMLI DEĞİL: kabuk .ks-vm-co scope'unu taşır ve
 * ks-fields.css'in checkout/adres-popup diliyle boyanır (etiket, kutu, focus
 * halkası, select2 kontrolü + paneli). Burada yalnız popup'a özgü boşluklar
 * kalır — alan görünümünü değiştirmek gerekiyorsa ks-fields.css'e git. */
.ks-vm-dl-modal .ks-vm-co-fields {
    row-gap: 14px;
    margin-bottom: 18px;
}
/* İki alan da tam satır: ülke ve il/şehir yan yana sıkışmaz (adres
 * popup'ındaki ks-col-6 ikilileri gibi değil — burada yalnız iki alan var). */
.ks-vm-dl-modal .ks-vm-co-fields > div {
    grid-column: 1 / -1;
}
.ks-vm-dl-modal .form-row {
    margin: 0;
}
.ks-vm-dl-save {
    width: 100%;
    min-height: 46px;
    margin-top: 6px;
    border: 0;
    border-radius: 100px;
    background: var(--e-global-color-primary, #212121);
    color: #fff;
    font-size: 0.95em;
    font-weight: 600;
    cursor: pointer;
    transition: opacity 0.15s;
}
.ks-vm-dl-save:hover {
    opacity: 0.9;
}
.ks-vm-dl-save.ks-vm-dl-loading {
    opacity: 0.6;
    cursor: default;
}

/* Belt & suspenders: the dl.variation meta list is removed server-side; if a
 * third party re-adds item data, keep the cell clean anyway. */
.woocommerce-cart .shop_table .product-name dl.variation {
    display: none;
}

/* Actions row: coupon is removed server-side, the update button is the hidden
 * vehicle for the no-JS fallback — nothing visible remains. */
.woocommerce-cart .woocommerce-cart-form td.actions {
    padding: 0 !important;
    border: 0 !important;
}
.woocommerce-cart .woocommerce-cart-form td.actions .button[name="update_cart"] {
    display: none;
}

/* ═══════════════════════════════════════════════════════════════════════════
 * DELIVERY INFO — the [ks_delivery_info] block on the single product page
 *
 * Two kinds of row share one list: the prep row ("Kargoya teslim", from the
 * product/variation) and one row per carrier (from that shipping method's own
 * settings). Deliberately plain, scoped rules — no var()/token layer, per the
 * operator's CSS preference. Sizing follows the Tutar/summary block so the
 * box reads as part of the same add-to-cart column.
 * ═══════════════════════════════════════════════════════════════════════════ */
/* Box, heading and icon now come from the shared "KS PANEL" section above —
 * this block only styles its own rows. */
.ks-vm-delivery-info.ks-vm-delivery-hidden {
    display: none;
}
.ks-vm-delivery-rows {
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.ks-vm-delivery-row {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    /* Wrapping is what lets a carrier's note drop onto a line of its own, the
     * full width of the panel. Row-gap stays tight (the note sits right under
     * its carrier); the 12px only separates name from time on the first line. */
    flex-wrap: wrap;
    gap: 2px 12px;
    font-size: .95em;
}
.ks-vm-delivery-row + .ks-vm-delivery-row {
    padding-top: 8px;
    border-top: 1px solid #f0f0f0;
}
.ks-vm-delivery-name {
    display: flex;
    flex-wrap: wrap;
    align-items: center;
    gap: 6px;
    font-weight: 600;
}
.ks-vm-delivery-carrier {
    
}
/* The prep row is our own promise, not a carrier's — weight it differently so
 * the two never read as the same kind of commitment. */
.ks-vm-delivery-row--prep .ks-vm-delivery-name {
    
}
.ks-vm-delivery-time {
    flex: 0 0 auto;
    white-space: nowrap;
    text-align: right;
}

/* 🚨 Bu blok DELIVERY INFO bölümünün İÇİNDE ve taban .ks-vm-delivery-row
 * kurallarından SONRA durur: ikisi de tek sınıf (0,1,0) özgüllüğünde, yani
 * kazananı KAYNAK SIRASI belirliyor. Blok önce sepet-totals bölümündeydi ve
 * `flex-wrap: nowrap` override'ı taban `wrap`a yeniliyordu — uzun bir
 * "Ülke, Eyalet" değerinde satır ikiye bölünüyordu (ekran görüntüsüyle
 * yakalandı). Buraya taşımak dışında hiçbir değer değişmedi. */
/* ── "Teslimat yeri" trigger row inside the Gönderim Seçenekleri panel ──
 * Same popup, second trigger point (product page). The VALUE is the control
 * (operatör, 10 Ağu 2026): no "Değiştir" link — the location itself is thin,
 * underlined and clickable, and it never wraps: a long "Ülke, Eyalet" is
 * clipped with an ellipsis so the row stays one line.
 * :visited pinned — these are anchors, and Botiga's bare a:visited would
 * repaint them antracite. */
.ks-vm-delivery-row--where {
    /* nowrap + min-width:0 on the value cell = the two halves share the line
     * and only the value gives way (flex items refuse to shrink below their
     * content without min-width:0, which is what makes the ellipsis appear). */
    flex-wrap: nowrap;
    align-items: baseline;
    margin-bottom: 8px;
    padding-bottom: 8px;
    border-bottom: 1px solid #f0f0f0;
}
.ks-vm-delivery-row--where .ks-vm-delivery-name {
    flex: 0 0 auto;
}
.ks-vm-delivery-row--where .ks-vm-delivery-time {
    flex: 0 1 auto;
    min-width: 0;
}
.ks-vm-delivery-info a.ks-vm-delivery-loc,
.ks-vm-delivery-info a.ks-vm-delivery-loc:visited {
    display: block;
    max-width: 100%;
    overflow: hidden;
    color: #212121;
    font-weight: 400;
    text-decoration: underline;
    text-underline-offset: 2px;
    text-overflow: ellipsis;
    white-space: nowrap;
    cursor: pointer;
}
.ks-vm-delivery-info a.ks-vm-delivery-loc:hover {
    color: var(--e-global-color-secondary, #DA6900);
}
.ks-vm-delivery-info a.ks-vm-delivery-loc--empty,
.ks-vm-delivery-info a.ks-vm-delivery-loc:visited.ks-vm-delivery-loc--empty {
    color: var(--e-global-color-secondary, #DA6900);
}


/* ── ⓘ İPUCU ────────────────────────────────────────────────────────────────
 * Sürenin yanındaki açıklama simgesi. Metin admin panelinden yazılır (global
 * hazırlık ipucu + her kargo metodunun kendi ipucu); boşsa simge HİÇ basılmaz.
 * Salt CSS: hover VE focus ile açılır — dokunmatikte tek dokunuş odaklar. */
.ks-vm-tip {
    position: relative;
    display: inline-flex;
    align-items: center;
    margin-inline-start: 2px;
    color:var(--e-global-color-01631af);
    vertical-align: middle;
    transition: color 0.15s ease;
}
.ks-vm-tip:hover,
.ks-vm-tip:focus,
.ks-vm-tip:focus-visible {
    color: var(--e-global-color-primary);
    outline: none;
}
.ks-vm-tip .ks-vm-icon {
    font-size: 1.1em;
    display: block;
}
/* Simgenin iki ağırlığı üst üste duruyor (KS_VM_Icons hover çifti); üzerine
 * gelince dolu olana geçiyor. */
.ks-vm-tip .ks-vm-icon-swap {
    display: block;
    position: relative;
    line-height: 0;
}
.ks-vm-tip .ks-vm-icon--fill {
    position: absolute;
    inset: 0;
    opacity: 0;
    transition: opacity 0.15s ease;
}
.ks-vm-tip:hover .ks-vm-icon--fill,
.ks-vm-tip:focus .ks-vm-icon--fill {
    opacity: 1;
}
.ks-vm-tip:hover .ks-vm-icon--reg,
.ks-vm-tip:focus .ks-vm-icon--reg {
    opacity: 0;
}
.ks-vm-tip-bubble {
    position: absolute;
    bottom: calc(100% + 9px);
    /* Süre kolonu sağa dayalı ve simge panelin sağ kenarına yakın: balonu SAĞ
     * kenarından bağlamak taşmayı engelliyor. Mobilde satır alt alta geçtiği
     * için aşağıdaki media query'de sola çevriliyor. */
    right: 0;
    z-index: 30;
    width: max-content;
    max-width: 240px;
    padding: 8px 11px;
    border-radius: 8px;
    background: #232324;
    color: #fff;
    /* rem (em DEĞİL): ipucu artık iki ayrı bağlamda kullanılıyor — teslimat
     * panelleri (`[ks_prep_time]`) ve yorum satırlarındaki "Satın alan
     * kullanıcı" imi. em olduğunda balon, içinde bulunduğu satırın puntosunu
     * miras alıp iki yerde FARKLI boyda çıkıyordu; operatör birebir aynı olsun
     * dedi (30 Tem). 0.7rem = panelde eskiden ölçülen 11.2px. */
    font-size: 0.7rem;
    font-weight: 400;
    line-height: 1.4;
    text-align: start;
    /* Satır nowrap; balonun çok satırlı olabilmesi şart. */
    white-space: normal;
    opacity: 0;
    visibility: hidden;
    transform: translateY(4px);
    transition: opacity 0.15s ease, transform 0.15s ease, visibility 0.15s;
    pointer-events: none;
}
.ks-vm-tip-bubble::after {
    content: "";
    position: absolute;
    top: 100%;
    right: 8px;
    border: 5px solid transparent;
    border-top-color: #232324;
}
.ks-vm-tip:hover .ks-vm-tip-bubble,
.ks-vm-tip:focus .ks-vm-tip-bubble,
.ks-vm-tip:focus-visible .ks-vm-tip-bubble {
    opacity: 1;
    visibility: visible;
    transform: none;
}

/* The operator's free-text note drops onto its own line under the carrier. */
/* Direct child of the row (not of the name cell), so `flex-basis: 100%` is the
 * PANEL's width — the note runs the full width under both the carrier and its
 * delivery time instead of being confined to the label column. */
small.ks-vm-delivery-note {
    flex: 1 0 100%;
    font-size: 0.9em;
    line-height: 1.35;
    padding-top: 6px;
    color: var(--e-global-color-01631af);
}
/* ── KARGO FİRMASI ROZETİ ──────────────────────────────────────────────────
 * Kargo adının GEÇTİĞİ HER YER için tek kural: ürün sayfası listesi, sepet ve
 * ödeme sayfasındaki kargo seçenekleri, sipariş özeti tablosu. Boyutu tek
 * yerden değiştirin — ancak e-posta bu stil dosyasını hiç yüklemediği için
 * aynı ölçü KS_VM_Delivery_Time::LOGO_PX sabitinde de duruyor; ikisini
 * birlikte güncelleyin.
 *
 * `contain` bilinçli: logolar geniş ve dar oranlarda geliyor, `cover` olsaydı
 * daire markanın kenarlarını keserdi. Beyaz zemin, koyu logoların şeffaf PNG
 * olarak koyu arka planda kaybolmasını engelliyor. */
.ks-vm-carrier-logo {
    flex: 0 0 auto;
    display: inline-block;
    /* Kenarlık ölçüye DAHİL: aksi hâlde rozet 22 değil 24px çiziliyor ve
     * e-postadaki satır-içi ölçüyle (LOGO_PX) ayrışıyor. */
    box-sizing: border-box;
    width: 16px;
    height: 16px;
    border-radius: 100px !important;
    overflow: hidden;
    object-fit: contain;
    background: #fff;
    border: 1px solid #ececec;
    vertical-align: middle;
    margin-right: 1px;
}
/* Ürün sayfası satırı zaten flex + gap; orada margin ikinci bir boşluk yaratır. */
.ks-vm-delivery-name .ks-vm-carrier-logo {
    margin-right: 0;
}
/* ── ≤480px'te SATIRI ALT ALTA ALAN BLOK KALDIRILDI (18 Ağu 2026, operatör) ──
 * Buradaki `@media (max-width:480px){ .ks-vm-delivery-row{flex-direction:column} }`
 * telefonda [ks_shipping_options], [ks_prep_time] ve [ks_volume_discounts]
 * satırlarının HEPSİNDE etiketi değerinin ÜSTÜNE atıyordu. Operatör: karşılıklı
 * olmalı.
 *
 * Ölçüm, kuralın gereksiz olduğunu gösteriyor: 390px ekranda satır 330px, en uzun
 * çift "Yurtiçi Kargo" (109px) + "2-3 iş günü" (75px) = 184px. Yani yer bol; kural
 * darlık için değil, ihtiyat olarak konmuştu.
 *
 * Gerçekten sığmayan bir durumda taban kuraldaki `flex-wrap: wrap` zaten devrede:
 * değer kendi satırına iner. Sabit `column`dan farkı, bunun yalnız GEREKTİĞİNDE
 * olması. Kargo notu (`small.ks-vm-delivery-note`) da eskisi gibi kendi tam
 * genişlikli satırına düşmeye devam ediyor.
 *
 * Blokla birlikte giden iki yardımcı kural da gitti, ikisi de bu düzenin
 * sonucuydu: değerin `text-align:left`'i (artık sağa dayalı) ve ipucu balonunun
 * sol kenardan bağlanması (değer sağda olduğu için balon yeniden sağdan bağlı,
 * masaüstündeki gibi). ⚠️ Balonun taşmadığı 390px'te ölçüldü. */

/* Cart + checkout shipping choices: the carrier's delivery time beside its
 * name, and the operator's note under it. */
.ks-vm-rate-time {
    font-weight: 400;
    color: #888;
}
.ks-vm-rate-time::before {
    content: "· ";
}
small.ks-vm-rate-note {
    display: block;
    margin-top: 2px;
    color: #888;
    font-size: 0.86em;
    line-height: 1.35;
}
/* Cart totals "Teslimat Yeri" block: the chosen carrier's duration under its
 * cost, in the same muted note styling. */
.ks-vm-delivery-cost-row .ks-vm-delivery-eta {
    display: block;
    margin-top: 2px;
    color: #888;
    font-size: 0.86em;
    font-weight: 400;
    /* The totals column is narrow — without this "2-3 iş günü" breaks across
     * two lines and reads as two separate figures. */
    white-space: nowrap;
}

/* Thank-you page / my-account order view. */
p.ks-vm-order-delivery {
    margin: 0 0 16px;
    padding: 12px 16px;
    border-radius: 8px;
    background: #f7f7f7;
    color: #333;
}

/* ═══════════════════════════════════════════════════════════════════════════
 *  ÜRÜN GALERİSİ — DAİMA 3:4 DİKEY (28 Tem 2026, v2.128.0)
 *
 *  Operatör: hem büyük görsel hem thumbnail'lar, yüklenen fotoğraf hangi oranda
 *  olursa olsun 3:4 dikey çerçevede görünecek.
 *
 *  🔑 ÇÖZÜLEN ASIL SORUN: slick her slaydın yüksekliğini KENDİ görselinden
 *  alıyordu — ölçüldü: aynı üründe 430×645 (2:3 foto), 430×430 (kare swatch),
 *  430×597 (0.72 foto). Yani slayt değiştikçe galeri kutusu ZIPLIYORDU ve altındaki
 *  her şey kayıyordu. `aspect-ratio` kutuyu sabitler, `object-fit: cover` fotoğrafı
 *  taşırmadan kırpar → tüm slaytlar aynı yükseklik, sayfa oynamaz.
 *
 *  Büyük görselde kırpma yalnızca CSS: kaynak `woocommerce_single` (800px, kırpma
 *  YOK) olduğu için tarayıcı tam çözünürlükten kırpar, kalite kaybı olmaz.
 *  Thumbnail'lar farklı — WooCommerce onları 100×100 KARE üretiyordu; kareyi 3:4'e
 *  kırpmak "kırpılmışı tekrar kırpmak" olurdu (kenarlar gider, 100px büyütülür,
 *  bulanıklaşır). Bu yüzden dosya boyutu PHP'de 300×400'e çekildi, bkz.
 *  includes/class-ks-vm-gallery.php.
 *
 *  ⛔ 27 Tem'in CİHAZA GÖRE thumbnail konumu (v2.120.0: KS_VM_Gallery_Thumbs +
 *  gallery-thumbs.js + buradaki flex/order kuralları) operatör kararıyla TAMAMEN
 *  KALDIRILDI. Şerit artık widget panelindeki tek ayardan yönetiliyor ve o ayar
 *  TÜM görünümlerde aynı çalışıyor; düzen tamamen Woolentor'un kendi
 *  `.thumbnails-tab-position-<pos>` float kurallarına geri döndü. Buraya tekrar
 *  cihaz-bazlı kural EKLEME — istenen davranış bilinçli olarak budur.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* Büyük görsel — widget'ın dört düzeninde de (tabslider / tab / gallery / slider).
 * Seçici öneki Woolentor'un kendi kurallarıyla aynı özgüllük sınıfında; WooCommerce
 * çekirdeğinin `div.images img{width:100%;height:auto}` kuralını da böyle geçiyoruz. */
/* 🎛️ 17 Ağu 2026: değerler artık `--ks-gal-*` değişkenlerinden okunur; değişkenleri
 * Elementor panelindeki "KS Galeri" bölümü (KS_VM_Gallery::register_widget_controls,
 * widget wrapper'ına yazar) besler. Fallback'ler = bugüne kadarki sabit değerler,
 * yani panelde hiçbir şey seçilmemişken görünüm birebir aynıdır. KURAL: yeni bir
 * görsel özellik eklerken sabit yazma — var() + panel kontrolü çifti kur. */
.woocommerce div.product div.images.wlpro-product-thumbnails .woolentor-learg-img img,
.woocommerce div.product div.images.wlpro-product-thumbnails .woocommerce-product-gallery__image > img,
.woocommerce div.product div.images.wlpro-product-thumbnails .wl-single-gallery img,
.woocommerce div.product div.images.wlpro-product-thumbnails .wl-thumbnails-slider .wl-single-slider img {
    aspect-ratio: var(--ks-gal-ratio, 3 / 4);
    width: 100%;
    height: auto;
    object-fit: var(--ks-gal-fit, cover);
    object-position: center;
}

/* Thumbnail'lar — tabslider (`.woolentor-thumb-single`) ve tab (`ul li`) düzeni. */
.woocommerce div.product div.images.wlpro-product-thumbnails .woolentor-thumb-single img,
.woocommerce div.product div.images.wlpro-product-thumbnails ul.woolentor-thumbanis-image li img {
    aspect-ratio: var(--ks-gal-thumb-ratio, 3 / 4);
    width: 100%;
    height: auto;
    object-fit: cover;
    object-position: center;
    display: block;
}

/* ───────────────────────────────────────────────────────────────────────────
 *  ÇERÇEVE + KÖŞE YUVARLAKLIĞI (28 Tem 2026, v2.129.0 · operatör kararı)
 *
 *  🎛️ 17 Ağu 2026: kalınlık/renk/radius değerleri paneldeki "KS Galeri"
 *  bölümünden yönetilir (--ks-gal-* değişkenleri); bu blok yalnız çerçevenin
 *  NEREYE çizileceğini bilir. Aşağıdaki uyarı hâlâ geçerli:
 *
 *  ⛔ WOOLENTOR'UN KENDİ "Image Border" GRUBUNDAN VERME. O grup çerçeveyi
 *  `… .woocommerce-product-gallery__image img` seçicisine, yani slider'ın HER
 *  SLAYDINA ayrı ayrı basıyor: kaydırınca kutu değil görseller çerçeveleniyor,
 *  üstelik slick'in `.slick-list{overflow:hidden}`'ı kesirli slayt genişliğinde
 *  sağdaki 1px'i kırptığı için sağ kenarlık YOK gibi görünüyordu. Panelin o
 *  ayarları bu yüzden temizlendi; tek kaynak burası.
 *
 *  Çözüm: çerçeve KABIN kendisinde (`.woolentor-learg-img` = slider'ın görünen
 *  penceresi), görsellerde değil. Slaytlar radius'un içinden geçsin diye kırpma
 *  `.slick-list`'te de tekrarlanıyor — transform'lu (slick-track) içerik, sadece
 *  dış kapta radius varken bazı tarayıcılarda köşeden taşıyor.
 *
 *  Değerler sitenin bilgi panelleriyle (`.ks-panel`) bilinçli olarak aynı:
 *  1px + Elementor "Border" global rengi. Yuvarlaklık büyük kutuda 12px,
 *  thumbnail'da 8px — 96px'lik bir kutuda 12px orantısız yuvarlak duruyor.
 * ─────────────────────────────────────────────────────────────────────────── */
.woocommerce div.product div.images.wlpro-product-thumbnails .woolentor-learg-img {
    border: var(--ks-gal-bw, 1px) solid var(--ks-gal-bc, var(--e-global-color-dcb0b6a, #d1d1d1));
    border-radius: var(--ks-gal-radius, 8px);
    overflow: hidden;
}
.woocommerce div.product div.images.wlpro-product-thumbnails .woolentor-learg-img .slick-list {
    border-radius: inherit;
    overflow: hidden;
}
/* Slider KURULMADAN önceki (ve slider'sız düzenlerdeki) tek görsel: kap yok,
 * çerçeve görselin kendisinde — aksi hâlde ilk boyamada çerçevesiz görünüp
 * slick kurulunca yerine oturuyor (FOUC). */
.woocommerce div.product div.images.wlpro-product-thumbnails .wl-single-gallery img,
.woocommerce div.product div.images.wlpro-product-thumbnails .woocommerce-product-gallery__image:not(.woolentor-learg-img) > img {
    border: var(--ks-gal-bw, 1px) solid var(--ks-gal-bc, var(--e-global-color-dcb0b6a, #d1d1d1));
    border-radius: var(--ks-gal-radius, 8px);
    box-sizing: border-box;
}
/* Thumbnail'da çerçeve GÖRSELİN kendisinde doğru yer: slaydın padding'i şeridin
 * aralığını verir, görsel de kartın ta kendisi. */
.woocommerce div.product div.images.wlpro-product-thumbnails .woolentor-thumb-single img,
.woocommerce div.product div.images.wlpro-product-thumbnails ul.woolentor-thumbanis-image li img {
    border: var(--ks-gal-thumb-bw, 1px) solid var(--ks-gal-thumb-bc, var(--e-global-color-dcb0b6a, #d1d1d1));
    border-radius: var(--ks-gal-thumb-radius, 8px);
    box-sizing: border-box;
    /* ⚠️ `outline-color` GEÇİŞE KONULMAZ: halka pasifken temanın varsayılan
     * outline rengini (#212121) taşıyor, geçiş onu accent'e doğru animasyona
     * sokuyordu → thumbnail bir an SİYAH çerçeveli yanıp sonra turuncuya
     * dönüyordu (operatör fark etti). Halka anında belirsin; yalnız kenarlık
     * rengi yumuşasın. */
    transition: border-color 0.15s ease;
}

/* ───────────────────────────────────────────────────────────────────────────
 *  SEÇİLİ / ÜZERİNDE OLUNAN THUMBNAIL (28 Tem 2026 · operatör)
 *
 *  🚨 HALKA `border-width` İLE KALINLAŞTIRILMAZ. `box-sizing:border-box` dış
 *  kutuyu sabit tutuyor ama kalınlaşan kenarlık İÇERİDEN yiyor: ölçüldü, aktif
 *  olunca görselin içi 66×89'dan 62×85'e düşüyordu — thumbnail'ın fotoğrafı
 *  gözle görülür şekilde KÜÇÜLÜYORDU. Bu bir hataydı, düzeltildi.
 *
 *  🚨 DIŞARI ÇİZİLEN HALKA DA OLMAZ (`box-shadow: 0 0 0 1px` denendi, KESİK
 *  göründü): görsel `.slick-list`in üst kenarına SIFIR boşlukla dayanıyor
 *  (ölçüldü: üstte 0px, altta 1px pay) ve o kap `overflow:hidden` — kutunun
 *  dışına taşan her şey kırpılıyor. Yatayda slaydın 5px padding'i var, dikeyde
 *  YOK; halka bu yüzden üstten/alttan kesiliyordu.
 *
 *  Doğrusu: kenarlık hep 1px kalır, halka `outline` + NEGATİF offset ile
 *  KUTUNUN İÇİNE çizilir. `outline-offset: -2px` + `outline-width: 2px` =
 *  halkanın dış kenarı tam olarak kutunun kenarına oturur: dışarı taşmadığı
 *  için kırpılmaz, layout'a da hiç dokunmaz (outline yer kaplamaz), görselin
 *  iç alanı 66×89 sabit kalır. Kenarlık rengi de accent yapılıyor ki köşe
 *  yumuşatmasında gri bir kıl payı sızmasın. Toplam halka 2px.
 *
 *  `slick-current` = büyük görselde o an duran slayt (asNavFor eşlemesi bunu
 *  otomatik taşıyor; hover ile gezerken de anında oraya geçiyor, bkz.
 *  assets/js/gallery.js). Renk KS accent'i = "Hemen Satın Al" turuncusu.
 * ─────────────────────────────────────────────────────────────────────────── */
/* 🎛️ Halka değişkenlerini paneldeki NATIVE "Thumbnails Image → Active → Border"
 * grubu yazar (KS_VM_Gallery::remap_thumbnail_controls yönlendirdi): stil =
 * --ks-gal-ring-style, kalınlık (üst değer) = --ks-gal-ring-w, renk =
 * --ks-gal-ring-color. Stil "none" seçilirse halka kapanır. */
/* 2 Eyl 2026: halka `slick-current`a DEĞİL `ks-vm-thumb-current`a bağlı (gallery.js markCurrentThumb) —
 * şerit kendi oklarıyla kaydırılınca slick `slick-current`ı ilk görünen kareye taşıyor, halka zıplamasın. */
.woocommerce div.product div.images.wlpro-product-thumbnails .woolentor-thumb-single.ks-vm-thumb-current img,
.woocommerce div.product div.images.wlpro-product-thumbnails .woolentor-thumb-single:hover img {
    border-color: var(--ks-gal-ring-color, var(--e-global-color-primary));
    outline: var(--ks-gal-ring-w, 2px) var(--ks-gal-ring-style, solid) var(--ks-gal-ring-color, var(--e-global-color-primary));
    outline-offset: calc(-1 * var(--ks-gal-ring-w, 2px));
}

/* Büyük görsel tıklanınca lightbox açılıyor (yalnız "Enlarge" açıkken — sınıfı
 * gallery.js, köşedeki büyüteç butonu VARSA ekliyor). İmleç bunu haber veriyor;
 * oklar kendi işaretlerini korur.
 *
 * `zoom-in` (büyüteç) DEĞİL `pointer` (el): burada tıklama gerçek bir eyleme —
 * lightbox'ı açmaya — gidiyor; büyüteç imleci ise "yerinde yakınlaşacak"
 * anlamına gelir ve o iş zaten hover büyüteci tarafından, tıklamasız yapılıyor
 * (operatör, 28 Tem). */
/* ───────────────────────────────────────────────────────────────────────────
 *  MERCEK + YAN PANEL ZOOM (17 Ağu 2026 · operatör: "Trendyol gibi")
 *
 *  Yerinde büyütme (jQuery-zoom) panel modunda SÖKÜLÜYOR (assets/js/gallery.js
 *  killHoverZoom); yerine görselin üzerinde mercek dikdörtgeni + hemen sağında
 *  aynı boyutta zoom paneli var. Yalnız fare + ≥1025px.
 *
 *  🚨 PANEL `document.body`NİN ÇOCUĞU. Galeri çerçevesi `overflow:hidden`
 *  taşıdığı için içine konsa kırpılırdı; konumu JS doküman koordinatıyla
 *  yazıyor (sayfa kaydırılınca görselden kopmasın diye fixed DEĞİL).
 *  Boyut/konum/arka plan tamamen JS'ten gelir — buradaki kurallar yalnız
 *  görünüm ve katman.
 * ─────────────────────────────────────────────────────────────────────────── */
.ks-vm-zoom-lens {
    position: absolute;
    z-index: 4; /* Rozetlerin (7) ALTINDA — rozetler hover'da hep okunur kalsın. */
    display: none;
    pointer-events: none; /* Tıklama görsele geçsin: lightbox açılmaya devam. */
    border: 1px solid rgba(255, 255, 255, .95);
    background: rgba(255, 255, 255, .2);
    box-shadow: 0 0 0 1px rgba(0, 0, 0, .18);
    /* Köşe yuvarlaklığı ÜRÜN GÖRSELİYLE AYNI (operatör, 17 Ağu). `inherit`
     * çerçevenin (`.woolentor-learg-img`) değerini alır: operatör radius'u
     * Elementor panelinden değiştirdiğinde mercek kendiliğinden takip eder,
     * burada ikinci bir sabit tutmaya gerek kalmaz. Panel `body`nin çocuğu
     * olduğu için miras alamıyor; onun radius'unu JS yazıyor. */
    border-radius: inherit;
}
.ks-vm-zoom-panel {
    position: absolute;
    z-index: 900; /* Sağdaki özet alanının üstünde; sticky header'ın altında. */
    display: none;
    pointer-events: none;
    overflow: hidden;
    background-color: #fff;
    background-repeat: no-repeat;
    border: 1px solid var(--e-global-color-dcb0b6a, #d1d1d1);
    border-radius: 8px;
    box-shadow: 0 10px 40px rgba(0, 0, 0, .18);
}
.ks-vm-zoom-lens.is-on,
.ks-vm-zoom-panel.is-on {
    display: block;
}

.wlpro-product-thumbnails.ks-vm-gallery-enlargeable .woolentor-learg-img {
    cursor: pointer;
}
.wlpro-product-thumbnails.ks-vm-gallery-enlargeable .woolentor-learg-img .slick-arrow {
    cursor: pointer;
}

/* Köşedeki büyüteç ikonu artık gereksiz: görselin TAMAMI tıklanabilir
 * (operatör, 28 Tem).
 *
 * ⛔ DOM'dan SİLİNMİYOR, yalnız gizleniyor — lightGallery o butonun ÜZERİNDE
 * kurulu ve gallery.js açmak için ona `trigger('click')` atıyor. Görsel gizleme
 * bunu etkilemez, kaldırmak ise büyütmeyi tamamen öldürür.
 *
 * Kapsam bilinçli olarak `.ks-vm-gallery-enlargeable`: bu sınıfı gallery.js
 * ancak tıklama başarıyla bağlandığında ekliyor. JS bir sebeple çalışmazsa
 * ikon yerinde kalır ve büyütme yine mümkün olur. */
.wlpro-product-thumbnails.ks-vm-gallery-enlargeable .btn-zoom-popup {
    display: none;
}

/* ───────────────────────────────────────────────────────────────────────────
 *  BÜYÜTÜLMÜŞ GALERİ (lightGallery) — TAM EKRAN DEĞİL, 3:4 POPUP KART
 *  (28 Tem 2026, v2.131.0 · operatör kararı)
 *
 *  lightGallery varsayılanda sahneyi ekranın tamamına yayıyor. Operatör bunun
 *  yerine ortada duran, sayfanın 3:4 galerisiyle aynı orandaki bir kart istedi.
 *
 *  🔑 SAHNEYİ TEK YERDEN KÜÇÜLTÜYORUZ: `.lg`. Onun içindeki her şey (slaytlar,
 *  görsel sarmalayıcı) zaten `position:absolute` + %100 ölçüde, slayt geçişi de
 *  YÜZDE tabanlı `translate3d` ile yapılıyor — yani kabı küçültmek tüm iç
 *  geometriyi ve kaydırma matematiğini kendiliğinden ölçekliyor. lightGallery
 *  `.lg`'ye satır-içi `width/height:100%` yazdığı için `!important` şart.
 *
 *  ⚠️ KONTROLLER KARTIN DIŞINDA KALIYOR (`position:fixed`): kapatma/zoom ikonları
 *  açık gri, kart da fotoğrafın kendisi — açık renkli bir fotoğrafın üstünde
 *  kaybolurlardı. Karartmanın üzerinde duruyorlar. `.lg`'de transform YOK, bu
 *  yüzden `overflow:hidden` fixed çocukları KIRPMAZ (kırpsaydı zoom'u tutmak
 *  için başka bir kap gerekirdi).
 *
 *  Görsel karta `cover` ile oturuyor: sayfadaki galeri hangi kadrajı gösteriyorsa
 *  büyütülmüşü de aynısını gösteriyor. Fotoğrafın TAMAMI istenirse tek satır —
 *  `.lg-image`'ta `object-fit: contain` + `.lg`'ye zemin rengi.
 *
 *  Kapsam `body.single-product`: lightGallery site genelinde başka widget'larca
 *  da kullanılabiliyor, onların düzenine karışmıyoruz.
 * ─────────────────────────────────────────────────────────────────────────── */
body.single-product .lg-outer {
    display: flex;
    align-items: center;
    justify-content: center;
}
/* 3:4, iki eksende de ekrana sığan en büyük kart.
 *
 * İLK İKİ SATIR TABAN, sonraki ikisi asıl kural: `min()` bilmeyen bir tarayıcı
 * son iki bildirimi atar ve elinde yine 3:4 bir kart kalır (66vh = 88vh × 3/4),
 * yalnız çok dar ekranda taşabilir. Tek satırla yazsaydık `min()` desteklenmediği
 * anda kutu lightGallery'nin satır-içi %100'üne düşer = TAM EKRAN. */
body.single-product .lg-outer .lg {
    height: 88vh !important;
    width: 66vh !important;
    width: min(92vw, calc(88vh * 3 / 4)) !important;
    height: min(88vh, calc(92vw * 4 / 3)) !important;
    /* lightGallery'nin kendi `.lg-outer .lg{overflow:hidden}` kuralı, kartın
     * DIŞINA taşan okları görünmez yapıyordu — kutuları doğru ölçülüyor ama
     * boyanmıyorlardı. Kırpma bir alt katmana taşındı (aşağıda). */
    overflow: visible;
}
/* Yuvarlatma + kırpma KARTTA DEĞİL, bir iç katmanda (`.lg-inner`, kartın birebir
 * aynı kutusu). Sebep: oklar kartın DIŞINDA duruyor ve `.lg`'de `overflow:hidden`
 * olsaydı onları kırpardı. Kırpmayı bir seviye içeri almak hem köşeleri hem
 * zoom taşmasını tutuyor, oklara dokunmuyor. */
body.single-product .lg-outer .lg-inner {
    border-radius: 8px;
    overflow: hidden;
}
/* lightGallery görseli `:before` + `vertical-align:middle` hilesiyle ortalıyor;
 * kartı tam dolduran bir görselde o 1px'lik pseudo görseli alt satıra atardı. */
body.single-product .lg-outer .lg-item::before,
body.single-product .lg-outer .lg-img-wrap::before {
    display: none;
}
body.single-product .lg-outer .lg-img-wrap {
    padding: 0;
}
body.single-product .lg-outer .lg-image {
    display: block;
    width: 100% !important;
    height: 100% !important;
    max-width: none;
    max-height: none;
    object-fit: cover;
    object-position: center;
}
/* ARAÇ ÇUBUĞU: sayaç ("1 / 5"), zoom-in, zoom-out ve tam-ekran KALDIRILDI
 * (operatör, 28 Tem). Geriye yalnız KAPATMA kalıyor ve o da ekranın üstünden
 * GÖRSELİN SAĞ ÜST KÖŞESİNE (içeri) taşınıyor.
 *
 * Çubuğun kendisi zaten `.lg`'ye göre absolute (lightGallery böyle kuruyor);
 * tam-genişlik + koyu zeminini alıp sağ üst köşeye çekiyoruz. Çocukları
 * `:not(.lg-close)` ile gizlemek, ileride lightGallery yeni bir ikon eklerse
 * onun da kendiliğinden dışarıda kalmasını sağlıyor.
 *
 * ⛔ Kapatmayı SİLMİYORUZ, sadece giydiriyoruz: lg'nin kendi kapatma mantığı
 * bu düğmede. (ESC de çalışmaya devam ediyor.) */
body.single-product .lg-outer .lg-toolbar {
    position: absolute;
    top: 6px;
    right: 6px;
    left: auto;
    width: auto;
    background: none;
    box-shadow: none;
}
body.single-product .lg-outer .lg-toolbar > *:not(.lg-close) {
    display: none;
}
/* Sayaç ("1 / 5") yukarıdaki kurala DİRENDİ: lightGallery onu `#lg-counter`
 * ID'siyle stillendiriyor (1,0,0) ve ID her sınıf zincirini yener. Kendi ID'siyle
 * kapatıyoruz. */
body.single-product .lg-outer #lg-counter {
    display: none;
}
/* Cross ÇİZİLİYOR, fonttan alınmıyor.
 *
 * Denenip elenen yol: `simple-line-icons`in `.sli-close`u (\e082) — chevron'larla
 * aynı aile ama glyph DAİRE İÇİNDE X (render'la görüldü), chevron'ların çıplak
 * çizgisiyle uyuşmuyor. O sette çıplak X yok. lightGallery'nin kendi `lg`
 * fontundaki X ise kalın/dolgun.
 *
 * Bu yüzden iki pseudo çizgiyi ±45° döndürüyoruz: 22×1.4px, chevron'un yanına
 * koyulup 4× büyütmeyle karşılaştırılarak ayarlandı; chevron 30px'e büyüyünce
 * onun çizgisi de kalınlaştığı için cross 1.4→1.8px'e çıkarıldı (operatör). Çizgiler `currentColor` aldığı için
 * renk tek yerden (aşağıdaki `color`) yönetiliyor.
 *
 * Renk = Elementor **primary** globali, %50 saydamlıkta (operatör, 28 Tem).
 * Gölge YOK — bilerek: saydamlık zaten fotoğraftan ayırıyor. Önceki tur "Muted
 * + drop-shadow"du, ikisi de kaldırıldı. */
body.single-product .lg-outer .lg-toolbar .lg-close {
    position: relative;
    width: 40px;
    height: 40px;
    padding: 0;
    color: var(--e-global-color-primary, #000000);
    opacity: 0.5;
}
/* lightGallery ikonu hover'da BEYAZA çeviriyor (`.lg-toolbar .lg-icon:hover`);
 * siyah bir cross'ta bu ton sıçraması olurdu. Renk sabit kalıyor, geri bildirim
 * saydamlıktan geliyor. */
body.single-product .lg-outer .lg-toolbar .lg-close:hover {
    color: var(--e-global-color-primary, #000000);
    opacity: 1;
}
body.single-product .lg-outer .lg-toolbar .lg-close::before,
body.single-product .lg-outer .lg-toolbar .lg-close::after {
    content: "";
    position: absolute;
    top: 50%;
    left: 50%;
    width: 22px;
    height: 1.8px;
    margin: -0.9px 0 0 -11px;
    background: currentColor;
    border-radius: 1px;
}
body.single-product .lg-outer .lg-toolbar .lg-close::before {
    transform: rotate(45deg);
}
body.single-product .lg-outer .lg-toolbar .lg-close::after {
    transform: rotate(-45deg);
}

/* ───────────────────────────────────────────────────────────────────────────
 *  KONTROLLER KENDİLİĞİNDEN KAYBOLMASIN (operatör, 28 Tem)
 *
 *  lightGallery `hideBarsDelay` (6 sn) süresince fare kıpırdamazsa
 *  `.lg-outer`a `lg-hide-items` ekliyor; o sınıf okları ve araç çubuğunu
 *  `opacity:0` + 10px kaydırmayla siliyor. Ürün galerisinde bu istenmiyor:
 *  kullanıcı fotoğrafa bakarken kapatma ve ileri/geri ortadan kalkıyordu.
 *
 *  Sınıfı JS'te devre dışı bırakmak yerine GÖRSEL OLARAK etkisizleştiriyoruz —
 *  lg sınıfı eklemeye/kaldırmaya devam etsin, bizim için bir şey değişmesin.
 *  Kapatma ikonunun kendi `opacity:.5`'i burada EZİLMEZ; bu kural çubuğa
 *  (`.lg-toolbar`) uygulanıyor, ikonun saydamlığı onun içinde çarpılarak
 *  korunuyor. */
body.single-product .lg-outer.lg-hide-items .lg-prev,
body.single-product .lg-outer.lg-hide-items .lg-next,
body.single-product .lg-outer.lg-hide-items .lg-toolbar {
    opacity: 1;
    transform: none;
}


/* ───────────────────────────────────────────────────────────────────────────
 *  İLERİ/GERİ OKLARI — ÜÇ TAKIM DA CAROUSEL OKLARININ BİREBİR AYNISI
 *  (19 Ağu 2026, v2.305.0 · operatör kararı)
 *
 *  Ürün sayfasında üç ayrı ok takımı vardı ve üçü de başka görünüyordu:
 *    1. Loop carousel (Elementor Pro)     → 42×42 açık gri kutu, eicon chevron
 *    2. Galeri büyük görseli (Woolentor)  → 40×40 zeminsiz, simple-line-icons 25px
 *    3. Büyütülmüş galeri (lightGallery)  → 46×46 beyaz, simple-line-icons 30px
 *  Operatör 1'i REFERANS aldı: 2 ve 3 artık onun görünümünü giyiyor.
 *  ⛔ KONUM DEĞİŞMİYOR — her takım kendi yerinde kalıyor (galeri okları yine
 *  görselin üstüne hover'da beliriyor, lightbox okları yine kartın dışında).
 *  Değişen yalnız KUTU ve İKON.
 *
 *  🔑 REFERANS DEĞERLER, Elementor Single Product şablonu 775'teki loop-carousel
 *  widget'larının panel ayarlarından ölçüldü (cdb3db2 / 860fcc9 / e9f47fc /
 *  6493da7 — dördü de birebir aynı):
 *      kutu   = padding 10px + ikon 22px  → 42×42
 *      zemin  = #E9E9E9 · köşe 5px · geçiş .25s
 *      ikon   = #7A7A7A
 *      hover  = zemin Elementor **primary** globali · ikon rgba(238,238,238,.9)
 *               (hover ikon rengi panelde BOŞ bırakılmış; bu değer Elementor'un
 *                kendi yedeği — widget-loop-carousel.min.css'teki
 *                `hsla(0,0%,93.3%,.9)`)
 *  ⚠️ Operatör panelden carousel oklarını değiştirirse bu blok ONU TAKİP ETMEZ,
 *  elle güncellenmeli. Bilinçli seçim: tek alternatif her ürün isteğinde
 *  `_elementor_data`'yı ayrıştırmaktı, bir ok rengi buna değmez.
 *
 *  🔑 İKON FONTTAN DEĞİL, MASKEDEN GELİYOR. Elementor chevron'u sayfaya satır-içi
 *  SVG basıyor ve `eicons` webfont'u bu sayfada YÜKLÜ DEĞİL (document.fonts ile
 *  bakıldı) — yani `content:"\eXXX"` yolu yok. Aynı SVG yolunu `mask-image`
 *  olarak veriyoruz: glyph birebir aynı, renk yine `currentColor`dan geliyor
 *  (yani rengi tek yerden, aşağıdaki `color` bildirimlerinden yönetiyoruz).
 *  viewBox 0 0 1000 1000 + maske ölçüsü 22px = Elementor'un `svg{width:1em}`
 *  çizimiyle aynı ölçek.
 * ─────────────────────────────────────────────────────────────────────────── */

/* ── Ortak kutu ── */
body.single-product .wlpro-product-thumbnails.thumbnails-layout-tabslider .woolentor-learg-img .slick-arrow,
body.single-product .lg-outer .lg-actions .lg-prev,
body.single-product .lg-outer .lg-actions .lg-next {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 42px;
    height: 42px;
    padding: 10px;
    background-color: #E9E9E9;
    border: 0;
    border-radius: 5px;
    box-shadow: none;
    color: #7A7A7A;
    line-height: 1;
    text-shadow: none;
    transition: all 0.25s;
}
body.single-product .wlpro-product-thumbnails.thumbnails-layout-tabslider .woolentor-learg-img .slick-arrow:hover,
body.single-product .lg-outer .lg-actions .lg-prev:hover,
body.single-product .lg-outer .lg-actions .lg-next:hover {
    background-color: var(--e-global-color-primary, #000000);
    color: rgba(238, 238, 238, 0.9);
}

/* ── Yalnız SAYFADAKİ galeri: saydam zemin + kenardan boşluk (operatör, 19 Ağu) ──
 * Bu iki ok fotoğrafın ÜSTÜNDE duruyor, carousel ve lightbox okları durmuyor;
 * üç takımın ayrıştığı tek yer burası:
 *   • Zemin %72 opaklıkta → kutunun kapattığı kadraj görünmeye devam ediyor.
 *     Hover'da ortak kural devralıyor ve TAM OPAK siyaha dönüyor, yani geri
 *     bildirim zayıflamıyor, tersine güçleniyor.
 *   • Ok kenara YAPIŞMIYOR: Woolentor hover'da okları `left/right:0`a, yani
 *     görselin tam kenarına dayıyordu → 12px içeri alındı.
 * 🚨 Ezilen kural `…woolentor-learg-img.slick-slider:hover .slick-arrow.woolentor-slick-large-prev`
 * (5 sınıf, woolentor-widgets-pro.css) — seçiciyi kısaltma, altına düşer.
 * ⚠️ Zemin kuralı bilerek hover kuralından DAHA AZ spesifik (5 sınıf vs 6):
 * dosyada ondan sonra gelse de hover'ı ezmiyor. */
body.single-product .wlpro-product-thumbnails.thumbnails-layout-tabslider .woolentor-learg-img .slick-arrow {
    background-color: rgba(233, 233, 233, 0.72);
}
body.single-product .wlpro-product-thumbnails.thumbnails-layout-tabslider .woolentor-learg-img.slick-slider:hover .slick-arrow.woolentor-slick-large-prev {
    left: 12px;
}
body.single-product .wlpro-product-thumbnails.thumbnails-layout-tabslider .woolentor-learg-img.slick-slider:hover .slick-arrow.woolentor-slick-large-next {
    right: 12px;
}

/* ── Ortak glyph kabı ──
 * Sayfadaki okta glyph Woolentor'un `<i>`sinde, lightbox'ta lightGallery'nin
 * pseudo'sunda duruyor. İkisini de aynı 22×22 maske yüzeyine çeviriyoruz.
 * ⚠️ lightGallery glyph'i İKİ BUTONDA FARKLI PSEUDO'da tutuyor:
 *     .lg-prev:after  { content:"\e094" }   (geri)
 *     .lg-next:before { content:"\e095" }   (ileri)
 * Bunu bilmeden ikisini de `::after`tan ezersek ileri butonu ÇİFT ok basar —
 * lg'nin kendi dolu oku `::before`da kalır. (Bir kez yaşandı, render'la
 * yakalandı.) Bu yüzden her butonda ONUN kullandığı pseudo giydiriliyor,
 * diğeri `content:none` ile kapatılıyor. */
body.single-product .wlpro-product-thumbnails.thumbnails-layout-tabslider .woolentor-learg-img .slick-arrow i,
body.single-product .lg-outer .lg-actions .lg-prev::after,
body.single-product .lg-outer .lg-actions .lg-next::before {
    content: "";
    display: block;
    width: 22px;
    height: 22px;
    /* `sli`/`lg` fontundan gelen eski glyph'i susturur; maske onun yerine geçer. */
    font-size: 0;
    line-height: 0;
    background-color: currentColor;
    -webkit-mask-repeat: no-repeat;
            mask-repeat: no-repeat;
    -webkit-mask-position: center;
            mask-position: center;
    -webkit-mask-size: 22px 22px;
            mask-size: 22px 22px;
}
body.single-product .lg-outer .lg-actions .lg-prev::before,
body.single-product .lg-outer .lg-actions .lg-next::after {
    content: none;
}

/* ── Chevron yolları (Elementor `eicon-chevron-left` / `-right`, birebir) ── */
body.single-product .wlpro-product-thumbnails.thumbnails-layout-tabslider .woolentor-learg-img .slick-arrow.woolentor-slick-large-prev i,
body.single-product .lg-outer .lg-actions .lg-prev::after {
    -webkit-mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201000%201000'%3E%3Cpath%20d='M646%20125C629%20125%20613%20133%20604%20142L308%20442C296%20454%20292%20471%20292%20487%20292%20504%20296%20521%20308%20533L604%20854C617%20867%20629%20875%20646%20875%20663%20875%20679%20871%20692%20858%20704%20846%20713%20829%20713%20812%20713%20796%20708%20779%20692%20767L438%20487%20692%20225C700%20217%20708%20204%20708%20187%20708%20171%20704%20154%20692%20142%20675%20129%20663%20125%20646%20125Z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201000%201000'%3E%3Cpath%20d='M646%20125C629%20125%20613%20133%20604%20142L308%20442C296%20454%20292%20471%20292%20487%20292%20504%20296%20521%20308%20533L604%20854C617%20867%20629%20875%20646%20875%20663%20875%20679%20871%20692%20858%20704%20846%20713%20829%20713%20812%20713%20796%20708%20779%20692%20767L438%20487%20692%20225C700%20217%20708%20204%20708%20187%20708%20171%20704%20154%20692%20142%20675%20129%20663%20125%20646%20125Z'/%3E%3C/svg%3E");
}
body.single-product .wlpro-product-thumbnails.thumbnails-layout-tabslider .woolentor-learg-img .slick-arrow.woolentor-slick-large-next i,
body.single-product .lg-outer .lg-actions .lg-next::before {
    -webkit-mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201000%201000'%3E%3Cpath%20d='M696%20533C708%20521%20713%20504%20713%20487%20713%20471%20708%20454%20696%20446L400%20146C388%20133%20375%20125%20354%20125%20338%20125%20325%20129%20313%20142%20300%20154%20292%20171%20292%20187%20292%20204%20296%20221%20308%20233L563%20492%20304%20771C292%20783%20288%20800%20288%20817%20288%20833%20296%20850%20308%20863%20321%20871%20338%20875%20354%20875%20371%20875%20388%20867%20400%20854L696%20533Z'/%3E%3C/svg%3E");
            mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201000%201000'%3E%3Cpath%20d='M696%20533C708%20521%20713%20504%20713%20487%20713%20471%20708%20454%20696%20446L400%20146C388%20133%20375%20125%20354%20125%20338%20125%20325%20129%20313%20142%20300%20154%20292%20171%20292%20187%20292%20204%20296%20221%20308%20233L563%20492%20304%20771C292%20783%20288%20800%20288%20817%20288%20833%20296%20850%20308%20863%20321%20871%20338%20875%20354%20875%20371%20875%20388%20867%20400%20854L696%20533Z'/%3E%3C/svg%3E");
}

/* ── Yalnız lightbox: kartın DIŞINDA konumlanma ──
 * Konum `.lg`'ye göre absolute (o position:relative), negatif offset ile dışarı
 * taşıyor; kırpılmamalarını sağlayan şey yukarıdaki "overflow bir seviye
 * içeride" düzeni.
 *
 * ⭐ MESAFE TEK YERDEN: kart ile ok arasındaki açıklık. Kartın iki yanındaki
 * boşluk = `max(4vw, (100vw - 66vh) / 2)` — kart genişlik sınırlıysa (dar/uzun
 * ekran) 4vw, yükseklik sınırlıysa kalan payın yarısı. İstenen 58px'i o boşlukla
 * `min()`liyoruz: geniş ekranda tam 58px dışarı çıkıyor, boşluk daralınca ok
 * kendiliğinden içeri kayıyor ve EKRAN DIŞINA ASLA taşmıyor. Bu yüzden ayrı bir
 * media query YOK. (İlk satırlar `min()` bilmeyen tarayıcı için taban.) */
body.single-product .lg-outer .lg-actions .lg-prev,
body.single-product .lg-outer .lg-actions .lg-next {
    position: absolute;
    top: 50%;
    /* -21px = 42px'lik kutunun yarısı; kutu ölçüsü değişirse BU DA değişmeli. */
    margin-top: -21px;
}
body.single-product .lg-outer .lg-actions .lg-prev {
    left: -58px;
    left: calc(-1 * min(58px, max(4vw, (100vw - 66vh) / 2)));
}
body.single-product .lg-outer .lg-actions .lg-next {
    right: -58px;
    right: calc(-1 * min(58px, max(4vw, (100vw - 66vh) / 2)));
}

/* Arka karartma daha saydam (operatör, 28 Tem). Tek değer: alfa.
 * `opacity` ile DEĞİL renkle ayarlıyoruz — lightGallery açılış/kapanış geçişini
 * `opacity`ye bağlamış (`.lg-backdrop.in{opacity:1}`), oraya karışsak fade'i de
 * bozardık. */
body.single-product .lg-backdrop {
    background-color: rgba(0, 0, 0, 0.7);
}

/* Fotoğraf değişiminde efekt YOK — ne kayma ne solma (operatör, 28 Tem).
 *
 * lightGallery solmayı ÜÇ ayrı yerden veriyor: slayt öğesinin kendi
 * `transform 1s / opacity .1s` geçişi, `lg-show-after-load`un görseli 0.15s
 * içinde belirtmesi ve zoomable görselin `!important`lı geçişi. Üçü de burada
 * kapatılıyor; seçiciler bilerek uzun, çünkü **lightgallery.min.css bizden SONRA
 * yükleniyor** → eşit özgüllükte O kazanır, illa daha spesifik olmalıyız.
 *
 * ⚠️ Aynı bildirimler açılıştaki zoom animasyonunu da besliyordu; artık popup da
 * anında beliriyor (karartmanın kendi 0.15s fade'i duruyor). Kayma geri istenirse
 * bu bloğu kaldırmak yeter.
 *
 * 🔑 Görsel anında değişiyor ama lightGallery `speed` ms boyunca yeni tıklamayı
 * yok sayıyor (lgBusy) — o bekleme artık ölü zaman olurdu, bu yüzden gallery.js
 * açılışta örneğin `speed`ini 0'a çekiyor. İkisi birlikte çalışır. */
body.single-product .lg-outer .lg-inner,
body.single-product .lg-outer.lg-css3 .lg-item,
body.single-product .lg-outer.lg-css3 .lg-item.lg-current,
body.single-product .lg-outer.lg-css3 .lg-item.lg-prev-slide,
body.single-product .lg-outer.lg-css3 .lg-item.lg-next-slide,
body.single-product .lg-outer.lg-start-zoom .lg-item .lg-object,
body.single-product .lg-outer.lg-show-after-load .lg-item .lg-object,
body.single-product .lg-outer .lg-item.lg-complete.lg-zoomable .lg-image {
    transition: none !important;
}

/* ⚠️ Bu media query bölümün EN SONUNDA duruyor. Ezdiği kurallar (ok konumu,
 * kart ölçüsü, görsel oturması) onunla AYNI özgüllükte; eşitlikte kaynak sırası
 * karar verdiği için blok yukarı taşınırsa sessizce etkisiz kalır — bir kez
 * yaşandı, oklar telefonda ekran dışında kaldı. */
/* ───────────────────────────────────────────────────────────────────────────
 *  MOBİLDE TAM EKRAN (operatör, 28 Tem)
 *
 *  Telefonda 3:4 kart 92vw × 122vw kadar yer kaplıyordu — 844px'lik bir ekranda
 *  ~478px, altı üstü boş. Orada kart ekranın TAMAMI oluyor.
 *
 *  🔑 Oran zorlaması da kalkıyor: 3:4 bir çerçeveyi 0.46 oranındaki telefon
 *  ekranına `cover` ile bastırmak fotoğrafın ince bir dilimini gösterirdi.
 *  Mobil büyütmenin işi fotoğrafın TAMAMINI göstermek → `contain`. Sayfadaki
 *  galeri 3:4 kalmaya devam ediyor, değişen yalnız büyütülmüş görünüm.
 *
 *  Oklar: üstteki `min(58px, boşluk)` hesabı kart = min(92vw,66vh) varsayar;
 *  kart 100vw olunca boşluk sıfırlanır ve oklar ekran dışına düşerdi → burada
 *  sabit iç değere alınıyorlar. Kapatma da beyaza dönüyor: `contain` letterbox'ı
 *  koyu, siyah cross orada görünmezdi. */
@media (max-width: 767px) {
    body.single-product .lg-outer .lg {
        width: 100vw !important;
        height: 100vh !important;
        height: 100dvh !important;
    }
    body.single-product .lg-outer .lg-inner {
        border-radius: 0;
    }
    body.single-product .lg-outer .lg-image {
        object-fit: contain;
    }
    body.single-product .lg-outer .lg-actions .lg-prev {
        left: 4px;
    }
    body.single-product .lg-outer .lg-actions .lg-next {
        right: 4px;
    }
    body.single-product .lg-outer .lg-toolbar .lg-close {
        color: #ffffff;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
 *  VARYASYON HESAPLANIRKEN — perde yerine hedefli geri bildirim
 *  (27 Tem 2026, v2.122.0 · operatör kararı)
 *
 *  #643 gibi varyasyon sayısı eşiği (30) aşan ürünlerde WooCommerce varyasyonları
 *  sayfaya gömmüyor; her TAM seçimde `?wc-ajax=get_variation`'a gidiyor ve
 *  beklerken formun tamamını jQuery blockUI ile örtüyor
 *  (`overlayCSS:{background:'#fff', opacity:.6}` — add-to-cart-variation.js:274).
 *  Ölçüldü: 100 varyasyon, tur başına ~0,6 sn.
 *
 *  Operatör o beyaz perdeyi istemiyor: sayfayı devre dışı gibi gösteriyor, oysa
 *  değişen tek şey fiyat. Yerine iki hedefli işaret kondu — Tutar satırında
 *  "Hesaplanıyor", tıklanan swatch'ta accent renginde animasyonlu halka.
 *  Zamanlama ve 180 ms gecikme JS tarafında (frontend.js::initCalcIndicator).
 *
 *  ⚠️ BEKLEME KALDIRILMADI, yalnız görünümü değişti. Beklemeyi tamamen yok etmek
 *  `woocommerce_ajax_variation_threshold`'u 100'ün üstüne çekmekle mümkün
 *  (varyasyonlar sayfaya gömülür, eşleştirme tarayıcıda anında olur); ölçüm:
 *  sayfa üretimine +0,87 sn, tel üzerinde +2 KB (gzip). Operatör şimdilik
 *  beklemenin kalmasını seçti.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* Perdeyi görünmez kıl — blockUI çalışmaya devam etsin.
 * Kaldırmak yerine GİZLEMEK bilinçli: WooCommerce `block()`/`unblock()` çiftini
 * kendi akışında kullanıyor, araya girmek yerine yalnız çizimini kesiyoruz.
 * Yan fayda: perde tıklamaları da yutuyordu, artık müşteri beklerken başka bir
 * swatch'a basabiliyor — WooCommerce zaten önceki isteği abort ediyor.
 * `form.cart` ile sınırlı: blockUI sepet/ödeme sayfalarında da kullanılıyor. */
form.cart > .blockUI,
form.cart .blockUI.blockOverlay {
    display: none !important;
}

/* ── Tutar: "Hesaplanıyor" ──
 * Metni JS yazıyor (çevrilebilir `calculatingText`). Burada yalnız fiyattan
 * ayrışsın diye ikincil bir görünüm alıyor: fiyat 1.3em/700 iken bu normal
 * ağırlıkta ve muted. */
/* ── Tutar alanında FİYAT DIŞI her metin muted ──
 * İki durum var ve ikisi de bir fiyat değil, bir DURUM bildiriyor:
 *   .ks-vm-summary-incomplete → "Tüm ürün seçeneklerini belirleyin"
 *   .ks-vm-calculating        → "Hesaplanıyor"
 * Fiyatla aynı ağırlıkta/renkte olduklarında satır "bir değer var" gibi
 * okunuyordu; ikisi de normal ağırlık + Muted'a alındı (operatör, 27 Tem 2026).
 *
 * Renk Elementor'un Muted global'inden (#868686) — `--ks-muted` token'ı
 * üzerinden DEĞİL: o token `:root`'ta tanımlı, Elementor global'leri
 * `body.elementor-kit-639`'da, yani token global'i göremeyip sessizce kendi
 * hex yedeğine (#6a6a6a) düşüyordu. Select placeholder'larıyla aynı kaynak,
 * dolayısıyla ikisi her zaman aynı tonda.
 *
 * Gerçek fiyat bu kuralların DIŞINDA: `.ks-vm-summary-complete` durumunda
 * `.woocommerce-Price-amount` kendi 1.3em/700 stilini alıyor. */
.ks-vm-calculating .ks-vm-summary-total-value,
.ks-vm-summary-incomplete .ks-vm-summary-total-value {
    font-weight: 400;
    color: var(--e-global-color-01631af, #868686);
}
/* Üç nokta CSS'le canlanıyor — metnin kendisi sabit kalsın ki çeviri dizgisi
 * "Hesaplanıyor" olarak temiz dursun. `content` animasyonu desteklenmezse
 * hiçbir şey görünmez; metin yine doğru. */
.ks-vm-calculating .ks-vm-summary-total-value::after {
    content: "";
    display: inline-block;
    width: 1.2em;
    text-align: start;
    animation: ks-vm-calc-dots 1.2s steps(1, end) infinite;
}
@keyframes ks-vm-calc-dots {
    0%   { content: ""; }
    25%  { content: "."; }
    50%  { content: ".."; }
    75%  { content: "..."; }
}

/* ── Tıklanan swatch: accent renginde genişleyen halka ──
 * 🔑 `::after` KULLANILIYOR, box-shadow DEĞİL — ölçümle seçildi: swatch'lar kendi
 * kenarlığını `box-shadow: inset 0 0 0 1px #ccc` ile çiziyor, animasyon onu
 * ezerdi. `::after` ise boşta: VillaTheme onu yalnız "show attribute value"
 * açıkken `content: attr(data-attribute_label)` için kullanıyor, bu sitede o
 * ayar KAPALI (ölçüldü: computed content = none). Açılırsa burası çakışır.
 *
 * Swatch zaten `position: relative` + `overflow: visible`, yani halka kutunun
 * dışına taşabiliyor ve düzeni hiç etkilemiyor (inset negatif + pointer-events
 * yok).
 *
 * 🎨 RENK DOĞRUDAN ELEMENTOR'DAN: `--e-global-color-secondary` (Site Ayarları →
 * Renkler → Secondary, şu an #DA6900). `--ks-accent` üzerinden GİTMİYOR çünkü o
 * token `:root`'ta tanımlı, Elementor global'leri ise `body.elementor-kit-639`'da
 * — yani `:root` seviyesinde global görünmüyor ve token sessizce kendi hex
 * yedeğine düşüyor (ölçüldü: html'de boş, body'de #DA6900). Buradaki zincir
 * eleman seviyesinde çözüldüğü için global gerçekten geçerli: operatör Elementor'dan
 * rengi değiştirince halka da değişir. */
.vi-wpvs-option-wrap.ks-vm-calc-pulse::after {
    content: "";
    position: absolute;
    inset: -4px;
    border-radius: inherit;
    border: 2px solid var(--e-global-color-secondary, var(--ks-accent, #da6900));
    pointer-events: none;
    animation: ks-vm-calc-ring 900ms ease-out infinite;
}
@keyframes ks-vm-calc-ring {
    0%   { transform: scale(0.92); opacity: 0.9; }
    100% { transform: scale(1.16); opacity: 0; }
}

/* ── Dropdown'lar (Adet, ürün opsiyonları, swatch'sız varyasyon select'leri) ──
 * Her kontrol KENDİ halkasını oynatır; bir dropdown değiştirildiğinde halka
 * artık Renk swatch'ında değil, değiştirilen dropdown'ın çevresinde çıkar.
 *
 * 🔑 `outline` KULLANILIYOR, box-shadow DEĞİL — ölçümle seçildi: select'in normal
 * hâlinde box-shadow yok AMA ODAKTA `0 0 0 1px #212121` odak halkası var, ve bir
 * select değiştirildikten sonra odakta kalıyor. box-shadow'u animasyona verseydik
 * o odak halkasını 900 ms boyunca silerdik. `outline` ayrı bir katman, ikisi
 * yan yana yaşıyor.
 *
 * `::after` de kullanılamazdı: <select> yerine geçen (replaced) bir eleman,
 * pseudo-element'leri güvenilir biçimde render etmiyor — swatch tarafındaki
 * çözümün burada karşılığı yok.
 *
 * Renk kaynağı swatch halkasıyla aynı: Elementor global'i doğrudan. */
select.ks-vm-calc-pulse {
    outline: 2px solid var(--e-global-color-secondary, var(--ks-accent, #da6900));
    outline-offset: 0;
    animation: ks-vm-calc-ring-select 900ms ease-out infinite;
}
@keyframes ks-vm-calc-ring-select {
    0%   { outline-offset: 0; outline-color: var(--e-global-color-secondary, var(--ks-accent, #da6900)); }
    100% { outline-offset: 7px; outline-color: transparent; }
}

/* Hareket hassasiyeti: halka nabız atmayı bırakır ama SABİT kalır — geri bildirim
 * kaybolmasın, yalnız animasyon dursun. Noktalar da sabitlenir. */
@media (prefers-reduced-motion: reduce) {
    .vi-wpvs-option-wrap.ks-vm-calc-pulse::after {
        animation: none;
        opacity: 0.9;
    }
    select.ks-vm-calc-pulse {
        animation: none;
        outline-offset: 3px;
    }
    .ks-vm-calculating .ks-vm-summary-total-value::after {
        animation: none;
        content: "...";
    }
}


.ks-vm-detached-buttons > .ks-vm-atc-btn,
.ks-vm-detached-buttons > .ks-vm-buy-now-btn {
    /* Tema butonlara `width:100%` veriyor; flex tabanı yüzdeli olduğu için bu
     * artık sonucu değiştirmiyor ama niyeti açık tutmak için sıfırlıyoruz.
     * `min-width:0` şart: varsayılan `auto`, uzun etiketli butonun kendi
     * min-content genişliğinin altına inmesini engelliyor. */
    min-width: 0 !important;
    width: auto !important;
    box-sizing: border-box !important;
}

/* ── Mağaza butonlarının ikon boyutu (operatör: "çok az daha büyütelim") ──
 * İkonlar `1em` çizilir, yani ölçü FONT-SIZE üzerinden verilir — bu dosyadaki
 * yerleşik desen (`.ks-panel-head .ks-vm-icon{font-size:1.25em}`,
 * `.ks-vm-tip .ks-vm-icon{font-size:1.1em}`). Ölçek `.ks-vm-icon-swap`'e
 * uygulanıyor: içindeki iki SVG (regular + hover'da beliren filled) 1em olduğu
 * için ikisi birden aynı anda büyüyor, cross-fade sırasında zıplama olmuyor.
 *
 * 1.15em → 15.2px yerine ~17.5px. Buton yüksekliğine (46px) ve label ağırlığına
 * (600) göre denendi; daha büyüğü label'ı bastırmaya başlıyor.
 *
 * ⚠️ Büyütmek dikey optik hizayı da etkiliyor: Phosphor çizimleri kutularının
 * içinde aşağıda oturduğundan (bkz. yukarıdaki optik merkez bloğu) o sapma
 * boyutla ORANTILI büyüyor. Bu değeri değiştirirseniz -1.15px'lik nudge'ı
 * yeniden ölçün. */
.ks-vm-atc-btn .ks-vm-icon-swap,
.ks-vm-buy-now-btn .ks-vm-icon-swap,
.ks-vm-notify-btn .ks-vm-icon-swap,
.single_add_to_cart_button .ks-vm-icon-swap {
    font-size: 1.15em;
}

/* ═══════════════════════════════════════════════════════════════════════════
 *  SELECT PLACEHOLDER'LARI — "gerçek seçenek" gibi görünmesinler (v2.125.0)
 *
 *  Operatör: "Bir seçenek seçin" vb. satırlar gerçek seçeneklerden farklı,
 *  placeholder gibi yazılsın. Formda İKİ ayrı metin dolaşıyor (ikisi de
 *  `value=""` taşıyor, seçici o yüzden metne değil DEĞERE bakıyor):
 *    • "Bir seçenek seçin"  → KS_VM_Product_Options (Uç Tipi, Form)
 *    • "Bir seçim yapın"    → Adet + WooCommerce'in kendi varyasyon select'leri
 *      (ikisi de WooCommerce'in "Choose an option" dizgisini kullanıyor)
 *
 *  Renk Elementor'un **Muted** global'i (#868686). Doğrudan global'e bağlı,
 *  `--ks-muted` token'ı üzerinden DEĞİL: o token `:root`'ta tanımlı, Elementor
 *  global'leri ise `body.elementor-kit-639`'da — token global'i göremiyor ve
 *  sessizce kendi hex yedeğine düşüyor (bu dosyada daha önce ölçülmüştü).
 * ═══════════════════════════════════════════════════════════════════════════ */

/* 1) KAPALI kutu: seçili olan placeholder ise metin solgun.
 * `:has()` şart — kapalı select'in metni seçili option'dan geliyor ve CSS'in
 * o durumu görmesinin başka yolu yok. Desteklenmeyen bir tarayıcıda kural
 * düşer, kutu normal renginde kalır: bilgi kaybı yok, yalnız vurgu yok. */
form.cart .variations select:has(option[value=""]:checked) {
    color: var(--e-global-color-01631af, #868686);
}

/* 2) AÇIK listede placeholder satırı.
 * ⚠️ Native `<option>` renklendirmesi platforma bağlı: Windows/Linux Chrome ve
 * Firefox uyguluyor, macOS'ta sistem çizimi bunu yok sayabiliyor. Masaüstünde
 * Adet ve ürün opsiyonları zaten adet-dropdown.js'in KENDİ panelini açıyor ve o
 * panel placeholder'ı hiç basmıyor — yani bu kuralın asıl işi, panelin devreye
 * girmediği yerler (dokunmatik cihazlar, swatch'sız varyasyon select'leri). */
form.cart .variations select option[value=""] {
    color: var(--e-global-color-01631af, #868686);
}

/* 3) Gerçek seçenekler DAİMA normal metin renginde.
 * Gerekli: (1) numaralı kural select'in `color`'ını solgunlaştırdığında bazı
 * tarayıcılar açılan listedeki TÜM option'ları o rengi miras alarak çiziyor —
 * o zaman placeholder ile gerçek seçenekler yine ayrışmaz olurdu. */
form.cart .variations select option:not([value=""]) {
    color: var(--e-global-color-text, #000000);
}

/* Ürün İndirimleri: uygulanan kademenin imi. Satır .is-active olunca (frontend.js
 * markVolumeRow, seçilen adet/miktara göre) oranın yanında accent renkli dolu
 * check-circle belirir. */
.ks-vd-save .ks-vd-check {
    display: none;
    margin-left: 5px;
    font-size: 1.1em;
    vertical-align: -0.18em;
    color: var(--e-global-color-secondary, #DA6900);
}
.ks-vd-row.is-active .ks-vd-check {
    display: inline-block;
}

/* ═══════════════════════════════════════════════════════════════════════════
 *  KS PAYMENTS — [ks_payment_methods] ÖDEME YÖNTEMLERİ PANELİ
 *
 *  Kutu/başlık/ikon yukarıdaki ortak "KS PANEL" kabuğundan gelir; burada yalnız
 *  bloğun kendi satırları ve taksit alanı vardır. Satır dili teslimat paneliyle
 *  aynı ritimde tutuldu (8px dikey boşluk + #f0f0f0 ayraç).
 * ═══════════════════════════════════════════════════════════════════════════ */
.ks-vm-pay-rows {
    display: flex;
    flex-direction: column;
    gap: 8px;
}
.ks-vm-pay-row {
    font-size: .95em;
}
.ks-vm-pay-row + .ks-vm-pay-row {
    padding-top: 8px;
    border-top: 1px solid #f0f0f0;
}
.ks-vm-pay-name {
    display: flex;
    align-items: center;
    font-weight: 600;
}
/* ── Havale/EFT satırı ──
 * İlk satır: yöntem adı solda, indirim oranı SAĞDA — "Ürün İndirimleri"
 * tablosundaki değer muamelesinin aynısı (düz metin, vurgu yok, nowrap).
 * Altında tek cümle: indirim varsa indirimli fiyatı da söyleyen çevrili metin
 * (payments.js seçime göre günceller), yoksa yalın "havale ile alabilirsiniz". */
.ks-vm-pay-line {
    display: flex;
    justify-content: space-between;
    align-items: baseline;
    gap: 12px;
}
/* Rozet görünümü .ks-vm-summary-badge'den (Tutar bloğundaki Merchant indirimi
 * rozetiyle AYNI sınıf) gelir; burada yalnız satır içi ölçek ve konum var. */
.ks-vm-pay-disc-rate {
    flex: 0 0 auto;
    font-size: .95em;
    white-space: nowrap;
}
.ks-vm-pay-disc-rate[hidden] {
    display: none;
}
/* Cümlelerin stili small.ks-vm-delivery-note'tan (kargo notlarıyla aynı
 * sarmalayıcı) gelir; .ks-vm-pay-sentence yalnız payments.js'in tutamağı.
 * Kargo panelinde o kural flex satırın içinde %100 taban alır; burada satır
 * flex değil, small inline kalır ve peşindeki taksit toggle'ı cümleye
 * yapışırdı — panel içinde blok olması bundan. */
.ks-vm-pay-row .ks-vm-delivery-note {
    display: block;
    padding-left: 0;
}
/* İçindeki oran ve indirimli fiyat vurgulu: kalın + accent. */
.ks-vm-pay-row strong.ks-vm-pay-em {
    font-weight: 700;
    color: var(--e-global-color-secondary, #DA6900);
}
/* İndirimli tutar cümlenin can alıcı kısmı — orandan bir gömlek büyük. */
.ks-vm-pay-row strong.ks-vm-pay-em--price {
    font-size: 1.2em;
    letter-spacing: 0;
}

.ks-vm-pay-note {
    display: block;
    margin: 2px 0 0;
    color: var(--e-global-color-01631af, #868686);
}

.ks-vm-pay-sentence {
    padding-top: 8px;
}
/* ── Taksit popup açıcısı ──
 * Bir buton ama satır içinde bir bağlantı gibi durur: kutu yok, alt çizgi yok,
 * yalnız vurgu rengi. Tıklanınca içerik POPUP'ta açılır (29 Tem). */
.ks-vm-inst-toggle {
    display: inline-flex;
    align-items: center;
    margin: 6px 0 0;
    padding: 0;
    border: 0;
    background: none;
    box-shadow: none;
    font: inherit;
    font-size: .95em;
    font-weight: 600;
    color: var(--e-global-color-secondary, #DA6900);
    cursor: pointer;
}
.ks-vm-inst-toggle:hover,
.ks-vm-inst-toggle:focus {
    background: none;
    color: var(--e-global-color-secondary, #DA6900);
    text-decoration: underline;
}

/* ── Taksit popup'ı ──
 * Karartma galerinin lightbox'ıyla aynı (.7); kart beyaz, köşeleri panelden bir
 * tık yumuşak, içerik taşarsa kendi içinde kayar. Kapatma = çizilmiş cross
 * (glyph değil), galeri lightbox kapatmasıyla aynı dil. */
.ks-vm-inst-modal {
    position: fixed;
    inset: 0;
    z-index: 99999;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 16px;
}
.ks-vm-inst-modal[hidden] {
    display: none;
}
.ks-vm-inst-modal-backdrop {
    position: absolute;
    inset: 0;
    background: rgba(0, 0, 0, .7);
}
.ks-vm-inst-modal-card {
    position: relative;
    /* Panel kabuğu .9em × satır .95em küçültür; popup panelin İÇİNDE durduğu
     * için başlık/tablolar da minicik kalıyordu. Kart kendi tabanına döner. */
    font-size: 1rem;
    width: min(460px, 100%);
    max-height: min(80vh, 640px);
    overflow: auto;
    background: #fff;
    border-radius: 12px;
    padding: 18px 20px 20px;
    box-shadow: 0 10px 40px rgba(0, 0, 0, .25);
}
.ks-vm-inst-modal-title {
    font-weight: 700;
    font-size: 1.3em;
    margin: 0 30px 14px 0;
    line-height: 1.3;
}
.ks-vm-inst-modal-close {
    position: absolute;
    top: 16px;
    right: 16px;
    width: 22px;
    height: 22px;
    padding: 0;
    border: 0;
    background: none;
    box-shadow: none;
    cursor: pointer;
    opacity: .5;
}
.ks-vm-inst-modal-close:hover,
.ks-vm-inst-modal-close:focus {
    background: none;
    opacity: 1;
}
.ks-vm-inst-modal-close::before,
.ks-vm-inst-modal-close::after {
    content: '';
    position: absolute;
    top: 50%;
    left: 0;
    width: 22px;
    height: 1.8px;
    background: var(--e-global-color-primary, #222);
}
.ks-vm-inst-modal-close::before { transform: rotate(45deg); }
.ks-vm-inst-modal-close::after  { transform: rotate(-45deg); }

body.ks-vm-inst-modal-open {
    overflow: hidden;
}

/* ── Taksit alanı (popup kartının içinde) ── */
.ks-vm-inst {
    margin: 0;
}

/* Kart ailesi sekmeleri: yatay şerit, taşarsa kendi içinde kayar. */
.ks-vm-inst-tabs {
    display: flex;
    gap: 8px;
    flex-wrap: nowrap;
    overflow-x: auto;
    padding-bottom: 2px;
    margin-bottom: 6px;
}
/* Konturlu diller ciliz duruyordu (operatör, 29 Tem) — dolgulu segmentler:
 * pasif açık gri zemin, aktif accent zemin + beyaz metin (+%3 rozetinin dili). */
.ks-vm-inst-tab {
    flex: 0 0 auto;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 72px;
    height: 34px;
    padding: 0 14px;
    border: 0;
    border-radius: 8px;
    background: #f2f2f2;
    box-shadow: none;
    font: inherit;
    font-size: .88em;
    font-weight: 600;
    color: var(--e-global-color-01631af, #868686);
    cursor: pointer;
    transition: background .12s ease, color .12s ease;
}
.ks-vm-inst-tab:hover,
.ks-vm-inst-tab:focus {
    background: #e8e8e8;
    color: var(--e-global-color-text, #000);
}
.ks-vm-inst-tab.is-active,
.ks-vm-inst-tab.is-active:hover,
.ks-vm-inst-tab.is-active:focus {
    background: var(--e-global-color-secondary, #DA6900);
    color: #fff;
}
.ks-vm-inst-tab img {
    max-height: 20px;
    max-width: 56px;
    object-fit: contain;
    display: block;
}
/* Logolu sekme: renkli marka logosu accent zeminde boğulur — aktifken beyaz
 * zemin + accent çerçeve. */
.ks-vm-inst-tab.has-logo.is-active,
.ks-vm-inst-tab.has-logo.is-active:hover,
.ks-vm-inst-tab.has-logo.is-active:focus {
    background: #fff;
    box-shadow: inset 0 0 0 2px var(--e-global-color-secondary, #DA6900);
}

/* Taksit tabloları: yalnız aktif aile görünür. Popup içinde okunaklı bir
 * "rapor" düzeni: kolon başlıkları (Taksit/Aylık/Toplam) + zebra satırlar.
 * Satır ayraç çizgileri yok — zebra ve başlık alt çizgisi yeterli, ikisi
 * birden kalabalık ediyordu. */
.ks-vm-inst-table {
    display: none;
    width: 100%;
    border-collapse: collapse;
    margin: 0;
    font-size: .95em;
}
.ks-vm-inst-table.is-active {
    display: table;
}
.ks-vm-inst-table thead th {
    padding: 12px 10px 9px;
    border: 0;
    border-bottom: 1px solid var(--e-global-color-dcb0b6a, #e5e5e5);
    background: transparent;
    font-size: .76em;
    font-weight: 600;
    letter-spacing: .07em;
    text-transform: uppercase;
    color: var(--e-global-color-01631af, #868686);
    text-align: right;
    white-space: nowrap;
}
.ks-vm-inst-table thead th.ks-vm-inst-n {
    text-align: left;
    padding-left: 10px;
}
.ks-vm-inst-table td {
    padding: 9px 10px;
    border: 0;
    background: transparent;
    vertical-align: baseline;
}
/* Zebra: çift satırlar hafif zeminli; şeridin köşeleri yumuşak ki kartın
 * beyazında yüzen bloklar gibi değil, tek parça bir liste gibi okunsun. */
.ks-vm-inst-table tbody tr:nth-child(even) td {
    background: #f7f7f7;
}
.ks-vm-inst-table tbody tr:nth-child(even) td:first-child {
    border-radius: 6px 0 0 6px;
}
.ks-vm-inst-table tbody tr:nth-child(even) td:last-child {
    border-radius: 0 6px 6px 0;
}
.ks-vm-inst-n {
    font-weight: 600;
    white-space: nowrap;
}
.ks-vm-inst-monthly {
    text-align: right;
    white-space: nowrap;
    color: var(--e-global-color-01631af, #868686);
}
.ks-vm-inst-total {
    text-align: right;
    white-space: nowrap;
    font-weight: 600;
    width: 1%;
}
.ks-vm-inst-zero {
    display: inline-block;
    margin-left: 6px;
    padding: 1px 6px;
    border-radius: 999px;
    background: color-mix(in srgb, var(--e-global-color-secondary, #DA6900) 12%, #fff);
    color: var(--e-global-color-secondary, #DA6900);
    font-size: .78em;
    font-weight: 600;
    white-space: nowrap;
}

/* Fiyat oluşana kadar (varyasyon/adet seçilmemiş) tablolar değil, tek satırlık
 * yönlendirme görünür. payments.js toplam > 0 olunca panele
 * .ks-vm-inst-has-total sınıfını koyar. */
.ks-vm-inst-pending {
    margin: 0;
    color: var(--e-global-color-01631af, #868686);
    font-size: .9em;
}
.ks-vm-payments.ks-vm-inst-has-total .ks-vm-inst-pending {
    display: none;
}
.ks-vm-payments:not(.ks-vm-inst-has-total) .ks-vm-inst-tabs,
.ks-vm-payments:not(.ks-vm-inst-has-total) .ks-vm-inst-table {
    display: none;
}

/* ═══════════════════════════════════════════════════════════════════════════
 *  KS HIGHLIGHTS — [ks_product_highlights] ÖNE ÇIKAN ÖZELLİK KARTLARI
 *
 *  Operatörün Elementor mockup'ının (29 Tem) kod karşılığı: kenarlıklı kutu,
 *  solda Phosphor ikon (accent), sağda accent başlık + gri açıklama. İki
 *  kolonlu grid; dar ekranda tek kolona düşer.
 * ═══════════════════════════════════════════════════════════════════════════ */
.ks-vm-highlights {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
    gap: 12px;
    margin: 0;
}
.ks-vm-hl-card {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 12px;
    border: 1px solid var(--e-global-color-dcb0b6a, #e5e5e5);
    border-radius: 8px;
    background: transparent;
}
.ks-vm-hl-card > i.ph {
    flex: 0 0 auto;
    font-size: 2em;
    color: var(--e-global-color-secondary, #DA6900);
}
.ks-vm-hl-text {
    display: flex;
    flex-direction: column;
    gap: 2px;
    min-width: 0;
}
.ks-vm-hl-title {
    font-weight: 700;
    font-size: .9em;
    color: var(--e-global-color-secondary, #DA6900);
    line-height: 1.3em;
}
.ks-vm-hl-desc {
    font-size: .8em;
    line-height: 1.3em;
    color: var(--e-global-color-01631af, #868686);
}

/* ═══════════════════════════════════════════════════════════════════════════
 *  ⭐⭐ ROZET AYAR KUTUSU — İKİ BAĞLAMIN TEK KAYNAĞI (v2.301.0, operatör)
 *
 *  Operatör: "ikisi için de tek bir stil kaynağı kullanacağız, yüzde olarak
 *  ufaltılmışı loop içindeki görsellerde görünecek."
 *
 *  Aşağıdaki İKİ değer rozetlerin TAMAMINI yönetir:
 *
 *    --ks-hl-badge-size   → ürün sayfasındaki rozetin puntosu. Kutunun her
 *                           ölçüsü (yükseklik 2.6em, iç dolgu .85em, ikon
 *                           1.7em, köşe .45em, gölge, rozetler arası boşluk)
 *                           bu değerin em'i olarak yazılıdır → tek sayıyı
 *                           değiştirmek rozeti orantısını bozmadan büyütür.
 *    --ks-hl-badge-loop   → loop kartındaki rozet BU ORANDA küçülür (.875 =
 *                           %87,5). Kartta ayrı bir punto YAZILI DEĞİL, buradan
 *                           hesaplanır — yani ilk değeri değiştirince kart da
 *                           kendiliğinden izler.
 *
 *  🚨 Rozet kurallarına px ölçü EKLEME (ne burada ne ks-loop-card.css'te).
 *  Yazılan her px, ikinci bağlamda elle eşlenmesi gereken bir borçtur; iki
 *  bağlamın "iç dolgusu bile farklı" hâli tam olarak böyle doğmuştu.
 *
 *  ℹ️ Bu dosyada normalde var() katmanı kurmuyoruz (operatör tercihi: düz,
 *  scope'lu kurallar). Buradaki iki değişken bilinçli istisna: "loop = ürün
 *  sayfasının yüzdesi" ilişkisini CSS'te kurmanın başka yolu yok — yüzdeli
 *  font-size EBEVEYNE göre hesaplanır, rozetin taban puntosuna göre değil.
 * ═══════════════════════════════════════════════════════════════════════════ */
:root {
    --ks-hl-badge-size: 12px;
    --ks-hl-badge-loop: .875;
}

/* ───────────────────────────────────────────────────────────────────────────
 *  GÖRSEL ÜSTÜ BADGE'LER (17 Ağu 2026, v2.294.0 · operatör kararı)
 *
 *  Kartlar panelden kalktı, ürün fotoğrafının SOL ÜSTÜNE kapsül olarak
 *  biniyor. Katmanı `assets/js/highlights-badges.js` büyük görsel çerçevesinin
 *  (`.woolentor-learg-img`) içine taşıyor; o kutu `position:relative` +
 *  `overflow:hidden` + radius taşıdığı için ofsetler DOĞRUDAN fotoğrafın
 *  kutusuna göredir ve köşelerden taşma olmaz — thumbnail şeridi taşınsa,
 *  ekran boyu değişse de yerleşim bozulmaz.
 *
 *  🚨 İndirim etiketi (`span.onsale`, canlıda ölçüldü: 20px içeriden, 80×32,
 *  z-index 11) aynı köşede oturuyor ve YALNIZ indirimli üründe var. JS o
 *  durumda `--below-sale` sınıfını takıyor, yığın da etiketin altından
 *  başlıyor. z-index 5: slaytların üstünde, indirim etiketinin altında.
 * ─────────────────────────────────────────────────────────────────────────── */
.ks-vm-hl-badges {
    position: absolute;
    top: 20px;
    left: 20px;
    /* Zoom merceğinin (4) ÜSTÜNDE: imleç büyütme alanını rozetlerin üzerinden
     * geçirdiğinde rozetler okunur kalır (operatör, 17 Ağu). İndirim etiketi
     * (11) yine en üstte. */
    z-index: 7;
    display: flex;
    flex-direction: column;
    align-items: flex-start;
    /* ⭐ Ölçek: yukarıdaki AYAR KUTUSU. Rozetin içindeki her ölçü bunun em'i
     * olduğu için tek sayı hepsini birden büyütür/küçültür. */
    font-size: var(--ks-hl-badge-size, 12px);
    gap: .5em;
    /* Fotoğrafın ortasına doğru büyümesin: en fazla çerçevenin ~%75'i. */
    max-width: calc(100% - 40px);
    pointer-events: none; /* Görsele tıklama = lightbox; badge onu yutmasın. */
    /* Geçiş BURADA (hover kuralında değil): yalnız hover'da tanımlansa
     * solma animasyonlu, geri dönüş ANİ olurdu. */
    transition: opacity .15s ease;
}
.ks-vm-hl-badges[hidden] {
    display: none;
}
/* WooCommerce'in koyu "SALE!" kutusu galeride GİZLİ: indirim artık rozet
 * yığınının en üstünde yüzdesiyle duruyor (operatör kararı). Yalnız bu
 * galeriye scope'lu — mağaza/karusel kartlarındaki onsale etiketi yerinde. */
.wlpro-product-thumbnails span.onsale {
    display: none;
}
/* İndirimli üründe SALE etiketinin (32px) altından başla. */
.ks-vm-hl-badges--below-sale {
    top: 60px;
}

.ks-vm-hl-badge {
    display: inline-flex;
    align-items: center;
    gap: .5em;
    max-width: 100%;
    /* 🚨 TÜM ÖLÇÜLER `em` — yani katmanın puntosunun katı. Rozeti başka bir
     * bağlamda küçültmek için tek yapılacak şey katmana yeni bir punto
     * vermektir; oranlar (dolgu/yükseklik/ikon) kendiliğinden korunur.
     * PX YAZMA — yazılan her px, ikinci bağlamda elle eşlenmesi gereken bir
     * borç demektir (loop kartında bir tur yaşandı).
     * 🚨 TÜM ROZETLER AYNI YÜKSEKLİKTE (operatör): yalnız renkleri farklılaşır.
     * Yükseklik sabit + tek satır; uzun başlık ikinci satıra kaçıp rozeti
     * boylandıramaz (taşarsa üç noktayla kısalır). */
    height: 2.6em;
    padding: 0 .85em;
    white-space: nowrap;
    /* Çerçeveli rozet (kargo) de dahil HEPSİ birebir aynı boyda kalsın diye. */
    box-sizing: border-box;
    /* Kapsül DEĞİL, hafif yuvarlatılmış kutu (operatör, 17 Ağu). */
    border-radius: .45em;
    background: rgba(255, 255, 255, .94);
    box-shadow: 0 .08em .5em rgba(0, 0, 0, .14);
    /* Punto katmandan gelir (ölçek noktası orası). */
    font-size: 1em;
    font-weight: 600;
    line-height: 1.25;
    /* Nötr rozetin yazısı Elementor "Text" globali (operatör) — primary ile
     * bugün aynı değerde (#000) ama anlamı farklı: metin rengi buradan yönetilir. */
    color: var(--e-global-color-text, #212121);
}
/* Seçici `i.ph` DEĞİL sade `i`: indirim rozetinin ikonu DOLU ağırlıkta ve
 * Phosphor'da dolu glyph `ph` yerine `ph-fill` sınıfını taşır (iki sınıfı
 * birlikte vermek font-family/content kurallarını çarpıştırırdı). */
.ks-vm-hl-badge > i {
    flex: 0 0 auto;
    font-size: 1.7em;
    color: var(--e-global-color-secondary, #DA6900);
}
/* ── GLYPH DİKEY DÜZELTMESİ (v2.301.1, operatör: "gift ikonu 1-2px yukarıda") ──
 * 🚨 Phosphor'da glyph'ler em kutusunda ORTALANMIŞ DEĞİL — ikon fontunun geneli
 * değil, TEKİL glyph'ler kayık. Fonttan ölçüldü (assets/phosphor/regular/
 * Phosphor.woff2 · upm 1024 · em ortası 448):
 *     gift        yMin  96  yMax 896  → merkez 496 = +0,047em  YUKARIDA
 *     truck       yMin  64  yMax 736  → merkez 400 = −0,047em  aşağıda
 *     seal-check  yMin   0  yMax 896  → merkez 448 =  0        tam ortada
 * Ekrandan ölçüm de bunu doğruladı (3× render, yoğunluk-ağırlıklı mürekkep
 * merkezi): gift −1,02px, seal-check −0,04px, SVG ikon +0,03px.
 *
 * Bu yüzden düzeltme GLYPH BAZLI — `> i`ye toptan kaydırma yazmak ortada duran
 * komşu ikonları bozar. Değer ikonun KENDİ puntosunun em'i olduğu için ürün
 * sayfası (20,4px) ve loop kartı (17,8px) ölçeklerinde orantılı kalır.
 *
 * ➕ Havuza yeni bir ikon eklenince önce ölç: `ks-tests/glyph-merkez.py`
 * (glyph bbox merkezi ile em ortası farkını em cinsinden basar). Fark ±0,01em'in
 * altındaysa kural YAZMA. */
.ks-vm-hl-badge > i.ph-gift {
    position: relative;
    top: .047em;
}
.ks-vm-hl-badge > i.ph-truck {
    position: relative;
    top: -.047em;
}

/* İndirim rozetinin ikonu satır içi SVG (font indirmesini beklemesin diye).
 * Ölçü font ikonlarıyla AYNI em değeri, rengi `currentColor` üzerinden
 * rozetin yazı renginden gelir. */
.ks-vm-hl-badge > .ks-vm-hl-badge-icon {
    flex: 0 0 auto;
    width: 1.7em;
    height: 1.7em;
    fill: currentColor;
}
/* İndirim rozeti: koyu zemin + beyaz yazı (operatör, 17 Ağu). Yığının EN
 * ÜSTÜNDE durur ve yalnız gerçekten indirim HESAPLANDIĞINDA basılır — metni
 * özet fiyat bloğundaki yüzdeden gelir, adet/seçenek değiştikçe güncellenir
 * (bkz. assets/js/highlights-badges.js). WooCommerce'in kendi koyu "SALE!"
 * kutusu bu yüzden galeride gizlendi: aynı mesajın iki ayrı gösterimi olurdu
 * ve kampanya/toptan indirimlerini zaten kapsamıyordu. */
.ks-vm-hl-badge--discount {
    background: var(--e-global-color-secondary, #F27A1A);
    color: #fff;
}
.ks-vm-hl-badge--discount > i {
    color: #fff;
}

/* Bedava kargo rozeti: beyaz zemin + secondary ikon/yazı + 1px secondary
 * çerçeve (operatör, 17 Ağu son karar). Böylece üç kademe oluşuyor: indirim
 * DOLU turuncu (en güçlü), kargo ÇERÇEVELİ turuncu (orta), diğerleri düz beyaz.
 * 🚨 Çerçeve yüksekliği DEĞİŞTİRMEZ: `box-sizing:border-box` (rozetlerin eşit
 * yükseklik kuralı), yazı rengi zaten base'ten geliyor, ikon da secondary. */
.ks-vm-hl-badge--fs {
    color: var(--e-global-color-secondary, #F27A1A);
    border: 1px solid var(--e-global-color-secondary, #F27A1A);
}
.ks-vm-hl-badge-text {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* ℹ️ Badge'ler hover'da ARTIK SOLMUYOR. Yerinde büyütme yanda panele taşındığı
 * için (17 Ağu, bkz. "MERCEK + YAN PANEL ZOOM" bölümü) fotoğrafın kendisi
 * kapanmıyor; badge'i saklamaya gerek kalmadı — operatörün istediği buydu. */

@media (max-width: 767px) {
    /* Mobilde TABAN değer düşer; loop kartı oranla bağlı olduğu için o da
     * kendiliğinden küçülür (ayrıca bir kural yazılmaz). */
    :root {
        --ks-hl-badge-size: 11px;
    }
    .ks-vm-hl-badges {
        top: 12px;
        left: 12px;
        max-width: calc(100% - 24px);
    }
    .ks-vm-hl-badges--below-sale {
        top: 52px;
    }
}


/* ═══════════════════════════════════════════════════════════════════════════
 *  ÜRÜN PUAN ÖZETİ — [ks_rating_summary] (operatör, 31 Tem)
 *
 *  Tek satır, hepsi yan yana:
 *      [yıldızlar] [puan] | X değerlendirme | X soru - cevap
 *
 *  ⭐ GÖRÜNÜMÜN TEK KAYNAĞI BURASI. PHP tarafında tek bir satır-içi stil var,
 *  o da yıldız maskesinin yüzdesi (= veri, kaç yıldız dolu).
 *
 *  Ayar noktaları:
 *    · parçalar arası boşluk → `.ks-vm-rating-summary { gap }`
 *    · yıldız BOYU           → `.ks-vm-rs-stars { font-size }` (genişlik 5.3em
 *      ile ona bağlı — 🚨 width'e ELLE dokunma, maske bozulur)
 *    · punto/renk            → aşağıdaki parça kuralları
 * ═══════════════════════════════════════════════════════════════════════════ */

.ks-vm-rating-summary {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 2px 6px;
    font-size: 0.875em;
    letter-spacing: 0;
    line-height: 1.2;
    color: var(--e-global-color-text, #54595F);
}

.ks-vm-rating-summary .ks-vm-rs-stars {
    flex: 0 0 auto;
    margin: 0;
    font-size: 1em;
}

/* Dolu yıldızlar accent — yorum alanındaki kararla aynı (tema #FFA441 basıyor,
 * aynı sayfada iki farklı turuncu olurdu). Boş yıldızlar temanın soluk
 * hâlinde kalır (`.star-rating::before`, opacity .25). */
.ks-vm-rating-summary .ks-vm-rs-stars span::before {
    color: var(--e-global-color-secondary, #DA6900);
}

.ks-vm-rs-score {
    font-weight: 700;
}

.ks-vm-rs-sep {
    color: var(--e-global-color-dcb0b6a, #D1D1D1);
}

/* İki cümle ilgili sekmeyi açan bağlantı (product-tabs.js). Bağlantı gibi
 * DURMUYOR: renk/alt çizgi satırın geri kalanıyla aynı, yalnız imleç ve hover
 * tıklanabilir olduğunu söylüyor.
 * 🚨 `:visited` ŞART: Botiga `a:visited{color:#212121}` diye site geneli bir
 * pin basıyor, yalnız temel seçiciyi yazarsak ziyaret edilmiş bağlantı koyu
 * renge kaçıyor (side-cart ve sepet butonlarında birebir yaşandı). */
.ks-vm-rs-reviews,
.ks-vm-rs-questions,
a.ks-vm-rs-reviews:visited,
a.ks-vm-rs-questions:visited {
    color: var(--e-global-color-01631af, #868686);
    text-decoration: none;
}
/* İmleç YALNIZ href yazılmışsa: bağlantıları reviews.js hedef sekmenin
 * slug'ıyla donatıyor; sekme çözülemediyse href hiç yazılmaz ve cümle düz metin
 * olarak kalır — tıklanabilir gibi görünmemeli. */
a.ks-vm-rs-reviews[href],
a.ks-vm-rs-questions[href] {
    cursor: pointer;
}
a.ks-vm-rs-reviews[href]:hover,
a.ks-vm-rs-questions[href]:hover,
a.ks-vm-rs-reviews[href]:focus-visible,
a.ks-vm-rs-questions[href]:focus-visible {
    text-decoration: underline;
    text-underline-offset: 3px;
}

/* Sayılar kalın (operatör, 31 Tem). Kalınlık `<strong>`dan DEĞİL buradan
 * geliyor: bu bloğun tamamı CSS'ten yönetilsin diye markup nötr bir `span`. */
.ks-vm-rs-num {
    font-weight: 700;
}


/* ═══════════════════════════════════════════════════════════════════════════
 *  KS REVIEWS — YORUMLAR ALANI (Botiga "Advanced Reviews" üzerine KS makyajı)
 *
 *  ⭐ TÜM yorum alanı buradan yönetilir: boş durum kutusu, özet kartı + yıldız
 *  dağılım barları, liste satırı (yıldız → maskeli ad + rozet + tarih → başlık
 *  → metin → fotoğraflar → mağaza yanıtı) ve "Yorum Yaz" popup'ı.
 *  30 Tem 2026'da ayrı reviews.css dosyasından buraya taşındı — diğer bütün KS
 *  modülleri (KS PANEL / KS PAYMENTS / KS HIGHLIGHTS) gibi tek stil dosyasında.
 *
 *  Botiga'nın markup'ı olduğu gibi kalır (tema dosyasına yama YOK). Renk dili
 *  sitenin geri kalanıyla aynı: primary (koyu) düğmeler, secondary (#DA6900)
 *  vurgular, dcb0b6a çizgiler, 01631af soluk metin.
 *
 *  🚨 Temanın kuralları sıklıkla 3-4 sınıf derinliğinde VE bizden sonra
 *  yükleniyor; aşağıda `body ...` ile başlayan uzun seçiciler bu yüzden var,
 *  kısaltılırsa sessizce etkisiz kalırlar.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* ── Bölüm ── */
.botiga-adv-reviews {
    margin: 0;
    padding: 4px 0 0;
}

/* ── Üst blok: özet + barlar + buton + sıralama ── */
.botiga-adv-reviews-header {
    border: 1px solid var(--e-global-color-dcb0b6a, #e5e5e5);
    border-radius: 10px;
    padding: 18px 20px;
    margin-bottom: 18px;
}
.botiga-adv-reviews-rating-wrapper {
    display: flex;
    align-items: center;
    gap: 10px;
}
strong.botiga-adv-reviews-rating {
    font-size: 2.1em;
    line-height: 1;
    font-weight: 700;
}
/* Dolu yıldızlar accent olsun: tema #ffa441 basıyor (woocommerce.min.css
 * `.star-rating span::before`) — aynı blokta accent barlarla iki farklı turuncu
 * çıkıyordu. Boş yıldızlar temanın grisinde kalır (`::before` kendi rengini
 * taşır), yalnız dolgu ezilir. */
/* 🚨 `body` ön eki ŞART (31 Tem, ölçümle yakalandı): Customizer'ın ürettiği
 * `custom-styles.css` `.star-rating.botiga-star-rating-style2 span::before`
 * diyor — AYNI özgüllükte (0,2,1) ve bizden SONRA yükleniyor. Özet kartının
 * büyük yıldızları o sınıfı taşıdığı için accent'e HİÇ dönmemişti: kartın
 * yıldızları #FFA441, hemen altındaki liste satırlarının yıldızları accent
 * çıkıyordu (aynı blokta iki turuncu — bu kuralın var oluş sebebinin ta
 * kendisi). Liste satırlarında sorun yoktu, çünkü onlarda style2 sınıfı yok. */
body .botiga-adv-reviews .star-rating span::before,
body .botiga-adv-reviews .botiga-reviews-list-item .star-rating span::before {
    color: var(--e-global-color-secondary, #DA6900);
}
p.botiga-adv-reviews-total {
    margin: 6px 0 0;
    color: var(--e-global-color-01631af, #868686);
    font-size: .95em;
}

/* Yıldız barları: ince, yumuşak köşeli, accent dolgu. */
.botiga-star-rating-bars {
    margin-top: 14px;
}
.botiga-star-rating-bar-item {
    display: flex;
    align-items: center;
    gap: 10px;
    margin: 4px 0;
}
.botiga-star-rating-bar-item p {
    margin: 0;
    font-size: .85em;
    color: var(--e-global-color-01631af, #868686);
    white-space: nowrap;
}
/* ⭐ ETİKET ↔ ÇUBUK MESAFESİ TEK YERDEN: `.botiga-star-rating-bar-item`'ın
 * `gap`'i. Etiketle çubuk arasındaki boşluğu ÜÇ mekanizma birden üretiyordu
 * (ölçüldü: metnin bitişiyle çubuk arası 43px):
 *   ① etiketin `min-width`i metinden geniş (Botiga Pro 55px, metin ~46px),
 *   ② kabın `gap:10px`i,
 *   ③ 🚨 Botiga Pro'nun `.item-bar{margin-left:24px}` kuralı — asıl fazlalık.
 * Artık öğelerin KENDİ marjı yok, boşluk yalnız gap'ten; min-width de metne
 * yaklaştırıldı. min-width TAMAMEN kaldırılamaz: beş etiketin genişliği eşit
 * olmazsa çubuklar farklı x'te başlar, sütun tırtıklı görünür.
 *
 * 🚨 İki kuralın da `body` ön eki + tema ile AYNI zincir derinliği olmak
 * zorunda: botiga-reviews-advanced.css bizden SONRA yükleniyor, eşit
 * özgüllükte o kazanır (eski 2 sınıflı `min-width:64px`imiz sessizce ölüydü). */
body .botiga-star-rating-bars .botiga-star-rating-bar-item {
    gap: 10px;
}
body .botiga-star-rating-bars .botiga-star-rating-bar-item .item-rating {
    min-width: 48px;
}
.botiga-star-rating-bar-item .item-bar {
    flex: 1;
    height: 8px;
    background: #f0f0f0;
    border-radius: 999px;
    overflow: hidden;
}
body .botiga-star-rating-bars .botiga-star-rating-bar-item .item-bar {
    margin-left: 0;
}
/* 🚨 Temanın kuralı 3 sınıf derinliğinde ve barı link rengiyle (siyah)
   dolduruyor: `.botiga-star-rating-bars .…-bar-item .item-bar .item-bar-inner`.
   Aynı derinlik YETMEZ (tema bizden sonra yükleniyor, eşitlikte o kazanır) →
   `body` ön ekiyle bir basamak öne geç. Yıldızlar accent'ken barlar siyahtı. */
body .botiga-star-rating-bars .botiga-star-rating-bar-item .item-bar .item-bar-inner {
    height: 100%;
    background-color: var(--e-global-color-secondary, #DA6900);
    border-radius: 999px;
}

/* ── Çubuklar sekme her açıldığında SIFIRDAN dolar (operatör, 31 Tem) ──
 * Dolumu reviews.js yönetiyor (hedef genişliği saklar, 0'a çeker, kap görünür
 * olunca geri yazar); burada yalnız GEÇİŞ tanımlı.
 *
 * `.ks-vm-bars-anim` sınıfını JS koyar — JS çalışmıyorsa ya da kullanıcı
 * "hareketi azalt" diyorsa geçiş hiç tanımlanmaz ve çubuklar sunucudan gelen
 * genişlikte, animasyonsuz durur (kademeli iyileştirme).
 *
 * Satırlar 60 ms arayla başlar: beş çubuk aynı anda fırlarsa hareket tek bir
 * blok gibi görünüyor, kademeli başlangıç gözü yukarıdan aşağı taşıyor. */
body .botiga-star-rating-bars.ks-vm-bars-anim .botiga-star-rating-bar-item .item-bar .item-bar-inner {
    transition: width 0.8s cubic-bezier(0.22, 0.61, 0.36, 1);
}
body .botiga-star-rating-bars.ks-vm-bars-anim .botiga-star-rating-bar-item:nth-child(2) .item-bar .item-bar-inner {
    transition-delay: 0.06s;
}
body .botiga-star-rating-bars.ks-vm-bars-anim .botiga-star-rating-bar-item:nth-child(3) .item-bar .item-bar-inner {
    transition-delay: 0.12s;
}
body .botiga-star-rating-bars.ks-vm-bars-anim .botiga-star-rating-bar-item:nth-child(4) .item-bar .item-bar-inner {
    transition-delay: 0.18s;
}
body .botiga-star-rating-bars.ks-vm-bars-anim .botiga-star-rating-bar-item:nth-child(5) .item-bar .item-bar-inner {
    transition-delay: 0.24s;
}

/* ⭐ YORUM ALANININ BUTON DİLİ — TEK KAYNAK.
 *
 * "Yorum Yaz" ve "Daha fazla yorum göster" AYNI görünmeli (operatör, 30 Tem):
 * bu yüzden ikisi de ŞU BLOKTAN besleniyor, iki ayrı yerde aynı değerleri
 * tutmuyoruz. Görünümü değiştirmek için burayı değiştirmek yeterli, ikisi
 * birlikte döner — değerleri kopyalasaydık biri değişip diğeri unutulurdu
 * (bir kez oldu: Yorum Yaz outline'a çevrildi, sayfalama butonu dolgulu kaldı).
 *
 * Tek fark GENİŞLİK: Yorum Yaz özet kolonunda tam genişlik (aşağıdaki media
 * query), sayfalama butonu kendi metni kadar ve ortalı.
 *
 * !important: Botiga'nın genel `.button` kuralları (dolgu zemin + beyaz metin)
 * bizden SONRA yükleniyor ve eşit özgüllükte kazanıyordu. */
.botiga-adv-reviews a.button.botiga-adv-review-write-button,
.botiga-adv-reviews a.button.botiga-pagination-button,
/* Soru & Cevap alanı da AYNI buton dilini kullanıyor (operatör, 30 Tem):
 * "Soru Sor" ve "Daha fazla yükle" burada tanımlı. */
.ks-vm-qa a.button.ks-vm-qa-ask,
.ks-vm-qa a.button.ks-vm-qa-more {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    padding: 9px 24px;
    border: 1px solid var(--e-global-color-primary, #212121) !important;
    border-radius: var(--ks-radius-pill, 999px);
    background: transparent !important;
    color: var(--e-global-color-primary, #212121) !important;
    font-size: .9em;
    font-weight: 600;
    letter-spacing: .3px;
    text-transform: capitalize !important;
    text-decoration: none;
    transition: opacity .15s ease;
    margin-bottom: 0 !important;
}
/* 🚨 `:focus` DEĞİL `:focus-visible`. Bunlar `<a>`: fareyle tıklandıktan sonra
 * odak butonda KALIYOR ve `:focus` kuralı yüzünden buton kalıcı olarak
 * "hover" görünümünde takılı kalıyordu (operatör fark etti; ölçüldü: tıklama
 * sonrası zemin siyah + focus=true). `:focus-visible` yalnız KLAVYE odağında
 * eşleşir — erişilebilirlik korunur, fare tıklamasından sonra buton
 * varsayılana döner. */
.botiga-adv-reviews a.button.botiga-adv-review-write-button:hover,
.botiga-adv-reviews a.button.botiga-adv-review-write-button:focus-visible,
.botiga-adv-reviews a.button.botiga-pagination-button:hover,
.botiga-adv-reviews a.button.botiga-pagination-button:focus-visible,
.ks-vm-qa a.button.ks-vm-qa-ask:hover,
.ks-vm-qa a.button.ks-vm-qa-ask:focus-visible,
.ks-vm-qa a.button.ks-vm-qa-more:hover,
.ks-vm-qa a.button.ks-vm-qa-more:focus-visible {
    background: var(--e-global-color-primary, #212121) !important;
    color: #fff !important;
}

/* ── Sıralama dropdown'ı = ÜRÜN FORMUNDAKİ dropdown'ların AYNISI ──
 * (operatör, 30 Tem 2026 · v2.162.0)
 *
 * Kutunun tipografisi/dolgusu/pill hattı ayrı yazılmıyor: seçici, ATC
 * formundaki dropdown bloklarının listesine EKLENDİ (bkz. "td.value select"
 * ve "chevron'a yer açan padding" blokları) — tek kaynak, biri değişince
 * ikisi birden döner.
 *
 * Açılan liste de aynı: `adet-dropdown.js` bu select'i de geliştiriyor →
 * masaüstünde `.ks-vm-adet-panel`, dokunmatikte platformun NATIVE seçicisi.
 *
 * Burada yalnız ATC'de BAĞLAMDAN gelen iki şey var: WooCommerce'in
 * `table.variations td select{min-height:auto}` kuralı (yoksa tema 50px'lik
 * min-height'ı kutuyu 42→51px yapıyor) ve hücrenin genişliği. */
.ks-vm-reviews-toolbar select.botiga-reviews-orderby {
    min-height: auto;
    padding-left: 16px;
    max-width: 200px;
    /* 🚨 Tema bu select'e ÖZEL olarak gri zemin basıyor
     * (`.botiga-reviews-orderby{background-color:#F8F8F8!important}`) — ürün
     * formundaki kardeşleri beyaz. `!important`a `!important` ile yanıt
     * veriliyor; değer temanın KENDİ form değişkeninden, yani operatör form
     * zeminini değiştirirse ikisi birlikte döner. */
    background-color: var(--bt-color-forms-background, #ffffff) !important;
}
/* Kapalı kutu ve açılan panel AYNI genişlikte olmalı: panel `left:0;right:0`
 * ile bu forma (`.ks-vm-adet-host`) bağlanıyor. */
.ks-vm-reviews-toolbar .botiga-reviews-orderby-form {
    width: 200px;
    max-width: 100%;
}

/* ═══════════════════════════════════════════════════════════════════════════
 *  BOŞ DURUM — ORTAK BLOK (yorumlar + soru & cevap)
 * ═══════════════════════════════════════════════════════════════════════════
 * İki sekmenin boş hâli TEK kaynaktan beslenir (operatör, 16 Ağu 2026).
 * Öncesinde aynı değerleri taşıyan İKİ AYRI kopya vardı ve üç yerde
 * ayrışmışlardı (ölçüldü):
 *   · yorum kutusunda temadan gelen gri zemin (#f2f2f2) — soru-cevapta yok;
 *   · yorum kutusunda 50px üst marj — kutu sekmenin altında havada duruyordu;
 *   · soru-cevapta kutunun ÜSTÜNDE ikinci bir "Soru Sor" düğmesi.
 * Artık kutu / ikon / düğme aşağıdaki üç blokta: biri değişince ikisi de
 * değişir.
 *
 * 🚨 Yeni bir boş durum eklerken seçicisini BU LİSTELERE yaz, dördüncü bir
 * kopya çıkarma.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* Kutu.
 * 🚨 Yorum tarafının seçicisi neden bu kadar uzun: Botiga Pro
 * (`botiga-reviews-advanced.min.css`)
 *   `.botiga-adv-reviews .botiga-adv-reviews-body .woocommerce-noreviews { margin-top: 50px }`
 * diyor — üç sınıf (0,3,0). Kısa hâlimiz (0,2,1) bunu YENEMİYOR ve 50px'lik
 * boşluk duruyordu (ölçüldü). Zincire `.botiga-adv-reviews-body` eklenince
 * (0,3,1) oluyor ve marj gerçekten sıfırlanıyor. !important'a gerek yok. */
.ks-vm-qa-empty,
.botiga-adv-reviews .botiga-adv-reviews-body p.woocommerce-noreviews {
    display: flex;
    flex-direction: column;
    align-items: center;
    text-align: center;
    /* Kutu daha ferah (operatör, 16 Ağu, iki turda): 34/38 → 52/56 → 76/80.
       Yükseklik sabit değil, dolgudan geliyor — metin iki satıra düşerse kutu
       kendiliğinden büyür, `min-height` ile kilitlemiyoruz. */
    padding: 76px 16px 80px;
    /* Mesaj metni: 16px → 14,4px. Punto kutuya yazılıyor çünkü yorum
       tarafında metin çıplak bir düğüm (Botiga'nın markup'ında sarmalayıcı
       yok), ayrıca hedeflenemiyor. İkonlar 42px MUTLAK, etkilenmez. */
    font-size: 0.9em;
    /* 🚨 margin: 0 — Woo/tema `.woocommerce-noreviews`a 50px ÜST MARJ veriyor;
       o marj yüzünden yorum kutusu sekme açılınca boşlukta başlıyordu. */
    margin: 0;
    /* 🚨 Zemin ŞEFFAF — temanın gri dolgusu (#f2f2f2) yalnız yorum kutusuna
       geliyordu, iki kutu farklı görünüyordu. */
    background: transparent;
    color: var(--e-global-color-01631af, #868686);
    border: 1px dashed var(--e-global-color-dcb0b6a, #e5e5e5);
    border-radius: 10px;
}

/* İkon — 42px Phosphor konuşma balonu, accent renkte.
   Soru-cevap gerçek bir <i> elemanı basar, yorum tarafında Botiga'nın
   markup'ına dokunamadığımız için ::before ile çiziliyor; `content` bu yüzden
   yalnız ikinci seçicide. */
.ks-vm-qa-empty-icon,
.botiga-adv-reviews p.woocommerce-noreviews::before {
    display: block;
    font-size: 42px;
    line-height: 1;
    margin-bottom: 10px;
    color: var(--e-global-color-secondary, #DA6900);
}
.botiga-adv-reviews p.woocommerce-noreviews::before {
    content: "\e16e"; /* chat-circle-text */
    font-family: "Phosphor" !important;
}

/* Düğme — MESAJIN HEMEN ALTINDA, ortalı (operatör: "buton mesajdan hemen
   sonra olmalı"). */
.ks-vm-qa a.button.ks-vm-qa-ask--empty,
.botiga-adv-reviews p.woocommerce-noreviews a.button.botiga-adv-review-write-button {
    display: flex;
    width: fit-content;
    margin: 16px 0 0;
    /* 🚨 `rem`, `em` DEĞİL: düğmenin kendi punto kuralı 0.9em ve kutuya
       0.9em yazınca ikisi BİLEŞTİ — etiket 14,4px'ten 12,96px'e düşmüştü
       (ölçüldü). rem kökten (16px) okur, yani metin küçülürken düğme eski
       boyunda kalır. Kök punto 16px olarak doğrulandı. */
    font-size: 0.9rem;
}

/* Boş durumda üstteki özet/aksiyon şeridi TAMAMEN gizli — ikisinde de kutunun
   üstünde düğme ya da boşluk kalmaz. */
.botiga-adv-reviews.ks-vm-reviews-empty .botiga-adv-reviews-header,
.ks-vm-qa:has(.ks-vm-qa-empty) .ks-vm-qa-head {
    display: none;
}

/* 🚨 `max-width: 420px` KALDIRILDI (16 Ağu): yalnız soru-cevap metnine
   uygulanıyordu, cümle iki satıra düşüyor ve iki kutu farklı yükseklikte
   duruyordu (248px / 218px). İki boş durum arasındaki tek fark artık metnin
   kendisi ve ikonu. Dar ekranda ikisi de doğal olarak sarar. */
.ks-vm-qa-empty-text {
    display: block;
}

/* ── Yorum listesi ── */
.botiga-reviews-list-item {
    padding: 16px 0;
}
.botiga-reviews-list-item:last-child {
    border-bottom: 0;
}
/* ── Yorum satırının üst bloğu ──
 * 1. satır: yıldızlar (temanın 1.75em'i bu listede fazla iri) · 2. satır:
 * maskeli ad + Doğrulanmış Alıcı + tarih. Tarihi reviews.js buraya taşır. */
/* 🚨 Flex KULLANMA: `.star-rating` sabit genişlikte (5.3em) bir maske kabıdır —
 * dolgu, span'in YÜZDE genişliğiyle kırpılır. Flex item yapıp `flex:0 0 100%`
 * vermek kabı satır boyuna uzattı ve %60'lık dolgu 5 yıldızı da kapladı
 * (3 yıldızlı yorum 5 görünüyordu). Blok akış: yıldız div'i doğal genişliğinde
 * kendi satırında durur, ad/rozet/tarih inline olarak alt satırda dizilir. */
.botiga-reviews-list-item .ks-vm-review-head {
    display: block;
}
.botiga-reviews-list-item .star-rating.botiga-star-rating-style2 {
    font-size: .9em;
    margin: 0 0 2px;
}
/* Ad + rozet + tarih: reviews.js üçünü `.ks-vm-review-meta` içine alır, bu flex
 * satırı hepsini DİKEYDE ORTALAR. Satır-içi (baseline) dizilimde ad .9em, rozet
 * 1.2rem ve tarih .8em olduğu için üçü asla aynı hizaya gelmiyordu.
 * ⚠️ Yıldızlar bu kabın DIŞINDA: flex'e girerse maske genişliği bozulur. */
.botiga-reviews-list-item .ks-vm-review-meta {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 2px 8px;        /* rozet↔tarih mesafesi buradan */
}
/* Yazar adı: rozetle arasını `gap` yönetir (tema `em`'e margin veriyordu).
 * inline-flex ayrıca şablonun `<strong>` içinde bıraktığı satır-sonu boşluğunu
 * yok sayar (flex kabında yalnız-boşluk metin düğümleri render edilmez). */
strong.botiga-review-author {
    display: inline-flex;
    align-items: center;
    gap: 4px;            /* + .ks-vm-tip'in 2px'i = adla rozet arası 6px */
    font-weight: 600;
    line-height: 1.2;
    font-size: .9em !important;
    padding-top: 3px;
}
/* Rozet kabı satır yüksekliğini şişirmesin (dikey ortalama kaymasın). */
.botiga-reviews-list-item em.ks-vm-verified,
.botiga-reviews-list-item .ks-vm-verified-tip {
    line-height: 1;
}

.botiga-reviews-list-wrapper .botiga-reviews-list-item {
    padding: 20px 0 !important;
}
body .botiga-reviews-list-wrapper .botiga-reviews-list-item .star-rating + .botiga-review-author {
    margin-left: 0;
}
.botiga-reviews-list-item .botiga-review-date {
    margin-left: 0;      /* mesafeyi artık .ks-vm-review-meta'nın gap'i veriyor */
    /* Tipografi burada DEĞİL: Soru & Cevap tarihiyle ortak blokta (aşağıda,
     * "TARİH TİPOGRAFİSİ"). Operatör ikisinin birebir aynı olmasını istedi. */
}
/* Boşalan tarih kolonu (JS taşıdıktan sonra) yer kaplamasın. */
.botiga-review-date-wrapper.ks-vm-date-moved {
    display: none;
}
/* Satın alan kullanıcı imi — metin rozeti DEĞİL, dolu seal-check + ipucu
 * (operatör, 30 Tem). reviews.js temanın `em`'inin içini PHP'nin ürettiği
 * `.ks-vm-tip` markup'ıyla değiştirir; ipucunun görünümü [ks_prep_time]
 * ipuçlarıyla aynı kuraldan gelir (aşağıdaki "KS TIP" bölümü).
 * `em.ks-vm-verified` yalnız KAP: pill görünümü sıfırlanır. */
.botiga-reviews-list-item em.woocommerce-review__verified {
    display: inline-flex;
    align-items: center;
    font-size: 1em;
    font-style: normal;
    font-weight: 400;
    vertical-align: middle;
}
/* 🚨 Rozetin sol marjı TEMADAN: `.botiga-reviews-list-wrapper
 * .botiga-reviews-list-item .verified{margin-left:6px}` (3 sınıf) — adla rozet
 * arasındaki fazla boşluğun kaynağı buydu (3px gap + 6px marj + 2px ipucu marjı
 * = 11px). Aynı zincir + `body` şart; kısa seçici yeniliyor. Mesafeyi artık tek
 * yer belirliyor: `.botiga-review-author`'un `gap`i. */
body .botiga-reviews-list-wrapper .botiga-reviews-list-item .verified {
    margin-left: 0;
}
/* JS çalışmadıysa (kademeli iyileştirme) metin rozeti eski hâliyle kalsın. */
.botiga-reviews-list-item em.woocommerce-review__verified:not(.ks-vm-verified) {
    padding: 1px 7px;
    border-radius: 999px;
    background: color-mix(in srgb, var(--e-global-color-secondary, #DA6900) 12%, #fff);
    color: var(--e-global-color-secondary, #DA6900);
    font-size: .75em;
    font-weight: 600;
    white-space: nowrap;
}
/* Rozetin yerini alan ipucunun glyph'i: DAİMA dolu (PHP 'fill' ağırlığıyla tek
 * svg basıyor, hover'da değişmez) ve isim satırında görünür bir im olacak kadar
 * büyük. rem: yorum satırının taban puntosu panelden küçük — `em` olsaydı ikon
 * ve balonun konumu bağlama göre oynardı. */
.botiga-reviews-list-item .ks-vm-verified-tip .ks-vm-icon {
    font-size: 1.2rem;
    color: var(--e-global-color-secondary, #DA6900);
}
.botiga-review-content {
    margin-top: 8px !important;
    line-height: 1.55;
}
strong.ks-vm-review-title {
    display: block;
    margin-bottom: 2px;
    font-size: .9em;
}
.botiga-review-content p {
    margin: 0;
    font-size: .85em;
}

/* Yorum fotoğrafları */
.ks-vm-review-photos {
    display: flex;
    gap: 8px;
    margin-top: 10px;
}
/* ── Thumbnail'lar = SAYFADAKİ GALERİNİN thumbnail'larının aynısı ──
 * (operatör, 30 Tem 2026 · v2.156.0)
 *
 * Ölçülen galeri thumbnail'ı: 65×86.7 (3:4), 1px "Border" global'i (#D1D1D1),
 * 8px yuvarlaklık; üzerine gelince kenarlık primary'ye döner ve 2px halka
 * belirir. Değerler oradan kopyalandı, tek tek değil.
 *
 * 🚨 `body` + iki sınıflı seçici ZORUNLU: Elementor'un `.elementor img
 * {border:none;border-radius:0}` kuralı bizimle AYNI özgüllükte ve BİZDEN
 * SONRA yükleniyor — eşitlikte o kazanıyordu. Ölçüldü: kısa seçiciyle
 * çerçeve/radius hiç çizilmiyordu (computed border-width 0px).
 *
 * ⛔ HOVER'DA ÇERÇEVE DEĞİŞMİYOR (operatör, 30 Tem). Galeride o halka bir
 * SEÇİM işareti (hangi thumbnail büyük görselde duruyor); yorum fotoğrafında
 * seçim diye bir şey yok, tıklanabilirliği imleç zaten söylüyor. Kopyalanan
 * tek şey duruş: çerçeve + yuvarlaklık + ölçü. */
body .ks-vm-review-photos a.ks-vm-review-photo {
    display: inline-block;
    line-height: 0;
    cursor: pointer;
}
body .ks-vm-review-photos a.ks-vm-review-photo img {
    display: block;
    width: 65px;
    height: auto;
    aspect-ratio: 3 / 4;
    object-fit: cover;
    box-sizing: border-box;
    border: 1px solid var(--e-global-color-dcb0b6a, #d1d1d1);
    border-radius: 8px;
}
/* lightGallery'nin üzerine kurulduğu görünmez tetikleyici (reviews.js).
 * Sahne `<body>`ye ayrı bir katman olarak açıldığı için bu düğümün görünmesine
 * gerek yok; her açılışta yeniden yaratılıp kapanışta siliniyor. */
.ks-vm-review-lg {
    display: none;
}

/* Mağaza yanıtı bloğu KALDIRILDI (operatör, 30 Tem 2026 · v2.158.0) —
 * stilleri de birlikte gitti; markup'ı üreten tek yer PHP'ydi. */

/* ═══════════════════════════════════════════════════════════════════════════
 *  İKİ KOLON: solda özet (puan + dağılım çubukları), sağda yorumlar
 *  (operatör, 30 Tem 2026 · v2.160.0)
 *
 *  Şablon üç kardeş basıyor: header (özet + Yorum Yaz + sıralama), body
 *  (liste), footer (sayfalama). Bunları GRID'e alıp header'ı 1. kolona, body
 *  ve footer'ı 2. kolona koyuyoruz — DOM sırası değişmiyor (JS'siz/eski
 *  tarayıcıda eski üst-alt düzen aynen çalışır).
 *
 *  Sıralama menüsü tek istisna: o özet bloğunun İÇİNDE basılıyor ama LİSTEYİ
 *  yönetiyor → reviews.js onu listenin üstündeki `.ks-vm-reviews-toolbar`a
 *  taşıyor (sağ üst).
 *
 *  ⚠️ Yalnız ≥992px. Dar ekranda iki kolon 300+300'e düşer, ne çubuklar ne de
 *  yorum metni okunur kalır; orada bilinçli olarak eski üst-alt düzen sürüyor.
 *  Boş durumda da grid YOK (`:not(.ks-vm-reviews-empty)`): tek blok ortalı
 *  boş-durum kutusunun yanında kocaman bir boşluk kalırdı.
 * ═══════════════════════════════════════════════════════════════════════════ */

/* Sıralama menüsü listenin sağ üstünde (her ekran boyutunda). */
.ks-vm-reviews-toolbar {
    display: flex;
    justify-content: flex-end;
    margin-bottom: 0 !important;
}
/* Tek kolonlu düzende (tablet ve telefon) menü, hemen üstündeki özet kartına
 * YAPIŞIK duruyordu — ölçüldü: 0px (operatör, 30 Tem). İki kolonlu düzende
 * (≥992px) menü sağ kolonun en üstünde olduğu için orada boşluk GEREKMİYOR,
 * bu yüzden kural yalnız dar ekranlarda. Alt boşluk (menü↔liste) 40px; üstteki
 * biraz daha kısa ki menü yönettiği listeye yakın dursun. */
@media (max-width: 991px) {
    .ks-vm-reviews-toolbar {
        margin-top: 28px;
    }
}
.ks-vm-reviews-toolbar .botiga-reviews-orderby-form {
    margin: 0;
}

@media (min-width: 992px) {
    .botiga-adv-reviews:not(.ks-vm-reviews-empty) {
        display: grid;
        grid-template-columns: minmax(230px, 290px) 1fr;
        column-gap: 44px;
        align-items: start;
    }
    .botiga-adv-reviews:not(.ks-vm-reviews-empty) > .botiga-adv-reviews-header {
        grid-column: 1;
        grid-row: 1 / span 2;
        margin-bottom: 0;
    }
    .botiga-adv-reviews:not(.ks-vm-reviews-empty) > .botiga-adv-reviews-body {
        grid-column: 2;
        grid-row: 1;
    }
    .botiga-adv-reviews:not(.ks-vm-reviews-empty) > .botiga-adv-reviews-footer {
        grid-column: 2;
        grid-row: 2;
    }
    /* Yorum Yaz butonu KOLONUN TAM GENİŞLİĞİNDE — yalnız bu kırılımda:
     * dar kolonda doğru, 790px'lik tablet kartında upuzun bir buton olurdu
     * (operatör). Alt alta dizilim + çubukların tam genişliği ≥768px bloğunda,
     * çünkü tablette de öyle olmalı. */
    body .botiga-adv-reviews-header .row .botiga-adv-review-write-button {
        display: block;
        width: 100%;
        text-align: center;
    }
}

/* ── TABLET ve üstü: özet TEK KOLON (operatör, 30 Tem) ──
 * Temanın `.row.justify-content-between` düzeni ≥768px'te özeti solda, "Yorum
 * Yaz"ı SAĞ ÜSTTE yan yana diziyordu: dağılım çubukları içeriği kadar daralıyor
 * (ölçüldü: 790px'lik kartta 203px) ve buton listenin başına düşüyordu.
 * Masaüstündeki düzenin aynısı isteniyor — çubuklar tam genişlik, buton
 * ÇUBUKLARIN ALTINDA (tablette tam genişlik DEĞİL, kendi boyunda).
 *
 * ⚠️ 768px'in ALTINA taşınmıyor: telefonda tema zaten `col-12` ile alt alta
 * diziyor ve buton flex esnemesiyle kart genişliğinde duruyor — oraya
 * dokunmak mobil görünümü değiştirirdi. */
@media (min-width: 768px) {
    /* Bootstrap kolonları `flex: 0 0 auto` + auto genişlik; kabı daraltmak tek
     * başına sarmalarını garanti etmiyor, yönü açıkça çeviriyoruz. */
    .botiga-adv-reviews-header .row {
        flex-direction: column;
    }
    .botiga-adv-reviews-header .row > [class*="col-"] {
        width: 100%;
        max-width: 100%;
        flex: 0 0 auto;
    }
    /* Buton kendi satırında, çubuklardan nefes payıyla (10px çok yakındı). */
    .botiga-adv-reviews-header .row > .d-flex {
        display: block !important;
        margin-top: 24px;
    }
}

/* 🚨 Dağılım çubuğunun temada `min-width:300px`i var; 290px'lik özet kolonunda
 * (ve zaten 280px'lik telefonda) kaptan TAŞIYOR — çubuklar ve "(8)" sayaçları
 * yorum metninin üstüne biniyordu (render'la görüldü). Çubuk `flex:1` ile
 * boşluğu doldurduğu için alt sınıra ihtiyaç yok. */
body .botiga-adv-reviews .botiga-star-rating-bars .botiga-star-rating-bar-item .item-bar {
    min-width: 0;
}

/* ── Özet başlığı: "4,58 (12)" üstte, yıldızlar ALTINDA (operatör, 30 Tem) ──
 *
 * 🚨 Yıldızları alt satıra almanın TEK güvenli yolu `display:block`. Kabı
 * flex bırakıp `flex-basis:100%` vermek `.star-rating`i satır boyuna UZATIR ve
 * dolgu maskesi bozulur (4 yıldız 5 görünür — galeri/yorum satırında birebir
 * yaşandı). `width:5.3em` yerinde kaldığı sürece blok yapmak maskeye dokunmaz.
 *
 * Tema kuralı üç sınıf derinliğinde ve sonra yükleniyor → aynı zincir + `body`. */
body .botiga-adv-reviews .botiga-adv-reviews-header .botiga-adv-reviews-rating-wrapper {
    display: block;
    /* "12 Yorum" satırı kalkınca onun 30px'lik alt boşluğu da gitti; çubuklarla
     * arayı bu satır tutuyor. */
    margin-bottom: 22px;
}
body .botiga-adv-reviews .botiga-adv-reviews-header .botiga-adv-reviews-rating-wrapper .star-rating {
    display: block;
    /* Puanla arası daraldı (operatör): 8px iken satır yükseklikleriyle birlikte
     * 11px görünüyordu, şimdi ~6px. */
    margin: 0;
}
/* Puanın yanındaki parantezli sayı (reviews.js ekliyor). */
.botiga-adv-reviews-header .ks-vm-review-count {
    margin-left: 7px;
    font-size: 1rem;
    font-weight: 500;
    color: var(--e-global-color-text, #868686);
}
/* Görsel olarak gizli ama okunabilir: "12 Yorum" cümlesi ekran okuyucuda ve
 * sayfa metninde kalsın, ekranda yalnız "(12)" görünsün. */
.ks-vm-sr-only {
    position: absolute !important;
    width: 1px;
    height: 1px;
    margin: -1px;
    padding: 0;
    overflow: hidden;
    clip-path: inset(50%);
    white-space: nowrap;
    border: 0;
}

/* Ortalama puan + büyük yıldızlar biraz küçüldü (operatör): 32/28px → 26/20px.
 * `.star-rating` genişliği `5.3em` olduğu için ölçüyü FONT-SIZE veriyor —
 * genişliğe elle dokunmak maskeyi bozar (bkz. yıldız maskesi uyarısı). */
/* 🚨 Temanın kuralı DÖRT sınıf derinliğinde
 * (`.botiga-adv-reviews .botiga-adv-reviews-header .…-rating-wrapper
 * .…-rating{font-size:2em}`) ve bizden sonra yükleniyor — kısa seçici sessizce
 * kaybediyordu (ölçüldü: 32px kaldı). Aynı zincir + `body` ön eki şart. */
body .botiga-adv-reviews .botiga-adv-reviews-header .botiga-adv-reviews-rating-wrapper .botiga-adv-reviews-rating {
    font-size: 26px;
}
.botiga-adv-reviews-header .star-rating.botiga-star-rating-style2 {
    font-size: 20px;
}

/* ── "Daha fazla yorum göster" (Botiga Pro sayfalama butonu) ──
 * (operatör, 30 Tem 2026 · v2.159.0)
 *
 * Buton tema tarafından `.button` sınıfıyla geliyor; site buton diline
 * çekiliyor: pill, "Yorum Yaz" ile aynı ölçü/ağırlık, ortalı.
 * 🚨 Tema `.button` beyazı bizden SONRA yükleniyor → `!important` bilinçli
 * (aynı sebep Yorum Yaz/Gönder butonlarında da geçerli).
 *
 * Numaralı gezinme (`?cpage=N`) DOM'da KALIR, yalnız gizlenir: Botiga'nın
 * sayfalama JS'i bir sonraki adresi oradan okuyor ve arama motorları o
 * bağlantılarla tüm yorumlara ulaşabiliyor. Silmek ikisini de bozardı. */
.botiga-adv-reviews-footer.ks-vm-has-load-more .botiga-adv-reviews-pagination {
    display: none;
}
.botiga-adv-reviews-footer .botiga-pagination-wrapper {
    display: flex;
    justify-content: center;
    margin-top: 20px;
}
/* ⛔ Renk/ölçü BURADA TANIMLANMIYOR: buton "Yorum Yaz" ile aynı bloktan
 * besleniyor (yukarıdaki "YORUM ALANININ BUTON DİLİ"). Burada yalnız bu
 * butona ÖZGÜ olanlar var: ikon+metin aralığı ve yükleniyor durumu. */
.botiga-adv-reviews a.button.botiga-pagination-button {
    gap: 8px;
}
/* 🚨 Metin butonun kendisinde DEĞİL, iç `span`de: temanın o span'e verdiği
 * `text-transform:uppercase` + .9em yüzünden buton "DAHA FAZLA YORUM GÖSTER"
 * diye bağırıyordu (render'la görüldü). Sitenin buton dili başlık düzeni. */
body .botiga-adv-reviews-footer .botiga-pagination-button .botiga-pagination-button__label {
    text-transform: capitalize;
    font-size: inherit;
    letter-spacing: inherit;
    font-weight: inherit;
}

/* ── Yükleniyor: METİN KALIR, başına dönen halka gelir (operatör, 30 Tem) ──
 *
 * 🚨 Temanın kuralı halkayı `position:absolute; top:50%; left:50%` ile butonun
 * ORTASINA çiviliyor (metin gizlendiği varsayımıyla). Metni görünür bırakınca
 * halka yazının üstüne biniyor ve kutunun dışına kayıyordu — operatörün
 * gördüğü "iki ikon üst üste, loader aşağı kaçıyor" tam olarak buydu. Halkayı
 * normal akışa geri alıp `order:-1` ile metnin ÖNÜNE koyuyoruz; aradaki boşluk
 * butonun kendi `gap`inden geliyor.
 *
 * ⚠️ Halka gizliyken de akıştan çıkmalı (`display:none`), yoksa kapalı hâlde
 * butonun içinde boş bir yer tutar. */
.botiga-adv-reviews-footer .botiga-pagination-button .botiga-pagination-button__loader {
    display: none;
    position: static;
    transform: none;
    order: -1;
    line-height: 0;
}
.botiga-adv-reviews-footer .botiga-pagination-button.loading .botiga-pagination-button__loader {
    display: inline-flex;
    /* Dönmeyi TEMA zaten SVG'ye veriyor (`rotateAnim`); sarmalayıcıyı da
     * döndürmek çift dönüş olurdu. */
}
/* Metin yükleniyorken KALIR (operatör). Tema onu `opacity:0;visibility:hidden`
 * ile siliyor — geri açıyoruz. */
.botiga-adv-reviews-footer .botiga-pagination-button.loading .botiga-pagination-button__label {
    opacity: 1;
    visibility: visible;
}
/* 🚨 İKİNCİ HALKA: WooCommerce `.button.loading::after`a KENDİ spinner
 * glyph'ini basıyor (8.9×26.6px, `animation:spin`) — bizim halkamızla üst üste
 * biniyordu (operatörün gördüğü "iki ikon"). Butonun kendi halkası zaten var,
 * WooCommerce'inkini kapatıyoruz. */
.botiga-adv-reviews-footer .botiga-pagination-button.loading::after {
    content: none;
}
/* Tema halkayı %70 saydam basıyor; metinle aynı tonda olsun. */
.botiga-adv-reviews-footer .botiga-pagination-button.loading svg {
    opacity: 1;
}
.botiga-adv-reviews-footer .botiga-pagination-button__loader svg {
    width: 16px;
    height: 16px;
}
/* SVG'nin kendi `fill="#FFF"` niteliği var; outline butonda beyaz halka
 * görünmezdi. CSS sunum niteliğini ezer — renk metinle aynı kaynaktan. */
.botiga-adv-reviews-footer .botiga-pagination-button__loader svg,
.botiga-adv-reviews-footer .botiga-pagination-button__loader svg path {
    fill: currentColor;
}
@keyframes ks-vm-spin {
    to { transform: rotate(360deg); }
}

/* Onay bekliyor bildirimi */
.botiga-reviews-list-item em:not(.woocommerce-review__verified) {
    color: var(--e-global-color-secondary, #DA6900);
    font-style: normal;
    font-weight: 600;
}

/* ── Yorum modalı ── */
.botiga-adv-reviews-modal {
    background: rgba(0, 0, 0, .7);
}
/* body ön eki: temanın aynı-spesifiklikte 50px padding kuralı sonradan
 * yüklenip kazanıyordu. */
body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body {
    border-radius: 12px;
    padding: 30px 32px;
    max-width: 560px;
    box-shadow: 0 10px 40px rgba(0, 0, 0, .25);
}
/* Temanın içerik sütunundaki 17px sağ payı da fazla — scrollbar için ince pay. */
body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body .botiga-adv-reviews-modal-content {
    padding-right: 6px;
}
/* Başlık yalnız h4'te: tema .modal-title-style1'i full-uppercase + harf
 * aralıklı basıyordu; diğer KS popup başlıkları ("Giriş Yap") gibi normal
 * case ve dolgun. Aynı sınıf PUANINIZ etiketinde de var — o AŞAĞIDA normal
 * form etiketine indirgenir. */
/* Tema kuralı 4 sınıf derinliğinde (.modal-body .modal-content .modal-title-style1)
 * — aynı zinciri kullanmadan yenilmiyor. */
.botiga-adv-reviews-modal .botiga-adv-reviews-modal-body .botiga-adv-reviews-modal-content h4.modal-title-style1 {
    font-size: 1.4em;
    font-weight: 700;
    text-transform: none;
    letter-spacing: 0;
    /* Başlık ile ürün kartı arasında belirgin bir ara — form alanlarının 12px
       ritmiyle karıştırılmasın diye kasıtlı olarak daha geniş: burada bölüm
       değişiyor, alan değil. */
    margin: 0 0 12px;
}
.botiga-adv-reviews-modal .botiga-adv-reviews-modal-body .botiga-adv-reviews-modal-content .comment-form-rating label.modal-title-style1 {
    font-size: .92em;
    font-weight: 600;
    text-transform: none;
    letter-spacing: 0;
    margin: 0 0 4px;
}
/* ── Modaldaki ürün kartı ──
 * 🚨 Temanın kuralları `.modal .modal-body .modal-content .…-product` (4 sınıf)
 * derinliğinde ve şunları dayatıyor: align-items:flex-start, margin-bottom:20px,
 * .modal-product-info{margin-left:25px} (gap'in ÜSTÜNE binip metni uzağa
 * atıyordu), h5{margin-top:5px;margin-bottom:10px}. Yenmek için AYNI zinciri
 * kullanmak zorunlu — kısa seçici sessizce kaybediyor. */
body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body .botiga-adv-reviews-modal-content .botiga-adv-reviews-modal-product {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 8px 10px;
    border: 1px solid var(--e-global-color-dcb0b6a, #e5e5e5);
    border-radius: 10px;
    margin-bottom: 12px;
}
/* Sitenin galeri dili 3:4 (bkz. KS_VM_Gallery) — burada SABİT ve küçük
   yükseklikte: metne göre uzayan görsel popup'ı scroll'a düşürüyordu. */
body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body .botiga-adv-reviews-modal-content .botiga-adv-reviews-modal-product img {
    flex: 0 0 auto;
    width: auto;
    height: 64px;
    max-width: none;
    aspect-ratio: 3 / 4;
    object-fit: cover;
    border-radius: 8px;
}
body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body .botiga-adv-reviews-modal-content .botiga-adv-reviews-modal-product .modal-product-info {
    /* Aradaki mesafeyi YALNIZ gap belirlesin. */
    margin-left: 0;
    min-width: 0;
    font-size: .85em;
    color: var(--e-global-color-01631af, #868686);
    line-height: 1.4;
}
/* Kırpma YALNIZ açıklamada: bloğun tamamına uygulanınca uzun bir ürün adı
   açıklamayı komple yutuyordu. Ad her zaman tam görünür, açıklama 2 satır. */
body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body .botiga-adv-reviews-modal-content .botiga-adv-reviews-modal-product .modal-product-info p {
    margin: 0;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body .botiga-adv-reviews-modal-content .botiga-adv-reviews-modal-product .modal-product-info h5 {
    margin: 0 0 3px;
    font-size: 1em;
    line-height: 1.3;
}

/* Form alanları */
.botiga-adv-reviews-modal #commentform label {
    display: block;
    font-weight: 600;
    margin-bottom: 3px;
    font-size: .92em;
}
.botiga-adv-reviews-modal #commentform input[type="text"],
.botiga-adv-reviews-modal #commentform input[type="email"],
.botiga-adv-reviews-modal #commentform textarea {
    width: 100%;
    border: 1px solid var(--e-global-color-dcb0b6a, #e5e5e5);
    border-radius: 8px;
    padding: 9px 12px;
}
/* Şablon rows="5" basıyor — masaüstünde popup'ı gereksiz uzatıyordu; yazmaya
   yeten bir taban, gerektiğinde kullanıcı kendisi büyütür. */
.botiga-adv-reviews-modal #commentform textarea {
    display: block;   /* inline baseline boşluğunu keser (~6px) */
    min-height: 84px;
    height: 84px;
    resize: vertical;
}
.botiga-adv-reviews-modal #commentform input:focus,
.botiga-adv-reviews-modal #commentform textarea:focus {
    border-color: var(--e-global-color-secondary, #DA6900);
    outline: none;
    box-shadow: 0 0 0 1px var(--e-global-color-secondary, #DA6900);
}
/* ⭐ ALAN RİTMİ — TEK DEĞER: notlar, puan bloğu (div!), başlık, yorum, foto,
 * ad/e-posta, çerez onayı... hepsi aynı 12px alt boşlukla dizilir. */
.botiga-adv-reviews-modal #commentform p,
.botiga-adv-reviews-modal #commentform .comment-form-rating {
    margin: 0 0 10px;
}

/* WooCommerce'in kendi select→yıldız dönüştürücüsü (single-product.js, p.stars)
 * de aynı select'i hedefliyor — iki yıldız satırı üst üste biniyordu. Bizimki
 * kalır, WC'ninki görünmez. */
.botiga-adv-reviews-modal .comment-form-rating p.stars {
    display: none;
}

/* Yıldız seçici: select değer taşıyıcı olarak gizli kalır. */
.botiga-adv-reviews-modal .comment-form-rating select#rating {
    position: absolute !important;
    width: 1px;
    height: 1px;
    opacity: 0;
    pointer-events: none;
}
.ks-vm-star-picker {
    display: inline-flex;
    gap: 4px;
}
.ks-vm-star-picker .ks-vm-star {
    border: 0;
    background: none;
    box-shadow: none;
    padding: 2px;
    cursor: pointer;
    line-height: 1;
    color: #cfcfcf;
    transition: color .1s ease, transform .1s ease;
}
.ks-vm-star-picker .ks-vm-star svg {
    width: 30px;
    height: 30px;
    display: block;
    /* Boş hâl: yalnız kontur. */
    fill: none;
    stroke: currentColor;
    stroke-width: 16;
    transition: fill .1s ease;
}
.ks-vm-star-picker .ks-vm-star:hover {
    background: none;
    transform: scale(1.12);
}
/* Verilen not kadarı İÇİ DOLU accent yıldız. */
.ks-vm-star-picker .ks-vm-star.is-on {
    color: var(--e-global-color-secondary, #DA6900);
}
.ks-vm-star-picker .ks-vm-star.is-on svg {
    fill: currentColor;
    stroke: none;
}

/* ── Doğrulama durumları — login formuyla aynı dil ──
 * Alanlar yalnız DURUM taşır (aria-invalid + danger kenarlık), mesaj KSToast'ta. */
.botiga-adv-reviews-modal #commentform input[aria-invalid="true"],
.botiga-adv-reviews-modal #commentform textarea[aria-invalid="true"] {
    border-color: var(--ks-danger, #c8321f) !important;
}
.botiga-adv-reviews-modal #commentform input[aria-invalid="true"]:focus,
.botiga-adv-reviews-modal #commentform textarea[aria-invalid="true"]:focus {
    border-color: var(--ks-danger, #c8321f) !important;
    box-shadow: 0 0 0 1px var(--ks-danger, #c8321f);
}
/* Puan boş bırakıldıysa: etiket kırmızı + boş yıldız konturları da kızarır. */
.botiga-adv-reviews-modal .comment-form-rating label.ks-vm-label-error {
    color: var(--ks-danger, #c8321f);
}
.ks-vm-star-picker.ks-vm-picker-error .ks-vm-star:not(.is-on) {
    color: var(--ks-danger, #c8321f);
}

/* Fotoğraf alanı + önizlemeler — dosya girişi ferah, kesikli bir kutu;
 * tarayıcının Choose düğmesi de sitenin küçük pill'i gibi giydirilir. */
.botiga-adv-reviews-modal .comment-form-ks-photos input[type="file"] {
    display: block;
    width: 100%;
    padding: 8px;
    border: 1px dashed var(--e-global-color-dcb0b6a, #e5e5e5);
    border-radius: 8px;
    background: #fff;
    font-size: .9em;
    color: var(--e-global-color-01631af, #868686);
    cursor: pointer;
}
.botiga-adv-reviews-modal .comment-form-ks-photos input[type="file"]::file-selector-button {
    margin-right: 12px;
    padding: 8px 16px;
    border: 1px solid var(--e-global-color-dcb0b6a, #e5e5e5);
    border-radius: var(--ks-radius-pill, 999px);
    background: #f5f5f5;
    font-weight: 600;
    cursor: pointer;
}
.ks-vm-review-photo-previews:empty {
    display: none;
}
.ks-vm-review-photo-previews {
    display: flex;
    gap: 8px;
    margin-top: 8px;
}
.ks-vm-review-photo-preview {
    width: 56px;
    height: 56px;
    object-fit: cover;
    border-radius: 6px;
    border: 1px solid var(--e-global-color-dcb0b6a, #e5e5e5);
}

/* Gönder: tam genişlik birincil buton. */
.botiga-adv-reviews-modal #commentform .form-submit {
    margin: 0;
}
.botiga-adv-reviews-modal #commentform .form-submit .submit {
    width: 100%;
    padding: 12px 24px;
    border: 0;
    border-radius: var(--ks-radius-pill, 999px);
    background: var(--e-global-color-primary, #212121);
    color: #fff;
    font-size: .95em;
    font-weight: 600;
    letter-spacing: .3px;
    text-transform: capitalize;
    cursor: pointer;
    transition: opacity .15s ease;
}
.botiga-adv-reviews-modal #commentform .form-submit .submit:hover {
    background: var(--e-global-color-primary, #212121);
    color: #fff;
    opacity: .85;
}

/* ── Kısa masaüstü ekranları ──
 * 85vh'lik kutuya sığmak için dikey iç boşluk daralır; yatay nefes korunur.
 * Popup'ın scroll'a düşmemesi, iç boşluğun bir kaç pikselinden önemli. */
@media (max-height: 820px) {
    body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body {
        padding: 20px 32px 22px;
    }
    body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body .botiga-adv-reviews-modal-content h4.modal-title-style1 {
        margin-bottom: 10px;
    }
    .botiga-adv-reviews-modal #commentform textarea {
        min-height: 72px;
        height: 72px;
    }
}

/* ── Çok kısa ekranlar (dizüstü + tarayıcı çubukları) ──
 * Buradaki tek hedef: popup'ın dikeyde scroll'a düşmemesi. Sırayla en az
 * bilgi taşıyan şeyler feda edilir — kart açıklaması (ürün ADI kalır; müşteri
 * zaten o ürünün sayfasında), sonra ölçüler. Kutunun kendi tavanı da 85vh'den
 * 92vh'ye çıkar: ekranın tamamını kullanmak, iç boşluktan önce gelir. */
@media (max-height: 700px) {
    body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body .botiga-adv-reviews-modal-content {
        max-height: 92vh;
    }
    body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body {
        padding: 16px 26px 18px;
    }
    body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body .botiga-adv-reviews-modal-content h4.modal-title-style1 {
        font-size: 1.2em;
        margin-bottom: 8px;
    }
    body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body .botiga-adv-reviews-modal-content .botiga-adv-reviews-modal-product img {
        height: 54px;
    }
    /* Açıklama gider, ürün adı kalır. */
    body .botiga-adv-reviews-modal .botiga-adv-reviews-modal-body .botiga-adv-reviews-modal-content .botiga-adv-reviews-modal-product .modal-product-info p {
        display: none;
    }
    .botiga-adv-reviews-modal #commentform p,
    .botiga-adv-reviews-modal #commentform .comment-form-rating {
        margin: 0 0 8px;
    }
    .botiga-adv-reviews-modal #commentform textarea {
        min-height: 64px;
        height: 64px;
    }
    .ks-vm-star-picker .ks-vm-star svg {
        width: 26px;
        height: 26px;
    }
    .botiga-adv-reviews-modal #commentform .form-submit .submit {
        padding: 10px 24px;
    }
}

/* ═══════════════════════════════════════════════════════════════════════════
 *  KS SORU & CEVAP  —  [ks_product_questions]   (30 Tem 2026 · v2.164.0)
 *
 *  Operatör: "yorumlarla birebir aynı görünsün, sadece puan/yıldız/dağılım
 *  çubukları ve sol kolon olmasın, daha basiti." Bu yüzden burada YENİ bir
 *  tasarım dili YOK: satır ritmi, maskeli ad + tarih satırı, kesikli boş durum
 *  kutusu ve popup ölçüleri yorum alanından birebir alındı. Butonlar zaten
 *  ortak blokta (yukarıda) — "Soru Sor" ve "Daha fazla yükle", "Yorum Yaz" ile
 *  aynı kaynaktan besleniyor.
 * ═══════════════════════════════════════════════════════════════════════════ */

.ks-vm-qa {
    font-size: 1rem;
}

/* Üst satır: sayı solda, "Soru Sor" sağda. */
.ks-vm-qa-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 16px;
    flex-wrap: wrap;
    margin-bottom: 22px;
}
.ks-vm-qa-count {
    margin: 0;
    font-size: 1.1em;
    font-weight: 600;
}
/* Boş durumun GÖRÜNÜMÜ burada değil: yorum alanıyla ORTAK blokta
   ("BOŞ DURUM — ORTAK BLOK", KS REVIEWS bölümünün içinde). Kutu, ikon, düğme
   ve üst şeridin gizlenmesi oradan gelir — buraya ikinci bir kopya YAZMA. */

/* "Soru Sor" kısa bir metin; ortak buton bloğunun 24px yan dolgusu bu kadar
 * kısa etikette kutuyu sıkışık gösteriyordu (operatör, 30 Tem). Yalnız YATAY
 * dolgu artıyor — yükseklik ve geri kalan her şey ortak bloktan geliyor. */
body .ks-vm-qa a.button.ks-vm-qa-ask {
    padding-left: 34px;
    padding-right: 34px;
}

/* ── Soru satırı ── */
.ks-vm-qa-item {
    padding: 18px 0;
    border-bottom: 1px solid var(--e-global-color-dcb0b6a, #ededed);
}
.ks-vm-qa-item:first-child {
    padding-top: 0;
}
.ks-vm-qa-item[hidden] {
    display: none;
}
/* Maskeli ad + tarih: yorum satırındaki `.ks-vm-review-meta` ile aynı ritim. */
.ks-vm-qa-meta {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 2px 8px;
    margin-bottom: 4px;
}
.ks-vm-qa-author {
    font-size: .9em;
    font-weight: 600;
    line-height: 1.2;
}
/* ── ⭐ TARİH TİPOGRAFİSİ — TEK KAYNAK ──
 * Soru & Cevap ve Yorum satırlarındaki tarih BİREBİR aynı görünür (operatör,
 * 30 Tem). Ölçülen fark buydu: yorum tarafı 600 ağırlık, 1.3em satır yüksekliği
 * ve temadan gelen `opacity:.5` ile daha soluk/kalın duruyordu.
 * `!important` yalnız yorum tarafı için gerekli (tema kuralları sonra
 * yükleniyor); tek blokta durması ikisinin bir daha ayrışmamasını sağlıyor. */
.ks-vm-qa-date,
.botiga-reviews-list-item .botiga-review-date {
    font-size: .8em !important;
    font-weight: 500 !important;
    opacity: 1 !important;
    color: var(--e-global-color-01631af, #868686) !important;
    padding-top: 3px !important;
}
.ks-vm-qa-question {
    margin: 0;
    font-size: .95em;
    font-weight: 600;
    line-height: 1.5;
}

/* ── Cevap ──
 * Mağazanın sesi: accent bir sol şeritle sorudan ayrışır. (Yorumlardaki eski
 * mağaza-yanıtı bloğunun dili; orada kaldırıldı, burada ASIL İŞ bu.) */
.ks-vm-qa-answer {
    margin-top: 10px;
    padding: 10px 14px;
    background: #f7f7f7;
    border-left: 3px solid var(--e-global-color-secondary, #DA6900);
    border-radius: 0 8px 8px 0;
    font-size: .9em;
    line-height: 1.55;
}
.ks-vm-qa-answer-head {
    display: block;
    margin-bottom: 4px;
    font-weight: 700;
    font-size: .88em;
    color: var(--e-global-color-secondary, #DA6900);
}
.ks-vm-qa-answer p {
    margin: 0;
}
.ks-vm-qa-answer p + p {
    margin-top: 8px;
}

/* "Daha fazla yükle" — yorumlardaki gibi ortalı. */
.ks-vm-qa-footer {
    display: flex;
    justify-content: center;
    margin-top: 24px;
}

/* ═══════════════════════════════════════════════════════════════════════════
 *  Soru popup'ı — yorum modalının sade kardeşi
 *  (aynı karartma, aynı kart ölçüleri, aynı alan ritmi; yıldız/başlık/foto yok)
 * ═══════════════════════════════════════════════════════════════════════════ */
.ks-vm-qa-modal {
    position: fixed;
    inset: 0;
    z-index: 100000;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
    background: rgba(0, 0, 0, .7);
}
.ks-vm-qa-modal[hidden] {
    display: none;
}
/* Popup açıkken arka plan kaymasın (yorum modalının davranışı). */
body.ks-vm-qa-modal-open {
    overflow: hidden;
}
.ks-vm-qa-modal-body {
    position: relative;
    width: 100%;
    max-width: 560px;
    max-height: 85vh;
    overflow: auto;
    padding: 30px 32px;
    background: #fff;
    border-radius: 12px;
    box-shadow: 0 10px 40px rgba(0, 0, 0, .25);
}
/* Kapatma: yorum lightbox'ındaki çizilmiş cross ile aynı dil. */
.ks-vm-qa-modal-close {
    position: absolute;
    top: 10px;
    right: 10px;
    width: 34px;
    height: 34px;
    padding: 0;
    border: 0;
    background: none;
    color: var(--e-global-color-primary, #000);
    opacity: .5;
    cursor: pointer;
}
.ks-vm-qa-modal-close:hover {
    opacity: 1;
}
.ks-vm-qa-modal-close::before,
.ks-vm-qa-modal-close::after {
    content: "";
    position: absolute;
    top: 50%;
    left: 50%;
    width: 18px;
    height: 1.8px;
    margin: -0.9px 0 0 -9px;
    background: currentColor;
    border-radius: 1px;
}
.ks-vm-qa-modal-close::before {
    transform: rotate(45deg);
}
.ks-vm-qa-modal-close::after {
    transform: rotate(-45deg);
}
/* 🚨 `body` + kapsam ZORUNLU: tema/Elementor'un başlık marj sıfırlaması bizden
 * sonra yükleniyor ve alt boşluğu 0'a çekiyordu (ölçüldü: yorum modalında 12px,
 * bizde 0 — başlık ürün kartına yapışıktı). */
body .ks-vm-qa .ks-vm-qa-modal-title {
    margin: 0 0 12px;
    font-size: 1.4em;
    font-weight: 700;
    text-transform: none;
    letter-spacing: 0;
}
/* Ürün kartı — yorum modalındaki ölçülerin aynısı (3:4, 64px, gap 12). */
.ks-vm-qa-modal-product {
    display: flex;
    align-items: center;
    gap: 12px;
    padding: 8px 10px;
    margin-bottom: 12px;
    border: 1px solid var(--e-global-color-dcb0b6a, #e5e5e5);
    border-radius: 10px;
}
/* 🚨 `body` + iki sınıf ZORUNLU: Elementor'un `.elementor img{max-width:100%;
 * height:auto}` kuralı bizimle aynı özgüllükte ve SONRA yükleniyor — kısa
 * seçicide görsel 64px'e inmiyor, popup'ı boydan boya kaplıyordu (render'la
 * görüldü). Aynı tuzak yorum fotoğraflarında da yaşanmıştı. */
body .ks-vm-qa .ks-vm-qa-modal-product img {
    flex: 0 0 auto;
    width: auto;
    height: 64px;
    max-width: none;
    aspect-ratio: 3 / 4;
    object-fit: cover;
    border-radius: 8px;
}
.ks-vm-qa-modal-product-info {
    min-width: 0;
    font-size: .85em;
    color: var(--e-global-color-01631af, #868686);
    line-height: 1.4;
}
body .ks-vm-qa .ks-vm-qa-modal-product-info h5 {
    /* Yorum modalındaki ürün adıyla aynı: adın altında 3px'lik nefes. */
    margin: 0 0 3px;
    font-size: 1em;
    line-height: 1.3;
}
/* Kısa açıklama — yorum modalındaki gibi 2 satırda kırpılır (uzun ad
 * açıklamayı yutmasın diye kırpma YALNIZ açıklamada). */
body .ks-vm-qa .ks-vm-qa-modal-product-info p {
    margin: 0;
    display: -webkit-box;
    -webkit-line-clamp: 2;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
/* Alan ritmi TEK değer — yorum modalıyla aynı 10px. */
.ks-vm-qa-form p {
    margin: 0 0 10px;
}
.ks-vm-qa-form label {
    display: block;
    margin-bottom: 3px;
    font-size: .92em;
    font-weight: 600;
}
.ks-vm-qa-form textarea {
    display: block;
    width: 100%;
    min-height: 96px;
    height: 96px;
    padding: 9px 12px;
    border: 1px solid var(--e-global-color-dcb0b6a, #e5e5e5);
    border-radius: 8px;
    resize: vertical;
}
.ks-vm-qa-form textarea:focus {
    border-color: var(--e-global-color-secondary, #DA6900);
    outline: none;
    box-shadow: 0 0 0 1px var(--e-global-color-secondary, #DA6900);
}
/* Doğrulama işareti: login formunun sözleşmesi (durum alanda, mesaj toast'ta). */
.ks-vm-qa-form textarea[aria-invalid="true"] {
    border-color: var(--ks-danger, #c8321f);
    box-shadow: 0 0 0 1px var(--ks-danger, #c8321f);
}
.ks-vm-qa-note {
    font-size: .82em;
    color: var(--e-global-color-01631af, #868686);
    line-height: 1.45;
}
.ks-vm-qa-submit-row {
    margin: 0 !important;
}
/* Gönder: yorum modalındaki "Yorumu Gönder" ile aynı — tam genişlik dolgulu. */
/* 🚨 Tema `.button` renk kurallarını bizden SONRA basıyor (metin görünmez
 * hâle geliyordu) — yorum modalındaki "Yorumu Gönder" ile aynı çözüm:
 * `body` ön eki + `!important` (o buton da aynı sebeple böyle). */
body .ks-vm-qa button.ks-vm-qa-submit {
    width: 100%;
    padding: 12px 24px;
    border: 0;
    border-radius: var(--ks-radius-pill, 999px);
    background: var(--e-global-color-primary, #212121) !important;
    color: #fff !important;
    font-size: .95em;
    font-weight: 600;
    letter-spacing: .3px;
    text-transform: capitalize;
    cursor: pointer;
    transition: opacity .15s ease;
}
body .ks-vm-qa button.ks-vm-qa-submit:hover,
body .ks-vm-qa button.ks-vm-qa-submit:focus {
    background: var(--e-global-color-primary, #212121) !important;
    color: #fff !important;
    opacity: .85;
}
.ks-vm-qa button.ks-vm-qa-submit.is-busy {
    opacity: .6;
    cursor: progress;
}

@media (max-width: 575px) {
    .ks-vm-qa-modal-body {
        padding: 24px 20px;
        max-height: 92vh;
    }
    .ks-vm-qa-head {
        gap: 12px;
    }
}

/* ═══════════════════════════════════════════════
 *  STICKY ÜST BAR (ürün özeti şeridi)
 * ═══════════════════════════════════════════════
 * Operatörün şablonun en üstüne koyduğu, Elementor "sticky: top" ayarlı özet
 * şeridi. İstenen davranış: sayfa açılışında YOK; ziyaretçi ana satın alma
 * butonlarını geçince üstten kayarak gelir, üste dönünce aynı yoldan gider.
 *
 * Yöntem: şerit akıştan tamamen çıkarılıp DAİMA fixed konumlanır (açılışta ne
 * şerit görünür ne de yerinde boşluk kalır). Elementor sticky aktifken bastığı
 * inline stiller (position:fixed; top:131px) zaten aynı değerler olduğu için
 * çakışmaz; onun akış yerine koyduğu spacer klonu gizlenir. Görünürlük yalnız
 * transform/opacity ile, state = body.ks-vm-bar-visible (frontend.js).
 *
 * Seçici iki katman: .ks-vm-sticky-bar sınıfını JS DOMready'de ekler; :has()
 * satırı ise JS'ten ÖNCE ilk boyamada şeridin görünmesini engeller (aynı
 * gövde, ayrı kural — :has bilmeyen eski tarayıcıda diğer kural sağ kalsın
 * diye listeye BİRLEŞTİRİLMEDİ). --ks-bar-top değerini JS, Elementor'un
 * sticky_offset ayarından okur; tek kaynak operatörün verdiği offset. */
.ks-vm-sticky-bar:not(.elementor-sticky__spacer) {
    position: fixed !important;
    left: 0;
    right: 0;
    top: var(--ks-bar-top, 131px);
    z-index: 89; /* sticky header'ın altında kalsın, içerikten üstte */
    margin: 0 !important;
    transform: translateY(calc(-100% - var(--ks-bar-top, 131px)));
    opacity: 0;
    pointer-events: none;
    /* Bu geçiş KAYBOLMA yönünde çalışır (sınıf kalkınca hesaplanan stil bu
     * kural olur). Opaklık bilinçli HIZLI (0.12s): sayfanın en üstünde header
     * akışa dönüp z-index'ini kaybediyor; bar'ın çıkışı oraya denk gelirse
     * üstüne çizilir (yaşandı) — bar daha yolun başında görünmez olunca bu
     * çakışma gözle seçilemiyor. */
    transition: transform 0.3s ease, opacity 0.12s ease;
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
}
.e-con[data-settings*='"sticky":"top"']:not(.elementor-sticky__spacer):has(.ks-vm-detached-buttons) {
    position: fixed !important;
    left: 0;
    right: 0;
    top: var(--ks-bar-top, 131px);
    z-index: 89;
    margin: 0 !important;
    transform: translateY(calc(-100% - var(--ks-bar-top, 131px)));
    opacity: 0;
    pointer-events: none;
    /* Bu geçiş KAYBOLMA yönünde çalışır (sınıf kalkınca hesaplanan stil bu
     * kural olur). Opaklık bilinçli HIZLI (0.12s): sayfanın en üstünde header
     * akışa dönüp z-index'ini kaybediyor; bar'ın çıkışı oraya denk gelirse
     * üstüne çizilir (yaşandı) — bar daha yolun başında görünmez olunca bu
     * çakışma gözle seçilemiyor. */
    transition: transform 0.3s ease, opacity 0.12s ease;
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
}
body.ks-vm-bar-visible .ks-vm-sticky-bar:not(.elementor-sticky__spacer) {
    transform: none;
    opacity: 1;
    pointer-events: auto;
    /* Belirme yönünün geçişi (sınıf eklenince bu hesaplanır) — yumuşak. */
    transition: transform 0.38s ease, opacity 0.25s ease;
}
/* :has() gizleme kuralının özgüllüğü yukarıdaki görünür-kuralı EZİYOR
 * ((0,4,0) > (0,2,1)) — görünür durumun :has karşılığı da şart. */
body.ks-vm-bar-visible .e-con[data-settings*='"sticky":"top"']:not(.elementor-sticky__spacer):has(.ks-vm-detached-buttons) {
    transform: none;
    opacity: 1;
    pointer-events: auto;
    transition: transform 0.38s ease, opacity 0.25s ease;
}
/* ── ELEMENTOR DÜZENLEYİCİSİ: gizleme/fixed katmanı DEVRE DIŞI (1 Ağu) ──
 * Sözleşme sınıfı sunucudan geldiği için editör tuvalinde de "daima fixed +
 * ekran dışı" kuralları uygulanıyor ve şerit HİÇ görünmüyordu — operatör
 * göremediğini düzenleyemez. Tuval gövdesi `elementor-editor-active` taşır;
 * orada şerit normal akışta + position:sticky (tuval kaydırılınca üstte
 * yapışık — editörde Elementor'un kendi sticky JS'i çalışmaz, bu onun
 * vekilidir). İki kural: sözleşme sınıfı + :has yedeği (ayrı yazıldı ki
 * :has bilmeyen bir ortam ilk kuralı düşürmesin). */
body.elementor-editor-active .ks-vm-sticky-bar:not(.elementor-sticky__spacer) {
    position: sticky !important;
    top: 0;
    transform: none !important;
    opacity: 1 !important;
    pointer-events: auto !important;
}
body.elementor-editor-active .e-con[data-settings*='"sticky":"top"']:not(.elementor-sticky__spacer):has(.ks-vm-detached-buttons) {
    position: sticky !important;
    top: 0;
    transform: none !important;
    opacity: 1 !important;
    pointer-events: auto !important;
}

/* Elementor sticky'nin akışa koyduğu klon — şerit akışta hiç yaşamadığı için
 * klonuna da yer yok. */
.elementor-sticky__spacer.ks-vm-sticky-bar,
.e-con[data-settings*='"sticky":"top"'].elementor-sticky__spacer:has(.ks-vm-detached-buttons) {
    display: none !important;
}

/* ═══════════════════════════════════════════════
 *  ALT SATIN ALMA BARI (.ks-vm-sticky-buy) — ÜST ŞERİTLE AYNI ANDA
 * ═══════════════════════════════════════════════
 * Operatörün Elementor'da kurduğu, tablet/telefonda ekranın altına sabitlenmiş
 * ([ks_footer_price] + [ks_footer_buttons]) konteyner. 19 Ağu 2026'ya kadar
 * sayfa açılır açılmaz oradaydı; operatör iki şey istedi:
 *   1. Üst şeritle **AYNI ANDA** gelsin (biraz kaydırdıktan sonra).
 *   2. Ürünün fiyatı henüz hesaplanmamışsa **HİÇ görünmesin** — fiyatsız bir
 *      bar "Sepete Ekle" diyip tutar yerine "Tüm ürün seçeneklerini belirleyin"
 *      cümlesini taşıyordu.
 *
 * 🔑 İKİ GÖVDE SINIFININ KESİŞİMİ, yeni bir zamanlama mantığı YOK:
 *   • `ks-vm-bar-visible` → üst şeridin zaten kullandığı kaydırma durumu
 *     (frontend.js::initStickyBar). Aynı sınıfa bağlanmak "aynı anda"yı
 *     TANIM GEREĞİ sağlıyor; ikinci bir eşik yazsaydık ikisi zamanla ayrışırdı.
 *   • `ks-vm-price-ready` → frontend.js::initBarActions, tutar kaynağında
 *     (`.ks-vm-summary-total-value`) sayı belirince basıyor. "Hesaplanıyor"
 *     ara durumunda bayrak DEĞİŞMEZ, yani varyasyon değişiminde bar yanıp
 *     sönmüyor.
 *
 * Elementor konteyneri `position:fixed; bottom:0` olarak kuruyor ve TRANSFORM
 * KULLANMIYOR (post-775.css ile doğrulandı) — o yüzden gizleme/gösterme
 * transform+opacity ile yapılabiliyor, konumlandırmasına hiç dokunmadan.
 * `pointer-events:none` şart: bar görünmezken ekranın alt şeridindeki
 * dokunuşları yutmasın. */
.ks-vm-sticky-buy:not(.elementor-sticky__spacer) {
    transform: translateY(100%);
    opacity: 0;
    pointer-events: none;
    /* Kaybolma yönü (sınıf kalkınca hesaplanan stil bu kural olur) — üst
     * şeritteki değerlerin aşağı yöndeki karşılığı. */
    transition: transform 0.3s ease, opacity 0.12s ease;
}
body.ks-vm-bar-visible.ks-vm-price-ready .ks-vm-sticky-buy:not(.elementor-sticky__spacer) {
    transform: none;
    opacity: 1;
    pointer-events: auto;
    /* Belirme yönü — üst şeritle aynı eğri, iki bar birlikte giriyor. */
    transition: transform 0.38s ease, opacity 0.25s ease;
}
/* ── ELEMENTOR DÜZENLEYİCİSİ: gizleme katmanı DEVRE DIŞI ──
 * Üst şeritteki gerekçenin aynısı: sözleşme sınıfı sunucudan geldiği için
 * tuvalde de gizlenirdi ve operatör göremediğini düzenleyemez. */
body.elementor-editor-active .ks-vm-sticky-buy:not(.elementor-sticky__spacer) {
    transform: none !important;
    opacity: 1 !important;
    pointer-events: auto !important;
}

/* Şeritteki başlık: varyasyon URL'lerinde başlık uzun (ürün adı + tüm seçim
 * değerleri). nowrap+ellipsis YETMEDİ: başlığın kolonu content genişliğine
 * büyüyüp (1002px ölçüldü) butonların altına giriyordu — flex öğelerinin
 * varsayılan `min-width:auto`su daralmayı engelliyor. Zincirdeki her katmana
 * daralma izni + EN FAZLA 2 SATIRA sarma, taşan üç noktayla kesilir
 * (operatör: taşacağına ikinci satıra insin, 31 Tem). */
.ks-vm-sticky-bar .e-con,
.ks-vm-sticky-bar .e-con-inner,
.ks-vm-sticky-bar .elementor-widget-wl-single-product-title,
.ks-vm-sticky-bar .elementor-widget-wl-single-product-title .elementor-widget-container {
    min-width: 0;
}
/* Başlığın SARMALAYICISI inline-block geliyor ve içeriğinden ~8px uzun
 * ölçülüyor (içindeki satır kutusu artığı) → başlığın altında hayalet boşluk
 * (operatör bildirdi). Blok yapınca kutu içeriğine oturuyor; sol hizalı
 * kolonda blok başlığın yan etkisi yok. */
.ks-vm-sticky-bar .elementor-widget-wl-single-product-title .elementor-widget-container {
    display: block;
}
.ks-vm-sticky-bar .product_title {
    /* !important ŞART: tema başlığı inline-block yapıyor ve o kazanınca
     * line-clamp çalışmıyor (yalnız -webkit-box'ta işler) + inline-block'un
     * kendi baseline boşluğu doğuyor. */
    display: -webkit-box !important;
    -webkit-box-orient: vertical;
    -webkit-line-clamp: 2;
    line-clamp: 2;
    overflow: hidden;
    overflow-wrap: break-word;
}

/* Şerit butonlarının KOMPAKT hâli: ana form butonlarıyla aynı bileşen, yalnız
 * kutu küçülür (taban kural 46px'i !important ile sabitliyor, o yüzden burada
 * da !important şart). Renk/ikon/hover davranışına DOKUNULMAZ. */
.ks-vm-sticky-bar .ks-vm-atc-btn,
.ks-vm-sticky-bar .ks-vm-buy-now-btn {
    min-height: 36px !important;
    font-size: 0.85em !important;
    padding-left: 18px !important;
    padding-right: 18px !important;
}

/* ── [ks_add_to_cart_buttons_compact] — sticky bar aksiyon alanı ──
 *
 * v2.174.0 (operatör, 31 Tem akşam): üstte CANLI TUTAR, altında miktar
 * kontrolü + Sepete Ekle; Hemen Satın Al bu varyantta yok. Tutar ve miktar
 * formdaki gerçek kontrollerin AYNASI (frontend.js::initBarActions) — burada
 * yalnız görünüm var, hesap yok.
 *
 * Çift sınıf seçici bilinçli: tabanın media/container-query stacking kuralları
 * aynı özgüllükte; bir kademe yukarı çıkınca koşulsuz kazanıyor. */
.ks-vm-detached-buttons.ks-vm-detached-buttons--compact {
    flex-direction: column;
    align-items: stretch;
    flex-wrap: nowrap;
    gap: 2px;
    min-width: 0;
}

.ks-vm-sticky-bar .ks-vm-rating-summary {
    font-size: 0.8em;
}

/* Alt satır: [Sepete Ekle] [Hemen Satın Al] (v2.177.0 — adet seçici kalktı,
 * buy-now geri geldi). Butonlar DAİMA %50-%50 (operatör, 1 Ağu); ASLA alt
 * alta düşmez, yer daralırsa etiketler üç noktayla kısalır. */
.ks-vm-bar-row {
    display: flex;
    align-items: stretch;
    justify-content: flex-end;
    gap: 8px;
    min-width: 0;
}
.ks-vm-detached-buttons.ks-vm-detached-buttons--compact .ks-vm-atc-btn,
.ks-vm-detached-buttons.ks-vm-detached-buttons--compact .ks-vm-buy-now-btn {
    /* Taban 46px kuralı !important — küçük kutu için burada da şart. */
    min-height: 36px !important;
    font-size: 0.85em !important;
    padding-left: 18px !important;
    padding-right: 18px !important;
    /* Daima yarı yarıya (operatör, 1 Ağu): taban `calc(50% - 4px)` (4px =
     * 8px gap'in yarısı) — iki buton her genişlikte eşit bölüşür, etiketler
     * sıkışınca üç noktayla kısalır.
     * 🚨 min-width'te !important ŞART: taban ATC kuralı 185px !important
     * taşıyor (satır ~341, tema eşitlemesi) ve dar kapta yarı bölüşümü kırıp
     * 185/51 dağıtıyordu (ölçüldü). */
    flex: 1 1 calc(50% - 4px);
    min-width: 0 !important;
    white-space: nowrap;
}
/* Etiket, buton (inline-flex) içinde daralabilen tek parça: ikon sabit (1em,
 * flex:0 0 auto), fazlalık etiketten kırpılır.
 * 🚨 line-height:1 (genel .ks-vm-btn-label kuralı) + overflow:hidden birlikte
 * p/g/y bacaklarını KESER (yaşandı) — 1.4 satır kutusu descender'ı içine alır. */
.ks-vm-detached-buttons--compact .ks-vm-btn-label {
    min-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
    line-height: 1.4;
    /* ⭐ OPTİK DÜZELTME BURADA GEÇERSİZ (operatör, 15 Ağu 2026: "sticky
     * şeritteki ufak butonlarda label yukarıda duruyor gibi").
     *
     * Genel `.ks-vm-btn-label` kuralı etiketi 0.0375em yukarı alıyor (yazı
     * tipinin metrik kutusu yukarı şişkin). Ölçüm (8× render, mürekkep
     * taraması) o düzeltmenin YALNIZ büyük butonda gerektiğini gösterdi:
     *
     *            düzeltmesiz      düzeltmeli
     *   büyük     +1.25px          +0.63px      ← aşağıdaydı, düzeldi
     *   kompakt   −0.13px          −0.64px      ← zaten ortaydı, yukarı kaçtı
     *
     * Fark kutu ölçülerinden geliyor: 46px/15.2px ile 36px/13.6px satır
     * kutuları farklı yuvarlanıyor ve içerik bloğu (İKON DAHİL — ikonun
     * sapması da zıt: büyükte +0.69, kompaktta −0.25) zıt yönlerde oturuyor.
     * Tek bir em değeri ikisini birden ortalayamaz. */
    transform: none;
}

/* (Mini adet dropdown'ı ve stepper v2.177.0'da kaldırıldı — miktar ana formda.) */


/* Bar parçalarını taşıyan Elementor WIDGET'ları daima kaplarının %100'üne
 * yayılır (operatör, 1 Ağu akşam: "iki shortcode da alan genişliğine uyum
 * sağlamalı"). Elementor düzeninde widget'a içerik/auto genişlik verilince
 * fiyat 253px'e düşmüş, buton widget'ı 0'a inmişti (ölçüldü) — shortcode
 * kökleri width:100% olsa da SARMALAYICI widget dar kalınca eziliyorlardı.
 * :has ile içerikten tanınır; !important Elementor'un genişlik ayarını ezer.
 * 🚨 Menu Cart HARİÇ: mini cart satır fiyatı da .ks-vm-bar-total taşıyor
 * (v2.185.0) ve bu kural header'daki sepet widget'ını %100'e yayıp ikonu
 * sola kaydırıyordu (ölçüldü) — ikon kendi içerik genişliğinde kalmalı. */
.elementor-widget:has(.ks-vm-bar-total):not(.elementor-widget-woocommerce-menu-cart),
.elementor-widget:has(.ks-vm-detached-buttons--compact) {
    width: 100% !important;
    max-width: 100% !important;
}

/* Fiyat oluşmamışken ([ks_bar_price] is-prompt durumunda) yalnız iç div değil
 * SARMALAYICI WIDGET da tamamen yok olur — sıfır yükseklikli widget bile
 * konteyner gap'inde boş bir dilim bırakıyordu (operatör: "hiç alan
 * kaplamasın", 1 Ağu). is-prompt'u JS bastığı için düzenleyicide widget
 * görünür ve seçilebilir kalır. */
.elementor-widget:has(.ks-vm-bar-total.is-prompt) {
    display: none;
}

/* ═══════════════════════════════════════════════
 *  STICKY BAR FİYAT ALANI (bağımsız)
 * ═══════════════════════════════════════════════
 * [ks_add_to_cart_buttons_compact] üstündeki tutar. İçerik formdaki Tutar
 * satırının CANLI KOPYASI ama iç sınıflar bar'a çevrilir
 * (ks-vm-summary-* → ks-vm-bar-price-*, frontend.js::initBarActions) —
 * yani form stilleri buraya SIZMAZ; fiyatın bar'daki görünümüyle ilgili
 * her şey YALNIZ bu bölümden yönetilir. Değerler bugün formdakiyle aynı
 * (görsel değişmesin diye); operatör buradan serbestçe ayrıştırabilir. */

/* Kap: hizalama, boyut, tek satır davranışı. */
.ks-vm-bar-total:not(.ks-price) { /* v2.428.4: KS Fiyat widget'ı (.ks-price) kendi CSS'ini taşır */
    /* Fiyat DAİMA secondary (operatör, 31 Tem); eski tutar kendi grisini
     * korur, is-prompt (yönlendirme cümlesi) normal renge döner. */
    color: var(--e-global-color-secondary, #d83b3b);
    min-width: 0;
    /* Flex sıra: [Kargo Bedava rozeti][tutar] — sağa yaslı, dikey ortalı.
     * (Operatörün .ks-vm-bar-total-value{display:flex} ayarı değeri kendi
     * satırına düşürüyordu; rozet fiyatın SOLUNDA durmalı — 1 Ağu.) */
    display: flex;
    align-items: center;
    justify-content: flex-end;
    gap: 6px;
    text-align: right;
    font-weight: 600;
    font-size: 0.95em;
    line-height: 1.3;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

/* Seçim eksikken görünen yönlendirme cümlesi hâli (sayı yok → JS `is-prompt`
 * sınıfını basar). Şu an tutarla aynı görünüyor; farklılaştırmak için buraya
 * yazın (ör. color / font-weight). */
.ks-vm-bar-total.is-prompt {
    /* Fiyat oluşturacak seçim yoksa alan HİÇ render edilmez (operatör, 31 Tem
     * akşam) — yönlendirme cümlesi bar'da gösterilmiyor. */
    display: none;
}

/* Kargo Bedava rozeti (v2.177.1) — fiyatın solunda, indirim rozetiyle aynı
 * dil; Phosphor gift ikonu. Yalnız üründe bedava kargo bayrağı varken basılır
 * (sunucu karar verir). */
.ks-vm-bar-ship-badge {
    /* Varsayılan GİZLİ — yalnız fiyat oluşunca görünür (aşağıda is-priced);
     * böylece JS'siz bağlamlarda (editör, ilk boyama) rozet tek başına
     * belirmez (operatör, 1 Ağu). */
    display: none;
    align-items: center;
    gap: 4px;
    margin: 0;
    margin-right: 4px;
    padding: 3px 6px 2px 6px;
    font-size: .75em;
    font-weight: 600;
    /* Yumuşak rozet (operatör, 1 Ağu): zemin saydamlaştırılmış secondary
     * (%12 ton), kenarlık KESKİN düz secondary, yazı+ikon secondary
     * (ikon currentColor'dan alır). */
    color: var(--e-global-color-secondary, #d83b3b);
    background: color-mix(in srgb, var(--e-global-color-secondary, #d83b3b) 8%, transparent);
    border: 1px solid color-mix(in srgb, var(--e-global-color-secondary, #d83b3b) 75%, transparent);
    border-radius: 4px;
    white-space: nowrap;
    flex: 0 0 auto;
}
.ks-vm-bar-ship-badge .ph {
    font-size: 1.2em;
    line-height: 1em;
    padding-top: 1px;
}


/* Fiyat oluştu (JS is-priced basar) → rozet görünür. */
.ks-vm-bar-total.is-priced .ks-vm-bar-ship-badge {
    display: inline-flex;
}

/* İndirim rozeti (%10 vb.). */
.ks-vm-bar-price-badge {
    display: inline-block;
    margin: 0 2px;
    padding: 4px;
    line-height: 1;
    font-size: .8em;
    font-weight: 700;
    color: #fff;
    background: var(--e-global-color-secondary, #d83b3b);
    border-radius: 4px;
    white-space: nowrap;
    vertical-align: middle;
}

/* Üstü çizili normal tutar. */
.ks-vm-bar-price-old {
    color: #999;
    font-weight: 600;
    text-decoration: line-through;
    padding: 0 3px;
    font-size: .9em;
}

/* Geçerli (indirimli) tutar. */
.ks-vm-bar-price-new {
    font-weight: 700;
    text-decoration: none;
    vertical-align: middle;
    font-size: 1.4em;
    background: transparent;
    letter-spacing: -0.3px;
    line-height: 1;
}

/* İndirimsiz tutar: indirimli (`-new`) ile BİREBİR aynı yazılır — JS düz
 * tutarı da .ks-vm-bar-price-new sınıfıyla sarar (tipografi hep tek yerden),
 * bu modifier YALNIZ rengi Elementor text rengine çevirir (operatör, 31 Tem). */
.ks-vm-bar-price-new.ks-vm-bar-price-plain {
    color: var(--e-global-color-text, #212121);
}

.ks-vm-bar-total-value:not(.ks-price__parts) {
    display: flex;
    flex-direction: row;
    justify-content: flex-end;
    align-items: center;
}

/* ── KS REVIEWS: iki dilli katman (v2.176.0, operatör 31 Tem akşam) ──
 * Ayraç: ziyaretçinin dilindeki yorumlar ile diğer dildekiler arasındaki
 * çizgi+etiket. Çevir bağlantısı: yalnız yabancı dilli yorumlarda, DeepL
 * anahtarı tanımlıysa (reviews.js koyar). */
.ks-vm-rv-divider {
    display: flex;
    align-items: center;
    gap: 12px;
    margin: 15px;
    color: #767676;
    font-size: 0.85em;
}
.ks-vm-rv-divider::before,
.ks-vm-rv-divider::after {
    content: "";
    flex: 1 1 auto;
    border-top: 1px solid rgba(0, 0, 0, 0.12);
}
.ks-vm-rv-divider span {
    flex: 0 0 auto;
}

.ks-vm-rv-translate {
    display: inline-block;
    margin-top: 6px;
    padding: 0 !important;
    border: 0 !important;
    background: transparent !important;
    color: var(--e-global-color-primary, #212121);
    font-size: 0.85em;
    text-decoration: underline;
    text-underline-offset: 3px;
    cursor: pointer;
}
.ks-vm-rv-translate.is-loading {
    opacity: 0.5;
    pointer-events: none;
}

.ks-vm-rv-hidden {
    display: none !important;
}
.ks-vm-rv-trbox .ks-vm-rv-mt-note {
    display: block;
    margin-top: 4px;
    color: #999;
    font-size: 0.8em;
}

/* Yabancı dilli yorumun bayrağı — yazar adının solunda (v2.176.1). */
.ks-vm-rv-flag {
    display: inline-block;
    width: 18px;
    height: auto;
    margin-right: 6px;
    vertical-align: -2px;
    border-radius: 2px;
}

/* ── FOOTER varyantı: [ks_footer_price] + [ks_footer_buttons] (v2.181.0) ──
 * Operatör: footer'dakiler üst bardan ayrı yönetilsin — rozetler (Kargo
 * Bedava + indirim %) fiyatın SAĞINDA, butonlar daha büyük. Ortak motor
 * aynı; yalnız bu değiştirici sınıflar farklı. */

/* Dikey düzen (operatör, 2 Ağu; kargo altta — aynı gün ikinci istek): hepsi
 * SOLA yaslı, üç satır —
 *   1) [%rozeti][eski fiyat]   2) [yeni fiyat]   3) [Kargo Bedava].
 * Kap grid; değer span'i display:contents ile şeffaflaşır, içindeki
 * rozet/eski/yeni doğrudan grid hücrelerine yerleşir. Kargo rozeti DOM'da
 * fiyattan önce ama grid-row ile EN ALTA iner. */
.ks-vm-bar-total--footer {
    display: grid;
    grid-template-columns: max-content 1fr;
    justify-content: start;
    justify-items: start;
    align-items: center;
    row-gap: 4px;
    column-gap: 6px;
    text-align: left;
}
.ks-vm-bar-total--footer .ks-vm-bar-total-value:not(.ks-price__parts) {
    display: contents;
}
.ks-vm-bar-total--footer .ks-vm-bar-price-badge { grid-row: 1; grid-column: 1; margin: 0; }
.ks-vm-bar-total--footer .ks-vm-bar-price-old   { grid-row: 1; grid-column: 2; }
.ks-vm-bar-total--footer .ks-vm-bar-price-new   { grid-row: 2; grid-column: 1 / -1; }
/* 18 Ağu 2026 (operatör): alt barda Kargo Bedava rozeti ARTIK BASILMIYOR
 * (KS_VM_Cart::bar_price_shortcode, tag kontrolü) — rozetin satır kuralları da
 * bu yüzden kaldırıldı. Üst sticky bardaki rozet olduğu gibi duruyor. */
/* İndirim yokken (eski fiyat hiç basılmaz) boş 1. satırın gap izi kalmasın:
 * yeni fiyat 1. satıra çekilir. */
.ks-vm-bar-total--footer:not(:has(.ks-vm-bar-price-old)) .ks-vm-bar-price-new  { grid-row: 1; }
/* İNDİRİMSİZ FİYAT DİKEYDE ORTALANIR (operatör, 19 Ağu 2026).
 *
 * Fiyat kolonu (Elementor konteyneri, mobilde `--align-items: flex-start`)
 * ~72px yüksek; indirimli fiyat iki satır (~45px) olduğu için orayı neredeyse
 * dolduruyor ve ortalanmış görünüyor. İndirim YOKSA tek satır (~21px) kalıyor
 * ve kolonun ÜSTÜNE yapışıyordu.
 *
 * 🔑 Operatörün panel ayarına (kolonun `align-items: flex-start`i) DOKUNULMUYOR
 * — yalnız fiyat widget'ı kendi hizasını alıyor (`align-self`), o da sadece
 * eski fiyatın basılmadığı durumda. Kolonun dolgusu simetrik (15/15), bu yüzden
 * içerik kutusunda ortalamak barın kendisinde de ortalıyor (ölçüldü).
 *
 * ⚠️ Seçici üç sınıf (0,3,0): Elementor'un widget'lara verdiği hizalama
 * kuralını geçebilmek için `.e-con` halkası ŞART, kısaltma.
 *
 * 🚨 `:has()` İÇİNE `:has()` YAZILAMAZ — ilk yazımda koşul
 * `:has(.ks-vm-bar-total--footer:not(:has(.ks-vm-bar-price-old)))` idi; seçici
 * tümüyle GEÇERSİZ olduğu için kural sessizce düştü (ölçümle yakalandı, fiyat
 * kutusu kılı kıpırdamadı). İki koşul AYRI bileşenlere ayrıldı: `:has(...)` +
 * `:not(:has(...))`. `:not()` içinde `:has()` serbest. */
.ks-vm-sticky-buy .e-con .elementor-widget:has(.ks-vm-bar-total--footer):not(:has(.ks-vm-bar-price-old)) {
    align-self: center;
}

/* Footer butonları: kompakttan bir boy büyük (42px). Kompakt kuralla aynı
 * özgüllük — SONRA geldiği için kazanır; !important taban 46px kuralına karşı. */
.ks-vm-detached-buttons.ks-vm-detached-buttons--footer .ks-vm-atc-btn,
.ks-vm-detached-buttons.ks-vm-detached-buttons--footer .ks-vm-buy-now-btn {
    min-height: 42px !important;
    font-size: 0.95em !important;
    padding-left: 22px !important;
    padding-right: 22px !important;
}

/* ============================================================================
 * MOBİL HAYALET BOŞLUK KİLİDİ — sepete ekleme formunun altındaki ~689px
 * ----------------------------------------------------------------------------
 * Elementor mobilde HER konteynere `flex-wrap: wrap` varsayılanını basar.
 * Ürün özet sütunu (`7c19487`) sütun yönlü bir flex konteyner; sarma açıkken
 * tarayıcı, içindeki sepete-ekleme widget'ının yüksekliğini "intrinsic" ölçümle
 * belirlemek zorunda kalıyor ve VillaTheme Swatches'ın `display:grid`'e
 * çevirdiği varyasyon tablosu yüzünden bu ölçüm gerçek yerleşimden ~689px
 * büyük çıkıyor. Sonuç: widget kutusu 1299px, içeriği 610px — aradaki fark
 * "Tutar" satırının altında açıklanamayan bir boşluk olarak duruyor.
 *
 * Doğru ayar panelde de var (konteyner → Düzen → Wrap = No wrap, mobil sekmesi)
 * ama 17 Ağu ve 18 Ağu'da iki kez, editörden yapılan kapsamlı kaydetmelerle
 * şablondan silindi. Bu kural o ayarı koddan sabitler: sütun yönlü bir
 * konteynerde sarma zaten anlamsız, dolayısıyla tasarımda hiçbir şeyi
 * değiştirmez — yalnızca hatanın geri dönmesini imkânsız kılar.
 * ========================================================================== */
@media (max-width: 767px) {
    body.single-product .elementor-element.e-con.elementor-element-7c19487 {
        flex-wrap: nowrap;
    }
}

/* ───────────────────────────────────────────────────────────────────────────
 *  GALERİ VİDEO SLAYTLARI (2 Eyl 2026, v2.398.0 · operatör kararı)
 *
 *  Video slaydı = POSTER karesi (<img>, fotoğrafla aynı 3:4 kurallardan geçer)
 *  + ortada oynat düğmesi. Tıklanınca gallery-swap.js slayda <video> ekler
 *  (`is-playing`): poster ve düğme gizlenir, video çerçeveyi CONTAIN ile
 *  doldurur (dikey/yatay video kırpılmaz, boşluklar siyah). Slayt değişince
 *  video sökülür. Şeritte küçük oynat rozeti. Mercek/yan panel video slaydında
 *  kapalı (gallery.js measure()). Lightbox'ta video lightGallery'nin `html`
 *  slaydında açılır — kartı tamamen doldurur (aşağıdaki .lg-video kuralları).
 * ─────────────────────────────────────────────────────────────────────────── */
.wlpro-product-thumbnails .woolentor-learg-img .slick-slide.ks-vm-video-slide,
.wlpro-product-thumbnails .woolentor-thumbnails .woolentor-thumb-single.ks-vm-video-slide {
    position: relative;
}
.ks-vm-video-play {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    z-index: 5; /* mercek (4) üstünde, rozetler (7) altında */
    width: 64px;
    height: 64px;
    padding: 0;
    border: 0;
    border-radius: 50%;
    background: rgba(0, 0, 0, .55);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    cursor: pointer;
    box-shadow: 0 4px 16px rgba(0, 0, 0, .25);
    transition: background-color .15s ease, transform .15s ease;
}
.ks-vm-video-play:hover,
.ks-vm-video-play:focus-visible {
    background: rgba(0, 0, 0, .75);
    transform: translate(-50%, -50%) scale(1.06);
}
.ks-vm-video-play svg {
    width: 28px;
    height: 28px;
    margin-inline-start: 4px; /* üçgen optik olarak ortalansın */
    fill: currentColor;
}
.ks-vm-video-slide.is-playing > img,
.ks-vm-video-slide.is-playing > .ks-vm-video-play {
    visibility: hidden; /* yer korunur: çerçeve oranı posterden geliyor */
}
.ks-vm-video-slide > video.ks-vm-video {
    position: absolute;
    inset: 0;
    z-index: 6;
    width: 100%;
    height: 100%;
    object-fit: contain;
    background: #000;
    border-radius: inherit;
}
/* Şerit rozeti */
.ks-vm-video-badge {
    position: absolute;
    left: 50%;
    top: 50%;
    transform: translate(-50%, -50%);
    width: 28px;
    height: 28px;
    border-radius: 50%;
    background: rgba(0, 0, 0, .55);
    color: #fff;
    display: flex;
    align-items: center;
    justify-content: center;
    pointer-events: none;
    box-shadow: 0 2px 8px rgba(0, 0, 0, .25);
}
.ks-vm-video-badge svg {
    width: 14px;
    height: 14px;
    margin-inline-start: 2px;
    fill: currentColor;
}
/* Lightbox (3:4 kart): lightGallery'nin 16:9 padding hilesini kapat, kartı doldur. */
body.single-product .lg-outer .lg-video-cont {
    display: block;
    width: 100%;
    height: 100%;
    max-width: none !important; /* lg-video eklentisi satır-içi videoMaxWidth (855px) yazıyor */
    max-height: none;
    padding: 0;
}
body.single-product .lg-outer .lg-video {
    position: relative;
    width: 100%;
    height: 100%;
    padding-bottom: 0;
    background: #000;
}
body.single-product .lg-outer .lg-video video {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    object-fit: contain;
}

/* ───────────────────────────────────────────────────────────────────────────
 *  MASAÜSTÜNDE ŞERİT = IZGARA (2 Eyl 2026 · operatör)
 *  ≥1025px'te gallery.js şeridi slick'ten çıkarır (`unslick`) ve `.ks-vm-thumb-grid`
 *  ekler: küçük kareler ok olmadan satırlara sarılır. Sütun sayısı Woolentor'un
 *  şerit değeriyle aynı (6). Tablet/mobilde slick şeridi okla kalır (bu blok
 *  yalnız sınıf varken işler).
 * ─────────────────────────────────────────────────────────────────────────── */
.wlpro-product-thumbnails .woolentor-thumbnails.ks-vm-thumb-grid {
    display: flex;
    flex-wrap: wrap;
    gap: var(--ks-gal-thumb-gap, 10px);
    margin: 10px 0 0;
}
.wlpro-product-thumbnails .woolentor-thumbnails.ks-vm-thumb-grid .woolentor-thumb-single {
    flex: 0 0 auto;
    width: calc((100% - var(--ks-gal-thumb-gap, 10px) * (var(--ks-gal-thumb-cols, 6) - 1)) / var(--ks-gal-thumb-cols, 6));
    padding: 0;
}

/* ───────────────────────────────────────────────────────────────────────────
 *  BEDEN/ÖLÇÜ TABLOSU LIGHTBOX'I (2 Eyl 2026 · v2.401.0)
 *  Ürün galerisinin 3:4 kartı tabloyu kırpardı; bu örnekte kart ilk görselin
 *  oranını (`--ks-lg-ratio`, size-chart.js yazar) alır ve görsel contain ile
 *  tamamı görünür. Ürün galerisi kuralları `body.single-product .lg-outer`
 *  seçicisiyle geldiği için buradaki seçici daha özgül (sınıf eklenmiş).
 * ─────────────────────────────────────────────────────────────────────────── */
body.single-product .lg-outer.ks-vm-size-lg .lg {
    width: min(92vw, calc(88vh * var(--ks-lg-ratio, 1))) !important;
    height: min(88vh, calc(92vw / var(--ks-lg-ratio, 1))) !important;
}
body.single-product .lg-outer.ks-vm-size-lg .lg-inner {
    background: #fff;
}
body.single-product .lg-outer.ks-vm-size-lg .lg-image {
    object-fit: contain;
    background: #fff;
}
.ks-size-chart-open,
.elementor-element-2c39135 {
    cursor: pointer;
}

/* TON GRUBU SATIRI (2 Eyl 2026 · v2.403.x): Uç Tipi / Form ile AYNI dropdown iskeleti;
 * stil yukarıdaki `.ks-vm-option-select` gruplarına `.ks-vm-tone-select` eklenerek
 * paylaşılır (etiket `th.label > label`, kutu adet-dropdown.js). Ayrı kural yok.
 * (İlk sürümdeki pill'ler operatör isteğiyle kaldırıldı.) */

/* Ton Grubu dropdown'ı: seçim değişip yeni sayfa gelene kadar etiketin SOLUNDA
 * spinner (ks-buttons.css `.ks-btn.is-loading` çarkının aynısı; keyframes burada
 * ayrıca tanımlı, ürün sayfasında ks-buttons.css yüklü olmayabilir). Native
 * select'in içine eleman konamadığı için çark hücreye çizilir (tone-family.js
 * sol boşluğu açar) ve kutu kilitlenir. */
.ks-vm-tone-row td.is-loading {
    position: relative;
    cursor: progress;
}
.ks-vm-tone-row td.is-loading > select {
    pointer-events: none;
    color: #777 !important; /* etiket soluk (operatör): gidiliyor, artık düzenlenemez */
}
.ks-vm-tone-row td.is-loading > .ks-vm-tone-spinner {
    color: #777;
}
.ks-vm-tone-spinner {
    position: absolute;
    top: 50%;
    width: 1em;
    height: 1em;
    margin-top: -0.5em;
    border: 2px solid currentColor;
    border-top-color: transparent;
    border-radius: 50%;
    box-sizing: border-box;
    color: var(--e-global-color-text, #212121);
    pointer-events: none;
    z-index: 2;
    animation: ks-vm-tone-spin 0.6s linear infinite;
}
@keyframes ks-vm-tone-spin {
    to { transform: rotate(360deg); }
}
@media (prefers-reduced-motion: reduce) {
    .ks-vm-tone-spinner { animation-duration: 1.5s; }
}

/* ───────────────────────────────────────────────────────────────────────────
 *  ÜRÜN SAYFASI "TUTAR" SATIRI — İNDİRİMLİ DİZİLİM (3 Eyl 2026 · operatör)
 *  Sıra: [rozet] [YENİ tutar] [eski tutar, çizili]; üçü yatay eksende ORTALI.
 *  Ölçülen sebep: kap inline-flex/center olsa da del (lh 1.3), ins (lh 1) ve
 *  içindeki 1.4em rakamların kutuları farklıydı, bdi taşıyordu → satır başı
 *  kayıyordu. Üç öğe de inline-flex + line-height 1'e çekilir, boşluk gap'ten.
 *  Kapsam yalnız form satırı (tr.ks-vm-summary-total-line); sticky bar
 *  ([ks_bar_price]) kendi sırasında kalır.
 * ─────────────────────────────────────────────────────────────────────────── */
.ks-vm-summary-total-line .ks-vm-summary-total-value {
    display: inline-flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
    line-height: 1;
}
.ks-vm-summary-total-line .ks-vm-summary-total-value > .ks-vm-summary-badge { order: 1; margin: 0; }
.ks-vm-summary-total-line .ks-vm-summary-total-value > .ks-vm-summary-new   { order: 2; }
.ks-vm-summary-total-line .ks-vm-summary-total-value > .ks-vm-summary-old   { order: 3; padding: 0; line-height: 1; }
.ks-vm-summary-total-line .ks-vm-summary-total-value > .ks-vm-summary-badge,
.ks-vm-summary-total-line .ks-vm-summary-total-value > .ks-vm-summary-new,
.ks-vm-summary-total-line .ks-vm-summary-total-value > .ks-vm-summary-old {
    display: inline-flex;
    align-items: center;
    vertical-align: middle;
}
/* 🚨 Rakam kutuları düz INLINE + baseline: inline-block + vertical-align:middle
 * (önceki tur) taban çizgisini 4px kaydırıyordu (ölçüldü) ve del'in çizgisi
 * inline-block torunlara geçmiyordu. */
.ks-vm-summary-total-line .ks-vm-summary-total-value .ks-vm-summary-new .woocommerce-Price-amount,
.ks-vm-summary-total-line .ks-vm-summary-total-value .ks-vm-summary-new .woocommerce-Price-amount bdi,
.ks-vm-summary-total-line .ks-vm-summary-total-value .ks-vm-summary-old .woocommerce-Price-amount,
.ks-vm-summary-total-line .ks-vm-summary-total-value .ks-vm-summary-old bdi {
    display: inline;
    line-height: 1;
    vertical-align: baseline;
}
.ks-vm-summary-total-line .ks-vm-summary-total-value .ks-vm-summary-old .woocommerce-Price-amount {
    text-decoration: line-through;
}

/* OPTİK ORTALAMA — TABAN ÇİZGİSİ + SABİT OFSET (3 Eyl 2026, 3. tur; text-box ve
 * kutu ortalama denemeleri operatörde tutmadı). Rakamların hepsi büyük harf
 * yüksekliğinde (alt çıkıntı yok): görsel merkez = taban çizgisi + cap/2.
 * Üç öğe taban çizgisine hizalanır; büyük tutar cap yüksekliği farkının yarısı
 * kadar (0,745 × (1,4−1) × 14,4px / 2 ≈ 2,1px = 0,149em) AŞAĞI kaydırılır.
 * Yalnız fontun cap oranına bağlı (Plus Jakarta 0,745; yedek fontlar ~0,70 →
 * 0,1px sapma); simge yedek fontu, satır kutusu, text-box desteği ETKİLEMEZ. */
.ks-vm-summary-total-line .ks-vm-summary-total-value {
    align-items: baseline;
}
.ks-vm-summary-total-line .ks-vm-summary-total-value > .ks-vm-summary-badge,
.ks-vm-summary-total-line .ks-vm-summary-total-value > .ks-vm-summary-old,
.ks-vm-summary-total-line .ks-vm-summary-total-value > .ks-vm-summary-new {
    display: inline-block;
    line-height: 1;
    vertical-align: baseline;
}
/* Rozet kutusu YAZININ etrafına simetrik, fonttan bağımsız: line-height 0 → satır
 * kutusu içerik alanının ortasında sıfır yükseklikte (cap merkezinden ±0,5px),
 * kutu yalnız simetrik padding'den oluşur. Yükseklik 2 × 0,75em ≈ 21,6px. */
.ks-vm-summary-total-line .ks-vm-summary-total-value > .ks-vm-summary-badge { line-height: 0; padding: 0.75em 5px; }
.ks-vm-summary-total-line .ks-vm-summary-total-value > .ks-vm-summary-new { position: relative; top: 0.149em; }
.ks-vm-summary-total-line .ks-vm-summary-total-value .woocommerce-Price-amount,
.ks-vm-summary-total-line .ks-vm-summary-total-value .woocommerce-Price-amount bdi {
    display: inline;
    line-height: 1;
}
.ks-vm-summary-total-line .ks-vm-summary-total-value .ks-vm-summary-old .woocommerce-Price-amount {
    text-decoration: line-through;
}

/* ───────────────────────────────────────────────────────────────────────────
 *  İNDİRİMLİ FİYAT DİZİLİMİ — SABİT ÇUBUK, MİNİ SEPET, SEPET SAYFASI (4 Eyl 2026)
 *  Operatör: form Tutar satırındaki dizilim (rozet → yeni → çizili eski, hepsi
 *  yatayda ortalı) bu alanlarda da geçerli. Teknik form satırıyla AYNI: taban
 *  çizgisi hizası + büyük rakamı harf yüksekliği farkının yarısı kadar aşağı
 *  (0,3725 × (büyük − küçük punto)), rozet kutusu line-height 0 + simetrik padding.
 *  Kaydırma her alanın kendi punto oranından: bar yeni 1,4em/eski 0,9em →
 *  0,3725×(1,4−0,9)/1,4 = 0,133em; mini sepet ve sepet yeni 1,4em/eski 1em →
 *  0,3725×0,4/1,4 = 0,106em (ins puntosu 1,4em ise) / 0,149em (ins taban punto,
 *  içindeki amount 1,4em ise — mini sepet). Bar rozeti 0,8em → +0,047em.
 * ─────────────────────────────────────────────────────────────────────────── */
.ks-vm-bar-total-value:not(.ks-price__parts),
.ks-vm-cart-price-value {
    display: inline-flex;
    align-items: baseline;
    flex-wrap: wrap;
    gap: 8px;
    line-height: 1;
}
.ks-vm-bar-total .ks-vm-bar-total-value:not(.ks-price__parts) { display: flex; justify-content: flex-end; } /* bar: sağa yaslı kalsın */
.ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-summary-badge,   .ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-bar-price-badge, .ks-vm-cart-price-value > .ks-vm-cart-price-badge { order: 1; margin: 0; }
.ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-summary-new,     .ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-bar-price-new,   .ks-vm-cart-price-value > .ks-vm-cart-price-new   { order: 2; }
.ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-summary-old,     .ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-bar-price-old,   .ks-vm-cart-price-value > .ks-vm-cart-price-old   { order: 3; padding: 0; }
.ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-summary-badge,   .ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-bar-price-badge, .ks-vm-cart-price-value > .ks-vm-cart-price-badge,
.ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-summary-new,     .ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-bar-price-new,   .ks-vm-cart-price-value > .ks-vm-cart-price-new,
.ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-summary-old,     .ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-bar-price-old,   .ks-vm-cart-price-value > .ks-vm-cart-price-old {
    display: inline-block;
    line-height: 1;
    vertical-align: baseline;
    position: relative;
    top: 0;
}
/* Rozet kutusu yazının etrafında simetrik (line-height 0), yeni tutar taban puntosunda */
.ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-summary-badge, .ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-bar-price-badge, .ks-vm-cart-price-value > .ks-vm-cart-price-badge { line-height: 0; padding: 0.75em 5px; }
.ks-vm-bar-total-value:not(.ks-price__parts) .woocommerce-Price-amount, .ks-vm-bar-total-value:not(.ks-price__parts) .woocommerce-Price-amount bdi,
.ks-vm-cart-price-value .woocommerce-Price-amount, .ks-vm-cart-price-value .woocommerce-Price-amount bdi { display: inline; line-height: 1; vertical-align: baseline; }
.ks-vm-bar-total-value:not(.ks-price__parts) .ks-vm-summary-old .woocommerce-Price-amount, .ks-vm-bar-total-value:not(.ks-price__parts) .ks-vm-bar-price-old .woocommerce-Price-amount, .ks-vm-cart-price-value .ks-vm-cart-price-old .woocommerce-Price-amount { text-decoration: line-through; }
/* Optik kaydırmalar */
.ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-summary-new   { top: 0.149em; } /* mini sepet: ins taban punto, amount 1,4em */
.ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-bar-price-new { top: 0.133em; } /* bar: ins 1,4em, eski 0,9em */
.ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-bar-price-badge { top: 0.047em; } /* bar rozeti 0,8em */
.ks-vm-cart-price-value > .ks-vm-cart-price-new { top: 0.106em; } /* sepet: ins 1,4em, eski 1em */
/* Sepet/mini sepet indirimsiz tek tutarın eski +1px ofseti kalksın (taban çizgisi düzeninde gereksiz) */
.ks-vm-cart-price-value > .ks-vm-cart-price-new:only-child,
.elementor-menu-cart--cart-type-mini-cart .ks-vm-mc-price .ks-vm-bar-total-value:not(.ks-price__parts) > .ks-vm-summary-new:only-child { top: 0; }

/* ── Elementor başlık içindeki bağlantı, süslemeyi BAŞLIKTAN alır (6 Eyl 2026) ── */
/* Botiga `.entry-content a {text-decoration: underline}` verir; Elementor'un
   Heading > Text Decoration ayarı h1-h6'ya uygulanır, içindeki <a> temanın
   kuralını taşımaya devam eder → panelde "none" seçilse de altı çizili kalır
   (operatör, hikaye şeridi başlıkları; CDP ile ölçüldü). `inherit` ile
   paneldeki seçim ne ise bağlantı da onu alır; underline seçilirse yine çizilir. */
.entry-content .elementor-widget-heading .elementor-heading-title a,
.elementor-location-header .elementor-widget-heading .elementor-heading-title a,
.elementor-location-footer .elementor-widget-heading .elementor-heading-title a {
	text-decoration: inherit;
}


/* ═══════════════════════════════════════════════════════════════
 * ÜRÜN SAYFASI "PAKET SAYISI" SATIRI (v2.426.0, operatör 7 Eyl 2026)
 * Tutar'ın hemen üstünde, sepetteki paket sayacının birebir aynısı
 * (1'den başlar, −/+). Üç tuzak, üçü burada çözülür:
 *  1) body.ks-vm-adet-active form.cart .quantity {display:none} yerel miktar
 *     kutusunu gizler; bizim sarmalayıcı da .quantity → geri açılır.
 *  2) data-qty-initialized → Botiga .show sınıfını hiç basmaz, −/+ opacity:0
 *     kalır (mini sepet/sepet ile aynı çözüm).
 *  3) tema .quantity'ye margin-inline-end:20px + max-width:105px verir.
 * Ölçüler sepet sayacından kopya (40px yükseklik, 130px genişlik). */
body.ks-vm-adet-active form.cart .ks-vm-pack-row div.quantity {
    display: flex !important;
    box-sizing: border-box !important;
    width: 100% !important;
    max-width: 130px !important;
    height: 40px !important;
    min-height: 40px !important;
    margin: 0 !important;
    align-items: center !important;
    justify-content: space-between !important;
}
.ks-vm-pack-row .botiga-quantity-minus,
.ks-vm-pack-row .botiga-quantity-plus {
    opacity: 1 !important;
    visibility: visible !important;
    flex: 0 0 auto;
    width: 30px !important;
    height: 100% !important;
    padding: 0 0 4px 0 !important;
    display: flex !important;
    align-items: center !important;
    justify-content: center !important;
    line-height: 1 !important;
    font-size: 20px !important;
}
.ks-vm-pack-row div.quantity input.ks-vm-pack-input {
    flex: 1 1 auto;
    width: auto !important;
    min-width: 0;
    height: 100% !important;
    text-align: center;
    font-size: 0.9em !important;
    font-weight: 500 !important;
    font-family: inherit !important;
    color: #212121 !important;
    -moz-appearance: textfield;
    /* `qty` sınıfı olmadığı için temanın `.quantity .qty` sıfırlaması gelmez:
     * kutu çerçevesi/zemini/gölgesi burada sıfırlanır, sayı pill'in içinde durur. */
    border: 0 !important;
    background: transparent !important;
    box-shadow: none !important;
    padding: 0 !important;
    margin: 0 !important;
    border-radius: 0 !important;
    outline: none;
}
.ks-vm-pack-row div.quantity input.ks-vm-pack-input::-webkit-outer-spin-button,
.ks-vm-pack-row div.quantity input.ks-vm-pack-input::-webkit-inner-spin-button {
    -webkit-appearance: none;
    margin: 0;
}
/* 1 paketteyken − pasif (sepetle aynı dil). */
.ks-vm-pack-row .botiga-quantity-minus.ks-vm-qty-disabled,
.ks-vm-pack-row .botiga-quantity-plus.ks-vm-qty-disabled {
    opacity: 0.3 !important;
    cursor: not-allowed;
    pointer-events: none;
}

/* v2.469.1 (8 Eki 2026): bağlantı olan Elementor konteyneri (html_tag=a, ör. anasayfa uç tipi kartları) — Botiga .entry-content a altı çizgisini içindeki başlığa taşımasın */
.entry-content a.e-con, .entry-content a.e-con:hover { text-decoration: none; }
