{"product_id":"patriotic-pick-any-3-kap-baks","title":"Patriotic Pick Any 3 Kap-Baks - Choose Colors","description":"\u003c!-- KB_VARIANT_BUNDLE_PICKER_START --\u003e\n\u003cstyle\u003e\n.product__info-container:has(#kbv-patriotic-pick-any-3-kap-baks) .product-form__quantity,\n.product__info-container:has(#kbv-patriotic-pick-any-3-kap-baks) product-form.product-form,\n.product__info-container:has(#kbv-patriotic-pick-any-3-kap-baks) form.installment,\n.product__info-container:has(#kbv-patriotic-pick-any-3-kap-baks) pickup-availability {\n  display: none !important;\n}\n.kbv-wrap { font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; color: #121212; margin: 22px 0 34px; }\n.kbv-hero { border: 1px solid #d8d8d8; background: #f7f5f0; padding: 22px; margin-bottom: 20px; }\n.kbv-badge { display: inline-block; font-size: 11px; font-weight: 800; letter-spacing: .14em; text-transform: uppercase; color: #8b1e1e; margin-bottom: 8px; }\n.kbv-hero h3 { margin: 0 0 8px; font-size: 28px; line-height: 1.08; }\n.kbv-hero p { margin: 0; color: #444; }\n.kbv-free { border: 1px solid #108474; background: #f2fbf8; padding: 12px 14px; margin: 14px 0 0; color: #12312c; }\n.kbv-note { margin: 10px 0 0; font-size: 13px; color: #555; }\n.kbv-group { margin-top: 22px; }\n.kbv-group-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; margin-bottom: 12px; }\n.kbv-group h4 { margin: 0; font-size: 18px; }\n.kbv-count { font-size: 13px; color: #555; font-weight: 700; }\n.kbv-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; }\n.kbv-card { position: relative; border: 1px solid #d7d7d7; background: #fff; padding: 12px; text-align: left; cursor: pointer; min-height: 214px; }\n.kbv-card:hover { border-color: #108474; }\n.kbv-card.kbv-selected { border-color: #108474; box-shadow: 0 0 0 2px rgba(16,132,116,.18); }\n.kbv-img { width: 100%; aspect-ratio: 1 \/ 1; object-fit: contain; background: #fafafa; display: block; margin-bottom: 8px; }\n.kbv-name { margin: 0 0 4px; font-size: 13px; line-height: 1.25; font-weight: 800; }\n.kbv-variant { margin: 0; font-size: 12px; line-height: 1.25; color: #555; }\n.kbv-check { position: absolute; top: 8px; right: 8px; background: #108474; color: #fff; min-width: 24px; height: 24px; border-radius: 999px; display: none; align-items: center; justify-content: center; font-size: 12px; font-weight: 900; padding: 0 6px; }\n.kbv-selected .kbv-check { display: inline-flex; }\n.kbv-error { border: 1px solid #a33; background: #fff6f6; padding: 12px; color: #7a1a1a; }\n.kbv-actions { position: sticky; bottom: 0; z-index: 5; background: rgba(255,255,255,.96); border-top: 1px solid #ddd; padding: 14px 0; margin-top: 22px; }\n.kbv-button { width: 100%; border: 0; background: #108474; color: #fff; font-weight: 900; font-size: 16px; padding: 15px 18px; cursor: pointer; }\n.kbv-button:disabled { background: #9ca3a7; cursor: not-allowed; }\n.kbv-status { margin: 8px 0 0; min-height: 20px; font-size: 13px; color: #444; }\n\u003c\/style\u003e\n\u003cdiv class=\"kbv-wrap\" id=\"kbv-patriotic-pick-any-3-kap-baks\"\u003e\n  \u003cdiv class=\"kbv-hero\"\u003e\n    \u003cdiv class=\"kbv-badge\"\u003eJuly 4 Bundle\u003c\/div\u003e\n    \u003ch3\u003eBuild a patriotic 3-pack\u003c\/h3\u003e\n    \u003cp\u003eChoose any 3 patriotic Kap-Baks and pick the color\/style where options exist.\u003c\/p\u003e\n    \u003cdiv class=\"kbv-free\"\u003e\n\u003cstrong\u003eFree shipping:\u003c\/strong\u003e Bundle orders qualify automatically at checkout on orders $30+.\u003c\/div\u003e\n    \u003cp class=\"kbv-note\"\u003eNonpartisan patriotic bundle for the July 4 push.\u003c\/p\u003e\n  \u003c\/div\u003e\n  \u003cdiv class=\"kbv-groups\"\u003e\u003c\/div\u003e\n  \u003cdiv class=\"kbv-actions\"\u003e\n    \u003cbutton class=\"kbv-button\" type=\"button\" disabled\u003eAdd Bundle to Cart - $39.99\u003c\/button\u003e\n    \u003cp class=\"kbv-status\"\u003e\u003c\/p\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function() {\n  var config = {\"id\":\"kbv-patriotic-pick-any-3-kap-baks\",\"variantId\":46750684938413,\"price\":\"$39.99\",\"bundleTitle\":\"Patriotic Pick Any 3 Kap-Baks - Choose Colors\",\"groups\":[{\"key\":\"pick\",\"label\":\"Pick\",\"pickN\":3,\"handles\":[\"america-250\",\"merica-flag\",\"american-flag-kap-bak\",\"american-flag-v2\",\"eagle-flag\",\"usa-red-white-blue\",\"gadsden-kap-bak\",\"dont-tread-on-me-flag\",\"america-peace-fingers\",\"we-the-people-1\",\"texas-flag\",\"texas-state\",\"2ndamendment\"],\"mode\":\"handles\",\"includeTagsAny\":[],\"excludeTagsAny\":[],\"excludeHandles\":[],\"allowRepeat\":false}]};\n  var root = document.getElementById(config.id);\n  if (!root) return;\n  function hideNativeForm() {\n    var holder = root.closest('.product__info-container') || document;\n    holder.querySelectorAll('.product-form__quantity, product-form.product-form, form.installment, pickup-availability').forEach(function(el) {\n      el.style.display = 'none';\n      el.setAttribute('aria-hidden', 'true');\n    });\n  }\n  hideNativeForm();\n  var groupsEl = root.querySelector('.kbv-groups');\n  var button = root.querySelector('.kbv-button');\n  var status = root.querySelector('.kbv-status');\n  var selected = {};\n  config.groups.forEach(function(group) { selected[group.key] = []; });\n\n  function tagsOf(product) {\n    if (Array.isArray(product.tags)) return product.tags.map(function(t) { return String(t).toLowerCase(); });\n    return String(product.tags || '').split(',').map(function(t) { return t.trim().toLowerCase(); });\n  }\n  function hasAny(tags, needles) {\n    return (needles || []).some(function(n) { return tags.indexOf(String(n).toLowerCase()) \u003e= 0; });\n  }\n  function passes(product, group) {\n    var tags = tagsOf(product);\n    if ((group.excludeHandles || []).indexOf(product.handle) \u003e= 0) return false;\n    if (group.excludeTagsAny \u0026\u0026 group.excludeTagsAny.length \u0026\u0026 hasAny(tags, group.excludeTagsAny)) return false;\n    if (group.includeTagsAny \u0026\u0026 group.includeTagsAny.length \u0026\u0026 !hasAny(tags, group.includeTagsAny)) return false;\n    return true;\n  }\n  function productImage(product, variant) {\n    if (variant \u0026\u0026 variant.featured_image) {\n      if (typeof variant.featured_image === 'string') return variant.featured_image;\n      if (variant.featured_image.src) return variant.featured_image.src;\n    }\n    if (product.featured_image) {\n      if (typeof product.featured_image === 'string') return product.featured_image;\n      if (product.featured_image.src) return product.featured_image.src;\n    }\n    if (product.images \u0026\u0026 product.images.length) {\n      var first = product.images[0];\n      return typeof first === 'string' ? first : first.src;\n    }\n    return '';\n  }\n  function variantLabel(product, variant) {\n    var title = variant \u0026\u0026 variant.title ? variant.title : 'Default Title';\n    return title === 'Default Title' ? product.title : title;\n  }\n  function itemLabel(item) {\n    return item.variantTitle === 'Default Title' ? item.productTitle : item.productTitle + ' - ' + item.variantTitle;\n  }\n  function expand(product, group) {\n    var variants = product.variants \u0026\u0026 product.variants.length ? product.variants : [{ id: product.id, title: 'Default Title', available: true }];\n    return variants.filter(function(v) { return v.available !== false; }).map(function(v) {\n      return {\n        productTitle: product.title,\n        handle: product.handle,\n        variantId: String(v.id),\n        variantTitle: variantLabel(product, v),\n        image: productImage(product, v),\n        groupKey: group.key\n      };\n    });\n  }\n  function fetchProducts(group) {\n    if (group.mode === 'all') {\n      return fetch('\/products.json?limit=250').then(function(r) { return r.json(); }).then(function(data) {\n        return (data.products || []).filter(function(p) { return passes(p, group); });\n      });\n    }\n    return Promise.all((group.handles || []).map(function(handle) {\n      return fetch('\/products\/' + handle + '.js').then(function(r) {\n        if (!r.ok) throw new Error('Could not load ' + handle);\n        return r.json();\n      });\n    })).then(function(products) {\n      return products.filter(function(p) { return passes(p, group); });\n    });\n  }\n  function countFor(group, item) {\n    return selected[group.key].filter(function(s) { return s.variantId === item.variantId; }).length;\n  }\n  function ready() {\n    return config.groups.every(function(group) { return selected[group.key].length === group.pickN; });\n  }\n  function refresh() {\n    config.groups.forEach(function(group) {\n      var container = root.querySelector('[data-group=\"' + group.key + '\"]');\n      if (!container) return;\n      container.querySelector('.kbv-count').textContent = selected[group.key].length + ' of ' + group.pickN + ' selected';\n      container.querySelectorAll('.kbv-card').forEach(function(card) {\n        var id = card.getAttribute('data-variant-id');\n        var qty = selected[group.key].filter(function(s) { return s.variantId === id; }).length;\n        card.classList.toggle('kbv-selected', qty \u003e 0);\n        card.querySelector('.kbv-check').textContent = qty \u003e 1 ? 'x' + qty : '1';\n      });\n    });\n    button.disabled = !ready();\n    status.textContent = ready() ? 'Ready to add your selected bundle.' : 'Choose all bundle items to continue.';\n  }\n  function toggle(group, item) {\n    var list = selected[group.key];\n    var idx = list.findIndex(function(s) { return s.variantId === item.variantId; });\n    if (group.allowRepeat) {\n      if (list.length \u003c group.pickN) {\n        list.push(item);\n      } else if (idx \u003e= 0) {\n        list.splice(idx, 1);\n      } else {\n        list.pop();\n        list.push(item);\n      }\n    } else if (idx \u003e= 0) {\n      list.splice(idx, 1);\n    } else {\n      if (list.length \u003e= group.pickN) list.pop();\n      list.push(item);\n    }\n    refresh();\n  }\n  function renderGroup(group, products) {\n    var section = document.createElement('section');\n    section.className = 'kbv-group';\n    section.setAttribute('data-group', group.key);\n    section.innerHTML = '\u003cdiv class=\"kbv-group-head\"\u003e\u003ch4\u003e' + group.label + 's\u003c\/h4\u003e\u003cspan class=\"kbv-count\"\u003e0 of ' + group.pickN + ' selected\u003c\/span\u003e\u003c\/div\u003e\u003cdiv class=\"kbv-grid\"\u003e\u003c\/div\u003e';\n    var grid = section.querySelector('.kbv-grid');\n    var items = [];\n    products.sort(function(a, b) { return a.title.localeCompare(b.title); }).forEach(function(product) {\n      items = items.concat(expand(product, group));\n    });\n    if (!items.length) {\n      grid.innerHTML = '\u003cdiv class=\"kbv-error\"\u003eNo eligible designs are available right now.\u003c\/div\u003e';\n      return section;\n    }\n    items.forEach(function(item) {\n      var card = document.createElement('button');\n      card.type = 'button';\n      card.className = 'kbv-card';\n      card.setAttribute('data-variant-id', item.variantId);\n      card.innerHTML = '\u003cspan class=\"kbv-check\"\u003e1\u003c\/span\u003e\u003cimg class=\"kbv-img\" src=\"' + item.image + '\u0026width=360\" loading=\"lazy\" alt=\"' + itemLabel(item).replace(\/\"\/g, '\u0026quot;') + '\"\u003e\u003cp class=\"kbv-name\"\u003e' + item.productTitle + '\u003c\/p\u003e\u003cp class=\"kbv-variant\"\u003e' + item.variantTitle + '\u003c\/p\u003e';\n      card.addEventListener('click', function() { toggle(group, item); });\n      grid.appendChild(card);\n    });\n    return section;\n  }\n  Promise.all(config.groups.map(function(group) {\n    return fetchProducts(group).then(function(products) { return renderGroup(group, products); });\n  })).then(function(sections) {\n    groupsEl.innerHTML = '';\n    sections.forEach(function(section) { groupsEl.appendChild(section); });\n    refresh();\n  }).catch(function(err) {\n    groupsEl.innerHTML = '\u003cdiv class=\"kbv-error\"\u003e' + (err \u0026\u0026 err.message ? err.message : 'Could not load bundle options.') + '\u003c\/div\u003e';\n  });\n  button.addEventListener('click', function() {\n    if (!ready()) return;\n    var defaultText = button.textContent;\n    var props = { 'Bundle': config.bundleTitle };\n    config.groups.forEach(function(group) {\n      selected[group.key].forEach(function(item, index) {\n        var prefix = group.label + ' ' + (index + 1);\n        props[prefix] = itemLabel(item);\n        props[prefix + ' Variant ID'] = item.variantId;\n      });\n    });\n    button.disabled = true;\n    button.textContent = 'Adding bundle...';\n    status.textContent = 'Adding your bundle to cart...';\n    fetch('\/cart\/add.js', {\n      method: 'POST',\n      credentials: 'same-origin',\n      headers: { 'Content-Type': 'application\/json', 'Accept': 'application\/json' },\n      body: JSON.stringify({ items: [{ id: config.variantId, quantity: 1, properties: props }] })\n    }).then(function(r) {\n      if (!r.ok) return r.json().catch(function() { return {}; }).then(function(data) {\n        throw new Error(data.description || data.message || 'Could not add this bundle.');\n      });\n      return r.json();\n    }).then(function() {\n      window.location.href = '\/cart';\n    }).catch(function(err) {\n      button.disabled = false;\n      button.textContent = defaultText;\n      status.textContent = err \u0026\u0026 err.message ? err.message : 'Could not add this bundle. Please refresh and try again.';\n    });\n  });\n})();\n\u003c\/script\u003e\n\u003cp\u003e\u003cem\u003eThis bundle is fulfilled from the selected Kap-Bak designs above. If a design has colors or styles, your exact choice is saved with the cart item.\u003c\/em\u003e\u003c\/p\u003e\n\u003c!-- KB_VARIANT_BUNDLE_PICKER_END --\u003e","brand":"Kap-Bak","offers":[{"title":"Default Title","offer_id":46750684938413,"sku":"BUNDLE-PATRIOTIC-3","price":39.99,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0663\/8000\/5549\/files\/250-0001-cap_3a9e30f7-b2f9-46e6-bee7-760e44e4732a.png?v=1783176471","url":"https:\/\/kap-bak.com\/products\/patriotic-pick-any-3-kap-baks","provider":"Kap-Bak","version":"1.0","type":"link"}