{"title":"Custom","description":null,"products":[{"product_id":"lane-splitter-squash-1","title":"Lane Splitter Swallow","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a2228ae7ca211e884b3ed8a\u0026v=1785764961595\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a2228ae7ca211e884b3ed8a\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45523690389551,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"easy-wind","title":"Easy Wind","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e \u003c\/iframe\u003e \u003c\/div\u003e\n\n\u003c!-- BOARD VIDEO --\u003e\n\n\u003cdiv id=\"ff-video-section\" style=\" width:100vw; position:relative; left:50%; right:50%; margin-left:-50vw; margin-right:-50vw; max-width:100vw; margin-top:50px; margin-bottom:50px; background:#000; \"\u003e\n\n\u003cdiv style=\" width:100%; max-width:1600px; margin:0 auto; aspect-ratio:16 \/ 9; position:relative; overflow:hidden; \"\u003e\n\n\u003ciframe src=\"https:\/\/www.youtube.com\/embed\/2A3z976iVnk?rel=0\" style=\"\n    position:absolute;\n    top:0;\n    left:0;\n    width:100%;\n    height:100%;\n    border:0;\n    display:block;\n  \" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen title=\"Board Breakdown\"\u003e\n\u003c\/iframe\u003e\n\n\u003c\/div\u003e \u003c\/div\u003e\n\n\u003cscript\u003e (function(){ var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a39b322ede5436b00edec96\u0026v=1785764816528\u0026app_id=6a026ac871b32618c4472776\"; var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\"; var SHAPE_ID = \"6a39b322ede5436b00edec96\"; var submitting = false; function clearClipping(f){ var p = f.parentElement; while (p \u0026\u0026 p !== document.body){ var cs = window.getComputedStyle(p); var oy = cs.overflowY; if (oy === 'hidden' || oy === 'clip'){ p.style.overflow = 'visible'; p.style.maxHeight = 'none'; p.style.height = 'auto'; } else if (cs.maxHeight !== 'none'){ p.style.maxHeight = 'none'; } p = p.parentElement; } } function buyerCountry(){ try { if (window.Shopify \u0026\u0026 window.Shopify.country) { return String(window.Shopify.country).toUpperCase(); } } catch(e){} return ''; } (function(){ var f = document.getElementById('ff-configurator'); if (f){ var c = buyerCountry(); f.src = CONFIGURATOR_URL + ( c ? '\u0026country=' + encodeURIComponent(c) : '' ); } })(); window.addEventListener('message', function(event){ var data = event.data || {}; if (data.type === 'ff_add_to_cart'){ if (submitting) return; submitting = true; fetch(DRAFT_ORDER_URL, { method: 'POST', headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' }, body: JSON.stringify({ shape_id: SHAPE_ID, config: data.config || {}, deposit_price: data.price, total_price: data.totalPrice, currency: data.currency, country_code: data.country_code, fin_variant_id: data.fin_variant_id, fin_variant_price: data.fin_variant_price }) }) .then(function(r){ return r.json().then(function(body){ return { ok: r.ok, body: body }; }); }) .then(function(res){ submitting = false; if ( !res.ok || !res.body || !res.body.invoice_url ){ throw new Error( (res.body \u0026\u0026 res.body.error) || 'Could not start checkout' ); } window.top.location.href = res.body.invoice_url; }) .catch(function(err){ submitting = false; alert( err.message || 'Could not start checkout. Please try again.' ); }); } if (data.type === 'ff_resize'){ var f = document.getElementById('ff-configurator'); if (f \u0026\u0026 data.height){ f.style.height = data.height + 'px'; f.style.minHeight = data.height + 'px'; clearClipping(f); } } }); (function(){ var f = document.getElementById('ff-configurator'); if (f){ clearClipping(f); } })(); })(); \u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45526499164207,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"myconaut","title":"Myconaut","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a4714ddcb39e4ca9ae94b22\u0026v=1785765453769\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a4714ddcb39e4ca9ae94b22\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45565828038703,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"nautilus","title":"Nautilus","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a4715633bbb1a30912ab47c\u0026v=1785765006272\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a4715633bbb1a30912ab47c\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45565833543727,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"tradesman","title":"Tradesman","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a4726c051ff169df989ea1a\u0026v=1785765591708\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a4726c051ff169df989ea1a\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567614025775,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"the-outlaw","title":"The Outlaw","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a47202d7fb820a73c2d3d6c\u0026v=1785764688911\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a47202d7fb820a73c2d3d6c\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567635914799,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"surfer-rosa","title":"Surfer Rosa","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a4725b4160d7c5b26049bb1\u0026v=1785765950866\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a4725b4160d7c5b26049bb1\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567640731695,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"scarlet-begonia","title":"Scarlet Begonia","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a47224775bbc0ea60b81698\u0026v=1785765549714\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a47224775bbc0ea60b81698\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567645351983,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"ocean-racer","title":"Ocean Racer","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a471b940441524acda46a3d\u0026v=1785765504687\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a471b940441524acda46a3d\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567650562095,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"op3","title":"OP3","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a471923883bf341774797be\u0026v=1785765225557\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a471923883bf341774797be\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567651446831,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"osprey","title":"Osprey","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a471f47c5beb32710b63ff1\u0026v=1785765091893\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a471f47c5beb32710b63ff1\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567652724783,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"op4","title":"OP4","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a471aa0012965bf3e1274c1\u0026v=1785765906028\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a471aa0012965bf3e1274c1\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567653511215,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"op2","title":"OP2","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a471848f6faea580c3be744\u0026v=1785765181772\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a471848f6faea580c3be744\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567654232111,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"long-phish-2-0","title":"Long Phish 2.0","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e \u003c\/iframe\u003e \u003c\/div\u003e\n\n\u003c!-- BOARD VIDEO --\u003e\n\n\u003cdiv id=\"ff-video-section\" style=\" width:100vw; position:relative; left:50%; right:50%; margin-left:-50vw; margin-right:-50vw; max-width:100vw; margin-top:50px; margin-bottom:50px; background:#000; \"\u003e\n\n\u003cdiv style=\" width:100%; max-width:1600px; margin:0 auto; aspect-ratio:16 \/ 9; position:relative; overflow:hidden; \"\u003e\n\n\u003ciframe src=\"https:\/\/www.youtube.com\/embed\/PftlsEvC8Ec?rel=0\" style=\"\n    position:absolute;\n    top:0;\n    left:0;\n    width:100%;\n    height:100%;\n    border:0;\n    display:block;\n  \" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen title=\"Board Breakdown\"\u003e\n\u003c\/iframe\u003e\n\n\u003c\/div\u003e \u003c\/div\u003e\n\n\u003cscript\u003e (function(){ var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a4711f1877b5c6b2c039530\u0026v=1785766006765\u0026app_id=6a026ac871b32618c4472776\"; var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\"; var SHAPE_ID = \"6a4711f1877b5c6b2c039530\"; var submitting = false; function clearClipping(f){ var p = f.parentElement; while (p \u0026\u0026 p !== document.body){ var cs = window.getComputedStyle(p); var oy = cs.overflowY; if (oy === 'hidden' || oy === 'clip'){ p.style.overflow = 'visible'; p.style.maxHeight = 'none'; p.style.height = 'auto'; } else if (cs.maxHeight !== 'none'){ p.style.maxHeight = 'none'; } p = p.parentElement; } } function buyerCountry(){ try { if (window.Shopify \u0026\u0026 window.Shopify.country) { return String(window.Shopify.country).toUpperCase(); } } catch(e){} return ''; } (function(){ var f = document.getElementById('ff-configurator'); if (f){ var c = buyerCountry(); f.src = CONFIGURATOR_URL + ( c ? '\u0026country=' + encodeURIComponent(c) : '' ); } })(); window.addEventListener('message', function(event){ var data = event.data || {}; if (data.type === 'ff_add_to_cart'){ if (submitting) return; submitting = true; fetch(DRAFT_ORDER_URL, { method: 'POST', headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' }, body: JSON.stringify({ shape_id: SHAPE_ID, config: data.config || {}, deposit_price: data.price, total_price: data.totalPrice, currency: data.currency, country_code: data.country_code, fin_variant_id: data.fin_variant_id, fin_variant_price: data.fin_variant_price }) }) .then(function(r){ return r.json().then(function(body){ return { ok: r.ok, body: body }; }); }) .then(function(res){ submitting = false; if ( !res.ok || !res.body || !res.body.invoice_url ){ throw new Error( (res.body \u0026\u0026 res.body.error) || 'Could not start checkout' ); } window.top.location.href = res.body.invoice_url; }) .catch(function(err){ submitting = false; alert( err.message || 'Could not start checkout. Please try again.' ); }); } if (data.type === 'ff_resize'){ var f = document.getElementById('ff-configurator'); if (f \u0026\u0026 data.height){ f.style.height = data.height + 'px'; f.style.minHeight = data.height + 'px'; clearClipping(f); } } }); (function(){ var f = document.getElementById('ff-configurator'); if (f){ clearClipping(f); } })(); })(); \u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567654985775,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"wolverine","title":"Wolverine","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a472a52e1836a51ab9f3664\u0026v=1785766112359\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a472a52e1836a51ab9f3664\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567694176303,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"huntsman","title":"Huntsman","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a47116b3d8edf8849cd981d\u0026v=1785766063366\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a47116b3d8edf8849cd981d\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567696207919,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"hole-shot-custom","title":"Hole Shot","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a4710af6d835196168f8550\u0026v=1785765775825\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a4710af6d835196168f8550\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567697256495,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"sportsman","title":"Sportsman","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e \u003c\/iframe\u003e \u003c\/div\u003e\n\n\u003c!-- BOARD VIDEO --\u003e\n\n\u003cdiv id=\"ff-video-section\" style=\" width:100vw; position:relative; left:50%; right:50%; margin-left:-50vw; margin-right:-50vw; max-width:100vw; margin-top:50px; margin-bottom:50px; background:#000; \"\u003e\n\n\u003cdiv style=\" width:100%; max-width:1600px; margin:0 auto; aspect-ratio:16 \/ 9; position:relative; overflow:hidden; \"\u003e\n\n\u003ciframe src=\"https:\/\/www.youtube.com\/embed\/qjsAlSJtfAw?rel=0\" style=\"\n    position:absolute;\n    top:0;\n    left:0;\n    width:100%;\n    height:100%;\n    border:0;\n    display:block;\n  \" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen title=\"Board Breakdown\"\u003e\n\u003c\/iframe\u003e\n\n\u003c\/div\u003e \u003c\/div\u003e\n\n\u003cscript\u003e (function(){ var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a4723da90eb66a587e21df1\u0026v=1785765409759\u0026app_id=6a026ac871b32618c4472776\"; var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\"; var SHAPE_ID = \"6a4723da90eb66a587e21df1\"; var submitting = false; function clearClipping(f){ var p = f.parentElement; while (p \u0026\u0026 p !== document.body){ var cs = window.getComputedStyle(p); var oy = cs.overflowY; if (oy === 'hidden' || oy === 'clip'){ p.style.overflow = 'visible'; p.style.maxHeight = 'none'; p.style.height = 'auto'; } else if (cs.maxHeight !== 'none'){ p.style.maxHeight = 'none'; } p = p.parentElement; } } function buyerCountry(){ try { if (window.Shopify \u0026\u0026 window.Shopify.country) { return String(window.Shopify.country).toUpperCase(); } } catch(e){} return ''; } (function(){ var f = document.getElementById('ff-configurator'); if (f){ var c = buyerCountry(); f.src = CONFIGURATOR_URL + ( c ? '\u0026country=' + encodeURIComponent(c) : '' ); } })(); window.addEventListener('message', function(event){ var data = event.data || {}; if (data.type === 'ff_add_to_cart'){ if (submitting) return; submitting = true; fetch(DRAFT_ORDER_URL, { method: 'POST', headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' }, body: JSON.stringify({ shape_id: SHAPE_ID, config: data.config || {}, deposit_price: data.price, total_price: data.totalPrice, currency: data.currency, country_code: data.country_code, fin_variant_id: data.fin_variant_id, fin_variant_price: data.fin_variant_price }) }) .then(function(r){ return r.json().then(function(body){ return { ok: r.ok, body: body }; }); }) .then(function(res){ submitting = false; if ( !res.ok || !res.body || !res.body.invoice_url ){ throw new Error( (res.body \u0026\u0026 res.body.error) || 'Could not start checkout' ); } window.top.location.href = res.body.invoice_url; }) .catch(function(err){ submitting = false; alert( err.message || 'Could not start checkout. Please try again.' ); }); } if (data.type === 'ff_resize'){ var f = document.getElementById('ff-configurator'); if (f \u0026\u0026 data.height){ f.style.height = data.height + 'px'; f.style.minHeight = data.height + 'px'; clearClipping(f); } } }); (function(){ var f = document.getElementById('ff-configurator'); if (f){ clearClipping(f); } })(); })(); \u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567697453103,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"fish","title":"Fish","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a470fabcdf5b383abbfb295\u0026v=1785765679903\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a470fabcdf5b383abbfb295\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567701155887,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"c-bucket","title":"C-Bucket","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a4709691b83dd0c768abf6b\u0026v=1785765369668\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a4709691b83dd0c768abf6b\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567701319727,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"waterlion","title":"Waterlion","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a47292e4f7839bc94feda94\u0026v=1785765318814\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a47292e4f7839bc94feda94\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567704956975,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"the-cliff-pintail","title":"The Cliff Pintail","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a470e508618445501353f85\u0026v=1785764646547\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a470e508618445501353f85\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567705120815,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"sicario","title":"Sicario","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a47232ec8513fef0771cbc7\u0026v=1785764730092\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a47232ec8513fef0771cbc7\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567705415727,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"op1","title":"OP1","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a471750f5bc6232bd9cd173\u0026v=1785765630477\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a471750f5bc6232bd9cd173\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567705481263,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"the-chris-craft","title":"The Chris Craft","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a470cd6687121f3fdbd7cd1\u0026v=1785764595445\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a470cd6687121f3fdbd7cd1\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567705546799,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"the-cliff","title":"The Cliff","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a470d5fd0c0956c0e7bdb15\u0026v=1785764772795\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a470d5fd0c0956c0e7bdb15\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567705579567,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"submariner","title":"Submariner","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\n  \u003c\/iframe\u003e\n\u003c\/div\u003e\n\n\u003c!-- SUBMARINER VIDEO --\u003e\n\n\u003cdiv id=\"ff-video-section\" style=\"\n  width:100vw;\n  position:relative;\n  left:50%;\n  right:50%;\n  margin-left:-50vw;\n  margin-right:-50vw;\n  max-width:100vw;\n  margin-top:50px;\n  margin-bottom:50px;\n  background:#000;\n\"\u003e\n\n  \u003cdiv style=\"\n    width:100%;\n    max-width:1600px;\n    margin:0 auto;\n    aspect-ratio:16 \/ 9;\n    position:relative;\n    overflow:hidden;\n  \"\u003e\n\n```\n\u003ciframe src=\"https:\/\/www.youtube.com\/embed\/Jxsqy9_fjJw?rel=0\" style=\"\n    position:absolute;\n    top:0;\n    left:0;\n    width:100%;\n    height:100%;\n    border:0;\n    display:block;\n  \" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen title=\"CC Board Breakdown: Submariner\"\u003e\n\u003c\/iframe\u003e\n```\n\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a4724bd4aeef739929c3b10\u0026v=1785765277355\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a4724bd4aeef739929c3b10\";\n  var submitting = false;\n\n  function clearClipping(f){\n    var p = f.parentElement;\n\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n\n      p = p.parentElement;\n    }\n  }\n\n  function buyerCountry(){\n    try {\n      if (window.Shopify \u0026\u0026 window.Shopify.country) {\n        return String(window.Shopify.country).toUpperCase();\n      }\n    } catch(e){}\n\n    return '';\n  }\n\n  (function(){\n    var f = document.getElementById('ff-configurator');\n\n    if (f){\n      var c = buyerCountry();\n\n      f.src = CONFIGURATOR_URL + (\n        c ? '\u0026country=' + encodeURIComponent(c) : ''\n      );\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n\n      submitting = true;\n\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application\/json',\n          'Accept': 'application\/json'\n        },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      })\n      .then(function(r){\n        return r.json().then(function(body){\n          return {\n            ok: r.ok,\n            body: body\n          };\n        });\n      })\n      .then(function(res){\n        submitting = false;\n\n        if (\n          !res.ok ||\n          !res.body ||\n          !res.body.invoice_url\n        ){\n          throw new Error(\n            (res.body \u0026\u0026 res.body.error) ||\n            'Could not start checkout'\n          );\n        }\n\n        window.top.location.href = res.body.invoice_url;\n      })\n      .catch(function(err){\n        submitting = false;\n\n        alert(\n          err.message ||\n          'Could not start checkout. Please try again.'\n        );\n      });\n    }\n\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n\n        clearClipping(f);\n      }\n    }\n  });\n\n  (function(){\n    var f = document.getElementById('ff-configurator');\n\n    if (f){\n      clearClipping(f);\n    }\n  })();\n\n})();\n\u003c\/script\u003e\n\n","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567705743407,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"acid-phish","title":"Acid Phish","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\n  \u003c\/iframe\u003e\n\u003c\/div\u003e\n\n\u003c!-- ACID PHISH VIDEO --\u003e\n\n\u003cdiv id=\"ff-video-section\" style=\"\n  width:100vw;\n  position:relative;\n  left:50%;\n  right:50%;\n  margin-left:-50vw;\n  margin-right:-50vw;\n  max-width:100vw;\n  margin-top:50px;\n  margin-bottom:50px;\n  background:#000;\n\"\u003e\n\n  \u003cdiv style=\"\n    width:100%;\n    max-width:1600px;\n    margin:0 auto;\n    aspect-ratio:16 \/ 9;\n    position:relative;\n    overflow:hidden;\n  \"\u003e\n\n```\n\u003ciframe src=\"https:\/\/www.youtube.com\/embed\/vK4fwA6Nr5Q?rel=0\" style=\"\n    position:absolute;\n    top:0;\n    left:0;\n    width:100%;\n    height:100%;\n    border:0;\n    display:block;\n  \" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen title=\"Acid Phish Board Breakdown\"\u003e\n\u003c\/iframe\u003e\n```\n\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a46fc456b5f03d4a6f653d3\u0026v=1785764911616\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a46fc456b5f03d4a6f653d3\";\n  var submitting = false;\n\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n\n      p = p.parentElement;\n    }\n  }\n\n  function buyerCountry(){\n    try {\n      if (window.Shopify \u0026\u0026 window.Shopify.country) {\n        return String(window.Shopify.country).toUpperCase();\n      }\n    } catch(e){}\n\n    return '';\n  }\n\n  (function(){\n    var f = document.getElementById('ff-configurator');\n\n    if (f){\n      var c = buyerCountry();\n\n      f.src = CONFIGURATOR_URL + (\n        c ? '\u0026country=' + encodeURIComponent(c) : ''\n      );\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n\n      submitting = true;\n\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application\/json',\n          'Accept': 'application\/json'\n        },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      })\n      .then(function(r){\n        return r.json().then(function(body){\n          return {\n            ok: r.ok,\n            body: body\n          };\n        });\n      })\n      .then(function(res){\n        submitting = false;\n\n        if (\n          !res.ok ||\n          !res.body ||\n          !res.body.invoice_url\n        ){\n          throw new Error(\n            (res.body \u0026\u0026 res.body.error) ||\n            'Could not start checkout'\n          );\n        }\n\n        window.top.location.href = res.body.invoice_url;\n      })\n      .catch(function(err){\n        submitting = false;\n\n        alert(\n          err.message ||\n          'Could not start checkout. Please try again.'\n        );\n      });\n    }\n\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n\n        clearClipping(f);\n      }\n    }\n  });\n\n  (function(){\n    var f = document.getElementById('ff-configurator');\n\n    if (f){\n      clearClipping(f);\n    }\n  })();\n\n})();\n\u003c\/script\u003e\n","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567705776175,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"ultra-tracker","title":"Ultra Tracker","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a4727e8f14aa27358856f8f\u0026v=1785765049782\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a4727e8f14aa27358856f8f\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567705808943,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"lane-splitter-squash","title":"Lane Splitter Squash","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a3ef8f8ab78144debdfe83d\u0026v=1785764860799\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a3ef8f8ab78144debdfe83d\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567705907247,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"carrera","title":"Carrera","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a470b62fb88827278a63ff8\u0026v=1785764526444\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a470b62fb88827278a63ff8\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567706103855,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"c-hawk","title":"C-Hawk","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a47089c8ba47bad7bd16ecd\u0026v=1785765726487\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a47089c8ba47bad7bd16ecd\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567706202159,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"cafe-racer-2-0","title":"Cafe Racer 2.0","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\n  \u003c\/iframe\u003e\n\u003c\/div\u003e\n\n\u003c!-- BOARD VIDEO --\u003e\n\n\u003cdiv id=\"ff-video-section\" style=\"\n  width:100vw;\n  position:relative;\n  left:50%;\n  right:50%;\n  margin-left:-50vw;\n  margin-right:-50vw;\n  max-width:100vw;\n  margin-top:50px;\n  margin-bottom:50px;\n  background:#000;\n\"\u003e\n\n  \u003cdiv style=\"\n    width:100%;\n    max-width:1600px;\n    margin:0 auto;\n    aspect-ratio:16 \/ 9;\n    position:relative;\n    overflow:hidden;\n  \"\u003e\n\n```\n\u003ciframe src=\"https:\/\/www.youtube.com\/embed\/O3g10zmBbFY?rel=0\" style=\"\n    position:absolute;\n    top:0;\n    left:0;\n    width:100%;\n    height:100%;\n    border:0;\n    display:block;\n  \" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen title=\"Board Breakdown\"\u003e\n\u003c\/iframe\u003e\n```\n\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a470ab192c8b42d36dc9832\u0026v=1785765815082\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a470ab192c8b42d36dc9832\";\n  var submitting = false;\n\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n\n      p = p.parentElement;\n    }\n  }\n\n  function buyerCountry(){\n    try {\n      if (window.Shopify \u0026\u0026 window.Shopify.country) {\n        return String(window.Shopify.country).toUpperCase();\n      }\n    } catch(e){}\n\n    return '';\n  }\n\n  (function(){\n    var f = document.getElementById('ff-configurator');\n\n    if (f){\n      var c = buyerCountry();\n\n      f.src = CONFIGURATOR_URL + (\n        c ? '\u0026country=' + encodeURIComponent(c) : ''\n      );\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n\n      submitting = true;\n\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application\/json',\n          'Accept': 'application\/json'\n        },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      })\n      .then(function(r){\n        return r.json().then(function(body){\n          return {\n            ok: r.ok,\n            body: body\n          };\n        });\n      })\n      .then(function(res){\n        submitting = false;\n\n        if (\n          !res.ok ||\n          !res.body ||\n          !res.body.invoice_url\n        ){\n          throw new Error(\n            (res.body \u0026\u0026 res.body.error) ||\n            'Could not start checkout'\n          );\n        }\n\n        window.top.location.href = res.body.invoice_url;\n      })\n      .catch(function(err){\n        submitting = false;\n\n        alert(\n          err.message ||\n          'Could not start checkout. Please try again.'\n        );\n      });\n    }\n\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n\n        clearClipping(f);\n      }\n    }\n  });\n\n  (function(){\n    var f = document.getElementById('ff-configurator');\n\n    if (f){\n      clearClipping(f);\n    }\n  })();\n\n})();\n\u003c\/script\u003e\n","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45567706267695,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"daytona","title":"Daytona","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a4dd19d1bd08ea2b7396c35\u0026v=1785765133468\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a4dd19d1bd08ea2b7396c35\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45574070894639,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]},{"product_id":"crotalus","title":"Crotalus","description":"\u003cdiv id=\"ff-configurator-wrapper\" style=\"width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;max-width:100vw;overflow:visible;\"\u003e\n  \u003ciframe id=\"ff-configurator\" style=\"width:100%;height:900px;min-height:600px;border:none;border-radius:0;display:block;overflow:hidden;\" frameborder=\"0\" scrolling=\"no\" title=\"Board Configurator\"\u003e\u003c\/iframe\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var CONFIGURATOR_URL = \"https:\/\/sales.shapersportal.app\/configurator?shape_id=6a546b5daac401e5a8c44a24\u0026v=1785765857314\u0026app_id=6a026ac871b32618c4472776\";\n  var DRAFT_ORDER_URL = \"https:\/\/sales.shapersportal.app\/functions\/createDraftOrder\";\n  var SHAPE_ID = \"6a546b5daac401e5a8c44a24\";\n  var submitting = false;\n\n  \/\/ Un-clip only ancestors that actually CLIP the iframe (overflow hidden\/clip\n  \/\/ or a max-height). NEVER touch scrollable containers (overflow auto\/scroll)\n  \/\/ — some themes (e.g. Horizon) scroll the page through an inner wrapper, and\n  \/\/ forcing it to overflow:visible kills page scrolling entirely.\n  function clearClipping(f){\n    var p = f.parentElement;\n    while (p \u0026\u0026 p !== document.body){\n      var cs = window.getComputedStyle(p);\n      var oy = cs.overflowY;\n      if (oy === 'hidden' || oy === 'clip'){\n        p.style.overflow = 'visible';\n        p.style.maxHeight = 'none';\n        p.style.height = 'auto';\n      } else if (cs.maxHeight !== 'none'){\n        p.style.maxHeight = 'none';\n      }\n      p = p.parentElement;\n    }\n  }\n\n  \/\/ Resolve the buyer's SELECTED country from Shopify's storefront (the\n  \/\/ currency\/country dropdown), so the configurator prices for the country the\n  \/\/ buyer picked rather than their geo-IP. Shopify exposes the active country\n  \/\/ on window.Shopify.country (ISO-2). Fall back to nothing → the configurator\n  \/\/ uses geo-IP. Append it as a ?country= param on the iframe src.\n  function buyerCountry(){\n    try { if (window.Shopify \u0026\u0026 window.Shopify.country) return String(window.Shopify.country).toUpperCase(); } catch(e){}\n    return '';\n  }\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f){\n      var c = buyerCountry();\n      f.src = CONFIGURATOR_URL + (c ? '\u0026country=' + encodeURIComponent(c) : '');\n    }\n  })();\n\n  window.addEventListener('message', function(event){\n    var data = event.data || {};\n    if (data.type === 'ff_add_to_cart'){\n      if (submitting) return;\n      submitting = true;\n      fetch(DRAFT_ORDER_URL, {\n        method: 'POST',\n        headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n        body: JSON.stringify({\n          shape_id: SHAPE_ID,\n          config: data.config || {},\n          deposit_price: data.price,\n          total_price: data.totalPrice,\n          currency: data.currency,\n          country_code: data.country_code,\n          fin_variant_id: data.fin_variant_id,\n          fin_variant_price: data.fin_variant_price\n        })\n      }).then(function(r){\n        return r.json().then(function(body){ return { ok: r.ok, body: body }; });\n      }).then(function(res){\n        submitting = false;\n        if (!res.ok || !res.body || !res.body.invoice_url){\n          throw new Error((res.body \u0026\u0026 res.body.error) || 'Could not start checkout');\n        }\n        window.top.location.href = res.body.invoice_url;\n      }).catch(function(err){\n        submitting = false;\n        alert(err.message || 'Could not start checkout. Please try again.');\n      });\n    }\n    if (data.type === 'ff_resize'){\n      var f = document.getElementById('ff-configurator');\n      if (f \u0026\u0026 data.height){\n        f.style.height = data.height + 'px';\n        f.style.minHeight = data.height + 'px';\n        clearClipping(f);\n      }\n    }\n  });\n\n  \/\/ Clear any inherited clipping on the wrapper chain immediately on load, so a\n  \/\/ theme that ships its description area as overflow-hidden doesn't trap the\n  \/\/ iframe before the first resize message lands.\n  (function(){\n    var f = document.getElementById('ff-configurator');\n    if (f) clearClipping(f);\n  })();\n})();\n\u003c\/script\u003e","brand":"Christenson Surfboards","offers":[{"title":"Default Title","offer_id":45599628558383,"sku":null,"price":0.0,"currency_code":"USD","in_stock":true}]}],"url":"https:\/\/christensonsurfboards.com\/collections\/custom.oembed?page=3","provider":"Christenson Surfboards","version":"1.0","type":"link"}