{"version":3,"file":"pages.js","mappings":"yBA0Be,SAASA,kBACtB,MAAMC,WAAaC,SAASC,iBAAiB,cACvCC,YAAcF,SAASC,iBAAiB,sBAE9CC,YAAYC,OAAS,GACnBJ,WAAWI,OAAS,GACpBJ,WAAWK,SAASC,SAmBlB,GAlBAA,OAAOC,iBAAiB,SAAUC,IAChCA,EAAEC,iBAEFT,WAAWK,SAASK,KAClBA,GAAGC,UAAUC,OAAO,SAAS,IAE/BN,OAAOK,UAAUE,IAAI,UAErB,MAAMC,aAAeR,OAAOS,aAAa,QAAQC,QAAQ,IAAK,IAC9Db,YAAYE,SAASY,UACnBA,QAAQC,IAAMJ,aAAeG,QAAQN,UAAUE,IAAI,UAAYI,QAAQN,UAAUC,OAAO,SAAS,IAGnGO,YAAW,KACTC,OAAOC,SAAS,CAAEC,IAAK,EAAGC,SAAU,UAAW,GAC9C,GAAG,IAGa,MAAjBC,SAASC,MAAiC,IAAjBD,SAASC,KAAY,CAChD,MAAMX,aAAeU,SAASC,KAAKT,QAAQ,IAAK,IAChDb,YAAYE,SAASY,UACnBA,QAAQC,IAAMJ,aAAeG,QAAQN,UAAUE,IAAI,UAAYI,QAAQN,UAAUC,OAAO,SAAS,IAGnGZ,WAAWK,SAASC,SAClB,GAAIA,OAAOS,aAAa,QAAQC,QAAQ,IAAK,KAAOF,cAOlD,GANAR,OAAOK,UAAUE,IAAI,UAErBM,YAAW,KACTC,OAAOC,SAAS,CAAEC,IAAK,EAAGC,SAAU,UAAW,GAC9C,IAECH,OAAOM,WAAa,KAAM,CAC5B,MAAMC,gBAAkBrB,OAAOsB,WAAaR,OAAOM,WAAa,EAAIpB,OAAOuB,YAAc,EACzFvB,OAAOwB,aAAaT,SAAS,CAAEU,KAAMJ,gBAAiBJ,SAAU,UAClE,OAEAjB,OAAOK,UAAUC,OAAO,SAC1B,GAEJ,IAEN,CCoCO,SAASoB,UAAUC,eAAgBhB,QAASiB,SAAW,KAC5D,IAAIC,YAAclB,QAAQmB,aAE1BH,eAAeI,MAAMC,OAAS,GAAGH,gBACjCF,eAAeI,MAAME,WAAa,UAAUL,eAC9C,CClHe,SAASM,SACpB,IAAIC,gBACAR,eACAhB,QAKJ,IAAIyB,cAAgBzC,SAASuB,SAASC,KAElCiB,gBACAD,gBAAkBxC,SAAS0C,cAAcD,eACzCT,eAAiBQ,gBAAgBE,cAAc,oBAC/C1B,QAAUwB,gBAAgBE,cAAc,YAGxCvB,OAAOC,SAAS,CACZC,IAAKW,eAAeW,UAAY,IAChCrB,SAAU,WAIdS,UAAUC,eAAgBhB,QAAS,MAIjBhB,SAASC,iBAAiB,mBAEhCG,SAASC,SACrBA,OAAOC,iBAAiB,SAAUC,IAC9BA,EAAEC,iBAEFgC,gBAAkBnC,OAAOuC,QAAQ,mBACjCZ,eAAiBQ,gBAAgBE,cAAc,oBAC/C1B,QAAUwB,gBAAgBE,cAAc,YAExCF,gBAAgB9B,UAAUmC,OAAO,SDoDtC,SAAqBb,eAAgBhB,QAASiB,SAAW,KAGzC,OAFDd,OAAO2B,iBAAiBd,gBAAgBK,OAGnDN,UAAUC,eAAgBhB,QAASiB,UASvC,SAAiBD,eAAgBC,SAAW,KACjDD,eAAeI,MAAMC,OAAS,MAC9BL,eAAeI,MAAME,WAAa,UAAUL,eAC9C,CAVWc,CAAQf,eAAgBC,SAEnC,CC1DYe,CAAYhB,eAAgBhB,QAAS,IAAI,GAC3C,GAEV,CCvCA,MAAMiC,KAAO,CACXC,KAAM,WAEAlD,SAAS0C,cAAc,gBACzB,kBAEAvB,OAAOb,iBAAiB,cAAc,WACpC,iBACF,KAEEN,SAAS0C,cAAc,oBAAoBH,QAEjD,GAGFpB,OAAOb,iBAAiB,oBAAoB,KAC1C2C,KAAKC,MAAM,G","sources":["webpack://build/../pairbeauty/assets/javascripts/pages/pages/setAbas.js","webpack://build/../pairbeauty/assets/javascripts/components/utilities.js","webpack://build/../pairbeauty/assets/javascripts/pages/pages/setFaq.js","webpack://build/../pairbeauty/assets/javascripts/pages/pages.js"],"sourcesContent":["// export default function setFaq() {\r\n// $(document).ready(function () {\r\n// if (location.hash != null && location.hash != '') {\r\n// var $id = location.hash;\r\n\r\n// $('[data-tab]').removeClass('active');\r\n// $('[href=\"' + $id + '\"]').addClass('active');\r\n\r\n// $('.conteudo').removeClass('active');\r\n// $($id).addClass('active');\r\n// }\r\n\r\n// $('[data-tab]').on('click', function (event) {\r\n// event.preventDefault();\r\n\r\n// var $id = $(this).attr('href');\r\n\r\n// $('[data-tab]').removeClass('active');\r\n// $(this).addClass('active');\r\n\r\n// $('.conteudo').removeClass('active');\r\n// $($id).addClass('active');\r\n// });\r\n// });\r\n// }\r\n\r\nexport default function handleTermsTabs() {\r\n const tabsButton = document.querySelectorAll('[data-tab]');\r\n const tabsContent = document.querySelectorAll('[data-tab-content]');\r\n\r\n tabsContent.length > 0 &&\r\n tabsButton.length > 0 &&\r\n tabsButton.forEach((button) => {\r\n button.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n tabsButton.forEach((el) => {\r\n el.classList.remove('active');\r\n });\r\n button.classList.add('active');\r\n\r\n const tabContentId = button.getAttribute('href').replace('#', '');\r\n tabsContent.forEach((content) => {\r\n content.id == tabContentId ? content.classList.add('active') : content.classList.remove('active');\r\n });\r\n\r\n setTimeout(() => {\r\n window.scrollTo({ top: 0, behavior: 'smooth' });\r\n }, 20);\r\n });\r\n\r\n if (location.hash != null && location.hash != '') {\r\n const tabContentId = location.hash.replace('#', '');\r\n tabsContent.forEach((content) => {\r\n content.id == tabContentId ? content.classList.add('active') : content.classList.remove('active');\r\n });\r\n\r\n tabsButton.forEach((button) => {\r\n if (button.getAttribute('href').replace('#', '') == tabContentId) {\r\n button.classList.add('active');\r\n\r\n setTimeout(() => {\r\n window.scrollTo({ top: 0, behavior: 'smooth' });\r\n }, 20);\r\n\r\n if (window.innerWidth < 1050) {\r\n const sidePositioning = button.offsetLeft - window.innerWidth / 2 + button.offsetWidth / 2;\r\n button.offsetParent.scrollTo({ left: sidePositioning, behavior: 'smooth' });\r\n }\r\n } else {\r\n button.classList.remove('active');\r\n }\r\n });\r\n }\r\n });\r\n}\r\n","// ===============================================================\r\n// ADIÇÃO MANUAL DE ASSET\r\n// ===============================================================\r\n// Usado para incluir assets no código de forma manual, conforme a necessidade\r\nexport function addAsset(source, onloadCallback) {\r\n\r\n if (!source || source === '') return console.error(`addAsset: caminho não definido.`)\r\n\r\n if (source.includes('.js')) {\r\n const scriptTag = document.createElement('script')\r\n scriptTag.setAttribute('src', source);\r\n\r\n if (onloadCallback && typeof onloadCallback === 'function') {\r\n scriptTag.onload = onloadCallback\r\n }\r\n\r\n return document.body.appendChild(scriptTag)\r\n\r\n } else if (source.includes('.css')) {\r\n const linkTag = document.createElement('link')\r\n linkTag.setAttribute('rel', 'stylesheet')\r\n linkTag.setAttribute('type', 'text/css')\r\n linkTag.setAttribute('href', source)\r\n return document.head.appendChild(linkTag)\r\n\r\n } else {\r\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.`\r\n return console.error(error, source)\r\n }\r\n}\r\n\r\n// ===============================================================\r\n// BUSCA O CARRINHO ATIVO\r\n// ===============================================================\r\nexport async function getCart() {\r\n try {\r\n const response = await fetch('/carrinho');\r\n const cart = await response.json();\r\n return cart;\r\n } catch (error) {\r\n console.error('Erro ao buscar os dados do carrinho');\r\n console.error(error);\r\n }\r\n}\r\n\r\n// ===============================================================\r\n// SERIALIZE ARRAY\r\n// ===============================================================\r\nexport function serializeArray(form) {\r\n\r\n const formData = new FormData(form);\r\n const data = {};\r\n\r\n for (const [name, value] of formData) {\r\n data[name] = value\r\n }\r\n\r\n const formBody = [];\r\n\r\n for (const key in data) {\r\n const encodeKey = encodeURIComponent(key)\r\n const encodeValue = encodeURIComponent(data[key])\r\n formBody.push(`${encodeKey}=${encodeValue}`)\r\n }\r\n\r\n return formBody = formBody.join('&')\r\n \r\n}\r\n\r\n// ===============================================================\r\n// URL ENCODE FORM DATA\r\n// ===============================================================\r\nexport function urlencodeFormData(formData) {\r\n let string = '';\r\n\r\n function encode(s) {\r\n return encodeURIComponent(s).replace(/%20/g, '+');\r\n }\r\n\r\n for (const pair of formData.entries()) {\r\n if (typeof pair[1] == 'string') {\r\n string += (string ? '&' : '') + encode(pair[0]) + '=' + encode(pair[1]);\r\n }\r\n }\r\n return string;\r\n}\r\n\r\n// ===============================================================\r\n// SLIDE TOGGLE\r\n// ===============================================================\r\nexport function slideToggle(contentWrapper, content, duration = 500) {\r\n let initialHeight = window.getComputedStyle(contentWrapper).height;\r\n\r\n if (initialHeight == '0px') {\r\n return slideDown(contentWrapper, content, duration);\r\n } else {\r\n return slideUp(contentWrapper, duration);\r\n }\r\n}\r\n\r\n// ===============================================================\r\n// SLIDE UP\r\n// ===============================================================\r\nexport function slideUp(contentWrapper, duration = 500) {\r\n contentWrapper.style.height = '0px';\r\n contentWrapper.style.transition = `height ${duration} ease`;\r\n}\r\n\r\n// ===============================================================\r\n// SLIDE DOWN\r\n// ===============================================================\r\nexport function slideDown(contentWrapper, content, duration = 500) {\r\n let innerHeight = content.clientHeight;\r\n\r\n contentWrapper.style.height = `${innerHeight}px`;\r\n contentWrapper.style.transition = `height ${duration} ease`;\r\n}\r\n\r\n// ===============================================================\r\n// UPDATE DISCOUNT IN PRODUCT BLOCK\r\n// ===============================================================\r\nexport function updatePriceBlock() {\r\n const priceEls = document.querySelectorAll('[data-init-price]');\r\n\r\n if (priceEls == null) return;\r\n\r\n priceEls.forEach((priceEl) => {\r\n const discount = priceEl.dataset.discountPercent;\r\n\r\n priceEl.dispatchEvent(new Event('change'));\r\n\r\n // discount\r\n if (discount != '0') {\r\n priceEl.style.setProperty('--discount', `'-${discount}%'`);\r\n }\r\n });\r\n}\r\n\r\n// ===============================================================\r\n// PREÇO POR AJAX\r\n// ===============================================================\r\nexport function getPriceProd() {\r\n var selectors = document.querySelectorAll('[data-update-price]');\r\n var attr = 'update-price';\r\n\r\n if (selectors.length() > 0) {\r\n selectors.forEach((selector) => {\r\n var prodId = selector.dataset(attr);\r\n var url = '/produto/preco/' + prodId;\r\n\r\n if (prodId != '' && prodId != null) {\r\n $.ajax({\r\n url: url,\r\n type: 'GET',\r\n })\r\n .done((resp) => {\r\n selector.innerHTML = resp;\r\n })\r\n .fail((resp) => {\r\n console.error(resp);\r\n });\r\n }\r\n });\r\n }\r\n}\r\n\r\n// ===============================================================\r\n// DEBOUNCE\r\n// ===============================================================\r\n/*\r\n Debounce retorna uma função que enquanto continuar sendo chamada não é executada\r\n A função só será executada quando para de ser chamada por N milisegundos\r\n Útil para melhorar a performance de códigos que são executados muitas vezes por segundo, como o $(window).resize()\r\n\r\n Ex:\r\n \r\n $(window).resize(debounce(function() {\r\n // código a ser executado\r\n }, 500))\r\n \r\n No exemplo acima a função só será executada 500ms depois do último resize\r\n Abra o link abaixo e redimensione a janela branca e acompanhe o output do console\r\n Exemplo codepen: https://codepen.io/valkervieira/pen/oNgqyWY\r\n\r\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\r\n Com o debounce o usuário pode escolher vários filtros rapidamente e a página só recarrega quando parar de escolher\r\n*/\r\n\r\nexport function debounce(func, wait, immediate) {\r\n var timeout;\r\n immediate || (immediate = true);\r\n\r\n return function () {\r\n var context = this,\r\n args = arguments;\r\n\r\n var later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n\r\n var callNow = immediate && !timeout;\r\n\r\n clearTimeout(timeout);\r\n\r\n timeout = setTimeout(later, wait);\r\n\r\n if (callNow) func.apply(context, args);\r\n };\r\n}\r\n\r\n// ===============================================================\r\n// THROTTLE\r\n// ===============================================================\r\n/*\r\n Throttle diminui a frequencia que uma função é executada\r\n Enquanto no debounce a função só é executada quando para de ser chamada, no throttle ela\r\n continua sendo executada só que em um intervalo mínimo de N milisegundos (default = 250)\r\n\r\n Ex:\r\n\r\n $(window).resize(throttle() {\r\n // código a ser executado\r\n }, 500)\r\n\r\n No exemplo acima a função resize é chamada várias vezes por segundo mas só é executada 1 vez a cada 500ms\r\n Abra o link abaixo, redimensione a janela branca e acompanhe o console\r\n Exemplo codepen: https://codepen.io/valkervieira/pen/yLyKEPW\r\n\r\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\r\n*/\r\nexport function throttle(fn, threshhold, scope) {\r\n threshhold || (threshhold = 250);\r\n var last, deferTimer;\r\n return function () {\r\n var context = scope || this;\r\n\r\n var now = +new Date(),\r\n args = arguments;\r\n if (last && now < last + threshhold) {\r\n // hold on to it\r\n clearTimeout(deferTimer);\r\n deferTimer = setTimeout(function () {\r\n last = now;\r\n fn.apply(context, args);\r\n }, threshhold);\r\n } else {\r\n last = now;\r\n fn.apply(context, args);\r\n }\r\n };\r\n}\r\n\r\n// ===============================================================\r\n// FORMAT MONEY\r\n// ===============================================================\r\nexport function formatMoney(value) {\r\n // FORMATA UM VALOR\r\n return (\r\n 'R$ ' +\r\n value\r\n .toFixed(2)\r\n .replace('.', ',')\r\n .replace(/(\\d)(?=(\\d{3})+\\,)/g, '$1.')\r\n );\r\n}\r\n\r\n// ===============================================================\r\n// FORMAT VALUE\r\n// ===============================================================\r\n\r\nexport const formatValue = function (value = '') {\r\n let parsedValue = value;\r\n if (typeof value === 'number') {\r\n parsedValue = value.toFixed(2).toString();\r\n }\r\n return parsedValue.replace('.', ',');\r\n};\r\n\r\n// ===============================================================\r\n// VALIDA QUANTIDADE\r\n// ===============================================================\r\nexport function validateQuantity(_val) {\r\n // VALIDA SE A QUANTIDADE INFORMADA É UM NÚMERO\r\n if (!isNaN(_val)) {\r\n if (parseInt(_val) > 0) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n// ===============================================================\r\n// CLEAR NUMBER\r\n// ===============================================================\r\nexport function getClearNumber(_val) {\r\n // RETORNA UM NÚMERO LIMPO COMO INT\r\n if (!isNaN(_val)) {\r\n var clearNumber = parseInt(_val);\r\n\r\n return clearNumber;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n// ===============================================================\r\n// BUSCA\r\n// ===============================================================\r\nexport function setSearch() {\r\n const toggleButton = document.querySelectorAll('[data-toggle-search]');\r\n const search = document.querySelector('[data-search-container]');\r\n const input = document.querySelector('[data-search-input]');\r\n\r\n toggleButton.length > 0 && toggleButton.forEach(button => {\r\n button.addEventListener('click', () => {\r\n\r\n if (search.classList.contains('open')) {\r\n search.classList.remove('open');\r\n\r\n } else {\r\n search.classList.add('open');\r\n setTimeout(() => { input.focus() }, 400);\r\n }\r\n })\r\n })\r\n}\r\n\r\n// ===============================================================\r\n// CONDITIONAL LAZY\r\n// ===============================================================\r\nexport function handleConditionalLazy () {\r\n\r\n const setConditionalLazy = () => {\r\n window.removeEventListener('scroll', setConditionalLazy);\r\n window.removeEventListener('mousemove', setConditionalLazy);\r\n\r\n const productsVideo = document.querySelectorAll(\"[data-conditional-lazy]\");\r\n productsVideo.length > 0 && productsVideo.forEach(video => {\r\n video.classList.add('lazy');\r\n window.lazyLoadInstance && window.lazyLoadInstance.update();\r\n })\r\n }\r\n window.addEventListener('scroll', setConditionalLazy);\r\n window.addEventListener('mousemove', setConditionalLazy);\r\n\r\n}","import { slideToggle, slideDown } from '../../components/utilities';\r\n\r\nexport default function setFaq() {\r\n var collapseWrapper;\r\n var contentWrapper;\r\n var content;\r\n\r\n // No primeiro load verifica se tem o id do collapse na url e abre ela\r\n // console.log(document.location.hash);\r\n\r\n let urlCollapseId = document.location.hash;\r\n\r\n if (urlCollapseId) {\r\n collapseWrapper = document.querySelector(urlCollapseId);\r\n contentWrapper = collapseWrapper.querySelector('.content-wrapper');\r\n content = collapseWrapper.querySelector('.content');\r\n\r\n // Da scroll na página até o collapse\r\n window.scrollTo({\r\n top: contentWrapper.offsetTop - 300,\r\n behavior: 'smooth',\r\n });\r\n\r\n // Abre o collapse\r\n slideDown(contentWrapper, content, 300);\r\n }\r\n\r\n // Lida com o clique nos collapses\r\n var collapseButtons = document.querySelectorAll('[open-collapse]');\r\n\r\n collapseButtons.forEach((button) => {\r\n button.addEventListener('click', (e) => {\r\n e.preventDefault();\r\n\r\n collapseWrapper = button.closest('[data-collapse]');\r\n contentWrapper = collapseWrapper.querySelector('.content-wrapper');\r\n content = collapseWrapper.querySelector('.content');\r\n\r\n collapseWrapper.classList.toggle('-open');\r\n\r\n slideToggle(contentWrapper, content, 300);\r\n });\r\n });\r\n}\r\n","import setAbas from './pages/setAbas';\nimport setFaq from './pages/setFaq';\n//addImports\n\nconst Page = {\n init: function () {\n var _this = this; \n if (document.querySelector('[data-tab]')) {\n setAbas();\n\n window.addEventListener('hashchange', function () {\n setAbas();\n });\n }\n if (document.querySelector('[data-collapse]')) setFaq();\n //calls\n },\n};\n\nwindow.addEventListener('DOMContentLoaded', () => {\n Page.init();\n});\n"],"names":["handleTermsTabs","tabsButton","document","querySelectorAll","tabsContent","length","forEach","button","addEventListener","e","preventDefault","el","classList","remove","add","tabContentId","getAttribute","replace","content","id","setTimeout","window","scrollTo","top","behavior","location","hash","innerWidth","sidePositioning","offsetLeft","offsetWidth","offsetParent","left","slideDown","contentWrapper","duration","innerHeight","clientHeight","style","height","transition","setFaq","collapseWrapper","urlCollapseId","querySelector","offsetTop","closest","toggle","getComputedStyle","slideUp","slideToggle","Page","init"],"sourceRoot":""}