{
  "version": 3,
  "sources": ["/cdn/shop/t/30/assets/tso-shipping-protection.js?cb=1786726811036"],
  "sourcesContent": ["/**\n * Shipping Protection \u2014 upsell-checkbox i cart drawer.\n *\n * L\u00E4gger till / tar bort en add-on-produkt (kvantitet 1) i varukorgen n\u00E4r\n * kunden kryssar i rutan. F\u00F6ljer samma m\u00F6nster som gift-wrapping.js: h\u00E4mtar\n * bundlade sektioner via 'cart:bundled-sections' och publicerar cartUpdate s\u00E5\n * att drawern renderas om med r\u00E4tt totalsumma och kryssruta.\n */\nif (!customElements.get('tso-shipping-protection')) {\n  customElements.define(\n    'tso-shipping-protection',\n    class TsoShippingProtection extends HTMLElement {\n      /** Cart-attribut som minns att kunden aktivt tackat nej till skyddet. */\n      static DECLINED_ATTRIBUTE = '_shipping_protection_declined';\n\n      /**\n       * Cart-attribut som minns att skyddet lades till av f\u00F6rvalet, inte av\n       * kunden. Skiljer de tv\u00E5 fallen \u00E5t n\u00E4r f\u00F6rvalet st\u00E4ngs av: automatiskt\n       * tillagda rader st\u00E4das bort, kundens egna val l\u00E4mnas i fred.\n       */\n      static AUTO_ADDED_ATTRIBUTE = '_shipping_protection_auto';\n\n      constructor() {\n        super();\n\n        this.variantId = this.getAttribute('data-variant-id');\n        this.inCart = this.getAttribute('data-in-cart') === 'true';\n        this.otherItemsInCart = parseInt(this.getAttribute('data-other-items'), 10) || 0;\n        this.preselect = this.getAttribute('data-preselect') === 'true';\n        this.declined = this.getAttribute('data-declined') === 'true';\n        this.autoAdded = this.getAttribute('data-auto-added') === 'true';\n      }\n\n      get checkbox() {\n        return this.querySelector('input[type=\"checkbox\"]');\n      }\n\n      connectedCallback() {\n        if (this.checkbox === null) return;\n\n        this.checkbox.addEventListener(\n          'change',\n          theme.utils.debounce((event) => {\n            event.target.checked ? this.addProtection() : this.removeProtection(true);\n          }, 300)\n        );\n\n        // Tom varukorg: skyddet ska inte ligga kvar ensamt, och opt-out-flaggan\n        // nollst\u00E4lls s\u00E5 att n\u00E4sta varukorg b\u00F6rjar om fr\u00E5n f\u00F6rvalet igen. Utan\n        // det h\u00E4r skulle ett enda urkryss blockera f\u00F6rvalet f\u00F6r all framtid \u2014\n        // varken /cart/clear.js eller en t\u00F6md varukorg rensar cart-attribut.\n        if (this.otherItemsInCart === 0) {\n          if (this.inCart) return this.removeProtection();\n          if (this.declined) return this.clearDeclined();\n          return;\n        }\n\n        // F\u00F6rvalet \u00E4r avst\u00E4ngt men skyddet ligger kvar fr\u00E5n n\u00E4r det var p\u00E5 \u2014\n        // st\u00E4da bort det. Bara rader som f\u00F6rvalet sj\u00E4lvt lade till; har kunden\n        // kryssat i rutan sj\u00E4lv ska varan f\u00F6rst\u00E5s ligga kvar.\n        if (!this.preselect && this.inCart && this.autoAdded) {\n          return this.removeProtection();\n        }\n\n        // F\u00F6rval: l\u00E4gg till skyddet n\u00E4r varukorgen \u00F6ppnas \u2014 men aldrig igen om\n        // kunden sj\u00E4lv har kryssat ur det i den h\u00E4r varukorgen.\n        if (this.preselect && !this.inCart && !this.declined) {\n          this.addProtection(true);\n        }\n      }\n\n      get bundledSections() {\n        const sections = [];\n        document.documentElement.dispatchEvent(\n          new CustomEvent('cart:bundled-sections', { bubbles: true, detail: { sections } })\n        );\n        return sections;\n      }\n\n      /**\n       * @param {boolean} auto - true n\u00E4r f\u00F6rvalet l\u00E4gger till skyddet, false\n       *   n\u00E4r kunden sj\u00E4lv kryssar i rutan.\n       */\n      addProtection(auto = false) {\n        this.updateCart(1, {\n          // Kunden v\u00E4ljer till skyddet igen \u2014 nollst\u00E4ll opt-out-flaggan.\n          [TsoShippingProtection.DECLINED_ATTRIBUTE]: '',\n          [TsoShippingProtection.AUTO_ADDED_ATTRIBUTE]: auto ? 'true' : '',\n        });\n      }\n\n      /**\n       * @param {boolean} userInitiated - true n\u00E4r kunden sj\u00E4lv kryssade ur.\n       *   Bara d\u00E5 s\u00E4tts opt-out-flaggan; automatisk borttagning (tom varukorg,\n       *   eller att f\u00F6rvalet st\u00E4ngts av) ska inte r\u00E4knas som ett aktivt nej.\n       */\n      removeProtection(userInitiated = false) {\n        this.updateCart(0, {\n          [TsoShippingProtection.DECLINED_ATTRIBUTE]: userInitiated ? 'true' : '',\n          [TsoShippingProtection.AUTO_ADDED_ATTRIBUTE]: '',\n        });\n      }\n\n      /**\n       * Nollst\u00E4ller opt-out-flaggan utan att r\u00F6ra varulistan. K\u00F6rs tyst \u2014 ingen\n       * cartUpdate publiceras, eftersom inget synligt har \u00E4ndrats.\n       */\n      clearDeclined() {\n        const body = JSON.stringify({\n          attributes: { [TsoShippingProtection.DECLINED_ATTRIBUTE]: '' },\n        });\n\n        fetch(theme.routes.cart_update_url, { ...theme.utils.fetchConfig(), ...{ body } }).catch(\n          (error) => console.error('Shipping protection:', error)\n        );\n      }\n\n      updateCart(quantity, attributes) {\n        this.enableLoading();\n\n        const body = JSON.stringify({\n          updates: { [this.variantId]: quantity },\n          attributes,\n          sections: this.bundledSections,\n        });\n\n        fetch(theme.routes.cart_update_url, { ...theme.utils.fetchConfig(), ...{ body } })\n          .then((response) => response.json())\n          .then((parsedState) => {\n            if (parsedState.status) {\n              this.onError(parsedState.description || parsedState.message);\n              return;\n            }\n\n            theme.pubsub.publish(theme.pubsub.PUB_SUB_EVENTS.cartUpdate, {\n              source: 'tso-shipping-protection',\n              cart: parsedState,\n            });\n          })\n          .catch((error) => this.onError(error));\n      }\n\n      enableLoading() {\n        this.classList.add('is-loading');\n      }\n\n      onError(error) {\n        console.error('Shipping protection:', error);\n\n        this.classList.remove('is-loading');\n\n        // St\u00E4ll tillbaka kryssrutan s\u00E5 den speglar varukorgen igen.\n        if (this.checkbox) this.checkbox.checked = this.inCart;\n      }\n    }\n  );\n}\n"],
  "mappings": "AAQK,eAAe,IAAI,yBAAyB,GAC/C,eAAe,OACb,0BACA,MAAM,8BAA8B,WAAY,CAE9C,OAAO,mBAAqB,gCAO5B,OAAO,qBAAuB,4BAE9B,aAAc,CACZ,MAAM,EAEN,KAAK,UAAY,KAAK,aAAa,iBAAiB,EACpD,KAAK,OAAS,KAAK,aAAa,cAAc,IAAM,OACpD,KAAK,iBAAmB,SAAS,KAAK,aAAa,kBAAkB,EAAG,EAAE,GAAK,EAC/E,KAAK,UAAY,KAAK,aAAa,gBAAgB,IAAM,OACzD,KAAK,SAAW,KAAK,aAAa,eAAe,IAAM,OACvD,KAAK,UAAY,KAAK,aAAa,iBAAiB,IAAM,MAC5D,CAEA,IAAI,UAAW,CACb,OAAO,KAAK,cAAc,wBAAwB,CACpD,CAEA,mBAAoB,CAClB,GAAI,KAAK,WAAa,KAatB,IAXA,KAAK,SAAS,iBACZ,SACA,MAAM,MAAM,SAAU,OAAU,CAC9B,MAAM,OAAO,QAAU,KAAK,cAAc,EAAI,KAAK,iBAAiB,EAAI,CAC1E,EAAG,GAAG,CACR,EAMI,KAAK,mBAAqB,EAC5B,OAAI,KAAK,OAAe,KAAK,iBAAiB,EAC1C,KAAK,SAAiB,KAAK,cAAc,EAC7C,OAMF,GAAI,CAAC,KAAK,WAAa,KAAK,QAAU,KAAK,UACzC,OAAO,KAAK,iBAAiB,EAK3B,KAAK,WAAa,CAAC,KAAK,QAAU,CAAC,KAAK,UAC1C,KAAK,cAAc,EAAI,EAE3B,CAEA,IAAI,iBAAkB,CACpB,MAAM,SAAW,CAAC,EAClB,gBAAS,gBAAgB,cACvB,IAAI,YAAY,wBAAyB,CAAE,QAAS,GAAM,OAAQ,CAAE,QAAS,CAAE,CAAC,CAClF,EACO,QACT,CAMA,cAAc,KAAO,GAAO,CAC1B,KAAK,WAAW,EAAG,CAEjB,CAAC,sBAAsB,kBAAkB,EAAG,GAC5C,CAAC,sBAAsB,oBAAoB,EAAG,KAAO,OAAS,EAChE,CAAC,CACH,CAOA,iBAAiB,cAAgB,GAAO,CACtC,KAAK,WAAW,EAAG,CACjB,CAAC,sBAAsB,kBAAkB,EAAG,cAAgB,OAAS,GACrE,CAAC,sBAAsB,oBAAoB,EAAG,EAChD,CAAC,CACH,CAMA,eAAgB,CACd,MAAM,KAAO,KAAK,UAAU,CAC1B,WAAY,CAAE,CAAC,sBAAsB,kBAAkB,EAAG,EAAG,CAC/D,CAAC,EAED,MAAM,MAAM,OAAO,gBAAiB,CAAE,GAAG,MAAM,MAAM,YAAY,EAAQ,IAAO,CAAC,EAAE,MAChF,OAAU,QAAQ,MAAM,uBAAwB,KAAK,CACxD,CACF,CAEA,WAAW,SAAU,WAAY,CAC/B,KAAK,cAAc,EAEnB,MAAM,KAAO,KAAK,UAAU,CAC1B,QAAS,CAAE,CAAC,KAAK,SAAS,EAAG,QAAS,EACtC,WACA,SAAU,KAAK,eACjB,CAAC,EAED,MAAM,MAAM,OAAO,gBAAiB,CAAE,GAAG,MAAM,MAAM,YAAY,EAAQ,IAAO,CAAC,EAC9E,KAAM,UAAa,SAAS,KAAK,CAAC,EAClC,KAAM,aAAgB,CACrB,GAAI,YAAY,OAAQ,CACtB,KAAK,QAAQ,YAAY,aAAe,YAAY,OAAO,EAC3D,MACF,CAEA,MAAM,OAAO,QAAQ,MAAM,OAAO,eAAe,WAAY,CAC3D,OAAQ,0BACR,KAAM,WACR,CAAC,CACH,CAAC,EACA,MAAO,OAAU,KAAK,QAAQ,KAAK,CAAC,CACzC,CAEA,eAAgB,CACd,KAAK,UAAU,IAAI,YAAY,CACjC,CAEA,QAAQ,MAAO,CACb,QAAQ,MAAM,uBAAwB,KAAK,EAE3C,KAAK,UAAU,OAAO,YAAY,EAG9B,KAAK,WAAU,KAAK,SAAS,QAAU,KAAK,OAClD,CACF,CACF",
  "names": []
}
