{
  "version": 3,
  "sources": ["/cdn/shop/t/45/assets/ttcf-commerce.js?audit=1789386900"],
  "sourcesContent": ["/* Pure commerce rules: exact SKU matching, quantities and fail-closed cart eligibility. */\n(function (root) {\n  'use strict';\n  function quantities(snapshot) {\n    const result = new Map();\n    for (const sku of [...snapshot.storageIds, ...snapshot.setIds]) {\n      if (typeof sku !== 'string' || !sku.trim()) continue;\n      result.set(sku, (result.get(sku) || 0) + 1);\n    }\n    return [...result].map(([sku, quantity]) => ({ sku, quantity }));\n  }\n  function resolveVariant(mapping, product) {\n    if (!mapping || mapping.status !== 'matched') return { status: 'quote', reason: 'Local availability on request' };\n    const variants = (product?.variants || []).filter(v =>\n      String(v.id) === String(mapping.variantId) &&\n      String(v.sku || '').trim().toUpperCase() === mapping.sku.toUpperCase());\n    if (variants.length !== 1) return { status: 'quote', reason: 'Product match needs checking' };\n    const variant = variants[0];\n    const price = Number(variant.price);\n    if (!Number.isSafeInteger(price) || price <= 0) return { status: 'quote', reason: 'Price on request' };\n    if (variant.available !== true) return { status: 'quote', reason: 'Out of stock \u00B7 request a quote', price };\n    if (product.requires_selling_plan === true || variant.requires_selling_plan === true) {\n      return { status: 'quote', reason: 'Contact us to order this product', price };\n    }\n    return { status: 'available', price, variantId: variant.id, reason: 'Available to order' };\n  }\n  function summarize(lines) {\n    return lines.reduce((s, line) => {\n      s.count += line.quantity;\n      if (line.status === 'available') {\n        s.availableCount += line.quantity;\n        s.subtotal += line.price * line.quantity;\n      } else s.quoteCount += line.quantity;\n      return s;\n    }, { count: 0, availableCount: 0, quoteCount: 0, subtotal: 0 });\n  }\n  function selectionKey(snapshot) {\n    return JSON.stringify([snapshot.storageIds, snapshot.setIds]);\n  }\n  function layoutKey(snapshot) {\n    return JSON.stringify([snapshot.storageIds, snapshot.setIds, snapshot.payload.drawers, snapshot.unplacedCount, snapshot.errors]);\n  }\n  function validateLayout(drawers, requestedIds) {\n    const errors = [], wanted = new Map(), placed = new Map();\n    for (const id of requestedIds) wanted.set(id, (wanted.get(id) || 0) + 1);\n    for (const drawer of drawers) {\n      let weight = 0;\n      const placements = drawer.placements || [];\n      for (const [index, a] of placements.entries()) {\n        const id = a.set?.itemId;\n        placed.set(id, (placed.get(id) || 0) + 1);\n        weight += Number(a.set?.itemWeight) || 0;\n        const values = [a.x,a.y,a.width,a.depth];\n        const normalSize = Math.abs(a.width-a.set?.setWidth)<0.01 && Math.abs(a.depth-a.set?.setDepth)<0.01;\n        const rotatedSize = Math.abs(a.width-a.set?.setDepth)<0.01 && Math.abs(a.depth-a.set?.setWidth)<0.01;\n        if (!values.every(Number.isFinite) || a.x<0 || a.y<0 || a.width<=0 || a.depth<=0 ||\n            a.x+a.width>drawer.drawerUsableWidth+0.01 || a.y+a.depth>drawer.drawerUsableDepth+0.01 ||\n            a.set?.setHeight>drawer.drawerHeight || (!normalSize && !rotatedSize)) {\n          errors.push(`Drawer ${drawer.drawerIndex}: ${id} does not fit. Reposition or remove this set.`);\n        }\n        for (const b of placements.slice(index+1)) {\n          if (!(a.x+a.width<=b.x+0.01 || b.x+b.width<=a.x+0.01 || a.y+a.depth<=b.y+0.01 || b.y+b.depth<=a.y+0.01)) {\n            errors.push(`Drawer ${drawer.drawerIndex}: tool sets overlap.`);\n          }\n        }\n      }\n      if (drawer.drawerCapacity>0 && weight>drawer.drawerCapacity*1000) errors.push(`Drawer ${drawer.drawerIndex}: the selected sets exceed its weight capacity.`);\n    }\n    for (const [id,count] of placed) if (count>(wanted.get(id)||0)) errors.push(`Saved layout contains extra ${id} sets. Remove them or reload the configuration.`);\n    return [...new Set(errors)];\n  }\n  function cartItems(lines, snapshot, reference) {\n    if (!snapshot.storageIds.length || snapshot.unplacedCount || snapshot.errors.length) {\n      throw new Error('Place all selected sets in compatible storage before adding to cart.');\n    }\n    return lines.filter(l => l.status === 'available').map(line => {\n      if (!Number.isSafeInteger(line.quantity) || line.quantity < 1) throw new Error('Invalid quantity.');\n      const drawers = snapshot.payload.drawers.filter(d => d.sets.some(s => s.itemId === line.sku)).map(d => d.drawerIndex);\n      return { id: line.variantId, quantity: line.quantity, properties: {\n        'Toolkit': reference,\n        ...(drawers.length ? { 'Drawers': drawers.join(', ') } : {})\n      } };\n    });\n  }\n  const api = { quantities, resolveVariant, summarize, selectionKey, layoutKey, validateLayout, cartItems };\n  if (typeof module !== 'undefined' && module.exports) module.exports = api;\n  else root.TTCFCommerce = Object.freeze(api);\n})(typeof window !== 'undefined' ? window : globalThis);\n"],
  "mappings": "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",
  "names": []
}
