{"version":3,"file":"main.js","mappings":"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","sources":["webpack://build/../template6/assets/javascripts/common/lazyLoading.js","webpack://build/../template6/assets/javascripts/common/loadPurchase.js","webpack://build/../template6/assets/javascripts/components/utilities.js","webpack://build/../template6/assets/javascripts/common/cartDrawer.js","webpack://build/../template6/assets/javascripts/common/footer.js","webpack://build/../template6/assets/javascripts/common/header.js","webpack://build/../template6/assets/javascripts/common/webforms.js","webpack://build/../template6/assets/javascripts/components/vndaComponents.js","webpack://build/../template6/assets/javascripts/main.js"],"sourcesContent":["const LazyLoading = {\n threshold: window.innerWidth < 768 ? 350 : 600,\n nativeImageSupport: \"loading\" in HTMLImageElement.prototype,\n nativeIframeSupport: \"loading\" in HTMLIFrameElement.prototype,\n\n setForNativeLazy: function(element) {\n if (element.hasAttribute('src') || element.hasAttribute('srcset')) {\n // console.warn('Elemento já está com lazy load nativo configurado', element)\n return\n }\n\n if (element.hasAttribute('data-src')) {\n element.setAttribute('src', element.getAttribute('data-src'))\n }\n\n if (element.hasAttribute('data-srcset')) {\n element.setAttribute('srcset', element.getAttribute('data-srcset'))\n }\n \n if (element.hasAttribute('data-sizes')) {\n element.setAttribute('sizes', element.getAttribute('data-sizes'))\n }\n\n element.setAttribute('data-lazy-loaded', true)\n\n return true\n },\n\n update: function() {\n\n if (!this.nativeImageSupport || !this.nativeIframeSupport) {\n window.lazyLoadInstance.update()\n }\n\n return LazyLoading.init()\n },\n\n init: function() {\n const lazyImages = document.querySelectorAll(\"img.lazy\");\n const lazyIframes = document.querySelectorAll('iframe.lazy')\n\n if (LazyLoading.nativeImageSupport) {\n lazyImages.forEach(image => {\n LazyLoading.setForNativeLazy(image)\n });\n }\n\n if (LazyLoading.nativeIframeSupport) {\n lazyIframes.forEach(iframe => {\n LazyLoading.setForNativeLazy(iframe)\n })\n }\n\n // Caso tenha o suporte em um, mas não tenha no outro\n if (LazyLoading.nativeImageSupport && !LazyLoading.nativeIframeSupport) {\n lazyImages.forEach(image => {\n image.classList.remove('lazy')\n })\n }\n\n if (!LazyLoading.nativeImageSupport && LazyLoading.nativeIframeSupport) {\n lazyIframes.forEach(iframe => {\n iframe.classList.remove('lazy')\n })\n }\n\n\n // Adiciona vanilla lazy load caso não tenha suporte nativo para algum dos elementos\n if (!LazyLoading.nativeImageSupport || !LazyLoading.nativeIframeSupport) {\n const script = document.createElement('script')\n script.setAttribute('async', true)\n script.src = '/javascripts/lazyload.min.js'\n document.body.appendChild(script)\n\n window.lazyLoadOptions = {\n elements_selector: \".lazy\",\n threshold: LazyLoading.threshold\n };\n\n window.addEventListener(\"LazyLoad::Initialized\", event => {\n window.lazyLoadInstance = event.detail.instance\n }, { passive: true });\n }\n\n return window.lazyLoad = LazyLoading\n }\n}\n\nexport default LazyLoading\n","const LoadPurchase = {\n init: function() {\n const products = document.querySelectorAll('[data-product-box]:not([data-product-unique-id])')\n const observer = new IntersectionObserver(entries => {\n const intersecting = entries.filter(entry => { if (entry.isIntersecting) return entry })\n if (intersecting.length > 0) {\n const scriptEl = document.createElement('script')\n scriptEl.src = window.purchaseScript\n document.body.appendChild(scriptEl)\n observer.disconnect()\n }\n })\n\n return products.forEach(product => { observer.observe(product) }, { threshold: 0.1 })\n }\n}\n\nexport default LoadPurchase\n","// ===============================================================\n// ADIÇÃO MANUAL DE ASSET\n// ===============================================================\n// Usado para incluir assets no código de forma manual, conforme a necessidade\nexport function addAsset(source, onloadCallback) {\n\n if (!source || source === '') return console.error(`addAsset: caminho não definido.`)\n\n if (source.includes('.js')) {\n const scriptTag = document.createElement('script')\n scriptTag.setAttribute('src', source);\n\n if (onloadCallback && typeof onloadCallback === 'function') {\n scriptTag.onload = onloadCallback\n }\n\n return document.body.appendChild(scriptTag)\n\n } else if (source.includes('.css')) {\n const linkTag = document.createElement('link')\n linkTag.setAttribute('rel', 'stylesheet')\n linkTag.setAttribute('type', 'text/css')\n linkTag.setAttribute('href', source)\n return document.head.appendChild(linkTag)\n\n } else {\n const error = `addAsset: Erro ao criar o asset. Tipo de script não definido, ou não possui tratamento para este tipo de asset.`\n return console.error(error, source)\n }\n}\n\n// ===============================================================\n// BUSCA O CARRINHO ATIVO\n// ===============================================================\nexport async function getCart() {\n try {\n const response = await fetch('/carrinho', {\n headers: {\n 'Accept': 'application/json'\n }\n });\n\n return await response.json()\n\n } catch (error) {\n console.error('Erro ao buscar os dados do carrinho');\n console.error(error);\n return false\n }\n}\n\n// ===============================================================\n// SERIALIZE ARRAY\n// ===============================================================\nexport function serializeArray(form) {\n\n const formData = new FormData(form);\n const data = {};\n\n for (const [name, value] of formData) {\n data[name] = value\n }\n\n const formBody = [];\n\n for (const key in data) {\n const encodeKey = encodeURIComponent(key)\n const encodeValue = encodeURIComponent(data[key])\n formBody.push(`${encodeKey}=${encodeValue}`)\n }\n\n return formBody.join('&')\n \n}\n\n// ===============================================================\n// URL ENCODE FORM DATA\n// ===============================================================\nexport function urlencodeFormData(formData) {\n let string = '';\n\n function encode(s) {\n return encodeURIComponent(s).replace(/%20/g, '+');\n }\n\n for (const pair of formData.entries()) {\n if (typeof pair[1] == 'string') {\n string += (string ? '&' : '') + encode(pair[0]) + '=' + encode(pair[1]);\n }\n }\n return string;\n}\n\n// ===============================================================\n// SLIDE TOGGLE\n// ===============================================================\nexport function slideToggle(contentWrapper, content, duration = 500) {\n let initialHeight = window.getComputedStyle(contentWrapper).height;\n\n if (initialHeight == '0px') {\n return slideDown(contentWrapper, content, duration);\n } else {\n return slideUp(contentWrapper, duration);\n }\n}\n\n// ===============================================================\n// SLIDE UP\n// ===============================================================\nexport function slideUp(contentWrapper, duration = 500) {\n contentWrapper.style.height = '0px';\n contentWrapper.style.transition = `height ${duration} ease`;\n}\n\n// ===============================================================\n// SLIDE DOWN\n// ===============================================================\nexport function slideDown(contentWrapper, content, duration = 500) {\n let innerHeight = content.clientHeight;\n\n contentWrapper.style.height = `${innerHeight}px`;\n contentWrapper.style.transition = `height ${duration} ease`;\n}\n\n// ===============================================================\n// UPDATE DISCOUNT IN PRODUCT BLOCK\n// ===============================================================\nexport function updatePriceBlock() {\n const priceEls = document.querySelectorAll('[data-init-price]');\n\n if (priceEls == null) return;\n\n priceEls.forEach((priceEl) => {\n const discount = priceEl.dataset.discountPercent;\n\n priceEl.dispatchEvent(new Event('change'));\n\n // discount\n if (discount != '0') {\n priceEl.style.setProperty('--discount', `'-${discount}%'`);\n }\n });\n}\n\n// ===============================================================\n// PREÇO POR FETCH\n// ===============================================================\nexport function getPriceProd() {\n const selectors = document.querySelectorAll('[data-update-price]');\n const attr = 'data-update-price';\n\n if (selectors.length > 0) {\n selectors.forEach((selector) => {\n const prodId = selector.getAttribute(attr)\n const url = `/produto/preco/${prodId}`;\n\n if (prodId !== '' && prodId !== null) {\n fetch(url, {\n method: 'GET',\n })\n .then((response) => response.text())\n .then((resp) => {\n selector.innerHTML = resp;\n })\n .catch((error) => {\n console.error(error);\n });\n }\n });\n }\n}\n\n// ===============================================================\n// DEBOUNCE\n// ===============================================================\n/*\n Debounce retorna uma função que enquanto continuar sendo chamada não é executada\n A função só será executada quando para de ser chamada por N milisegundos\n Útil para melhorar a performance de códigos que são executados muitas vezes por segundo, como o $(window).resize()\n\n Ex:\n \n $(window).resize(debounce(function() {\n // código a ser executado\n }, 500))\n \n No exemplo acima a função só será executada 500ms depois do último resize\n Abra o link abaixo e redimensione a janela branca e acompanhe o output do console\n Exemplo codepen: https://codepen.io/valkervieira/pen/oNgqyWY\n\n Um caso comum de uso é em lojas onde a seleção de um filtro na página de tag recarrega automáticamente a página\n Com o debounce o usuário pode escolher vários filtros rapidamente e a página só recarrega quando parar de escolher\n*/\n\nexport function debounce(func, wait, immediate) {\n var timeout;\n immediate || (immediate = true);\n\n return function () {\n var context = this,\n args = arguments;\n\n var later = function () {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n\n var callNow = immediate && !timeout;\n\n clearTimeout(timeout);\n\n timeout = setTimeout(later, wait);\n\n if (callNow) func.apply(context, args);\n };\n}\n\n// ===============================================================\n// THROTTLE\n// ===============================================================\n/*\n Throttle diminui a frequencia que uma função é executada\n Enquanto no debounce a função só é executada quando para de ser chamada, no throttle ela\n continua sendo executada só que em um intervalo mínimo de N milisegundos (default = 250)\n\n Ex:\n\n $(window).resize(throttle() {\n // código a ser executado\n }, 500)\n\n No exemplo acima a função resize é chamada várias vezes por segundo mas só é executada 1 vez a cada 500ms\n Abra o link abaixo, redimensione a janela branca e acompanhe o console\n Exemplo codepen: https://codepen.io/valkervieira/pen/yLyKEPW\n\n Um caso comum de uso é checar se o scroll passou de um determinado ponto, para fixar um header ou alterar algum elemento do DOM\n*/\nexport function throttle(fn, threshhold, scope) {\n threshhold || (threshhold = 250);\n var last, deferTimer;\n return function () {\n var context = scope || this;\n\n var now = +new Date(),\n args = arguments;\n if (last && now < last + threshhold) {\n // hold on to it\n clearTimeout(deferTimer);\n deferTimer = setTimeout(function () {\n last = now;\n fn.apply(context, args);\n }, threshhold);\n } else {\n last = now;\n fn.apply(context, args);\n }\n };\n}\n\n// ===============================================================\n// FORMAT MONEY\n// ===============================================================\nexport function formatMoney(value) {\n // FORMATA UM VALOR\n return (\n 'R$ ' +\n value\n .toFixed(2)\n .replace('.', ',')\n .replace(/(\\d)(?=(\\d{3})+\\,)/g, '$1.')\n );\n}\n\n// ===============================================================\n// FORMAT VALUE\n// ===============================================================\n\nexport const formatValue = function (value = '') {\n let parsedValue = value;\n if (typeof value === 'number') {\n parsedValue = value.toFixed(2).toString();\n }\n return parsedValue.replace('.', ',');\n};\n\n// ===============================================================\n// VALIDA QUANTIDADE\n// ===============================================================\nexport function validateQuantity(_val) {\n // VALIDA SE A QUANTIDADE INFORMADA É UM NÚMERO\n if (!isNaN(_val)) {\n if (parseInt(_val) > 0) {\n return true;\n }\n }\n\n return false;\n}\n\n// ===============================================================\n// CLEAR NUMBER\n// ===============================================================\nexport function getClearNumber(_val) {\n // RETORNA UM NÚMERO LIMPO COMO INT\n if (!isNaN(_val)) {\n var clearNumber = parseInt(_val);\n\n return clearNumber;\n }\n\n return false;\n}\n\n// ===============================================================\n// BUSCA\n// ===============================================================\nexport function setSearch() {\n const toggleButton = document.querySelectorAll('[data-toggle-search]');\n const search = document.querySelector('[data-search-container]');\n const input = document.querySelector('[data-search-input]');\n\n toggleButton.length > 0 && toggleButton.forEach(button => {\n button.addEventListener('click', () => {\n\n if (search.classList.contains('open')) {\n search.classList.remove('open');\n\n } else {\n search.classList.add('open');\n setTimeout(() => { input.focus() }, 400);\n }\n })\n })\n}\n\n// ===============================================================\n// BUSCA OS DADOS DO CLIENTE\n// ===============================================================\nexport async function getClient() {\n try {\n const response = await fetch('/conta/cliente', {\n headers: {\n 'accept': 'application/json',\n 'Content-Type': 'application/json',\n 'cache': 'no-store'\n }\n });\n const client = await response.json();\n const access = Object.keys(client).length > 0;\n\n if (access) {\n window.client = client;\n\n return client\n\n } else {\n return null\n }\n\n } catch (error) { console.error(`getClient error`, error) }\n}\n\n// ===============================================================\n// MÁSCARA PARA INPUTS\n// ===============================================================\nexport function formMasks() {\n const\n inputPhones = document.querySelectorAll('[data-phone-mask]'),\n inputCEPs = document.querySelectorAll('[data-cep-mask]'),\n inputCPFs = document.querySelectorAll('[data-cpf-mask]'),\n inputCNPJs = document.querySelectorAll('[data-cnpj-mask]'),\n inputDatesOfBirth = document.querySelectorAll('[data-birth-mask]');\n\n inputPhones.length > 0 && inputPhones.forEach(input => {\n input.addEventListener('input', (e) => {\n //(XX) XXXXX-XXXX\n var phoneValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,2})(\\d{0,5})(\\d{0,4})/);\n e.target.value = !phoneValue[2] ? phoneValue[1] : '(' + phoneValue[1] + ') ' + phoneValue[2] + (phoneValue[3] ? '-' + phoneValue[3] : '');\n });\n })\n\n inputCEPs.length > 0 && inputCEPs.forEach(input => {\n input.addEventListener('input', (e) => {\n //XXXXX-XX\n var cepValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,5})(\\d{0,3})/);\n e.target.value = !cepValue[2] ? cepValue[1] : cepValue[1] + '-' + cepValue[2];\n })\n })\n\n inputCPFs.length > 0 && inputCPFs.forEach(input => {\n input.addEventListener('input', (e) => {\n //XXX.XXX.XXX-XX\n var cpfValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,3})(\\d{0,3})(\\d{0,3})(\\d{0,2})/);\n e.target.value = !cpfValue[2] ? cpfValue[1] : cpfValue[1] + '.' + cpfValue[2] + (cpfValue[3] ? '.' + cpfValue[3] : '') + (cpfValue[4] ? '-' + cpfValue[4] : '');\n })\n })\n\n inputCNPJs.length > 0 && inputCNPJs.forEach(input => {\n input.addEventListener('input', (e) => {\n //XX.XXX.XXX/XXXX-XX\n var cnpjValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,2})(\\d{0,3})(\\d{0,3})(\\d{0,4})(\\d{0,2})/);\n e.target.value = !cnpjValue[2] ? cnpjValue[1] : cnpjValue[1] + '.' + cnpjValue[2] + (cnpjValue[3] ? '.' + cnpjValue[3] : '') + (cnpjValue[4] ? '/' + cnpjValue[4] : '') + (cnpjValue[5] ? '-' + cnpjValue[5] : '');\n })\n })\n\n inputDatesOfBirth.length > 0 && inputDatesOfBirth.forEach(input => {\n input.addEventListener('input', (e) => {\n // XXXX-XX-XX\n var dateOfBirthValue = e.target.value.replace(/\\D/g, '').match(/(\\d{0,2})(\\d{0,2})(\\d{0,4})/);\n e.target.value = !dateOfBirthValue[2] ? dateOfBirthValue[1] : dateOfBirthValue[1] + '/' + dateOfBirthValue[2] + (dateOfBirthValue[3] ? '/' + dateOfBirthValue[3] : '');\n });\n })\n}","import { addAsset } from '../components/utilities';\n\nconst CartDrawer = {\n root: document.querySelector('#component-cart-drawer-root'),\n buttons: document.querySelectorAll('[data-toggle-cart]'),\n countWrapper: document.querySelector('[data-cart-count]'),\n settings: window.cartDrawerSettings || false,\n\n setCartDrawer: function () {\n const { settings, root } = CartDrawer;\n\n if (!root || !settings) return;\n\n // Define frete grátis\n const freeShipping = settings.freeShippingValue > 1 ? settings.freeShippingValue : 0;\n\n // Inicia o componente\n const componentCartDrawer = new Vnda.Component.CartDrawer({\n anchor: 'right',\n display: 'list',\n startOpen: false,\n titleCart: 'Carrinho de compras',\n titleSuggested: window.cartDrawerSettings.titleSuggested,\n suggestedProductsTag: 'sugestoes-carrinho',\n widthItemSuggested: 25,\n disableShippingCalculation: true,\n freeShipping,\n });\n\n // Renderiza o componente\n componentCartDrawer.render(root);\n\n // Salva instância para acesso global\n window.cartDrawerSettings.instance = componentCartDrawer;\n CartDrawer.settings = window.cartDrawerSettings;\n\n // dispara evento de carregamento, escutado por CartDrawer.show()\n root.dispatchEvent(new Event('vnda:cart-drawer-loaded'));\n },\n\n loadComponent: function () {\n const { settings } = CartDrawer;\n addAsset(settings.script, CartDrawer.setCartDrawer);\n addAsset(settings.styles);\n },\n\n handleCartButton: function (button) {\n // Evita múltiplos cliques caso o carrinho precisa ser instanciado primeiro\n if (button.classList.contains('-loading')) {\n return;\n }\n\n // Abre o cart drawer\n button.classList.add('-loading');\n CartDrawer.show(() => {\n button.classList.remove('-loading');\n });\n },\n\n show: function (callback) {\n const { root } = CartDrawer;\n\n // No mobile, fecha o menu primeiro\n if (window.mmenu) window.mmenu.close();\n\n // Instancia o componente, caso ainda não exista\n if (!CartDrawer.settings.instance) CartDrawer.loadComponent();\n\n // Observa criação da instância inicial, caso não tenha\n if (CartDrawer.settings.instance === false) {\n root.addEventListener('vnda:cart-drawer-loaded', () => {\n CartDrawer.settings.instance.open();\n if (typeof callback === 'function') callback();\n });\n } else {\n // Já possui cart drawer instanciado, retorna abertura\n CartDrawer.settings.instance.open();\n if (typeof callback === 'function') callback();\n }\n },\n\n getCartItens: async function () {\n try {\n const response = await fetch('/carrinho/itens');\n const itens = await response.json();\n return itens;\n } catch (error) {\n console.error('Erro ao buscar a quantidade de produtos do carrinho');\n console.error(error);\n return 0;\n }\n },\n\n updateCartCount: async function (_itemsCount = null) {\n let items = _itemsCount;\n if (_itemsCount == null) items = await CartDrawer.getCartItens();\n\n this.countWrapper.innerHTML = items;\n },\n\n init: function () {\n const _this = this;\n const { buttons } = _this;\n\n // Atualiza o contador de itens do carrinho\n _this.updateCartCount();\n\n if (buttons.length > 0)\n buttons.forEach((button) => {\n button.addEventListener('click', () => {\n _this.handleCartButton(button);\n });\n });\n },\n};\n\nexport default CartDrawer;\n","const Footer = {\n handleSubmenu: function () {\n const menus = document.querySelectorAll('[data-action=\"toggle-menu-footer\"]');\n\n menus.length > 0 && menus.forEach((menu) => {\n menu.addEventListener('click', () => {\n menu.classList.toggle('-open', !menu.classList.contains('-open'));\n });\n });\n },\n init: function () {\n const _this = this;\n\n _this.handleSubmenu();\n },\n};\n\nexport default Footer;\n","const Header = {\n lastScrollTop: -1,\n scrollTop: window.scrollY,\n header: document.querySelector('#header'),\n\n setScroll: function (scrollTop, lastScrollTop) {\n const _this = this;\n\n if (scrollTop <= 0) {\n _this.header.classList.add('scroll-up');\n _this.header.classList.remove('scroll-down');\n _this.header.classList.add('on-top');\n } else {\n if (_this.header.classList.contains('on-top')) {\n _this.header.classList.remove('on-top');\n }\n if (scrollTop > lastScrollTop) {\n _this.header.classList.add('scroll-down');\n _this.header.classList.remove('scroll-up');\n } else {\n _this.header.classList.add('scroll-up');\n _this.header.classList.remove('scroll-down');\n }\n }\n },\n\n searchButton: function () {\n const searchButton = document.querySelector('[data-action=\"show-form-search\"]');\n const searchButtonClose = document.querySelector('[data-action=\"hide-form-search\"]');\n const formSearch = document.querySelector('.header-search');\n const formSearchInput = document.querySelector('.header-search input');\n\n if (!formSearch) return;\n\n searchButton &&\n searchButton.addEventListener('click', () => {\n formSearch.classList.toggle('-active', !formSearch.classList.contains('-active'));\n\n formSearchInput && formSearchInput.focus();\n\n if (window.innerWidth > 768) {\n document.addEventListener('scroll', () => {\n formSearch.classList.remove('-active');\n });\n }\n });\n\n searchButtonClose &&\n searchButtonClose.addEventListener('click', () => {\n formSearch.classList.remove('-active');\n });\n\n // Desativa o popup de busca - quando necessário\n formSearch.addEventListener('click', (e) => {\n if (e.target.className == 'header-search -active') {\n formSearch.classList.remove('-active');\n }\n });\n },\n\n init: function () {\n const _this = this;\n\n _this.setScroll(_this.scrollTop, _this.lastScrollTop);\n _this.searchButton();\n\n // Atualiza o header quando a page recebe scroll\n window.addEventListener('scroll', function () {\n const newSt = window.scrollY;\n\n _this.setScroll(newSt, _this.lastScrollTop);\n _this.lastScrollTop = newSt;\n });\n },\n};\n\nexport default Header;\n","import { serializeArray, urlencodeFormData } from '../components/utilities';\n\nconst Webforms = {\n submitWebForm: async function (form, email) {\n const formData = serializeArray(form);\n const textBtnDefault = form.querySelector('.action').innerHTML;\n\n if (typeof email == 'undefined' || email == '') {\n email = form.querySelector('[name=\"email\"]').value;\n }\n\n form.querySelector('[name=\"reply_to\"]').value = email;\n\n if (!form.classList.contains('sending')) {\n\n form.classList.add('sending');\n form.classList.remove('error');\n form.querySelector('.action').innerHTML = 'Enviando';\n\n try {\n const response = await fetch('/webform', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\n },\n body: formData\n })\n\n if (response.ok) {\n console.info('Formulário enviado com sucesso');\n form.classList.add('sent');\n form.querySelector('.msg-success').classList.add('-visible');\n form.querySelector('.action').innerHTML = 'Enviado';\n form.reset();\n\n setTimeout(function () {\n form.classList.remove('sent');\n form.querySelector('.msg-success').classList.remove('-visible');\n form.querySelector('.action').innerHTML = textBtnDefault;\n }, 3500);\n } else {\n\n const text = await response.text();\n\n console.error(`Ocorreu um erro no envio do formulário. Erro ${response.status}`);\n console.error(text);\n\n form.classList.add('error');\n form.querySelector('.msg-error').classList.add('-visible');\n form.querySelector('.action').innerHTML = 'Falha ao enviar';\n\n setTimeout(function () {\n form.classList.remove('error');\n form.querySelector('.msg-error').classList.remove('-visible');\n form.querySelector('.action').innerHTML = textBtnDefault;\n }, 3500);\n\n }\n\n } catch (error) {\n console.error('Erro ao enviar o webform');\n console.error(error);\n\n form.classList.add('error');\n form.querySelector('.msg-error').classList.add('-visible');\n form.querySelector('.action').innerHTML = 'Falha ao enviar';\n\n setTimeout(function () {\n form.classList.remove('error');\n form.querySelector('.msg-error').classList.remove('-visible');\n form.querySelector('.action').innerHTML = textBtnDefault;\n }, 3500);\n }\n\n form.classList.remove('sending');\n }\n },\n submitNotify: async function (form) {\n const formData = new FormData(form);\n const btnTextDefault = form.querySelector('.action').innerHTML;\n\n // Manipula o campo de telefone\n const inputPhone = form.querySelector('#phone-notify-when-arrives');\n if (inputPhone) {\n const phoneNumber = inputPhone.value;\n const phoneArea = phoneNumber.substring(1, 3);\n const phone = phoneNumber.substring(5, 16).replace(/\\D/g, '');\n\n formData.append(\"phone_area\", phoneArea);\n formData.append(\"phone\", phone);\n formData.delete(\"phone_number\");\n }\n\n if (!form.classList.contains('sending')) {\n\n form.classList.remove('error');\n form.classList.add('sending');\n form.querySelector('.action').innerHTML = 'Enviando';\n\n try {\n\n const response = await fetch('/lista_de_espera', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\n },\n body: urlencodeFormData(formData)\n })\n\n if (response.ok) {\n form.classList.remove('sending');\n \n // Envia um webform de aviso de cadastro\n console.log('Lista de espera enviada com sucesso');\n Webforms.submitWebForm(form);\n\n } else {\n const text = await response.text();\n console.error(`Ocorreu um erro ao enviar o formulário de Lista de Espera. Erro ${response.status}`)\n console.error(text);\n\n form.classList.add('error');\n form.querySelector('.msg-error').classList.add('-visible');\n form.querySelector('.action').innerHTML = 'Falha ao enviar';\n\n setTimeout(() => {\n form.classList.remove('error');\n form.querySelector('.msg-error').classList.remove('-visible');\n form.querySelector('.action').innerHTML = btnTextDefault;\n }, 3500);\n }\n\n } catch (error) {\n console.error('Falha ao enviar lista de espera. Verificar integração.');\n console.error(error);\n\n form.classList.add('error');\n form.querySelector('.msg-error').classList.add('-visible');\n form.querySelector('.action').innerHTML = 'Falha ao enviar';\n\n setTimeout(() => {\n form.classList.remove('error');\n form.querySelector('.msg-error').classList.remove('-visible');\n form.querySelector('.action').innerHTML = btnTextDefault;\n }, 3500);\n }\n\n form.classList.remove('sending');\n }\n },\n showMessage: function (input, form) {\n const alertMessage = form.querySelector('[data-msg]');\n\n alertMessage.classList.add('-visible');\n alertMessage.innerText = 'Preencha os campos obrigatórios';\n\n input.classList.add('-emphasis')\n\n setTimeout(() => {\n\n alertMessage.classList.remove('-visible');\n alertMessage.innerText = '';\n\n input.classList.remove('-emphasis')\n\n }, 2000)\n\n },\n validateForm: function (vndaInput, form) {\n let submitAllowed = true;\n\n // Permite o envio se o input vnda estiver vazio\n if (vndaInput.value == '') {\n vndaInput.setAttribute('required', false);\n\n // Valida se os campos obrigatórios estão preenchidos\n const requiredFields = form.querySelectorAll('[required]:not([required=false])');\n requiredFields.forEach(input => {\n\n if (input.value == '') {\n submitAllowed = false;\n Webforms.showMessage(input, form);\n }\n\n if (input.type == 'checkbox' && input.checked == false) {\n submitAllowed = false;\n Webforms.showMessage(input, form);\n }\n\n })\n\n if (submitAllowed) form.id == 'form-notify' ? Webforms.submitNotify(form) : Webforms.submitWebForm(form)\n }\n },\n setWebForms: function () {\n const webForms = document.querySelectorAll('[data-webform]');\n\n webForms.length > 0 && webForms.forEach(form => {\n\n const button = form.querySelector('button');\n const fieldset = form.querySelector('fieldset');\n\n // Desabilita os campos do formulário, através do fieldset, quando o input vnda recebe algum valor \n let vndaInput = form.querySelector('input[name=\"vnda\"]');\n vndaInput.addEventListener('input', () => fieldset.setAttribute('disabled', true))\n\n // Realiza o envio através do clique e da tecla enter sobre o botão do formulário\n button && button.addEventListener('click', () => Webforms.validateForm(vndaInput, form));\n button && button.addEventListener('keypress', (e) => {\n if (e.key === 'Enter') Webforms.validateForm(vndaInput, form);\n })\n\n })\n },\n init: function () {\n const _this = this;\n _this.setWebForms();\n },\n};\n\nexport default Webforms;\n","import { addAsset } from './utilities';\n\n// ===============================================================\n// NEWSLETTER POPUP\n// ===============================================================\nexport const NewsletterComponent = {\n root: document.querySelector('#component-popup-newsletter-root'),\n settings: window.popupNewsletterSettings || false,\n loaded: false,\n\n setPopupNewsletter: function () {\n const { settings, root } = NewsletterComponent;\n\n // Define propriedades do componente\n let maxWidth = settings.maxWidth;\n let imageUrl = settings.imageUrl;\n let title = settings.title;\n let description = settings.description;\n let extraDescription = settings.extraDescription;\n let subdomain = settings.subdomain;\n let successMessage = settings.success;\n\n // Inicia o componente\n const componentNewsletterPopup = new Vnda.Component.NewsletterPopup({\n maxWidth: maxWidth,\n maxHeight: 500,\n imageUrl: imageUrl,\n imagePosition: 'left',\n popupPosition: 'center',\n title: title,\n description: description,\n extraDescription: extraDescription,\n textBtnSubmit: 'Enviar',\n classBtnSubmit: 'button-newsletter',\n formKey: `${subdomain}-newsletter`,\n hasNameField: false,\n hasLastNameField: false,\n hasDateOfBirthField: false,\n hasPhoneField: false,\n successMessage: successMessage,\n delay: 500,\n frequency: '7',\n language: 'pt-BR',\n placeholders: {\n // firstName: 'Nome',\n // lastName: 'Sobrenome',\n // phone: 'Telefone',\n email: 'Digite seu e-mail',\n },\n });\n\n // Renderiza o componente e marca como carregado\n componentNewsletterPopup.render(root);\n NewsletterComponent.loaded = true;\n },\n\n loadPopupNewsletter: function () {\n if (!NewsletterComponent.loaded) {\n const { settings } = NewsletterComponent;\n addAsset(settings.script, NewsletterComponent.setPopupNewsletter);\n addAsset(settings.styles);\n }\n },\n\n init: function () {\n const { root, settings } = this;\n\n if (!root || !settings) return;\n\n const eventType = window.innerWidth <= 1024 ? 'scroll' : 'mousemove';\n window.addEventListener(\n eventType,\n () => {\n NewsletterComponent.loadPopupNewsletter();\n },\n { once: true }\n );\n },\n};\n\n// ===============================================================\n// PREÇO\n// ===============================================================\n// Carrega o componente de preço quando um product-block ou product-infos entra em tela\nexport const PriceComponent = {\n script: window.priceComponent || false,\n loaded: false,\n\n init: function () {\n if (!PriceComponent.script) return;\n\n const productContainers = document.querySelectorAll('[data-product-box]');\n\n if (productContainers.length === 0) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n if (!PriceComponent.loaded) {\n addAsset(PriceComponent.script);\n PriceComponent.loaded = true;\n }\n observer.disconnect();\n break;\n }\n }\n },\n { threshold: 0.1 }\n );\n\n productContainers.forEach((product) => {\n observer.observe(product);\n });\n },\n};\n","import LazyLoading from './common/lazyLoading';\nimport LoadPurchase from './common/loadPurchase.js';\nimport CartDrawer from './common/cartDrawer';\nimport Footer from './common/footer';\nimport Header from './common/header';\nimport Webforms from './common/webforms';\nimport { NewsletterComponent, PriceComponent } from './components/vndaComponents.js';\nimport { setSearch } from './components/utilities';\n\n// ==========================================\n// Inicialização\n// ==========================================\nconsole.log(\n '%cOlist - Soluções de vendas online e Serviços de E-commerce',\n 'color: #0a4ee4; font-size: 14px; font-family: \"Verdana\", sans-serif; font-weight: bold;'\n);\n\nwindow.addEventListener('DOMContentLoaded', () => {\n Header.init();\n LazyLoading.init();\n LoadPurchase.init();\n PriceComponent.init();\n CartDrawer.init();\n Footer.init();\n Webforms.init();\n NewsletterComponent.init();\n setSearch();\n});\n"],"names":["LazyLoading","threshold","window","innerWidth","nativeImageSupport","HTMLImageElement","prototype","nativeIframeSupport","HTMLIFrameElement","setForNativeLazy","element","hasAttribute","setAttribute","getAttribute","update","this","lazyLoadInstance","init","lazyImages","document","querySelectorAll","lazyIframes","forEach","image","iframe","classList","remove","script","createElement","src","body","appendChild","lazyLoadOptions","elements_selector","addEventListener","event","detail","instance","passive","lazyLoad","products","observer","IntersectionObserver","entries","filter","entry","isIntersecting","length","scriptEl","purchaseScript","disconnect","product","observe","addAsset","source","onloadCallback","console","error","includes","scriptTag","onload","linkTag","head","urlencodeFormData","formData","string","encode","s","encodeURIComponent","replace","pair","CartDrawer","root","querySelector","buttons","countWrapper","settings","cartDrawerSettings","setCartDrawer","freeShipping","freeShippingValue","componentCartDrawer","Vnda","Component","anchor","display","startOpen","titleCart","titleSuggested","suggestedProductsTag","widthItemSuggested","disableShippingCalculation","render","dispatchEvent","Event","loadComponent","styles","handleCartButton","button","contains","add","show","callback","mmenu","close","open","getCartItens","async","response","fetch","json","updateCartCount","_itemsCount","items","innerHTML","_this","handleSubmenu","menus","menu","toggle","lastScrollTop","scrollTop","scrollY","header","setScroll","searchButton","searchButtonClose","formSearch","formSearchInput","focus","e","target","className","newSt","Webforms","submitWebForm","form","email","FormData","data","name","value","formBody","key","encodeKey","encodeValue","push","join","serializeArray","textBtnDefault","method","headers","ok","info","reset","setTimeout","text","status","submitNotify","btnTextDefault","inputPhone","phoneNumber","phoneArea","substring","phone","append","delete","log","showMessage","input","alertMessage","innerText","validateForm","vndaInput","submitAllowed","type","checked","id","setWebForms","webForms","fieldset","NewsletterComponent","popupNewsletterSettings","loaded","setPopupNewsletter","maxWidth","imageUrl","title","description","extraDescription","subdomain","successMessage","success","NewsletterPopup","maxHeight","imagePosition","popupPosition","textBtnSubmit","classBtnSubmit","formKey","hasNameField","hasLastNameField","hasDateOfBirthField","hasPhoneField","delay","frequency","language","placeholders","loadPopupNewsletter","eventType","once","PriceComponent","priceComponent","productContainers","toggleButton","search","setSearch"],"sourceRoot":""}