{
  "version": 3,
  "sources": ["/cdn/shop/t/730/assets/ad-featured-product.js?d=nov-28"],
  "sourcesContent": ["(() => {\n    // Shopify handles are lowercase alphanumerics and hyphens. Anything else is\n    // rejected outright: these values reach a <style> sink and are replayed from\n    // localStorage for days, so \"x</style><img src=x onerror=...>\" in the query\n    // string would otherwise execute in the shopper's session.\n    const isSafeHandle = (v) => typeof v === \"string\" && /^[a-z0-9-]{1,80}$/.test(v);\n    const isSafeColor = (v) => typeof v === \"string\" && /^[a-z0-9 _-]{1,60}$/.test(v);\n\n    const injectStyle = (css) => {\n        if (!document.head) return;\n        const el = document.createElement(\"style\");\n        el.textContent = css;          // textContent cannot create elements\n        document.head.appendChild(el);\n    };\n    const LOOK_AD_EXPIRATION_KEY = \"look_ad_expire\";\n    const LOOK_AD_EXPIRATION_QUERY_KEY = \"look_expire\";\n    const LOOK_AD_TIMESTAMP_KEY = \"look_ad_string_timestamp\";\n    const LOOK_AD_STRING_KEY = \"look_ad_string\";\n    const LOOK_AD_FEATURED_PRODUCT_KEY = \"look_ad_featured_product\";\n    const LOOK_AD_FEATURED_PRODUCT_QUERY_KEY = \"featured_product\";\n    const LOOK_AD_FEATURED_COLOR_HIDE_NON_MATCHING_QUERY_KEY = \"hide_non_matching_color\";\n    const LOOK_AD_FEATURED_COLOR_KEY = \"look_ad_featured_color\";\n    const LOOK_AD_FEATURED_COLOR_QUERY_KEY = \"featured_color\";\n\n    // Set by the landing pages on try.lookoptic.com with domain=.lookoptic.com.\n    // snippets/product-card-js.liquid reads look_featured_color directly too,\n    // because this script is async and can run after the cards initialise.\n    const LOOK_FEATURED_PRODUCT_COOKIE = \"look_featured_product\";\n    const LOOK_FEATURED_COLOR_COOKIE = \"look_featured_color\";\n    const COOKIE_DOMAIN = window.location.hostname.endsWith(\"lookoptic.com\") ? \"; domain=.lookoptic.com\" : \"\";\n\n    const readCookie = (name) => {\n        const match = document.cookie.match(new RegExp(`(?:^|; )${name}=([^;]*)`));\n        if (!match) return null;\n        try {\n            return decodeURIComponent(match[1]);\n        } catch (e) {\n            return null;\n        }\n    };\n    const writeCookie = (name, value, days) => {\n        document.cookie = `${name}=${encodeURIComponent(value)}; path=/; max-age=${Math.round(days * 86400)}; SameSite=Lax${COOKIE_DOMAIN}`;\n    };\n\n    const parsedSearch = new URLSearchParams(window.location.search);\n\n    // Expiration in days\n    let LOOK_AD_STRING_EXPIRATION = 3;\n\n    if (\n        window.localStorage.getItem(LOOK_AD_EXPIRATION_KEY) !== null ||\n        parsedSearch.get(LOOK_AD_EXPIRATION_QUERY_KEY) !== null\n    ) {\n        LOOK_AD_STRING_EXPIRATION = window.localStorage.getItem(LOOK_AD_EXPIRATION_KEY) || parsedSearch.get(LOOK_AD_EXPIRATION_QUERY_KEY);\n        window.localStorage.setItem(LOOK_AD_EXPIRATION_KEY, LOOK_AD_STRING_EXPIRATION);\n    }\n\n    if (parsedSearch.get(LOOK_AD_FEATURED_COLOR_HIDE_NON_MATCHING_QUERY_KEY) === \"true\") {\n        const hidingStyle = `\n            #ProductGridContainer #product-grid li.grid__item[data-matching-color-found=\"false\"] {\n              display: none !important;\n            }\n            #ProductGridContainer #product-grid li.grid__item:has(.fp_new-element) {\n              display: none !important;\n            }\n        `;\n        if (window.location.pathname.includes(\"/collections/\")) {\n            injectStyle(hidingStyle);\n        }\n    }\n\n    // Expire before reading new values, and drop the cookies with the storage,\n    // or a long-lived landing-page cookie would re-seed it on the next page.\n    const timestamp = window.localStorage.getItem(LOOK_AD_TIMESTAMP_KEY);\n    if (\n        window.localStorage.getItem(LOOK_AD_STRING_KEY) !== null &&\n        timestamp &&\n        Date.now() - Number(timestamp) > LOOK_AD_STRING_EXPIRATION * 24 * 60 * 60 * 1000\n    ) {\n        window.localStorage.removeItem(LOOK_AD_TIMESTAMP_KEY);\n        window.localStorage.removeItem(LOOK_AD_STRING_KEY);\n        window.localStorage.removeItem(LOOK_AD_FEATURED_PRODUCT_KEY);\n        window.localStorage.removeItem(LOOK_AD_FEATURED_COLOR_KEY);\n        writeCookie(LOOK_FEATURED_PRODUCT_COOKIE, \"\", 0);\n        writeCookie(LOOK_FEATURED_COLOR_COOKIE, \"\", 0);\n    }\n\n    // URL beats cookie beats storage. A URL value is a fresh ad click, so it\n    // always restarts the expiry and is mirrored into the shared cookie for the\n    // landing pages; a cookie value only restarts it when it changes.\n    const sync = (queryKey, cookieName, storageKey, normalize, isSafe) => {\n        const fromUrl = parsedSearch.get(queryKey);\n        const incoming = normalize(fromUrl ?? readCookie(cookieName) ?? \"\");\n        if (!isSafe(incoming)) return;\n        if (fromUrl === null && incoming === window.localStorage.getItem(storageKey)) return;\n\n        window.localStorage.setItem(storageKey, incoming);\n        window.localStorage.setItem(LOOK_AD_STRING_KEY, window.location.search);\n        window.localStorage.setItem(LOOK_AD_TIMESTAMP_KEY, `${Date.now()}`);\n        if (fromUrl !== null) writeCookie(cookieName, incoming, LOOK_AD_STRING_EXPIRATION);\n    };\n    sync(LOOK_AD_FEATURED_PRODUCT_QUERY_KEY, LOOK_FEATURED_PRODUCT_COOKIE, LOOK_AD_FEATURED_PRODUCT_KEY,\n        (v) => v.toLowerCase(), isSafeHandle);\n    sync(LOOK_AD_FEATURED_COLOR_QUERY_KEY, LOOK_FEATURED_COLOR_COOKIE, LOOK_AD_FEATURED_COLOR_KEY,\n        (v) => v.toLowerCase().replaceAll(\"-\", \" \"), isSafeColor);\n\n    const featuredProduct = window.localStorage.getItem(LOOK_AD_FEATURED_PRODUCT_KEY);\n    const featuredColor = window.localStorage.getItem(LOOK_AD_FEATURED_COLOR_KEY);\n\n    if (isSafeHandle(featuredProduct) && (window.location.pathname.includes(\"/collections/\") || (window.lookPath || window.location.pathname) === \"/\")) {\n        injectStyle(`\n            #ProductGridContainer #product-grid li.grid__item[data-product-handle*=\"${featuredProduct}\"]:not([data-product-handle*=\"sun-progressive\"]) {\n              order: -1 !important;\n            }\n            div.featured-products .swiper-slide:has(a[href*=\"/products/${featuredProduct}\"]) {\n              order: -1 !important;\n            }\n        `);\n    }\n\n    // Klaviyo only writes profile properties for an identified visitor, so this\n    // is pushed on every page view while the values are live: a shopper who\n    // signs up or arrives from an email mid-session gets them on the next page.\n    // _learnq is drained by klaviyo.js once it loads on wnw_load.\n    const klaviyoProperties = {};\n    if (isSafeHandle(featuredProduct)) klaviyoProperties.featured_product = featuredProduct;\n    if (isSafeColor(featuredColor)) klaviyoProperties.featured_color = featuredColor.replace(/_match$/, \"\");\n    if (Object.keys(klaviyoProperties).length) {\n        window._learnq = window._learnq || [];\n        window._learnq.push([\"identify\", klaviyoProperties]);\n    }\n})();\n"],
  "mappings": "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",
  "names": []
}
