{"status":200,"features":{"CMVy2zF":{"defaultValue":{}}},"experiments":[{"key":"psg-link-list-dev","changeId":"d3bc93f6211665034bb887ccb9405da899d823f505a5121aaa619138a8d323e4","status":"running","variations":[{"css":".BodyWrapper-kzyFNv h2:nth-child(8)\n{display: none}\n\n.BodyWrapper-kzyFNv ul {display: none}\n\n.BodyWrapper-kzyFNv hr:nth-child(7) {display: none}\n","js":"// Remove the horizontal line before \"Our top picks\"\ndocument.querySelector(\"#our-top-picks\")?.previousElementSibling?.remove();\n\n// Remove the \"Our top picks\" header\ndocument.querySelector(\"#our-top-picks\")?.remove();\n\n// Remove the <ul> with the five picks\ndocument.querySelector(\"#our-top-picks + ul\")?.remove();\n","domMutations":[]},{"css":"[class^=\"ProductSummaryGridWrapper\"] {\n  display: none !important;\n}","js":"","domMutations":[]},{"css":".BodyWrapper-kzyFNv h2:nth-child(8)\n{display: none}\n\n.BodyWrapper-kzyFNv ul {display: none}\n\n\n[class^=\"ProductSummaryGridWrapper\"] {\n  display: none !important;\n}","js":"// Remove the horizontal line before \"Our top picks\"\ndocument.querySelector(\"#our-top-picks\")?.previousElementSibling?.remove();\n\n// Remove the \"Our top picks\" header\ndocument.querySelector(\"#our-top-picks\")?.remove();\n\n// Remove the <ul> with the five picks\ndocument.querySelector(\"#our-top-picks + ul\")?.remove();\n","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://stag.gq.com/story/best-summer-clothes-for-men-2025"}],"weights":[0.3334,0.3333,0.3333],"meta":[{"key":"0","name":"psg"},{"key":"1","name":"link list"},{"key":"2","name":"none"}],"filters":[],"seed":"5850c39b-f075-43b8-ad34-0c2c4be1bcd4","name":"psg-link-list-dev","phase":"0","coverage":1},{"key":"gq_image_mouseover_qa","changeId":"3dcf85c8fc4ab1f0c70e7545c95f0b670268c9bb2555536b506a70f6c4dc2fae","status":"running","variations":[{"css":"","js":"","domMutations":[]},{"css":"/* Ensure the image is clipped when it scales */\n.UnifiedProductCardImageWrapper-cHqstj {\n  overflow: hidden;\n}\n\n/* Smooth zoom transition */\n.UnifiedProductCardImageWrapper-cHqstj\n.ResponsiveImageContainer-eNxvmU {\n  transition: transform 300ms ease;\n  will-change: transform;\n}\n\n/* Zoom on hover */\n.UnifiedProductCardImageWrapper-cHqstj:hover\n.ResponsiveImageContainer-eNxvmU {\n  transform: scale(1.05);\n}","js":"","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.gq.com/story/best-outdoor-clothing-brands"}],"weights":[0,1],"meta":[{"key":"0","name":"Control"},{"key":"1","name":"Variation 1"}],"filters":[],"seed":"d2862880-896a-4e64-8638-c4c488a48c6e","name":"gq_image_mouseover_QA","phase":"0","condition":{"id":"0c3a3ab2-e1eb-4236-a45e-b3aa5c7d7936"},"coverage":1},{"key":"gq-editor-note","changeId":"d3885b33fed3b1e32e87464b6fd014e405d428a55541007940cf403ce2dee3b9","status":"running","variations":[{"css":"","js":"","domMutations":[]},{"css":".UnifiedProductCardEditorNoteContent-hbwUqj {\n  display: none !important;\n}","js":"","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.gq.com/the-ski-shop"}],"weights":[0,1],"meta":[{"key":"0","name":"Control"},{"key":"1","name":"Variation 1"}],"filters":[],"seed":"76695196-87be-4eac-91e9-a5f824372287","name":"gq-editor-note","phase":"0","condition":{"id":"0c3a3ab2-e1eb-4236-a45e-b3aa5c7d7936"},"coverage":1},{"key":"gq-psg-ll-qa","changeId":"8da6ac11b2da64717c626afd7effbcfd59c28f255b4d844edebd36a24655f915","status":"running","variations":[{"css":"div.heading-h3:has(+ ul) {\n  display: none;\n}\n\ndiv.heading-h3:has(+ ul) + ul {\n  display: none;\n}","js":"","domMutations":[]},{"css":"/* Hide the specific product summary grid */\n.ProductSummaryGridWrapper-bJtJNc.dIcZVB {\n    display: none !important;\n}","js":"","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"bucketVersion":3,"minBucketVersion":0,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://stag.gq.com/story/the-best-flannel-shirts-for-men"}],"weights":[0,1],"meta":[{"key":"0","name":"psg"},{"key":"1","name":"link-list"}],"filters":[],"seed":"b5759754-27c0-40d4-bf29-ba0fd35a981e","name":"gq-psg-ll-qa","phase":"2","condition":{"id":"0c3a3ab2-e1eb-4236-a45e-b3aa5c7d7936"},"coverage":1},{"key":"cms3t5v","changeId":"9beaf565a49c468fdd38dd4d08020d3b5ea51bd3c0d58090b11ce1ce1617b187","status":"running","variations":[{"css":"article div.heading-h3[role=\"heading\"][aria-level=\"3\"],\narticle div.heading-h3[role=\"heading\"][aria-level=\"3\"] ~ ul,\narticle div.heading-h3[role=\"heading\"][aria-level=\"3\"] ~ * ul {\n  display: none !important;\n}","js":"","domMutations":[]},{"css":"/* Hide the entire Product Summary Grid component */\n[data-event-click*=\"ProductSummaryGrid\"],\n[data-in-view*=\"ProductSummaryGrid\"] {\n  display: none !important;\n}","js":"","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.gq.com/story/the-best-flannel-shirts-for-men"},{"include":true,"type":"simple","pattern":"https://www.gq.com/story/best-travel-blazers"},{"include":true,"type":"simple","pattern":"https://www.gq.com/story/best-back-shaver"},{"include":true,"type":"simple","pattern":"https://www.gq.com/story/best-eye-cream"}],"weights":[0.5,0.5],"meta":[{"key":"0","name":"psg"},{"key":"1","name":"link-list"}],"filters":[],"seed":"5be6cfc7-8da8-46b3-8fd8-5b89f9ad999b","name":"CMs3T5V","phase":"0","coverage":1},{"key":"cmraoku","changeId":"616f6608bc6471fbbf55fff51711f0e97b67156ec492aaaeb602f7add62901d0","status":"running","variations":[{"css":"div.heading-h3:has(+ ul) {\n  display: none;\n}\n\ndiv.heading-h3:has(+ ul) + ul {\n  display: none;\n}","js":"","domMutations":[]},{"css":"/* Hide the entire Product Summary Grid component */\n[data-testid=\"ProductSummaryWrapper\"]\n  /* this hides each product card */ {\n  display: none !important;\n}\n\n/* If you want to hide the whole grid section including the title */\n.ProductSummaryGridWrapper-hlpJsT {\n  display: none !important;\n}","js":"","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.gq.com/story/best-date-night-outfits-2026"},{"include":true,"type":"simple","pattern":"https://www.gq.com/gallery/mens-jewelry-under-150"},{"include":true,"type":"simple","pattern":"https://www.gq.com/story/simple-skin-care-for-men"},{"include":true,"type":"simple","pattern":"https://www.gq.com/story/gifts-for-girlfriends"}],"weights":[0.5,0.5],"meta":[{"key":"0","name":"psg"},{"key":"1","name":"link-list"}],"filters":[],"seed":"5be6cfc7-8da8-46b3-8fd8-5b89f9ad999b","name":"CMRAOkU","phase":"0","coverage":1},{"key":"gq-author-bio-byline-qa","changeId":"91de865eeffebfac1b59a0d67b79f16f58c7324be14c47d9dc42d9f998a1f7dd","status":"running","variations":[{"css":"","js":"","domMutations":[]},{"css":".top-author-bio {\n  font-size: 0.9rem;\n  line-height: 1.4;\n  text-align: center;\n  margin: 0;\n  padding: 0;\n}\n\n.top-author-bio * {\n  margin: 0;\n  padding: 0;\n}\n\n.top-bio-read-more {\n  font-weight: 600;\n  text-decoration: underline;\n  color: inherit; /* uses the site's yellow from 'text link' */\n}\n\ndiv[data-testid=\"action-bar-wrapper\"] {\n  display: none !important;\n}","js":"// Function to truncate text to fit 3 lines on mobile/desktop\nfunction truncateBioText(text, maxChars) {\n  if (text.length <= maxChars) return text;\n  return text.slice(0, maxChars).trim().replace(/[,;:]?$/, '') + '...';\n}\n\nfunction addTopAuthorBio() {\n  const bylineContainer = document.querySelector('.ContentHeaderByline-bsLfvw, .BylinesWrapper-hmpxZW');\n  const authorBio = document.querySelector('.ContributorBioBio-fraKwI');\n\n  if (bylineContainer && authorBio) {\n    if (!document.querySelector('.top-author-bio')) {\n      const bioClone = document.createElement('div');\n      bioClone.classList.add('top-author-bio');\n\n      // Get the text content and trim original Read More\n      let bioText = authorBio.textContent.replace('Read More', '').trim();\n\n      // Determine max chars depending on viewport\n      const isMobile = window.innerWidth <= 767;\n      const maxChars = isMobile ? 150 : 250; // adjust experimentally to fit 3 lines\n\n      bioText = truncateBioText(bioText, maxChars);\n\n      // Add inline Read More\n      bioText += ' ';\n      const readMoreLink = document.createElement('a');\n      readMoreLink.href = '/contributor/tyler-chin';\n      readMoreLink.className = 'text link top-bio-read-more';\n      readMoreLink.textContent = 'Read More';\n\n      const textNode = document.createTextNode(bioText);\n      bioClone.appendChild(textNode);\n      bioClone.appendChild(readMoreLink);\n\n      bylineContainer.insertAdjacentElement('afterend', bioClone);\n    }\n  }\n}\n\n// Observe React re-renders\nconst observer = new MutationObserver(() => {\n  addTopAuthorBio();\n});\nobserver.observe(document.body, { childList: true, subtree: true });\n\n// Initial attempt\naddTopAuthorBio();","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.gq.com/story/best-underwear-for-working-out"}],"weights":[0,1],"meta":[{"key":"0","name":"Control"},{"key":"1","name":"Variation 1"}],"filters":[],"seed":"dc65b413-9ee9-440b-8a83-193a0a87d77d","name":"gq-author-bio-in-byline-qa","phase":"0","condition":{"id":"0c3a3ab2-e1eb-4236-a45e-b3aa5c7d7936"},"coverage":1},{"key":"gq-editor-notes-card1-qa","changeId":"33b97aab05dc9be2c7a028e175711dd158c8e00320f93784fb3aa2c04c031931","status":"draft","variations":[{"css":"","js":"","domMutations":[]},{"css":"/* hide the original editor note at bottom */\n.UnifiedLandscapeProductCardWrapper-hlWSjM\n  > .UnifiedLandscapeProductCardDescDetails-gUCNkc {\n  display: none !important;\n}\n\n/* optional spacing for the moved note */\n.cloned-editor-note {\n  margin-bottom: 10px;\n}\n\n.cloned-editor-note {\n  margin-bottom: 10px;\n  text-align: center;\n}","js":"(function() {\n  const interval = setInterval(() => {\n    const cards = document.querySelectorAll('.UnifiedLandscapeProductCardWrapper-hlWSjM');\n    if (!cards.length) return;\n\n    cards.forEach(card => {\n      const description = card.querySelector('.UnifiedLandscapeProductCardDescDetails-gUCNkc');\n      const offerContainer = card.querySelector('.UnifiedProductCardOfferContainer-jrdlwn');\n\n      // If we've already added a clone, do nothing\n      if (card.querySelector('.cloned-editor-note')) return;\n\n      if (description && offerContainer) {\n        const clone = description.cloneNode(true);\n        clone.classList.add('cloned-editor-note');\n\n        offerContainer.insertAdjacentElement('beforebegin', clone);\n      }\n    });\n\n  }, 300);\n})();","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.gq.com/gallery/bengal-stripe-shirts"}],"weights":[0,1],"meta":[{"key":"0","name":"Control"},{"key":"1","name":"Variation 1"}],"filters":[],"seed":"1f35c7b5-beb1-4c9a-8b9b-3be650f8be55","name":"gq-editor-notes-card1-qa","phase":"0","condition":{"id":"0c3a3ab2-e1eb-4236-a45e-b3aa5c7d7936"},"coverage":1},{"key":"gq-savings-badge","changeId":"146b6b74225aaab6c6b17cb0c833d3db72ceacb4c2e0bc35ccac0fdc6c73c198","status":"draft","variations":[{"css":"","js":"","domMutations":[]},{"css":"div[type=card] {\n  position: relative;\n}\n\n.price-diff {\n  position: absolute;\n  top: 8px;\n  left: 8px;\n  background: #000;\n  color: #fff;\n  padding: 6px 12px;\n  border-radius: 999px;\n\n  /* fallback font (will be overridden by JS) */\n  font-family: Arial, Helvetica, sans-serif;\n\n  font-weight: 600;\n  font-size: 0.85rem;\n  line-height: 1;\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  z-index: 10;\n}\n\n.price-diff span {\n  font-weight: 800;\n}","js":"(function () {\n  const selector = 'div[type=card]';\n  const seen = new WeakSet();\n\n  function processCard(item) {\n    if (seen.has(item)) return;\n    seen.add(item);\n\n    if (item.querySelector('.price-diff')) return; // already decorated\n\n    const offer = item.querySelector('div > a[data-buy-button=true]');\n    if (!offer) return;\n\n    const nums = (offer.innerText || '').match(/\\d+/g);\n    if (!nums || nums.length < 2) return;\n\n    const oldPrice = parseInt(nums[0], 10);\n    const newPrice = parseInt(nums[1], 10);\n    if (Number.isNaN(oldPrice) || Number.isNaN(newPrice)) return;\n\n    const diff = oldPrice - newPrice;\n    if (diff <= 0) return;\n\n    const badge = document.createElement('div');\n    badge.className = 'price-diff';\n    badge.innerHTML = `SAVE <span>$${diff}</span>`;\n\n    const image = item.querySelector('div[class*=UnifiedProductCardObject]');\n    if (!image) return;\n\n    const computed = window.getComputedStyle(image);\n    if (computed.position === 'static') image.style.position = 'relative';\n\n    image.appendChild(badge);\n  }\n\n  document.querySelectorAll(selector).forEach(processCard);\n\n  const observer = new MutationObserver(mutations => {\n    for (const m of mutations) {\n      for (const node of m.addedNodes) {\n        if (node.nodeType !== 1) continue; // skip non-elements\n        if (node.matches && node.matches(selector)) {\n          try { processCard(node); } catch (e) { /* ignore */ }\n        }\n\n        // also check for any cards inside the added subtree\n        if (node.querySelectorAll) {\n          const nested = node.querySelectorAll(selector);\n          nested.forEach(n => {\n            try { processCard(n); } catch (e) { /* ignore */ }\n          });\n        }\n      }\n    }\n  });\n\n  observer.observe(document.documentElement || document, { childList: true, subtree: true });\n  window.stopCardObserver = () => observer.disconnect();\n})();","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"bucketVersion":1,"minBucketVersion":0,"urlPatterns":[{"include":true,"type":"simple","pattern":"*gq.com/best-menswear-sales"}],"weights":[0.5,0.5],"meta":[{"key":"0","name":"Control"},{"key":"1","name":"Variation 1"}],"filters":[],"seed":"adbf6c92-8c06-4e0c-b00c-999fe9c7e998","name":"gq-savings-badge","phase":"0","condition":{"id":"0c3a3ab2-e1eb-4236-a45e-b3aa5c7d7936"},"coverage":1},{"key":"CMXifOa","changeId":"17e8b298c55d4a08a27d316d146f754baf6b729a899e2d309f5221177c9a63f6","status":"running","variations":[{"css":"","js":"","domMutations":[]},{"css":".top-author-bio {\n  font-size: 0.9rem;\n  line-height: 1.4;\n  text-align: center;\n  margin: 0;\n  padding: 0;\n}\n\n.top-author-bio * {\n  margin: 0;\n  padding: 0;\n}\n\n.top-bio-read-more {\n  font-weight: 600;\n  text-decoration: underline;\n  color: inherit; /* uses the site's yellow from 'text link' */\n}\n\ndiv[data-testid=\"action-bar-wrapper\"] {\n  display: none !important;\n}","js":"// Function to truncate text to fit 3 lines on mobile/desktop\nfunction truncateBioText(text, maxChars) {\n  if (text.length <= maxChars) return text;\n  return text.slice(0, maxChars).trim().replace(/[,;:]?$/, '') + '...';\n}\n\nfunction addTopAuthorBio() {\n  const bylineContainer = document.querySelector('.ContentHeaderByline-bsLfvw, .BylinesWrapper-hmpxZW');\n  const authorBio = document.querySelector('.ContributorBioBio-fraKwI');\n\n  if (bylineContainer && authorBio) {\n    if (!document.querySelector('.top-author-bio')) {\n      const bioClone = document.createElement('div');\n      bioClone.classList.add('top-author-bio');\n\n      // Get the text content and trim original Read More\n      let bioText = authorBio.textContent.replace('Read More', '').trim();\n\n      // Determine max chars depending on viewport\n      const isMobile = window.innerWidth <= 767;\n      const maxChars = isMobile ? 150 : 250; // adjust experimentally to fit 3 lines\n\n      bioText = truncateBioText(bioText, maxChars);\n\n      // Add inline Read More\n      bioText += ' ';\n      const readMoreLink = document.createElement('a');\n      readMoreLink.href = '/contributor/tyler-chin';\n      readMoreLink.className = 'text link top-bio-read-more';\n      readMoreLink.textContent = 'Read More';\n\n      const textNode = document.createTextNode(bioText);\n      bioClone.appendChild(textNode);\n      bioClone.appendChild(readMoreLink);\n\n      bylineContainer.insertAdjacentElement('afterend', bioClone);\n    }\n  }\n}\n\n// Observe React re-renders\nconst observer = new MutationObserver(() => {\n  addTopAuthorBio();\n});\nobserver.observe(document.body, { childList: true, subtree: true });\n\n// Initial attempt\naddTopAuthorBio();","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.gq.com/story/best-underwear-for-working-out"},{"include":true,"type":"simple","pattern":"https://www.gq.com/story/best-hair-growth-products"},{"include":true,"type":"simple","pattern":"https://www.gq.com/story/three-button-suits-in-menswear"},{"include":true,"type":"simple","pattern":"https://www.gq.com/story/the-best-sweatpants"},{"include":true,"type":"simple","pattern":"https://www.gq.com/story/jcrew-oxford-poplin-shirt"}],"weights":[0.5,0.5],"meta":[{"key":"0","name":"control"},{"key":"1","name":"variation"}],"filters":[],"seed":"dc65b413-9ee9-440b-8a83-193a0a87d77d","name":"CMXifOa","phase":"0","coverage":1},{"key":"CMYVpOv","changeId":"acda892e105cd7a2db04e647b0cf7f098163774bbba45ade032e6281c18acf49","status":"running","variations":[{"css":"","js":"","domMutations":[]},{"css":"/* Remove clamp / truncation */\n.UnifiedProductCardDescriptionWrapper-kMOurR {\n  display: block !important;\n  overflow: visible !important;\n  text-align: center !important; /* center text */\n}\n\n.ClampWrapper-btTyRn {\n  -webkit-line-clamp: unset !important;\n  max-height: none !important;\n  overflow: visible !important;\n}\n\n.ClampContent-gsyjBh {\n  overflow: visible !important;\n}\n\n/* Spacing + better centering behavior */\n.ProductOfferWrapper-jbhYWP .UnifiedProductCardDescriptionWrapper-kMOurR {\n  margin: 0 0 12px 0;\n  font-size: 14px;\n  line-height: 1.4;\n  text-align: center !important; /* reinforce centering */\n}\n\n/* Optional: ensure inner paragraph is centered */\n.UnifiedProductCardDescriptionWrapper-kMOurR p {\n  margin: 0 auto;\n  text-align: center;\n}","js":"(function () {\n  function moveNotes() {\n    document.querySelectorAll('.UnifiedLandscapeProductCardWrapper-hlWSjM').forEach(card => {\n      const note = card.querySelector('.UnifiedProductCardDescriptionWrapper-kMOurR');\n      const buyButton = card.querySelector('[data-buy-button=\"true\"]');\n\n      if (!note || !buyButton) return;\n\n      // جلوگیری از دوباره‌کاری\n      if (note.dataset.moved === \"true\") return;\n\n      const ctaBlock = buyButton.closest('.ProductOfferWrapper-jbhYWP');\n\n      if (ctaBlock) {\n        ctaBlock.parentNode.insertBefore(note, ctaBlock);\n        note.dataset.moved = \"true\";\n      }\n    });\n  }\n\n  // run immediately + after async loads\n  moveNotes();\n  const observer = new MutationObserver(moveNotes);\n  observer.observe(document.body, { childList: true, subtree: true });\n})();","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.gq.com/gallery*"},{"include":true,"type":"simple","pattern":"https://www.gq.com/gallery/best-new-menswear-to-buy-this-week-4-3-26"}],"weights":[0.1,0.9],"meta":[{"key":"0","name":"control"},{"key":"1","name":"variation"}],"filters":[],"seed":"1f35c7b5-beb1-4c9a-8b9b-3be650f8be55","name":"CMYVpOv","phase":"0","condition":{"isMobile":false},"coverage":1},{"key":"gq-editor-note-v2-qa","changeId":"2c2af7c76ae69128252da3411b0f1e5a9596b1807d68ffcf108d3d17eb9ee1da","status":"draft","variations":[{"css":"","js":"","domMutations":[]},{"css":"/* Hide the original editor note at the bottom */\n.UnifiedLandscapeProductCardWrapper-hlWSjM\n  > .UnifiedLandscapeProductCardDescDetails-gUCNkc {\n  display: none !important;\n}\n\n/* Styling for the cloned note */\n.cloned-editor-note {\n  margin-bottom: 10px;\n  text-align: center;\n  width: 100%;\n  position: relative;\n  z-index: 1;\n  overflow: visible !important; /* ensure full visibility */\n}\n\n/* Remove truncation / clamping in cloned note */\n.cloned-editor-note .ClampWrapper-btTyRn,\n.cloned-editor-note .ClampContent-gsyjBh,\n.cloned-editor-note .UnifiedProductCardClampedDescription-iQnutI {\n  display: block !important;\n  overflow: visible !important;\n  max-height: none !important;\n  height: auto !important;\n  -webkit-line-clamp: unset !important;\n  -webkit-box-orient: unset !important;\n}\n\n/* Ensure inner text expands fully */\n.cloned-editor-note p {\n  overflow: visible !important;\n  display: block !important;\n}\n\n/* Prevent overlap with the buy button */\n.UnifiedProductCardOfferContainer-jrdlwn {\n  position: relative;\n  z-index: 0;\n}","js":"(function() {\n  const interval = setInterval(() => {\n    const cards = document.querySelectorAll('.UnifiedLandscapeProductCardWrapper-hlWSjM');\n    if (!cards.length) return;\n\n    let allProcessed = true;\n\n    cards.forEach(card => {\n      const description = card.querySelector('.UnifiedLandscapeProductCardDescDetails-gUCNkc');\n      const offerContainer = card.querySelector('.UnifiedProductCardOfferContainer-jrdlwn');\n\n      // Skip if already processed\n      if (card.querySelector('.cloned-editor-note')) return;\n\n      if (!description || !offerContainer) {\n        allProcessed = false;\n        return;\n      }\n\n      const clone = description.cloneNode(true);\n      clone.classList.add('cloned-editor-note');\n\n      // Remove clamping classes from clone\n      clone.querySelectorAll('[class*=\"Clamp\"]').forEach(el => {\n        el.className = el.className\n          .split(' ')\n          .filter(c => !c.toLowerCase().includes('clamp'))\n          .join(' ');\n      });\n\n      // Insert cloned note above the buy button\n      offerContainer.insertAdjacentElement('beforebegin', clone);\n    });\n\n    // Stop interval once all cards are processed\n    if (allProcessed) {\n      clearInterval(interval);\n    }\n\n  }, 300);\n})();","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.gq.com/gallery/best-new-menswear-to-buy-this-week-4-3-26"}],"weights":[0,1],"meta":[{"key":"0","name":"Control"},{"key":"1","name":"Variation 1"}],"filters":[],"seed":"11534077-f105-4a61-b768-d9fa87aa033c","name":"gq-editor-note-v2-qa","phase":"0","coverage":1},{"key":"gq-editor-notes-v2-qa","changeId":"0b5b403dc5ea7ede49ff75a2e65e97df53e809795b8ba205158f823456eeb3f5","status":"draft","variations":[{"css":"","js":"","domMutations":[]},{"css":"/* Remove clamp / truncation */\n.UnifiedProductCardDescriptionWrapper-kMOurR {\n  display: block !important;\n  overflow: visible !important;\n  text-align: center !important; /* ✅ center text */\n}\n\n.ClampWrapper-btTyRn {\n  -webkit-line-clamp: unset !important;\n  max-height: none !important;\n  overflow: visible !important;\n}\n\n.ClampContent-gsyjBh {\n  overflow: visible !important;\n}\n\n/* Spacing + better centering behavior */\n.ProductOfferWrapper-jbhYWP .UnifiedProductCardDescriptionWrapper-kMOurR {\n  margin: 0 0 12px 0;\n  font-size: 14px;\n  line-height: 1.4;\n  text-align: center !important; /* reinforce centering */\n}\n\n/* Optional: ensure inner paragraph is centered */\n.UnifiedProductCardDescriptionWrapper-kMOurR p {\n  margin: 0 auto;\n  text-align: center;\n}","js":"(function () {\n  function moveNotes() {\n    document.querySelectorAll('.UnifiedLandscapeProductCardWrapper-hlWSjM').forEach(card => {\n      const note = card.querySelector('.UnifiedProductCardDescriptionWrapper-kMOurR');\n      const buyButton = card.querySelector('[data-buy-button=\"true\"]');\n\n      if (!note || !buyButton) return;\n\n      // جلوگیری از دوباره‌کاری\n      if (note.dataset.moved === \"true\") return;\n\n      const ctaBlock = buyButton.closest('.ProductOfferWrapper-jbhYWP');\n\n      if (ctaBlock) {\n        ctaBlock.parentNode.insertBefore(note, ctaBlock);\n        note.dataset.moved = \"true\";\n      }\n    });\n  }\n\n  // run immediately + after async loads\n  moveNotes();\n  const observer = new MutationObserver(moveNotes);\n  observer.observe(document.body, { childList: true, subtree: true });\n})();","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.gq.com/gallery/bengal-stripe-shirts"}],"weights":[0,1],"meta":[{"key":"0","name":"Control"},{"key":"1","name":"Variation 1"}],"filters":[],"seed":"28741196-a9b7-4343-b6b9-447faa6d64c1","name":"gq-editor-notes-v2-qa","phase":"0","coverage":1},{"key":"CMhifIK","changeId":"b9acf558b520de7cbd260b9c31676063d843de81edd66e8fdaf2815a14a53024","status":"running","variations":[{"css":"","js":"","domMutations":[]},{"css":"div[type=card] {\n  position: relative;\n}\n\n.price-diff {\n  position: absolute;\n  top: 8px;\n  left: 8px;\n  background: #000;\n  color: #fff;\n  padding: 6px 12px;\n  border-radius: 999px;\n\n  /* fallback font (will be overridden by JS) */\n  font-family: Arial, Helvetica, sans-serif;\n\n  font-weight: 600;\n  font-size: 0.85rem;\n  line-height: 1;\n  display: inline-flex;\n  align-items: center;\n  gap: 6px;\n  z-index: 10;\n}\n\n.price-diff span {\n  font-weight: 800;\n}","js":"(function () {\n  const selector = 'div[type=card]';\n  const seen = new WeakSet();\n\n  function processCard(item) {\n    if (seen.has(item)) return;\n    seen.add(item);\n\n    if (item.querySelector('.price-diff')) return; // already decorated\n\n    const offer = item.querySelector('div > a[data-buy-button=true]');\n    if (!offer) return;\n\n    const nums = (offer.innerText || '').match(/\\d+/g);\n    if (!nums || nums.length < 2) return;\n\n    const oldPrice = parseInt(nums[0], 10);\n    const newPrice = parseInt(nums[1], 10);\n    if (Number.isNaN(oldPrice) || Number.isNaN(newPrice)) return;\n\n    const diff = oldPrice - newPrice;\n    if (diff <= 0) return;\n\n    const badge = document.createElement('div');\n    badge.className = 'price-diff';\n    badge.innerHTML = `SAVE <span>$${diff}</span>`;\n\n    const image = item.querySelector('div[class*=UnifiedProductCardObject]');\n    if (!image) return;\n\n    const computed = window.getComputedStyle(image);\n    if (computed.position === 'static') image.style.position = 'relative';\n\n    image.appendChild(badge);\n  }\n\n  document.querySelectorAll(selector).forEach(processCard);\n\n  const observer = new MutationObserver(mutations => {\n    for (const m of mutations) {\n      for (const node of m.addedNodes) {\n        if (node.nodeType !== 1) continue; // skip non-elements\n        if (node.matches && node.matches(selector)) {\n          try { processCard(node); } catch (e) { /* ignore */ }\n        }\n\n        // also check for any cards inside the added subtree\n        if (node.querySelectorAll) {\n          const nested = node.querySelectorAll(selector);\n          nested.forEach(n => {\n            try { processCard(n); } catch (e) { /* ignore */ }\n          });\n        }\n      }\n    }\n  });\n\n  observer.observe(document.documentElement || document, { childList: true, subtree: true });\n  window.stopCardObserver = () => observer.disconnect();\n})();","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"*gq.com/best-menswear-sales"}],"weights":[0.5,0.5],"meta":[{"key":"0","name":"control"},{"key":"1","name":"variation"}],"filters":[],"seed":"adbf6c92-8c06-4e0c-b00c-999fe9c7e998","name":"CMhifIK","phase":"0","coverage":1}],"dateUpdated":"2026-04-29T19:31:32.410Z","savedGroups":{}}