{"product_id":"deneme-tavan","title":"[TEST] Ceiling Mount Native Variants","description":"\u003cstyle id=\"bs-deneme-css\"\u003e\n  \/* Hide cart \/ buy UI, configure only *\/\n  .product-form__submit,\n  .product-form__buttons,\n  button[name=\"add\"],\n  button[type=\"submit\"].product-form__submit,\n  .shopify-payment-button,\n  .shopify-payment-button__button,\n  dynamic-checkout,\n  .dynamic-checkout__content,\n  .product-form__quantity,\n  quantity-input,\n  .quantity,\n  .product__quantity,\n  buy-buttons,\n  .buy-buttons,\n  [data-shopify=\"payment-button\"],\n  form[action*=\"\/cart\/add\"] .product-form__buttons,\n  form[action*=\"\/cart\/add\"] button[type=\"submit\"],\n  form[action*=\"\/cart\/add\"] .shopify-payment-button {\n    display: none !important;\n    visibility: hidden !important;\n    height: 0 !important;\n    overflow: hidden !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    pointer-events: none !important;\n  }\n  #bs-configure-slot {\n    margin: 16px 0 8px;\n    width: 100%;\n  }\n  #bs-configure-slot .bs-sum {\n    margin: 0 0 12px;\n    font-size: 13px;\n    color: #666;\n    text-align: center;\n  }\n  #bs-configure-cta,\n  a.bs-cta.js-configure-cta {\n    display: block;\n    width: 100%;\n    box-sizing: border-box;\n    text-align: center;\n    background: #2c2c2c;\n    color: #fff !important;\n    padding: 14px 28px;\n    border-radius: 4px;\n    text-decoration: none !important;\n    font-weight: 600;\n    font-size: 15px;\n    line-height: 1.3;\n    border: none;\n    cursor: pointer;\n  }\n  #bs-configure-cta:hover,\n  a.bs-cta.js-configure-cta:hover {\n    background: #1a1a1a;\n    color: #fff !important;\n  }\n  #bs-configure-slot .bs-note {\n    margin: 10px 0 0;\n    font-size: 12px;\n    color: #8a8272;\n    text-align: center;\n  }\n  \/* More → chips (match prior pilot page) *\/\n  .bs-more-btn {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    min-height: 44px;\n    padding: 0 14px;\n    margin: 0 0 0 4px;\n    border: 1px dashed #c4bba8;\n    border-radius: 6px;\n    background: #fff;\n    color: #8a8272 !important;\n    font-size: 13px;\n    font-weight: 500;\n    line-height: 1.2;\n    text-decoration: none !important;\n    cursor: pointer;\n    white-space: nowrap;\n    vertical-align: middle;\n    box-sizing: border-box;\n  }\n  .bs-more-btn:hover {\n    border-color: #2c2c2c;\n    color: #2c2c2c !important;\n  }\n  \/* Dawn fieldset \/ pill rows *\/\n  fieldset.product-form__input .bs-more-btn,\n  .product-form__input .bs-more-btn,\n  variant-radios .bs-more-btn,\n  variant-selects .bs-more-btn {\n    margin-top: 0;\n  }\n\u003c\/style\u003e\n\n\u003c!-- Moved by JS under native variant pickers --\u003e\n\u003cdiv id=\"bs-configure-slot\" data-bs-configure-slot=\"1\"\u003e\n  \u003cp class=\"bs-sum\"\u003eSelected: \u003cstrong id=\"bs-config-summary\"\u003e1 shelf, 1 section · catalog 35X40X12 in\u003c\/strong\u003e\u003c\/p\u003e\n  \u003ca id=\"bs-configure-cta\" class=\"bs-cta js-configure-cta\" href=\"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAPoA-gBLAgUAEBS2gB-wEA\u0026amp;step=2\"\u003eContinue to Configurator\u003c\/a\u003e\n  \u003cp class=\"bs-note\"\u003eExact size and finish in the configurator. Frame only; glass not included.\u003c\/p\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n(function () {\n  if (window.__bsDenemeV4) return;\n  window.__bsDenemeV4 = true;\n\n  var CDN = \"https:\/\/cdn.shopify.com\/s\/files\/1\/0551\/5660\/5085\/files\/\";\n  var VIEWS = [\"front\", \"side\", \"top\", \"detail\"];\n  var LINKS = {\n    \"1-1\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAPoA-gBLAgUAEBS2gB-wEA\u0026step=2\",\n    \"1-2\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAPoA-gBLAgUAECS2gB-wEA\u0026step=2\",\n    \"1-3\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQATiQ-gBLAgUAEDS2gB-wEA\u0026step=2\",\n    \"1-4\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAXcA-gBLAgUAEES2gB-wEA\u0026step=2\",\n    \"2-1\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAPoA-gBLAgUAIBJbQB-wIAAQ\u0026step=2\",\n    \"2-2\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAPoA-gBLAgUAICJbQB-wIAAQ\u0026step=2\",\n    \"2-3\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAXcA-gBLAgUAIDJbQB-wIAAQ\u0026step=2\",\n    \"2-4\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAXcA-gBLAgUAIEJbQB-wIAAQ\u0026step=2\",\n    \"3-1\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAPoA-gBLAgUAMBGSMB-wMAAQI\u0026step=2\",\n    \"3-2\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAPoA-gBLAgUAMCGSMB-wMAAQI\u0026step=2\",\n    \"3-3\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAXcA-gBLAgUAMDGSMB-wMAAQI\u0026step=2\",\n    \"3-4\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAXcA-gBLAgUAMEGSMB-wMAAQI\u0026step=2\",\n    \"4-1\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAPoA-gBLAgUAQBEtoB-wQAAQID\u0026step=2\",\n    \"4-2\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAPoA-gBLAgUAQCEtoB-wQAAQID\u0026step=2\",\n    \"4-3\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAXcA-gBLAgUAQDEtoB-wQAAQID\u0026step=2\",\n    \"4-4\": \"https:\/\/brassshelf.com\/pages\/pages-custom-shelf-configurator?c=AQAXcA-gBLAgUAQEEtoB-wQAAQID\u0026step=2\"\n  };\n  var DIM = {\n    \"1-1\": \"35X40X12\", \"1-2\": \"45X40X12\", \"1-3\": \"50X40X12\", \"1-4\": \"55X40X12\",\n    \"2-1\": \"35X40X12\", \"2-2\": \"45X40X12\", \"2-3\": \"50X40X12\", \"2-4\": \"55X40X12\",\n    \"3-1\": \"35X50X12\", \"3-2\": \"45X50X12\", \"3-3\": \"50X50X12\", \"3-4\": \"55X50X12\",\n    \"4-1\": \"35X50X12\", \"4-2\": \"45X50X12\", \"4-3\": \"50X50X12\", \"4-4\": \"55X50X12\"\n  };\n  var ID_TO_KEY = {\n    \"48838970605725\": \"1-1\", \"48838970638493\": \"1-2\", \"48838970671261\": \"1-3\", \"48838970704029\": \"1-4\",\n    \"48838970736797\": \"2-1\", \"48838970769565\": \"2-2\", \"48838970802333\": \"2-3\", \"48838970835101\": \"2-4\",\n    \"48838970867869\": \"3-1\", \"48838970900637\": \"3-2\", \"48838970933405\": \"3-3\", \"48838970966173\": \"3-4\",\n    \"48838970998941\": \"4-1\", \"48838971031709\": \"4-2\", \"48838971064477\": \"4-3\", \"48838971097245\": \"4-4\"\n  };\n\n  var state = { shelves: 1, sections: 1 };\n  var lastKey = \"\";\n  var lastVid = \"\";\n  var placed = false;\n\n  function keyOf() { return state.shelves + \"-\" + state.sections; }\n\n  function currentConfigUrl() {\n    return LINKS[keyOf()] || LINKS[\"1-1\"];\n  }\n\n  function hideBuy() {\n    var sels = [\n      \".product-form__submit\", \".product-form__buttons\", \"button[name='add']\",\n      \".shopify-payment-button\", \"dynamic-checkout\", \".product-form__quantity\",\n      \"quantity-input\", \".quantity\", \"buy-buttons\", \"[data-shopify='payment-button']\",\n      \"form[action*='\/cart\/add'] button[type='submit']\"\n    ];\n    for (var i = 0; i \u003c sels.length; i++) {\n      var nodes = document.querySelectorAll(sels[i]);\n      for (var j = 0; j \u003c nodes.length; j++) {\n        var el = nodes[j];\n        if (el.closest \u0026\u0026 el.closest(\"#bs-configure-slot\")) continue;\n        el.style.setProperty(\"display\", \"none\", \"important\");\n        el.style.setProperty(\"visibility\", \"hidden\", \"important\");\n        if (el.disabled !== undefined) el.disabled = true;\n      }\n    }\n  }\n\n  function optionGroupKind(el) {\n    if (!el) return null;\n    var t = \"\";\n    var leg = el.querySelector(\"legend, .form__label, .product-form__label, label.form__label\");\n    if (leg) t += \" \" + (leg.textContent || \"\");\n    t += \" \" + (el.getAttribute(\"name\") || \"\");\n    t += \" \" + (el.getAttribute(\"data-option\") || \"\");\n    t += \" \" + (el.getAttribute(\"data-index\") || \"\");\n    \/\/ Sample first option labels\n    var sample = el.querySelector(\"label, option, .swatch-input__label, span\");\n    if (sample) t += \" \" + (sample.textContent || \"\");\n    t = t.toLowerCase();\n    if (t.indexOf(\"shelf\") \u003e= 0) return \"shelves\";\n    if (t.indexOf(\"section\") \u003e= 0 || t.indexOf(\"bay\") \u003e= 0) return \"sections\";\n    return null;\n  }\n\n  function findOptionGroups() {\n    var groups = { shelves: null, sections: null };\n    var candidates = document.querySelectorAll(\n      \"variant-radios fieldset, variant-selects fieldset, fieldset.product-form__input, .product-form__input, variant-radios, variant-selects\"\n    );\n    for (var i = 0; i \u003c candidates.length; i++) {\n      var c = candidates[i];\n      \/\/ Prefer fieldset over outer variant-radios if both match\n      var kind = optionGroupKind(c);\n      if (!kind) continue;\n      if (!groups[kind]) groups[kind] = c;\n    }\n    \/\/ If outer variant-radios matched but inner fieldsets exist, prefer fieldsets\n    document.querySelectorAll(\"variant-radios fieldset, variant-selects fieldset, fieldset.product-form__input\").forEach(function (fs) {\n      var k = optionGroupKind(fs);\n      if (k) groups[k] = fs;\n    });\n    return groups;\n  }\n\n  function injectMoreButtons() {\n    var groups = findOptionGroups();\n    var url = currentConfigUrl();\n\n    function ensureMore(groupEl, kind) {\n      if (!groupEl) return;\n      var existing = groupEl.querySelector(\".bs-more-btn[data-bs-more='\" + kind + \"']\");\n      var label = kind === \"shelves\" ? \"More shelves →\" : \"More sections →\";\n      if (existing) {\n        existing.setAttribute(\"href\", url);\n        existing.href = url;\n        return;\n      }\n      var a = document.createElement(\"a\");\n      a.className = \"bs-more-btn\";\n      a.setAttribute(\"data-bs-more\", kind);\n      a.href = url;\n      a.textContent = label;\n      a.addEventListener(\"click\", function (e) {\n        \/\/ Always use latest selection URL\n        e.preventDefault();\n        window.location.href = currentConfigUrl();\n      });\n\n      \/\/ Append into pill row if present\n      var row =\n        groupEl.querySelector(\".product-form__input, .js.product-form__input\") ||\n        groupEl.querySelector(\"[role='radiogroup']\") ||\n        groupEl.querySelector(\".swatch-input__list\") ||\n        null;\n\n      \/\/ Dawn: labels are direct children after legend; append after last label\/input cluster\n      var lastLabel = null;\n      var labels = groupEl.querySelectorAll(\"label, .swatch-input__label, li\");\n      if (labels.length) lastLabel = labels[labels.length - 1];\n\n      if (lastLabel \u0026\u0026 lastLabel.parentNode) {\n        lastLabel.parentNode.insertBefore(a, lastLabel.nextSibling);\n      } else if (row) {\n        row.appendChild(a);\n      } else {\n        groupEl.appendChild(a);\n      }\n    }\n\n    ensureMore(groups.shelves, \"shelves\");\n    ensureMore(groups.sections, \"sections\");\n\n    \/\/ Keep hrefs fresh on every sync\n    document.querySelectorAll(\".bs-more-btn\").forEach(function (b) {\n      b.setAttribute(\"href\", url);\n      b.href = url;\n    });\n  }\n\n  \/** Place CTA once, directly under native variant pickers (not in description). *\/\n  function placeCtaUnderVariants() {\n    var slot = document.getElementById(\"bs-configure-slot\");\n    if (!slot) return false;\n\n    if (slot.closest(\"product-form, .product-form, form[action*='\/cart\/add'], .product__info-container, variant-selects, variant-radios, buy-buttons\")) {\n      if (slot.getAttribute(\"data-bs-placed\") === \"1\") {\n        injectMoreButtons();\n        return true;\n      }\n    }\n\n    var anchors = [\n      \"variant-radios\",\n      \"variant-selects\",\n      \".product-form__input:last-of-type\",\n      \"fieldset.product-form__input:last-of-type\",\n      \".product-form__variants\",\n      \"product-info .product-form\",\n      \"form[action*='\/cart\/add']\",\n      \".product-form\",\n      \"product-form\"\n    ];\n\n    var target = null;\n    for (var a = 0; a \u003c anchors.length; a++) {\n      var el = document.querySelector(anchors[a]);\n      if (!el) continue;\n      if (el.matches \u0026\u0026 (el.matches(\"form\") || el.tagName === \"PRODUCT-FORM\" || el.classList.contains(\"product-form\"))) {\n        var lastOpt = el.querySelector(\"variant-radios, variant-selects, fieldset.product-form__input:last-of-type, .product-form__input:last-of-type\");\n        target = lastOpt || el;\n      } else {\n        target = el;\n      }\n      if (target) break;\n    }\n\n    if (!target) {\n      target = document.querySelector(\".price, .product__price, .product .price__container\");\n    }\n    if (!target || !target.parentNode) return false;\n\n    if (target.nextSibling !== slot) {\n      target.parentNode.insertBefore(slot, target.nextSibling);\n    }\n    slot.setAttribute(\"data-bs-placed\", \"1\");\n    placed = true;\n\n    document.querySelectorAll(\".js-configure-cta\").forEach(function (a) {\n      if (a.id === \"bs-configure-cta\") return;\n      if (a.closest(\"#bs-configure-slot\")) return;\n      var p = a.closest(\"p\") || a;\n      if (p \u0026\u0026 p.parentNode \u0026\u0026 !p.closest(\"#bs-configure-slot\")) {\n        try { p.remove(); } catch (e) { a.style.display = \"none\"; }\n      }\n    });\n\n    injectMoreButtons();\n    return true;\n  }\n\n  function galleryUrls(k) {\n    var p = k.split(\"-\");\n    return VIEWS.map(function (v) { return CDN + \"c-\" + p[0] + \"s-\" + p[1] + \"b-\" + v + \".webp\"; });\n  }\n\n  function forceImg(img, url) {\n    if (!img || !url) return;\n    try {\n      img.removeAttribute(\"srcset\");\n      img.removeAttribute(\"data-srcset\");\n      img.removeAttribute(\"sizes\");\n      img.setAttribute(\"src\", url);\n      img.src = url;\n      if (img.dataset) {\n        if (img.dataset.src) img.dataset.src = url;\n        if (img.dataset.srcset) delete img.dataset.srcset;\n      }\n      var pic = img.closest(\"picture\");\n      if (pic) {\n        var sources = pic.querySelectorAll(\"source\");\n        for (var s = 0; s \u003c sources.length; s++) {\n          sources[s].removeAttribute(\"srcset\");\n          sources[s].setAttribute(\"srcset\", url);\n        }\n      }\n    } catch (e) {}\n  }\n\n  function collectImgs() {\n    var out = [];\n    var seen = new Set();\n    function add(n) {\n      if (!n || seen.has(n)) return;\n      var src = (n.currentSrc || n.src || \"\").toLowerCase();\n      if (src.indexOf(\"icon\") \u003e= 0 || src.indexOf(\"logo\") \u003e= 0 || src.indexOf(\"payment\") \u003e= 0) return;\n      if (n.width \u0026\u0026 n.width \u003c 40) return;\n      seen.add(n);\n      out.push(n);\n    }\n    var roots = [\n      \"media-gallery\", \".product__media-list\", \".product__media-wrapper\",\n      \".product-media-container\", \".product__media\", \"[id*='MediaGallery']\",\n      \"main .product\", \"main\"\n    ];\n    for (var r = 0; r \u003c roots.length; r++) {\n      var root = document.querySelector(roots[r]);\n      if (!root) continue;\n      var imgs = root.querySelectorAll(\"img\");\n      if (imgs.length \u003e= 1) {\n        for (var i = 0; i \u003c imgs.length; i++) add(imgs[i]);\n        if (out.length \u003e= 4) break;\n      }\n    }\n    if (out.length \u003c 4) {\n      var all = document.querySelectorAll(\"main img, .product img, product-info img\");\n      for (var a = 0; a \u003c all.length; a++) add(all[a]);\n    }\n    return out;\n  }\n\n  function updateGallery(k) {\n    var urls = galleryUrls(k);\n    var imgs = collectImgs();\n    var n = Math.min(4, urls.length, imgs.length);\n    for (var i = 0; i \u003c n; i++) forceImg(imgs[i], urls[i]);\n    if (imgs[0] \u0026\u0026 urls[0]) forceImg(imgs[0], urls[0]);\n  }\n\n  function apply(k) {\n    if (!LINKS[k]) k = \"1-1\";\n    var parts = k.split(\"-\");\n    state.shelves = parseInt(parts[0], 10) || 1;\n    state.sections = parseInt(parts[1], 10) || 1;\n    k = keyOf();\n\n    var url = LINKS[k] || LINKS[\"1-1\"];\n    var cta = document.getElementById(\"bs-configure-cta\");\n    if (cta) {\n      cta.setAttribute(\"href\", url);\n      cta.href = url;\n    }\n    document.querySelectorAll(\"#bs-configure-slot .js-configure-cta, #bs-configure-cta\").forEach(function (a) {\n      a.setAttribute(\"href\", url);\n      a.href = url;\n    });\n\n    var sum = document.getElementById(\"bs-config-summary\");\n    if (sum) {\n      var sw = state.shelves === 1 ? \"shelf\" : \"shelves\";\n      var sec = state.sections === 1 ? \"section\" : \"sections\";\n      sum.textContent = state.shelves + \" \" + sw + \", \" + state.sections + \" \" + sec + \" · catalog \" + (DIM[k] || \"\") + \" in\";\n    }\n\n    updateGallery(k);\n    hideBuy();\n    injectMoreButtons();\n    lastKey = k;\n  }\n\n  function keyFromVariantId(vid) {\n    if (!vid) return null;\n    vid = String(vid).replace(\/\\D\/g, \"\");\n    return ID_TO_KEY[vid] || null;\n  }\n\n  function keyFromSku(sku) {\n    if (!sku) return null;\n    var m = String(sku).match(\/(\\d+)S-(\\d+)B\/i);\n    if (!m) return null;\n    return m[1] + \"-\" + m[2];\n  }\n\n  function readThemeVariantId() {\n    var el = document.querySelector('form[action*=\"\/cart\/add\"] [name=\"id\"], product-form [name=\"id\"], variant-selects [name=\"id\"], [name=\"id\"]');\n    if (el \u0026\u0026 el.value) return String(el.value);\n    try {\n      var u = new URL(window.location.href);\n      if (u.searchParams.get(\"variant\")) return u.searchParams.get(\"variant\");\n    } catch (e) {}\n    return null;\n  }\n\n  function readFromThemePickers() {\n    var shelves = null, sections = null;\n    var checked = document.querySelectorAll(\"variant-radios input:checked, variant-selects input:checked, fieldset input[type=radio]:checked\");\n    for (var i = 0; i \u003c checked.length; i++) {\n      var inp = checked[i];\n      var labelText = \"\";\n      var lab = inp.id ? document.querySelector('label[for=\"' + inp.id + '\"]') : null;\n      if (lab) labelText = lab.textContent || \"\";\n      else if (inp.nextElementSibling) labelText = inp.nextElementSibling.textContent || \"\";\n      labelText = (labelText || inp.value || \"\").trim();\n      var num = (labelText.match(\/(\\d+)\/) || [])[1];\n      if (!num) continue;\n      num = parseInt(num, 10);\n      var context = \"\";\n      var fs = inp.closest(\"fieldset, .product-form__input, variant-radios, variant-selects\");\n      if (fs) {\n        var leg = fs.querySelector(\"legend, .form__label, .product-form__label\");\n        context = ((leg \u0026\u0026 leg.textContent) || fs.getAttribute(\"data-option\") || \"\").toLowerCase();\n      }\n      var name = ((inp.getAttribute(\"name\") || \"\") + \" \" + context + \" \" + labelText).toLowerCase();\n      if (name.indexOf(\"shelf\") \u003e= 0) shelves = num;\n      else if (name.indexOf(\"section\") \u003e= 0 || name.indexOf(\"bay\") \u003e= 0) sections = num;\n    }\n    var selects = document.querySelectorAll(\"variant-selects select, .product-form__input select, select[name*='option']\");\n    for (var s = 0; s \u003c selects.length; s++) {\n      var sel = selects[s];\n      var opt = sel.options[sel.selectedIndex];\n      if (!opt) continue;\n      var t = (opt.textContent || opt.value || \"\").trim();\n      var n2 = (t.match(\/(\\d+)\/) || [])[1];\n      if (!n2) continue;\n      n2 = parseInt(n2, 10);\n      var wrap = sel.closest(\"fieldset, .product-form__input, label\") || sel.parentElement;\n      var ctx = \"\";\n      if (wrap) {\n        var l2 = wrap.querySelector(\"legend, .form__label, label\");\n        ctx = ((l2 \u0026\u0026 l2.textContent) || \"\").toLowerCase();\n      }\n      ctx = (ctx + \" \" + (sel.getAttribute(\"name\") || \"\") + \" \" + t).toLowerCase();\n      if (ctx.indexOf(\"shelf\") \u003e= 0) shelves = n2;\n      else if (ctx.indexOf(\"section\") \u003e= 0 || ctx.indexOf(\"bay\") \u003e= 0) sections = n2;\n    }\n    if (shelves != null \u0026\u0026 sections != null) return shelves + \"-\" + sections;\n    return null;\n  }\n\n  function syncFromTheme() {\n    var vid = readThemeVariantId();\n    if (vid \u0026\u0026 vid !== lastVid) {\n      lastVid = vid;\n      var k = keyFromVariantId(vid);\n      if (k \u0026\u0026 k !== lastKey) {\n        apply(k);\n        return;\n      }\n    }\n    var pk = readFromThemePickers();\n    if (pk \u0026\u0026 pk !== lastKey) apply(pk);\n    else injectMoreButtons();\n  }\n\n  function bind() {\n    hideBuy();\n    placeCtaUnderVariants();\n    injectMoreButtons();\n    setTimeout(function () { placeCtaUnderVariants(); injectMoreButtons(); }, 200);\n    setTimeout(function () { placeCtaUnderVariants(); injectMoreButtons(); }, 800);\n    setTimeout(function () { placeCtaUnderVariants(); injectMoreButtons(); }, 2000);\n\n    document.addEventListener(\"change\", function () {\n      setTimeout(function () {\n        placeCtaUnderVariants();\n        syncFromTheme();\n      }, 30);\n    }, true);\n    document.addEventListener(\"click\", function () {\n      setTimeout(function () {\n        placeCtaUnderVariants();\n        syncFromTheme();\n      }, 80);\n    }, true);\n\n    document.addEventListener(\"variant:change\", function (ev) {\n      try {\n        var d = ev.detail || {};\n        var v = d.variant || d;\n        var id = v \u0026\u0026 (v.id || v);\n        var k = keyFromVariantId(id) || keyFromSku(v \u0026\u0026 v.sku);\n        if (k) apply(k);\n        else syncFromTheme();\n      } catch (e) { syncFromTheme(); }\n    });\n\n    if (typeof subscribe === \"function\") {\n      try {\n        subscribe(\"variant:change\", function (payload) {\n          var v = payload \u0026\u0026 (payload.variant || payload);\n          var k = keyFromVariantId(v \u0026\u0026 v.id) || keyFromSku(v \u0026\u0026 v.sku);\n          if (k) apply(k);\n        });\n      } catch (e2) {}\n    }\n\n    setInterval(function () {\n      hideBuy();\n      if (!placed) placeCtaUnderVariants();\n      injectMoreButtons();\n      var slots = document.querySelectorAll(\"#bs-configure-slot, [data-bs-configure-slot]\");\n      if (slots.length \u003e 1) {\n        for (var i = 1; i \u003c slots.length; i++) {\n          try { slots[i].remove(); } catch (e) {}\n        }\n      }\n      syncFromTheme();\n      if (lastKey) updateGallery(lastKey);\n    }, 500);\n\n    var startVid = readThemeVariantId();\n    var startKey = keyFromVariantId(startVid) || readFromThemePickers() || \"1-1\";\n    apply(startKey);\n    setTimeout(function () { apply(lastKey || startKey); }, 400);\n    setTimeout(function () { apply(lastKey || startKey); }, 1200);\n  }\n\n  if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", bind);\n  else bind();\n})();\n\u003c\/script\u003e\n\n\u003ch2 style=\"font-size:24px;font-weight:600;color:#2c2c2c;margin-top:8px;\"\u003eCeiling-mounted solid brass shelving (native variant test)\u003c\/h2\u003e\n\u003cp style=\"font-size:16px;line-height:1.6;color:#333;\"\u003eSolid brass frame (not plated). Unlacquered satin brass on renders. Choose shelves and sections above, then continue to the configurator for exact dimensions and finish. Glass is not included; source it locally from our specs.\u003c\/p\u003e\n\u003cul style=\"font-size:15px;line-height:1.7;color:#333;\"\u003e\n\u003cli\u003eNative Shopify variants: Shelves × Sections (16 combos).\u003c\/li\u003e\n\u003cli\u003eGallery swaps front \/ side \/ top \/ detail for the selected combo.\u003c\/li\u003e\n\u003cli\u003eConfigurator deep link matches the selected shelves × sections.\u003c\/li\u003e\n\u003cli\u003eNeed more than 4 shelves or sections? Use \u003cstrong\u003eMore shelves →\u003c\/strong\u003e \/ \u003cstrong\u003eMore sections →\u003c\/strong\u003e to open the full configurator.\u003c\/li\u003e\n\u003c\/ul\u003e\n","brand":"BrassShelf","offers":[{"title":"1 Shelf \/ 1 Section","offer_id":48838970605725,"sku":"CEIL-TEST-1S-1B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"1 Shelf \/ 2 Sections","offer_id":48838970638493,"sku":"CEIL-TEST-1S-2B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"1 Shelf \/ 3 Sections","offer_id":48838970671261,"sku":"CEIL-TEST-1S-3B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"1 Shelf \/ 4 Sections","offer_id":48838970704029,"sku":"CEIL-TEST-1S-4B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"2 Shelves \/ 1 Section","offer_id":48838970736797,"sku":"CEIL-TEST-2S-1B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"2 Shelves \/ 2 Sections","offer_id":48838970769565,"sku":"CEIL-TEST-2S-2B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"2 Shelves \/ 3 Sections","offer_id":48838970802333,"sku":"CEIL-TEST-2S-3B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"2 Shelves \/ 4 Sections","offer_id":48838970835101,"sku":"CEIL-TEST-2S-4B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"3 Shelves \/ 1 Section","offer_id":48838970867869,"sku":"CEIL-TEST-3S-1B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"3 Shelves \/ 2 Sections","offer_id":48838970900637,"sku":"CEIL-TEST-3S-2B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"3 Shelves \/ 3 Sections","offer_id":48838970933405,"sku":"CEIL-TEST-3S-3B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"3 Shelves \/ 4 Sections","offer_id":48838970966173,"sku":"CEIL-TEST-3S-4B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"4 Shelves \/ 1 Section","offer_id":48838970998941,"sku":"CEIL-TEST-4S-1B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"4 Shelves \/ 2 Sections","offer_id":48838971031709,"sku":"CEIL-TEST-4S-2B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"4 Shelves \/ 3 Sections","offer_id":48838971064477,"sku":"CEIL-TEST-4S-3B","price":800.0,"currency_code":"USD","in_stock":true},{"title":"4 Shelves \/ 4 Sections","offer_id":48838971097245,"sku":"CEIL-TEST-4S-4B","price":800.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0551\/5660\/5085\/files\/c-1s-1b-front_5274d923-d2d5-47fd-97a5-62d0199229c5.webp?v=1787657318","url":"https:\/\/brassshelf.com\/en-ca\/products\/deneme-tavan","provider":"Brassshelf","version":"1.0","type":"link"}