PageSourceSearch

https://embelleze.com/cdn/shop/t/9/assets/cart-tools.js?v=29607614840137471051766497979

js embelleze.com collected 2026-10-03 19:04:50 UTC 26,115 bytes, 99 lines download raw bytes

1import{ThemeEvents,DiscountUpdateEvent}from"./events.js";class CartDiscount extends HTMLElement{constructor(){super(),this.appliedDiscounts=new Set}connectedCallback(){this.form=this.querySelector("form"),this.open=this.querySelector(".insert-code"),this.error=this.querySelector(".discount-error"),this.discountsList=this.querySelector(".applied-discounts-list"),this.form&&this.form.addEventListener("submit",this.apply),this.open&&this.open.addEventListener("click",this.toggle),this.removeBtn=this.querySelector(".remove-discount"),this.removeBtn&&this.removeBtn.addEventListener("click",this.clearAllDiscounts),this.clearDiscountInput(),this.loadSavedDiscounts()}disconnectedCallback(){this.form&&this.form.removeEventListener("submit",this.apply),this.open&&this.open.removeEventListener("click",this.toggle),this.teardownRefazer()}loadSavedDiscounts(){const saved=localStorage.getItem("appliedDiscounts");if(saved)try{const discounts=JSON.parse(saved);this.appliedDiscounts=new Set(discounts)}catch(e){console.error("Erro ao carregar descontos salvos:",e)}this.syncWithCartDiscounts(),this.renderDiscountsList()}async syncWithCartDiscounts(){try{const response=await fetch("/cart.js",{method:"GET",headers:{Accept:"application/json"}});if(response.ok){const cartData=await response.json();if(cartData.discount_codes&&Array.isArray(cartData.discount_codes)){const currentDiscounts=new Set;cartData.discount_codes.forEach(discount=>{discount.applicable&&currentDiscounts.add(discount.code)}),this.appliedDiscounts=currentDiscounts,this.saveDiscounts()}}}catch(error){console.error("Erro ao sincronizar descontos com carrinho:",error)}}saveDiscounts(){localStorage.setItem("appliedDiscounts",JSON.stringify([...this.appliedDiscounts]))}clearDiscountInput(){const discountInput=this.form?.querySelector('[name="discount"]');discountInput&&(discountInput.value="")}toggle=e=>{e.preventDefault();const isOpen=this.dataset.open==="opened";this.dataset.open=isOpen?"closed":"opened",this.dispatchEvent(new CustomEvent(ThemeEvents.DISCOUNT_TOGGLE,{detail:{open:!isOpen,sectionId:this.dataset.sectionId}})),this.clearDiscountInput(),this.error.hidden=!0,this.open.textContent=isOpen?"Inserir c\xF3digo":"Fechar"};apply=async e=>{e.preventDefault();const discountCode=this.form.querySelector('[name="discount"]').value.trim();if(!discountCode){this.error.textContent="Por favor, insira um c\xF3digo de desconto.",this.error.hidden=!1;return}if(this.appliedDiscounts.has(discountCode)){this.error.textContent="Este c\xF3digo de desconto j\xE1 foi aplicado.",this.error.hidden=!1;return}const submitButton=this.form.querySelector('button[type="submit"]')||this.form.querySelector('input[type="submit"]'),originalButtonContent=submitButton?.innerHTML||submitButton?.value;submitButton&&(submitButton.disabled=!0,submitButton.innerHTML!==void 0?submitButton.innerHTML=`
2          <svg width="16" height="16" viewBox="0 0 24 24" style="margin-right: 8px;">
3            <circle cx="12" cy="12" r="10" stroke="#ccc" stroke-width="2" fill="none" stroke-dasharray="32" stroke-dashoffset="32">
4              <animate attributeName="stroke-dashoffset" values="32;0" dur="1s" repeatCount="indefinite"/>
5            </circle>
6          </svg>
7          Aplicando...
8        `:submitButton.value="Aplicando...");try{const discountString=[...this.appliedDiscounts,discountCode].join(","),data=await(await fetch("/cart/update.js",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({discount:discountString})})).json();if(data.status&&data.status!==200){this.error.textContent=data.description,this.error.hidden=!1;return}this.appliedDiscounts.add(discountCode),this.saveDiscounts(),this.error.hidden=!0,this.clearDiscountInput(),await this.syncWithCartDiscounts(),this.renderDiscountsList(),document.dispatchEvent(new DiscountUpdateEvent(data,this.dataset.sectionId)),window.location.pathname==="/cart"&&setTimeout(()=>{window.location.reload()},500)}catch(error){console.error(error),this.error.textContent="Erro ao aplicar desconto. Tente novamente.",this.error.hidden=!1}finally{submitButton&&(submitButton.disabled=!1,submitButton.innerHTML!==void 0?submitButton.innerHTML=originalButtonContent||"Aplicar":submitButton.value=originalButtonContent||"Aplicar")}};async renderDiscountsList(){if(!this.discountsList)return;if(this.appliedDiscounts.size===0){this.discountsList.innerHTML="",this.discountsList.hidden=!0;return}let cartData=null;try{const response=await fetch("/cart.js",{method:"GET",headers:{Accept:"application/json"}});response.ok&&(cartData=await response.json())}catch(error){console.error("Erro ao buscar dados do carrinho:",error)}const discountsArray=[...this.appliedDiscounts];this.discountsList.innerHTML=`
9      <div class="applied-discounts-container">
10        <div class="discount-tags">
11          ${discountsArray.map(code=>{let isApplicable=!0,discountInfo=null;return cartData&&cartData.discount_codes&&(discountInfo=cartData.discount_codes.find(d=>d.code===code),isApplicable=discountInfo?discountInfo.applicable:!1),`
12              <div class="discount-tag ${isApplicable?"":"discount-tag--not-applicable"}">
13                <span class="icon-discount-tag">
14                  <svg width="16" height="16" viewBox="0 0 16 12" fill="none" xmlns="http://www.w3.org/2000/svg">
15                      <path stroke="#50AA6C" fill-rule="evenodd" clip-rule="evenodd" d="M0.6875 2.25C0.6875 1.11091 1.61091 0.1875 2.75 0.1875H13.25C14.3891 0.1875 15.3125 1.11091 15.3125 2.25V4.5C15.3125 4.81066 15.0607 5.0625 14.75 5.0625C14.5092 5.0625 14.2703 5.15392 14.0871 5.33709C13.721 5.7032 13.721 6.2968 14.0871 6.66291C14.2703 6.84608 14.5092 6.9375 14.75 6.9375C15.0607 6.9375 15.3125 7.18934 15.3125 7.5V9.75001C15.3125 10.8891 14.3891 11.8125 13.25 11.8125H2.75C1.61091 11.8125 0.6875 10.8891 0.6875 9.75V7.5C0.6875 7.18934 0.93934 6.9375 1.25 6.9375C1.4908 6.9375 1.72974 6.84608 1.91291 6.66291C2.27903 6.2968 2.27903 5.7032 1.91291 5.33709C1.72974 5.15392 1.4908 5.0625 1.25 5.0625C0.93934 5.0625 0.6875 4.81066 0.6875 4.5V2.25ZM2.75 1.3125C2.23223 1.3125 1.8125 1.73223 1.8125 2.25V4.01543C2.1405 4.10814 2.45037 4.28356 2.70841 4.54159C3.51386 5.34705 3.51386 6.65295 2.70841 7.45841C2.45037 7.71644 2.1405 7.89186 1.8125 7.98457V9.75C1.8125 10.2678 2.23223 10.6875 2.75 10.6875H5.9375V1.3125H2.75ZM7.0625 1.3125V10.6875H13.25C13.7678 10.6875 14.1875 10.2678 14.1875 9.75001V7.98457C13.8595 7.89186 13.5496 7.71644 13.2916 7.45841C12.4861 6.65295 12.4861 5.34705 13.2916 4.54159C13.5496 4.28356 13.8595 4.10814 14.1875 4.01543V2.25C14.1875 1.73223 13.7678 1.3125 13.25 1.3125H7.0625Z" fill="#292929"></path>
16                  </svg>
17                </span>
18                <span class="discount-code">${code}</span>
19                ${isApplicable?"":'<span class="discount-status">N\xE3o aplic\xE1vel</span>'}
20                <button type="button" class="remove-single-discount" data-discount="${code}" aria-label="Remover ${code}">
21                  <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 18 18" fill="none">
22                      <path fill-rule="evenodd" clip-rule="evenodd" d="M10.499 7.68726C10.8097 7.68726 11.0615 7.9391 11.0615 8.24976V12.7498C11.0615 13.0604 10.8097 13.3123 10.499 13.3123C10.1884 13.3123 9.93652 13.0604 9.93652 12.7498V8.24976C9.93652 7.9391 10.1884 7.68726 10.499 7.68726Z" fill="#7045F5"></path>
23                      <path fill-rule="evenodd" clip-rule="evenodd" d="M7.50098 7.68726C7.81164 7.68726 8.06348 7.9391 8.06348 8.24976V12.7498C8.06348 13.0604 7.81164 13.3123 7.50098 13.3123C7.19032 13.3123 6.93848 13.0604 6.93848 12.7498V8.24976C6.93848 7.9391 7.19032 7.68726 7.50098 7.68726Z" fill="#7045F5"></path>
24                      <path fill-rule="evenodd" clip-rule="evenodd" d="M4.5 4.68774C4.81066 4.68774 5.0625 4.93958 5.0625 5.25024V14.2502C5.0625 14.768 5.48223 15.1877 6 15.1877H12C12.5178 15.1877 12.9375 14.768 12.9375 14.2502V5.25024C12.9375 4.93958 13.1893 4.68774 13.5 4.68774C13.8107 4.68774 14.0625 4.93958 14.0625 5.25024V14.2502C14.0625 15.3893 13.1391 16.3127 12 16.3127H6C4.86091 16.3127 3.9375 15.3893 3.9375 14.2502V5.25024C3.9375 4.93958 4.18934 4.68774 4.5 4.68774Z" fill="#7045F5"></path>
25                      <path fill-rule="evenodd" clip-rule="evenodd" d="M2.43848 5.25024C2.43848 4.93958 2.69032 4.68774 3.00098 4.68774H15.001C15.3116 4.68774 15.5635 4.93958 15.5635 5.25024C15.5635 5.5609 15.3116 5.81274 15.001 5.81274H3.00098C2.69032 5.81274 2.43848 5.5609 2.43848 5.25024Z" fill="#7045F5"></path>
26                      <path fill-rule="evenodd" clip-rule="evenodd" d="M6.24798 1.99844C6.34327 1.80788 6.53804 1.6875 6.7511 1.6875H11.2511C11.4642 1.6875 11.6589 1.80788 11.7542 1.99844L13.2542 4.99844C13.3931 5.27631 13.2805 5.61418 13.0027 5.75312C12.7248 5.89205 12.3869 5.77942 12.248 5.50156L10.9035 2.8125H7.09874L5.75422 5.50156C5.61528 5.77942 5.27741 5.89205 4.99954 5.75312C4.72168 5.61418 4.60905 5.27631 4.74798 4.99844L6.24798 1.99844Z" fill="#7045F5"></path>
27                  </svg>
28                </button>
29              </div>
30            `}).join("")}
31        </div>
32        <div class="discount-actions">
33          <div class="discount-info">
34            <span>Cupons aplicados (${discountsArray.length})</span>
35          </div>
36          <button type="button" class="remove-all-discounts">
37            <span>Remover todos</span>
38            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 18 18" fill="none">
39              <path fill-rule="evenodd" clip-rule="evenodd" d="M10.499 7.68726C10.8097 7.68726 11.0615 7.9391 11.0615 8.24976V12.7498C11.0615 13.0604 10.8097 13.3123 10.499 13.3123C10.1884 13.3123 9.93652 13.0604 9.93652 12.7498V8.24976C9.93652 7.9391 10.1884 7.68726 10.499 7.68726Z" fill="#00a0b1"></path>
40              <path fill-rule="evenodd" clip-rule="evenodd" d="M7.50098 7.68726C7.81164 7.68726 8.06348 7.9391 8.06348 8.24976V12.7498C8.06348 13.0604 7.81164 13.3123 7.50098 13.3123C7.19032 13.3123 6.93848 13.0604 6.93848 12.7498V8.24976C6.93848 7.9391 7.19032 7.68726 7.50098 7.68726Z" fill="#00a0b1"></path>
41              <path fill-rule="evenodd" clip-rule="evenodd" d="M4.5 4.68774C4.81066 4.68774 5.0625 4.93958 5.0625 5.25024V14.2502C5.0625 14.768 5.48223 15.1877 6 15.1877H12C12.5178 15.1877 12.9375 14.768 12.9375 14.2502V5.25024C12.9375 4.93958 13.1893 4.68774 13.5 4.68774C13.8107 4.68774 14.0625 4.93958 14.0625 5.25024V14.2502C14.0625 15.3893 13.1391 16.3127 12 16.3127H6C4.86091 16.3127 3.9375 15.3893 3.9375 14.2502V5.25024C3.9375 4.93958 4.18934 4.68774 4.5 4.68774Z" fill="#00a0b1"></path>
42              <path fill-rule="evenodd" clip-rule="evenodd" d="M2.43848 5.25024C2.43848 4.93958 2.69032 4.68774 3.00098 4.68774H15.001C15.3116 4.68774 15.5635 4.93958 15.5635 5.25024C15.5635 5.5609 15.3116 5.81274 15.001 5.81274H3.00098C2.69032 5.81274 2.43848 5.5609 2.43848 5.25024Z" fill="#00a0b1"></path>
43              <path fill-rule="evenodd" clip-rule="evenodd" d="M6.24798 1.99844C6.34327 1.80788 6.53804 1.6875 6.7511 1.6875H11.2511C11.4642 1.6875 11.6589 1.80788 11.7542 1.99844L13.2542 4.99844C13.3931 5.27631 13.2805 5.61418 13.0027 5.75312C12.7248 5.89205 12.3869 5.77942 12.248 5.50156L10.9035 2.8125H7.09874L5.75422 5.50156C5.61528 5.77942 5.27741 5.89205 4.99954 5.75312C4.72168 5.61418 4.60905 5.27631 4.74798 4.99844L6.24798 1.99844Z" fill="#00a0b1"></path>
44            </svg>
45          </button>
46        </div>
47      </div>
48    `,this.discountsList.hidden=!1,this.discountsList.querySelectorAll(".remove-single-discount").forEach(btn=>{btn.addEventListener("click",e=>{e.preventDefault(),e.stopPropagation();const button=e.target.closest(".remove-single-discount"),discountToRemove=button?.dataset?.discount;discountToRemove&&this.removeSingleDiscount(discountToRemove,button)})});const removeAllBtn=this.discountsList.querySelector(".remove-all-discounts");removeAllBtn&&removeAllBtn.addEventListener("click",e=>{this.clearAllDiscounts(e.target.closest(".remove-all-discounts"))})}removeSingleDiscount=async(discountCode,buttonElement=null)=>{try{buttonElement&&(buttonElement.disabled=!0,buttonElement.innerHTML=`
49          <svg width="16" height="16" viewBox="0 0 24 24">
50            <circle cx="12" cy="12" r="10" stroke="#ccc" stroke-width="2" fill="none" stroke-dasharray="32" stroke-dashoffset="32">
51              <animate attributeName="stroke-dashoffset" values="32;0" dur="1s" repeatCount="indefinite"/>
52            </circle>
53          </svg>
54        `),this.appliedDiscounts.delete(discountCode);const remainingDiscounts=[...this.appliedDiscounts];if(await fetch("/cart/update.js",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({discount:""})}),remainingDiscounts.length>0)for(let i=0;i<remainingDiscounts.length;i++){const code=remainingDiscounts[i];await fetch("/cart/update.js",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({discount:code})}),i<remainingDiscounts.length-1&&await new Promise(resolve=>setTimeout(resolve,300))}const data=await(await fetch("/cart.js",{method:"GET",headers:{Accept:"application/json"}})).json();this.saveDiscounts(),await this.syncWithCartDiscounts(),this.renderDiscountsList(),document.dispatchEvent(new DiscountUpdateEvent(data,this.dataset.sectionId)),window.location.pathname==="/cart"&&setTimeout(()=>{window.location.reload()},500)}catch(error){console.error("Erro ao remover desconto:",error),buttonElement&&(buttonElement.disabled=!1,buttonElement.innerHTML=`
55          <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewB
55ox="0 0 18 18" fill="none">
56            <path fill-rule="evenodd" clip-rule="evenodd" d="M10.499 7.68726C10.8097 7.68726 11.0615 7.9391 11.0615 8.24976V12.7498C11.0615 13.0604 10.8097 13.3123 10.499 13.3123C10.1884 13.3123 9.93652 13.0604 9.93652 12.7498V8.24976C9.93652 7.9391 10.1884 7.68726 10.499 7.68726Z" fill="#7045F5"></path>
57            <path fill-rule="evenodd" clip-rule="evenodd" d="M7.50098 7.68726C7.81164 7.68726 8.06348 7.9391 8.06348 8.24976V12.7498C8.06348 13.0604 7.81164 13.3123 7.50098 13.3123C7.19032 13.3123 6.93848 13.0604 6.93848 12.7498V8.24976C6.93848 7.9391 7.19032 7.68726 7.50098 7.68726Z" fill="#7045F5"></path>
58            <path fill-rule="evenodd" clip-rule="evenodd" d="M4.5 4.68774C4.81066 4.68774 5.0625 4.93958 5.0625 5.25024V14.2502C5.0625 14.768 5.48223 15.1877 6 15.1877H12C12.5178 15.1877 12.9375 14.768 12.9375 14.2502V5.25024C12.9375 4.93958 13.1893 4.68774 13.5 4.68774C13.8107 4.68774 14.0625 4.93958 14.0625 5.25024V14.2502C14.0625 15.3893 13.1391 16.3127 12 16.3127H6C4.86091 16.3127 3.9375 15.3893 3.9375 14.2502V5.25024C3.9375 4.93958 4.18934 4.68774 4.5 4.68774Z" fill="#7045F5"></path>
59            <path fill-rule="evenodd" clip-rule="evenodd" d="M2.43848 5.25024C2.43848 4.93958 2.69032 4.68774 3.00098 4.68774H15.001C15.3116 4.68774 15.5635 4.93958 15.5635 5.25024C15.5635 5.5609 15.3116 5.81274 15.001 5.81274H3.00098C2.69032 5.81274 2.43848 5.5609 2.43848 5.25024Z" fill="#7045F5"></path>
60            <path fill-rule="evenodd" clip-rule="evenodd" d="M6.24798 1.99844C6.34327 1.80788 6.53804 1.6875 6.7511 1.6875H11.2511C11.4642 1.6875 11.6589 1.80788 11.7542 1.99844L13.2542 4.99844C13.3931 5.27631 13.2805 5.61418 13.0027 5.75312C12.7248 5.89205 12.3869 5.77942 12.248 5.50156L10.9035 2.8125H7.09874L5.75422 5.50156C5.61528 5.77942 5.27741 5.89205 4.99954 5.75312C4.72168 5.61418 4.60905 5.27631 4.74798 4.99844L6.24798 1.99844Z" fill="#7045F5"></path>
61          </svg>
62        `)}};clearAllDiscounts=async(buttonElement=null)=>{try{if(buttonElement){const originalContent=buttonElement.innerHTML;buttonElement.disabled=!0,buttonElement.innerHTML=`
63          <span>Removendo...</span>
64          <svg width="16" height="16" viewBox="0 0 24 24">
65            <circle cx="12" cy="12" r="10" stroke="#ccc" stroke-width="2" fill="none" stroke-dasharray="32" stroke-dashoffset="32">
66              <animate attributeName="stroke-dashoffset" values="32;0" dur="1s" repeatCount="indefinite"/>
67            </circle>
68          </svg>
69        `}const data=await(await fetch("/cart/update.js",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({discount:""})})).json();this.appliedDiscounts.clear(),this.saveDiscounts(),this.renderDiscountsList(),document.dispatchEvent(new DiscountUpdateEvent(data,this.dataset.sectionId)),window.location.pathname==="/cart"&&setTimeout(()=>{window.location.reload()},500)}catch(error){console.error(error),buttonElement&&(buttonElement.disabled=!1,buttonElement.innerHTML=`
70          <span>Remover todos</span>
71          <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 18 18" fill="none">
72            <path fill-rule="evenodd" clip-rule="evenodd" d="M10.499 7.68726C10.8097 7.68726 11.0615 7.9391 11.0615 8.24976V12.7498C11.0615 13.0604 10.8097 13.3123 10.499 13.3123C10.1884 13.3123 9.93652 13.0604 9.93652 12.7498V8.24976C9.93652 7.9391 10.1884 7.68726 10.499 7.68726Z" fill="#00a0b1"></path>
73            <path fill-rule="evenodd" clip-rule="evenodd" d="M7.50098 7.68726C7.81164 7.68726 8.06348 7.9391 8.06348 8.24976V12.7498C8.06348 13.0604 7.81164 13.3123 7.50098 13.3123C7.19032 13.3123 6.93848 13.0604 6.93848 12.7498V8.24976C6.93848 7.9391 7.19032 7.68726 7.50098 7.68726Z" fill="#00a0b1"></path>
74            <path fill-rule="evenodd" clip-rule="evenodd" d="M4.5 4.68774C4.81066 4.68774 5.0625 4.93958 5.0625 5.25024V14.2502C5.0625 14.768 5.48223 15.1877 6 15.1877H12C12.5178 15.1877 12.9375 14.768 12.9375 14.2502V5.25024C12.9375 4.93958 13.1893 4.68774 13.5 4.68774C13.8107 4.68774 14.0625 4.93958 14.0625 5.25024V14.2502C14.0625 15.3893 13.1391 16.3127 12 16.3127H6C4.86091 16.3127 3.9375 15.3893 3.9375 14.2502V5.25024C3.9375 4.93958 4.18934 4.68774 4.5 4.68774Z" fill="#00a0b1"></path>
75            <path fill-rule="evenodd" clip-rule="evenodd" d="M2.43848 5.25024C2.43848 4.93958 2.69032 4.68774 3.00098 4.68774H15.001C15.3116 4.68774 15.5635 4.93958 15.5635 5.25024C15.5635 5.5609 15.3116 5.81274 15.001 5.81274H3.00098C2.69032 5.81274 2.43848 5.5609 2.43848 5.25024Z" fill="#00a0b1"></path>
76            <path fill-rule="evenodd" clip-rule="evenodd" d="M6.24798 1.99844C6.34327 1.80788 6.53804 1.6875 6.7511 1.6875H11.2511C11.4642 1.6875 11.6589 1.80788 11.7542 1.99844L13.2542 4.99844C13.3931 5.27631 13.2805 5.61418 13.0027 5.75312C12.7248 5.89205 12.3869 5.77942 12.248 5.50156L10.9035 2.8125H7.09874L5.75422 5.50156C5.61528 5.77942 5.27741 5.89205 4.99954 5.75312C4.72168 5.61418 4.60905 5.27631 4.74798 4.99844L6.24798 1.99844Z" fill="#00a0b1"></path>
77          </svg>
78        `)}};teardownRefazer(){}}customElements.define("cart-discount-component",CartDiscount);class CartShipping extends HTMLElement{fmtBRL(v){return new Intl.NumberFormat("pt-BR",{style:"currency",currency:"BRL"}).format(Number(v)||0)}deliveryHtml(range){const _isDateLike=v=>typeof v=="string"&&!Number.isNaN(Date.parse(v)),_toDate=v=>{if(v==null)return null;if(typeof v=="number"&&Number.isFinite(v)){const d=new Date;return d.setHours(0,0,0,0),d.setDate(d.getDate()+v),d}return _isDateLike(v)?new Date(v):null},_fmt=d=>d.toLocaleDateString("pt-BR",{day:"2-digit",month:"2-digit"}),_rel=d=>{const today=new Date;today.setHours(0,0,0,0);const cmp=new Date(d);cmp.setHours(0,0,0,0);const diff=Math.round((cmp-today)/864e5);return diff===0?"Hoje":diff===1?"Amanh\xE3":diff>1&&diff<=7?`${cmp.toLocaleDateString("pt-BR",{weekday:"short"})} (${_fmt(cmp)})`:_fmt(cmp)};if(!range)return"";if(typeof range=="string")return range;let min=range.min??range.minimum??range.from??range[0]??null,max=range.max??range.maximum??range.to??range[1]??null;const unit=String(range.unit||range.units||range.type||"");if(typeof min=="number"||typeof max=="number"){const qtd=(min??max)===(max??min)?min??max:`${min??"?"}\u2013${max??"?"}`,uteis=unit.includes("business");return`em ${qtd} ${uteis?"dias \xFAteis":"dias"}`}const dMin=_toDate(min),dMax=_toDate(max);if(dMin&&dMax){if(dMin.toDateString()===dMax.toDateString())return _rel(dMin);const diff=Math.max(0,Math.round((dMax-dMin)/864e5)),a=_rel(dMin),b=diff<=14?_rel(dMax):_fmt(dMax);return`entre ${a} e ${b}`}return dMin?`a partir de ${_rel(dMin)}`:dMax?`at\xE9 ${_rel(dMax)}`:""}connectedCallback(){this.form=this.querySelector("form"),this.open=this.querySelector(".insert-cep"),this.error=this.querySelector(".shipping-component-error"),this.form&&this.form.addEventListener("submit",this.apply),this.open&&this.open.addEventListener("click",this.toggle);const savedRates=localStorage.getItem("shippingRates"),selectedRate=localStorage.getItem("selectedShippingRate");savedRates&&selectedRate?this.renderSelected(JSON.parse(selectedRate)):savedRates&&this.renderList(JSON.parse(savedRates))}disconnectedCallback(){this.form&&this.form.removeEventListener("submit",this.apply),this.teardownRefazer()}toggle=e=>{e.preventDefault();const isOpen=this.dataset.open==="opened";if(this.dataset.open=isOpen?"closed":"opened",isOpen){const cepInput=this.form?.querySelector('[name="shipping-component"]');cepInput&&(cepInput.value=""),this.error.hidden=!0}this.open.textContent=isOpen?"Calcule seu frete":"Fechar"};apply=async e=>{e.preventDefault();const zip=(this.form.querySelector('[name="shipping-component"]')?.value||"").replace(/\D/g,"");if(zip.length!==8){this.error.textContent="Informe um CEP v\xE1lido (8 d\xEDgitos).",this.error.hidden=!1;return}const spinner=this.form.querySelector(".form-loading");spinner.classList.remove("hidden"),this.error.hidden=!0;try{const prepare=await fetch("/cart/prepare_shipping_rates.json",{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify({shipping_address:{zip,country:"Brazil",province:"MG"}})});if(!prepare.ok){const err=await prepare.json().catch(()=>({}));throw new Error(err?.errors||"N\xE3o foi poss\xEDvel iniciar o c\xE1lculo de frete.")}const params=new URLSearchParams({"shipping_address[zip]":zip,"shipping_address[country]":"Brazil","shipping_address[province]":"MG"}),rates=await this.pollRates(`/cart/shipping_rates.json?${params}`);if(!rates.length){this.error.textContent="Nenhuma op\xE7\xE3o de frete para este CEP.",this.error.hidden=!1;return}rates.sort((a,b)=>a.price-b.price),localStorage.setItem("shippingRates",JSON.stringify(rates)),this.renderList(rates)}catch(err){console.error(err),this.error.textContent=err.message||"Erro ao consultar frete. Tente novamente.",this.error.hidden=!1}finally{spinner.classList.add("hidden")}};pollRates=async(url,{tries=12,delay=500}={})=>{for(let i=0;i<tries;i++){const res=await fetch(url,{method:"GET",headers:{Accept:"application/json"}});if(res.ok){const data=await res.json();if(Array.isArray(data?.shipping_rates)&&data.shipping_rates.length)return data.shipping_rates}await new Promise(r=>setTimeout(r,delay))}return[]};renderList(rates){const result=this.querySelector(".selected-shipping-components"),wrapper=result.querySelector(".shipping-wrapper");wrapper.style.display="",result.classList.remove("hidden"),result.querySelector(".shipping-resume")?.remove(),this.classList.remove("shipping-component-applied"),wrapper.innerHTML=rates.map((r,i)=>`
79      <li>
80        <label>
81          <span class="shipping-name">
82            <input type="radio" name="shipping-option" value="${i}">
83            ${r.name}
84          </span>
85          <span class="shipping-price">${Number(r.price)===0?"Gr\xE1tis":this.fmtBRL(r.price)}</span>
86          <span class="shipping-date">chega at\xE9 ${this.deliveryHtml(r.delivery_range)}</span>
87        </label>
88      </li>
89    `).join(""),this.querySelectorAll('input[name="shipping-option"]').forEach(input=>{input.addEventListener("change",ev=>{const selected=rates[Number(ev.target.value)];localStorage.setItem("selectedShippingRate",JSON.stringify(selected)),this.renderSelected(selected),window.location.pathname==="/cart"&&setTimeout(()=>{window.location.reload()},500)})})}renderSelected(selected){const listBox=this.querySelector(".selected-shipping-components"),wrapper=listBox.querySelector(".shipping-wrapper");let resume=listBox.querySelector(".shipping-resume");resume||(resume=document.createElement("div"),resume.className="shipping-resume",listBox.appendChild(resume)),wrapper.style.display="none",listBox.classList.remove("hidden"),this.classList.add("shipping-component-applied");const prazo=this.deliveryHtml(selected.delivery_range);resume.innerHTML=`
90      <li class="shipping-component-item">
91        <span class="shipping-selected-wrapper">
92          <!-- \xEDcone omitido -->
93          <span>${selected.name} ${prazo?`(at\xE9 ${prazo})`:""}</span>
94        </span>
95        <span>${Number(selected.price)===0?"Gr\xE1tis":this.fmtBRL(selected.price)}</span>
96        <button type="button" class="remove-shipping-component" aria-label="Refazer c\xE1lculo">&#10005;</button>
97      </li>
98    `,this.setAttribute("data-open","closed"),this.teardownRefazer?.(),this._refazerBtn=resume.querySelector(".remove-shipping-component"),this._refazerBtn?.addEventListener("click",this.clearShipping)}teardownRefazer(){this._refazerBtn&&(this._refazerBtn.removeEventListener("click",this.clearShipping),this._refazerBtn=null)}clearShipping=()=>{localStorage.removeItem("shippingRates"),localStorage.removeItem("selectedShippingRate");const listBox=this.querySelector(".selected-shipping-components"),wrapper=listBox?.querySelector(".shipping-wrapper"),resume=listBox?.querySelector(".shipping-resume");resume&&resume.remove(),wrapper&&(wrapper.style.display=""),listBox?.classList.add("hidden"),this.classList.remove("shipping-component-applied"),this.dataset.open="opened",this.open.textContent="Fechar";const cepInput=this.form?.querySelector('[name="shipping-component"]');cepInput&&(cepInput.value="",cepInput.focus()),window.location.pathname==="/cart"&&setTimeout(()=>{window.location.reload()},500)}}customElements.define("cart-shipping-component",CartShipping);
99//# sourceMappingURL=/cdn/shop/t/9/assets/cart-tools.js.map?v=29607614840137471051766497979

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.