{"status":200,"features":{"cnt-unified-venue-card":{"defaultValue":{},"rules":[{"condition":{"contentType":"gallery"},"coverage":1,"hashAttribute":"id","seed":"3b2cfeb1-9993-4875-9830-083b67c2576b","hashVersion":2,"variations":[{},{"updates":[{"mergeKey":"gallery","payload":{"items[*]":{"enableUnifiedVenueCard":false,"dangerousPreHeaderTwo":"","name":""}}}]}],"weights":[0.8,0.2],"key":"cnt-unified-venue-card","meta":[{"key":"0","name":"control"},{"key":"1","name":"variation"}],"phase":"0","name":"cnt-unified-venue-card"}]}},"experiments":[{"key":"aa-visual-experiment-redirect-1","changeId":"7742d416f60351b48c8e4dba7b929a77ce44bad0b55a0c493806513c5d994528","status":"running","variations":[{"css":"","js":"","domMutations":[]},{"css":"","js":"","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/story/where-to-see-the-northern-lights-in-the-contiguous-united-states-1"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/story/how-to-spend-a-perfect-day-in-the-upper-west-side"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/story/the-most-visited-cities-in-the-world-from-paris-to-kuala-lumpur"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/a-frame-cabins-to-rent-on-airbnb"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/best-national-parks-to-visit-in-fall"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/the-best-places-to-retire-in-the-us-1?"}],"weights":[0.5,0.5],"meta":[{"key":"0","name":"Control"},{"key":"1","name":"Variation 1"}],"seed":"cac2f42f-1fe7-4a8f-b7d0-b0d5cc6e05e9","name":"aa-visual-experiment-redirect-1","phase":"0","coverage":1},{"key":"cmnklye","changeId":"94e70d6f677ee1d948f400fb842bfe5b05ef1688df0b07bfe00ee0d729107e78","status":"running","variations":[{"css":"","js":"","domMutations":[]},{"css":"","js":"(function () {\n  function updateButtons(root = document) {\n    root.querySelectorAll('a[data-buy-button=\"true\"]').forEach(button => {\n      const label = button.querySelector('.button__label');\n      if (!label) return;\n\n      if (/^Book Now at/i.test(label.textContent)) {\n        label.textContent = label.textContent.replace(\n          /^Book Now at\\s*/i,\n          'Check Availability at '\n        );\n      }\n    });\n  }\n\n  // Run once immediately\n  updateButtons();\n\n  // Watch for dynamically added content\n  const observer = new MutationObserver(mutations => {\n    mutations.forEach(mutation => {\n      mutation.addedNodes.forEach(node => {\n        if (node.nodeType === 1) {\n          updateButtons(node);\n        }\n      });\n    });\n  });\n\n  observer.observe(document.body, {\n    childList: true,\n    subtree: true\n  });\n})();","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/best-hotels-in-mexico-city"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/best-hotels-lisbon"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/best-hotels-in-kyoto"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/best-hotels-in-new-york-city"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/best-hotels-in-venice"}],"weights":[0.5,0.5],"meta":[{"key":"0","name":"control"},{"key":"1","name":"variation"}],"seed":"92710060-4611-484d-a412-6abfcd13b438","name":"CMnkLYe","phase":"0","coverage":1},{"key":"CMTH8qH","changeId":"4f80ac96926ad1741e5575bb1ebd22ff69739cfd3a52987aef5fa967a17f306e","status":"running","variations":[{"css":"","js":"","domMutations":[]},{"css":"[data-testid=\"product-offer-list-wrapper\"]\n  .product-offer-list__offer:not(:first-child) {\n  display: none !important;\n}","js":"","domMutations":[]},{"css":"[data-testid=\"product-offer-list-wrapper\"]\n  .product-offer-list__offer:nth-child(n + 3) {\n  display: none !important;\n}","js":"","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/best-hotels-in-barcelona"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/the-best-hotels-in-washington-dc"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/best-hotels-in-miami"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/best-hotels-in-tulum"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/best-hotels-in-new-orleans"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/best-hotels-in-puerto-rico"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/gallery/best-hotels-in-los-angeles"}],"weights":[0.3334,0.3333,0.3333],"meta":[{"key":"0","name":"control"},{"key":"1","name":"one-button"},{"key":"2","name":"two-buttons"}],"seed":"0d18d87e-2e63-4c3d-81ff-31f878374e71","name":"CMTH8qH","phase":"0","coverage":1},{"key":"cmkovbq","changeId":"70427bb5e9cd2be28ea400528e73e1d26391c154b8bc696af26a009af2999f2a","status":"running","variations":[{"css":"/* Version 5 1. Hide the header (both markup styles) */\ndiv[role=\"heading\"][aria-level=\"3\"].heading-h3,\nh3 {\n  display: none !important;\n}\n\n/* 2. Hide the next block after the header (wrapper case) */\ndiv[role=\"heading\"][aria-level=\"3\"].heading-h3 + *,\nh3 + * {\n  display: none !important;\n}\n\n/* 3. Safety: hide ULs directly after headers */\ndiv[role=\"heading\"][aria-level=\"3\"].heading-h3 + ul,\nh3 + ul {\n  display: none !important;\n}\n\n/* Hide only the first <ul> inside the article body container */\n.body__inner-container > ul:first-of-type {\n    display: none !important;\n}\n\n\n\n\n","js":"","domMutations":[]},{"css":"/* Hide all Product Summary Grid wrappers (any variant / hash) */\n[class^=\"ProductSummaryGridWrapper-\"] {\n  display: none !important;\n}\n","js":"","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/story/work-bags-that-go-beyond-the-office"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/story/beach-wedding-guest-dresses"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/story/i-tested-dozens-of-the-best-hand-warmers-these-ones-held-up-in-extreme-cold"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/story/travel-purses-we-love-from-cuyana-baggu-athleta"},{"include":true,"type":"simple","pattern":"https://www.cntraveler.com/preview/story/6973e55adf27f231ab317d30?status=draft&debug_config=copliot;t=1772123186589"}],"weights":[0.5,0.5],"meta":[{"key":"0","name":"psg"},{"key":"1","name":"link-list"}],"seed":"5be6cfc7-8da8-46b3-8fd8-5b89f9ad999b","name":"CMKoVbq","phase":"0","coverage":1},{"key":"cnt-theme-qa","changeId":"042a028294ea319dd818f16d01be12f58354e8d08b1047db85328ec37c534908","status":"running","variations":[{"css":"","js":"","domMutations":[]},{"css":"[data-testid=\"ContentHeaderContainer\"] {\n  background-color: red !important;\n}\n\n[data-testid=\"sticky-hero-ad\"],\n[data-testid=\"sticky-hero-ad\"] .ad--hero,\n[data-testid=\"sticky-hero-ad\"] .cns-ads-stage,\n[data-testid=\"sticky-hero-ad\"] .cns-ads-container {\n  background-color: red !important;\n}\n\n[data-testid=\"BreadcrumbTrail\"] {\n  background-color: red !important;\n}","js":"","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://stag.cntraveler.com/gallery/the-most-beautiful-places-in-ireland"}],"weights":[0,1],"meta":[{"key":"0","name":"Control"},{"key":"1","name":"Variation 1"}],"seed":"506c12a1-df46-4a59-bdb1-3a71f8aed266","name":"cnt-theme-qa","phase":"0","condition":{"id":"3ed1b76f-a186-4b66-ad4c-16a7b7194b66"},"coverage":1},{"key":"cmuhxtc-anna-test","changeId":"c0018a0d629c301039e89c46b4d6c120644df8c9375b9d502be7873eb877b2f3","status":"draft","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  color: #fff;\n}\n.top-author-bio * {\n  margin: 0;\n  padding: 0;\n}\n.top-bio-read-more {\n  font-weight: 600;\n  text-decoration: underline;\n  color: var(--color-text-link);\n}\n.top-author-avatar {\n  width: 80px;\n  height: 80px;\n  border-radius: 50%;\n  overflow: hidden;\n  margin: 0 auto 8px auto;\n  display: block;\n}\n.top-author-avatar img {\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n  border-radius: 50%;\n}","js":"function 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('.BylinesWrapper-hmpxZW');\n  const authorBioWrapper = document.querySelector('[class*=\"ContributorBioWrapper\"]');\n\n  if (bylineContainer && authorBioWrapper) {\n    if (!document.querySelector('.top-author-bio')) {\n\n      // Get bio text\n      const bioBioEl = authorBioWrapper.querySelector('[class*=\"ContributorBioBio\"]');\n      let bioText = bioBioEl ? bioBioEl.textContent.replace('Read More', '').trim() : '';\n\n      // Get contributor URL dynamically\n      const bylineLink = document.querySelector('[class*=\"BylineLink\"]');\n      const contributorHref = bylineLink ? bylineLink.getAttribute('href') : '#';\n\n      // Truncate\n      const isMobile = window.innerWidth <= 767;\n      const maxChars = isMobile ? 150 : 250;\n      bioText = truncateBioText(bioText, maxChars);\n\n      // Build wrapper\n      const bioClone = document.createElement('div');\n      bioClone.classList.add('top-author-bio');\n\n      // Clone avatar picture element\n      const avatarWrapper = authorBioWrapper.querySelector('[class*=\"ContributorBioAvatar\"]');\n      if (avatarWrapper) {\n        const picture = avatarWrapper.querySelector('picture');\n        if (picture) {\n          const avatarDiv = document.createElement('div');\n          avatarDiv.classList.add('top-author-avatar');\n          const pictureClone = picture.cloneNode(true);\n          avatarDiv.appendChild(pictureClone);\n          bioClone.appendChild(avatarDiv);\n        }\n      }\n\n      // Add text and Read More\n      const textNode = document.createTextNode(bioText + ' ');\n      const readMoreLink = document.createElement('a');\n      readMoreLink.href = contributorHref;\n      readMoreLink.className = 'top-bio-read-more';\n      readMoreLink.textContent = 'Read More';\n\n      bioClone.appendChild(textNode);\n      bioClone.appendChild(readMoreLink);\n\n      bylineContainer.insertAdjacentElement('afterend', bioClone);\n    }\n  }\n}\n\nconst observer = new MutationObserver(() => {\n  addTopAuthorBio();\n});\nobserver.observe(document.body, { childList: true, subtree: true });\n\naddTopAuthorBio();","domMutations":[]},{"css":".top-author-bio {\n  display: flex;\n  flex-direction: row;\n  align-items: flex-start;\n  gap: 16px;\n  margin: 24px auto 32px auto;\n  padding: 0 16px;\n  max-width: 700px;\n  text-align: left;\n  color: var(--color-text, #111);\n  box-sizing: border-box;\n}\n.top-author-avatar {\n  width: 80px;\n  height: 80px;\n  min-width: 80px;\n  border-radius: 50%;\n  overflow: hidden;\n  flex-shrink: 0;\n}\n.top-author-avatar picture {\n  display: block;\n  width: 80px;\n  height: 80px;\n  border-radius: 50%;\n  overflow: hidden;\n}\n.top-author-avatar img {\n  width: 80px !important;\n  height: 80px !important;\n  max-width: none !important;\n  object-fit: cover;\n  border-radius: 50%;\n  display: block;\n}\n.top-author-bio-text {\n  display: flex;\n  flex-direction: column;\n  gap: 4px;\n  font-size: 1rem;\n  line-height: 1.5;\n  min-width: 0;\n}\n.top-author-bio-name {\n  font-size: 0.9rem;\n  font-weight: 600;\n  margin: 0 0 4px 0;\n  padding: 0;\n}\n.top-bio-read-more {\n  font-weight: 600;\n  text-decoration: underline;\n  color: var(--color-text-link);\n  font-size: 1rem;\n  display: inline;\n}\n","js":"function truncateBioText(text, maxChars) {\n  if (text.length <= maxChars) return text;\n  return text.slice(0, maxChars).trim().replace(/[,;:]?$/, '') + '...';\n}\n\nfunction addTopAuthorBio() {\n  const bodyWrapper = document.querySelector('[data-testid=\"BodyWrapper\"]');\n  const authorBioWrapper = document.querySelector('[class*=\"ContributorBioWrapper\"]');\n\n  if (bodyWrapper && authorBioWrapper) {\n    if (!document.querySelector('.top-author-bio')) {\n\n      // Get plain bio text only — explicitly from ContributorBioBio, not footer\n      const bioBioEl = authorBioWrapper.querySelector('[class*=\"ContributorBioBio\"]');\n      let bioText = bioBioEl ? bioBioEl.textContent.replace('Read More', '').trim() : '';\n\n      // Get author name\n      const bioHeaderEl = authorBioWrapper.querySelector('[class*=\"ContributorBioHeader\"]');\n      const authorName = bioHeaderEl ? bioHeaderEl.textContent.trim() : '';\n\n      // Get contributor URL dynamically\n      const bylineLink = document.querySelector('[class*=\"BylineLink\"]');\n      const contributorHref = bylineLink ? bylineLink.getAttribute('href') : '#';\n\n      // Truncate\n      const isMobile = window.innerWidth <= 767;\n      const maxChars = isMobile ? 200 : 350;\n      bioText = truncateBioText(bioText, maxChars);\n\n      // Build wrapper\n      const bioClone = document.createElement('div');\n      bioClone.classList.add('top-author-bio');\n\n      // Clone avatar picture only\n      const avatarWrapper = authorBioWrapper.querySelector('[class*=\"ContributorBioAvatar\"]');\n      if (avatarWrapper) {\n        const picture = avatarWrapper.querySelector('picture');\n        if (picture) {\n          const avatarDiv = document.createElement('div');\n          avatarDiv.classList.add('top-author-avatar');\n          avatarDiv.appendChild(picture.cloneNode(true));\n          bioClone.appendChild(avatarDiv);\n        }\n      }\n\n      // Build text column\n      const textCol = document.createElement('div');\n      textCol.classList.add('top-author-bio-text');\n\n      // Author name\n      if (authorName) {\n        const nameEl = document.createElement('div');\n        nameEl.classList.add('top-author-bio-name');\n        nameEl.textContent = authorName;\n        textCol.appendChild(nameEl);\n      }\n\n      // Bio as plain text with inline Read More\n      const para = document.createElement('p');\n      para.style.cssText = 'margin:0;padding:0;';\n      para.appendChild(document.createTextNode(bioText + ' '));\n\n      const readMoreLink = document.createElement('a');\n      readMoreLink.href = contributorHref;\n      readMoreLink.className = 'top-bio-read-more';\n      readMoreLink.textContent = 'Read More';\n      para.appendChild(readMoreLink);\n\n      textCol.appendChild(para);\n      bioClone.appendChild(textCol);\n\n      // Insert before body wrapper with a separator\n      bodyWrapper.insertAdjacentElement('beforebegin', bioClone);\n    }\n  }\n}\n\nconst observer = new MutationObserver(() => {\n  addTopAuthorBio();\n});\nobserver.observe(document.body, { childList: true, subtree: true });\n\naddTopAuthorBio();","domMutations":[]}],"hashVersion":2,"hashAttribute":"id","fallbackAttribute":"","disableStickyBucketing":false,"urlPatterns":[{"include":true,"type":"simple","pattern":"https://stag.cntraveler.com/story/barcelona-itinerary-the-insiders-guide-to-three-perfect-days"}],"weights":[0.3334,0.3333,0.3333],"meta":[{"key":"0","name":"control"},{"key":"1","name":"variation"},{"key":"2","name":"Variation 2"}],"seed":"6ed4324c-bbb1-4527-9f2f-e255d9e9f4d2","name":"CMUHxtc (Anna test)","phase":"0","coverage":1}],"dateUpdated":"2026-06-12T09:18:50.820Z"}