{"version":3,"file":"main.js","mappings":"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","sources":["webpack://build/../naturalathletic/assets/javascripts/californio.header.js","webpack://build/../naturalathletic/assets/javascripts/californio.js","webpack://build/../naturalathletic/assets/javascripts/californio.product.js","webpack://build/../naturalathletic/assets/javascripts/californio.tag.js","webpack://build/webpack/bootstrap","webpack://build/../naturalathletic/assets/javascripts/common/lazyLoading.js","webpack://build/../naturalathletic/assets/javascripts/common/loadPurchase.js","webpack://build/../naturalathletic/assets/javascripts/components/utilities.js","webpack://build/../naturalathletic/assets/javascripts/common/cartDrawer.js","webpack://build/../naturalathletic/assets/javascripts/common/footer.js","webpack://build/../naturalathletic/assets/javascripts/common/header.js","webpack://build/../naturalathletic/node_modules/mmenu-light/esm/modules/match-media-toggler/index.js","webpack://build/../naturalathletic/node_modules/mmenu-light/esm/modules/helpers.js","webpack://build/../naturalathletic/node_modules/mmenu-light/esm/modules/sliding-panels-navigation/index.js","webpack://build/../naturalathletic/node_modules/mmenu-light/esm/modules/offcanvas-drawer/index.js","webpack://build/../naturalathletic/node_modules/mmenu-light/esm/core/index.js","webpack://build/../naturalathletic/node_modules/mmenu-light/src/mmenu-light.js","webpack://build/../naturalathletic/assets/javascripts/common/menuMobile.js","webpack://build/../naturalathletic/assets/javascripts/components/popup.js","webpack://build/../naturalathletic/assets/javascripts/common/webforms.js","webpack://build/../naturalathletic/assets/javascripts/components/vndaComponents.js","webpack://build/../naturalathletic/assets/javascripts/main.js"],"sourcesContent":["const Header = {\n //#region Sleep\n sleep: function (seconds = 0) {\n /**\n * Função que retorna uma Promise que resolve após um determinado tempo em segundos\n * @param {number} seconds - Tempo em segundos\n * */\n\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n },\n\n //----------------------------------------------------------------------------\n\n //#region HandleSearchBar\n handleSearchBar: () => {\n /**\n * Função que gerencia o campo de busca, botões de abrir e fechar a busca\n * e a lista de mensagens do campo de busca\n */\n\n function animationPlaceholder(input, values = [], time) {\n /**\n * Função que anima o placeholder do campo de busca\n * @param {HTMLElement} input - Campo de busca\n * @param {Array} values - Lista de mensagens\n * @param {number} time - Tempo em milissegundos\n * */\n\n // cializa o índice\n let index = 0;\n\n // Altera o placeholder do campo de busca a cada 3 segundos e exibe a mensagem da lista\n setInterval(() => {\n input.placeholder = values[index];\n index = (index + 1) % values.length;\n }, time);\n }\n\n //--------------------------------------------------------------------------\n\n // Seleciona o container de busca, botão de abrir e fechar a busca e o campo de busca\n let containerSearchClass;\n let buttonCloseSearchClass;\n let inputSearchClass;\n\n if (window.innerWidth <= 767) {\n containerSearchClass = 'container-search-mobile';\n buttonCloseSearchClass = 'button-close-search-mobile';\n inputSearchClass = 'input-search-mobile';\n } else {\n containerSearchClass = 'container-search';\n buttonCloseSearchClass = 'button-close-search';\n inputSearchClass = 'input-search-desktop';\n }\n const containerSearch = document.querySelector(`.${containerSearchClass}`);\n const buttonOpen = document.querySelector(`.button-open-search`);\n const buttonClose = document.querySelector(`.${buttonCloseSearchClass}`);\n const inputSearch = document.querySelector(`.${inputSearchClass}`);\n\n // window.searchSuggestions é uma variável global que armazena as sugestões de busca, ela é inicializada em layout.liquid\n let messages = [...window.searchSuggestions];\n\n // Altera o placeholder do campo de busca a cada 3 segundos\n animationPlaceholder(inputSearch, messages, 3000);\n\n // Array de botões\n const buttons = [buttonOpen, buttonClose];\n\n // Adiciona um evento de click para cada botão e exibe/oculta o campo de busca\n buttons.forEach((button) => {\n button.addEventListener('click', () => {\n buttonOpen.classList.contains(`visible`) && inputSearch.focus();\n containerSearch.classList.toggle(`visible`);\n buttonOpen.classList.toggle(`visible`);\n });\n });\n },\n\n //----------------------------------------------------------------------------\n\n //#region HandleCustomMenu\n handleCustomMenu: function () {\n /**\n * Função que gerencia o menu personalizado\n */\n\n // Seleciona o hamburger, o menu e o container de fundo\n const hamburger = document.querySelector('.hamburger');\n const menu = document.querySelector('.menu');\n const backgroundContainer = document.querySelector('.background-container');\n const containerSearch = document.querySelector('.container-search');\n const buttonClose = document.querySelector(`.button-close-search`);\n\n if (!hamburger && !menu) return;\n\n hamburger.addEventListener('click', () => {\n buttonClose && containerSearch && containerSearch.classList.contains(`visible`) && buttonClose.click();\n menu.classList.toggle('open');\n backgroundContainer.classList.toggle('open');\n Californio.sleep(0.5).then(() => {\n menu.classList.toggle('zero-state');\n });\n });\n\n menu.addEventListener('mouseleave', () => {\n menu.classList.remove('open');\n Californio.sleep(0.5).then(() => {\n menu.classList.add('zero-state');\n });\n });\n\n backgroundContainer.addEventListener('click', () => {\n menu.classList.toggle('open');\n backgroundContainer.classList.toggle('open');\n Californio.sleep(0.5).then(() => {\n menu.classList.toggle('zero-state');\n });\n });\n\n backgroundContainer.addEventListener('touchstart', () => {\n menu.classList.remove('open');\n backgroundContainer.classList.remove('open');\n Californio.sleep(0.5).then(() => {\n menu.classList.add('zero-state');\n });\n });\n },\n\n //----------------------------------------------------------------------------\n\n //#region EnableBackgroundOpaque\n enableBackgroundOpaque: function () {\n /**\n * Função que habilita o background opaco do menu\n */\n\n // Se a largura da tela for menor ou igual a 767px, retorna\n if (window.innerWidth <= 767) return;\n\n // Seleciona o menu, os itens do menu e o background opaco\n const menu = document.querySelector('.header .menu');\n const menuItens = Array.from(menu.querySelectorAll('.menu-item'));\n const backgroundOpaque = menu.querySelector('.background-opaque');\n\n // Adiciona um evento de mouseenter e mouseleave para cada item do menu\n menuItens.forEach((menu) => {\n // Se o item do menu não possuir submenu, retorna\n if (!menu.classList.contains('has-submenu')) return;\n\n // Quando o mouse entra no item do menu, exibe o background opaco\n menu.addEventListener('mouseenter', () => {\n backgroundOpaque.classList.add('visible');\n });\n\n // Quando o mouse sai do item do menu, oculta o background opaco\n menu.addEventListener('mouseleave', () => {\n backgroundOpaque.classList.remove('visible');\n });\n });\n },\n\n //----------------------------------------------------------------------------\n\n //#region Init\n init: function () {\n /**\n * Função que inicializa as funções da página\n */\n const _this = this;\n\n // _this.enableBackgroundOpaque();\n _this.handleSearchBar();\n // _this.handleCustomMenu();\n },\n};\n\nexport default Header;\n","import Header from './californio.header.js';\nimport Tag from './californio.tag.js';\nimport Product from './californio.product.js';\n\nconst CalifornioNew = {\n //#region ShowBrand\n showBrand: function () {\n /**\n * Função para exibir a marca da Californio no console\n * */\n\n console.info(\n `%c💻 Califórnio - MKT Digital %c\\n🌐 https://www.californio.com.br/`,\n `color: white; background: linear-gradient(90deg, #333, #666); font-size: 16px; font-weight: bold; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; text-shadow: 1px 1px 2px rgba(0,0,0,0.3); padding: 6px 12px; margin: 8px 0px 2px; border-radius: 6px;`,\n `color: gray; font-size: 12px; font-weight: 500; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; padding: 6px 12px; margin: 2px 0px; border-radius: 6px;`\n );\n },\n\n //--------------------------------------------------------------------------------\n // Função para desabilitar o scroll da página\n\n disableScroll: () => {\n document.body.style.overflow = 'hidden';\n },\n\n //--------------------------------------------------------------------------------\n // Função para habilitar o scroll da página\n enableScroll: () => {\n document.body.style.overflow = 'auto';\n },\n\n //--------------------------------------------------------------------------------\n //#region HandleLoginStyle\n handleLoginStyle: function () {\n /**\n * Função que sobrescreve o estilo do botão de login\n */\n // Seleciona o atributo data-page da tag body\n const page = document.body.getAttribute('data-page');\n\n if (page !== 'login') return;\n\n // Seleciona o botão de login\n const login = Array.from(document.querySelectorAll('.cmp-buyer-login-button'));\n\n // Verifica se o botão de login existe\n if (login.length > 0) {\n // Cria um elemento 'style'\n let style = document.createElement('style');\n\n // Define o conteúdo do elemento 'style'\n style.innerHTML = `\n .cmp-buyer-login-button{\n background-color: var(--primary-color) !important;\n border-radius: 0 !important;\n font-weight: var(--font-weight-thin) !important;\n height: 4.2rem !important;\n padding: 0.6rem 2rem 0.4rem !important;\n text-transform: capitalize !important;\n \n &:hover{\n background-color: var(--primary-color) !important;\n }\n\n }\n .cmp-buyer-login-input{\n border: 1px solid var(--primary-color) !important;\n color: var(--primary-color) !important;\n padding: 2rem 0.5rem 1rem !important;\n }\n .cmp-buyer-login-label{\n color: var(--primary-color) !important;\n }\n `;\n\n // Anexa o elemento 'style' ao 'head' do documento\n document.head.appendChild(style);\n }\n },\n\n //--------------------------------------------------------------------------------\n\n //#region HandleLgpdBannerStyle\n handleLgpdBannerStyle: function () {\n /**\n * Função que sobrescreve o estilo do banner de LGPD\n */\n\n // Cria um elemento 'style'\n let style = document.createElement('style');\n\n // Define o conteúdo do elemento 'style'\n style.innerHTML = `\n #lgpd-banner{\n font-family: var(--font-family-base) !important;\n border-radius: 0 !important;\n }\n #lgpd-banner .lgpd-banner-action button{\n background-color: var(--primary-color) !important;\n color: var(--white) !important;\n border: 1px solid var(--primary-color) !important;\n border-radius: 0 !important;\n padding: 0.5rem 2rem !important;\n height: 4.2rem !important;\n text-transform: capitalize !important;\n\n &:hover{\n background-color: var(--primary-color) !important;\n border: 1px solid var(--primary-color) !important;\n color: var(--white) !important;\n }\n }\n `;\n\n // Anexa o elemento 'style' ao 'head' do documento\n document.head.appendChild(style);\n },\n\n handlePopupCupom: function () {\n const popup = document.querySelector('.cupom-popup');\n if (!popup) return;\n\n const btnCopy = popup.querySelector('[data-button-copy]');\n\n btnCopy.addEventListener('click', function () {\n const cupomText = btnCopy.textContent;\n\n navigator.clipboard\n .writeText(cupomText)\n .then(() => {\n btnCopy.textContent = 'Copiado!';\n\n setTimeout(() => {\n popup.classList.remove('-active');\n }, 1500);\n })\n .catch((err) => {\n console.error('Erro ao copiar o cupom:', err);\n });\n });\n },\n\n //--------------------------------------------------------------------------------\n //#region loadVideos\n loadVideos: function () {\n /**\n * Função para carregar vídeos de acordo com a rolagem da página\n */\n\n // Seleciona todos os iframes verticais\n const iframes = Array.from(document.querySelectorAll(`.iframe.vertical`));\n\n // Função para setar o atributo src do iframe\n function setAttributeSrc(iframe) {\n const src = iframe.getAttribute('data-attribute-src');\n if (src) {\n iframe.setAttribute('src', src);\n }\n }\n\n // Configurações do IntersectionObserver\n const observerOptions = {\n root: null,\n rootMargin: '15px',\n threshold: 0.1, // O vídeo será carregado quando 10% dele estiver visível\n };\n\n // Cria um novo IntersectionObserver\n const observer = new IntersectionObserver((entries, observer) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setAttributeSrc(entry.target);\n observer.unobserve(entry.target); // Para de observar o elemento após carregar o vídeo\n }\n });\n }, observerOptions);\n\n // Observa cada iframe\n iframes.forEach((iframe) => {\n observer.observe(iframe);\n });\n },\n\n //--------------------------------------------------------------------------------\n lockScreen: function () {\n const alert = document.querySelector('#alert');\n\n // Verifica se o alerta existe e remove a classe 'hidden'\n if (alert) {\n alert.classList.remove('hidden');\n this.disableScroll();\n }\n },\n\n //--------------------------------------------------------------------------------\n\n //#region Init\n init: function () {\n /**\n * Função que Inicializa todas as funções da Californio\n */\n\n const _this = this;\n\n Header.init();\n Tag.init();\n Product.init();\n\n _this.showBrand();\n _this.handleLoginStyle();\n _this.handleLgpdBannerStyle();\n _this.handlePopupCupom();\n // _this.lockScreen();\n },\n};\n\nexport default CalifornioNew;\n","const Product = {\n //#region Sleep\n sleep: function (seconds = 0) {\n /**\n * Função que retorna uma Promise que resolve após um determinado tempo em segundos\n * @param {number} seconds - Tempo em segundos\n * */\n\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n },\n\n //--------------------------------------------------------------------------------\n\n //#region HandleSizeGuidePopupWidth\n handleSizeGuidePopupWidth: function () {\n /**\n * Função que ajusta a largura do popup de guia de tamanhos\n */\n\n // Função responsável por ajustar a largura do popup de guia de tamanhos\n function adjustSizeGuidePopupWidth() {\n // Seleciona o popup de guia de tamanhos\n const sizeGuidePopup = document.querySelector(`.popup-guia-medidas`);\n\n // Verifica se o popup de guia de tamanhos existe e está visível\n if (sizeGuidePopup) {\n // Seleciona o wrapper do popup, o conteúdo do popup e a imagem do popup\n const popupWrapper = sizeGuidePopup.querySelector(`.popup-wrapper`);\n const popupContent = popupWrapper.querySelector(`.content`);\n const popupImage = popupContent.querySelector(`.image`);\n\n // Obtém as dimensões da imagem do popup\n let popupImageRect = popupImage.getBoundingClientRect();\n\n // Ajusta a largura e altura do wrapper do popup\n popupWrapper.style.width = innerWidth >= 768 ? `45%` : `90%`;\n popupWrapper.style.height = `fit-content`;\n\n // Ajusta a largura do container que recebe a imagem do popup\n popupImage.style.width = `100%`;\n }\n }\n\n // Seleciona o botão de guia de tamanhos\n const buttonSizeGuide = document.querySelector(`.btn-medidas`);\n\n if (buttonSizeGuide) {\n // Adiciona um evento de click no botão de guia de tamanhos\n buttonSizeGuide.addEventListener(`click`, () => {\n adjustSizeGuidePopupWidth();\n });\n }\n },\n\n //--------------------------------------------------------------------------------\n\n //#region HandleProductSizeSelector\n handleProductSizeSelector: function () {\n /**\n * Função que desabilita os inputs de tamanhos e o botão de compra no layout\n * mobile, impedindo que o usuário envie o formulário sem tamanho selecionado.\n */\n\n if (window.innerWidth > 768) return;\n\n // Seleciona o container de informações da compra\n const infosCompra = document.querySelector(`.infos-compra`);\n\n function clearInputsChecked(element) {\n // Seleciona todos os inputs de tamanhos e o botão de compra\n const lastUnits = element.querySelector(`.last-units`);\n const inputArray = Array.from(element.querySelectorAll(`.option-Tamanho input`));\n const buttonDefault = element.querySelector(`.btn-product-block`);\n const buttonPurchase = element.querySelector(`.add-to-cart-button`);\n\n // Atribui novas propriedades ao botão de compra para desabilitá-lo\n buttonPurchase.disabled = true;\n\n if (buttonPurchase.innerHTML === `Indisponível`) {\n return;\n }\n\n buttonPurchase.innerHTML = `Selecione um tamanho`;\n Product.scrollToAttributesInfos();\n\n buttonPurchase.style.cursor = `default`;\n\n // Desabilita a exibição do aviso de últimas unidades\n lastUnits && lastUnits.classList.remove(`-visible`);\n\n // Percorre todos os inputs e desabilita os que aparecem marcados\n inputArray.forEach((input) => {\n input.checked = false;\n\n // Adiciona um evento de change em cada input\n input.addEventListener(`change`, function () {\n let label = input.nextElementSibling;\n\n // Verifica se o input se refere a um tamanho indisponível\n // Se sim, desabilita o botão de compra, se não, habilita o botão de compra\n if (label.classList.contains(`-unavailable`)) {\n // Atribui novas propriedades ao botão de compra para desabilitá-lo\n buttonPurchase.disabled = false;\n buttonPurchase.innerText = `Esgotado`;\n buttonPurchase.style.cursor = `pointer`;\n buttonPurchase.style.backgroundColor = `var(--gray-1)`;\n buttonPurchase.style.color = `var(--white)`;\n // Adiciona a classe visible no botão de compra e remove a classe visible do botão padrão\n buttonDefault && buttonDefault.classList.remove(`visible`);\n buttonPurchase.classList.add(`visible`);\n } else {\n // Atribui novas propriedades ao botão de compra para desabilitá-lo\n buttonPurchase.disabled = false;\n buttonPurchase.innerText = `Adicionar ao Carrinho`;\n buttonPurchase.style.cursor = `pointer`;\n buttonPurchase.style.backgroundColor = `var(--primary-color)`;\n buttonPurchase.style.border = `1px solid var(--primary-color)`;\n buttonPurchase.style.color = `var(--white)`;\n // Adiciona a classe visible no botão de compra e remove a classe visible do botão padrão\n buttonDefault && buttonDefault.classList.remove(`visible`);\n buttonPurchase.classList.add(`visible`);\n }\n });\n });\n }\n\n // Verifica se o container existe\n if (infosCompra) {\n // Chama a função para desabilitar os inputs de tamanhos e o botão de compra\n\n Product.sleep(0.7).then(() => {\n clearInputsChecked(infosCompra);\n });\n }\n },\n\n //--------------------------------------------------------------------------------\n\n //#region scrolltoAttributesInfos\n scrollToAttributesInfos: function () {\n /**\n * Função que rola a página até o container de informações do produto\n */\n\n // Seleciona o botão de adicionar nome e o container de informações do produto\n const infosCompra = document.querySelector(`.infos-compra`);\n const buttonTempLink = document.querySelector(`.button-temp-link`);\n\n // Verifica se o botão de adicionar nome existe\n if (!infosCompra && !buttonTempLink) return;\n\n // Cria listener de scroll\n buttonTempLink.addEventListener(`click`, () => {\n // Se o botão de adicionar nome for clicado, rola a página até a base do container de informações do produto ficar acima do topo do name-price-add-button\n window.scrollTo({\n top: infosCompra.getBoundingClientRect().top - 130,\n behavior: `smooth`,\n });\n });\n },\n\n //--------------------------------------------------------------------------------\n\n //#region HandlerProductDescription\n handlerProductDescription: () => {\n /**\n * Função que exibe/oculta a descrição completa do produto\n */\n\n // Seleciona a descrição original do produto\n const descriptionOriginal = document.querySelector(`.description-height`);\n\n // Verifica se a descrição original do produto existe\n if (!descriptionOriginal) return;\n\n // Obtém a altura da descrição do produto\n const descriptionHeight = descriptionOriginal.getBoundingClientRect().height;\n\n // Seleciona o botão e a descrição do produto\n const shortDescription = document.querySelector(`.short-description`);\n const button = document.querySelector(`.button-expand-shrink`);\n\n // Adiciona evento de click para o botão\n button.addEventListener(`click`, () => {\n // Alterna a classe expanded\n shortDescription.classList.toggle(`expanded`);\n\n // Altera a altura da descrição do produto\n shortDescription.style.height = shortDescription.classList.contains(`expanded`)\n ? `${descriptionHeight}px`\n : `var(--short-description-height)`;\n\n // Altera o texto do botão\n button.innerHTML = shortDescription.classList.contains(`expanded`)\n ? `

Mostrar menos

`\n : `

Ler mais

`;\n });\n },\n\n //--------------------------------------------------------------------------------\n\n //#region listenerChangeSKU\n listenerChangeSKU: function () {\n /**\n * Função que escuta a mudança de SKU na página de produto\n */\n\n // Seleciona o container de informações do produto\n let sectionProduct = document.querySelector(`[data-section-product]`);\n\n // Verifica se o container de informações do produto existe\n if (!sectionProduct) return;\n\n // Adiciona um evento de mudança de SKU no container de informações do produto\n sectionProduct.addEventListener('vnda:sku-change', (event) => {\n // Chamada da função que atualiza a barras de progresso e os bullets\n Product.handleImageProgressBar();\n });\n },\n\n //--------------------------------------------------------------------------------\n\n //#region handleImageProgressBar\n handleImageProgressBar: function () {\n /**\n * Função que atualiza a barra de progresso\n */\n\n // Seleciona o atributo data-page da tag body\n const page = document.body.getAttribute('data-page');\n\n // Verifica se a página é a de produto\n if (page !== 'product') return;\n\n // Seleciona a barra de progresso\n const progressBar = document.querySelector('.progress-bar__fill');\n const images = Array.from(document.querySelectorAll(`.main-slider .item-image`));\n\n // Verifica se a barra de progresso e as imagens existem\n const elementsToRemove = Array.from(document.querySelectorAll('.bullet'));\n\n // Verifica se existem bullets para serem removidos\n if (elementsToRemove.length > 0) {\n // Remove todos os bullets\n elementsToRemove.forEach((element) => {\n element.remove();\n });\n }\n\n const bullet = document.createElement('div');\n const bulletActive = document.createElement('div');\n\n bullet.classList.add(`bullet`);\n bulletActive.classList.add(`bullet`, `active`);\n\n // Verifica se a barra de progresso e as imagens existem\n if (!progressBar && !images) return;\n\n // Verifica se a largura da tela é menor que 768px\n if (window.innerWidth >= 768) {\n // Atribui a altura da barra de progresso\n progressBar.style.height = 100 / images.length + '%';\n } else {\n // Verifica se o bullet existe\n if (bullet) {\n // Percorre todas as imagens e adiciona um bullet para cada uma\n images.forEach((image, index) => {\n // Caso seja a primeira imagem, adiciona o bullet ativo\n if (index === 0) {\n progressBar.appendChild(bulletActive);\n } else {\n let bulletCopy = bullet.cloneNode(true);\n progressBar.appendChild(bulletCopy);\n }\n });\n }\n }\n },\n\n //--------------------------------------------------------------------------------\n\n //#region HandleNameAddButtonStyle\n handleNameAddButtonStyle: function () {\n /**\n * Função que oculta o botão de adicionar ao carrinho quando o footer está visível\n * e ajusta o posicionamento do botão de WhatsApp\n */\n\n if (window.innerWidth >= 768) return;\n\n // Seleciona o botão de adicionar ao carrinho, o footer e o botão de WhatsApp\n const nameAddButton = document.querySelector(`.actions-wrapper`);\n const footer = document.querySelector(`.footer`);\n const whatsappButton = document.querySelector(`.whatsapp-widget`);\n\n if (!nameAddButton || !footer) return;\n\n // Cria listener de scroll\n window.addEventListener(`scroll`, () => {\n // Obtém a posição do topo do footer\n const footerTop = footer.getBoundingClientRect().top;\n\n // Verifica se o footer está visível\n const isFooterVisible = window.innerHeight >= footerTop;\n\n // Lógica para o botão de adicionar ao carrinho\n nameAddButton.style.opacity = isFooterVisible ? `0` : `1`;\n nameAddButton.style.zIndex = isFooterVisible ? `-5` : `12`;\n\n // if (window.innerWidth <= 768) {\n // // Lógica para o botão do WhatsApp\n // whatsappButton.style.bottom = isFooterVisible ? `2%` : `18%`;\n // }\n });\n },\n\n //--------------------------------------------------------------------------------\n\n //#region SetZoom\n setZoom: function () {\n /**\n * Função que aplica zoom nas imagens\n */\n\n const images = document.querySelectorAll('.swiper-wrapper .item-image');\n\n if (window.innerWidth < 992) {\n return;\n }\n\n function getMousePosition(event, element) {\n const rect = element.getBoundingClientRect();\n const mouseX = event.clientX - rect.left;\n const mouseY = event.clientY - rect.top;\n return { x: mouseX, y: mouseY };\n }\n\n function getTouchPosition(event, element) {\n const rect = element.getBoundingClientRect();\n const touchX = event.touches[0].clientX - rect.left;\n const touchY = event.touches[0].clientY - rect.top;\n return { x: touchX, y: touchY };\n }\n\n images.forEach((image) => {\n const imageAnchor = image.children[0];\n let scale = 2;\n let touchStartTime = 0;\n\n const handleMouseMove = (event) => {\n const { x, y } = getMousePosition(event, image);\n const rect = image.getBoundingClientRect();\n const offsetXPercent = (x / rect.width) * 100;\n const offsetYPercent = (y / rect.height) * 100;\n\n const anchorX = (offsetXPercent - 50) * (scale - 1);\n const anchorY = (offsetYPercent - 50) * (scale - 1);\n\n imageAnchor.style.transform = `translate(${-anchorX}%, ${-anchorY}%) scale(${scale})`;\n };\n\n const handleTouchMove = (event) => {\n const { x, y } = getTouchPosition(event, image);\n const rect = image.getBoundingClientRect();\n const offsetXPercent = (x / rect.width) * 100;\n const offsetYPercent = (y / rect.height) * 100;\n\n const anchorX = (offsetXPercent - 50) * (scale - 1);\n const anchorY = (offsetYPercent - 50) * (scale - 1);\n\n imageAnchor.style.transform = `translate(${-anchorX}%, ${-anchorY}%) scale(${scale})`;\n };\n\n if (window.innerWidth < 992) {\n image.addEventListener('touchstart', (event) => {\n touchStartTime = new Date().getTime();\n });\n\n image.addEventListener('touchend', (event) => {\n event.preventDefault();\n const touchEndTime = new Date().getTime();\n const touchDuration = touchEndTime - touchStartTime;\n\n if (touchDuration < 200) {\n // Verifica se o toque foi rápido\n if (imageAnchor.classList.contains('-zoomed')) {\n imageAnchor.classList.remove('-zoomed');\n document.body.style.overflow = 'visible';\n\n const zoomedImage = imageAnchor.querySelector('.swiper-zoom-target');\n const lowResSrc = zoomedImage.getAttribute('data-zoom-src');\n const highResSrc = zoomedImage.getAttribute('srcset');\n zoomedImage.setAttribute('srcset', lowResSrc);\n zoomedImage.setAttribute('data-zoom-src', highResSrc);\n\n imageAnchor.style.cursor = `zoom-in`;\n imageAnchor.style.transform = `translate(0, 0) scale(1)`;\n image.removeEventListener('touchmove', handleTouchMove);\n } else {\n imageAnchor.classList.add('-zoomed');\n document.body.style.overflow = 'hidden';\n\n const zoomedImage = imageAnchor.querySelector('.swiper-zoom-target');\n const lowResSrc = zoomedImage.getAttribute('srcset');\n const highResSrc = zoomedImage.getAttribute('data-zoom-src');\n zoomedImage.setAttribute('srcset', highResSrc);\n zoomedImage.setAttribute('data-zoom-src', lowResSrc);\n\n imageAnchor.style.cursor = `zoom-out`;\n imageAnchor.style.transform = `translate(0, 0) scale(${scale})`;\n image.addEventListener('touchmove', handleTouchMove);\n }\n }\n });\n } else {\n image.addEventListener('mouseenter', (event) => {\n event.preventDefault();\n imageAnchor.classList.add('-zoomed');\n // document.body.style.overflow = 'hidden';\n\n const zoomedImage = imageAnchor.querySelector('.swiper-zoom-target');\n const lowResSrc = zoomedImage.getAttribute('srcset');\n const highResSrc = zoomedImage.getAttribute('data-zoom-src');\n zoomedImage.setAttribute('srcset', highResSrc);\n zoomedImage.setAttribute('data-zoom-src', lowResSrc);\n\n imageAnchor.style.cursor = `zoom-out`;\n imageAnchor.style.transform = `translate(0, 0) scale(${scale})`;\n image.addEventListener('mousemove', handleMouseMove);\n });\n\n image.addEventListener('mouseleave', () => {\n imageAnchor.classList.remove('-zoomed');\n // document.body.style.overflow = 'visible';\n // document.body.style.overflowX = 'hidden';\n\n const zoomedImage = imageAnchor.querySelector('.swiper-zoom-target');\n const lowResSrc = zoomedImage.getAttribute('data-zoom-src');\n const highResSrc = zoomedImage.getAttribute('srcset');\n zoomedImage.setAttribute('srcset', lowResSrc);\n zoomedImage.setAttribute('data-zoom-src', highResSrc);\n\n imageAnchor.style.cursor = `zoom-in`;\n imageAnchor.style.transform = `translate(0, 0) scale(1)`;\n image.removeEventListener('mousemove', handleMouseMove);\n });\n }\n });\n },\n\n //--------------------------------------------------------------------------------\n\n //#region OpenFirstDropdownDescription\n openFirstDropdownDescription: function () {\n /**\n * Função que abre o primeiro dropdown de descrição\n */\n\n // Seleciona o atributo data-page da tag body\n const page = document.body.getAttribute('data-page');\n\n // Verifica se a página é a de produto\n if (page !== 'product') return;\n\n // Seleciona os containers de descrição\n const descriptionDropdowns = document.querySelector('.description-dropdown');\n const button = descriptionDropdowns.querySelector('.button');\n\n // Verifica se o botão existe\n if (!button) return;\n\n // Clica no botão\n Product.sleep(1.2).then(() => {\n button.click();\n });\n },\n\n //--------------------------------------------------------------------------------\n\n //#region Init\n init: function () {\n /**\n * Função que inicializa as funções da página\n */\n const _this = this;\n\n _this.handleSizeGuidePopupWidth();\n _this.handleNameAddButtonStyle();\n _this.setZoom();\n _this.handleProductSizeSelector();\n\n // _this.openFirstDropdownDescription();\n // _this.handleImageProgressBar();\n // _this.listenerChangeSKU();\n // _this.handlerProductDescription();\n },\n};\n\nexport default Product;\n","const Tag = {\n //#region Sleep\n sleep: function (seconds = 0) {\n /**\n * Função que retorna uma Promise que resolve após um determinado tempo em segundos\n * @param {number} seconds - Tempo em segundos\n * */\n\n return new Promise((resolve) => setTimeout(resolve, seconds * 1000));\n },\n\n //--------------------------------------------------------------------------------\n\n //#region SetColorValueName\n setColorValueName: function (backgroundColor) {\n /**\n * Função que cria um container com a cor de fundo\n * @param {string} backgroundColor - Cor de fundo\n * */\n\n // Cria um novo elemento div para o container de valor de cor\n const colorValueName = document.createElement('div');\n\n // Adiciona classes CSS ao container para estilização\n colorValueName.classList.add(\n 'color-value-name',\n 'component-products-filter-rounded-full',\n 'component-products-filter-border',\n 'component-products-filter-border-gray-300',\n 'component-products-filter-mr-2',\n 'component-products-filter-h-4',\n 'component-products-filter-w-4'\n );\n\n // Verifica se a cor de fundo é um gradiente\n if (backgroundColor.includes('/')) {\n let firstColor = backgroundColor.split('/')[0];\n let secondColor = backgroundColor.split('/')[1];\n\n // Define a cor de fundo do container\n colorValueName.style.backgroundImage = `linear-gradient(135deg, ${firstColor} 50%, ${secondColor} 51%)`;\n } else {\n // Define a cor de fundo do container\n colorValueName.style.backgroundColor = backgroundColor;\n }\n\n // Retorna o container criado\n return colorValueName;\n },\n\n //--------------------------------------------------------------------------------\n //#region HandleNumberOfProducts\n handleNumberOfProducts: () => {\n /**\n * Função que altera o número de produtos exibidos\n */\n\n if (window.innerWidth < 993) {\n return;\n }\n\n //--------------------------------------------------------------------------------\n\n // Seleciona o container de produtos e o container de botões de layout\n const listProducts = document.querySelector(`.list-products`);\n const formLayoutSelector = document.querySelector(`.form-layout-selector`);\n\n // Verifica se o container de produtos existe,\n // Se existir armazena os botões de layout em um array\n if (formLayoutSelector) {\n const layoutButtonsArray = Array.from(document.querySelectorAll(`[button-layout]`));\n\n // Verifica se o array de botões de layout possui algum botão\n if (layoutButtonsArray.length > 0) {\n // Adiciona evento de click para cada botão de layout\n layoutButtonsArray.forEach((button) => {\n button.addEventListener(`click`, () => {\n if (button.classList.contains(`selected`)) {\n // Se o botão clicado já estiver selecionado, não faz nada\n return;\n } else {\n // Remove a classe selected de todos os botões e adiciona a classe selected no botão clicado\n layoutButtonsArray.forEach((b) => {\n b.classList.remove(`selected`);\n });\n button.classList.add(`selected`);\n }\n\n let newLayout = button.getAttribute(`layout-columns`);\n\n Tag.sleep(0.5)\n .then(() => {\n listProducts.style.opacity = `0`;\n // Altera o cursor do mouse para espera\n document.body.style.cursor = `wait`;\n })\n .then(() => {\n Tag.sleep(0.5).then(() => {\n listProducts.setAttribute(`layout-columns`, newLayout);\n });\n })\n .then(() => {\n Tag.sleep(0.5).then(() => {\n listProducts.style.opacity = `1`;\n // Altera o cursor do mouse para espera\n document.body.style.cursor = `default`;\n });\n });\n });\n });\n }\n }\n },\n\n //--------------------------------------------------------------------------------\n\n //#region HandleColorFilter\n handleColorFilter: () => {\n /**\n * Função que adiciona a cor de fundo no container de valores de cor\n * */\n\n // Obtendo as cores do arquivo Californio.colors.js\n const colors = window.Californio.colors;\n\n // Busca as cores armazenadas no objeto window.Californio\n const filterColorsSet = window.Californio.filterColorsSet;\n\n // Verifica se as cores já foram carregadas\n if (filterColorsSet) return;\n\n // Verifica se o array de cores existe\n if (!colors) return;\n\n // Seleciona todos os containers de valores de cor\n const colorValueContainers = Array.from(document.querySelectorAll(`.color-value-container`));\n\n // Verifica se existem containers de valores de cor\n if (colorValueContainers.length > 0) {\n colorValueContainers.forEach((colorValueContainer) => {\n // Obtém o texto do container de valor de cor\n const colorValueText = colorValueContainer.querySelector('.color-value-text').innerText;\n\n // Verifica se o texto do container de valor de cor existe\n if (!colorValueText) return;\n\n // Itera sobre o array de cores para encontrar a cor correspondente\n for (let color of colors) {\n const [colorName, colorHex] = color.split(' | ');\n\n // Verifica se o nome da cor corresponde ao texto do container de valor de cor\n if (colorName.toLowerCase() === colorValueText.toLowerCase()) {\n // Cria um novo container com a cor de fundo e adiciona ao container de valor de cor\n colorValueContainer.appendChild(Tag.setColorValueName(colorHex));\n }\n }\n });\n }\n\n // Define que as cores já foram carregadas\n window.Californio.filterColorsSet = true;\n },\n\n //--------------------------------------------------------------------------------\n\n //#region ToggleFilterRoot\n toggleFilterRoot: (buttonType, buttonFilter, buttonOrder) => {\n /**\n * Função que exibe/oculta os containers de filtros e ordenação\n * @param {string} buttonType - Tipo do botão clicado\n * @param {HTMLElement} buttonFilter - Botão de filtro\n * @param {HTMLElement} buttonOrder - Botão de ordenação\n */\n\n // Seleciona a tag de background\n const backgroundTag = document.querySelector(`.background-tag-opaque`);\n\n // Seleciona os containers de filtros e ordenação\n const filterRoot = document.querySelector(`#component-products-filter-root`);\n const orderBlock = document.querySelector(`.vnda-products-filter-horizontal-sort-container`);\n const filterPriceBlock = document.querySelector(`.vnda-products-filter-price-filter-container`);\n const filterTagsBlocks = document.querySelectorAll(`.vnda-products-filter-horizontal-tags-container`);\n const filterPropsBlocks = document.querySelectorAll(`.vnda-products-filter-horizontal-properties-container`);\n const containerFilterHorizontal = document.querySelector(`.vnda-products-filter-horizontal`);\n\n function showBackground() {\n /**\n * Função que exibe o background\n */\n\n backgroundTag.classList.add(`visible`);\n }\n function hideBackground() {\n /**\n * Função que oculta o background\n */\n\n backgroundTag.classList.remove(`visible`);\n }\n\n function hiddenSort() {\n /**\n * Função que oculta o container de ordenação\n */\n // Alterando o overflow e a altura do container de filtros para 0px\n filterRoot.style.overflow = `hidden`;\n filterRoot.style.height = `0px`;\n\n orderBlock && orderBlock.classList.remove('-visible');\n buttonOrder && buttonOrder.classList.add(`closed`);\n }\n function showSort() {\n /**\n * Função que exibe o container de ordenação\n */\n orderBlock && orderBlock.classList.add('-visible');\n buttonOrder && buttonOrder.classList.remove(`closed`);\n\n // Aplicando a altura do container de filtros no container de ordenação e habilitando o overflow\n filterRoot.style.overflow = `initial`;\n filterRoot.style.height = `calc(${containerFilterHorizontal.getBoundingClientRect().height}px + 1.714rem)`;\n }\n\n function hiddenFilters() {\n /**\n * Função que oculta o container de filtros\n */\n\n // Alterando o overflow e a altura do container de filtros para 0px\n filterRoot.style.overflow = `hidden`;\n filterRoot.style.height = `0px`;\n\n filterPriceBlock && filterPriceBlock.classList.remove('-visible');\n buttonFilter && buttonFilter.classList.add(`closed`);\n\n if (filterTagsBlocks) {\n filterTagsBlocks.forEach((filterTagsBlock) => {\n filterTagsBlock.classList.remove('-visible');\n });\n }\n if (filterPropsBlocks) {\n filterPropsBlocks.forEach((filterPropsBlock) => {\n filterPropsBlock.classList.remove('-visible');\n });\n }\n }\n\n function showFilters() {\n /**\n * Função que exibe o container de filtros\n */\n filterPriceBlock && filterPriceBlock.classList.add('-visible');\n buttonFilter && buttonFilter.classList.remove(`closed`);\n\n if (filterTagsBlocks) {\n filterTagsBlocks.forEach((filterTagsBlock) => {\n filterTagsBlock.classList.add('-visible');\n });\n }\n if (filterPropsBlocks) {\n filterPropsBlocks.forEach((filterPropsBlock) => {\n filterPropsBlock.classList.add('-visible');\n });\n }\n // Aplicando a altura do container de filtros no container de ordenação e habilitando o overflow\n filterRoot.style.overflow = `initial`;\n filterRoot.style.height = `calc(${containerFilterHorizontal.getBoundingClientRect().height}px + 1.714rem)`;\n }\n\n // A série de verificações abaixo foi criada para cobrir todas as possibilidades de interação com os botões de\n // filtros, de maneira que o usuário possa clicar em qualquer um deles e o container de filtros seja exibido\n // corretamente.\n\n // Verifica se o container de filtros está visível\n if (!filterRoot) return;\n\n // Verifica qual botão foi clicado\n if (buttonType == 'order') {\n if (filterRoot.classList.contains('-visible')) {\n if (filterRoot.classList.contains('filter')) {\n // Substitui a classe filter pela classe order\n filterRoot.classList.replace('filter', 'order');\n hiddenFilters();\n showSort();\n // showBackground();\n } else {\n // Remove a classe order e oculta o container\n filterRoot.classList.remove('-visible', 'order');\n hiddenSort();\n // hideBackground();\n }\n } else {\n // Adiciona a classe order e exibe o container\n filterRoot.classList.add('-visible', 'order');\n hiddenFilters();\n showSort();\n // showBackground();\n }\n }\n\n // Verifica qual botão foi clicado\n if (buttonType == 'filter') {\n if (filterRoot.classList.contains('-visible')) {\n if (filterRoot.classList.contains('order')) {\n // Substitui a classe order pela classe filter\n filterRoot.classList.replace('order', 'filter');\n hiddenSort();\n showFilters();\n // showBackground();\n } else {\n // Remove a classe filter e oculta o container\n filterRoot.classList.remove('-visible', 'filter');\n hiddenFilters();\n // hideBackground();\n }\n } else {\n // Adiciona a classe filter e exibe o container\n filterRoot.classList.add('-visible', 'filter');\n hiddenSort();\n showFilters();\n // showBackground();\n }\n }\n },\n\n //--------------------------------------------------------------------------------\n\n //#region HandlerFilter\n // Função para clicar em todos os botões de filtros\n handlerFilter: () => {\n const filterButtons = document.querySelectorAll(`.component-products-filter-ml-auto`);\n const buttons = Array.from(filterButtons);\n\n // Clica em todos os botões de filtros\n buttons.forEach((button) => {\n button.click();\n });\n },\n\n //--------------------------------------------------------------------------------\n\n //#region HandleInfinityScrollButton\n handleInfinityScrollButton: function () {\n /**\n * Função que clica no botão de carregar mais produtos quando o scroll está no final da página\n */\n\n // Seleciona o contador de produtos\n const totalProducts = document.querySelector('.count-pages .total-products');\n\n function updateTotalProducts() {\n /**\n * Função que atualiza o total de produtos\n */\n setTimeout(() => {\n totalProducts.innerHTML = document.querySelectorAll('.product-block').length;\n }, 1000);\n }\n\n // Adiciona um evento de scroll na janela\n window.addEventListener(`scroll`, function () {\n // Seleciona o botão de carregar mais produtos\n let infinityScrollButton = document.querySelector(`.infinity-scroll-button`);\n\n if (infinityScrollButton) {\n let infinityScrollButtonRect = infinityScrollButton.getBoundingClientRect();\n if (window.scrollY + window.innerHeight >= infinityScrollButtonRect.top) {\n infinityScrollButton.click();\n updateTotalProducts();\n }\n }\n });\n },\n\n //--------------------------------------------------------------------------------\n\n //#region ListenerFilter\n\n listenerFilter: function () {\n /**\n * Função que adiciona um evento de click para os botões de filtro\n */\n\n const pageTag = document.querySelector(`.page-tag`);\n\n if (!pageTag) return;\n\n let containerTagTop = document.querySelector(`.container.tag`).getBoundingClientRect().top - 150;\n\n const btFilter = document.querySelector(`[button-filter]`);\n const btOrder = document.querySelector(`[button-order]`);\n let btArray = [];\n if (btFilter) btArray.push(btFilter);\n if (btOrder) btArray.push(btOrder);\n\n if (btArray.length > 0) {\n // Adiciona evento de click para cada botão de filtro\n btArray.forEach((button) => {\n button.addEventListener('click', () => {\n if (window.innerWidth <= 992) {\n window.scrollTo({ top: containerTagTop, behavior: 'smooth' });\n }\n let buttonType = button.getAttribute('data-type-button');\n Tag.toggleFilterRoot(buttonType, btFilter, btOrder);\n Tag.handleColorFilter();\n });\n });\n }\n },\n //--------------------------------------------------------------------------------\n //#region TagDescription\n // Função para expandir descrição da tag\n handlerTagDescription: () => {\n const bannerTopo = document.querySelector(`.banner-topo.-bottom`);\n\n if (!bannerTopo) return;\n\n const contentContainer = bannerTopo.querySelector(`.content.container`);\n\n // Obtém a altura da descrição da tag\n const descriptionHeight = contentContainer.getBoundingClientRect().height;\n\n // Seleciona o botão e a descrição da tag\n const button = bannerTopo.querySelector(`.button-expand-shrink`);\n\n // Adiciona evento de click para o botão\n button.addEventListener(`click`, () => {\n // Alterna a classe expanded\n contentContainer.classList.toggle(`expanded`);\n // Altera a altura da descrição da tag\n contentContainer.style.height = contentContainer.classList.contains(`expanded`)\n ? `calc(${descriptionHeight}px + ${descriptionHeight * 0.15}px)`\n : `11rem`;\n // Altera o texto do botão\n button.innerHTML = contentContainer.classList.contains(`expanded`) ? `Mostrar menos` : `Ler mais`;\n });\n },\n\n handlerProductCount: () => {\n const pageTag = document.querySelector(`.page-tag`);\n\n if (!pageTag) return;\n // lógica criada para definir a contagem de produtos com o infinitiScroll\n const descriptionCount = document.querySelector('.description-count');\n const productCount = document.getElementById('productCount').value;\n const currentProductCount = document.querySelectorAll('.list-products')[0];\n descriptionCount.innerText = 'Mostrando ' + currentProductCount.childElementCount + ' de ' + productCount;\n },\n //#region Init\n init: function () {\n /**\n * Função que inicializa as funções da página\n */\n const _this = this;\n\n _this.listenerFilter();\n\n // _this.handleNumberOfProducts();\n _this.handleInfinityScrollButton();\n // _this.handlerTagDescription();\n // _this.handlerProductCount();\n },\n};\n\nexport default Tag;\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","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 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 && 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","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 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(() => { button.classList.remove('-loading') })\n },\n\n show: function (callback) {\n\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\n } catch (error) {\n console.error('Erro ao buscar a quantidade de produtos do carrinho');\n console.error(error);\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) 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 const menuItem = menu.querySelector('.menu-item');\n menu.addEventListener('click', () => {\n menuItem.classList.toggle('-open', !menuItem.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.pageYOffset,\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 && 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\n searchButtonClose && 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\n init: function () {\n const _this = this;\n const { lastScrollTop, scrollTop } = _this;\n\n _this.setScroll(scrollTop, lastScrollTop);\n _this.searchButton();\n\n // cuida quando a página scrolla pra atualizar o header\n window.addEventListener('scroll', function () {\n const newSt = window.pageYOffset;\n\n _this.setScroll(newSt, lastScrollTop);\n _this.lastScrollTop = newSt;\n });\n },\n};\n\nexport default Header;\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';\n\nconst MenuMobile = {\n setMenuMobile: function () {\n const mmenuWrapper = document.querySelector('#mm-menu-mobile');\n const mmenu = new MmenuLight(mmenuWrapper);\n\n //precisa do navigation e do drawer\n const navigator = mmenu.navigation({\n title: 'Menu',\n });\n\n const drawer = mmenu.offcanvas();\n console.log('draw');\n console.log(drawer);\n\n document.querySelector('[data-action=\"open-menu-mobile\"]').addEventListener('click', (e) => {\n e.preventDefault();\n\n drawer.open();\n });\n\n document.querySelector('[data-action=\"close-menu-mobile\"]').addEventListener('click', (e) => {\n e.preventDefault();\n\n drawer.close();\n });\n\n window.mmenu = drawer;\n },\n init: function () {\n const _this = this;\n\n _this.setMenuMobile();\n },\n};\n\nexport default MenuMobile;\n","// Javascript genérico para qualquer popup que precise ser criado na loja\n\nconst Popup = {\n togglePopup: function (popupType) {\n document\n .querySelector(`[data-popup=\"${popupType}\"].popup`)\n .classList.toggle('-open');\n },\n init: function () {\n var _this = this;\n\n var toggleButtons = document.querySelectorAll(\n '[data-action=\"toggle-popup\"]'\n );\n\n // toggle popup\n toggleButtons.forEach((button) => {\n button.addEventListener('click', (e) => {\n e.preventDefault();\n\n let popupType = button.dataset.popup;\n\n _this.togglePopup(popupType);\n });\n });\n },\n};\n\nexport default Popup;\n","import { serializeArray } 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 form.classList.add('sending');\n form.classList.remove('error');\n form.querySelector('.action').innerHTML = form.classList.contains('newsletter-home')\n ? ''\n : '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 = form.classList.contains('newsletter-home')\n ? ''\n : '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 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 = form.classList.contains('newsletter-home')\n ? ''\n : '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 } 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 = serializeArray(form);\n const btnTextDefault = form.querySelector('.action').innerHTML;\n\n if (!form.classList.contains('sending')) {\n form.classList.remove('error');\n form.classList.add('sending');\n form.querySelector('.action').innerHTML = 'Enviando';\n\n try {\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: 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 } 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 } 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 alertMessage.classList.remove('-visible');\n alertMessage.innerText = '';\n\n input.classList.remove('-emphasis');\n }, 2000);\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 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 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 &&\n webForms.forEach((form) => {\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 &&\n button.addEventListener('keypress', (e) => {\n if (e.key === 'Enter') Webforms.validateForm(vndaInput, form);\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 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 textBtnSubmit: 'Enviar',\n classBtnSubmit: 'button-newsletter',\n formKey: `${subdomain}-newsletter`,\n hasNameField: true,\n hasLastNameField: false,\n hasDateOfBirthField: false,\n hasPhoneField: true,\n successMessage: successMessage,\n delay: 500,\n frequency: '7',\n language: 'pt-BR',\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 if (entries[0].isIntersecting) {\n if (!PriceComponent.loaded) {\n addAsset(PriceComponent.script);\n PriceComponent.loaded = true;\n }\n observer.disconnect();\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 MenuMobile from './common/menuMobile';\nimport Popup from './components/popup';\nimport Webforms from './common/webforms';\nimport { NewsletterComponent, PriceComponent } from './components/vndaComponents.js';\nimport { setSearch } from './components/utilities';\nimport Californio from './californio.js';\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 Popup.init();\n Webforms.init();\n NewsletterComponent.init();\n setSearch();\n Californio.init();\n if (window.innerWidth < 992) {\n MenuMobile.init();\n }\n});\n"],"names":["Header","sleep","seconds","Promise","resolve","setTimeout","handleSearchBar","containerSearchClass","buttonCloseSearchClass","inputSearchClass","window","innerWidth","containerSearch","document","querySelector","buttonOpen","buttonClose","inputSearch","messages","searchSuggestions","input","values","time","index","setInterval","placeholder","length","animationPlaceholder","forEach","button","addEventListener","classList","contains","focus","toggle","handleCustomMenu","hamburger","menu","backgroundContainer","click","Californio","then","remove","add","enableBackgroundOpaque","menuItens","Array","from","querySelectorAll","backgroundOpaque","init","this","CalifornioNew","showBrand","console","info","disableScroll","body","style","overflow","enableScroll","handleLoginStyle","getAttribute","createElement","innerHTML","head","appendChild","handleLgpdBannerStyle","handlePopupCupom","popup","btnCopy","cupomText","textContent","navigator","clipboard","writeText","catch","err","error","loadVideos","iframes","observer","IntersectionObserver","entries","entry","isIntersecting","iframe","src","setAttribute","setAttributeSrc","target","unobserve","root","rootMargin","threshold","observe","lockScreen","alert","Product","handleSizeGuidePopupWidth","buttonSizeGuide","sizeGuidePopup","popupWrapper","popupImage","getBoundingClientRect","width","height","adjustSizeGuidePopupWidth","handleProductSizeSelector","infosCompra","element","lastUnits","inputArray","buttonDefault","buttonPurchase","disabled","scrollToAttributesInfos","cursor","checked","nextElementSibling","innerText","backgroundColor","color","border","clearInputsChecked","buttonTempLink","scrollTo","top","behavior","handlerProductDescription","descriptionOriginal","descriptionHeight","shortDescription","listenerChangeSKU","sectionProduct","event","handleImageProgressBar","progressBar","images","elementsToRemove","bullet","bulletActive","image","bulletCopy","cloneNode","handleNameAddButtonStyle","nameAddButton","footer","footerTop","isFooterVisible","innerHeight","opacity","zIndex","setZoom","imageAnchor","children","touchStartTime","handleMouseMove","x","y","rect","clientX","left","clientY","getMousePosition","anchorX","anchorY","transform","handleTouchMove","touches","getTouchPosition","Date","getTime","preventDefault","zoomedImage","lowResSrc","highResSrc","removeEventListener","openFirstDropdownDescription","Tag","setColorValueName","colorValueName","includes","firstColor","split","secondColor","backgroundImage","handleNumberOfProducts","listProducts","layoutButtonsArray","b","newLayout","handleColorFilter","colors","filterColorsSet","colorValueContainers","colorValueContainer","colorValueText","colorName","colorHex","toLowerCase","toggleFilterRoot","buttonType","buttonFilter","buttonOrder","filterRoot","orderBlock","filterPriceBlock","filterTagsBlocks","filterPropsBlocks","containerFilterHorizontal","hiddenSort","showSort","hiddenFilters","filterTagsBlock","filterPropsBlock","showFilters","replace","handlerFilter","filterButtons","handleInfinityScrollButton","totalProducts","infinityScrollButton","infinityScrollButtonRect","scrollY","listenerFilter","containerTagTop","btFilter","btOrder","btArray","push","handlerTagDescription","bannerTopo","contentContainer","handlerProductCount","descriptionCount","productCount","getElementById","value","currentProductCount","childElementCount","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","LazyLoading","nativeImageSupport","HTMLImageElement","prototype","nativeIframeSupport","HTMLIFrameElement","setForNativeLazy","hasAttribute","update","lazyLoadInstance","lazyImages","lazyIframes","script","lazyLoadOptions","elements_selector","detail","instance","passive","lazyLoad","products","filter","scriptEl","purchaseScript","disconnect","product","addAsset","source","onloadCallback","scriptTag","onload","linkTag","serializeArray","form","formData","FormData","data","name","formBody","key","encodeKey","encodeURIComponent","encodeValue","join","CartDrawer","buttons","countWrapper","settings","cartDrawerSettings","setCartDrawer","freeShipping","freeShippingValue","componentCartDrawer","Vnda","Component","anchor","display","startOpen","titleCart","disableShippingCalculation","render","dispatchEvent","Event","loadComponent","styles","handleCartButton","show","callback","mmenu","close","open","getCartItens","async","response","fetch","json","updateCartCount","_itemsCount","items","_this","handleSubmenu","menus","menuItem","lastScrollTop","scrollTop","pageYOffset","header","setScroll","searchButton","searchButtonClose","formSearch","formSearchInput","e","className","newSt","MmToggler","mediaquery","listener","evnt","matches","matchFns","unmatchFns","toggler","matchMedia","addListener","match","unmatch","r","list","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","child","parent_1","closest","isOpened","parent_2","listitems","handled","clickAnchor","openSubmenu","panels","parent_3","closeSubmenu","stopImmediatePropagation","MmOffCanvasDrawer","position","wrapper","content","append","backdrop","MmenuLight","mediaQuery","navigation","options","_a","_b","_c","_d","offcanvas","drawer","orgLocation_1","createComment","after","setMenuMobile","mmenuWrapper","log","togglePopup","popupType","Webforms","submitWebForm","email","textBtnDefault","method","headers","ok","reset","text","status","submitNotify","btnTextDefault","showMessage","alertMessage","validateForm","vndaInput","submitAllowed","type","id","setWebForms","webForms","fieldset","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","eventType","once","PriceComponent","priceComponent","productContainers","toggleButton","search","setSearch"],"sourceRoot":""}