{"title":"Home page","description":null,"products":[{"product_id":"orvalmere™-easy-spray-microfiber-floor-mop","title":"Orvalmere™ Easy-Spray Microfiber Floor Mop","description":"\u003c!-- Orvalmere™ Easy-Spray Microfiber Floor Mop | Shopify Custom Liquid --\u003e\n\u003cstyle\u003e\n.orv-product{\n  --ink:#17324b;\n  --muted:#667482;\n  --line:#dfe7ec;\n  --soft:#f7fafc;\n  --accent:#c5a56a;\n  width:calc(100% - 32px);\n  max-width:1120px;\n  margin:32px auto;\n  background:#fff;\n  color:var(--ink);\n  font-family:Inter,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Arial,sans-serif;\n  line-height:1.65;\n  border:1px solid var(--line);\n  border-radius:26px;\n  overflow:hidden;\n  box-shadow:0 18px 55px rgba(23,50,75,.08);\n}\n\n.orv-product *{\n  box-sizing:border-box;\n}\n\n.orv-hero{\n  padding:34px;\n  background:linear-gradient(145deg,#fbfdff 0%,#fff 58%,#f7f4ee 100%);\n}\n\n\/* 主图容器 *\/\n.orv-media{\n  width:100%;\n  aspect-ratio:1\/1;\n  border-radius:20px;\n  overflow:hidden;\n  background:#fff;\n  position:relative;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  border:1px solid rgba(223,231,236,.85);\n}\n\n\/* 完整显示产品图片，不裁切 *\/\n.orv-media img{\n  width:100%;\n  height:100%;\n  object-fit:contain;\n  object-position:center;\n  display:none;\n  padding:10px;\n  background:#fff;\n  transition:transform .6s ease;\n}\n\n.orv-media:hover img{\n  transform:scale(1.015);\n}\n\n\/* 缩略图 *\/\n.orv-thumbs{\n  display:grid;\n  grid-template-columns:repeat(4,minmax(0,1fr));\n  gap:10px;\n  margin-top:12px;\n}\n\n.orv-thumbs button{\n  width:100%;\n  padding:0;\n  border:1px solid var(--line);\n  border-radius:12px;\n  overflow:hidden;\n  background:#fff;\n  cursor:pointer;\n  aspect-ratio:1\/1;\n  transition:border-color .25s ease,box-shadow .25s ease,transform .25s ease;\n}\n\n.orv-thumbs button:hover{\n  transform:translateY(-2px);\n}\n\n.orv-thumbs img{\n  width:100%;\n  height:100%;\n  object-fit:contain;\n  object-position:center;\n  display:block;\n  padding:4px;\n  background:#fff;\n}\n\n.orv-thumbs button:hover,\n.orv-thumbs button:focus,\n.orv-thumbs button.is-active{\n  border-color:var(--accent);\n  outline:none;\n  box-shadow:0 0 0 2px rgba(197,165,106,.14);\n}\n\n.orv-image-placeholder{\n  position:absolute;\n  inset:0;\n  display:flex;\n  align-items:center;\n  justify-content:center;\n  padding:20px;\n  color:#7a8792;\n  font-size:14px;\n  letter-spacing:.03em;\n  text-align:center;\n  background:linear-gradient(145deg,#f7fafc,#eef3f6);\n}\n\n\/* 产品文字区域 *\/\n.orv-copy{\n  padding:36px 38px 40px;\n}\n\n.orv-kicker{\n  display:inline-block;\n  margin-bottom:14px;\n  padding:7px 12px;\n  color:#8a6d3f;\n  font-size:12px;\n  line-height:1.3;\n  letter-spacing:.14em;\n  text-transform:uppercase;\n  background:#f7f0e3;\n  border:1px solid #eadcc2;\n  border-radius:999px;\n}\n\n.orv-title{\n  margin:0 0 14px;\n  font-size:clamp(28px,4vw,42px);\n  font-weight:700;\n  line-height:1.15;\n  letter-spacing:-.025em;\n  overflow-wrap:break-word;\n}\n\n.orv-desc{\n  max-width:900px;\n  margin:0;\n  color:var(--muted);\n  font-size:16px;\n}\n\n\/* 产品卖点 *\/\n.orv-grid{\n  display:grid;\n  grid-template-columns:repeat(2,minmax(0,1fr));\n  gap:12px;\n  margin-top:26px;\n}\n\n.orv-feature{\n  min-width:0;\n  padding:15px 16px;\n  color:var(--ink);\n  font-size:14px;\n  background:var(--soft);\n  border:1px solid var(--line);\n  border-radius:14px;\n  transition:\n    transform .25s ease,\n    box-shadow .25s ease,\n    border-color .25s ease;\n}\n\n.orv-feature:hover{\n  transform:translateY(-2px);\n  border-color:#cbd8e0;\n  box-shadow:0 8px 22px rgba(23,50,75,.07);\n}\n\n\/* 折叠详情 *\/\n.orv-details{\n  margin-top:28px;\n  border-top:1px solid var(--line);\n}\n\n.orv-details details{\n  border-bottom:1px solid var(--line);\n}\n\n.orv-details summary{\n  display:flex;\n  align-items:center;\n  justify-content:space-between;\n  gap:20px;\n  padding:18px 0;\n  font-weight:650;\n  cursor:pointer;\n  list-style:none;\n}\n\n.orv-details summary::-webkit-details-marker{\n  display:none;\n}\n\n.orv-details summary::after{\n  content:\"+\";\n  flex:0 0 auto;\n  color:#8a6d3f;\n  font-size:24px;\n  font-weight:300;\n  line-height:1;\n  transition:transform .2s ease;\n}\n\n.orv-details details[open] summary::after{\n  transform:rotate(45deg);\n}\n\n.orv-details p{\n  margin:0;\n  padding:0 42px 18px 0;\n  color:var(--muted);\n  font-size:14px;\n}\n\n\/* 电脑端 *\/\n@media(min-width:900px){\n  .orv-hero{\n    padding:46px;\n  }\n\n  .orv-media{\n    width:100%;\n    aspect-ratio:1\/1;\n    max-height:760px;\n  }\n\n  .orv-copy{\n    padding:42px 52px 48px;\n  }\n\n  .orv-grid{\n    grid-template-columns:repeat(3,minmax(0,1fr));\n  }\n}\n\n\/* 平板端 *\/\n@media(max-width:899px){\n  .orv-media{\n    aspect-ratio:1\/1;\n  }\n}\n\n\/* 移动端 *\/\n@media(max-width:640px){\n  .orv-product{\n    width:calc(100% - 20px);\n    margin:18px auto;\n    border-radius:18px;\n  }\n\n  .orv-hero{\n    padding:12px;\n  }\n\n  .orv-media{\n    width:100%;\n    aspect-ratio:1\/1;\n    border-radius:15px;\n  }\n\n  .orv-media img{\n    padding:5px;\n  }\n\n  .orv-copy{\n    padding:26px 20px 30px;\n  }\n\n  .orv-title{\n    font-size:28px;\n  }\n\n  .orv-desc{\n    font-size:15px;\n    line-height:1.65;\n  }\n\n  .orv-grid{\n    grid-template-columns:1fr;\n    gap:9px;\n  }\n\n  .orv-feature{\n    padding:13px 14px;\n  }\n\n  .orv-thumbs{\n    gap:7px;\n    margin-top:9px;\n  }\n\n  .orv-thumbs button{\n    border-radius:9px;\n  }\n\n  .orv-details summary{\n    padding:16px 0;\n    font-size:15px;\n  }\n\n  .orv-details p{\n    padding-right:0;\n  }\n}\n\n\/* 小屏手机 *\/\n@media(max-width:380px){\n  .orv-product{\n    width:calc(100% - 12px);\n  }\n\n  .orv-hero{\n    padding:8px;\n  }\n\n  .orv-copy{\n    padding:23px 16px 27px;\n  }\n\n  .orv-title{\n    font-size:25px;\n  }\n\n  .orv-kicker{\n    font-size:10px;\n    letter-spacing:.1em;\n  }\n}\n\u003c\/style\u003e\n\n\u003csection id=\"01-easy-spray-microfiber-floor-mop\" class=\"orv-product\"\u003e\n\n  \u003cdiv class=\"orv-hero\"\u003e\n\n    \u003cdiv class=\"orv-media\"\u003e\n      \u003cimg id=\"01-easy-spray-microfiber-floor-mop-main\" alt=\"Orvalmere™ Easy-Spray Microfiber Floor Mop\" width=\"1800\" height=\"1800\" loading=\"eager\" decoding=\"async\"\u003e\n\n      \u003cdiv class=\"orv-image-placeholder\" id=\"01-easy-spray-microfiber-floor-mop-placeholder\"\u003e\n        Loading product image…\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"orv-thumbs\" id=\"01-easy-spray-microfiber-floor-mop-thumbs\" hidden\u003e\u003c\/div\u003e\n\n  \u003c\/div\u003e\n\n  \u003cscript\u003e\n  (function(){\n    var section = document.getElementById(\n      '01-easy-spray-microfiber-floor-mop'\n    );\n\n    if(!section) return;\n\n    var mainImg = document.getElementById(\n      '01-easy-spray-microfiber-floor-mop-main'\n    );\n\n    var thumbs = document.getElementById(\n      '01-easy-spray-microfiber-floor-mop-thumbs'\n    );\n\n    var placeholder = document.getElementById(\n      '01-easy-spray-microfiber-floor-mop-placeholder'\n    );\n\n    var hasRendered = false;\n\n    function normalize(url){\n      if(!url) return '';\n\n      url = String(url).trim();\n\n      if(url.indexOf('\/\/') === 0){\n        url = window.location.protocol + url;\n      }\n\n      return url;\n    }\n\n    function getLargestFromSrcset(srcset){\n      if(!srcset) return '';\n\n      var parts = srcset\n        .split(',')\n        .map(function(item){\n          var values = item.trim().split(\/\\s+\/);\n          var width = parseInt(\n            (values[1] || '0').replace(\/\\D\/g,''),\n            10\n          ) || 0;\n\n          return {\n            url:values[0],\n            width:width\n          };\n        })\n        .filter(function(item){\n          return item.url;\n        });\n\n      parts.sort(function(a,b){\n        return b.width - a.width;\n      });\n\n      return parts.length ? parts[0].url : '';\n    }\n\n    function getImageUrl(img){\n      var dataZoom = img.getAttribute('data-zoom');\n      var dataMaster = img.getAttribute('data-master');\n      var dataSrc = img.getAttribute('data-src');\n      var dataSrcset = img.getAttribute('data-srcset');\n      var srcset = img.getAttribute('srcset');\n\n      return normalize(\n        dataZoom ||\n        dataMaster ||\n        (\n          dataSrcset\n            ? getLargestFromSrcset(dataSrcset)\n            : ''\n        ) ||\n        (\n          srcset\n            ? getLargestFromSrcset(srcset)\n            : ''\n        ) ||\n        dataSrc ||\n        img.currentSrc ||\n        img.getAttribute('src') ||\n        img.src\n      );\n    }\n\n    function isUsableImage(img,url){\n      if(!url) return false;\n      if(url.indexOf('data:image') === 0) return false;\n      if(url.indexOf('placeholder') !== -1) return false;\n\n      var alt = (img.alt || '').toLowerCase();\n      var className = (img.className || '')\n        .toString()\n        .toLowerCase();\n\n      var parentClass = img.parentElement\n        ? (img.parentElement.className || '')\n            .toString()\n            .toLowerCase()\n        : '';\n\n      var combined = alt + ' ' + className + ' ' + parentClass;\n\n      if(\n        \/logo|icon|avatar|payment|badge|swatch|flag|rating|star\/.test(\n          combined\n        )\n      ){\n        return false;\n      }\n\n      var rect = img.getBoundingClientRect();\n\n      var largeEnough =\n        (img.naturalWidth || 0) \u003e= 250 ||\n        (img.width || 0) \u003e= 250 ||\n        rect.width \u003e= 180;\n\n      return largeEnough;\n    }\n\n    function collectImages(){\n      var selectors = [\n        'media-gallery img',\n        '.product__media img',\n        '.product-media-container img',\n        '.product__media-item img',\n        '.product__media-list img',\n        '.product__media-wrapper img',\n        '.product-gallery img',\n        '.product-gallery__image img',\n        '.product-single__media img',\n        '.product__photos img',\n        '.product-single__photos img',\n        '.product-media img',\n        '[data-media-id] img',\n        '[data-product-media] img',\n        '[data-product-gallery] img',\n        '.product img'\n      ];\n\n      var found = [];\n      var seen = {};\n\n      selectors.forEach(function(selector){\n        document.querySelectorAll(selector).forEach(function(img){\n          if(section.contains(img)) return;\n\n          var url = getImageUrl(img);\n\n          if(!isUsableImage(img,url)) return;\n          if(seen[url]) return;\n\n          seen[url] = true;\n\n          found.push({\n            url:url,\n            alt:\n              img.alt ||\n              'Orvalmere™ Easy-Spray Microfiber Floor Mop'\n          });\n        });\n      });\n\n      \/* Shopify JSON 产品数据后备方案 *\/\n      if(!found.length){\n        document\n          .querySelectorAll(\n            'script[type=\"application\/json\"], script[data-product-json]'\n          )\n          .forEach(function(script){\n            if(found.length \u003e= 6) return;\n\n            try{\n              var data = JSON.parse(script.textContent);\n\n              var images =\n                data.images ||\n                (\n                  data.product \u0026\u0026 data.product.images\n                    ? data.product.images\n                    : []\n                );\n\n              if(!Array.isArray(images)) return;\n\n              images.forEach(function(image){\n                var url = '';\n\n                if(typeof image === 'string'){\n                  url = image;\n                }else if(image){\n                  url =\n                    image.src ||\n                    image.url ||\n                    image.preview_image \u0026\u0026\n                    image.preview_image.src ||\n                    '';\n                }\n\n                url = normalize(url);\n\n                if(!url || seen[url]) return;\n\n                seen[url] = true;\n\n                found.push({\n                  url:url,\n                  alt:\n                    'Orvalmere™ Easy-Spray Microfiber Floor Mop'\n                });\n              });\n            }catch(error){\n              \/* Ignore unrelated JSON blocks. *\/\n            }\n          });\n      }\n\n      \/* OpenGraph 后备图片 *\/\n      if(!found.length){\n        var ogImages = document.querySelectorAll(\n          'meta[property=\"og:image\"],' +\n          'meta[property=\"og:image:secure_url\"]'\n        );\n\n        ogImages.forEach(function(meta){\n          var url = normalize(meta.content);\n\n          if(!url || seen[url]) return;\n\n          seen[url] = true;\n\n          found.push({\n            url:url,\n            alt:'Orvalmere™ Easy-Spray Microfiber Floor Mop'\n          });\n        });\n      }\n\n      return found.slice(0,6);\n    }\n\n    function setMainImage(item){\n      if(!item || !item.url) return;\n\n      mainImg.onload = function(){\n        mainImg.style.display = 'block';\n\n        if(placeholder){\n          placeholder.style.display = 'none';\n        }\n      };\n\n      mainImg.onerror = function(){\n        mainImg.style.display = 'none';\n\n        if(placeholder){\n          placeholder.style.display = 'flex';\n          placeholder.textContent = 'Product image';\n        }\n      };\n\n      mainImg.src = item.url;\n      mainImg.alt =\n        item.alt ||\n        'Orvalmere™ Easy-Spray Microfiber Floor Mop';\n\n      if(mainImg.complete \u0026\u0026 mainImg.naturalWidth \u003e 0){\n        mainImg.style.display = 'block';\n\n        if(placeholder){\n          placeholder.style.display = 'none';\n        }\n      }\n    }\n\n    function render(images){\n      if(hasRendered || !images.length) return false;\n\n      hasRendered = true;\n      setMainImage(images[0]);\n\n      if(images.length \u003e 1){\n        thumbs.innerHTML = '';\n\n        images.slice(0,4).forEach(function(item,index){\n          var button = document.createElement('button');\n          var image = document.createElement('img');\n\n          button.type = 'button';\n\n          button.setAttribute(\n            'aria-label',\n            'View product image ' + (index + 1)\n          );\n\n          image.src = item.url;\n          image.alt =\n            item.alt ||\n            'Orvalmere™ product image ' + (index + 1);\n\n          image.loading = 'lazy';\n          image.decoding = 'async';\n\n          button.appendChild(image);\n\n          button.addEventListener('click',function(){\n            setMainImage(item);\n\n            thumbs\n              .querySelectorAll('button')\n              .forEach(function(currentButton){\n                currentButton.classList.remove('is-active');\n              });\n\n            button.classList.add('is-active');\n          });\n\n          if(index === 0){\n            button.classList.add('is-active');\n          }\n\n          thumbs.appendChild(button);\n        });\n\n        thumbs.hidden = false;\n      }\n\n      return true;\n    }\n\n    function init(attempt){\n      var images = collectImages();\n\n      if(render(images)) return;\n\n      if(attempt \u003c 15){\n        setTimeout(function(){\n          init(attempt + 1);\n        },350);\n      }else if(placeholder){\n        placeholder.textContent = 'Product image';\n      }\n    }\n\n    if(document.readyState === 'loading'){\n      document.addEventListener(\n        'DOMContentLoaded',\n        function(){\n          init(0);\n        }\n      );\n    }else{\n      init(0);\n    }\n  })();\n  \u003c\/script\u003e\n\n  \u003cdiv class=\"orv-copy\"\u003e\n\n    \u003cspan class=\"orv-kicker\"\u003e\n      Floor Care Collection\n    \u003c\/span\u003e\n\n    \u003ch2 class=\"orv-title\"\u003e\n      Orvalmere™ Easy-Spray Microfiber Floor Mop\n    \u003c\/h2\u003e\n\n    \u003cp class=\"orv-desc\"\u003e\n      Make everyday floor cleaning faster and easier with a refined\n      spray-mop design made for modern homes. A wide microfiber cleaning\n      head helps pick up dust, footprints, light spills, and everyday\n      residue, while the slim profile moves smoothly around furniture\n      and along edges.\n    \u003c\/p\u003e\n\n    \u003cdiv class=\"orv-grid\"\u003e\n\n      \u003cdiv class=\"orv-feature\"\u003e\n        ✓ Wide microfiber cleaning head\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"orv-feature\"\u003e\n        ✓ Built for quick everyday floor care\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"orv-feature\"\u003e\n        ✓ Slim profile reaches under furniture\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"orv-feature\"\u003e\n        ✓ Reusable pad-friendly design\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"orv-feature\"\u003e\n        ✓ Ideal for common sealed hard floors\n      \u003c\/div\u003e\n\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"orv-details\"\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eDesigned for Everyday Use\u003c\/summary\u003e\n        \u003cp\u003e\n          Created with a clean, understated look that fits naturally\n          into bright modern homes while keeping practical household\n          care simple and approachable.\n        \u003c\/p\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eCare \u0026amp; Storage\u003c\/summary\u003e\n        \u003cp\u003e\n          Rinse or wipe the tool after use as appropriate, allow it to\n          dry fully, and store it in a clean, dry area. Follow the care\n          guidance supplied with your product.\n        \u003c\/p\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eWhat You’ll Receive\u003c\/summary\u003e\n        \u003cp\u003e\n          Your order includes the Orvalmere™ product and the accessories\n          shown with the selected item. Exact included pieces may vary\n          by product configuration.\n        \u003c\/p\u003e\n      \u003c\/details\u003e\n\n    \u003c\/div\u003e\n\n  \u003c\/div\u003e\n\n\u003c\/section\u003e","brand":"My Store","offers":[{"title":"Default Title","offer_id":52243837026625,"sku":null,"price":39.99,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/1005\/5250\/7713\/files\/1-1-1.png?v=1789976154"}],"url":"https:\/\/orvalmere.com\/collections\/frontpage.oembed","provider":"𝐨𝐫𝐯𝐚𝐥𝐦𝐞𝐫𝐞™","version":"1.0","type":"link"}