{
  "version": 3,
  "sources": ["/cdn/shop/t/31/assets/package-builder.js?x=1790636813288"],
  "sourcesContent": ["/* ==========================================================================\n   Sammy's Catering Co. \u2014 package order builder.\n\n   Renders entirely from window.SAMMYS_MENUS[slug]. The step list is\n   tier-dependent: the client's breakdown gives each tier its own components\n   and its own choose-counts, so picking a different tier rebuilds the steps.\n\n   On submit it writes the whole order into a hidden field so the enquiry\n   email carries the tier, every chosen item, the headcount and the total.\n   ========================================================================== */\n(function () {\n  'use strict';\n\n  /* Cents only when there are any, so $65 and $4,320 stay clean but a $5.50\n     bottle does not read as $5.5. Rounded first, so summed drink prices\n     cannot leak floating point noise into the total. */\n  var MONEY = function (n) {\n    var v = Math.round(Number(n) * 100) / 100;\n    var cents = Math.round(v * 100) % 100 !== 0;\n    return '$' + v.toLocaleString('en-AU', { minimumFractionDigits: cents ? 2 : 0, maximumFractionDigits: 2 });\n  };\n\n  function h(tag, cls, text) {\n    var n = document.createElement(tag);\n    if (cls) n.className = cls;\n    if (text != null) n.textContent = text;\n    return n;\n  }\n\n  /* ---- serving quantities ---------------------------------------------\n     The menu data already writes every ratio into its qty text, e.g.\n     \"1 tray per 15 guests\", \"2 trays per 20 guests\", \"1 per 2 guests\",\n     \"1.5 rounds per person\". Reading those is better than duplicating the\n     numbers as separate fields that could drift apart from the wording.\n\n     Anything shared between guests (a tray, a platter) rounds up: you cannot\n     order two thirds of a tray. Per-person amounts scale straight through.\n\n     The data writes units in whichever number reads best (\"1 tray\", \"2\n     trays\"), so a unit is reduced to its singular before being re-formed for\n     the computed count. Some entries name two things at once, e.g. \"1 sweet\n     and 1 fruit cup per person\"; those are split on \"and\" and each part is\n     scaled by the same ratio.\n     --------------------------------------------------------------------- */\n  var QTY_RE = /^(.+?)\\s+per\\s+(?:(\\d+)\\s+)?(?:guests?|person|people)$/i;\n  var PART_RE = /^(\\d+(?:\\.\\d+)?)\\s*(.*)$/;\n\n  function singular(word) {\n    if (/ies$/i.test(word)) return word.replace(/ies$/i, 'y');\n    if (/(ch|sh|x|z)es$/i.test(word)) return word.replace(/es$/i, '');\n    if (/s$/i.test(word) && !/ss$/i.test(word)) return word.replace(/s$/i, '');\n    return word;\n  }\n\n  function pluralise(unit, n) {\n    if (!unit) return '';\n    var words = unit.split(' ');\n    var last = singular(words[words.length - 1]);\n\n    if (n !== 1) {\n      if (/^half$/i.test(last)) last = 'halves';\n      else if (/(ch|sh|s|x|z)$/i.test(last)) last += 'es';\n      else if (/[^aeiou]y$/i.test(last)) last = last.replace(/y$/i, 'ies');\n      else last += 's';\n    }\n\n    words[words.length - 1] = last;\n    return words.join(' ');\n  }\n\n  function scaleQty(qtyText, guests) {\n    if (!qtyText || !guests) return null;\n    var m = String(qtyText).trim().match(QTY_RE);\n    if (!m) return null;                       // \"Included\", \"As selected\", etc.\n\n    var per = m[2] ? parseInt(m[2], 10) : 1;\n    var parts = m[1].split(/\\s+and\\s+/i);\n    var labels = [];\n    var first = 0;\n    var named = false;\n\n    for (var i = 0; i < parts.length; i++) {\n      var p = parts[i].trim().match(PART_RE);\n      if (!p) return null;\n\n      var amount = parseFloat(p[1]);\n      var unit = (p[2] || '').trim();\n      if (unit) named = true;\n\n      /* Scale by the ratio, then round up once: 3 trays per 30 guests is 10\n         trays for 100, not 12. Rounding the guest groups first (100 / 30 up to\n         4 groups of 3) over-ordered. Per-person amounts scale straight through. */\n      var count = per > 1 ? Math.ceil(amount * guests / per) : amount * guests;\n      count = Math.round(count * 10) / 10;\n      if (i === 0) first = count;\n\n      labels.push(count + (unit ? ' ' + pluralise(unit, count) : ''));\n    }\n\n    /* \"1 per person\" at 30 guests reads \"30 for 30 guests\", which tells the\n       reader nothing they cannot see. Ratios that actually do arithmetic \u2014\n       trays, platters, one per two guests \u2014 are the point. */\n    var trivial = !named && per === 1 && first === guests;\n\n    return { count: first, label: labels.join(' and '), trivial: trivial };\n  }\n\n  /* ---- choice limits ---------------------------------------------------\n     Picks follow the menu exactly: \"choose 2 from rice\" is pick 2, at any\n     headcount. How many trays or pieces that makes is the kitchen's job, not\n     something the guest is asked to divide up.\n\n     The one exception is a component the data marks `allocate: true` (the\n     boxed meals), where the guest does say how many of each: 25 meals as\n     12 chicken bowls and 13 falafel, say.\n     --------------------------------------------------------------------- */\n\n  function qtyKind(comp) {\n    var m = String(comp.qty || '').trim().match(QTY_RE);\n    if (!m) return null;\n    if (/\\s+and\\s+/i.test(m[1])) return 'shared';     // two things at once cannot be split between picks\n    if (/\\btrays?\\b/i.test(m[1])) return 'tray';\n    return m[2] && parseInt(m[2], 10) > 1 ? 'shared' : 'person';\n  }\n\n  /* What the shared-out counts are counted in: \"trays\", \"pieces\", \"serves\". */\n  function unitLabel(comp) {\n    var m = String(comp.qty || '').trim().match(QTY_RE);\n    var p = m && m[1].trim().match(PART_RE);\n    var unit = p && (p[2] || '').trim();\n    return unit ? pluralise(unit, 2) : 'serves';\n  }\n\n  /* The unit the menu names (\"trays\", \"pieces\", \"rounds\"), or '' when it\n     names none, as in \"1 per person\". */\n  function namedUnit(comp) {\n    var m = String(comp.qty || '').trim().match(QTY_RE);\n    if (!m || /\\s+and\\s+/i.test(m[1])) return '';\n    var p = m[1].trim().match(PART_RE);\n    var unit = p && (p[2] || '').trim();\n    return unit ? pluralise(unit, 2) : '';\n  }\n\n  function Builder(root) {\n    var slug = root.getAttribute('data-package');\n    var menus = window.SAMMYS_MENUS || {};\n    var P = menus[slug];\n    if (!P) {\n      root.setAttribute('data-builder-error', 'Unknown package: ' + slug);\n      return;\n    }\n\n    var q = function (sel) { return root.querySelector(sel); };\n\n    /* Previewing an unpublished theme, Shopify pins its own 68px bar to the\n       bottom of the screen, exactly over the mobile dock. Lift the dock clear\n       of it there. Customers on the published theme never see that bar, and\n       the theme editor does not show it either. */\n    if (window.Shopify && Shopify.theme && Shopify.theme.role !== 'main' && !Shopify.designMode) {\n      root.style.setProperty('--pb-dock-offset', '68px');\n    }\n\n    var elSteps = q('[data-steps]');\n    var elRail = q('[data-stepbar]');\n    var btnBack = q('[data-back]');\n    var btnNext = q('[data-next]');\n    var elCount = q('[data-step-count]');\n    var elGuests = q('[data-guests]');\n    var elPicks = q('[data-summary-picks]');\n    var elTier = q('[data-summary-tier]');\n    var elPP = q('[data-summary-pp]');\n    var elTotal = q('[data-summary-total]');\n    var elWarn = q('[data-summary-warn]');\n    var elTierGrid = q('[data-tier-choices]');\n    var elLead = q('[data-summary-lead]');\n    var elTables = q('[data-summary-tables]');\n    var elStyling = q('[data-summary-styling]');\n    var elStylingRow = q('[data-summary-styling-row]');\n    var elTablesRow = q('[data-summary-tables-row]');\n    var elLeadRow = q('[data-summary-lead-row]');\n    var detailsStep = q('[data-details-step]');\n    var form = q('form');\n    var elOrderField = q('[data-order-field]');\n    var elSubject = q('[data-subject-field]');\n\n    var tier = null;\n    var picks = {};\n    var carriers = {};      // ci -> { option name: \"Bagel\" | \"Croissant\" }\n    var amounts = {};       // ci -> { option name: how many }\n    var allocTouched = {};  // ci -> the guest has set the counts by hand\n    var step = 0;\n    var stepSections = [];\n    var leadPick = null;    // the choice made before the tier, e.g. which live station\n\n    function choosers() {\n      return tier ? tier.components.filter(function (c) { return c.set; }) : [];\n    }\n    /* Some packages ask one question before the tier. Live catering picks the\n       station first, then prices it, because the tier means different things\n       depending on the station. Packages without a lead are unaffected. */\n    function hasLead() { return !!(P.lead && P.sets[P.lead.set]); }\n    function leadOffset() { return hasLead() ? 1 : 0; }\n\n    /* Before a tier exists only the fixed steps are reachable. */\n    function stepCount() {\n      var fixed = leadOffset() + 1;\n      return tier ? fixed + choosers().length + (addonsStep ? 1 : 0) + 1 : fixed;\n    }\n\n    /* ---- service ---------------------------------------------------------\n       A service reuses a package as it stands but brings its own fees and\n       floor. Board room & office is the drop off menu set up on site: the\n       tiles on its landing page link here with ?service=boardroom, and the\n       set up and pack down fees go to the cart as their own lines.\n       --------------------------------------------------------------------- */\n    var service = (function () {\n      var key = null;\n      try { key = new URLSearchParams(window.location.search).get('service'); } catch (e) { /* old browser */ }\n      var S = key && (window.SAMMYS_SERVICES || {})[key];\n      return S && (!S.packages || S.packages.indexOf(slug) > -1) ? S : null;\n    })();\n\n    function serviceCost() {\n      return service ? service.fees.reduce(function (n, f) { return n + (f.price || 0); }, 0) : 0;\n    }\n\n    function minOrder() {\n      return Math.max(P.minOrder || 0, service ? service.minOrder || 0 : 0);\n    }\n\n    /* ---- add ons -----------------------------------------------------------\n       Optional extras on event packages. Per-person ones follow the headcount;\n       per-table ones take a count. Each goes to the cart as its own line.\n       Entries with no variantId are shown with a link instead of a button.\n       --------------------------------------------------------------------- */\n    var addons = composeAddons();\n\n    /* The package's own extras (or the standard event ones, where listed),\n       then every shared platter category, then drinks. Drop-off packages\n       have no extras. The step decides which groups start open. Anything\n       without a firm price or a product is shown, marked on request, and\n       cannot be added. */\n    function composeAddons() {\n      var shared = window.SAMMYS_ADDONS || {};\n      var own = (P.addons && P.addons.length) ? P.addons\n        : ((shared.standardExtrasFor || []).indexOf(slug) > -1 ? (shared.standardExtras || []) : []);\n      var out = own.map(function (a) { return Object.assign({ group: 'extras' }, a); });\n\n      (shared.categories || []).forEach(function (c) {\n        c.items.forEach(function (it) {\n          var priced = it.price != null && !!it.variantId;\n          out.push({\n            group: c.id,\n            name: it.name,\n            label: it.label,\n            subgroup: it.subgroup,\n            subgroupNote: it.subgroupNote,\n            detail: [it.detail, it.qty, it.note].filter(Boolean).join(' \\u00b7 '),\n            price: it.price,\n            per: it.unit || c.unit || 'platter',\n            variantId: priced ? it.variantId : null,\n            priceLabel: it.price == null ? 'Price on request' : null,\n            link: priced ? null : '/pages/corporate-catering#enquiry',\n            linkLabel: priced ? null : 'Ask us'\n          });\n        });\n      });\n\n      return out;\n    }\n    var addonQty = {};        // index -> 1 (per person, added) or a table count\n    var addonsStep = null;\n\n    function addonAllowed(a) { return !a.minGuests || guestCount() >= a.minGuests; }\n\n    /* The chosen tier already has this extra, e.g. canap\u00E9s on arrival on a\n       canap\u00E9s package. Hidden, and never charged. */\n    function addonIncluded(a) {\n      if (a.group !== 'extras' || !tier) return false;\n      var inc = ((window.SAMMYS_ADDONS || {}).includedInTier || {})[slug] || {};\n      return (inc[a.name] || []).indexOf(tier.id) > -1;\n    }\n\n    function addonUnits(a, i) {\n      var n = addonQty[i] || 0;\n      if (!n || !addonAllowed(a) || addonIncluded(a)) return 0;\n      return a.per === 'person' ? guestCount() : n;\n    }\n\n    function addonsCost() {\n      return addons.reduce(function (sum, a, i) { return sum + (a.price || 0) * addonUnits(a, i); }, 0);\n    }\n\n    function chosenAddons() {\n      return addons.map(function (a, i) { return { a: a, i: i, units: addonUnits(a, i) }; })\n        .filter(function (x) { return x.units > 0 && x.a.variantId; });\n    }\n\n    function guestCount() { return Math.max(0, Number(elGuests.value) || 0); }\n\n    /* Per-table packages bill by the table. Each tier serves a fixed number,\n       so the headcount decides how many tables are needed; that count is both\n       the price multiplier and the cart quantity. */\n    function tableCount() {\n      if (!tier) return 0;\n      var cap = tier.capacity || 0;\n      if (!cap) return 1;\n      return Math.max(1, Math.ceil(guestCount() / cap));\n    }\n\n    function billedUnits() {\n      return P.priceUnit === 'table' ? tableCount() : guestCount();\n    }\n\n    /* ---- per-item quantities -------------------------------------------\n       Where every guest gets their own item \u2014 a boxed meal, a bowl \u2014 the\n       counts have to add up to the headcount. The target comes from the\n       component's own ratio so it follows whatever the data says.\n       --------------------------------------------------------------------- */\n    function allocTarget(comp) {\n      var scaled = scaleQty(comp.qty, guestCount());\n      return scaled ? Math.round(scaled.count) : guestCount();\n    }\n\n    function allocTotal(ci) {\n      var bag = amounts[ci] || {};\n      return (picks[ci] || []).reduce(function (n, name) { return n + (bag[name] || 0); }, 0);\n    }\n\n    /* Whether the guest says how many of each pick. Only where the data asks\n       for it (the boxed meals). */\n    function allocates(comp) {\n      return comp.allocate === true;\n    }\n\n    /* Meals and trays move one at a time. Hundreds of canap\u00E9 pieces would take\n       all day at that rate, so larger per-person counts move in fives or tens. */\n    function allocStep(comp) {\n      if (comp.allocate === true || qtyKind(comp) === 'tray') return 1;\n      var target = allocTarget(comp);\n      return target >= 200 ? 10 : target >= 60 ? 5 : 1;\n    }\n\n    function minPicks(comp) {\n      return Math.min(comp.choose, Math.max(1, optionCount(comp)));\n    }\n\n    /* The options a component can actually offer, less anything it bars. */\n    function optionCount(comp) {\n      var set = P.sets[comp.set];\n      if (!set) return 0;\n      return set.options.filter(function (opt) {\n        return !(comp.excludeLead && leadPick && opt.name === leadPick);\n      }).length;\n    }\n\n    function maxPicks(comp) {\n      return Math.max(minPicks(comp), Math.min(comp.chooseMax || comp.choose, optionCount(comp)));\n    }\n\n    /* The words for a step's choose rule at the current headcount. */\n    function ruleText(comp, set) {\n      var least = minPicks(comp);\n      var most = maxPicks(comp);\n      if (least >= most) return 'Pick ' + least + ' from ' + set.title;\n      return 'Pick ' + least + ' to ' + most + ' from ' + set.title;\n    }\n\n    /* What the headcount works out to, in words, with the menu's ratio in\n       brackets so it is clear where the number came from. Counts that only\n       repeat the pick (\"2 varieties\", \"1 station\") and the PDF's \"As\n       selected\" add nothing to the rule above, so they are left out. */\n    function amountText(comp) {\n      var qty = String(comp.qty || '').trim();\n      if (!qty || qtyKind(comp)) return '';\n      if (/^as selected$/i.test(qty) || /^\\d+\\s+(varieties|variety|stations?)$/i.test(qty)) return '';\n      return qty;\n    }\n\n    /* An even split is the sane starting point; the guest adjusts from there\n       rather than doing the arithmetic themselves. */\n    function shareOut(ci, comp) {\n      var list = picks[ci] || [];\n      var bag = amounts[ci] = {};\n      if (!list.length) return;\n\n      var target = allocTarget(comp);\n      var each = Math.floor(target / list.length);\n      var spare = target - each * list.length;\n\n      list.forEach(function (name, i) { bag[name] = each + (i < spare ? 1 : 0); });\n    }\n\n    /* ---- option markup -------------------------------------------------- */\n\n    function checkMark() {\n      var s = h('span', 'pb-choice__check');\n      s.setAttribute('aria-hidden', 'true');\n      s.innerHTML = '<svg viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M5 12.5l4.5 4.5L19 7.5\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/></svg>';\n      return s;\n    }\n\n    function dietTags(diet) {\n      var wrap = h('span', 'pb-choice__tags');\n      (diet || '').split(' ').filter(Boolean).forEach(function (d) {\n        if (d === 'v') wrap.appendChild(h('span', 'pb-tag', 'V'));\n        if (d === 'vegan') wrap.appendChild(h('span', 'pb-tag', 'Vegan'));\n        if (d === 'gf') wrap.appendChild(h('span', 'pb-tag', 'GF'));\n      });\n      return wrap.children.length ? wrap : null;\n    }\n\n    /* ---- steps ---------------------------------------------------------- */\n\n    function buildSteps() {\n      var keep = leadOffset() + 1;   // the lead step and the tier step are fixed\n      while (elSteps.children.length > keep) elSteps.removeChild(elSteps.lastChild);\n      stepSections = [];\n\n      choosers().forEach(function (comp, ci) {\n        var set = P.sets[comp.set];\n        if (!set) return;\n\n        var sec = h('section', 'pb-step');\n        sec.hidden = true;\n\n        var head = h('div', 'pb-step__head');\n        var title = h('h2', 'pb-step__title', comp.name);\n        if (set.suggested) {\n          title.appendChild(document.createTextNode(' '));\n          title.appendChild(h('span', 'pb-suggested', 'Suggested'));\n        }\n        head.appendChild(title);\n\n        var rule = h('p', 'pb-step__rule');\n        /* Both filled in by refreshQuantities(), since the limit and the\n           scaled count move with the headcount. */\n        rule.appendChild(h('b', 'pb-step__limit', ruleText(comp, set)));\n        rule.appendChild(h('span', 'pb-step__scaled'));\n        head.appendChild(rule);\n\n        /* \"Sahtein tier only\" and the like: this step only ever shows in that\n           tier, so there it reads as a warning and says nothing. */\n        if (set.note && !/\\btier only\\.?$/i.test(set.note)) head.appendChild(h('p', 'pb-step__note', set.note));\n        if (allocates(comp)) {\n          head.appendChild(h('p', 'pb-step__note', 'Each guest gets one. Use + and \\u2212 to choose how many of each.'));\n        }\n        head.appendChild(h('span', 'pb-step__counter'));\n\n        if (allocates(comp)) {\n          var rebalance = h('button', 'pb-rebalance', 'Split evenly');\n          rebalance.type = 'button';\n          rebalance.hidden = true;\n          rebalance.addEventListener('click', function () {\n            allocTouched[ci] = false;\n            shareOut(ci, comp);\n            syncStep(sec, ci, comp);\n            render();\n          });\n          head.appendChild(rebalance);\n        }\n        sec.appendChild(head);\n\n        /* dietary filter */\n        var diet = h('div', 'pb-diet');\n        diet.setAttribute('role', 'group');\n        diet.setAttribute('aria-label', 'Filter by dietary requirement');\n        [['all', 'All'], ['v', 'Vegetarian'], ['vegan', 'Vegan'], ['gf', 'Gluten free']].forEach(function (d) {\n          var b = h('button', null, d[1]);\n          b.type = 'button';\n          b.setAttribute('aria-pressed', String(d[0] === 'all'));\n          b.addEventListener('click', function () {\n            Array.prototype.forEach.call(diet.children, function (o) {\n              o.setAttribute('aria-pressed', String(o === b));\n            });\n            Array.prototype.forEach.call(sec.querySelectorAll('.pb-option'), function (c) {\n              c.hidden = d[0] !== 'all' && (c.getAttribute('data-diet') || '').split(' ').indexOf(d[0]) === -1;\n            });\n          });\n          diet.appendChild(b);\n        });\n        sec.appendChild(diet);\n\n        var grid = h('div', 'pb-choices');\n        /* A component can bar whatever the lead step already took, which keeps a\n           second live station different from the first. */\n        var options = set.options.filter(function (opt) {\n          return !(comp.excludeLead && leadPick && opt.name === leadPick);\n        });\n        options.forEach(function (opt) {\n          /* Each option is a card: the pick button, plus whatever extra\n             controls this component asks for. The wrapper exists because a\n             button cannot legally contain more buttons. */\n          var wrap = h('div', 'pb-option');\n          wrap.setAttribute('data-diet', opt.diet || '');\n\n          var b = h('button', 'pb-choice');\n          b.type = 'button';\n          b.setAttribute('aria-pressed', 'false');\n          b.setAttribute('data-diet', opt.diet || '');\n          b.appendChild(checkMark());\n          b.appendChild(h('span', 'pb-choice__name', opt.name));\n          if (opt.sub) b.appendChild(h('span', 'pb-choice__sub', opt.sub));\n          var t = dietTags(opt.diet);\n          if (t) b.appendChild(t);\n\n          b.addEventListener('click', function () {\n            var list = picks[ci] || (picks[ci] = []);\n            var at = list.indexOf(opt.name);\n            if (at > -1) {\n              list.splice(at, 1);\n              if (amounts[ci]) delete amounts[ci][opt.name];\n            } else if (list.length < maxPicks(comp)) {\n              list.push(opt.name);\n            } else {\n              return;                          // at the limit \u2014 deselect one first\n            }\n            /* A new pick redistributes unless the guest has set the counts by\n               hand; then it joins at zero and the counter shows the gap. */\n            if (allocates(comp) && !allocTouched[ci]) shareOut(ci, comp);\n            else if (allocates(comp) && at === -1) (amounts[ci] || (amounts[ci] = {}))[opt.name] = 0;\n            syncStep(sec, ci, comp);\n            render();\n          });\n\n          wrap.appendChild(b);\n\n          /* Served on: bagel or croissant. The filling is the choice; this is\n             what it arrives in, so it hangs off the chosen filling rather\n             than being a step of its own. */\n          if (set.carrier) {\n            var carrier = h('div', 'pb-carrier');\n            carrier.setAttribute('role', 'group');\n            carrier.setAttribute('aria-label', set.carrier.label + ' \u2014 ' + opt.name);\n            carrier.appendChild(h('span', 'pb-carrier__label', set.carrier.label));\n\n            set.carrier.options.forEach(function (name, ix) {\n              var cb = h('button', 'pb-carrier__btn', name);\n              cb.type = 'button';\n              cb.setAttribute('data-carrier', name);\n              cb.setAttribute('aria-pressed', String(ix === 0));\n              cb.addEventListener('click', function () {\n                (carriers[ci] || (carriers[ci] = {}))[opt.name] = name;\n                Array.prototype.forEach.call(carrier.querySelectorAll('.pb-carrier__btn'), function (o) {\n                  o.setAttribute('aria-pressed', String(o === cb));\n                });\n                render();\n              });\n              carrier.appendChild(cb);\n            });\n\n            wrap.appendChild(carrier);\n          }\n\n          /* How many of this one: trays, pieces or meals, depending on what\n             the component counts. The counts have to add up to its total. */\n          if (allocates(comp)) {\n            var stepper = h('div', 'pb-qty');\n            stepper.appendChild(h('span', 'pb-qty__label', namedUnit(comp) ? 'How many ' + namedUnit(comp) : 'How many'));\n\n            var minus = h('button', 'pb-qty__btn', '\u2212');\n            minus.type = 'button';\n            minus.setAttribute('aria-label', 'One fewer ' + opt.name);\n\n            var out = h('output', 'pb-qty__value', '0');\n\n            var plus = h('button', 'pb-qty__btn', '+');\n            plus.type = 'button';\n            plus.setAttribute('aria-label', 'One more ' + opt.name);\n\n            function nudge(by) {\n              var bag = amounts[ci] || (amounts[ci] = {});\n              bag[opt.name] = Math.max(0, (bag[opt.name] || 0) + by * allocStep(comp));\n              allocTouched[ci] = true;         // stop the even split overwriting this\n              syncStep(sec, ci, comp);\n              render();\n            }\n            minus.addEventListener('click', function () { nudge(-1); });\n            plus.addEventListener('click', function () { nudge(1); });\n\n            stepper.appendChild(minus);\n            stepper.appendChild(out);\n            stepper.appendChild(plus);\n            wrap.appendChild(stepper);\n          }\n\n          grid.appendChild(wrap);\n        });\n        sec.appendChild(grid);\n        elSteps.appendChild(sec);\n        stepSections.push({ sec: sec, comp: comp, ci: ci });\n        syncStep(sec, ci, comp);\n      });\n\n      if (addonsStep) elSteps.appendChild(addonsStep);\n      if (detailsStep) elSteps.appendChild(detailsStep);\n      buildRail();\n    }\n\n    function buildAddonsStep() {\n      if (!addons.length) return;\n\n      var sec = h('section', 'pb-step');\n      sec.hidden = true;\n      var head = h('div', 'pb-step__head pb-step__head--action');\n      var copy = h('div', 'pb-step__copy');\n      copy.appendChild(h('h2', 'pb-step__title', 'Add ons'));\n      var rule = h('p', 'pb-step__rule');\n      rule.appendChild(h('b', null, 'Optional.'));\n      var hasExtras = addons.some(function (a) { return a.group === 'extras'; });\n      rule.appendChild(document.createTextNode((hasExtras ? ' Extras, shared platters and drinks' : ' Shared platters and drinks') + ', each added to your order as its own line.'));\n      copy.appendChild(rule);\n      head.appendChild(copy);\n\n      /* The add on list runs long, so Next sits beside the title as well as\n         at the foot of the step. Add ons are optional, so it is never gated. */\n      var nextTop = btnNext.cloneNode(true);\n      nextTop.removeAttribute('data-next');\n      nextTop.hidden = false;\n      nextTop.disabled = false;\n      nextTop.addEventListener('click', function () { show(step + 1); });\n      head.appendChild(nextTop);\n\n      sec.appendChild(head);\n\n      /* One collapsible group per category, in composed order. */\n      var order = [];\n      var rows = {};\n      addons.forEach(function (a, i) {\n        var g = a.group || 'extras';\n        if (!rows[g]) { rows[g] = []; order.push(g); }\n        rows[g].push(i);\n      });\n\n      order.forEach(function (g) {\n        var meta = addonGroupMeta(g);\n        var box = h('details', 'pb-addon-group');\n        box.setAttribute('data-addon-group', g);\n        box.open = meta.open;\n\n        var sum = h('summary', 'pb-addon-group__head');\n        sum.appendChild(h('span', 'pb-addon-group__name', meta.name));\n        sum.appendChild(h('span', 'pb-addon-group__note', meta.note));\n        sum.appendChild(h('span', 'pb-addon-group__count'));\n        box.appendChild(sum);\n\n        var list = h('div', 'pb-addons');\n        var idx = rows[g];\n        var k = 0;\n        while (k < idx.length) {\n          /* A run of rows sharing a subgroup is one product's variants. */\n          var run = [idx[k]];\n          var sub = addons[idx[k]].subgroup;\n          while (sub && k + run.length < idx.length && addons[idx[k + run.length]].subgroup === sub) {\n            run.push(idx[k + run.length]);\n          }\n          list.appendChild(run.length > 1 ? addonSetRow(run) : addonRow(addons[idx[k]], idx[k]));\n          k += run.length;\n        }\n        box.setAttribute('data-indices', idx.join(','));\n        box.appendChild(list);\n        sec.appendChild(box);\n      });\n\n      addonsStep = sec;\n    }\n\n    /* Extras and drinks open everywhere; a platter category opens where the\n       shared platters data lists this package as its natural home. */\n    function addonGroupMeta(g) {\n      if (g === 'extras') return { name: 'Extras', note: 'Priced per person unless noted', open: true };\n      var cats = (window.SAMMYS_ADDONS && window.SAMMYS_ADDONS.categories) || [];\n      var c = cats.filter(function (x) { return x.id === g; })[0] || {};\n      return {\n        name: c.name || g,\n        note: c.unit === 'bottle' ? 'Per bottle' : 'Per platter',\n        open: !!c.open || (c.packages || []).indexOf(slug) > -1\n      };\n    }\n\n    /* One product with several variants as a single row: pick the variant,\n       then how many. Each variant keeps its own count and its own cart line,\n       so they can be mixed. */\n    function addonSetRow(run) {\n      var first = addons[run[0]];\n      var row = h('div', 'pb-addon pb-addon--set');\n      row.setAttribute('data-addon-set', run.join(','));\n\n      var copy = h('div', 'pb-addon__copy');\n      copy.appendChild(h('span', 'pb-addon__name', first.subgroup));\n      if (first.subgroupNote) copy.appendChild(h('span', 'pb-addon__detail', first.subgroupNote));\n      row.appendChild(copy);\n\n      row.appendChild(h('span', 'pb-addon__price'));\n\n      var ctl = h('div', 'pb-addon__ctl');\n      var sel = h('select', 'pb-addon__select');\n      sel.setAttribute('aria-label', (first.variantLabel || 'Option') + ', ' + first.subgroup);\n      run.forEach(function (i) {\n        var o = h('option', null, addons[i].label || addons[i].name);\n        o.value = String(i);\n        sel.appendChild(o);\n      });\n      sel.addEventListener('change', syncAddons);\n      ctl.appendChild(sel);\n\n      var minus = h('button', 'pb-qty__btn', '\\u2212');\n      minus.type = 'button';\n      var out = h('output', 'pb-qty__value', '0');\n      var plus = h('button', 'pb-qty__btn', '+');\n      plus.type = 'button';\n      minus.addEventListener('click', function () {\n        var i = Number(sel.value);\n        addonQty[i] = Math.max(0, (addonQty[i] || 0) - 1);\n        render();\n      });\n      plus.addEventListener('click', function () {\n        var i = Number(sel.value);\n        addonQty[i] = (addonQty[i] || 0) + 1;\n        render();\n      });\n      ctl.appendChild(minus);\n      ctl.appendChild(out);\n      ctl.appendChild(plus);\n      row.appendChild(ctl);\n\n      row.appendChild(h('span', 'pb-addon__line'));\n      return row;\n    }\n\n    function addonRow(a, i) {\n      var row = h('div', 'pb-addon');\n      row.setAttribute('data-addon', String(i));\n\n      var copy = h('div', 'pb-addon__copy');\n      copy.appendChild(h('span', 'pb-addon__name', a.label || a.name));\n      if (a.detail) copy.appendChild(h('span', 'pb-addon__detail', a.detail));\n      if (a.minGuests) copy.appendChild(h('span', 'pb-addon__min', 'Minimum ' + a.minGuests + ' guests'));\n      row.appendChild(copy);\n\n      row.appendChild(h('span', 'pb-addon__price', a.priceLabel || (MONEY(a.price) + (a.per === 'person' ? ' pp' : ' per ' + a.per))));\n\n      var ctl = h('div', 'pb-addon__ctl');\n      if (!a.variantId) {\n        var link = h('a', 'pb-addon__link', a.linkLabel || 'Ask us');\n        link.href = a.link || '#enquiry';\n        ctl.appendChild(link);\n      } else if (a.per === 'person') {\n        var toggle = h('button', 'pb-addon__toggle', 'Add');\n        toggle.type = 'button';\n        toggle.setAttribute('aria-pressed', 'false');\n        toggle.setAttribute('aria-label', 'Add ' + a.name);\n        toggle.addEventListener('click', function () {\n          if (!addonAllowed(a)) return;\n          addonQty[i] = addonQty[i] ? 0 : 1;\n          render();\n        });\n        ctl.appendChild(toggle);\n      } else {\n        var minus = h('button', 'pb-qty__btn', '\\u2212');\n        minus.type = 'button';\n        minus.setAttribute('aria-label', 'One fewer ' + a.name);\n        var out = h('output', 'pb-qty__value', '0');\n        var plus = h('button', 'pb-qty__btn', '+');\n        plus.type = 'button';\n        plus.setAttribute('aria-label', 'One more ' + a.name);\n        minus.addEventListener('click', function () { addonQty[i] = Math.max(0, (addonQty[i] || 0) - 1); render(); });\n        plus.addEventListener('click', function () { addonQty[i] = (addonQty[i] || 0) + 1; render(); });\n        ctl.appendChild(minus);\n        ctl.appendChild(out);\n        ctl.appendChild(plus);\n      }\n      row.appendChild(ctl);\n      row.appendChild(h('span', 'pb-addon__line'));\n      return row;\n    }\n\n    function syncAddons() {\n      if (!addonsStep) return;\n      Array.prototype.forEach.call(addonsStep.querySelectorAll('[data-addon]'), function (row) {\n        var i = Number(row.getAttribute('data-addon'));\n        var a = addons[i];\n        var allowed = addonAllowed(a);\n        var units = addonUnits(a, i);\n        row.hidden = addonIncluded(a);\n        row.classList.toggle('is-on', units > 0);\n        row.classList.toggle('is-unavailable', !allowed);\n\n        var toggle = row.querySelector('.pb-addon__toggle');\n        if (toggle) {\n          toggle.setAttribute('aria-pressed', String(units > 0));\n          toggle.textContent = units > 0 ? 'Added' : 'Add';\n          toggle.disabled = !allowed;\n        }\n        var out = row.querySelector('.pb-qty__value');\n        if (out) out.value = addonQty[i] || 0;\n\n        var what = a.per === 'person'\n          ? units + ' guests'\n          : units + ' ' + (units === 1 ? a.per : a.per + 's');\n        var line = row.querySelector('.pb-addon__line');\n        line.textContent = units > 0\n          ? MONEY(a.price * units) + ' for ' + what\n          : (!allowed && a.minGuests ? 'Needs ' + a.minGuests + ' guests or more' : '');\n      });\n\n      Array.prototype.forEach.call(addonsStep.querySelectorAll('[data-addon-set]'), function (row) {\n        var run = row.getAttribute('data-addon-set').split(',').map(Number);\n        var sel = row.querySelector('.pb-addon__select');\n        var cur = addons[Number(sel.value)];\n        var curQty = addonQty[Number(sel.value)] || 0;\n\n        /* Price and stepper follow the selected variant. */\n        row.querySelector('.pb-addon__price').textContent = MONEY(cur.price) + ' per ' + cur.per;\n        row.querySelector('.pb-qty__value').value = curQty;\n        var btns = row.querySelectorAll('.pb-qty__btn');\n        btns[0].setAttribute('aria-label', 'One fewer ' + cur.name);\n        btns[1].setAttribute('aria-label', 'One more ' + cur.name);\n\n        /* The dropdown shows each variant's count, so nothing added is hidden. */\n        Array.prototype.forEach.call(sel.options, function (o) {\n          var j = Number(o.value);\n          var base = addons[j].label || addons[j].name;\n          o.textContent = addonQty[j] ? base + ' (' + addonQty[j] + ')' : base;\n        });\n\n        var picked = run.filter(function (j) { return addonUnits(addons[j], j) > 0; });\n        var units = picked.reduce(function (t, j) { return t + addonUnits(addons[j], j); }, 0);\n        var cost = picked.reduce(function (t, j) { return t + addons[j].price * addonUnits(addons[j], j); }, 0);\n        row.classList.toggle('is-on', units > 0);\n        row.querySelector('.pb-addon__line').textContent = units > 0\n          ? picked.map(function (j) { return (addons[j].label || addons[j].name) + ' \\u00d7 ' + addonUnits(addons[j], j); }).join(' \\u00b7 ')\n            + '  \\u2014  ' + MONEY(cost) + ' for ' + units + ' ' + (units === 1 ? cur.per : cur.per + 's')\n          : '';\n      });\n\n      /* A collapsed group still says something inside it was picked. Counted\n         by index, since one combined row can hold several picks. */\n      Array.prototype.forEach.call(addonsStep.querySelectorAll('[data-addon-group]'), function (box) {\n        var n = (box.getAttribute('data-indices') || '').split(',').filter(Boolean).map(Number)\n          .filter(function (i) { return addonUnits(addons[i], i) > 0; }).length;\n        box.querySelector('.pb-addon-group__count').textContent = n ? n + ' added' : '';\n        box.classList.toggle('has-picks', n > 0);\n      });\n    }\n\n    function syncStep(sec, ci, comp) {\n      var list = picks[ci] || [];\n      var least = minPicks(comp);\n      var most = maxPicks(comp);\n      var full = list.length >= most;\n      var over = list.length > most;\n      var bag = amounts[ci] || {};\n\n      Array.prototype.forEach.call(sec.querySelectorAll('.pb-option'), function (wrap) {\n        var b = wrap.querySelector('.pb-choice');\n        var name = b.querySelector('.pb-choice__name').textContent;\n        var on = list.indexOf(name) > -1;\n\n        b.setAttribute('aria-pressed', String(on));\n        b.classList.toggle('is-locked', full && !on);\n\n        /* The extra controls only mean anything once the item is in. */\n        var carrier = wrap.querySelector('.pb-carrier');\n        if (carrier) {\n          carrier.hidden = !on;\n          var chosen = carrierFor(ci, name, comp);\n          Array.prototype.forEach.call(carrier.querySelectorAll('.pb-carrier__btn'), function (o) {\n            o.setAttribute('aria-pressed', String(o.getAttribute('data-carrier') === chosen));\n          });\n        }\n\n        var qty = wrap.querySelector('.pb-qty');\n        if (qty) {\n          qty.hidden = !on;\n          qty.querySelector('.pb-qty__value').value = bag[name] || 0;\n        }\n      });\n\n      var c = sec.querySelector('.pb-step__counter');\n      var enough = list.length >= least && !over;\n      var k = list.length;\n      var label = least >= most\n        ? k + ' of ' + least + ' picked'\n        : (k < least ? k + ' picked, need at least ' + least : k + ' picked, up to ' + most);\n\n      /* Dropping the headcount can leave more picks than it now allows. They\n         are kept rather than silently removed; the step says what to drop. */\n      if (over) label = k + ' picked, ' + most + ' max for ' + guestCount() + ' guests. Remove ' + (k - most);\n\n      if (allocates(comp)) {\n        var target = allocTarget(comp);\n        var got = allocTotal(ci);\n        var unit = namedUnit(comp) || 'meals';\n        if (!over) label += '  \\u00b7  ' + got + ' of ' + target + (unit ? ' ' + unit : '') + ' assigned';\n        c.classList.toggle('is-done', enough && got === target);\n        var rb = sec.querySelector('.pb-rebalance');\n        if (rb) rb.hidden = !list.length || got === target;\n      } else {\n        c.classList.toggle('is-done', enough);\n      }\n      c.classList.toggle('is-over', over);\n\n      c.textContent = label;\n    }\n\n    /* Which carrier this filling arrives on, falling back to the first the\n       data offers so an untouched pick still serialises to something real. */\n    function carrierFor(ci, name, comp) {\n      var set = P.sets[comp.set];\n      if (!set || !set.carrier) return '';\n      return (carriers[ci] || {})[name] || set.carrier.options[0];\n    }\n\n    /* One chosen item as it should read anywhere it is listed back. */\n    function pickLabel(ci, name, comp) {\n      var out = name;\n      var carrier = carrierFor(ci, name, comp);\n      if (carrier) out += ' \u2014 on a ' + carrier.toLowerCase();\n      if (comp && allocates(comp)) out = ((amounts[ci] || {})[name] || 0) + ' \u00D7 ' + out;\n      return out;\n    }\n\n    /* ---- rail ----------------------------------------------------------- */\n\n    function buildRail() {\n      var labels = [];\n      if (hasLead()) labels.push(P.lead.name);\n      labels.push('Your tier');\n      choosers().forEach(function (c) { labels.push(c.name); });\n      if (addonsStep && tier) labels.push('Add ons');\n      labels.push('Your details');\n\n      elRail.innerHTML = '';\n      elRail.style.gridTemplateColumns = 'repeat(' + labels.length + ', minmax(0, 1fr))';\n\n      labels.forEach(function (label, i) {\n        var b = h('button', 'pb-rail__item');\n        b.type = 'button';\n        b.appendChild(h('span', 'pb-rail__n', ('0' + (i + 1)).slice(-2)));\n        b.appendChild(h('span', 'pb-rail__label', label));\n        b.disabled = i > leadOffset() && !tier;\n        b.addEventListener('click', function () { if (!b.disabled) show(i); });\n        elRail.appendChild(b);\n      });\n    }\n\n    /* ---- navigation ----------------------------------------------------- */\n\n    function show(i) {\n      step = Math.max(0, Math.min(i, stepCount() - 1));\n\n      Array.prototype.forEach.call(elSteps.children, function (s, n) { s.hidden = n !== step; });\n      Array.prototype.forEach.call(elRail.children, function (r, n) {\n        r.classList.toggle('is-done', n < step);\n        if (n === step) r.setAttribute('aria-current', 'step');\n        else r.removeAttribute('aria-current');\n      });\n\n      btnBack.disabled = step === 0;\n      btnNext.hidden = step === stepCount() - 1;\n      elCount.textContent = 'Step ' + (step + 1) + ' of ' + stepCount();\n      gateNext();\n\n      var main = q('[data-builder-main]');\n      if (main) main.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    }\n\n    /* Next stays shut until the current step's choose-rule is satisfied. */\n    function gateNext() {\n      if (hasLead() && step === 0) { btnNext.disabled = !leadPick; return; }\n      if (step === leadOffset()) { btnNext.disabled = !tier; return; }\n      var cs = choosers();\n      var ci = step - leadOffset() - 1;\n      if (ci < 0 || ci >= cs.length) { btnNext.disabled = false; return; }\n      var comp = cs[ci];\n      var n = (picks[ci] || []).length;\n      var short = n < minPicks(comp) || n > maxPicks(comp);\n      if (!short && allocates(comp)) short = allocTotal(ci) !== allocTarget(comp);\n      btnNext.disabled = short;\n    }\n\n    btnBack.addEventListener('click', function () { show(step - 1); });\n    btnNext.addEventListener('click', function () { show(step + 1); });\n\n    /* ---- styling question ----------------------------------------------\n       Shown on the details step when the package declares it. Yes adds the\n       set up and pack down fees as separate cart lines, so they can be\n       removed at the cart without unpicking the order.\n       --------------------------------------------------------------------- */\n    var wantsStyling = false;\n\n    function buildStylingQuestion() {\n      if (!P.styling || !detailsStep) return;\n\n      var wrap = h('div', 'pb-styling');\n      wrap.appendChild(h('p', 'pb-styling__q', P.styling.question));\n      if (P.styling.note) wrap.appendChild(h('p', 'pb-styling__note', P.styling.note));\n\n      var opts = h('div', 'pb-styling__opts');\n      opts.setAttribute('role', 'group');\n      opts.setAttribute('aria-label', P.styling.question);\n\n      [\n        ['Yes, style it', true],\n        ['No thanks', false]\n      ].forEach(function (pair, i) {\n        var b = h('button', 'pb-styling__btn', pair[0]);\n        b.type = 'button';\n        b.setAttribute('aria-pressed', String(i === 1));\n        b.addEventListener('click', function () {\n          wantsStyling = pair[1];\n          Array.prototype.forEach.call(opts.children, function (o) {\n            o.setAttribute('aria-pressed', String(o === b));\n          });\n          render();\n        });\n        opts.appendChild(b);\n      });\n\n      wrap.appendChild(opts);\n      detailsStep.insertBefore(wrap, detailsStep.firstChild);\n    }\n\n    function stylingCost() {\n      if (!P.styling || !wantsStyling) return 0;\n      return (P.styling.setup || 0) + (P.styling.packdown || 0);\n    }\n\n    /* Everything that will be in the cart: the package, its fees and extras.\n       The minimum order is measured against this, as the cart guard does. */\n    function orderTotal() {\n      var pp = tier ? tier.price : 0;\n      return pp * billedUnits() + stylingCost() + addonsCost() + serviceCost();\n    }\n\n    function belowMinimum(total, floor) {\n      return 'Minimum order is ' + MONEY(floor) + '. Add ' + MONEY(floor - total) + ' more to check out.';\n    }\n\n    /* ---- lead step ------------------------------------------------------ */\n\n    function buildLeadStep() {\n      if (!hasLead()) return;\n\n      var set = P.sets[P.lead.set];\n      var sec = h('section', 'pb-step');\n\n      var head = h('div', 'pb-step__head');\n      head.appendChild(h('h2', 'pb-step__title', P.lead.name));\n      var rule = h('p', 'pb-step__rule');\n      rule.appendChild(h('b', null, P.lead.rule || ('Choose 1 from ' + set.title)));\n      head.appendChild(rule);\n      if (P.lead.note) head.appendChild(h('p', 'pb-step__note', P.lead.note));\n      sec.appendChild(head);\n\n      var grid = h('div', 'pb-choices pb-choices--lead');\n      set.options.forEach(function (opt) {\n        var b = h('button', 'pb-choice pb-choice--lead');\n        b.type = 'button';\n        b.setAttribute('aria-pressed', 'false');\n        b.appendChild(checkMark());\n        b.appendChild(h('span', 'pb-choice__name', opt.name));\n        if (opt.sub) b.appendChild(h('span', 'pb-choice__sub', opt.sub));\n\n        b.addEventListener('click', function () {\n          if (leadPick === opt.name) return;\n          leadPick = opt.name;\n\n          Array.prototype.forEach.call(grid.children, function (o) {\n            o.setAttribute('aria-pressed', String(o === b));\n          });\n\n          /* Anything that excluded the previous pick must be rebuilt, and any\n             choice of it dropped, or the guest keeps a now-invalid option. */\n          choosers().forEach(function (comp, ci) {\n            if (comp.excludeLead) picks[ci] = [];\n          });\n          if (tier) buildSteps();\n          render();\n        });\n\n        grid.appendChild(b);\n      });\n\n      sec.appendChild(grid);\n      elSteps.insertBefore(sec, elSteps.firstElementChild);\n    }\n\n    /* ---- tier step ------------------------------------------------------ */\n\n    function buildTierStep() {\n      P.tiers.forEach(function (t) {\n        var b = h('button', 'pb-choice pb-choice--tier');\n        b.type = 'button';\n        b.setAttribute('aria-pressed', 'false');\n        b.appendChild(checkMark());\n        b.appendChild(h('span', 'pb-choice__name', t.name));\n        b.appendChild(h('span', 'pb-choice__tier-tag', t.tag));\n        b.appendChild(h('span', 'pb-choice__desc', t.includes));\n        /* Grazing tables are sold by the table, not the head, so the unit has\n           to follow the package rather than be assumed. */\n        var perTable = P.priceUnit === 'table';\n        var price = h('span', 'pb-choice__price', (perTable ? 'from ' : '') + MONEY(t.price));\n        price.appendChild(h('small', null, perTable ? 'PER TABLE' : 'PER PERSON'));\n        b.appendChild(price);\n\n        b.addEventListener('click', function () {\n          if (tier && tier.id !== t.id) {             // choose-counts differ per tier\n            picks = {}; carriers = {}; amounts = {}; allocTouched = {};\n          }\n          tier = t;\n          Array.prototype.forEach.call(elTierGrid.children, function (o) {\n            o.setAttribute('aria-pressed', String(o === b));\n          });\n          buildSteps();\n          /* Stay on the tier step. With a lead step in front, index 0 is the\n             station, so choosing a tier would bounce the guest backwards. */\n          show(leadOffset());\n          render();\n        });\n\n        elTierGrid.appendChild(b);\n      });\n    }\n\n    /* ---- summary -------------------------------------------------------- */\n\n    function standardItems() {\n      return tier ? tier.components.filter(function (c) { return c.name && !c.set; }) : [];\n    }\n\n    /* Each step's rule line says what the ratio works out to at the current\n       headcount, e.g. \"1 tray per 15 guests\" becomes \"4 trays for 50 guests\". */\n    function refreshQuantities(guests) {\n      stepSections.forEach(function (entry) {\n        var limit = entry.sec.querySelector('.pb-step__limit');\n        if (limit) limit.textContent = ruleText(entry.comp, P.sets[entry.comp.set]);\n        var slot = entry.sec.querySelector('.pb-step__scaled');\n        if (!slot) return;\n        slot.textContent = amountText(entry.comp);\n      });\n    }\n\n    function render() {\n      var pp = tier ? tier.price : 0;\n      var guests = Math.max(0, Number(elGuests.value) || 0);\n      var perTable = P.priceUnit === 'table';\n\n      /* The headcount drives the per-item counts, so an untouched split has to\n         follow it. One the guest has set by hand is left alone. The choice\n         limits move with the headcount too, so every step is re-synced. */\n      choosers().forEach(function (comp, ci) {\n        if (allocates(comp) && !allocTouched[ci] && allocTotal(ci) !== allocTarget(comp)) shareOut(ci, comp);\n        var entry = stepSections[ci];\n        if (entry) syncStep(entry.sec, ci, comp);\n      });\n      syncAddons();\n\n      if (elLead && hasLead()) {\n        elLeadRow.hidden = false;\n        elLead.textContent = leadPick || 'Not chosen yet';\n      } else if (elLeadRow) {\n        elLeadRow.hidden = true;\n      }\n\n      elTier.textContent = tier ? tier.name + ' \u2014 ' + tier.tag : 'Not chosen yet';\n      elPP.textContent = tier\n        ? (perTable ? 'from ' + MONEY(pp) + ' per table' : '$' + pp + ' pp')\n        : '\\u2014';\n\n      if (elTablesRow) {\n        var showTables = perTable && tier && guests;\n        elTablesRow.hidden = !showTables;\n        if (showTables) {\n          var t = tableCount();\n          elTables.textContent = t + (t === 1 ? ' table' : ' tables') + ' for ' + guests + ' guests';\n        }\n      }\n\n      elPicks.innerHTML = '';\n\n      if (!tier) {\n        elPicks.appendChild(h('p', 'pb-summary__cat', 'Choose a tier to begin'));\n      } else {\n        /* Walk the tier's own components in the order the client wrote them,\n           group headings and all. The box then describes the whole package \u2014\n           including what a higher tier inherits from the one below \u2014 instead\n           of only the parts still left to choose. */\n        var cs = choosers();\n        var std = null;\n\n        function flushStandard() { std = null; }\n\n        function standardLine(comp, scaled) {\n          if (!std) {\n            std = h('ul', 'pb-summary__list');\n            elPicks.appendChild(std);\n          }\n          var text = comp.qty ? comp.name + ' \u00B7 ' + comp.qty : comp.name;\n          var li = h('li', 'pb-summary__std', text);\n          std.appendChild(li);\n        }\n\n        tier.components.forEach(function (comp) {\n          if (comp.group) {\n            flushStandard();\n            elPicks.appendChild(h('p', 'pb-summary__group', comp.group));\n            return;\n          }\n          if (!comp.name) return;\n\n          var scaled = scaleQty(comp.qty, guests);\n\n          if (!comp.set) { standardLine(comp, scaled); return; }\n\n          flushStandard();\n          var ci = cs.indexOf(comp);\n          var chosen = picks[ci] || [];\n\n          var head = h('p', 'pb-summary__cat', comp.name);\n          var need = h('span', 'pb-summary__need', chosen.length + '/' + minPicks(comp));\n          if (chosen.length >= minPicks(comp) && chosen.length <= maxPicks(comp)) need.classList.add('is-done');\n          head.appendChild(need);\n          elPicks.appendChild(head);\n\n\n          var ul = h('ul', 'pb-summary__list');\n          if (!chosen.length) ul.appendChild(h('li', 'pb-summary__empty', 'Nothing chosen yet'));\n          else chosen.forEach(function (n) { ul.appendChild(h('li', null, pickLabel(ci, n, comp))); });\n          elPicks.appendChild(ul);\n        });\n\n        var extras = chosenAddons();\n        if (extras.length) {\n          elPicks.appendChild(h('p', 'pb-summary__group', 'Add ons'));\n          var ulx = h('ul', 'pb-summary__list');\n          extras.forEach(function (x) {\n            ulx.appendChild(h('li', null, x.a.name + ' \\u00b7 ' + MONEY(x.a.price * x.units)));\n          });\n          elPicks.appendChild(ulx);\n        }\n      }\n\n      if (service) {\n        elPicks.appendChild(h('p', 'pb-summary__group', service.name));\n        var uls = h('ul', 'pb-summary__list');\n        service.fees.forEach(function (f) { uls.appendChild(h('li', null, f.name + ' \\u00b7 ' + MONEY(f.price))); });\n        elPicks.appendChild(uls);\n      }\n\n      refreshQuantities(guests);\n\n      if (elStylingRow) {\n        elStylingRow.hidden = !(P.styling && wantsStyling);\n        if (P.styling && wantsStyling) {\n          elStyling.textContent = MONEY(stylingCost()) + ' \\u2014 set up and pack down';\n        }\n      }\n\n      var total = orderTotal();\n      elTotal.textContent = total ? MONEY(total) : '$0';\n\n      var problem = '';\n      var floor = minOrder();\n      if (!perTable && guests && guests < P.minGuests) problem = 'Minimum ' + P.minGuests + ' guests for this package.';\n      else if (tier && floor && total < floor) problem = belowMinimum(total, floor);\n      elWarn.hidden = !problem;\n      elWarn.textContent = problem;\n\n      syncMobileBar(guests, total);\n      syncCheckoutState(guests);\n      gateNext();\n      writeOrder(guests, total, perTable);\n    }\n\n    /* ---- order serialisation (what lands in the enquiry email) ---------- */\n\n    function writeOrder(guests, total, perTable) {\n      if (!elOrderField) return;\n\n      var lines = [];\n      lines.push('PACKAGE: ' + P.name);\n      if (hasLead()) lines.push(P.lead.name.toUpperCase() + ': ' + (leadPick || 'not chosen'));\n      lines.push('TIER: ' + (tier ? tier.name + ' \u2014 ' + tier.tag : 'not chosen'));\n      lines.push('PER PERSON: ' + (tier ? (perTable ? MONEY(tier.price) + ' per table' : '$' + tier.price + ' pp') : '\u2014'));\n      lines.push('GUESTS: ' + (guests || '\\u2014'));\n      if (perTable) lines.push('TABLES: ' + tableCount());\n      if (P.styling) lines.push('STYLING & SET UP: ' + (wantsStyling ? 'yes, ' + MONEY(stylingCost()) : 'no'));\n      if (service) lines.push('SERVICE: ' + service.name + ', ' + service.fees.map(function (f) { return f.name.toLowerCase() + ' ' + MONEY(f.price); }).join(', '));\n      chosenAddons().forEach(function (x) { lines.push('ADD ON: ' + x.a.name + ', ' + MONEY(x.a.price * x.units)); });\n      lines.push('ESTIMATED TOTAL: ' + (total ? MONEY(total) : '$0') + ' (indicative)');\n\n      if (tier) {\n        choosers().forEach(function (comp, ci) {\n          var list = picks[ci] || [];\n          lines.push('');\n          lines.push(comp.name.toUpperCase() + ' (' + list.length + ' chosen)');\n          if (!list.length) lines.push('  - nothing chosen');\n          else list.forEach(function (n) { lines.push('  - ' + pickLabel(ci, n, comp)); });\n        });\n\n        var standard = standardItems();\n        if (standard.length) {\n          lines.push('');\n          lines.push('INCLUDED AS STANDARD');\n          standard.forEach(function (c) {\n            lines.push('  - ' + (c.qty ? c.name + ' \u00B7 ' + c.qty : c.name));\n          });\n        }\n      }\n\n      elOrderField.value = lines.join('\\n');\n\n      if (elSubject) {\n        elSubject.value = 'Package enquiry \u2014 ' + P.name\n          + (tier ? ' (' + tier.name + ')' : '')\n          + (guests ? ' \u2014 ' + guests + ' guests' : '');\n      }\n    }\n\n    /* ---- guest count ----------------------------------------------------\n       The markup ships min=\"1\" because the section cannot know the package's\n       own floor; the data does, so bind it here. Typing is left alone while\n       it is in progress \u2014 clamping mid-keystroke fights the user \u2014 and the\n       value is raised to the minimum once they commit to it.\n       --------------------------------------------------------------------- */\n    if (P.minGuests) {\n      elGuests.min = P.minGuests;\n      if ((Number(elGuests.value) || 0) < P.minGuests) elGuests.value = P.minGuests;\n\n      elGuests.addEventListener('change', function () {\n        var n = Number(elGuests.value) || 0;\n        if (n < P.minGuests) {\n          elGuests.value = P.minGuests;\n          render();\n        }\n      });\n    }\n\n    elGuests.addEventListener('input', render);\n\n    /* A mirrored control in the mobile dock, so the headcount stays on screen\n       while you work down the option lists. */\n    var elGuestsMobile = q('[data-guests-mobile]');\n    if (elGuestsMobile) {\n      if (P.minGuests) elGuestsMobile.min = P.minGuests;\n      elGuestsMobile.value = elGuests.value;\n\n      elGuestsMobile.addEventListener('input', function () {\n        elGuests.value = elGuestsMobile.value;\n        render();\n      });\n      elGuestsMobile.addEventListener('change', function () {\n        if (P.minGuests && (Number(elGuestsMobile.value) || 0) < P.minGuests) {\n          elGuestsMobile.value = P.minGuests;\n        }\n        elGuests.value = elGuestsMobile.value;\n        render();\n      });\n    }\n\n    /* ---- checkout -------------------------------------------------------\n\n       The tier is a real variant priced per person, so quantity is the guest\n       count and Shopify totals it. Everything the guest chose rides along as\n       line item properties, which is what prints on the order.\n       --------------------------------------------------------------------- */\n\n    var elCheckout = q('[data-checkout-submit]');\n    var elCheckoutErr = q('[data-checkout-error]');\n    var elCheckoutLabel = q('[data-checkout-label]');\n\n    /* ---- delivery date --------------------------------------------------\n\n       Next-day orders close at the cutoff hour (10am unless the section says\n       otherwise), measured in Sydney time whatever the visitor's device is\n       set to. Before the cutoff the earliest date is tomorrow; from the\n       cutoff on it is the day after. Bloom applies the same rule on the cart\n       page, which is where this sends people next.\n       --------------------------------------------------------------------- */\n\n    var elDate = q('[data-co-date]');\n    var cutoffHour = elDate ? parseInt(elDate.getAttribute('data-cutoff-hour'), 10) : NaN;\n    if (isNaN(cutoffHour)) cutoffHour = 10;\n    var storeTimezone = (elDate && elDate.getAttribute('data-timezone')) || 'Australia/Sydney';\n\n    /* Days we are fully booked, as YYYY-MM-DD. The date field cannot grey\n       out single days, so a closed date is refused with a message instead.\n       Keep in step with the blocked dates in Bloom on the cart page. */\n    var closedDates = ['2026-10-17'];\n\n    /* The earliest date that can still be ordered, as YYYY-MM-DD. */\n    function earliestDate() {\n      var now = {};\n      new Intl.DateTimeFormat('en-AU', {\n        timeZone: storeTimezone,\n        year: 'numeric', month: '2-digit', day: '2-digit',\n        hour: '2-digit', hourCycle: 'h23'\n      }).formatToParts(new Date()).forEach(function (p) { now[p.type] = p.value; });\n\n      var lead = Number(now.hour) >= cutoffHour ? 2 : 1;\n      var d = new Date(Date.UTC(Number(now.year), Number(now.month) - 1, Number(now.day) + lead));\n      return d.toISOString().slice(0, 10);\n    }\n\n    function prettyDate(iso) {\n      return new Date(iso + 'T00:00:00Z').toLocaleDateString('en-AU', {\n        timeZone: 'UTC', weekday: 'long', day: 'numeric', month: 'long'\n      });\n    }\n\n    function cutoffLabel() {\n      var h = cutoffHour % 12 || 12;\n      return h + (cutoffHour < 12 ? 'am' : 'pm');\n    }\n\n    /* The browser's own date field cannot switch off single days, so where\n       flatpickr has loaded it takes the field over: days before the cutoff\n       and the closed dates show greyed out and cannot be clicked. Without it\n       the plain date field stays, and checkoutProblem still refuses both. */\n    var picker = null;\n\n    /* Re-read the clock whenever the date is touched, so a page left open\n       past the cutoff stops offering tomorrow. */\n    function syncDateMin() {\n      if (!elDate) return;\n      elDate.min = earliestDate();\n      if (picker) picker.set('minDate', elDate.min);\n    }\n\n    if (elDate && window.flatpickr) {\n      picker = window.flatpickr(elDate, {\n        dateFormat: 'Y-m-d',\n        altInput: true,\n        altFormat: 'd/m/Y',\n        altInputClass: 'sfield__input pb-date',\n        disableMobile: true,\n        minDate: earliestDate(),\n        disable: closedDates,\n        locale: { firstDayOfWeek: 1 },\n        onOpen: syncDateMin,\n        onReady: function (selected, str, fp) {\n          /* The label points at the field's id, so hand it to the visible one. */\n          var id = elDate.id;\n          if (id) { elDate.removeAttribute('id'); fp.altInput.id = id; }\n          fp.altInput.placeholder = 'dd/mm/yyyy';\n          /* The calendar is appended to body, outside the section, so it\n             takes the section's accent colour with it. */\n          fp.calendarContainer.classList.add('pb-cal');\n          var red = getComputedStyle(root).getPropertyValue('--pb-red').trim();\n          if (red) fp.calendarContainer.style.setProperty('--pb-red', red);\n        }\n      });\n    }\n\n    if (elDate) {\n      syncDateMin();\n      elDate.addEventListener('focus', syncDateMin);\n      elDate.addEventListener('click', syncDateMin);\n      elDate.addEventListener('change', render);\n    }\n\n    function checkoutProblem(guests) {\n      if (hasLead() && !leadPick) return 'Choose your ' + P.lead.name.toLowerCase() + ' first.';\n      if (!tier) return 'Choose a tier first.';\n      if (!tier.variantId) return 'This tier is not available to order online yet.';\n\n      var missing = choosers().filter(function (comp, ci) {\n        return (picks[ci] || []).length < minPicks(comp);\n      });\n      if (missing.length) {\n        return 'Still to choose: ' + missing.map(function (c) { return c.name; }).join(', ') + '.';\n      }\n\n      var over = choosers().filter(function (comp, ci) {\n        return (picks[ci] || []).length > maxPicks(comp);\n      });\n      if (over.length) {\n        return 'Too many choices for ' + guests + ' guests: ' + over.map(function (c) { return c.name; }).join(', ') + '.';\n      }\n\n      var unallocated = choosers().filter(function (comp, ci) {\n        return allocates(comp) && allocTotal(ci) !== allocTarget(comp);\n      });\n      if (unallocated.length) {\n        return 'Set how many of each: ' + unallocated.map(function (c) { return c.name; }).join(', ') + '.';\n      }\n\n      if (!guests) return 'Enter how many guests.';\n      if (guests < P.minGuests) return 'Minimum ' + P.minGuests + ' guests for this package.';\n\n      var total = orderTotal();\n      if (total < minOrder()) return belowMinimum(total, minOrder());\n\n      var date = q('[data-co-date]');\n      if (date && !date.value) return 'Pick the date you need it.';\n      if (date && date.value < earliestDate()) {\n        syncDateMin();\n        return 'Orders close at ' + cutoffLabel() + ' the day before. The earliest date available now is '\n          + prettyDate(earliestDate()) + '.';\n      }\n      if (date && closedDates.indexOf(date.value) !== -1) {\n        return 'We are fully booked on ' + prettyDate(date.value) + '. Please choose another date.';\n      }\n\n      return '';\n    }\n\n    function lineProperties() {\n      var props = {};\n      if (hasLead() && leadPick) props[P.lead.name] = leadPick;\n\n      /* Underscored properties are hidden from the customer but readable\n         from /cart.js. That is how the cart enforces each package minimum\n         without depending on product tags, which do not exist yet. */\n      if (minOrder()) props['_minimum_order'] = String(minOrder());\n      if (service) props['Service'] = service.name;\n\n      choosers().forEach(function (comp, ci) {\n        var list = picks[ci] || [];\n        if (list.length) {\n          props[comp.name] = list.map(function (n) { return pickLabel(ci, n, comp); }).join(', ');\n        }\n      });\n\n      var standard = standardItems();\n      if (standard.length) {\n        props['Included as standard'] = standard\n          .map(function (c) { return c.qty ? c.name + ' \u00B7 ' + c.qty : c.name; })\n          .join(', ');\n      }\n\n      var date = q('[data-co-date]');\n      var company = q('[data-co-company]');\n      var notes = q('[data-co-notes]');\n      if (date && date.value) props['Date needed'] = date.value;\n      if (company && company.value.trim()) props['Company'] = company.value.trim();\n      if (notes && notes.value.trim()) props['Notes'] = notes.value.trim();\n\n      return props;\n    }\n\n    /* The package line, plus fee lines for styling or a service, plus one\n       line per add on. Every extra line carries the floor too, so dropping\n       the package line at the cart cannot sneak the rest under it. */\n    function cartItems() {\n      var items = [{ id: tier.variantId, quantity: billedUnits(), properties: lineProperties() }];\n      var floor = String(minOrder() || 0);\n\n      if (P.styling && wantsStyling) {\n        if (P.styling.setupVariantId) {\n          items.push({ id: P.styling.setupVariantId, quantity: 1, properties: { 'For': P.name, '_minimum_order': floor } });\n        }\n        if (P.styling.packdownVariantId) {\n          items.push({ id: P.styling.packdownVariantId, quantity: 1, properties: { 'For': P.name, '_minimum_order': floor } });\n        }\n      }\n\n      if (service) {\n        service.fees.forEach(function (f) {\n          if (f.variantId) items.push({ id: f.variantId, quantity: 1, properties: { 'For': P.name + ', ' + service.name, '_minimum_order': floor } });\n        });\n      }\n\n      chosenAddons().forEach(function (x) {\n        items.push({ id: x.a.variantId, quantity: x.units, properties: { 'For': P.name, '_minimum_order': floor } });\n      });\n\n      return items;\n    }\n\n    function showCheckoutError(message) {\n      if (!elCheckoutErr) return;\n      elCheckoutErr.hidden = !message;\n      elCheckoutErr.textContent = message;\n    }\n\n    /* The order used to be refused only once you pressed the button. Showing\n       the blocker as it happens is what actually stops an under-minimum\n       order being built up in the first place. */\n    function syncCheckoutState(guests) {\n      if (!elCheckout) return;\n      var problem = checkoutProblem(guests);\n      elCheckout.classList.toggle('is-blocked', !!problem);\n      elCheckout.setAttribute('aria-disabled', String(!!problem));\n      showCheckoutError(problem);\n    }\n\n    function syncMobileBar(guests, total) {\n      if (elGuestsMobile && document.activeElement !== elGuestsMobile) {\n        elGuestsMobile.value = elGuests.value;\n      }\n      var mt = q('[data-total-mobile]');\n      if (mt) mt.textContent = total ? MONEY(total) : '$0';\n    }\n\n    if (elCheckout) {\n      elCheckout.addEventListener('click', function () {\n        var guests = Math.max(0, Number(elGuests.value) || 0);\n        var problem = checkoutProblem(guests);\n\n        if (problem) {\n          showCheckoutError(problem);\n          return;\n        }\n        showCheckoutError('');\n\n        var original = elCheckoutLabel ? elCheckoutLabel.textContent : '';\n        elCheckout.disabled = true;\n        if (elCheckoutLabel) elCheckoutLabel.textContent = 'Adding\u2026';\n\n        fetch('/cart/add.js', {\n          method: 'POST',\n          headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n          body: JSON.stringify({\n            items: cartItems()\n          })\n        })\n          .then(function (res) {\n            return res.json().then(function (body) {\n              if (!res.ok) throw new Error(body.description || body.message || 'Could not add that to the cart.');\n              return body;\n            });\n          })\n          /* The cart page, not checkout: Bloom there takes the delivery\n             method and slot, and its cut-off and delivery charge apply. */\n          .then(function () { window.location.href = '/cart'; })\n          .catch(function (err) {\n            elCheckout.disabled = false;\n            if (elCheckoutLabel) elCheckoutLabel.textContent = original;\n            showCheckoutError(err.message + ' Please try again, or call us and we will take the order.');\n          });\n      });\n    }\n\n    /* Keep the serialised order current for the enquiry form, where a theme\n       still renders one alongside the builder. */\n    if (form) {\n      form.addEventListener('submit', function () {\n        var guests = Math.max(0, Number(elGuests.value) || 0);\n        var perTable = P.priceUnit === 'table';\n        writeOrder(guests, orderTotal(), perTable);\n      });\n    }\n\n    /* Say up front what the service adds, and point the back link at the\n       page the guest came from rather than the plain drop off menu. */\n    function buildServiceNotice() {\n      if (!service) return;\n      var main = q('[data-builder-main]');\n      if (main && service.note) main.insertBefore(h('p', 'pb-service', service.note), main.firstChild);\n      var back = q('.pb-hero__back');\n      if (back && service.backLink) {\n        back.href = service.backLink;\n        var label = Array.prototype.filter.call(back.childNodes, function (n) { return n.nodeType === 3 && n.textContent.trim(); })[0];\n        if (label && service.backLabel) label.textContent = ' ' + service.backLabel + ' ';\n      }\n    }\n\n    buildServiceNotice();\n    buildAddonsStep();\n    buildLeadStep();\n    buildStylingQuestion();\n    buildTierStep();\n    buildRail();\n    show(0);\n    render();\n  }\n\n  function init(scope) {\n    (scope || document).querySelectorAll('[data-package-builder]').forEach(function (el) {\n      if (el.dataset.builderReady === 'true') return;\n      el.dataset.builderReady = 'true';\n      Builder(el);\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', function () { init(document); });\n  } else {\n    init(document);\n  }\n\n  document.addEventListener('shopify:section:load', function (e) {\n    e.target.querySelectorAll('[data-package-builder]').forEach(function (el) {\n      el.dataset.builderReady = '';\n    });\n    init(e.target);\n  });\n})();\n"],
  "mappings": "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",
  "names": ["h"]
}
