{
  "version": 3,
  "sources": ["/cdn/shop/t/9/assets/seo-a11y-fixes.js?z=16211"],
  "sourcesContent": ["/* 27dress A11y \u5B9E\u65F6\u4FEE\u590D v3.6 (2026-06-03)\n * - MutationObserver \u5B9E\u65F6\u76D1\u542C Judge.me \u89C6\u9891\u56FE + \u901A\u7528\u94FE\u63A5\u5360\u4F4D\n * - v3.3: \u52A0\u5BC6\u521D\u59CB pass + \u8865 Judge.me button aria-label\n * - v3.6: \u8865 recently-viewed role/aria + slick-track aria-label + product-form add-to-cart aria-label + heading-order\n * - Lighthouse \u8DD1\u5206\u524D\u5B8C\u6210 alt \u6CE8\u5165\n */\n(function() {\n  function fixJudgeMeAlts(root) {\n    var scope = root || document;\n    scope.querySelectorAll('.jdgm-videos-wrapper img:not([alt]), .jdgm-card img[alt=\"\"], .jdgm-videos-wrapper img[alt=\"\"]').forEach(function(img) {\n      img.setAttribute('alt', 'Customer review video \u2014 27dress');\n    });\n    scope.querySelectorAll('.jdgm-rev img:not([alt]), .jdgm-rev img[alt=\"\"]').forEach(function(img) {\n      img.setAttribute('alt', 'Customer review photo \u2014 27dress');\n    });\n    // \u901A\u7528\u515C\u5E95: \u6240\u6709 .jdgm- \u5BB9\u5668\u5185 img \u7F3A alt \u90FD\u8865\n    scope.querySelectorAll('[class*=\"jdgm-\"] img:not([alt]), [class*=\"jdgm-\"] img[alt=\"\"]').forEach(function(img) {\n      if (!img.getAttribute('alt')) {\n        img.setAttribute('alt', 'Customer review \u2014 27dress');\n      }\n    });\n  }\n\n  function fixEmptyAriaLabels(root) {\n    var scope = root || document;\n    scope.querySelectorAll('a[aria-label=\"\"]').forEach(function(a) {\n      var href = a.getAttribute('href') || '';\n      var label = 'Visit collection';\n      if (href.includes('/collections/')) {\n        var slug = href.split('/collections/')[1].split('/')[0].split('?')[0];\n        label = slug.replace(/-/g, ' ').replace(/\\b\\w/g, function(c) { return c.toUpperCase(); }) + ' collection';\n      } else if (href === '/collections') {\n        label = 'All collections';\n      } else if (href.includes('/products/')) {\n        var pslug = href.split('/products/')[1].split('?')[0];\n        label = pslug.replace(/-/g, ' ');\n      }\n      a.setAttribute('aria-label', label);\n    });\n  }\n\n  function fixGenericAriaLink(root) {\n    var scope = root || document;\n    scope.querySelectorAll('a[aria-label=\"link\"]').forEach(function(a) {\n      var text = (a.textContent || '').trim();\n      if (text) {\n        a.removeAttribute('aria-label');\n      } else {\n        var href = a.getAttribute('href') || '';\n        if (href.includes('/collections/')) {\n          var slug = href.split('/collections/')[1].split('/')[0].split('?')[0];\n          a.setAttribute('aria-label', slug.replace(/-/g, ' ').replace(/\\b\\w/g, function(c) { return c.toUpperCase(); }) + ' collection');\n        }\n      }\n    });\n  }\n\n  function fixSlickSvg(root) {\n    var scope = root || document;\n    scope.querySelectorAll('.slick-prev svg[role=\"img\"], .slick-next svg[role=\"img\"]').forEach(function(svg) {\n      if (!svg.querySelector('title')) {\n        var t = document.createElementNS('http://www.w3.org/2000/svg', 'title');\n        t.textContent = svg.closest('.slick-prev') ? 'Previous slide' : 'Next slide';\n        svg.insertBefore(t, svg.firstChild);\n      }\n    });\n  }\n\n  function fixJdgmButtons(root) {\n    var scope = root || document;\n    scope.querySelectorAll('button.jdgm-arrow:not([aria-label])').forEach(function(btn) {\n      var onclick = btn.getAttribute('onclick') || '';\n      var label = onclick.indexOf('Next') >= 0 ? 'Next review' : 'Previous review';\n      btn.setAttribute('aria-label', label);\n    });\n    scope.querySelectorAll('button[class*=\"jdgm-\"]:not([aria-label])').forEach(function(btn) {\n      if (btn.textContent.trim()) return;\n      btn.setAttribute('aria-label', 'Review action');\n    });\n  }\n\n  function fixPresentationLi(root) {\n    var scope = root || document;\n    scope.querySelectorAll('li.slick-active[role=\"presentation\"][aria-selected], li[role=\"presentation\"][aria-selected]').forEach(function(li) {\n      li.setAttribute('role', 'tab');\n    });\n  }\n\n  /* v3.6: fix invalid role=\"recently\" on halo recently-viewed */\n  function fixRecentlyViewedRole(root) {\n    var scope = root || document;\n    scope.querySelectorAll('[role=\"recently\"]').forEach(function(el) {\n      el.setAttribute('role', 'button');\n      el.setAttribute('tabindex', '0');\n      if (!el.getAttribute('aria-label') || el.getAttribute('aria-label') === 'recently-icon') {\n        el.setAttribute('aria-label', 'View recently viewed products');\n      }\n    });\n  }\n\n  /* v3.6: product-form add-to-cart button without accessible name */\n  function fixAddToCartName(root) {\n    var scope = root || document;\n    scope.querySelectorAll('button[name=\"add\"]:not([aria-label]), button[data-btn-addtocart]:not([aria-label])').forEach(function(btn) {\n      if (btn.textContent.trim()) return; // has text content already\n      // Try to get product title from nearest card\n      var card = btn.closest('.card-product, .product-card, .product-item, [data-product-handle]');\n      var title = '';\n      if (card) {\n        var titleEl = card.querySelector('.product-title, .product-card__title, .card__heading, h2, h3');\n        title = titleEl ? titleEl.textContent.trim().slice(0, 60) : '';\n      }\n      btn.setAttribute('aria-label', title ? ('Add ' + title + ' to cart') : 'Add to cart');\n    });\n  }\n\n  /* v3.6: slick-track role=listbox missing aria-label */\n  function fixSlickTrack(root) {\n    var scope = root || document;\n    scope.querySelectorAll('.slick-track[role=\"listbox\"]:not([aria-label])').forEach(function(t) {\n      // Try to get heading from nearest carousel container\n      var carousel = t.closest('.products-carousel, .product-carousel, .sidebarBlock-product, .slick-slider');\n      var heading = carousel ? carousel.querySelector('.sidebarBlock-heading, .heading, h2, h3, h4') : null;\n      var label = heading ? heading.textContent.trim().slice(0, 50) : 'Product carousel';\n      t.setAttribute('aria-label', label);\n    });\n  }\n\n  /* v3.6: aria-hidden=true on slick-slide with focusable descendants */\n  function fixSlickAriaHidden(root) {\n    var scope = root || document;\n    scope.querySelectorAll('.slick-slide[aria-hidden=\"true\"]').forEach(function(slide) {\n      // Make all focusable children inert\n      slide.querySelectorAll('a, button, input, [tabindex]').forEach(function(el) {\n        if (el.getAttribute('tabindex') !== '-1') el.setAttribute('tabindex', '-1');\n      });\n    });\n  }\n\n  /* v3.6: heading-order \u2014 recentPosts-list-item h6 \u2192 h4 visual same but a11y-correct */\n  function fixHeadingOrder(root) {\n    var scope = root || document;\n    scope.querySelectorAll('.recentPosts-list-item h6.title, .sidebarBlock-content h6').forEach(function(h6) {\n      // Re-create as div with role=heading aria-level=4 (no need to break visual)\n      // Or use h4 directly - simpler\n      var newEl = document.createElement('h4');\n      newEl.className = h6.className;\n      newEl.innerHTML = h6.innerHTML;\n      h6.parentNode.replaceChild(newEl, h6);\n    });\n  }\n\n  /* v3.7: skeleton card-title without text content needs accessible name */\n  function fixSkeletonCardTitle(root) {\n    var scope = root || document;\n    scope.querySelectorAll('a.card-title[aria-disabled=\"true\"]:not([aria-label])').forEach(function(a) {\n      if (a.textContent.trim()) return;\n      a.setAttribute('aria-label', 'Loading product');\n    });\n  }\n\n  function runAll(root) {\n    fixJudgeMeAlts(root);\n    fixEmptyAriaLabels(root);\n    fixGenericAriaLink(root);\n    fixSlickSvg(root);\n    fixJdgmButtons(root);\n    fixPresentationLi(root);\n    fixRecentlyViewedRole(root);\n    fixAddToCartName(root);\n    fixSlickTrack(root);\n    fixSlickAriaHidden(root);\n    fixHeadingOrder(root);\n    fixSkeletonCardTitle(root);\n  }\n\n  /* === Initial pass === */\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', function() { runAll(); });\n  } else {\n    runAll();\n  }\n\n  /* === MutationObserver: \u5B9E\u65F6\u76D1\u542C\u65B0\u589E\u5143\u7D20 === */\n  if (typeof MutationObserver !== 'undefined') {\n    var pending = false;\n    var observer = new MutationObserver(function(mutations) {\n      if (pending) return;\n      pending = true;\n      // requestAnimationFrame \u6279\u91CF\u5904\u7406\u907F\u514D\u6027\u80FD\u635F\u8017\n      requestAnimationFrame(function() {\n        runAll();\n        pending = false;\n      });\n    });\n\n    function startObserve() {\n      observer.observe(document.body, {\n        childList: true,\n        subtree: true,\n      });\n    }\n\n    if (document.body) {\n      startObserve();\n    } else {\n      document.addEventListener('DOMContentLoaded', startObserve);\n    }\n  }\n\n  /* === Backup timed passes (\u515C\u5E95, \u52A0\u5BC6) === */\n  setTimeout(function() { runAll(); }, 100);\n  setTimeout(function() { runAll(); }, 300);\n  setTimeout(function() { runAll(); }, 800);\n  setTimeout(function() { runAll(); }, 1500);\n  setTimeout(function() { runAll(); }, 3000);\n  setTimeout(function() { runAll(); }, 6000);\n  if (typeof window !== 'undefined') {\n    window.addEventListener('load', function() { runAll(); });\n  }\n})();\n"],
  "mappings": "CAMC,UAAW,CACV,SAAS,eAAe,KAAM,CAC5B,IAAI,MAAQ,MAAQ,SACpB,MAAM,iBAAiB,+FAA+F,EAAE,QAAQ,SAAS,IAAK,CAC5I,IAAI,aAAa,MAAO,sCAAiC,CAC3D,CAAC,EACD,MAAM,iBAAiB,iDAAiD,EAAE,QAAQ,SAAS,IAAK,CAC9F,IAAI,aAAa,MAAO,sCAAiC,CAC3D,CAAC,EAED,MAAM,iBAAiB,+DAA+D,EAAE,QAAQ,SAAS,IAAK,CACvG,IAAI,aAAa,KAAK,GACzB,IAAI,aAAa,MAAO,gCAA2B,CAEvD,CAAC,CACH,CAEA,SAAS,mBAAmB,KAAM,CAChC,IAAI,MAAQ,MAAQ,SACpB,MAAM,iBAAiB,kBAAkB,EAAE,QAAQ,SAAS,EAAG,CAC7D,IAAI,KAAO,EAAE,aAAa,MAAM,GAAK,GACjC,MAAQ,mBACZ,GAAI,KAAK,SAAS,eAAe,EAAG,CAClC,IAAI,KAAO,KAAK,MAAM,eAAe,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EACpE,MAAQ,KAAK,QAAQ,KAAM,GAAG,EAAE,QAAQ,QAAS,SAAS,EAAG,CAAE,OAAO,EAAE,YAAY,CAAG,CAAC,EAAI,aAC9F,SAAW,OAAS,eAClB,MAAQ,0BACC,KAAK,SAAS,YAAY,EAAG,CACtC,IAAI,MAAQ,KAAK,MAAM,YAAY,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EACpD,MAAQ,MAAM,QAAQ,KAAM,GAAG,CACjC,CACA,EAAE,aAAa,aAAc,KAAK,CACpC,CAAC,CACH,CAEA,SAAS,mBAAmB,KAAM,CAChC,IAAI,MAAQ,MAAQ,SACpB,MAAM,iBAAiB,sBAAsB,EAAE,QAAQ,SAAS,EAAG,CACjE,IAAI,MAAQ,EAAE,aAAe,IAAI,KAAK,EACtC,GAAI,KACF,EAAE,gBAAgB,YAAY,MACzB,CACL,IAAI,KAAO,EAAE,aAAa,MAAM,GAAK,GACrC,GAAI,KAAK,SAAS,eAAe,EAAG,CAClC,IAAI,KAAO,KAAK,MAAM,eAAe,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,GAAG,EAAE,CAAC,EACpE,EAAE,aAAa,aAAc,KAAK,QAAQ,KAAM,GAAG,EAAE,QAAQ,QAAS,SAAS,EAAG,CAAE,OAAO,EAAE,YAAY,CAAG,CAAC,EAAI,aAAa,CAChI,CACF,CACF,CAAC,CACH,CAEA,SAAS,YAAY,KAAM,CACzB,IAAI,MAAQ,MAAQ,SACpB,MAAM,iBAAiB,0DAA0D,EAAE,QAAQ,SAAS,IAAK,CACvG,GAAI,CAAC,IAAI,cAAc,OAAO,EAAG,CAC/B,IAAI,EAAI,SAAS,gBAAgB,6BAA8B,OAAO,EACtE,EAAE,YAAc,IAAI,QAAQ,aAAa,EAAI,iBAAmB,aAChE,IAAI,aAAa,EAAG,IAAI,UAAU,CACpC,CACF,CAAC,CACH,CAEA,SAAS,eAAe,KAAM,CAC5B,IAAI,MAAQ,MAAQ,SACpB,MAAM,iBAAiB,qCAAqC,EAAE,QAAQ,SAAS,IAAK,CAClF,IAAI,QAAU,IAAI,aAAa,SAAS,GAAK,GACzC,MAAQ,QAAQ,QAAQ,MAAM,GAAK,EAAI,cAAgB,kBAC3D,IAAI,aAAa,aAAc,KAAK,CACtC,CAAC,EACD,MAAM,iBAAiB,0CAA0C,EAAE,QAAQ,SAAS,IAAK,CACnF,IAAI,YAAY,KAAK,GACzB,IAAI,aAAa,aAAc,eAAe,CAChD,CAAC,CACH,CAEA,SAAS,kBAAkB,KAAM,CAC/B,IAAI,MAAQ,MAAQ,SACpB,MAAM,iBAAiB,6FAA6F,EAAE,QAAQ,SAAS,GAAI,CACzI,GAAG,aAAa,OAAQ,KAAK,CAC/B,CAAC,CACH,CAGA,SAAS,sBAAsB,KAAM,CACnC,IAAI,MAAQ,MAAQ,SACpB,MAAM,iBAAiB,mBAAmB,EAAE,QAAQ,SAAS,GAAI,CAC/D,GAAG,aAAa,OAAQ,QAAQ,EAChC,GAAG,aAAa,WAAY,GAAG,GAC3B,CAAC,GAAG,aAAa,YAAY,GAAK,GAAG,aAAa,YAAY,IAAM,kBACtE,GAAG,aAAa,aAAc,+BAA+B,CAEjE,CAAC,CACH,CAGA,SAAS,iBAAiB,KAAM,CAC9B,IAAI,MAAQ,MAAQ,SACpB,MAAM,iBAAiB,oFAAoF,EAAE,QAAQ,SAAS,IAAK,CACjI,GAAI,KAAI,YAAY,KAAK,EAEzB,KAAI,KAAO,IAAI,QAAQ,oEAAoE,EACvF,MAAQ,GACZ,GAAI,KAAM,CACR,IAAI,QAAU,KAAK,cAAc,8DAA8D,EAC/F,MAAQ,QAAU,QAAQ,YAAY,KAAK,EAAE,MAAM,EAAG,EAAE,EAAI,EAC9D,CACA,IAAI,aAAa,aAAc,MAAS,OAAS,MAAQ,WAAc,aAAa,EACtF,CAAC,CACH,CAGA,SAAS,cAAc,KAAM,CAC3B,IAAI,MAAQ,MAAQ,SACpB,MAAM,iBAAiB,gDAAgD,EAAE,QAAQ,SAAS,EAAG,CAE3F,IAAI,SAAW,EAAE,QAAQ,6EAA6E,EAClG,QAAU,SAAW,SAAS,cAAc,6CAA6C,EAAI,KAC7F,MAAQ,QAAU,QAAQ,YAAY,KAAK,EAAE,MAAM,EAAG,EAAE,EAAI,mBAChE,EAAE,aAAa,aAAc,KAAK,CACpC,CAAC,CACH,CAGA,SAAS,mBAAmB,KAAM,CAChC,IAAI,MAAQ,MAAQ,SACpB,MAAM,iBAAiB,kCAAkC,EAAE,QAAQ,SAAS,MAAO,CAEjF,MAAM,iBAAiB,8BAA8B,EAAE,QAAQ,SAAS,GAAI,CACtE,GAAG,aAAa,UAAU,IAAM,MAAM,GAAG,aAAa,WAAY,IAAI,CAC5E,CAAC,CACH,CAAC,CACH,CAGA,SAAS,gBAAgB,KAAM,CAC7B,IAAI,MAAQ,MAAQ,SACpB,MAAM,iBAAiB,2DAA2D,EAAE,QAAQ,SAAS,GAAI,CAGvG,IAAI,MAAQ,SAAS,cAAc,IAAI,EACvC,MAAM,UAAY,GAAG,UACrB,MAAM,UAAY,GAAG,UACrB,GAAG,WAAW,aAAa,MAAO,EAAE,CACtC,CAAC,CACH,CAGA,SAAS,qBAAqB,KAAM,CAClC,IAAI,MAAQ,MAAQ,SACpB,MAAM,iBAAiB,sDAAsD,EAAE,QAAQ,SAAS,EAAG,CAC7F,EAAE,YAAY,KAAK,GACvB,EAAE,aAAa,aAAc,iBAAiB,CAChD,CAAC,CACH,CAEA,SAAS,OAAO,KAAM,CACpB,eAAe,IAAI,EACnB,mBAAmB,IAAI,EACvB,mBAAmB,IAAI,EACvB,YAAY,IAAI,EAChB,eAAe,IAAI,EACnB,kBAAkB,IAAI,EACtB,sBAAsB,IAAI,EAC1B,iBAAiB,IAAI,EACrB,cAAc,IAAI,EAClB,mBAAmB,IAAI,EACvB,gBAAgB,IAAI,EACpB,qBAAqB,IAAI,CAC3B,CAUA,GAPI,SAAS,aAAe,UAC1B,SAAS,iBAAiB,mBAAoB,UAAW,CAAE,OAAO,CAAG,CAAC,EAEtE,OAAO,EAIL,OAAO,kBAAqB,YAAa,CAY3C,IAASA,cAAT,UAAwB,CACtB,SAAS,QAAQ,SAAS,KAAM,CAC9B,UAAW,GACX,QAAS,EACX,CAAC,CACH,EALS,aAAAA,cAXL,QAAU,GACV,SAAW,IAAI,iBAAiB,SAAS,UAAW,CAClD,UACJ,QAAU,GAEV,sBAAsB,UAAW,CAC/B,OAAO,EACP,QAAU,EACZ,CAAC,EACH,CAAC,EASG,SAAS,KACXA,cAAa,EAEb,SAAS,iBAAiB,mBAAoBA,aAAY,CAE9D,CAGA,WAAW,UAAW,CAAE,OAAO,CAAG,EAAG,GAAG,EACxC,WAAW,UAAW,CAAE,OAAO,CAAG,EAAG,GAAG,EACxC,WAAW,UAAW,CAAE,OAAO,CAAG,EAAG,GAAG,EACxC,WAAW,UAAW,CAAE,OAAO,CAAG,EAAG,IAAI,EACzC,WAAW,UAAW,CAAE,OAAO,CAAG,EAAG,GAAI,EACzC,WAAW,UAAW,CAAE,OAAO,CAAG,EAAG,GAAI,EACrC,OAAO,QAAW,aACpB,OAAO,iBAAiB,OAAQ,UAAW,CAAE,OAAO,CAAG,CAAC,CAE5D,GAAG",
  "names": ["startObserve"]
}
