{"version":3,"file":"main.js","mappings":"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","sources":["webpack://build/../otimizi/assets/javascripts/components/utilities.js","webpack://build/../otimizi/assets/javascripts/common/cartDrawer.js","webpack://build/../otimizi/assets/javascripts/common/footer.js","webpack://build/../otimizi/assets/javascripts/common/header.js","webpack://build/../otimizi/node_modules/mmenu-light/esm/modules/match-media-toggler/index.js","webpack://build/../otimizi/node_modules/mmenu-light/esm/modules/helpers.js","webpack://build/../otimizi/node_modules/mmenu-light/esm/modules/sliding-panels-navigation/index.js","webpack://build/../otimizi/node_modules/mmenu-light/esm/modules/offcanvas-drawer/index.js","webpack://build/../otimizi/node_modules/mmenu-light/esm/core/index.js","webpack://build/../otimizi/node_modules/mmenu-light/src/mmenu-light.js","webpack://build/../otimizi/assets/javascripts/common/menuMobile.js","webpack://build/../otimizi/assets/javascripts/components/popup.js","webpack://build/../otimizi/assets/javascripts/common/webforms.js","webpack://build/../otimizi/assets/javascripts/components/store.js","webpack://build/../otimizi/assets/javascripts/components/productPurchase.js","webpack://build/../otimizi/assets/javascripts/components/vndaComponents.js","webpack://build/../otimizi/assets/javascripts/main.js"],"sourcesContent":["// ===============================================================\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 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 } 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 } 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 const cart = await response.json();\n return cart;\n } catch (error) {\n console.error('Erro ao buscar os dados do carrinho');\n console.error(error);\n }\n}\n\n// ===============================================================\n// SERIALIZE ARRAY\n// ===============================================================\nexport function serializeArray(form) {\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// 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 AJAX\n// ===============================================================\nexport function getPriceProd() {\n var selectors = document.querySelectorAll('[data-update-price]');\n var attr = 'update-price';\n\n if (selectors.length() > 0) {\n selectors.forEach((selector) => {\n var prodId = selector.dataset(attr);\n var url = '/produto/preco/' + prodId;\n\n if (prodId != '' && prodId != null) {\n $.ajax({\n url: url,\n type: 'GET',\n })\n .done((resp) => {\n selector.innerHTML = resp;\n })\n .fail((resp) => {\n console.error(resp);\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 &&\n toggleButton.forEach((button) => {\n button.addEventListener('click', () => {\n if (search.classList.contains('open')) {\n search.classList.remove('open');\n } else {\n search.classList.add('open');\n setTimeout(() => {\n input.focus();\n }, 400);\n }\n });\n });\n}\n\n// ===============================================================\n// CONDITIONAL LAZY\n// ===============================================================\nexport function handleConditionalLazy() {\n const eventType = window.innerWidth <= 1024 ? 'scroll' : 'mousemove';\n window.addEventListener(\n eventType,\n () => {\n const conditionalLazyElements = document.querySelectorAll('[data-conditional-lazy]');\n conditionalLazyElements.length > 0 &&\n conditionalLazyElements.forEach((element) => {\n element.classList.add('lazy');\n window.lazyLoadInstance && window.lazyLoadInstance.update();\n });\n },\n { once: true }\n );\n}\n\n// ===============================================================\n// MÁSCARA PARA INPUTS\n// ===============================================================\nexport function formMasks() {\n const inputPhone = document.querySelector('[data-phone-mask]'),\n inputCEP = document.querySelector('[data-cep-mask]'),\n inputCPF = document.querySelector('[data-cpf-mask]'),\n inputCNPJ = document.querySelector('[data-cnpj-mask]');\n\n inputPhone &&\n inputPhone.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]\n ? phoneValue[1]\n : '(' + phoneValue[1] + ') ' + phoneValue[2] + (phoneValue[3] ? '-' + phoneValue[3] : '');\n });\n\n inputCEP &&\n inputCEP.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 inputCPF &&\n inputCPF.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]\n ? cpfValue[1]\n : cpfValue[1] +\n '.' +\n cpfValue[2] +\n (cpfValue[3] ? '.' + cpfValue[3] : '') +\n (cpfValue[4] ? '-' + cpfValue[4] : '');\n });\n\n inputCNPJ &&\n inputCNPJ.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]\n ? cnpjValue[1]\n : cnpjValue[1] +\n '.' +\n cnpjValue[2] +\n (cnpjValue[3] ? '.' + cnpjValue[3] : '') +\n (cnpjValue[4] ? '/' + cnpjValue[4] : '') +\n (cnpjValue[5] ? '-' + cnpjValue[5] : '');\n });\n}\n\n\n","import { addAsset } from \"../components/utilities\";\r\n\r\nconst CartDrawer = {\r\n root: document.querySelector('#component-cart-drawer-root'),\r\n buttons: document.querySelectorAll('[data-toggle-cart]'),\r\n countWrapper: document.querySelector('[data-cart-count]'),\r\n settings: window.cartDrawerSettings || false,\r\n\r\n setCartDrawer: function() {\r\n const { settings, root } = CartDrawer;\r\n\r\n if (!root || !settings) return;\r\n \r\n // Define frete grátis\r\n const freeShipping = (settings.freeShippingValue > 1) ? settings.freeShippingValue : 0\r\n\r\n // Inicia o componente\r\n const componentCartDrawer = new Vnda.Component.CartDrawer({\r\n anchor: 'right',\r\n display: 'list',\r\n startOpen: false,\r\n titleCart: 'Carrinho de compras',\r\n disableShippingCalculation: true,\r\n freeShipping\r\n });\r\n\r\n // Renderiza o componente\r\n componentCartDrawer.render(root);\r\n\r\n // Salva instância para acesso global\r\n window.cartDrawerSettings.instance = componentCartDrawer\r\n CartDrawer.settings = window.cartDrawerSettings\r\n\r\n // dispara evento de carregamento, escutado por CartDrawer.show()\r\n root.dispatchEvent(new Event('vnda:cart-drawer-loaded'))\r\n },\r\n\r\n loadComponent: function() {\r\n const { settings } = CartDrawer;\r\n addAsset(settings.script, CartDrawer.setCartDrawer);\r\n addAsset(settings.styles);\r\n },\r\n\r\n handleCartButton: function(button) {\r\n // Evita múltiplos cliques caso o carrinho precisa ser instanciado primeiro\r\n if (button.classList.contains('-loading')) {\r\n return;\r\n }\r\n\r\n // Abre o cart drawer\r\n button.classList.add('-loading');\r\n CartDrawer.show(() => { button.classList.remove('-loading') })\r\n },\r\n\r\n show: function (callback) {\r\n\r\n const { root } = CartDrawer;\r\n\r\n // No mobile, fecha o menu primeiro\r\n if (window.mmenu) window.mmenu.close()\r\n\r\n // Instancia o componente, caso ainda não exista\r\n if (!CartDrawer.settings.instance) CartDrawer.loadComponent();\r\n\r\n // Observa criação da instância inicial, caso não tenha\r\n if (CartDrawer.settings.instance === false) {\r\n root.addEventListener('vnda:cart-drawer-loaded', () => {\r\n CartDrawer.settings.instance.open()\r\n if (typeof callback === 'function') callback()\r\n })\r\n } else {\r\n // Já possui cart drawer instanciado, retorna abertura\r\n CartDrawer.settings.instance.open();\r\n if (typeof callback === 'function') callback()\r\n }\r\n },\r\n\r\n getCartItens: async function () {\r\n try {\r\n const response = await fetch('/carrinho/itens');\r\n const itens = await response.json()\r\n return itens;\r\n\r\n } catch (error) {\r\n console.error('Erro ao buscar a quantidade de produtos do carrinho');\r\n console.error(error);\r\n }\r\n },\r\n\r\n updateCartCount: async function (_itemsCount = null) {\r\n let items = _itemsCount;\r\n if (_itemsCount == null) items = await CartDrawer.getCartItens();\r\n\r\n this.countWrapper.innerHTML = items;\r\n },\r\n\r\n init: function () {\r\n const _this = this;\r\n const { buttons } = _this;\r\n\r\n // Atualiza o contador de itens do carrinho\r\n _this.updateCartCount();\r\n\r\n if (buttons.length > 0) buttons.forEach(button => {\r\n button.addEventListener('click', () => {\r\n _this.handleCartButton(button)\r\n })\r\n })\r\n },\r\n};\r\n\r\nexport default CartDrawer;\r\n","const Footer = {\r\n handleSubmenu: function () {\r\n // toggle menu footer nivel 1\r\n const menus = document.querySelectorAll(\r\n '[data-action=\"toggle-menu-footer\"]'\r\n );\r\n\r\n menus.forEach((menu) => {\r\n menu.addEventListener('click', () => {\r\n menu.classList.toggle('open');\r\n });\r\n });\r\n },\r\n init: function () {\r\n const _this = this;\r\n\r\n _this.handleSubmenu();\r\n },\r\n};\r\n\r\nexport default Footer;\r\n","const Header = {\r\n lastScrollTop: -1,\r\n scrollTop: window.pageYOffset,\r\n header: document.querySelector('#header'),\r\n\r\n setScroll: function (scrollTop, lastScrollTop) {\r\n const _this = this;\r\n\r\n if (scrollTop <= 0) {\r\n _this.header.classList.add('scroll-up');\r\n _this.header.classList.remove('scroll-down');\r\n _this.header.classList.add('on-top');\r\n } else {\r\n if (_this.header.classList.contains('on-top')) {\r\n _this.header.classList.remove('on-top');\r\n }\r\n if (scrollTop > lastScrollTop) {\r\n _this.header.classList.add('scroll-down');\r\n _this.header.classList.remove('scroll-up');\r\n } else {\r\n _this.header.classList.add('scroll-up');\r\n _this.header.classList.remove('scroll-down');\r\n }\r\n }\r\n },\r\n\r\n init: function () {\r\n const _this = this;\r\n const { lastScrollTop, scrollTop } = _this;\r\n\r\n _this.setScroll(scrollTop, lastScrollTop);\r\n\r\n // cuida quando a página scrolla pra atualizar o header\r\n window.addEventListener('scroll', function () {\r\n const newSt = window.pageYOffset;\r\n\r\n _this.setScroll(newSt, lastScrollTop);\r\n _this.lastScrollTop = newSt;\r\n });\r\n },\r\n};\r\n\r\nexport default Header;\r\n","/**\n * Class for a match media toggler.\n */\nvar MmToggler = /** @class */ (function () {\n /**\n * Create the match media.\n *\n * @param {string} mediaquery Media query to use.\n */\n function MmToggler(mediaquery) {\n var _this = this;\n this.listener = function (evnt) {\n (evnt.matches ? _this.matchFns : _this.unmatchFns).forEach(function (listener) {\n listener();\n });\n };\n this.toggler = window.matchMedia(mediaquery);\n this.toggler.addListener(this.listener);\n this.matchFns = [];\n this.unmatchFns = [];\n }\n /**\n * Add a function to the list,\n * also fires the added function.\n *\n * @param {Function} match Function to fire when the media query matches.\n * @param {Function} unmatch Function to fire when the media query does not match.\n */\n MmToggler.prototype.add = function (match, unmatch) {\n this.matchFns.push(match);\n this.unmatchFns.push(unmatch);\n (this.toggler.matches ? match : unmatch)();\n };\n return MmToggler;\n}());\nexport default MmToggler;\n","/**\n * Convert a list to an array.\n *\n * @param \t{NodeList|HTMLCollection} list \tThe list or collection to convert into an array.\n * @return\t{array}\t\t\t\t\t\t\tThe array.\n */\nexport var r = function (list) {\n return Array.prototype.slice.call(list);\n};\n/**\n * Find elements in the given context.\n *\n * @param \t{string}\t\tselector\t\t\tThe query selector to search for.\n * @param \t{HTMLElement}\t[context=document]\tThe context to search in.\n * @return\t{HTMLElement[]}\t\t\t\t\t\tThe found list of elements.\n */\nexport var $ = function (selector, context) {\n return r((context || document).querySelectorAll(selector));\n};\n","import { r, $ } from '../helpers';\nvar prefix = 'mm-spn';\n/**\n * Class for navigating in a mobile menu.\n */\nvar MmSlidingPanelsNavigation = /** @class */ (function () {\n /**\n * Class for navigating in a mobile menu.\n *\n * @param {HTMLElement} node HTMLElement for the menu.\n * @param {string} title The title for the menu.\n * @param {string} selectedClass The class for selected listitems.\n * @param {boolean} slidingSubmenus Whether or not to use sliding submenus.\n * @param {string} theme The color scheme for the menu.\n */\n function MmSlidingPanelsNavigation(node, title, selectedClass, slidingSubmenus, theme) {\n this.node = node;\n this.title = title;\n this.slidingSubmenus = slidingSubmenus;\n this.selectedClass = selectedClass;\n // Add classname.\n this.node.classList.add(prefix);\n this.node.classList.add(prefix + \"--\" + theme);\n this.node.classList.add(prefix + \"--\" + (this.slidingSubmenus ? 'navbar' : 'vertical'));\n this._setSelectedl();\n this._initAnchors();\n }\n Object.defineProperty(MmSlidingPanelsNavigation.prototype, \"prefix\", {\n /** Prefix for the class. */\n get: function () {\n return prefix;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Open the given panel.\n *\n * @param {HTMLElement} panel Panel to open.\n */\n MmSlidingPanelsNavigation.prototype.openPanel = function (panel) {\n /** Parent LI for the panel. */\n var listitem = panel.parentElement;\n // Sliding submenus\n if (this.slidingSubmenus) {\n /** Title above the panel to open. */\n var title_1 = panel.dataset.mmSpnTitle;\n // Opening the main level UL.\n if (listitem === this.node) {\n this.node.classList.add(prefix + \"--main\");\n }\n // Opening a sub level UL.\n else {\n this.node.classList.remove(prefix + \"--main\");\n // Find title from parent LI.\n if (!title_1) {\n r(listitem.children).forEach(function (child) {\n if (child.matches('a, span')) {\n title_1 = child.textContent;\n }\n });\n }\n }\n // Use the default title.\n if (!title_1) {\n title_1 = this.title;\n }\n // Set the title.\n this.node.dataset.mmSpnTitle = title_1;\n // Unset all panels from being opened and parent.\n $(\".\" + prefix + \"--open\", this.node).forEach(function (open) {\n open.classList.remove(prefix + \"--open\");\n open.classList.remove(prefix + \"--parent\");\n });\n // Set the current panel as being opened.\n panel.classList.add(prefix + \"--open\");\n panel.classList.remove(prefix + \"--parent\");\n // Set all parent panels as being parent.\n var parent_1 = panel.parentElement.closest('ul');\n while (parent_1) {\n parent_1.classList.add(prefix + \"--open\");\n parent_1.classList.add(prefix + \"--parent\");\n parent_1 = parent_1.parentElement.closest('ul');\n }\n }\n // Vertical submenus\n else {\n /** Whether or not the panel is currently opened. */\n var isOpened = panel.matches(\".\" + prefix + \"--open\");\n // Unset all panels from being opened and parent.\n $(\".\" + prefix + \"--open\", this.node).forEach(function (open) {\n open.classList.remove(prefix + \"--open\");\n });\n // Toggle the current panel.\n panel.classList[isOpened ? 'remove' : 'add'](prefix + \"--open\");\n // Set all parent panels as being opened.\n var parent_2 = panel.parentElement.closest('ul');\n while (parent_2) {\n parent_2.classList.add(prefix + \"--open\");\n parent_2 = parent_2.parentElement.closest('ul');\n }\n }\n };\n /**\n * Initiate the selected listitem / open the current panel.\n */\n MmSlidingPanelsNavigation.prototype._setSelectedl = function () {\n /** All selected LIs. */\n var listitems = $('.' + this.selectedClass, this.node);\n /** The last selected LI. */\n var listitem = listitems[listitems.length - 1];\n /** The opened UL. */\n var panel = null;\n if (listitem) {\n panel = listitem.closest('ul');\n }\n if (!panel) {\n panel = this.node.querySelector('ul');\n }\n this.openPanel(panel);\n };\n /**\n * Initialize the click event handlers.\n */\n MmSlidingPanelsNavigation.prototype._initAnchors = function () {\n var _this = this;\n /**\n * Clicking an A in the menu: prevent bubbling up to the LI.\n *\n * @param {HTMLElement} target The clicked element.\n * @return {boolean} handled Whether or not the event was handled.\n */\n var clickAnchor = function (target) {\n if (target.matches('a')) {\n return true;\n }\n return false;\n };\n /**\n * Click a LI or SPAN in the menu: open its submenu (if present).\n *\n * @param {HTMLElement} target The clicked element.\n * @return {boolean} Whether or not the event was handled.\n */\n var openSubmenu = function (target) {\n /** Parent listitem for the submenu. */\n var listitem;\n // Find the parent listitem.\n if (target.closest('span')) {\n listitem = target.parentElement;\n }\n else if (target.closest('li')) {\n listitem = target;\n }\n else {\n listitem = false;\n }\n if (listitem) {\n r(listitem.children).forEach(function (panel) {\n if (panel.matches('ul')) {\n _this.openPanel(panel);\n }\n });\n return true;\n }\n return false;\n };\n /**\n * Click the menu (the navbar): close the last opened submenu.\n *\n * @param {HTMLElement} target The clicked element.\n * @return {boolean} Whether or not the event was handled.\n */\n var closeSubmenu = function (target) {\n /** The opened ULs. */\n var panels = $(\".\" + prefix + \"--open\", target);\n /** The last opened UL. */\n var panel = panels[panels.length - 1];\n if (panel) {\n /** The second to last opened UL. */\n var parent_3 = panel.parentElement.closest('ul');\n if (parent_3) {\n _this.openPanel(parent_3);\n return true;\n }\n }\n return false;\n };\n this.node.addEventListener('click', function (evnt) {\n var target = evnt.target;\n var handled = false;\n handled = handled || clickAnchor(target);\n handled = handled || openSubmenu(target);\n handled = handled || closeSubmenu(target);\n if (handled) {\n evnt.stopImmediatePropagation();\n }\n });\n };\n return MmSlidingPanelsNavigation;\n}());\nexport default MmSlidingPanelsNavigation;\n","var prefix = 'mm-ocd';\n/**\n * Class for off-canvas behavior.\n */\nvar MmOffCanvasDrawer = /** @class */ (function () {\n /**\n * Class for off-canvas drawer.\n *\n * @param {HTMLElement} [node] The element to put in the drawer.\n * @param {String} [position=left] The position of the drawer, can be \"left\" or \"right\".\n */\n function MmOffCanvasDrawer(node, position) {\n var _this = this;\n if (node === void 0) { node = null; }\n // Create the wrapper.\n this.wrapper = document.createElement('div');\n this.wrapper.classList.add(\"\" + prefix);\n this.wrapper.classList.add(prefix + \"--\" + position);\n // Create the drawer.\n this.content = document.createElement('div');\n this.content.classList.add(prefix + \"__content\");\n this.wrapper.append(this.content);\n // Create the backdrop.\n this.backdrop = document.createElement('div');\n this.backdrop.classList.add(prefix + \"__backdrop\");\n this.wrapper.append(this.backdrop);\n // Add the nodes to the
.\n document.body.append(this.wrapper);\n if (node) {\n this.content.append(node);\n }\n // Click the backdrop.\n var close = function (evnt) {\n _this.close();\n evnt.stopImmediatePropagation();\n };\n this.backdrop.addEventListener('touchstart', close, { passive: true });\n this.backdrop.addEventListener('mousedown', close, { passive: true });\n }\n Object.defineProperty(MmOffCanvasDrawer.prototype, \"prefix\", {\n /** Prefix for the class. */\n get: function () {\n return prefix;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * Open the drawer.\n */\n MmOffCanvasDrawer.prototype.open = function () {\n this.wrapper.classList.add(prefix + \"--open\");\n document.body.classList.add(prefix + \"-opened\");\n };\n /**\n * Close the drawer.\n */\n MmOffCanvasDrawer.prototype.close = function () {\n this.wrapper.classList.remove(prefix + \"--open\");\n document.body.classList.remove(prefix + \"-opened\");\n };\n return MmOffCanvasDrawer;\n}());\nexport default MmOffCanvasDrawer;\n","import MmToggler from '../modules/match-media-toggler/index';\nimport MmSlidingPanelsNavigation from '../modules/sliding-panels-navigation/index';\nimport MmOffCanvasDrawer from '../modules/offcanvas-drawer/index';\n/**\n * Class for a lightweight mobile menu.\n */\nvar MmenuLight = /** @class */ (function () {\n /**\n * Create a lightweight mobile menu.\n *\n * @param {HTMLElement} menu HTML element for the menu.\n * @param {string} [mediaQuery='all'] Media queury to match for the menu.\n */\n function MmenuLight(menu, mediaQuery) {\n if (mediaQuery === void 0) { mediaQuery = 'all'; }\n // Store the menu node.\n this.menu = menu;\n // Create the toggler instance.\n this.toggler = new MmToggler(mediaQuery);\n }\n /**\n * Add navigation for the menu.\n *\n * @param {object} options Options for the navigation.\n */\n MmenuLight.prototype.navigation = function (options) {\n var _this = this;\n // Only needs to be done ones.\n if (!this.navigator) {\n options = options || {};\n var _a = options.title, title = _a === void 0 ? 'Menu' : _a, _b = options.selectedClass, selectedClass = _b === void 0 ? 'Selected' : _b, _c = options.slidingSubmenus, slidingSubmenus = _c === void 0 ? true : _c, _d = options.theme, theme = _d === void 0 ? 'light' : _d;\n this.navigator = new MmSlidingPanelsNavigation(this.menu, title, selectedClass, slidingSubmenus, theme);\n // En-/disable\n this.toggler.add(function () { return _this.menu.classList.add(_this.navigator.prefix); }, function () { return _this.menu.classList.remove(_this.navigator.prefix); });\n }\n return this.navigator;\n };\n /**\n * Add off-canvas behavior to the menu.\n *\n * @param {object} options Options for the off-canvas drawer.\n */\n MmenuLight.prototype.offcanvas = function (options) {\n var _this = this;\n // Only needs to be done ones.\n if (!this.drawer) {\n options = options || {};\n var _a = options.position, position = _a === void 0 ? 'left' : _a;\n this.drawer = new MmOffCanvasDrawer(null, position);\n /** Original location in the DOM for the menu. */\n var orgLocation_1 = document.createComment('original menu location');\n this.menu.after(orgLocation_1);\n // En-/disable\n this.toggler.add(function () {\n // Move the menu to the drawer.\n _this.drawer.content.append(_this.menu);\n }, function () {\n // Close the drawer.\n _this.drawer.close();\n // Move the menu to the original position.\n orgLocation_1.after(_this.menu);\n });\n }\n return this.drawer;\n };\n return MmenuLight;\n}());\nexport default MmenuLight;\n","/*!\n * Mmenu Light\n * mmenujs.com/mmenu-light\n *\n * Copyright (c) Fred Heusschen\n * www.frebsite.nl\n *\n * License: CC-BY-4.0\n * http://creativecommons.org/licenses/by/4.0/\n */\n\n//\tThe module\nimport MmenuLight from '../esm/core/index';\n\n// Export module\nexport default MmenuLight;\n\n//\tGlobal namespace\nwindow.MmenuLight = MmenuLight;\n","import MmenuLight from 'mmenu-light';\r\n\r\nconst MenuMobile = {\r\n setMenuMobile: function () {\r\n const mmenuWrapper = document.querySelector('#mm-menu-mobile');\r\n const mmenu = new MmenuLight(mmenuWrapper);\r\n\r\n //precisa do navigation e do drawer\r\n const navigator = mmenu.navigation({\r\n title: 'Menu',\r\n });\r\n\r\n const drawer = mmenu.offcanvas();\r\n\r\n document\r\n .querySelector('[data-action=\"open-menu-mobile\"]')\r\n .addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n drawer.open();\r\n });\r\n\r\n document\r\n .querySelector('[data-action=\"close-menu-mobile\"]')\r\n .addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n console.log('clicou')\r\n\r\n drawer.close();\r\n });\r\n\r\n window.mmenu = drawer;\r\n },\r\n init: function () {\r\n const _this = this;\r\n\r\n\r\n console.log('entrou no mobile')\r\n\r\n _this.setMenuMobile();\r\n },\r\n};\r\n\r\nexport default MenuMobile;\r\n","// Javascript genérico para qualquer popup que precise ser criado na loja\r\n\r\nconst Popup = {\r\n togglePopup: function (popupType) {\r\n document\r\n .querySelector(`[data-popup=\"${popupType}\"].popup`)\r\n .classList.toggle('-open');\r\n },\r\n init: function () {\r\n var _this = this;\r\n\r\n var toggleButtons = document.querySelectorAll(\r\n '[data-action=\"toggle-popup\"]'\r\n );\r\n\r\n // toggle popup\r\n toggleButtons.forEach((button) => {\r\n button.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n let popupType = button.dataset.popup;\r\n\r\n _this.togglePopup(popupType);\r\n });\r\n });\r\n },\r\n};\r\n\r\nexport default Popup;\r\n","import { serializeArray, formMasks } from '../components/utilities';\r\n\r\nconst Webforms = {\r\n submitWebForm: async function (form, email) {\r\n const formData = serializeArray(form);\r\n const textBtnDefault = form.querySelector('.action').innerHTML;\r\n\r\n if (typeof email == 'undefined' || email == '') {\r\n email = form.querySelector('[name=\"email\"]').value;\r\n }\r\n\r\n form.querySelector('[name=\"reply_to\"]').value = email;\r\n\r\n if (!form.classList.contains('sending')) {\r\n form.classList.add('sending');\r\n form.classList.remove('error');\r\n form.querySelector('.action').innerHTML = 'Enviando';\r\n\r\n try {\r\n const response = await fetch('/webform', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\r\n },\r\n body: formData,\r\n });\r\n\r\n if (response.ok) {\r\n console.info('Formulário enviado com sucesso');\r\n form.classList.add('sent');\r\n form.querySelector('.msg-success').classList.add('-visible');\r\n form.querySelector('.action').innerHTML = 'Enviado';\r\n form.reset();\r\n\r\n setTimeout(function () {\r\n form.classList.remove('sent');\r\n form.querySelector('.msg-success').classList.remove('-visible');\r\n form.querySelector('.action').innerHTML = textBtnDefault;\r\n }, 3500);\r\n } else {\r\n const text = await response.text();\r\n\r\n console.error(`Ocorreu um erro no envio do formulário. Erro ${response.status}`);\r\n console.error(text);\r\n\r\n form.classList.add('error');\r\n form.querySelector('.msg-error').classList.add('-visible');\r\n form.querySelector('.action').innerHTML = 'Falha ao enviar';\r\n\r\n setTimeout(function () {\r\n form.classList.remove('error');\r\n form.querySelector('.msg-error').classList.remove('-visible');\r\n form.querySelector('.action').innerHTML = textBtnDefault;\r\n }, 3500);\r\n }\r\n } catch (error) {\r\n console.error('Erro ao enviar o webform');\r\n console.error(error);\r\n\r\n form.classList.add('error');\r\n form.querySelector('.msg-error').classList.add('-visible');\r\n form.querySelector('.action').innerHTML = 'Falha ao enviar';\r\n\r\n setTimeout(function () {\r\n form.classList.remove('error');\r\n form.querySelector('.msg-error').classList.remove('-visible');\r\n form.querySelector('.action').innerHTML = textBtnDefault;\r\n }, 3500);\r\n }\r\n\r\n form.classList.remove('sending');\r\n }\r\n },\r\n submitNotify: async function (form) {\r\n const formData = serializeArray(form);\r\n const btnTextDefault = form.querySelector('.action').innerHTML;\r\n\r\n if (!form.classList.contains('sending')) {\r\n form.classList.remove('error');\r\n form.classList.add('sending');\r\n form.querySelector('.action').innerHTML = 'Enviando';\r\n\r\n try {\r\n const response = await fetch('/lista_de_espera', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\r\n },\r\n body: formData,\r\n });\r\n\r\n if (response.ok) {\r\n form.classList.remove('sending');\r\n\r\n // Envia um webform de aviso de cadastro\r\n console.log('Lista de espera enviada com sucesso');\r\n Webforms.submitWebForm(form);\r\n } else {\r\n const text = await response.text();\r\n console.error(`Ocorreu um erro ao enviar o formulário de Lista de Espera. Erro ${response.status}`);\r\n console.error(text);\r\n\r\n form.classList.add('error');\r\n form.querySelector('.msg-error').classList.add('-visible');\r\n form.querySelector('.action').innerHTML = 'Falha ao enviar';\r\n\r\n setTimeout(() => {\r\n form.classList.remove('error');\r\n form.querySelector('.msg-error').classList.remove('-visible');\r\n form.querySelector('.action').innerHTML = btnTextDefault;\r\n }, 3500);\r\n }\r\n } catch (error) {\r\n console.error('Falha ao enviar lista de espera. Verificar integração.');\r\n console.error(error);\r\n\r\n form.classList.add('error');\r\n form.querySelector('.msg-error').classList.add('-visible');\r\n form.querySelector('.action').innerHTML = 'Falha ao enviar';\r\n\r\n setTimeout(() => {\r\n form.classList.remove('error');\r\n form.querySelector('.msg-error').classList.remove('-visible');\r\n form.querySelector('.action').innerHTML = btnTextDefault;\r\n }, 3500);\r\n }\r\n\r\n form.classList.remove('sending');\r\n }\r\n },\r\n showMessage: function (input, form) {\r\n const alertMessage = form.querySelector('[data-msg]');\r\n\r\n alertMessage.classList.add('-visible');\r\n alertMessage.innerText = 'Preencha os campos obrigatórios';\r\n\r\n input.classList.add('-emphasis');\r\n\r\n setTimeout(() => {\r\n alertMessage.classList.remove('-visible');\r\n alertMessage.innerText = '';\r\n\r\n input.classList.remove('-emphasis');\r\n }, 2000);\r\n },\r\n validateForm: function (vndaInput, form) {\r\n let submitAllowed = true;\r\n\r\n // Permite o envio se o input vnda estiver vazio\r\n if (vndaInput.value == '') {\r\n vndaInput.setAttribute('required', false);\r\n\r\n // Valida se os campos obrigatórios estão preenchidos\r\n const requiredFields = form.querySelectorAll('[required]:not([required=false])');\r\n requiredFields.forEach((input) => {\r\n if (input.value == '') {\r\n submitAllowed = false;\r\n Webforms.showMessage(input, form);\r\n }\r\n\r\n if (input.type == 'checkbox' && input.checked == false) {\r\n submitAllowed = false;\r\n Webforms.showMessage(input, form);\r\n }\r\n });\r\n\r\n if (submitAllowed) form.id == 'form-notify' ? Webforms.submitNotify(form) : Webforms.submitWebForm(form);\r\n }\r\n },\r\n setWebForms: function () {\r\n const webForms = document.querySelectorAll('[data-webform]');\r\n\r\n webForms.length > 0 &&\r\n webForms.forEach((form) => {\r\n const button = form.querySelector('button');\r\n const fieldset = form.querySelector('fieldset');\r\n\r\n // Desabilita os campos do formulário, através do fieldset, quando o input vnda recebe algum valor\r\n let vndaInput = form.querySelector('input[name=\"vnda\"]');\r\n vndaInput.addEventListener('input', () => fieldset.setAttribute('disabled', true));\r\n\r\n // Realiza o envio através do clique e da tecla enter sobre o botão do formulário\r\n button && button.addEventListener('click', () => Webforms.validateForm(vndaInput, form));\r\n button &&\r\n button.addEventListener('keypress', (e) => {\r\n if (e.key === 'Enter') Webforms.validateForm(vndaInput, form);\r\n });\r\n });\r\n\r\n formMasks();\r\n },\r\n init: function () {\r\n const _this = this;\r\n _this.setWebForms();\r\n },\r\n};\r\n\r\nexport default Webforms;\r\n","import CartDrawer from '../common/cartDrawer';\r\nimport { urlencodeFormData } from './utilities';\r\n\r\nconst Store = {\r\n openCartDrawer: true,\r\n openCartDrawerMobile: true,\r\n\r\n addProduct: function(form, parent, callback) {\r\n // Se tiver customizações, ajusta campos de texto que não foram preenchidos\r\n const customizations = form.querySelectorAll('[data-customization]')\r\n const quantity = Number(form.querySelector('[name=\"quantity\"]').value)\r\n if (customizations.length > 0) customizations.forEach(custom => {\r\n const type = custom.getAttribute('type')\r\n\r\n if (type !== 'checkbox' || type !== 'radio') {\r\n if (custom.value === '') {\r\n custom.setAttribute('disabled', true)\r\n }\r\n }\r\n })\r\n\r\n if (customizations.length > 0 && quantity > 1) {\r\n // Item com personalização e com quantidade alta\r\n Store.addItemsCustom(form, parent, callback)\r\n } else {\r\n // Item com quantidade 1, com ou sem personalização\r\n Store.addItem(form, parent, callback)\r\n }\r\n },\r\n\r\n addItemsCustom: async function(form, parent, callback) {\r\n const _this = this;\r\n const btnComprar = parent.querySelector('[data-action=\"add-cart\"]');\r\n const boxResponse = parent.querySelector('[data-form-product] .msg-response:not(.resp-validate)');\r\n const quantity = Number(form.querySelector('[name=\"quantity\"]').value)\r\n let hasCustoms = false\r\n let customs = {}\r\n\r\n // Prepara o item e suas personalizações\r\n let data = { items: [\r\n {\r\n sku: form.querySelector('[name=\"sku\"]').value,\r\n quantity,\r\n customizations: []\r\n }\r\n ]}\r\n\r\n const customizations = form.querySelectorAll('[data-customization]')\r\n if (customizations.length > 0) customizations.forEach(custom => {\r\n const disabled = custom.getAttribute('disabled')\r\n const type = custom.getAttribute('type')\r\n let checked = true;\r\n if (type !== 'text') checked = custom.checked\r\n\r\n if (checked && disabled !== 'true') {\r\n hasCustoms = true\r\n if (type === 'text') {\r\n customs[custom.getAttribute('data-customization-name')] = custom.value\r\n } else {\r\n customs[custom.getAttribute('data-customization-name')] = custom.getAttribute('value') \r\n }\r\n }\r\n })\r\n\r\n if (hasCustoms) {\r\n for (let index = 0; index < quantity; index++) {\r\n data.items[0].customizations.push(customs)\r\n }\r\n }\r\n\r\n const json_data = JSON.stringify(data)\r\n\r\n console.info('addItemsCustom');\r\n // console.log(json_data)\r\n\r\n // Envia o produto com suas personalizações\r\n if (!btnComprar.classList.contains('-adding')) {\r\n btnComprar.classList.add('-adding')\r\n\r\n try {\r\n const response = await fetch('/carrinho/adicionar/kit', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: json_data,\r\n });\r\n \r\n const html = await response.text();\r\n\r\n if (response.ok) {\r\n console.log('addItemsCustom - success');\r\n if (typeof callback == 'function') {\r\n callback('produto-adicionado', html, boxResponse, form);\r\n } else {\r\n _this.addItemResult('produto-adicionado', html, boxResponse, form);\r\n }\r\n\r\n } else {\r\n console.log('addItemsCustom - server não reconheceu adição');\r\n if (typeof callback == 'function') {\r\n callback('erro-adicionar', error, boxResponse, form);\r\n } else {\r\n _this.addItemResult('erro-adicionar', error, boxResponse, form);\r\n }\r\n }\r\n\r\n } catch (error) {\r\n console.log('addItemsCustom - error');\r\n console.error(error);\r\n\r\n if (typeof callback == 'function') {\r\n callback('erro-adicionar', error, boxResponse, form);\r\n } else {\r\n _this.addItemResult('erro-adicionar', error, boxResponse, form);\r\n }\r\n }\r\n\r\n customizations.forEach(custom => {\r\n custom.removeAttribute('disabled')\r\n })\r\n\r\n btnComprar.classList.remove('-adding');\r\n }\r\n },\r\n\r\n addItem: async function (form, parent, callback) {\r\n const _this = this;\r\n const btnComprar = parent.querySelector('[data-action=\"add-cart\"]');\r\n const urlAdd = '/carrinho/adicionar';\r\n const formData = urlencodeFormData(new FormData(form));\r\n const boxResponse = parent.querySelector('[data-form-product] .msg-response:not(.resp-validate)');\r\n\r\n console.info('addItem');\r\n // console.info(formData);\r\n\r\n if (!btnComprar.classList.contains('-adding')) {\r\n btnComprar.classList.add('-adding');\r\n\r\n try {\r\n const response = await fetch(urlAdd, {\r\n method: 'POST',\r\n headers: {\r\n 'Accept': 'application/json, text/javascript, */*; q=0.0',\r\n 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',\r\n },\r\n body: formData,\r\n });\r\n\r\n const html = await response.text();\r\n\r\n console.log('addItem - success');\r\n\r\n if (typeof callback == 'function') {\r\n callback('produto-adicionado', html, boxResponse, form);\r\n } else {\r\n _this.addItemResult('produto-adicionado', html, boxResponse, form);\r\n }\r\n } catch (error) {\r\n console.log('addItem - error');\r\n console.error(error);\r\n\r\n if (typeof callback == 'function') {\r\n callback('erro-adicionar', error, boxResponse, form);\r\n } else {\r\n _this.addItemResult('erro-adicionar', error, boxResponse, form);\r\n }\r\n }\r\n\r\n btnComprar.classList.remove('-adding');\r\n }\r\n },\r\n\r\n deleteItem: async function (itemId, item, removeItemResult) {\r\n const _this = this;\r\n\r\n if (!item.classList.contains('-removing')) {\r\n item.classList.add('-removing');\r\n\r\n try {\r\n const response = await fetch('/carrinho', {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n body: JSON.stringify({\r\n _method: 'delete',\r\n item_id: itemId,\r\n }),\r\n });\r\n\r\n console.log('success');\r\n\r\n if (window.innerWidth > 768) {\r\n if (_this.openCartDrawer) {\r\n CartDrawer.updateCartCount();\r\n }\r\n } else {\r\n if (_this.openCartDrawerMobile) {\r\n CartDrawer.updateCartCount();\r\n }\r\n }\r\n\r\n if (typeof removeItemResult == 'function') {\r\n removeItemResult(item);\r\n }\r\n } catch (error) {\r\n console.log('Erro ao remover item do carrinho');\r\n console.log(error);\r\n }\r\n\r\n item.classList.remove('-removing');\r\n }\r\n },\r\n\r\n validateFormProduct: function (form) {\r\n // VALIDA O FORM DE PRODUTO PARA VER SE O PRODUTO PODE SER ADICIONADO\r\n var btnComprar = form.querySelector('[data-action=\"add-cart\"]');\r\n var validated = true;\r\n var errors = [];\r\n\r\n if (btnComprar.dataset.available == 'false') {\r\n validated = false;\r\n errors.push('');\r\n } else {\r\n // verifica se o sku foi selecionado\r\n if (form.querySelector('[name=\"sku\"]').value == '') {\r\n validated = false;\r\n errors.push('Selecione um atributo para o produto');\r\n }\r\n\r\n // verifica se a quantidade é válida\r\n if (form.querySelector('input[name=\"quantity\"]').value <= 0) {\r\n validated = false;\r\n errors.push('Quantidade indisponível');\r\n }\r\n }\r\n\r\n return { validated, errors };\r\n },\r\n\r\n setRespValidateProduct: function (resp, form, boxResponse) {\r\n let htmlErrors = '';\r\n\r\n if (resp.validated) {\r\n boxResponse.innerHTML = '';\r\n } else {\r\n for (var i = resp.errors.length - 1; i >= 0; i--) {\r\n htmlErrors += '' + resp.errors[i] + '';\r\n }\r\n boxResponse.innerHTML = htmlErrors;\r\n }\r\n },\r\n\r\n addItemResult: function (typeResult, result, boxResponse, form) {\r\n const _this = this;\r\n\r\n if (typeResult == 'produto-adicionado') {\r\n const btnComprar = form.querySelector('[data-action=\"add-cart\"]');\r\n\r\n if (btnComprar) btnComprar.classList.add('success');\r\n\r\n setTimeout(function () {\r\n if (btnComprar) btnComprar.classList.remove('success');\r\n if (btnComprar) btnComprar.innerHTML = btnComprar.dataset.textAvailable;\r\n }, 3500);\r\n\r\n // CartDrawer.updateCartCount();\r\n\r\n if (window.innerWidth > 768) {\r\n if (_this.openCartDrawer) {\r\n CartDrawer.show();\r\n } else {\r\n setTimeout(() => {\r\n window.location.href = urlCart;\r\n }, 150);\r\n }\r\n } else {\r\n if (_this.openCartDrawerMobile) {\r\n CartDrawer.show();\r\n } else {\r\n setTimeout(() => {\r\n window.location.href = urlCart;\r\n }, 150);\r\n }\r\n }\r\n\r\n // Verifica se há popup de compra rápida ativo. Se tiver, fecha ele, retirar ou comentar se não for utilizado\r\n const popupPurchase = document.querySelector('[data-popup-purchase]');\r\n if (popupPurchase != null) {\r\n if (popupPurchase.classList.contains('-active')) {\r\n popupPurchase.querySelector('[data-close-popup-purchase]').click();\r\n }\r\n }\r\n } else if (typeResult == 'erro-adicionar') {\r\n if (typeof boxResponse != 'undefined' && boxResponse.length > 0) {\r\n window.scrollTo({\r\n top: boxResponse.offsetTop,\r\n behavior: 'smooth',\r\n });\r\n\r\n boxResponse.classList.add('error');\r\n boxResponse.classList.remove('success');\r\n boxResponse.querySelector('span').innerHTML =\r\n 'Ocorreu um erro, tente novamente.';\r\n }\r\n }\r\n },\r\n};\r\n\r\nexport default Store;\r\n","// \"productVariants\" é inicializado em layout.liquid, e todos os arquivos liquid que montam\n// product_block populam este objeto com as variantes dos produtos em tela\nimport Store from './store';\n\nconst ProductPurchase = {\n productVariants,\n products: document.querySelectorAll('[data-product-purchase]'),\n\n // Verifica as combinações possíveis entre os atributos, com base no atributo que foi clicado\n checkCombinations: function (currentProduct, selectedAttribute) {\n const productId = currentProduct.getAttribute('data-product-id');\n const selectedAttr = Number(selectedAttribute.getAttribute('data-attribute-index'));\n const variants = ProductPurchase.productVariants[`${productId}`];\n\n // Busca todos os atributos do produto\n const attributes = {\n attr1: [...currentProduct.querySelectorAll('[data-attribute-index=\"1\"]')],\n attr2: [...currentProduct.querySelectorAll('[data-attribute-index=\"2\"]')],\n attr3: [...currentProduct.querySelectorAll('[data-attribute-index=\"3\"]')],\n };\n\n // Busca os atuais atributos selecionados\n const selectedAttributes = {\n attr1: currentProduct.querySelector('[data-attribute=\"1\"] input:checked + label'),\n attr2: currentProduct.querySelector('[data-attribute=\"2\"] input:checked + label'),\n attr3: currentProduct.querySelector('[data-attribute=\"3\"] input:checked + label'),\n };\n\n // Altera o selected para o atributo que foi clicado\n selectedAttributes[`attr${selectedAttr}`] = selectedAttribute;\n\n // Atualiza as classes dos atributos disponíveis/indisponíveis\n // Ao clicar em uma opção de attr1, atualiza os attrs 2 e 3\n switch (selectedAttr) {\n case 1:\n ProductPurchase.markAttributes([...attributes.attr2], 2, variants, selectedAttributes, currentProduct);\n ProductPurchase.markAttributes([...attributes.attr3], 3, variants, selectedAttributes, currentProduct);\n break;\n\n case 2:\n ProductPurchase.markAttributes([...attributes.attr3], 3, variants, selectedAttributes, currentProduct);\n break;\n\n case 3:\n break;\n }\n },\n\n // Marca os atributos como disponiveis/indisponiveis com base nas combinações do checkCombinations\n markAttributes: function (attributes, index, variants, selectedAttributes, currentProduct) {\n if (attributes != null && attributes.length > 0) {\n // Remove os atributos já selecionados que não devem ser analizados,\n // com base no index do atributo que está sendo analizado. Usado para filtrar\n // as variantes e diminuir o número de possíveis combinações que definem como disponível/indisponível\n switch (index) {\n case 1:\n selectedAttributes.attr2 = null;\n selectedAttributes.attr3 = null;\n break;\n\n case 2:\n selectedAttributes.attr3 = null;\n break;\n\n case 3:\n break;\n }\n\n attributes.forEach((attr) => {\n const value = attr.getAttribute('data-attribute-value');\n const property = `property${index}`;\n let available = false;\n\n // Adiciona o atributo iterado nos atributos usados para buscar variantes válidas\n const attrsToCheck = {\n ...selectedAttributes,\n [`attr${index}`]: attr,\n };\n\n // Filtra as variantes para somente as que possuem a combinação de atributos válida\n const validVariants = variants.filter((variant) => {\n const properties = variant.properties;\n let validAttr1 = false;\n let validAttr2 = false;\n let validAttr3 = false;\n\n if (attrsToCheck.attr1 == null) validAttr1 = true;\n if (attrsToCheck.attr2 == null) validAttr2 = true;\n if (attrsToCheck.attr3 == null) validAttr3 = true;\n\n if (properties.property1 == null) validAttr1 = true;\n if (properties.property2 == null) validAttr2 = true;\n if (properties.property3 == null) validAttr3 = true;\n\n if (validAttr1 == false) {\n const valueToCheck = attrsToCheck.attr1.getAttribute('data-attribute-value');\n if (properties.property1.value == valueToCheck) validAttr1 = true;\n }\n\n if (validAttr2 == false) {\n const valueToCheck = attrsToCheck.attr2.getAttribute('data-attribute-value');\n if (properties.property2.value == valueToCheck) validAttr2 = true;\n }\n\n if (validAttr3 == false) {\n const valueToCheck = attrsToCheck.attr3.getAttribute('data-attribute-value');\n if (properties.property3.value == valueToCheck) validAttr3 = true;\n }\n\n if (validAttr1 && validAttr2 && validAttr3) return variant;\n });\n\n attr.classList.remove('-available');\n attr.classList.remove('-unavailable');\n attr.classList.remove('-disabled');\n\n if (validVariants.length > 0) {\n // Encontrou variantes, marca como disponível/indisponível com base nas variantes\n validVariants.forEach((variant) => {\n if (variant.properties[property]) {\n if (variant.properties[property].value == value) {\n variant.available == false ? (available = false) : (available = true);\n }\n } else {\n available = false;\n }\n });\n\n available ? attr.classList.add('-available') : attr.classList.add('-unavailable');\n } else if (validVariants.length === 0) {\n // Não encontrou nenhuma variante, então desabilita a opção.\n // Se esta opção estava selecionada, clica na primeira opção disponível entre os demais\n attr.classList.add('-disabled');\n const value = attr.getAttribute('data-attribute-value');\n const input = currentProduct.querySelector(`[data-attribute=\"${index}\"] input[value=\"${value}\"]`);\n if (input.checked) {\n input.checked = false;\n setTimeout(() => {\n const firstAvailable = currentProduct.querySelector(\n `label[data-attribute-index=\"${index}\"]:not(.-disabled)`\n );\n if (firstAvailable) firstAvailable.click();\n }, 50);\n }\n }\n });\n }\n },\n\n // Procura por SKU válido dentre os atributos escolhidos\n checkSelection: function (currentProduct) {\n const productId = currentProduct.getAttribute('data-product-id');\n const variants = ProductPurchase.productVariants[`${productId}`];\n const productBox = currentProduct.closest('[data-product-box]');\n\n const selectedAttrs = {\n attr1: currentProduct.querySelector('[data-attribute=\"1\"] input:checked'),\n attr2: currentProduct.querySelector('[data-attribute=\"2\"] input:checked'),\n attr3: currentProduct.querySelector('[data-attribute=\"3\"] input:checked'),\n };\n\n let available = false;\n\n for (let index = 0; index < variants.length; index++) {\n const variant = variants[index];\n let attr1 = false;\n let attr2 = false;\n let attr3 = false;\n let attr1Value = null;\n let attr2Value = null;\n let attr3Value = null;\n\n // Verifica se algum dos atributos é inexistente no cadastro\n if (variant.properties.property1 == null) attr1 = true;\n if (variant.properties.property2 == null) attr2 = true;\n if (variant.properties.property3 == null) attr3 = true;\n\n //Salva o valor de cada um dos atributos/propriedes da própria variante em questão\n if (variant.properties.property1) attr1Value = variant.properties.property1.value;\n if (variant.properties.property2) attr2Value = variant.properties.property2.value;\n if (variant.properties.property3) attr3Value = variant.properties.property3.value;\n\n // Verifica se a variante possui os atributos selecionados\n if (!attr1 && attr1Value != null && selectedAttrs.attr1 != null) {\n if (attr1Value == selectedAttrs.attr1.value) attr1 = true;\n }\n\n if (!attr2 && attr2Value != null && selectedAttrs.attr2 != null) {\n if (attr2Value == selectedAttrs.attr2.value) attr2 = true;\n }\n\n if (!attr3 && attr3Value != null && selectedAttrs.attr3 != null) {\n if (attr3Value == selectedAttrs.attr3.value) attr3 = true;\n }\n\n // Se achou variante compatível com os atributos selecionados, atualiza\n if (attr1 && attr2 && attr3) {\n available = true;\n const event = new CustomEvent('vnda:sku-change', { detail: { sku: variant.sku }})\n const productContainer = currentProduct.closest('[data-product-box]');\n\n currentProduct.querySelector('[name=\"sku\"]').value = variant.sku;\n currentProduct.dispatchEvent(event);\n if (productContainer) productContainer.dispatchEvent(event);\n\n // Reinicializa o input de quantidade para 1\n currentProduct.querySelector('[name=\"quantity\"]').value = 1;\n\n // Remove a mensagem de quantidade máxima quando altera a variante\n if (currentProduct.querySelector('.msg-response .msg-error').classList.contains('-visible')) {\n currentProduct.querySelector('.msg-response .msg-error').innerHTML = '';\n currentProduct.querySelector('.msg-response .msg-error').classList.remove('-visible');\n }\n\n // Configura a quantidade máxima do input conforme a variante selecionada\n currentProduct.querySelector('[name=\"quantity\"]').setAttribute('data-available-quantity', variant.quantity);\n // Configura produto disponível/indisponível\n if (variant.available) {\n ProductPurchase.setAvailable(currentProduct);\n } else {\n ProductPurchase.setUnavailable(currentProduct, true, variant.sku);\n }\n\n // Atualiza as últimas quantidades disponíveis\n ProductPurchase.setLastUnits(currentProduct, variant);\n\n // Atualiza o preço do componente\n ProductPurchase.updatePrice(currentProduct, variant);\n break;\n }\n }\n\n // Habilita a remoção do texto de \"A partir de\" após ter selecionado a variante de menor preço\n if (productBox.hasAttribute('data-checked-lowest-price')) {\n productBox.querySelector(\".price-wrapper .product-price\").classList.remove('multiple-prices')\n }\n\n // Quando não encontra variante\n if (!available) ProductPurchase.setUnavailable(currentProduct, false);\n\n },\n\n // Define produto como disponível pra compra\n setAvailable: function (currentProduct) {\n const addButton = currentProduct.querySelector('[data-action=\"add-cart\"]');\n const currentProductWrapper = currentProduct.closest('[data-product-box]');\n let formNotify = null;\n\n if (currentProductWrapper) {\n formNotify = currentProductWrapper.querySelector('[data-form-notify]');\n }\n\n if (addButton) {\n // addButton.setAttribute('data-available', true);\n addButton.classList.add('-available');\n addButton.classList.remove('-unavailable');\n addButton.innerHTML = addButton.getAttribute('data-text-available');\n }\n\n if (formNotify) formNotify.classList.remove('-active');\n },\n\n // Define produto como indisponível pra compra\n setUnavailable: function (currentProduct, showNotify, sku) {\n const addButton = currentProduct.querySelector('[data-action=\"add-cart\"]');\n const currentProductWrapper = currentProduct.closest('[data-product-box]');\n const showFormNotify = showNotify || false;\n let formNotify = null;\n\n if (currentProductWrapper) {\n formNotify = currentProductWrapper.querySelector('[data-form-notify]');\n }\n\n if (addButton) {\n // addButton.setAttribute('data-available', false);\n addButton.classList.remove('-available');\n addButton.classList.add('-unavailable');\n addButton.innerHTML = addButton.getAttribute('data-text-unavailable');\n }\n\n if (formNotify) {\n if (showFormNotify && sku != undefined && sku != null) {\n formNotify.classList.add('-active');\n formNotify.querySelector('[name=\"sku\"]').value = sku;\n } else {\n formNotify.classList.remove('-active');\n }\n }\n },\n\n // Atualiza o componente de preço do produto\n updatePrice: function (currentProduct, variant) {\n const productMainContainer = currentProduct.closest('[data-product-box]');\n\n if (productMainContainer == null) return;\n\n const priceEl = productMainContainer.querySelector('[data-init-price]');\n\n if (priceEl == null) return;\n\n const groupShop = productMainContainer.getAttribute('data-prod-group-shop');\n\n priceEl.setAttribute('data-sku', variant.sku);\n priceEl.setAttribute('data-price', variant.price);\n priceEl.dispatchEvent(new Event('change'));\n\n const discount = priceEl.dataset.discountPercent;\n\n // Coloca a porcentagem de desconto no produto\n if (discount != '0') {\n priceEl.style.setProperty('--discount', `'-${discount}%'`);\n }\n\n // atualiza preço final do compre junto se existir\n if (groupShop != null) {\n productMainContainer.setAttribute('data-price', variant.price);\n productMainContainer.setAttribute('data-sale-price', variant.sale_price);\n productMainContainer.setAttribute('data-available', variant.available);\n productMainContainer.dispatchEvent(new Event('vnda:group-shop-price-update'));\n }\n },\n\n // Marca o primeiro atributo como disponível/indisponível, e seleciona os atributos\n // da primeira variante disponível\n markFirstVariant: function (currentProduct) {\n const productId = currentProduct.getAttribute('data-product-id');\n const variants = [...ProductPurchase.productVariants[`${productId}`]];\n\n if (variants.length === 1) {\n // possui somente uma variante e não possui atributos,\n // define como disponível/indisponível com base na variante em si\n if (currentProduct.querySelectorAll('.prod-option').length === 0) {\n\n // Atualiza as últimas quantidades disponíveis\n ProductPurchase.setLastUnits(currentProduct, variants[0]);\n \n return variants[0].available\n ? ProductPurchase.setAvailable(currentProduct)\n : ProductPurchase.setUnavailable(currentProduct, true, variants[0].sku);\n }\n } else if (variants.length === 0) {\n // Produto não possui variantes, define como indisponível\n return ProductPurchase.setUnavailable(currentProduct);\n }\n\n if (variants.length > 0) {\n const allAttr1 = [...currentProduct.querySelectorAll('[data-attribute=\"1\"] [data-attribute-value]')];\n const allAttr2 = [...currentProduct.querySelectorAll('[data-attribute=\"2\"] [data-attribute-value]')];\n const allAttr3 = [...currentProduct.querySelectorAll('[data-attribute=\"3\"] [data-attribute-value]')];\n\n // Prepara para caso o atributo 1 não esteja em uso, scout por outros\n let attrToCheck = { index: false, options: [] };\n\n if (allAttr3.length > 0) attrToCheck = { index: 'property3', options: allAttr3 };\n if (allAttr2.length > 0) attrToCheck = { index: 'property2', options: allAttr2 };\n if (allAttr1.length > 0) attrToCheck = { index: 'property1', options: allAttr1 };\n\n // Baseado na ordem dos atributos, busca por variantes válidas\n if (attrToCheck.options.length > 0) {\n for (let index = 0; index < attrToCheck.options.length; index++) {\n const attribute = attrToCheck.options[index];\n const value = attribute.getAttribute('data-attribute-value');\n const availableVariants = ProductPurchase.productVariants[`${productId}`].filter((variant) => {\n if (variant.properties[attrToCheck.index]\n && variant.properties[attrToCheck.index].value\n && variant.properties[attrToCheck.index].value == value\n && variant.available\n ) return variant;\n });\n\n if (availableVariants.length > 0) {\n attribute.classList.add('-available');\n } else {\n // O produto não tem variantes disponíveis\n attribute.classList.add('-unavailable');\n }\n }\n\n // Marca os atributos da primeira variante disponível,\n //com base na ordem que os atributos se apresentam na tela\n let hasFirstAvailable = false;\n\n for (const attribute of attrToCheck.options) {\n if (attribute.classList.contains('-available')) {\n attribute.click();\n hasFirstAvailable = true;\n\n if (attrToCheck.index == 'property1') {\n for (const attr2 of allAttr2) {\n if (attr2.classList.contains('-available')) {\n attr2.click();\n break;\n }\n }\n\n for (const attr3 of allAttr3) {\n if (attr3.classList.contains('-available')) {\n attr3.click();\n break;\n }\n }\n }\n\n if (attrToCheck.index == 'property2') {\n for (const attr3 of allAttr3) {\n if (attr3.classList.contains('-available')) {\n attr3.click();\n break;\n }\n }\n }\n\n break;\n }\n }\n\n // Quando não há nenhuma first variant com estoque, marca a primeira\n //opção indisponível, para exibir como indisponível\n if (!hasFirstAvailable) {\n attrToCheck.options[0].click();\n if (attrToCheck.index == 'property1') {\n if (allAttr2.length > 0) allAttr2[0].click();\n if (allAttr3.length > 0) allAttr3[0].click();\n }\n\n if (attrToCheck.index == 'property2') {\n if (allAttr3.length > 0) allAttr3[0].click();\n }\n }\n }\n }\n\n ProductPurchase.setLowerPrices(currentProduct, variants);\n },\n\n // Configura a mesagem de ultimas unidades disponíveis\n setLastUnits: function (currentProduct, variant) {\n const lastUnitsWrapper = currentProduct.querySelector('.last-units');\n const availableQuantity = variant.quantity;\n\n if (availableQuantity <= 5) {\n if (!availableQuantity) {\n lastUnitsWrapper.innerHTML = '';\n lastUnitsWrapper.classList.remove('-visible');\n } else if (availableQuantity > 1) {\n lastUnitsWrapper.innerHTML = `Últimas ${availableQuantity} unidades disponíveis`;\n lastUnitsWrapper.classList.add('-visible');\n } else {\n lastUnitsWrapper.innerHTML = 'Última unidade disponível';\n lastUnitsWrapper.classList.add('-visible');\n }\n } else {\n lastUnitsWrapper.innerHTML = '';\n lastUnitsWrapper.classList.remove('-visible');\n }\n },\n\n // Configura o seletor de quantidade e suas mensagens\n setQuantitySelector: function (currentProduct) {\n const error = currentProduct.querySelector('.msg-response .msg-error');\n const buttonPlus = currentProduct.querySelector('[data-qtd-plus]');\n const buttonMinus = currentProduct.querySelector('[data-qtd-minus]');\n const input = currentProduct.querySelector('[name=\"quantity\"]');\n\n if (buttonPlus != null && buttonMinus != null) {\n buttonPlus.addEventListener('click', () => {\n const current = Number(input.value) + 1;\n const availableQuantity = Number(input.dataset.availableQuantity);\n\n if (!availableQuantity) {\n error.innerHTML = 'Produto em falta no estoque';\n error.classList.add('-visible');\n } else if (current > availableQuantity) {\n // Se o produto atingiu a quantidade máxima em estoque mostra uma mensagem\n error.innerHTML = 'Quantidade máxima em estoque.';\n error.classList.add('-visible');\n } else {\n input.value = current;\n input.setAttribute('value', current);\n }\n });\n\n buttonMinus.addEventListener('click', () => {\n const current = Number(input.value) - 1;\n\n if (current > 0) {\n input.value = current;\n input.setAttribute('value', current);\n\n // Se está mostrando a mensagem de quantidade máxima, remove ela\n if (error.classList.contains('-visible')) {\n error.classList.remove('-visible');\n }\n }\n });\n }\n },\n\n // Envia o formulário de compra\n submitForm: function (currentProduct) {\n currentProduct.addEventListener('submit', (event) => {\n event.preventDefault();\n\n const groupShop = currentProduct.closest('[data-product-box]').getAttribute('data-prod-group-shop');\n\n if (groupShop == null) {\n // Adição normal de produto - Compre Junto é controlado em outro componente\n const form = currentProduct;\n const parent = form.closest('[data-product-box]');\n\n const respValidated = Store.validateFormProduct(form);\n const boxResponse = parent.querySelector('.msg-response');\n\n if (respValidated.validated) {\n Store.addProduct(form, parent);\n } else {\n //console.info('não foi');\n Store.setRespValidateProduct(respValidated, form, boxResponse);\n }\n }\n });\n },\n\n // Lida com popup de compra rápida, retirar ou comentar caso não for utilizado\n popupPurchase: {\n popupEl: document.querySelector('[data-popup-purchase]'),\n currentOpenProduct: false,\n\n open: function (productBox) {\n // Salva o produto atual para referência futura\n ProductPurchase.popupPurchase.currentOpenProduct = productBox;\n\n // Clona elementos do produto e referencia o form de compra dele\n const clonedImages = productBox.querySelector('.images').cloneNode(true);\n const clonedName = productBox.querySelector('.name').cloneNode(true);\n const clonedPrice = productBox.querySelector('.price').cloneNode();\n const purchaseForm = productBox.querySelector('[data-product-purchase]');\n\n // Joga os elementos do produto dentro do popup\n const contentBox = this.popupEl.querySelector('.product');\n const leftBox = document.createElement('div');\n const rightBox = document.createElement('div');\n\n const moreLink = document.createElement('a')\n moreLink.classList.add('more-link')\n moreLink.innerText = 'Mais detalhes'\n moreLink.setAttribute('href', productBox.querySelector('a').getAttribute('href'))\n\n let priceWrapper = document.createElement('div');\n priceWrapper.classList.add('price-wrapper');\n priceWrapper.appendChild(clonedPrice);\n\n leftBox.appendChild(clonedImages);\n rightBox.appendChild(clonedName);\n rightBox.appendChild(priceWrapper);\n rightBox.appendChild(purchaseForm);\n rightBox.appendChild(moreLink)\n\n contentBox.appendChild(leftBox);\n contentBox.appendChild(rightBox);\n\n // Atualiza o componente de preço dentro do popup e exibe\n clonedPrice.setAttribute('data-was-processed', false);\n window.Vnda.Component.Price.update();\n\n this.popupEl.classList.add('-active');\n },\n\n close: function () {\n // CHAMAR UMA ÚNICA VEZ\n // Instancia funcionamento ao clicar no botão de fechar o popup\n const popup = this.popupEl;\n const closeButtons = popup.querySelectorAll('[data-close-popup-purchase]');\n\n closeButtons.forEach((button) => {\n if (button.getAttribute('data-processed') == 'false') {\n button.addEventListener('click', () => {\n popup.classList.remove('-active');\n\n setTimeout(() => {\n // Retorna o formulário para o produto correspondente\n const purchaseForm = popup.querySelector('[data-product-purchase]');\n ProductPurchase.popupPurchase.currentOpenProduct.appendChild(purchaseForm);\n ProductPurchase.popupPurchase.currentOpenProduct = false;\n\n // Limpa os dados do produto do popup\n const popupProductEl = popup.querySelector('.product');\n while (popupProductEl.firstChild) {\n popupProductEl.removeChild(popupProductEl.firstChild);\n }\n }, 300);\n });\n button.setAttribute('data-processed', true);\n }\n });\n },\n },\n\n // Procura os inputs que correspondem a variante de menor preço e os marca\n setLowerPrices: function (currentProduct, variants) {\n // Filtra as variantes para montar um array com apenas as disponiveis\n const variantsLowPriceOrder = variants.filter(variant => variant.available );\n variantsLowPriceOrder.sort((previous, current) => {\n let pricePrevious = previous.price;\n let priceCurrent = current.price;\n \n if (pricePrevious < priceCurrent) return -1;\n if (pricePrevious > priceCurrent) return 1;\n return 0;\n })\n\n if (variantsLowPriceOrder.length > 0) {\n // Procura dentro do array de variantes a que possui o menor preço\n const lowestPriceVariant = variantsLowPriceOrder.reduce((previous, current) => previous.price < current.price ? previous : current);\n \n const productBox = currentProduct.closest('[data-product-box]');\n const productInputs = currentProduct.querySelectorAll('input[type=\"radio\"]');\n const lowestPriceVariantProperties = [];\n \n // Pega os valores de cada atributos e os insere para um array\n for (let property in lowestPriceVariant.properties) {\n if (lowestPriceVariant.properties[property]) {\n lowestPriceVariantProperties.push(lowestPriceVariant.properties[property].value);\n }\n }\n \n // Itera os inputs e as propriedades para simular o click nas correspondentes à variante de menor valor\n productInputs.length > 0 && productInputs.forEach(input => {\n \n lowestPriceVariantProperties.length > 0 && lowestPriceVariantProperties.forEach(property => {\n if (input.value == property) {\n input.click();\n \n // Aplica atributo que sinaliza a finalização de seleçao de variante de menor preço\n productBox.setAttribute('data-checked-lowest-price', true)\n }\n }) \n \n })\n }\n },\n\n init: function (update) {\n const triggerUpdate = update || false;\n if (triggerUpdate) {\n this.products = document.querySelectorAll('[data-product-purchase]');\n this.productVariants = productVariants;\n }\n\n const { products, checkCombinations, checkSelection, markFirstVariant, submitForm, setQuantitySelector } = this;\n\n // Instancia funcionamento de fechar o popup de compra rápida, retirar ou comentar caso não for utilizado\n ProductPurchase.popupPurchase.close();\n\n if (products.length > 0)\n products.forEach((product) => {\n if (product.getAttribute('data-processed') == 'false') {\n const attrOptions = product.querySelectorAll('[data-attribute-value]');\n const attrInputs = product.querySelectorAll('input');\n\n // Remarca demais atributos ao clicar em uma opção\n attrOptions.forEach((attr) => {\n attr.addEventListener('click', () => {\n checkCombinations(product, attr);\n });\n });\n\n // Verifica variante para combinação de atributos selecionados\n attrInputs.forEach((input) => {\n input.addEventListener('change', () => {\n checkSelection(product);\n });\n });\n\n setQuantitySelector(product);\n markFirstVariant(product);\n submitForm(product);\n product.setAttribute('data-processed', true);\n\n // Abre o popup de compra rápida, retirar ou comentar caso não for utilizado\n const openPopupPurchaseButton = product.parentElement.querySelector('[data-open-popup-purchase]');\n if (openPopupPurchaseButton != null) {\n openPopupPurchaseButton.addEventListener('click', () => {\n ProductPurchase.popupPurchase.open(product.parentElement);\n });\n }\n }\n });\n\n window.ProductPurchase = ProductPurchase\n },\n};\n\nexport default ProductPurchase;\n","import { addAsset } from './utilities';\r\n\r\n// ===============================================================\r\n// NEWSLETTER POPUP\r\n// ===============================================================\r\nexport const NewsletterComponent = {\r\n root: document.querySelector('#component-popup-newsletter-root'),\r\n settings: window.popupNewsletterSettings || false,\r\n loaded: false,\r\n\r\n setPopupNewsletter: function () {\r\n const { settings, root } = NewsletterComponent;\r\n\r\n // Define propriedades do componente\r\n let maxWidth = settings.maxWidth;\r\n let imageUrl = settings.imageUrl;\r\n let title = settings.title;\r\n let description = settings.description;\r\n let subdomain = settings.subdomain;\r\n let successMessage = settings.success;\r\n\r\n // Inicia o componente\r\n const componentNewsletterPopup = new Vnda.Component.NewsletterPopup({\r\n maxWidth: maxWidth,\r\n maxHeight: 500,\r\n imageUrl: imageUrl,\r\n imagePosition: 'left',\r\n popupPosition: 'center',\r\n title: title,\r\n description: description,\r\n textBtnSubmit: 'Enviar',\r\n classBtnSubmit: 'button-newsletter',\r\n formKey: `${subdomain}-newsletter`,\r\n hasNameField: false,\r\n hasLastNameField: false,\r\n hasDateOfBirthField: false,\r\n hasPhoneField: true,\r\n successMessage: successMessage,\r\n delay: 500,\r\n frequency: '7',\r\n language: 'pt-BR',\r\n });\r\n\r\n // Renderiza o componente e marca como carregado\r\n componentNewsletterPopup.render(root);\r\n NewsletterComponent.loaded = true;\r\n },\r\n\r\n loadPopupNewsletter: function () {\r\n if (!NewsletterComponent.loaded) {\r\n const { settings } = NewsletterComponent;\r\n addAsset(settings.script, NewsletterComponent.setPopupNewsletter);\r\n addAsset(settings.styles);\r\n }\r\n },\r\n\r\n init: function () {\r\n if (localStorage.getItem('newsletterFormPopup')) return;\r\n\r\n const { root, settings } = this;\r\n if (!root || !settings) return;\r\n\r\n const eventType = window.innerWidth <= 1024 ? 'scroll' : 'mousemove';\r\n window.addEventListener(\r\n eventType,\r\n () => {\r\n NewsletterComponent.loadPopupNewsletter();\r\n },\r\n { once: true }\r\n );\r\n },\r\n};\r\n\r\n// ===============================================================\r\n// PREÇO\r\n// ===============================================================\r\n// Carrega o componente de preço quando um product-block ou product-infos entra em tela\r\nexport const PriceComponent = {\r\n script: window.priceComponent || false,\r\n loaded: false,\r\n\r\n init: function () {\r\n if (!PriceComponent.script) return;\r\n\r\n const productContainers = document.querySelectorAll('[data-product-box]');\r\n\r\n if (productContainers.length === 0) return;\r\n\r\n const observer = new IntersectionObserver(\r\n (entries) => {\r\n if (entries[0].isIntersecting) {\r\n if (!PriceComponent.loaded) {\r\n addAsset(PriceComponent.script);\r\n PriceComponent.loaded = true;\r\n }\r\n observer.disconnect();\r\n }\r\n },\r\n { threshold: 0.1 }\r\n );\r\n\r\n productContainers.forEach((product) => {\r\n observer.observe(product);\r\n });\r\n },\r\n};\r\n","import CartDrawer from './common/cartDrawer';\nimport Footer from './common/footer';\nimport Header from './common/header';\nimport MenuMobile from './common/menuMobile';\nimport Popup from './components/popup';\nimport Webforms from './common/webforms';\nimport ProductPurchase from './components/productPurchase';\nimport { NewsletterComponent, PriceComponent } from './components/vndaComponents.js';\nimport { setSearch } from './components/utilities';\n\nlet threshold = 700;\nif (window.innerWidth < 768) threshold = 400\n\nwindow.lazyLoadOptions = {\n elements_selector: \".lazy\",\n threshold\n};\n\nwindow.addEventListener(\"LazyLoad::Initialized\", event => {\n window.lazyLoadInstance = event.detail.instance\n}, { passive: true });\n\n// ==========================================\n// Inicialização\n// ==========================================\nconsole.log(\n '%cVnda - Tecnologia em Ecommerce',\n 'color: #f88d5b; font-size: 15px; font-family: \"Verdana\", sans-serif; font-weight: bold;'\n);\n\nwindow.addEventListener('DOMContentLoaded', () => {\n CartDrawer.init();\n Header.init();\n Footer.init();\n Popup.init();\n ProductPurchase.init();\n PriceComponent.init();\n Webforms.init();\n NewsletterComponent.init();\n setSearch();\n if (window.innerWidth < 992) MenuMobile.init()\n});\n"],"names":["addAsset","source","onloadCallback","console","error","includes","scriptTag","document","createElement","setAttribute","onload","body","appendChild","linkTag","head","serializeArray","form","formData","FormData","data","name","value","formBody","key","encodeKey","encodeURIComponent","encodeValue","push","join","CartDrawer","root","querySelector","buttons","querySelectorAll","countWrapper","settings","window","cartDrawerSettings","setCartDrawer","freeShipping","freeShippingValue","componentCartDrawer","Vnda","Component","anchor","display","startOpen","titleCart","disableShippingCalculation","render","instance","dispatchEvent","Event","loadComponent","script","styles","handleCartButton","button","classList","contains","add","show","remove","callback","mmenu","close","addEventListener","open","getCartItens","async","response","fetch","json","updateCartCount","_itemsCount","items","this","innerHTML","init","_this","length","forEach","handleSubmenu","menu","toggle","lastScrollTop","scrollTop","pageYOffset","header","setScroll","newSt","MmToggler","mediaquery","listener","evnt","matches","matchFns","unmatchFns","toggler","matchMedia","addListener","prototype","match","unmatch","r","list","Array","slice","call","selector","context","prefix","MmSlidingPanelsNavigation","node","title","selectedClass","slidingSubmenus","theme","_setSelectedl","_initAnchors","Object","defineProperty","get","enumerable","configurable","openPanel","panel","listitem","parentElement","title_1","dataset","mmSpnTitle","children","child","textContent","parent_1","closest","isOpened","parent_2","listitems","target","handled","clickAnchor","openSubmenu","panels","parent_3","closeSubmenu","stopImmediatePropagation","MmOffCanvasDrawer","position","wrapper","content","append","backdrop","passive","MmenuLight","mediaQuery","navigation","options","navigator","_a","_b","_c","_d","offcanvas","drawer","orgLocation_1","createComment","after","setMenuMobile","mmenuWrapper","e","preventDefault","log","togglePopup","popupType","popup","Webforms","submitWebForm","email","textBtnDefault","method","headers","ok","info","reset","setTimeout","text","status","submitNotify","btnTextDefault","showMessage","input","alertMessage","innerText","validateForm","vndaInput","submitAllowed","type","checked","id","setWebForms","webForms","fieldset","inputPhone","inputCEP","inputCPF","inputCNPJ","phoneValue","replace","cepValue","cpfValue","cnpjValue","formMasks","Store","openCartDrawer","openCartDrawerMobile","addProduct","parent","customizations","quantity","Number","custom","getAttribute","addItemsCustom","addItem","btnComprar","boxResponse","hasCustoms","customs","sku","disabled","index","json_data","JSON","stringify","html","addItemResult","removeAttribute","string","encode","s","pair","entries","urlencodeFormData","deleteItem","itemId","item","removeItemResult","_method","item_id","innerWidth","validateFormProduct","validated","errors","available","setRespValidateProduct","resp","htmlErrors","i","typeResult","result","textAvailable","location","href","urlCart","popupPurchase","click","scrollTo","top","offsetTop","behavior","ProductPurchase","productVariants","products","checkCombinations","currentProduct","selectedAttribute","productId","selectedAttr","variants","attributes","attr1","attr2","attr3","selectedAttributes","markAttributes","attr","property","attrsToCheck","validVariants","filter","variant","properties","validAttr1","validAttr2","validAttr3","property1","property2","property3","valueToCheck","firstAvailable","checkSelection","productBox","selectedAttrs","attr1Value","attr2Value","attr3Value","event","CustomEvent","detail","productContainer","setAvailable","setUnavailable","setLastUnits","updatePrice","hasAttribute","addButton","currentProductWrapper","formNotify","showNotify","showFormNotify","undefined","productMainContainer","priceEl","groupShop","price","discount","discountPercent","style","setProperty","sale_price","markFirstVariant","allAttr1","allAttr2","allAttr3","attrToCheck","attribute","hasFirstAvailable","setLowerPrices","lastUnitsWrapper","availableQuantity","setQuantitySelector","buttonPlus","buttonMinus","current","submitForm","respValidated","popupEl","currentOpenProduct","clonedImages","cloneNode","clonedName","clonedPrice","purchaseForm","contentBox","leftBox","rightBox","moreLink","priceWrapper","Price","update","popupProductEl","firstChild","removeChild","variantsLowPriceOrder","sort","previous","pricePrevious","priceCurrent","lowestPriceVariant","reduce","productInputs","lowestPriceVariantProperties","product","attrOptions","attrInputs","openPopupPurchaseButton","NewsletterComponent","popupNewsletterSettings","loaded","setPopupNewsletter","maxWidth","imageUrl","description","subdomain","successMessage","success","NewsletterPopup","maxHeight","imagePosition","popupPosition","textBtnSubmit","classBtnSubmit","formKey","hasNameField","hasLastNameField","hasDateOfBirthField","hasPhoneField","delay","frequency","language","loadPopupNewsletter","localStorage","getItem","eventType","once","PriceComponent","priceComponent","productContainers","observer","IntersectionObserver","isIntersecting","disconnect","threshold","observe","lazyLoadOptions","elements_selector","lazyLoadInstance","toggleButton","search","focus","setSearch"],"sourceRoot":""}