{"product_id":"luvora-vintage-pleated-fabric-wall-sconce-for-bedroom","title":"Luvora Vintage Pleated Fabric Wall Sconce for Bedroom","description":"\u003cstyle\u003e\n    .page {      --paper: #fbfaf7;      --ink: #181613;      --line: #ddd8ce;      --brass: #a8772f;      color: var(--ink);      background: var(--paper);    }    .page, .page * { box-sizing: border-box; }    .page { max-width: 1440px; min-width: 320px; margin: auto; background: var(--paper); -webkit-font-smoothing: antialiased; }    .page button { font: inherit; }    .page section { padding: clamp(21px, 3vw, 44px) clamp(28px, 6vw, 92px); border-bottom: 1px solid var(--line); }    .page h2, .page h2 strong { margin: 0 0 clamp(18px, 2.5vw, 30px); font-size: clamp(26px, 3vw, 42px); font-weight: 700 !important; line-height: 1.15; }    body .product-content #nav-tab-info .tab-content .tab-pane #oodioo-eloise-description h2,    body .product-content #nav-tab-info .tab-content .tab-pane #oodioo-eloise-description h2 strong,    body .product-content #nav-tab-info .tab-content .tab-pane #oodioo-eloise-description dt,    body .product-content #nav-tab-info .tab-content .tab-pane #oodioo-eloise-description dt strong {      font-weight: 700 !important;    }    .page h2::after { content: \"\"; display: block; width: 52px; height: 2px; margin-top: 20px; background: var(--brass); }\n    .specs { display: grid; grid-template-columns: minmax(300px, .9fr) 1.1fr; gap: clamp(48px, 8vw, 120px); align-items: center; }    .dimension { margin: 0; background: #f0ede7; overflow: hidden; }    .dimension img { width: 100%; height: auto; aspect-ratio: 1\/1; display: block; object-fit: cover; }    .page dl { margin: 0; }    .spec-row { display: grid; grid-template-columns: minmax(145px, .8fr) 1.2fr; border-top: 1px solid var(--line); }    .spec-row:last-child { border-bottom: 1px solid var(--line); }    .page dt, .page dd { margin: 0; padding: 25px 22px; font-size: clamp(16px, 1.5vw, 20px); line-height: 1.45; }    .page dt, .page dt strong { font-weight: 700 !important; }    .page dt { border-right: 1px solid var(--line); }\n    .sku-gallery { height: auto; aspect-ratio: 3 \/ 1; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); overflow: hidden; border-radius: 4px; background: #efebe4; }    .sku-panel { aspect-ratio: 1 \/ 1; min-width: 0; height: 100%; padding: 0; overflow: hidden; border: 0; border-right: 1px solid rgba(255,255,255,.9); background: #eeeae3; cursor: pointer; touch-action: pan-x; transition: flex .8s cubic-bezier(.29,0,.2,1), filter .25s ease; }    .sku-panel:last-child { border-right: 0; }    .sku-panel:hover, .sku-panel:focus-visible { outline: none; filter: brightness(.98); }    .sku-panel:focus-visible { box-shadow: inset 0 0 0 3px var(--brass); }    .sku-panel.active { z-index: 1; }    .sku-panel img { width: 100%; height: 100%; aspect-ratio: 1 \/ 1; display: block; object-fit: cover; object-position: center; background: #ece8e1; transition: object-position .8s cubic-bezier(.29,0,.2,1); }    .sku-panel.active img { object-fit: cover; object-position: center; }    .sku-label { position: absolute; left: 12px; bottom: 18px; z-index: 2; color: #fff; font-size: 11px; font-weight: 600; letter-spacing: .12em; line-height: 1; text-transform: uppercase; writing-mode: vertical-rl; transform: rotate(180deg); text-shadow: 0 1px 6px rgba(0,0,0,.6); pointer-events: none; }    .sku-panel { position: relative; }\n    .carousel { position: relative; overflow: hidden; }    .scene-grid { overflow: visible; }    .scene-grid { --scene-gap: 5px; display: flex; gap: var(--scene-gap); transition: transform .65s cubic-bezier(.22,.61,.36,1); will-change: transform; }    .scene-grid img { width: calc((100% - var(--scene-gap)) \/ 2); min-width: calc((100% - var(--scene-gap)) \/ 2); aspect-ratio: 1\/1; display: block; object-fit: cover; }    .arrow { position: absolute; z-index: 2; top: 50%; width: 48px; height: 48px; display: grid; place-items: center; padding: 0; border: 1px solid rgba(24,22,19,.25); border-radius: 50%; color: var(--ink); background: rgba(251,250,247,.92); cursor: pointer; transform: translateY(-50%); }    .arrow:hover, .arrow:focus-visible { border-color: var(--brass); color: var(--brass); }    .arrow.prev { left: 12px; } .arrow.next { right: 12px; }\n    @media (max-width: 900px) {      .page section { padding-inline: 28px; }      .specs { grid-template-columns: .95fr 1.05fr; gap: 28px; }      .sku-gallery { height: auto; aspect-ratio: 3 \/ 1; grid-template-columns: repeat(3, minmax(0, 1fr)); overflow: hidden; }      .sku-panel { min-width: 0; height: 100%; scroll-snap-align: start; }      .sku-panel.active { z-index: 1; }      .arrow.prev { left: 10px; } .arrow.next { right: 10px; }    }    @media (max-width: 620px) {      .page section { padding: 17px 18px 21px; }      .page h2, .page h2 strong { margin-bottom: 14px; font-size: 24px; }      .page h2::after { width: 36px; margin-top: 14px; }      .specs { grid-template-columns: 1fr; gap: 28px; }      .spec-row { grid-template-columns: 1fr; }      .page dt, .page dd { padding: 10px 12px; font-size: 13px; }      .page dt { padding-bottom: 2px; border-right: 0; }      .page dd { padding-top: 2px; }      .sku-gallery { height: auto; aspect-ratio: 3 \/ 1; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px; overflow: hidden; border-radius: 0; }      .sku-panel, .sku-panel.active { min-width: 0; width: auto; height: 100%; border: 0; scroll-snap-align: start; }      .sku-panel img, .sku-panel.active img { object-fit: cover; }      .sku-label { left: 7px; bottom: 10px; font-size: 9px; letter-spacing: .08em; writing-mode: vertical-rl; transform: rotate(180deg); }      .scene-grid { --scene-gap: 5px; }      .scene-grid img { width: 100%; min-width: 100%; }      .arrow { width: 34px; height: 34px; font-size: 18px; }      .arrow.prev { left: 8px; } .arrow.next { right: 8px; }    }      \/* Square product details; container follows the three equal columns. *\/    #skuGallery.sku-gallery { display: grid !important; grid-template-columns: repeat(3, minmax(0, 1fr)) !important; height: auto !important; aspect-ratio: auto !important; grid-template-rows: auto !important; gap: 6px; overflow: hidden !important; }    #skuGallery .sku-panel { width: 100% !important; min-width: 0 !important; height: auto !important; aspect-ratio: 1 \/ 1 !important; border: 0; }    #skuGallery .sku-panel img { width: 100%; height: 100%; aspect-ratio: 1 \/ 1; object-fit: cover; }      .details-progress { display: block; height: 3px; margin-top: 16px; background: #ddd8ce; overflow: hidden; border-radius: 3px; }    .details-progress span { display: block; width: 33.333%; height: 100%; background: #a8772f; transform: translateX(0); transition: transform .12s linear; }    @media (max-width: 620px) {      #oodioo-eloise-description section:nth-of-type(2) { timeline-scope: --details-scroll; }      #skuGallery .sku-panel img { -webkit-user-drag: none; user-drag: none; user-select: none; pointer-events: none; }    #skuGallery.sku-gallery { display: flex !important; gap: 5px; overflow-x: auto !important; overflow-y: hidden !important; scroll-snap-type: x mandatory; scroll-behavior: smooth; touch-action: pan-x pan-y; scrollbar-width: none; scroll-timeline-name: --details-scroll; scroll-timeline-axis: inline; border-radius: 0; }      #skuGallery::-webkit-scrollbar { display: none; }      #skuGallery .sku-panel { flex: 0 0 88% !important; width: 88% !important; min-width: 0 !important; height: auto !important; aspect-ratio: 1 \/ 1 !important; scroll-snap-align: start; }      #skuGallery .sku-panel img { display: block; width: 100%; height: auto; aspect-ratio: 1 \/ 1; object-fit: cover; }\n    }\n\n    \/* Drag-scroll product details on desktop, tablet, and mobile. *\/    #skuGallery.sku-gallery { display: flex !important; gap: 5px; overflow-x: auto !important; overflow-y: hidden !important; scroll-snap-type: x mandatory; scrollbar-width: none; cursor: grab; user-select: none; touch-action: pan-x pan-y; }    #skuGallery.sku-gallery::-webkit-scrollbar { display: none; }    #skuGallery .sku-panel { flex: 0 0 40% !important; width: auto !important; min-width: 0 !important; height: auto !important; aspect-ratio: 1 \/ 1 !important; scroll-snap-align: start; }    #skuGallery.sku-gallery.is-dragging { cursor: grabbing; scroll-snap-type: none; }    @media (max-width: 1024px) { #skuGallery .sku-panel { flex-basis: 78% !important; } }    @media (max-width: 620px) { #skuGallery .sku-panel { flex-basis: 88% !important; } }\n\n    .scene-grid img { cursor: zoom-in; }    .scene-lightbox { position: fixed; inset: 0; z-index: 9999; display: flex; align-items: center; justify-content: center; padding: 28px; background: rgba(15,14,12,.88); opacity: 0; pointer-events: none; transition: opacity .25s ease; }    .scene-lightbox.is-open { opacity: 1; pointer-events: auto; }    .scene-lightbox img { max-width: min(92vw, 1200px); max-height: 90vh; width: auto; height: auto; object-fit: contain; box-shadow: 0 12px 50px rgba(0,0,0,.35); }    .scene-lightbox-close { position: absolute; top: 18px; right: 24px; border: 0; color: #fff; background: transparent; font-size: 38px; line-height: 1; cursor: pointer; }\n    .carousel { touch-action: pan-y; }    .arrow { top: 50% !important; transform: translateY(-50%) !important; border: 0; border-radius: 0; width: 46px; height: 64px; color: #2a2825; background: rgba(251,250,247,.88); font-size: 0; }    .arrow::before { content: \"\"; position: absolute; left: 50%; top: 50%; display: block; width: 17px; height: 17px; border-top: 2px solid currentColor; border-left: 2px solid currentColor; }    .arrow.prev::before { transform: translate(-50%, -50%) rotate(-45deg); }    .arrow.next::before { transform: translate(-50%, -50%) rotate(135deg); }\n\u003c\/style\u003e\n\u003cmain class=\"page oodioo-text-space-v1\" id=\"oodioo-eloise-description\"\u003e\n\u003csection\u003e\n\u003ch2 class=\"oodioo-text oodioo-weight-700\"\u003ePRODUCT SPECIFICATIONS\u003c\/h2\u003e\n\u003cdiv class=\"specs\"\u003e\n\u003cfigure class=\"dimension\"\u003e\n\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0697\/4373\/9037\/files\/luvora-sconce-size.jpg?v=1791950835\" alt=\"Luvora wall sconce dimensions, 9.75 inches wide by 13 inches high\"\u003e\n\u003c\/figure\u003e\n\u003cdl\u003e\n\u003cdiv class=\"spec-row\"\u003e\n\u003cdt\u003eMaterial\u003c\/dt\u003e\n\u003cdd\u003eMild Steel, Cotton\u003c\/dd\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"spec-row\"\u003e\n\u003cdt\u003eOverall Size\u003c\/dt\u003e\n\u003cdd\u003eW 9.75\" x D 7\" x H 13\"\u003c\/dd\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"spec-row\"\u003e\n\u003cdt\u003eBack Plate\u003c\/dt\u003e\n\u003cdd\u003eW 3.5\" x H 0.75\"\u003c\/dd\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"spec-row\"\u003e\n\u003cdt\u003eShade\u003c\/dt\u003e\n\u003cdd\u003eW 6.5\" x D 6\" x H 4\"\u003c\/dd\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"spec-row\"\u003e\n\u003cdt\u003eBulb Base\u003c\/dt\u003e\n\u003cdd\u003eType B\u003c\/dd\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"spec-row\"\u003e\n\u003cdt\u003eBulb Included\u003c\/dt\u003e\n\u003cdd\u003eNo\u003c\/dd\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"spec-row\"\u003e\n\u003cdt\u003eNumber of Lights\u003c\/dt\u003e\n\u003cdd\u003e1\u003c\/dd\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"spec-row\"\u003e\n\u003cdt\u003eWattage\u003c\/dt\u003e\n\u003cdd\u003eMax 20W\u003c\/dd\u003e\n\u003c\/div\u003e\n\u003c\/dl\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003csection\u003e\n\u003ch2 class=\"oodioo-text oodioo-weight-700\"\u003ePRODUCT DETAILS\u003c\/h2\u003e\n\u003cdiv class=\"sku-gallery\" id=\"skuGallery\"\u003e\u003c\/div\u003e\n\u003cdiv class=\"details-progress\"\u003e\n\u003cspan\u003e\u003c\/span\u003e\u003cbr\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003csection\u003e\n\u003ch2 class=\"oodioo-text oodioo-weight-700\"\u003e@oodioo Styled in Real Homes\u003c\/h2\u003e\n\u003cdiv class=\"carousel\"\u003e\n\u003cbutton class=\"arrow prev\" type=\"button\"\u003e←\u003c\/button\u003e\u003cdiv class=\"scene-grid\" id=\"sceneGrid\"\u003e\u003c\/div\u003e\n\u003cbutton class=\"arrow next\" type=\"button\"\u003e→\u003c\/button\u003e\n\u003c\/div\u003e\n\u003c\/section\u003e\n\u003c\/main\u003e\n\u003cscript\u003e\n    const skuImages = [\n      ['Front View', 'Luvora pleated cotton shade detail', 'https:\/\/cdn.shopify.com\/s\/files\/1\/0697\/4373\/9037\/files\/luvora-sconce-detail-front.jpg?v=1791950841'],\n      ['Lit View', 'Luvora pleated cotton shade illuminated', 'https:\/\/cdn.shopify.com\/s\/files\/1\/0697\/4373\/9037\/files\/luvora-sconce-detail-lit.jpg?v=1791950847'],\n      ['Product Detail', 'Luvora brass arm, leaf motif, and scalloped backplate', 'https:\/\/cdn.shopify.com\/s\/files\/1\/0697\/4373\/9037\/files\/luvora-sconce-detail-arm.jpg?v=1791950854']\n    ];\n    const sceneImages = [\n      ['Luvora wall sconce styled above a living-room console', 'https:\/\/cdn.shopify.com\/s\/files\/1\/0697\/4373\/9037\/files\/luvora-sconce-scene-console.jpg?v=1791950860'],\n      ['Luvora wall sconce styled in a bedroom', 'https:\/\/cdn.shopify.com\/s\/files\/1\/0697\/4373\/9037\/files\/luvora-sconce-scene-bedroom.jpg?v=1791950867'],\n      ['Luvora wall sconce styled in an entry hallway', 'https:\/\/cdn.shopify.com\/s\/files\/1\/0697\/4373\/9037\/files\/luvora-sconce-scene-hallway.jpg?v=1791950873'],\n      ['Luvora wall sconce styled above a sofa and mirror', 'https:\/\/cdn.shopify.com\/s\/files\/1\/0697\/4373\/9037\/files\/luvora-sconce-scene-sofa.jpg?v=1791950880']\n    ];\n    const pageRoot = document.getElementById('oodioo-eloise-description');\n    const skuGallery = pageRoot.querySelector('#skuGallery');\n    skuImages.forEach(([label, alt, url]) =\u003e {\n      const button = document.createElement('button');\n      button.type = 'button';\n      button.className = 'sku-panel';\n      button.setAttribute('aria-label', 'Show ' + alt);\n      button.setAttribute('aria-expanded', 'false');\n      button.innerHTML = `\u003cimg src=\"${url}\" alt=\"${alt}\"\u003e`;\n      const activate = () =\u003e {\n        skuGallery.querySelectorAll('.sku-panel').forEach(panel =\u003e {\n          panel.classList.remove('active');\n          panel.setAttribute('aria-expanded', 'false');\n        });\n        button.classList.add('active');\n        button.setAttribute('aria-expanded', 'true');\n      };\n      button.addEventListener('mouseenter', activate);\n      button.addEventListener('click', activate);\n      skuGallery.appendChild(button);\n    });\n    document.addEventListener('pointerdown', event =\u003e {\n      if (event.target.closest('#skuGallery')) return;\n      skuGallery.querySelectorAll('.sku-panel').forEach(panel =\u003e {\n        panel.classList.remove('active');\n        panel.setAttribute('aria-expanded', 'false');\n      });\n    });\n    const dragGallery = pageRoot.querySelector('#skuGallery');\n    if (dragGallery) {\n      dragGallery.addEventListener('dragstart', event =\u003e event.preventDefault());\n      let dragging = false;\n      let startX = 0;\n      let lastX = 0;\n      let lastTime = 0;\n      let velocity = 0;\n      let frame = 0;\n      let inertia = 0;\n      const progress = pageRoot.querySelector('.details-progress span');\n      const updateProgress = () =\u003e { if (progress) { const max = dragGallery.scrollWidth - dragGallery.clientWidth; progress.style.transform = `translateX(${max \u003e 0 ? (dragGallery.scrollLeft \/ max) * 200 : 0}%)`; } };\n      const render = value =\u003e { dragGallery.scrollLeft = Math.max(0, Math.min(value, dragGallery.scrollWidth - dragGallery.clientWidth)); updateProgress(); };\n      const stopInertia = () =\u003e { if (inertia) cancelAnimationFrame(inertia); inertia = 0; };\n      dragGallery.addEventListener('scroll', updateProgress, { passive: true });\n      updateProgress();\n      dragGallery.addEventListener('pointerdown', event =\u003e {\n        if (event.pointerType === 'touch') return;\n        stopInertia();\n        dragging = true;\n        startX = lastX = event.clientX;\n        lastTime = performance.now();\n        velocity = 0;\n        dragGallery.classList.add('is-dragging');\n        dragGallery.style.scrollSnapType = 'none';\n        dragGallery.setPointerCapture(event.pointerId);\n      });\n      dragGallery.addEventListener('pointermove', event =\u003e {\n        if (!dragging) return;\n        event.preventDefault();\n        const now = performance.now();\n        const dx = event.clientX - lastX;\n        const dt = Math.max(8, now - lastTime);\n        velocity = velocity * 0.7 - (dx \/ dt) * 0.3;\n        lastX = event.clientX; lastTime = now;\n        cancelAnimationFrame(frame);\n        const next = dragGallery.scrollLeft - dx;\n        frame = requestAnimationFrame(() =\u003e render(next));\n      });\n      const stopDrag = () =\u003e {\n        if (!dragging) return;\n        dragging = false;\n        dragGallery.classList.remove('is-dragging');\n        const glide = () =\u003e {\n          velocity *= 0.94;\n          render(dragGallery.scrollLeft + velocity * 16);\n          if (Math.abs(velocity) \u003e 0.02) inertia = requestAnimationFrame(glide);\n          else inertia = 0;\n        };\n        inertia = requestAnimationFrame(glide);\n      };\n      dragGallery.addEventListener('pointerup', stopDrag);\n      dragGallery.addEventListener('pointercancel', stopDrag);\n      dragGallery.addEventListener('pointerleave', stopDrag);\n    }\n    const carousel = pageRoot.querySelector('.carousel');\n    const sceneGrid = pageRoot.querySelector('#sceneGrid');\n    sceneGrid.innerHTML = sceneImages.map(([alt, url]) =\u003e `\u003cimg src=\"${url}\" alt=\"${alt}\" loading=\"lazy\" draggable=\"false\"\u003e`).join('');\n    let sceneIndex = 0;\n    let sceneTimer = 0;\n    let scenePaused = false;\n    const maxSceneIndex = () =\u003e Math.max(0, sceneImages.length - (window.matchMedia('(max-width: 620px)').matches ? 1 : 2));\n    const sceneStep = () =\u003e { const image = sceneGrid.querySelector('img'); return image ? image.getBoundingClientRect().width + (parseFloat(getComputedStyle(sceneGrid).gap) || 0) : 0; };\n    const moveScenes = () =\u003e { sceneIndex = sceneIndex \u003e maxSceneIndex() ? 0 : Math.max(0, sceneIndex); sceneGrid.style.transform = `translate3d(-${sceneIndex * sceneStep()}px, 0, 0)`; };\n    const stopSceneAuto = () =\u003e { clearInterval(sceneTimer); sceneTimer = 0; scenePaused = true; };\n    const startSceneAuto = () =\u003e { clearInterval(sceneTimer); scenePaused = false; sceneTimer = setInterval(() =\u003e { sceneIndex = sceneIndex \u003e= maxSceneIndex() ? 0 : sceneIndex + 1; moveScenes(); }, 3200); };\n    carousel.addEventListener('click', () =\u003e stopSceneAuto());\n    document.addEventListener('pointerdown', event =\u003e { if (!carousel.contains(event.target) \u0026\u0026 !event.target.closest('.scene-lightbox')) startSceneAuto(); });\n    const lightbox = document.createElement('div');\n    lightbox.className = 'scene-lightbox';\n    lightbox.innerHTML = '\u003cbutton type=\"button\" class=\"scene-lightbox-close\" aria-label=\"Close image\"\u003e×\u003c\/button\u003e\u003cimg alt=\"\"\u003e';\n    document.body.appendChild(lightbox);\n    const closeLightbox = () =\u003e { lightbox.classList.remove('is-open'); lightbox.querySelector('img').src = ''; };\n    sceneGrid.addEventListener('click', event =\u003e { const image = event.target.closest('img'); if (!image) return; stopSceneAuto(); lightbox.querySelector('img').src = image.currentSrc || image.src; lightbox.querySelector('img').alt = image.alt; lightbox.classList.add('is-open'); });\n    lightbox.addEventListener('click', event =\u003e { if (event.target === lightbox || event.target.closest('.scene-lightbox-close')) closeLightbox(); });\n    document.addEventListener('keydown', event =\u003e { if (event.key === 'Escape') closeLightbox(); });\n    pageRoot.querySelector('.prev').addEventListener('click', () =\u003e { stopSceneAuto(); sceneIndex = sceneIndex \u003c= 0 ? maxSceneIndex() : sceneIndex - 1; moveScenes(); });\n    pageRoot.querySelector('.next').addEventListener('click', () =\u003e { stopSceneAuto(); sceneIndex = sceneIndex \u003e= maxSceneIndex() ? 0 : sceneIndex + 1; moveScenes(); });\n    window.addEventListener('resize', moveScenes);\n    moveScenes(); startSceneAuto();\n\u003c\/script\u003e\n","brand":"oodioo","offers":[{"title":"9.75\"W x 13\"H \/ Cotton","offer_id":67731028738417,"sku":null,"price":145.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0697\/4373\/9037\/files\/luvora-sconce-sku-lit.jpg?v=1791950829","url":"https:\/\/oodioo.com\/products\/luvora-vintage-pleated-fabric-wall-sconce-for-bedroom","provider":"Oodioo","version":"1.0","type":"link"}