{"version":3,"file":"shared-lib.DqBDP2dk.mjs","names":["useMemo"],"sources":["https:/framer.com/m/framer/icon-nullstate.js@0.7.0","https:/framerusercontent.com/modules/Ma20hU0GGRxLxZphbywl/OSpwWF91FHPVFyQJjMHt/utils.js","https:/framerusercontent.com/modules/zyI6ETWselCsFVhI5MVY/pZwHpD03MWVNkxjdfRDv/siteMetadata.js"],"sourcesContent":["import { jsx as _jsx } from \"react/jsx-runtime\";\nimport * as React from \"react\";\nexport const containerStyles = {\n    width: \"100%\",\n    height: \"100%\",\n    display: \"flex\",\n    justifyContent: \"center\",\n    alignItems: \"center\"\n};\nconst nullIconStyle = {\n    minWidth: \"10px\",\n    minHeight: \"10px\",\n    maxWidth: \"20px\",\n    maxHeight: \"20px\",\n    width: \"60%\",\n    height: \"60%\"\n};\nconst emptyStateStyle = {\n    ...containerStyles,\n    borderRadius: 6,\n    background: \"rgba(149, 149, 149, 0.1)\",\n    border: \"1px dashed rgba(149, 149, 149, 0.15)\",\n    color: \"#a5a5a5\",\n    flexDirection: \"column\"\n};\nexport const NullState = /*#__PURE__*/ React.forwardRef((_, ref)=>{\n    return(/*#__PURE__*/ _jsx(\"div\", {\n        style: emptyStateStyle,\n        ref: ref\n    }));\n}) /*\n\n<svg\n                xmlns=\"http://www.w3.org/2000/svg\"\n                viewBox=\"0 0 30 30\"\n                style={nullIconStyle}\n            >\n                <path\n                    d=\"M 12.857 0 C 19.958 0 25.714 5.756 25.714 12.857 C 25.714 19.958 19.958 25.714 12.857 25.714 C 5.756 25.714 0 19.958 0 12.857 C 0 5.756 5.756 0 12.857 0 Z\"\n                    fill=\"#FFFFFF\"\n                ></path>\n                <path\n                    d=\"M 20.357 20.357 L 27.857 27.857\"\n                    fill=\"transparent\"\n                    strokeWidth=\"4.28\"\n                    stroke=\"#FFFFFF\"\n                    strokeLinecap=\"round\"\n                ></path>\n                <g transform=\"translate(9.643 6.429)\">\n                    <path\n                        d=\"M 3.214 12.857 L 3.214 12.857\"\n                        fill=\"transparent\"\n                        strokeWidth=\"3.75\"\n                        stroke=\"currentColor\"\n                        strokeLinecap=\"round\"\n                    ></path>\n                    <path\n                        d=\"M 0 3.214 C 0 1.004 1.843 0 3.214 0 C 4.586 0 6.429 0.603 6.429 3.214 C 6.429 5.826 3.214 5.913 3.214 7.232 C 3.214 8.552 3.214 8.571 3.214 8.571\"\n                        fill=\"transparent\"\n                        strokeWidth=\"3.22\"\n                        stroke=\"currentColor\"\n                        strokeLinecap=\"round\"\n                        strokeLinejoin=\"round\"\n                    ></path>\n                </g>\n            </svg>\n            */ ;\n\nexport const __FramerMetadata__ = {\"exports\":{\"containerStyles\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"NullState\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}}}}\n//# sourceMappingURL=./nullstate.map","import{useMemo}from\"react\";import{ControlType}from\"framer\";/*\n ** ICON UTILS\n ** Pull as much re-usable logic into here as possible\n ** This will make it easier to replace in all icon components\n */ export const containerStyles={width:\"100%\",height:\"100%\",display:\"flex\",justifyContent:\"center\",alignItems:\"center\"};export const defaultEvents={onClick:{type:ControlType.EventHandler},onMouseDown:{type:ControlType.EventHandler},onMouseUp:{type:ControlType.EventHandler},onMouseEnter:{type:ControlType.EventHandler},onMouseLeave:{type:ControlType.EventHandler}};const findByArray=(arr,search)=>arr.find(a=>a.toLowerCase().includes(search));export function getIconSelection(iconKeys,selectByList,iconSearch=\"\",iconSelection,lowercaseIconKeyPairs){// gotta get the exact match first THEN find\n// have a set and try to access ?\nif(selectByList)return iconSelection;if(iconSearch==null||(iconSearch===null||iconSearch===void 0?void 0:iconSearch.length)===0)return null;const iconSearchTerm=iconSearch.toLowerCase().replace(/-|\\s/g,\"\");var _iconSearchTerm;// check for exact match, otherwise use .find\nconst searchResult=(_iconSearchTerm=lowercaseIconKeyPairs[iconSearchTerm])!==null&&_iconSearchTerm!==void 0?_iconSearchTerm:findByArray(iconKeys,iconSearchTerm);return searchResult;}export function useIconSelection(iconKeys,selectByList,iconSearch=\"\",iconSelection,lowercaseIconKeyPairs){// Clean search term\nconst iconSearchResult=useMemo(()=>{if(iconSearch==null||(iconSearch===null||iconSearch===void 0?void 0:iconSearch.length)===0)return null;const iconSearchTerm=iconSearch.toLowerCase().replace(/-|\\s/g,\"\");var _iconSearchTerm;// check for exact match, otherwise use .find\nconst searchResult=(_iconSearchTerm=lowercaseIconKeyPairs[iconSearchTerm])!==null&&_iconSearchTerm!==void 0?_iconSearchTerm:findByArray(iconKeys,iconSearchTerm);return searchResult;},[iconSelection,iconSearch]);const name=selectByList?iconSelection:iconSearchResult;return name;}\nexport const __FramerMetadata__ = {\"exports\":{\"getIconSelection\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"containerStyles\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"useIconSelection\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"defaultEvents\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./utils.map","// Generated by Framer (84a2f33)\nexport default function metadata(params,activeLocale){return{customHTMLBodyEnd:\"<script>\\n/* ===== LAYG tracker v7: unified conversion + specifics, new-tab safe ===== */\\n(function(){\\n  /* ---- config ---- */\\n  const DEBUG = false;\\n\\n  /* ---- helpers ---- */\\n  const log   = (...a)=>{ if (DEBUG) try{ console.log('[LAYG]', ...a); }catch(e){} };\\n  const sendFB  = (name, params)=>{ try{ if (window.fbq) fbq('trackCustom', name, params||{}); }catch(e){} };\\n  const sendStd = (name, params)=>{ try{ if (window.fbq) fbq('track',       name, params||{}); }catch(e){} };\\n  const sendGA  = (name, params)=>{ try{ if (window.gtag) gtag('event', name, params||{}); }catch(e){} };\\n  const sendAll = (name, params={})=>{ sendFB(name, params); sendGA(name, params); log('sent', name, params); };\\n\\n  const textOf = el => (el && (el.innerText || el.textContent) || '').trim();\\n  const rawHref = el => (el && el.getAttribute && (el.getAttribute('href')||'').trim()) || '';\\n\\n  // normalize to absolute URL so we can reliably check pathname\\n  function normURL(href){\\n    try { return new URL(href, location.origin); }\\n    catch(_) { return null; }\\n  }\\n\\n  // short-window de-dupe per element+event\\n  const __FIRED = new WeakMap();\\n  function firedRecently(el, key, ttl=700){\\n    let set = __FIRED.get(el);\\n    if (!set) { set = new Set(); __FIRED.set(el, set); }\\n    if (set.has(key)) return true;\\n    set.add(key);\\n    setTimeout(()=> set.delete(key), ttl);\\n    return false;\\n  }\\n\\n  /* ---- UTM passthrough (run once) ---- */\\n  function wireUTM(){\\n    const q = window.location.search;\\n    if (!q) return;\\n    document.querySelectorAll('a').forEach(a=>{\\n      const h = a.getAttribute('href'); if (!h) return;\\n      if (h.startsWith('/') || h.startsWith('./')) a.href = h + q;\\n      else if (h.includes('?')) a.href = h + '&' + q.substring(1);\\n      else a.href = h + q;\\n    });\\n    log('UTM passthrough applied');\\n  }\\n\\n  /* ---- funnel tier resolver (for reporting) ---- */\\n  function resolveTier(el){\\n    const href = rawHref(el).toLowerCase();\\n    const label = textOf(el).toLowerCase();\\n\\n    // href-first (robust)\\n    if (href.includes('/getaccess') || href.includes('/listenfree')) return 'start-listening-free';\\n    if (href.includes('/unlockthealbum'))    return 'unlock-the-story';\\n    if (href.includes('/behindthescenes'))   return 'behind-the-scenes';\\n    if (href.includes('/thefullexperience')) return 'full-experience';\\n    if (href.includes('/collectors'))        return 'collectors-bundle';\\n    if (href.includes('/innercircle'))       return 'inner-circle';\\n\\n    // FFYL → Home (“Lessons Learnt” buttons)\\n    if (location.pathname === '/fighting-for-your-love') {\\n      const u = normURL(href || '#');\\n      if (u) {\\n        const p = u.pathname.replace(/\\\\/+$/,''); // strip trailing slash\\n        if (p === '' || p === '/' || p === '/home') return 'ffyl-to-home';\\n      }\\n      // fallback by visible text just in case\\n      if (label.includes('lessons learnt')) return 'ffyl-to-home';\\n    }\\n\\n    // fallback by label (mainly /checkout)\\n    if (label.includes('start') && label.includes('free'))         return 'start-listening-free';\\n    if (label.includes('download') && label.includes('liner'))     return 'download-liner-notes';\\n    if (label.includes('unlock') && label.includes('story'))       return 'unlock-the-story';\\n    if (label.includes('full') && label.includes('experience'))    return 'full-experience';\\n    if (label.includes('collector'))                               return 'collectors-bundle';\\n    if (label.includes('inner') || label.includes('join the fam')) return 'inner-circle';\\n\\n    return null;\\n  }\\n\\n  /* ---- delegated, new-tab-safe click handler ---- */\\n  function handleClick(e){\\n    const el = e.target && e.target.closest && e.target.closest('a,button,[role=\\\"button\\\"]');\\n    if (!el) return;\\n\\n    const href = rawHref(el).toLowerCase();\\n    const here = location.pathname;\\n\\n    // 1) FFYL DSP → DSPClick + unified conversion\\n    if (here === '/fighting-for-your-love') {\\n      if (href.includes('open.spotify.com')) {\\n        if (!firedRecently(el,'dsp_sp')) {\\n          sendAll('DSPClick', {platform:'spotify'});\\n          sendFB('AlbumFunnelConversion', {type:'dsp'}); // unified conversion\\n        }\\n      } else if (href.includes('music.apple.com')) {\\n        if (!firedRecently(el,'dsp_ap')) {\\n          sendAll('DSPClick', {platform:'apple'});\\n          sendFB('AlbumFunnelConversion', {type:'dsp'});\\n        }\\n      } else if (href.includes('youtube.com')) {\\n        if (!firedRecently(el,'dsp_yt')) {\\n          sendAll('DSPClick', {platform:'youtube'});\\n          sendFB('AlbumFunnelConversion', {type:'dsp'});\\n        }\\n      }\\n    }\\n\\n    // 2) Funnel clicks (tiers & FFYL → Home)\\n    const tier = resolveTier(el);\\n    if (tier) {\\n      if (!firedRecently(el, 'afc:'+tier)) {\\n        // granular event for reporting\\n        sendAll('AlbumFunnelClick', { tier, source_path: here });\\n\\n        // unified conversion when FFYL → Home buttons are clicked\\n        if (tier === 'ffyl-to-home') {\\n          sendFB('AlbumFunnelConversion', {type:'home_button'});\\n        }\\n      }\\n      return; // don't send breadcrumb too\\n    }\\n\\n    // 3) Breadcrumb: any /checkout link anywhere\\n    if (href.includes('/checkout')) {\\n      if (!firedRecently(el,'afc:to-checkout')) {\\n        sendAll('AlbumFunnelClick', { tier: 'to-checkout', source_path: here });\\n      }\\n    }\\n  }\\n\\n  /* ---- subscribe/email conversions on redirect pages ---- */\\n  function fireSubscribeOnLanding(){\\n    const path = location.pathname;\\n    if (path === '/ffylthankyou') {\\n      // standard Subscribe + unified conversion\\n      sendStd('Subscribe', { source: 'ffyl_form' });\\n      sendFB('AlbumFunnelConversion', {type:'email_sub'});\\n      return;\\n    }\\n    if (path === '/listenfree') {\\n      const fromGetAccess = document.referrer.includes('/getaccess') ||\\n                            /(\\\\?|&)src=getaccess_form\\\\b/.test(location.search);\\n      if (fromGetAccess) {\\n        sendStd('Subscribe', { source: 'getaccess_form' });\\n        sendFB('AlbumFunnelConversion', {type:'email_sub'});\\n      }\\n    }\\n  }\\n\\n  /* ---- boot ---- */\\n  function boot(){\\n    wireUTM();\\n\\n    // capture phase so we log before SPA/navigation & “open in new tab”\\n    ['pointerdown','auxclick','click'].forEach(evt=>{\\n      document.addEventListener(evt, handleClick, true);\\n    });\\n\\n    fireSubscribeOnLanding();\\n    log('tracker v7 ready');\\n  }\\n\\n  if (document.readyState !== 'loading') boot();\\n  else document.addEventListener('DOMContentLoaded', boot);\\n})();\\n</script>\",customHTMLHeadStart:\"<!-- Microsoft Clarity -->\\n<script type=\\\"text/javascript\\\">\\n  (function(c,l,a,r,i,t,y){\\n      c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};\\n      t=l.createElement(r);t.async=1;t.src=\\\"https://www.clarity.ms/tag/sow75xmnfn\\\";\\n      y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);\\n  })(window, document, \\\"clarity\\\", \\\"script\\\", \\\"sow75xmnfn\\\");\\n</script>\\n\\n<!-- Meta Pixel (Shopify + Spotify/Apple Music) + PageView -->\\n<script>\\n  !function(f,b,e,v,n,t,s){\\n    if(f.fbq) return;\\n    n=f.fbq=function(){ n.callMethod ? n.callMethod.apply(n,arguments) : n.queue.push(arguments) };\\n    if(!f._fbq) f._fbq=n; n.push=n; n.loaded=!0; n.version='2.0';\\n    n.queue=[]; t=b.createElement(e); t.async=!0; t.src=v;\\n    s=b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t,s);\\n  }(window, document,'script','https://connect.facebook.net/en_US/fbevents.js');\\n\\n  fbq('init', '857802222252651');  // Shopify pixel\\n  fbq('init', '329100944760880');  // Spotify/Apple Music pixel\\n  fbq('track', 'PageView');\\n</script>\\n\\n<script>\\n  // Track scroll depth to 50%\\n  (function() {\\n    let sent = false;\\n    window.addEventListener('scroll', () => {\\n      if (sent) return;\\n      const scrollDepth = window.scrollY + window.innerHeight;\\n      const halfway = document.body.scrollHeight / 2;\\n      if (scrollDepth > halfway) {\\n        if (typeof fbq === 'function') fbq('trackCustom', 'ScrolledHalfway');\\n        sent = true;\\n      }\\n    });\\n  })();\\n\\n  // Track time on page (30 seconds)\\n  setTimeout(() => {\\n    if (typeof fbq === 'function') fbq('trackCustom', 'TimeOnPage30s');\\n  }, 30000);\\n</script>\\n\\n<noscript>\\n  </noscript>\",description:\"Choose your access to SY’s new album Lessons Learnt — an experience beyond music. Support direct, unlock exclusive content, and follow the journey.\",favicon:\"https://framerusercontent.com/assets/BSpOOkkzIZZKVWf3pL1by41DKAM.svg\",robots:\"max-image-preview:large\",socialImage:\"https://framerusercontent.com/assets/p3GAkGpZ5kAB4QsstROgWc1fd8.png\",title:\"Lessons Learnt — SY & LAYG Music Group\"};}export const metadataVersion=1;\nexport const __FramerMetadata__ = {\"exports\":{\"metadataVersion\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"4QAEa,EAAkB,CAC3B,MAAO,OACP,OAAQ,OACR,QAAS,OACT,eAAgB,SAChB,WAAY,SACf,CASK,EAAkB,CACpB,GAAG,EACH,aAAc,EACd,WAAY,2BACZ,OAAQ,uCACR,MAAO,UACP,cAAe,SAClB,CACY,EAA0B,GAAkB,EAAG,IACnC,EAAK,MAAO,CAC7B,MAAO,EACF,MACR,MCzBub,SAAgB,EAAiB,EAAS,EAAa,EAAW,GAAG,EAAc,EAAsB,CAEriB,GAAG,EAAa,OAAO,EAAc,GAAG,GAAY,MAAO,GAAyD,SAAU,EAAE,OAAO,KAAK,IAAM,EAAe,EAAW,cAAc,QAAQ,QAAQ,IAAI,IAAI,EAClN,IAAM,GAAc,EAAgB,EAAsB,KAAkE,EAAY,EAAS,GAAgB,OAAO,CAAc,UAAgB,EAAiB,EAAS,EAAa,EAAW,GAAG,EAAc,EAAsB,CAC/R,IAAM,EAAiBA,MAAY,CAAC,GAAG,GAAY,MAAO,GAAyD,SAAU,EAAE,OAAO,KAAK,IAAM,EAAe,EAAW,cAAc,QAAQ,QAAQ,IAAI,IAAI,EACjN,IAAM,GAAc,EAAgB,EAAsB,KAAkE,EAAY,EAAS,GAAgB,OAAO,CAAc,EAAC,CAAC,EAAc,EAAW,EAAQ,EAAK,EAAa,EAAc,EAAiB,OAAO,CAAM,2BALjJ,EAAc,CAAC,QAAQ,CAAC,KAAK,EAAY,aAAa,CAAC,YAAY,CAAC,KAAK,EAAY,aAAa,CAAC,UAAU,CAAC,KAAK,EAAY,aAAa,CAAC,aAAa,CAAC,KAAK,EAAY,aAAa,CAAC,aAAa,CAAC,KAAK,EAAY,aAAa,CAAC,CAAO,GAAa,EAAI,IAAS,EAAI,KAAK,GAAG,EAAE,cAAc,SAAS,OCHnb,SAAwB,EAAS,EAAO,EAAa,CAAC,MAAM,CAAC,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YAAm/M,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAAypD,YAAY,sJAAsJ,QAAQ,uEAAuE,OAAO,0BAA0B,YAAY,sEAAsE,MAAM,yCAAyC,AAAE"}