{
  "version": 3,
  "sources": ["/cdn/shop/t/27/assets/foil-build.js?cb=1792774190053"],
  "sourcesContent": ["/* AXIS: build a complete foil (ported from Live2Kite, 2026-09-25).\n *\n * Evan, 2026-09-19: \"This widget would be nice to use for packages, complete foils. So\n * when someone picks the front wings first, then the only see the products that are\n * compatible.\"\n *\n * Four steps, each narrowed by the ones before: front wing, rear wing, fuselage, mast,\n * then the doodad and base plate an aluminium mast needs, chosen rather than asked.\n * Same engine, same rules, same catalogue as /pages/foil-fit and the product-page block,\n * so a setup this builds can never contradict what those two say.\n *\n * THE NARROWING FOLLOWS THE REAL DEPENDENCY, not the order of the page. A mast and a\n * rear hang off the FUSELAGE, not off the front wing (Evan), so the mast is filtered by\n * the chosen fuselage. The REAR is picked before any fuselage exists, so it is offered\n * against every fuselage the front wing can reach and the fuselage step then has to\n * satisfy both wings; that is what stops a rear choice leading to an empty step.\n *\n * ADDING TO CART: a POST to /cart/add.js with every chosen variant, then the cart page.\n * The /cart/<id>:1,<id>:1 permalink also works but jumps straight to checkout, which is\n * wrong for something somebody is still assembling.\n *\n * SIX PRODUCTS CANNOT BE ADDED BLIND: the four Red fuselages and the Red Windsurfing\n * carry doodad options, and the FATTY integrated e-foil mast has a cover option worth\n * $169. Adding \"the cheapest variant\" there would put the wrong part in the basket, so\n * those are added on their own product page and the builder says so.\n */\n(function () {\n  'use strict';\n\n  // Evan, 2026-09-20: front wing, then REAR wing, then fuselage, then mast. The wings are\n  // what a rider actually has an opinion about; the fuselage and mast are the plumbing\n  // that has to agree with them. Choosing the rear before the fuselage means the rear is\n  // narrowed by what the FRONT wing can reach rather than by a fuselage nobody has picked\n  // yet, and then the fuselage has to satisfy BOTH wings.\n  var STEPS = [\n    { key: 'front', cat: 'front wing', label: 'Front wing', needs: null, hint: 'Start here. Everything else follows from it.' },\n    { key: 'rear', cat: 'rear wing', label: 'Rear wing', needs: 'front', hint: 'Rear wings that can run with your front wing.' },\n    { key: 'fuse', cat: 'fuselage', label: 'Fuselage', needs: 'rear', hint: 'Fuselages that take both of your wings.' },\n    { key: 'mast', cat: 'mast', label: 'Mast', needs: 'fuse', hint: 'Masts that fit your fuselage.' }\n  ];\n\n  function el(t, c, x) { var e = document.createElement(t); if (c) e.className = c; if (x != null) e.textContent = x; return e; }\n  function label(p) { return p.title.replace(/^AXIS Foils\\s+/i, '').replace(/^AXIS\\s+/i, ''); }\n  function money(n) { return '$' + Number(n).toFixed(2).replace(/\\.00$/, ''); }\n  // Evan, 2026-09-20: \"when you show price for each item, and there is a discount on it,\n  // show the original price crossed out with the new price on it.\" compareAt is only set\n  // in the data when it is ABOVE the price, so a stray compare-at can never show a\n  // \"saving\" that costs the customer more.\n  function priceNode(cls, p) {\n    var w = el('span', cls);\n    if (p.compareAt && Number(p.compareAt) > Number(p.price)) {\n      w.appendChild(el('s', 'fb-was', money(p.compareAt)));\n      w.appendChild(document.createTextNode(' '));\n      w.appendChild(el('span', 'fb-now', money(p.price)));\n    } else {\n      w.appendChild(document.createTextNode(money(p.price)));\n    }\n    return w;\n  }\n\n  // Usage counts (Evan, 2026-10-28: \"Yes\" to counting who uses the builders): one anonymous call per event to\n  // id.axisfoils.com, which keeps a daily count; no cookie, no id. Preview themes, the theme editor and automated\n  // browsers do not report. Never in the way of the page.\n  function usage(e) {\n    try {\n      var s = window.Shopify || {};\n      if (navigator.webdriver || s.designMode || (s.theme && s.theme.role && s.theme.role !== 'main')) return;\n      fetch('https://id.axisfoils.com/api/use?e=' + e, { mode: 'no-cors', keepalive: true, credentials: 'omit', referrerPolicy: 'strict-origin-when-cross-origin' }).catch(function () {});\n    } catch (x) { /* nothing */ }\n  }\n\n  function init(root, data, rules, fit) {\n    usage('build_open');\n    var parts = data.parts;\n    // Parts a complete setup needs that are not one of the four steps: the doodad and\n    // the base plate an aluminium mast requires. Absent in older data, so default it.\n    var extras = data.extras || {};\n    var state = { front: null, fuse: null, mast: null, rear: null };\n\n    function famRank(cat) {\n      var order = (rules.familyOrder && rules.familyOrder[cat]) || [];\n      var rank = {};\n      order.forEach(function (f, i) { rank[f.toLowerCase()] = i; });\n      return function (p) {\n        var f = null;\n        if (cat === 'fuselage') f = fit.fuselageFamily(rules, p.title);\n        else if (cat === 'rear wing') f = fit.rearFamily(rules, p.title);\n        else if (cat === 'mast') f = fit.mastFamily(rules, p.title);\n        var name = (f && f.family) || p.family || '';\n        var r = rank[name.toLowerCase()];\n        return r === undefined ? order.length + 1 : r;\n      };\n    }\n\n    /** Pricelist position, for fuselages (Evan, 2026-09-20). Listed parts first, in list order. */\n    function plCompare(a, b) {\n      var ra = a.plRank, rb = b.plRank;\n      var ha = ra !== null && ra !== undefined, hb = rb !== null && rb !== undefined;\n      if (ha && hb) return ra - rb;\n      if (ha !== hb) return ha ? -1 : 1;\n      return 0;\n    }\n\n    function sortFor(cat) {\n      var rk = famRank(cat);\n      return function (a, b) {\n        if (cat === 'fuselage') { var pl = plCompare(a, b); if (pl) return pl; }\n        var d = rk(a) - rk(b);\n        if (d) return d;\n        var sa = Number(a.span) || 0, sb = Number(b.span) || 0;\n        if (sa !== sb) return sb - sa;\n        var ca = Number(a.chord) || 0, cb = Number(b.chord) || 0;\n        if (ca !== cb) return cb - ca;\n        return label(a).localeCompare(label(b));\n      };\n    }\n\n    /** The options for a step, already narrowed, each with its verdict. */\n    function optionsFor(key) {\n      // AXIS (2026-09-25): only parts that can go in the cart. The data carries Shopify's availableForSale;\n      // Live2Kite's builder ignores it, so a sold-out part could be picked and the add then failed\n      // (\"the cart would not take that\"). 21 of 171 AXIS parts were unavailable when this was added.\n      var all = function (c) { return parts.filter(function (p) { return p.category === c && p.available !== false; }); };\n      if (key === 'front') {\n        // Only wings the fit table can actually advise on. Offering a wing we cannot\n        // place would build a setup we cannot stand behind.\n        return all('front wing').filter(function (p) { return p.system; })\n          .map(function (p) { return { p: p, v: { severity: 'ok', reasons: [] } }; })\n          .sort(function (a, b) { return sortFor('front wing')(a.p, b.p); });\n      }\n      if (!state.front) return [];\n\n      // Fuselages the chosen FRONT wing can go on. Everything downstream is judged\n      // against this set, which is what keeps the rear step from offering a wing that\n      // would leave no fuselage at all.\n      var fusesForFront = all('fuselage').filter(function (f) { return fit.fuselageFits(rules, state.front, f).ok; });\n\n      if (key === 'rear') {\n        // A rear mounts to a FUSELAGE, and no fuselage is chosen yet, so offer the rears\n        // that work with at least ONE fuselage this front wing can use. Offering every\n        // rear would let somebody pick a Skinny Link behind a Black-system wing and hit\n        // a dead end at the next step, with nothing to explain it.\n        return all('rear wing').map(function (p) {\n          var okOn = fusesForFront.filter(function (f) { return fit.rearFits(rules, f, p).ok; });\n          return { p: p, v: okOn.length ? { ok: true, severity: 'ok', reasons: [] } : { ok: false } };\n        }).filter(function (r) { return r.v.ok; })\n          .sort(function (a, b) { return sortFor('rear wing')(a.p, b.p); });\n      }\n      if (!state.rear) return [];\n      if (key === 'fuse') {\n        // Must satisfy BOTH wings now.\n        return fusesForFront.map(function (p) { return { p: p, v: fit.rearFits(rules, p, state.rear) }; })\n          .filter(function (r) { return r.v.ok; })\n          .sort(function (a, b) { return sortFor('fuselage')(a.p, b.p); });\n      }\n      if (!state.fuse) return [];\n      return all('mast').map(function (p) { return { p: p, v: fit.mastFits(rules, state.fuse, p, state.front, null) }; })\n        .filter(function (r) { return r.v.ok; })\n        .sort(function (a, b) { return sortFor('mast')(a.p, b.p); });\n    }\n\n    // THE PICTURE PANEL (foil-build-viz.js; Evan, 2026-10-04: \"each change they make, shows the new selection on\n    // the product photo\", \"I want this feature to be amazing\"): beside the steps on a computer, above them on a\n    // phone. The builder keeps all the logic; the panel only draws what is chosen, and previews what is pointed at.\n    var main = el('div', 'fb-main');\n    var wrap = el('div', 'fb');\n    main.appendChild(wrap);\n    // The empty stage shows AXIS's own assembled foil (theme asset foil-build-empty.jpg), and each empty slot a real part\n    // of that kind, the first in the range's own order (Evan, 2026-10-04: \"more axis specific\").\n    var firstImage = function (cat) {\n      var c = parts.filter(function (p) { return p.category === cat && p.image && p.available !== false; }).sort(sortFor(cat))[0];\n      return c ? c.image : null;\n    };\n    var viz = window.AxisBuildViz ? window.AxisBuildViz.create({\n      label: label, priceNode: priceNode,\n      emptyImage: root.getAttribute('data-empty') || null,\n      placeholders: { front: firstImage('front wing'), rear: firstImage('rear wing'), fuse: firstImage('fuselage'), mast: firstImage('mast') },\n      onSlot: function (key) { var s = document.getElementById('fb-step-' + key); if (s) s.scrollIntoView({ behavior: 'smooth', block: 'start' }); },\n      // The panel's button adds the setup itself when it can (Evan, 2026-10-19: \"I built a foil, I clicked Review and add\n      // to cart, I ended up with this cart\"; it used to scroll to the summary and leave the adding to a second button).\n      // When a part still needs its options chosen on its own page, it scrolls to the summary as before.\n      reviewLabel: function () { return addNow ? 'Add setup to cart' : 'Review your setup'; },\n      onReview: function (e) {\n        if (addNow) { addNow(e && e.currentTarget); return; }\n        var s = wrap.querySelector('.fb-sum'); if (s) s.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    }) : null;\n    var vizInfo = { total: null, was: null };\n    var addNow = null;   // the summary's add-to-cart, for the panel's button; null when a part needs options first\n    if (viz) { root.classList.add('fb-has-viz'); root.appendChild(viz.el); document.body.appendChild(viz.dock); }\n    root.appendChild(main);\n    var pending = {};   // preset parts waiting for an earlier step (see applyPreset)\n    var optIn = { sliders: false };   // optional parts the rider ticks (the board slider set)\n    var suggest = {}, suggestKit = '';  // a kit's suggested parts per step, [{h, lvl}] (see KITS, applyPreset)\n\n    function choose(key, p) {\n      state[key] = p;\n      // The steps are a chain now, each needing the one before: rear needs the front\n      // wing, the fuselage needs BOTH wings, the mast needs the fuselage. So re-check\n      // every LATER step, in order, and drop any choice that no longer fits, which in\n      // turn re-checks the ones after it. Keeping a still-valid choice spares the rider\n      // re-picking it; keeping an invalid one would put a part in the basket that does\n      // not fit.\n      var i = STEPS.map(function (x) { return x.key; }).indexOf(key);\n      STEPS.slice(i + 1).forEach(function (st) {\n        if (!state[st.key]) return;\n        var still = optionsFor(st.key).some(function (r) { return r.p.handle === state[st.key].handle; });\n        if (!still) state[st.key] = null;\n      });\n      // a waiting preset part joins as soon as it is on offer; one that does not fit is let go\n      STEPS.slice(i + 1).forEach(function (st) {\n        var h = pending[st.key];\n        if (!h || state[st.key] || (st.needs && !state[st.needs])) return;\n        var hit = optionsFor(st.key).filter(function (r) { return r.p.handle === h; })[0];\n        if (hit) state[st.key] = hit.p;\n        delete pending[st.key];\n      });\n      render();\n      // Bring the next step into view: a choice closes a long list above it, and on a phone the page used to land in the\n      // middle of the next list with its heading off screen (2026-10-04). After the last part, the setup summary.\n      var nxt = STEPS.filter(function (st) { return !state[st.key]; })[0];\n      var target = nxt ? document.getElementById('fb-step-' + nxt.key) : wrap.querySelector('.fb-sum');\n      if (target) {\n        var top = target.getBoundingClientRect().top;\n        if (top < 0 || top > window.innerHeight * 0.6) target.scrollIntoView({ behavior: 'smooth', block: 'start' });\n      }\n    }\n\n    // Clearing a step clears everything after it: without the earlier choice there is\n    // nothing to judge the later ones against, and the summary would otherwise list a\n    // fuselage with no rear wing to explain it.\n    function clearFrom(key) {\n      var i = STEPS.map(function (x) { return x.key; }).indexOf(key);\n      STEPS.slice(i).forEach(function (st) { state[st.key] = null; });\n      render();\n    }\n\n    function card(step, r) {\n      var b = el('button', 'fb-card');\n      b.type = 'button';\n      if (r.p.image) { var im = el('img', 'fb-img'); im.src = r.p.image; im.alt = ''; im.loading = 'lazy'; b.appendChild(im); }\n      b.appendChild(el('span', 'fb-card-name', label(r.p)));\n      if (r.p.price) b.appendChild(priceNode('fb-card-price', r.p));\n      if (r.v.severity === 'info' || r.v.severity === 'warn') {\n        b.appendChild(el('span', 'fb-card-note ' + (r.v.severity === 'warn' ? 'fb-warn' : 'fb-info'), r.v.reasons[0] || ''));\n      }\n      // no \"On order\" label on axisfoils.com (Evan, 2026-09-29: \"Dont show on order\")\n      // AXIS: a sold-out part that ships as a named replacement at no extra cost (see axis-v2-build-fit-data.js)\n      if (r.p.note) b.appendChild(el('span', 'fb-card-note fb-info', r.p.note));\n      b.addEventListener('click', function () { choose(step.key, r.p); });\n      if (viz) viz.attach(b, r.p, step.key);\n      return b;\n    }\n\n    function render() {\n      wrap.innerHTML = '';\n      STEPS.forEach(function (step, i) {\n        var chosen = state[step.key];\n        var prior = !step.needs || !!state[step.needs];\n        var sec = el('section', 'fb-step' + (chosen ? ' fb-done' : '') + (prior ? '' : ' fb-locked'));\n        sec.id = 'fb-step-' + step.key;\n        var h = el('h3', 'fb-step-head');\n        h.appendChild(el('span', 'fb-num', String(i + 1)));\n        h.appendChild(el('span', 'fb-step-label', step.label));\n        sec.appendChild(h);\n        var DD = window.AxisBuildViz.dropdown;\n\n        if (!prior) {\n          var needed = STEPS.filter(function (x) { return x.key === step.needs; })[0];\n          sec.appendChild(DD({ key: step.key, disabledText: 'Choose your ' + needed.label.toLowerCase() + ' first' }));\n          wrap.appendChild(sec);\n          return;\n        }\n\n        var opts = optionsFor(step.key);\n        if (!opts.length) {\n          sec.appendChild(el('p', 'fb-hint', 'Nothing in the range fits that combination. Get in touch through axisfoils.com/pages/contact-us.'));\n          wrap.appendChild(sec);\n          return;\n        }\n        // AXIS (Evan, 2026-09-27: \"showing all the product thumbnails is overwhelming\"): every step is two taps.\n        // First the FAMILY, as compact buttons in the rules' familyOrder (the options arrive sorted that way),\n        // each with how many sizes fit and the lowest price; then that family's sizes as text rows with price\n        // and any fit note, no pictures. One family only: its rows open straight away. Live2Kite's grid of\n        // picture cards is the original; this replaces it on AXIS only.\n        var groups = [], cur = null;\n        // A fuselage's family names its LENGTH too (\"Black Advance+ Short\"), which made one button per length;\n        // group fuselages by LINE (Black Advance+, Advance 20, Advance+ Fatty, Ti Link, Red...) and let the rows\n        // be the lengths. The Fatty ones keep \"Fatty\" from the title, which their family label drops.\n        function groupOf(p) {\n          var f = p.family || 'Other';\n          if (p.category !== 'fuselage') return f;\n          f = f.replace(/\\b(standard|short|ultrashort|ultra short|crazyshort|sillyshort|psychoshort|windsurf(ing)?)\\b/gi, '').replace(/\\s+/g, ' ').trim();\n          if (/fatty/i.test(p.title) && !/fatty/i.test(f)) f += ' Fatty';\n          return f || 'Other';\n        }\n        var byFam = {};\n        opts.forEach(function (r) {\n          var fam = groupOf(r.p);\n          if (!byFam[fam]) { byFam[fam] = { fam: fam, items: [] }; groups.push(byFam[fam]); }\n          byFam[fam].items.push(r);\n        });\n        // Suggestions for this step: a list of {h, lvl} from the kit (see KITS). The fuselage can be a RULE that\n        // follows the front wing the rider picked ('wake-rule', Evan 2026-09-27, the answer about the Advance 20 was\n        // \"NO, my mistake\"): Tempo (Ti Link) none; a Red-era wing (SP, BSC 970/1060/1120, the Red PNGs) the Red Short\n        // Advance, since Red-era wings fit Red fuselages only; HPS, the Black BSC sizes and ART (V1) the Black Short\n        // Advance 20; every other wing the Black Short Advance+.\n        var suggList = (suggest[step.key] || []).slice();\n        // 'dock-pump-rule': Tempo takes the Ti Link fuselage; a Red-era wing the Red Short Advance; any other the\n        // Black Short Advance+. Long distance pump (Evan, 2026-09-27): \"psycho short fatty fuse on the 1750 with the\n        // skinny 25 or 30 / Psychoshort adv + or Fatty for the 1500 with skinny 35, 30 or 25\". The 2100 keeps the\n        // FATTY Short, from the rules (\"AXIS pairs the Fireball 1500, 1750 and 2100 with the FATTY mast and fuselage\").\n        var FATTY_PSYCHO = 'black-fuselage-ultrashort-length-advance-fatty-640mm-with-zinc-titanium-inserts-copy';  // 520mm, handle as created\n        var fbSize = function () { var t = (state.front || {}).title || ''; var m = /fireball/i.test(t) && t.match(/\\b(1500|1750|2100)\\b/); return m ? m[1] : ''; };\n        if (step.key === 'fuse' && suggList.length === 1 && suggList[0].h === 'dock-pump-rule') {\n          var dw = state.front || {}, fb = fbSize();\n          suggList = fb === '1750' ? [{ h: FATTY_PSYCHO }]\n            : fb === '1500' ? [{ h: 'black-psychoshort-advance-fuselage' }, { h: FATTY_PSYCHO }]\n            : fb === '2100' ? [{ h: 'black-fuselage-short-length-advance-fatty-700mm-with-zinc-titanium-inserts' }]\n            : [{ h: /tempo/i.test(String(dw.family || '')) ? 'ti-link'\n              : String(dw.system || '').toLowerCase() === 'red' ? 'red-short-advance-fuselage' : 'black-short-advance-fuselage' }];\n        }\n        // Evan, 2026-09-29: \"Surf skinny rear wings work great with the Surges on all disciplines and conditions\", and\n        // for wake \"never Skinny. But Surf Skinny\". So in every kit a Surge front gets the Surf Skinny, every size of it\n        // (280 to 340): marking one or two sizes read as if the others were not suggested.\n        var SURF_SKINNY = [{ h: 'surf-skinny-340-50-carbon-rear-hydrofoil-wing' }, { h: 'skinny-surf-320-48-carbon-rear-hydrofoil-wing' },\n          { h: 'skinny-surf-300-45-carbon-rear-hydrofoil-wing' }, { h: 'skinny-surf-280-43-carbon-rear-hydrofoil-wing' }];\n        var isSurge = function () { return /surge/i.test(String((state.front || {}).family || '') + ' ' + ((state.front || {}).title || '')); };\n        // 'dock-pump-rear-rule': the Skinny sizes above for the two long distance Fireballs, the Surf Skinny for a Surge, the 460 Pump for the rest.\n        // The Skinny 358/25 is sold out (2026-09-27) and shows again when it is back.\n        if (step.key === 'rear' && suggList.length === 1 && suggList[0].h === 'dock-pump-rear-rule') {\n          var S25 = 'skinny-358-30-carbon-rear-hydrofoil-wing-copy', S30 = 'skinny-358-30-carbon-rear-hydrofoil-wing', S35 = 'skinny-358-35-carbon-rear-hydrofoil-wing';\n          suggList = fbSize() === '1750' ? [{ h: S25 }, { h: S30 }] : fbSize() === '1500' ? [{ h: S35 }, { h: S30 }, { h: S25 }]\n            : isSurge() ? SURF_SKINNY : [{ h: '460-flat-pump-carbon-rear-wing' }];\n        }\n        // 'wake-rear-rule': a Surge gets the Surf Skinny; anything else no mark. The Progressive 375 was marked until\n        // Evan, 2026-09-29: \"don't show the suggested for a complete wake foil mark. Other sizes are suggested also\".\n        if (step.key === 'rear' && suggList.length === 1 && suggList[0].h === 'wake-rear-rule') {\n          suggList = isSurge() ? SURF_SKINNY : [];\n        }\n        // 'dock-pump-mast-rule': a Fatty fuselage gets the Power Carbon FATTY 80; any other the black 19mm 75 or 82.\n        // Evan, 2026-09-27: \"for pump don't suggest 90cm long masts. Only 82, 80 or shorter\".\n        if (step.key === 'mast' && suggList.length === 1 && suggList[0].h === 'dock-pump-mast-rule') {\n          // Fireball 1500 without the FATTY (Evan, 2026-09-27): the PRO Ultra High Modulus 72 or 80 (\"an amazing option\n          // for that wing\"), the Power Carbon High Modulus 75 or 82, or aluminium; \"the regular power carbon is not stiff\n          // enough\", so it is never suggested with this wing.\n          suggList = state.fuse && /fatty/i.test(state.fuse.title) ? [{ h: 'axis-power-carbon-fatty-mast-base-plate-80' }]\n            : fbSize() === '1500' ? [{ h: 'pro-ultra-high-modulus-carbon-720' }, { h: 'pro-ultra-high-modulus-carbon-800' },\n              { h: 'power-carbon-high-modulus-foil-mast-base-plate-75' }, { h: 'power-carbon-high-modulus-foil-mast-base-plate-82' },\n              { h: '19mm-aluminium-mast-75' }, { h: '19mm-aluminium-mast-82' }]\n            : [{ h: '19mm-aluminium-mast-75' }, { h: '19mm-aluminium-mast-82' }];\n        }\n        if (step.key === 'fuse' && suggList.length === 1 && suggList[0].h === 'wake-rule') {\n          var fw = state.front || {}, ff = String(fw.family || '');\n          var rule = /tempo/i.test(ff) ? null\n            : String(fw.system || '').toLowerCase() === 'red' ? 'red-short-advance-fuselage'\n            : /^(HPS|BSC|ART)$/i.test(ff) ? 'black-fuselage-short-length-advance-20-703mm-with-zinc-titanium-inserts'\n            : 'black-short-advance-fuselage';\n          suggList = rule ? [{ h: rule }] : [];\n        }\n        var suggLvl = {};\n        suggList.forEach(function (x) { suggLvl[x.h] = suggLvl[x.h] ? suggLvl[x.h] + ', ' + x.lvl : (x.lvl || ''); });\n        var offered = suggList.map(function (x) { return opts.filter(function (r) { return r.p.handle === x.h; })[0]; })\n          .filter(function (r, i, arr) { return r && arr.indexOf(r) === i; });\n        // several suggestions (the Wake kit's wings by level): a \"Suggested\" group first, open by default\n        var SUGG_FAM = 'Suggested for a ' + suggestKit;\n        if (offered.length > 1) groups.unshift({ fam: SUGG_FAM, items: offered, suggested: true });\n        // ONE PULL-DOWN PER STEP (Evan, 2026-10-04: \"Each product category should be a pull down menu. Otherwise the endless\n        // options are overwhelming\"). It replaces the family buttons and rows: families become the list's groups, a kit's\n        // suggestions keep their own group on top (or their mark in place), and the fit and kit notes stay on each option.\n        var isS = function (r) { return Object.prototype.hasOwnProperty.call(suggLvl, r.p.handle); };\n        var ddGroups = groups.map(function (g) {\n          return { name: g.fam, suggested: !!g.suggested, items: g.items.map(function (r) {\n            var notes = [];\n            if (isS(r)) notes.push(suggLvl[r.p.handle] ? suggLvl[r.p.handle] + '.' : 'Suggested for a ' + suggestKit + '.');\n            if (r.v.severity === 'info' || r.v.severity === 'warn') notes.push(r.v.reasons[0] || '');\n            if (r.p.note) notes.push(r.p.note);\n            return { p: r.p, note: notes.join(' '), warn: r.v.severity === 'warn', suggested: isS(r) };\n          }) };\n        });\n        var nextKey = (STEPS.filter(function (st) { return !state[st.key]; })[0] || {}).key;\n        sec.appendChild(DD({\n          key: step.key,\n          placeholder: 'Choose your ' + step.label.toLowerCase(),\n          sub: opts.length + (opts.length === 1 ? ' fits' : ' fit') + (step.key === 'front' ? ' the range' : ' your setup') + (suggestKit && suggList.length ? ', suggested ones marked' : ''),\n          chosen: chosen, groups: ddGroups, next: step.key === nextKey,\n          label: label, priceNode: priceNode, viz: viz,\n          onChoose: function (p) { choose(step.key, p); }\n        }));\n        wrap.appendChild(sec);\n      });\n\n      wrap.appendChild(summary());\n      if (viz) viz.update({ state: state, total: vizInfo.total, was: vizInfo.was, extras: requiredExtras() });\n    }\n\n    /**\n     * Parts a setup NEEDS that are not one of the four steps.\n     *\n     * A 19mm ALUMINIUM mast bolts to the fuselage through a doodad and brings no base\n     * plate; a carbon mast ships WITH its base plate and needs neither. Before this, the\n     * builder called a four-item basket a \"Complete setup\" that could not actually be\n     * assembled: the doodad warning appears on the mast card and then vanishes the moment\n     * the step collapses, so by the time somebody reached the total it was gone.\n     */\n    function requiredExtras() {\n      var out = [];\n      var mast = state.mast, fuse = state.fuse;\n      if (!mast || !fuse) return out;\n      var mastName = label(mast);\n      var isAlu = /alumini?um/i.test(String(mast.construction || '') + ' ' + mastName);\n      // Carbon masts arrive as \"Mast & Base Plate\" and bolt straight on. Nothing to add,\n      // and nothing to ask.\n      if (!isAlu) return out;\n\n      var fuseName = String(fuse.family || '') + ' ' + label(fuse);\n      var isLink = /ti[\\s-]?link/i.test(fuseName);\n      var isFatty = /fatty/i.test(fuseName);\n      // The generation is read off the MAST: the black system has its own doodad and\n      // base plate at different prices.\n      var isBlackGen = /\\bBLACK\\b/i.test(mastName);\n\n      // THE DOODAD IS DECIDED BY THE FUSELAGE, so it is chosen here rather than asked.\n      // Evan: \"you don't want to keep on asking people what else they want, you want to\n      // tell them, since you chose a fuselage already\".\n      if (!isLink) {\n        var dd = isFatty ? extras.doodadFatty\n          : (isBlackGen ? (extras.doodadBlack || extras.doodad) : (extras.doodad || extras.doodadBlack));\n        if (dd) {\n          out.push({\n            part: dd,\n            why: isFatty\n              ? 'Your FATTY fuselage takes the FATTY doodad to accept a 19mm mast.'\n              : 'Your ' + (isBlackGen ? 'black ' : '') + 'aluminium mast bolts to this fuselage through the doodad.'\n          });\n        }\n      }\n      // The base plate joins the mast to the BOARD, so it is needed whatever the\n      // fuselage; only the generation changes.\n      var bp = isBlackGen ? (extras.basePlateBlack || extras.basePlate) : (extras.basePlate || extras.basePlateBlack);\n      if (bp) out.push({ part: bp, why: 'An aluminium mast does not come with a base plate; a carbon mast does.' });\n      // AXIS (Evan, 2026-09-25): the screws for base plate to mast and fuselage through the doodad to the\n      // mast. Fuselages ship with their own screws, pre-Tef-Gelled, and a carbon mast needs none of these.\n      if (extras.mastScrews && extras.mastScrews.available !== false) {\n        out.push({ part: extras.mastScrews, why: 'The screws that join the base plate to the mast, and the fuselage through the doodad to the mast.' });\n      }\n      return out;\n    }\n\n    // RETIRED $0 HELPERS (Evan, 2026-10-19, after building a foil: \"I ended up with this cart\", which held only\n    // \"SCREWS-TEFGEL $0.00, None - Already Own an AXIS Screw Set\" x3). The old options app put $0 helper lines in carts\n    // (screws-tefgel-3, ti-link-fuselage, carbon-masts); the products are DRAFT since 2026-09-28, but a cart from before\n    // keeps the lines. Adding a setup clears them first, so the cart shows the setup and nothing else of that kind.\n    var RETIRED = ['screws-tefgel-3', 'ti-link-fuselage', 'carbon-masts'];\n    function clearRetired() {\n      return fetch('/cart.js').then(function (r) { return r.json(); }).then(function (c) {\n        var u = {}, n = 0;\n        (c.items || []).forEach(function (i) { if (RETIRED.indexOf(i.handle) >= 0 && !i.final_price) { u[i.key] = 0; n++; } });\n        if (!n) return null;\n        return fetch('/cart/update.js', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ updates: u }) });\n      }).catch(function () { return null; });\n    }\n\n    function summary() {\n      var box = el('section', 'fb-sum');\n      box.appendChild(el('h3', null, 'Your setup'));\n      var picked = STEPS.map(function (s) { return { s: s, p: state[s.key] }; }).filter(function (x) { return x.p; });\n      if (!picked.length) {\n        vizInfo = { total: null, was: null };\n        addNow = null;\n        box.appendChild(el('p', 'fb-hint', 'Pick a front wing to begin.'));\n        return box;\n      }\n      var total = 0, was = 0, ul = el('ul', 'fb-sum-list');\n      picked.forEach(function (x) {\n        var li = el('li');\n        li.appendChild(el('span', 'fb-sum-cat', x.s.label));\n        var a = el('a', 'fb-sum-name', label(x.p));\n        a.href = '/products/' + x.p.handle;\n        li.appendChild(a);\n        if (x.p.price) { li.appendChild(priceNode('fb-sum-price', x.p)); total += Number(x.p.price); was += Number(x.p.compareAt || x.p.price); }\n        if (x.p.note) li.appendChild(el('span', 'fb-sum-why', x.p.note));\n        ul.appendChild(li);\n      });\n      var needed = requiredExtras();\n      // AXIS (Evan, 2026-09-25): a board with no sliders (t-nuts) and mast screws needs the slider and\n      // screw set to take the mast. That depends on the rider's BOARD, which the builder cannot see, so it\n      // is the one thing asked rather than chosen; ticking it adds the set to the summary, total and cart.\n      var sliderSet = extras.sliderSet;\n      if (optIn.sliders && sliderSet && sliderSet.available !== false) {\n        needed = needed.concat([{ part: sliderSet, why: 'Sliders (t-nuts) and screws to fix the mast to your board.' }]);\n      }\n      needed.forEach(function (n) {\n        var li = el('li', 'fb-sum-extra');\n        li.appendChild(el('span', 'fb-sum-cat', 'Also added'));\n        var a = el('a', 'fb-sum-name', n.part.title.replace(/^AXIS Foils /, ''));\n        a.href = '/products/' + n.part.handle;\n        li.appendChild(a);\n        if (n.part.price) { li.appendChild(priceNode('fb-sum-price', n.part)); total += Number(n.part.price); was += Number(n.part.compareAt || n.part.price); }\n        li.appendChild(el('span', 'fb-sum-why', n.why));\n        ul.appendChild(li);\n      });\n      box.appendChild(ul);\n\n      if (sliderSet && sliderSet.available !== false && picked.length) {\n        var lab = el('label', 'fb-opt');\n        var cb = el('input'); cb.type = 'checkbox'; cb.checked = !!optIn.sliders;\n        cb.addEventListener('change', function () { optIn.sliders = cb.checked; render(); });\n        lab.appendChild(cb);\n        lab.appendChild(document.createTextNode(' My board has no sliders (t-nuts) or mast screws yet: add the ' + sliderSet.title.replace(/^AXIS Foils /, '') + ' (' + money(sliderSet.price) + ')'));\n        box.appendChild(lab);\n      }\n\n      var t = el('p', 'fb-total');\n      t.appendChild(el('span', null, picked.length === STEPS.length ? 'Complete setup' : picked.length + ' of 4 chosen'));\n      // The whole setup's saving, the same way: original total crossed out beside the\n      // real one, only when something in it is actually discounted.\n      t.appendChild(priceNode('fb-total-n', { price: Math.round(total * 100) / 100, compareAt: Math.round(was * 100) / 100 }));\n      box.appendChild(t);\n      vizInfo = { total: Math.round(total * 100) / 100, was: Math.round(was * 100) / 100 };\n\n      var all = picked.concat(needed.map(function (n) { return { s: { label: 'Also added' }, p: n.part }; }));\n      var addable = all.filter(function (x) { return x.p.variantId && x.p.variantCount === 1; });\n      var manual = all.filter(function (x) { return x.p.variantCount > 1; });\n\n      var btn = el('button', 'fb-add', 'Add ' + addable.length + (addable.length === 1 ? ' item' : ' items') + ' to cart');\n      btn.type = 'button';\n      btn.disabled = !addable.length;\n      // One add for both buttons: this one and the picture panel's \"Add setup to cart\" (passed in as other).\n      var add = function (other) {\n        btn.disabled = true;\n        btn.textContent = 'Adding...';\n        if (other) { other.disabled = true; other.textContent = 'Adding...'; }\n        clearRetired().then(function () {\n          return fetch('/cart/add.js', {\n            method: 'POST', headers: { 'Content-Type': 'application/json' },\n            body: JSON.stringify({ items: addable.map(function (x) { return { id: Number(x.p.variantId), quantity: 1, properties: { '_Added from': 'setup builder' } }; }) })\n          });\n        }).then(function (r) {\n          if (!r.ok) throw new Error('cart refused');\n          usage('build_add');\n          window.location.href = '/cart';\n        }).catch(function () {\n          btn.disabled = false;\n          btn.textContent = 'Add ' + addable.length + ' to cart';\n          if (other) { other.disabled = false; other.textContent = 'Add setup to cart'; }\n          box.appendChild(el('p', 'fb-warn', 'The cart would not take that just now. Get in touch through axisfoils.com/pages/contact-us and we will put the setup together with you.'));\n          box.scrollIntoView({ behavior: 'smooth', block: 'start' });\n        });\n      };\n      btn.addEventListener('click', function () { add(); });\n      addNow = (addable.length && !manual.length) ? add : null;\n      box.appendChild(btn);\n\n      if (manual.length) {\n        // These carry options (a doodad size, a mast cover at +169). Adding a guessed\n        // variant would put the wrong part in somebody's basket.\n        var m = el('p', 'fb-manual');\n        m.appendChild(document.createTextNode('Choose your options for '));\n        manual.forEach(function (x, i) {\n          var a = el('a', null, label(x.p));\n          a.href = '/products/' + x.p.handle;\n          m.appendChild(a);\n          if (i < manual.length - 1) m.appendChild(document.createTextNode(', '));\n        });\n        m.appendChild(document.createTextNode(' on its own page, then add it.'));\n        box.appendChild(m);\n      }\n      return box;\n    }\n\n    // PRESETS (AXIS, 2026-09-25): a link can start the builder from a kit, replacing the option-app\n    // packages (Build Your Own Black/Red/Ti Link, the two Wake Thief editions). ?front=, ?rear=,\n    // ?fuse=, ?mast= take product handles and are applied in step order, each only if it is on offer at\n    // that point, so a preset can never force a part that does not fit. ?kit= names the kit for the\n    // note. A preset part that cannot be offered (sold out on the warehouse sheet, or not fitting) is\n    // NAMED, never dropped silently.\n    // KITS SUGGEST, THEY DO NOT PRESELECT (Evan, 2026-09-27: \"I'd start from 'select your front wing' instead of\n    // starting with a suggested setup\"). ?front= ?rear= ?fuse= ?mast= name the kit's parts and ?kit= its name. The\n    // builder still starts at the front wing with nothing chosen; at each step the kit's family opens by itself and\n    // its part is listed first, marked \"Suggested for <kit>\". A suggested front wing that cannot be offered (sold\n    // out) is named in the note at the top. A later suggestion that does not fit what the rider picked instead is\n    // simply not shown, since the rider has left the kit.\n    // THE KITS (Evan, 2026-09-27). A kit link is /pages/build-a-foil?kit=<slug>. Each step lists suggested parts,\n    // with a level where the kit offers a choice. The older ?front= &rear= &fuse= &mast= &kit=<name> form still works.\n    var KITS = {\n      // Evan, 2026-09-27: \"For DOCK and pump / Beginner: png v2 1200 / Intermediate: Surge 1240 / 1150, PNG v2 1300 /\n      // 1400, ART PRO 1401/1201, Fireball 1500/1350/1250/1160 / Advanced: Surge 1010, 950, Tempo 1090/1020/960,\n      // Fireball 1500, 1750\"\n      'dock-pump': { name: 'Complete Dock & Pump Foil',\n        front: [{ h: 'axis-png-v2-1200-ultra-high-mod-reinforced-carbon-hydrofoil-wing', lvl: 'Beginner' },\n          { h: 'axis-surge-1240-carbon-hydrofoil-wing', lvl: 'Intermediate' }, { h: 'axis-surge-1150-carbon-hydrofoil-wing', lvl: 'Intermediate' },\n          { h: 'axis-png-v2-1300-ultra-high-mod-reinforced-carbon-hydrofoil-wing', lvl: 'Intermediate' },\n          { h: 'axis-png-v2-1400-ultra-high-mod-reinforced-carbon-hydrofoil-wing', lvl: 'Intermediate' },\n          { h: 'art-pro-1401-carbon-hydrofoil-wing', lvl: 'Intermediate' }, { h: 'art-pro-1201-carbon-hydrofoil-wing', lvl: 'Intermediate' },\n          { h: 'axis-fireball-1500-ultra-high-mod-carbon-hydrofoil-wing', lvl: 'Intermediate' },\n          { h: 'axis-fireball-1350-ultra-high-mod-carbon-hydrofoil-wing', lvl: 'Intermediate' },\n          { h: 'axis-fireball-1160-ultra-high-mod-carbon-hydrofoil-wing-copy', lvl: 'Intermediate' },   // the Fireball 1250 (handle as created)\n          { h: 'axis-fireball-1160-ultra-high-mod-carbon-hydrofoil-wing', lvl: 'Intermediate' },\n          { h: 'axis-surge-1010-carbon-hydrofoil-wing', lvl: 'Advanced' }, { h: 'axis-surge-950-carbon-hydrofoil-wing', lvl: 'Advanced' },\n          { h: 'axis-tempo-1090-ultra-high-modulus-carbon-hydrofoil-wing', lvl: 'Advanced' },\n          { h: 'axis-tempo-1020-ultra-high-modulus-carbon-hydrofoil-wing', lvl: 'Advanced' },\n          { h: 'axis-tempo-960-ultra-high-modulus-carbon-hydrofoil-wing', lvl: 'Advanced' },\n          { h: 'axis-fireball-1500-ultra-high-mod-carbon-hydrofoil-wing', lvl: 'Advanced' },\n          { h: 'axis-fireball-1750-ultra-high-mod-carbon-hydrofoil-wing', lvl: 'Advanced' }],\n        rear: [{ h: 'dock-pump-rear-rule' }], fuse: [{ h: 'dock-pump-rule' }], mast: [{ h: 'dock-pump-mast-rule' }] },\n      // Evan: \"For a beginner Wake setup I'd suggest the Spitfire 1100, Surge 1150 or the closeout 1060 bsc. For an\n      // intermediate the Spitfire 960 or Surge 1010 / 1080, and for advance the Surge 950 or 890, Spitfire 960 or 900\"\n      'wake': { name: 'Complete Wake Foil',\n        front: [{ h: 'spitfire-1100', lvl: 'Beginner' }, { h: 'axis-surge-1150-carbon-hydrofoil-wing', lvl: 'Beginner' },\n          { h: 'bsc-1060-carbon-hydrofoil-wing', lvl: 'Beginner (closeout)' },\n          { h: 'spitfire-960', lvl: 'Intermediate' }, { h: 'axis-surge-1010-carbon-hydrofoil-wing', lvl: 'Intermediate' },\n          { h: 'axis-surge-1080-carbon-hydrofoil-wing', lvl: 'Intermediate' },\n          { h: 'axis-surge-950-carbon-hydrofoil-wing', lvl: 'Advanced' }, { h: 'axis-surge-890-carbon-hydrofoil-wing', lvl: 'Advanced' },\n          { h: 'spitfire-960', lvl: 'Advanced' }, { h: 'spitfire-900', lvl: 'Advanced' }],\n        rear: [{ h: 'wake-rear-rule' }], fuse: [{ h: 'wake-rule' }], mast: [{ h: 'power-carbon-high-modulus-foil-mast-base-plate-75' }] },\n      'ti-link': { name: 'Complete Ti Link Foil',\n        front: [{ h: 'axis-tempo-1020-ultra-high-modulus-carbon-hydrofoil-wing' }],\n        rear: [{ h: 'skinny-link-360-40-ultra-high-modulus-solid-carbon-hydrofoil-wing' }], fuse: [{ h: 'ti-link' }] }\n    };\n    // KITS SUGGEST, THEY DO NOT PRESELECT (Evan, 2026-09-27: \"I'd start from 'select your front wing'\"): the builder\n    // starts at the front wing with nothing chosen; each step opens on the kit's suggestion, marked. A kit link names\n    // the kit in the heading (\"Build a Complete Dock & Pump Foil\"). The generic builder never suggests anything.\n    function applyPreset() {\n      var q;\n      try { q = new URLSearchParams(window.location.search); } catch (e) { return; }\n      var slug = q.get('kit'), def = slug && KITS[slug];\n      if (def) {\n        suggestKit = def.name;\n        STEPS.forEach(function (st) { if (def[st.key]) suggest[st.key] = def[st.key]; });\n      } else {\n        var want = { front: q.get('front'), rear: q.get('rear'), fuse: q.get('fuse'), mast: q.get('mast') };\n        if (!want.front && !want.rear && !want.fuse && !want.mast) return;\n        // a link that names a front wing but no kit: the heading names the wing (\"Build a SURGE 890 foil\"), not\n        // \"Build a this setup\" (seen 2026-10-23 by the Foil Guide session, which passes kit=<Wing> foil to avoid it)\n        var fp = want.front && parts.filter(function (p) { return p.handle === want.front; })[0];\n        var fname = fp && label(fp).replace(/\\s+(ultra high mod(ulus)?\\s+)?(reinforced\\s+)?(solid\\s+)?carbon\\s+(rear\\s+|front\\s+)?hydrofoil\\s+wing\\b/gi, '').replace(/\\s*-\\s*/g, ' ').trim();\n        suggestKit = slug || (fname ? fname + ' foil' : 'complete foil');\n        STEPS.forEach(function (st) { if (want[st.key]) suggest[st.key] = [{ h: want[st.key] }]; });\n      }\n      var h1 = root.closest('.fb-wrap') && root.closest('.fb-wrap').querySelector('h1, h2.h1');\n      if (h1) { h1.textContent = 'Build a ' + suggestKit; document.title = 'Build a ' + suggestKit + ' | AXIS Foils'; }\n      var note = el('div', 'fb-preset');\n      var many = (suggest.front || []).length > 1;\n      note.appendChild(el('p', 'fb-preset-head', many\n        ? 'Our suggested wings for a ' + suggestKit + ' are listed by level first, then the suggested parts at each step. Pick any part you like.'\n        : 'The suggested parts for a ' + suggestKit + ' are marked at each step. Pick any part you like.'));\n      var fronts = (suggest.front || []);\n      var avail = fronts.filter(function (x) { return optionsFor('front').some(function (r) { return r.p.handle === x.h; }); });\n      if (fronts.length && !avail.length) note.appendChild(el('p', 'fb-warn', 'The suggested front wing is not available right now, so pick another.'));\n      main.insertBefore(note, wrap);   // the steps sit in .fb-main beside the picture panel\n    }\n\n    applyPreset();\n    render();\n  }\n\n  function boot() {\n    var root = document.getElementById('FoilBuild');\n    if (!root) return;\n    Promise.all([\n      fetch(root.getAttribute('data-parts')).then(function (r) { return r.json(); }),\n      fetch(root.getAttribute('data-rules')).then(function (r) { return r.json(); })\n    ]).then(function (res) {\n      if (!window.AxisFit) throw new Error('fit engine did not load');\n      if (!window.AxisBuildViz) throw new Error('builder panel (foil-build-viz.js) did not load');\n      root.innerHTML = '';\n      init(root, res[0], res[1], window.AxisFit);\n    }).catch(function (e) {\n      root.innerHTML = '';\n      var p = document.createElement('p');\n      p.className = 'fb-hint';\n      p.textContent = 'The setup builder could not load just now. Get in touch through axisfoils.com/pages/contact-us and we will put a setup together with you.';\n      root.appendChild(p);\n      if (window.console) console.error('foil build:', e);\n    });\n  }\n\n  if (typeof module !== 'undefined' && module.exports) module.exports = { };\n  else if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', boot);\n  else boot();\n})();\n"],
  "mappings": "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",
  "names": ["i"]
}
