// source --> https://fonon.store/wp-content/plugins/woocommerce/assets/js/frontend/single-product.min.js?ver=10.6.1 jQuery(function(t){if("undefined"==typeof wc_single_product_params)return!1;t("body").on("init",".wc-tabs-wrapper, .woocommerce-tabs",function(){t(this).find(".wc-tab, .woocommerce-tabs .panel:not(.panel .panel)").hide();var e=window.location.hash,i=window.location.href,o=t(this).find(".wc-tabs, ul.tabs").first();e.toLowerCase().indexOf("comment-")>=0||"#reviews"===e||"#tab-reviews"===e?o.find("li.reviews_tab a").trigger("click"):i.indexOf("comment-page-")>0||i.indexOf("cpage=")>0?o.find("li.reviews_tab a").trigger("click"):"#tab-additional_information"===e?o.find("li.additional_information_tab a").trigger("click"):o.find("li:first a").trigger("click")}).on("click",".wc-tabs li a, ul.tabs li a",function(e){e.preventDefault();var i=t(this),o=i.closest(".wc-tabs-wrapper, .woocommerce-tabs"),a=o.find(".wc-tabs, ul.tabs");a.find("li").removeClass("active"),a.find('a[role="tab"]').attr("aria-selected","false").attr("tabindex","-1"),o.find(".wc-tab, .panel:not(.panel .panel)").hide(),i.closest("li").addClass("active"),i.attr("aria-selected","true").attr("tabindex","0"),o.find("#"+i.attr("href").split("#")[1]).show()}).on("keydown",".wc-tabs li a, ul.tabs li a",function(e){var i="rtl"===document.documentElement.dir,o=e.key,a=i?"ArrowLeft":"ArrowRight",r=i?"ArrowRight":"ArrowLeft",n="ArrowDown",s="ArrowUp",l="Home",c="End";if([a,r,n,s,c,l].includes(o)){var d=t(this),p=d.closest(".wc-tabs-wrapper, .woocommerce-tabs").find(".wc-tabs, ul.tabs").find('a[role="tab"]'),h=p.length-1,g=p.index(d),u=o===r||o===s?g-1:g+1,m="horizontal";if(p.length>=2){var _=p[0].getBoundingClientRect(),f=p[1].getBoundingClientRect();m=Math.abs(f.top-_.top)>Math.abs(f.left-_.left)?"vertical":"horizontal"}("vertical"!==m||o!==r&&o!==a)&&("horizontal"!==m||o!==s&&o!==n)&&(e.preventDefault(),o===r&&0===g&&"horizontal"===m||o===s&&0===g&&"vertical"===m||o===c?u=h:(a===o&&g===h&&"horizontal"===m||n===o&&g===h&&"vertical"===m||o===l)&&(u=0),p.eq(u).focus())}}).on("click","a.woocommerce-review-link",function(){return t(".reviews_tab a").trigger("click"),!0}).on("init","#rating",function(){t(this).hide().before('

\t\t\t\t\t\t\t\t\t\t\t\t\t'+wc_single_product_params.i18n_rating_options[0]+'\t\t\t\t\t\t\t'+wc_single_product_params.i18n_rating_options[1]+'\t\t\t\t\t\t\t'+wc_single_product_params.i18n_rating_options[2]+'\t\t\t\t\t\t\t'+wc_single_product_params.i18n_rating_options[3]+'\t\t\t\t\t\t\t'+wc_single_product_params.i18n_rating_options[4]+"\t\t\t\t\t\t\t\t\t\t\t

")}).on("click","#respond p.stars a",function(){var e=t(this),i=e.closest("p.stars").find("a").index(e)+1,o=t(this).closest("#respond").find("#rating"),a=t(this).closest(".stars");return o.val(i),e.siblings("a").removeClass("active").attr("aria-checked","false").attr("tabindex","-1"),e.addClass("active").attr("aria-checked","true").attr("tabindex","0"),a.addClass("selected"),!1}).on("click","#respond #submit",function(){var e=t(this).closest("#respond").find("#rating"),i=e.val();if(e.length>0&&!i&&"yes"===wc_single_product_params.review_rating_required)return window.alert(wc_single_product_params.i18n_required_rating_text),!1}).on("keyup",".wc-tabs li a, ul.tabs li a, #respond p.stars a",function(e){var i=e.key,o=["ArrowRight","ArrowDown"];o.concat(["ArrowLeft","ArrowUp"]).includes(i)&&(e.preventDefault(),e.stopPropagation(),o.includes(i)?t(this).next().focus().click():t(this).prev().focus().click())}),t(".wc-tabs-wrapper, .woocommerce-tabs, #rating").trigger("init");var e=function(e,i){this.$target=e,this.$images=t(".woocommerce-product-gallery__image",e),0!==this.$images.length?(e.data("product_gallery",this),this.flexslider_enabled="function"==typeof t.fn.flexslider&&wc_single_product_params.flexslider_enabled,this.zoom_enabled="function"==typeof t.fn.zoom&&wc_single_product_params.zoom_enabled,this.photoswipe_enabled="undefined"!=typeof PhotoSwipe&&wc_single_product_params.photoswipe_enabled,i&&(this.flexslider_enabled=!1!==i.flexslider_enabled&&this.flexslider_enabled,this.zoom_enabled=!1!==i.zoom_enabled&&this.zoom_enabled,this.photoswipe_enabled=!1!==i.photoswipe_enabled&&this.photoswipe_enabled),1===this.$images.length&&(this.flexslider_enabled=!1),this.initFlexslider=this.initFlexslider.bind(this),this.initZoom=this.initZoom.bind(this),this.initZoomForTarget=this.initZoomForTarget.bind(this),this.initPhotoswipe=this.initPhotoswipe.bind(this),this.onResetSlidePosition=this.onResetSlidePosition.bind(this),this.getGalleryItems=this.getGalleryItems.bind(this),this.openPhotoswipe=this.openPhotoswipe.bind(this),this.trapFocusPhotoswipe=this.trapFocusPhotoswipe.bind(this),this.handlePswpTrapFocus=this.handlePswpTrapFocus.bind(this),this.flexslider_enabled?(this.initFlexslider(i.flexslider),e.on("woocommerce_gallery_reset_slide_position",this.onResetSlidePosition)):this.$target.css("opacity",1),this.zoom_enabled&&(this.initZoom(),e.on("woocommerce_gallery_init_zoom",this.initZoom)),this.photoswipe_enabled&&this.initPhotoswipe()):this.$target.css("opacity",1)};e.prototype.initFlexslider=function(e){var i=this.$target,o=this,a=t.extend({selector:".woocommerce-product-gallery__wrapper > .woocommerce-product-gallery__image",start:function(){i.css("opacity",1)},after:function(t){o.initZoomForTarget(o.$images.eq(t.currentSlide))}},e);i.flexslider(a),t(".woocommerce-product-gallery__wrapper .woocommerce-product-gallery__image:eq(0) .wp-post-image").one("load",function(){var e=t(this);e&&setTimeout(function(){var t=e.closest(".woocommerce-product-gallery__image").height(),i=e.closest(".flex-viewport");t&&i&&i.height(t)},100)}).each(function(){this.complete&&t(this).trigger("load")})},e.prototype.initZoom=function(){"complete"===document.readyState?this.initZoomForTarget(this.$images.first()):t(window).on("load",()=>{this.initZoomForTarget(this.$images.first())})},e.prototype.initZoomForTarget=function(e){if(!this.zoom_enabled)return!1;var i=this.$target.width(),o=!1;if(t(e).each(function(e,a){if(t(a).find("img").data("large_image_width")>i)return o=!0,!1}),o){var a=t.extend({touch:!1,callback:function(){var t=this;setTimeout(function(){t.removeAttribute("role"),t.setAttribute("alt",""),t.setAttribute("aria-hidden","true")},100)}},wc_single_product_params.zoom_options);"ontouchstart"in document.documentElement&&(a.on="click"),e.trigger("zoom.destroy"),e.zoom(a),setTimeout(function(){e.find(":hover").length&&e.trigger("mouseover")},100)}},e.prototype.initPhotoswipe=function(){this.zoom_enabled&&this.$images.length>0?(this.$target.prepend(''),this.$target.on("click",".woocommerce-product-gallery__trigger",this.openPhotoswipe),this.$target.on("keydown",".woocommerce-product-gallery__trigger",t=>{" "===t.key&&this.openPhotoswipe(t)}),this.$target.on("click",".woocommerce-product-gallery__image a",function(t){t.preventDefault()}),this.flexslider_enabled||this.$target.on("click",".woocommerce-product-gallery__image a",this.openPhotoswipe)):this.$target.on("click",".woocommerce-product-gallery__image a",this.openPhotoswipe)},e.prototype.onResetSlidePosition=function(){this.$target.flexslider(0)},e.prototype.getGalleryItems=function(){var e=this.$images,i=[];return e.length>0&&e.each(function(e,o){var a=t(o).find("img");if(a.length){var r=a.attr("data-large_image"),n=a.attr("data-large_image_width"),s=a.attr("data-large_image_height"),l={alt:a.attr("alt"),src:r,w:n,h:s,title:a.attr("data-caption")?a.attr("data-caption"):a.attr("title")};i.push(l)}}),i},e.prototype.openPhotoswipe=function(e){e.preventDefault();var i,o=t(".pswp")[0],a=this.getGalleryItems(),r=t(e.target),n=e.currentTarget,s=this;i=0=i.length)){var o=i[0],a=i[i.length-1];"Tab"===t.key&&(t.shiftKey?document.activeElement===o&&(t.preventDefault(),a.focus()):document.activeElement===a&&(t.preventDefault(),o.focus()))}},t.fn.wc_product_gallery=function(t){return new e(this,t||wc_single_product_params),this},t(".woocommerce-product-gallery").each(function(){t(this).trigger("wc-product-gallery-before-init",[this,wc_single_product_params]),t(this).wc_product_gallery(wc_single_product_params),t(this).trigger("wc-product-gallery-after-init",[this,wc_single_product_params])})}); // source --> https://fonon.store/wp-content/plugins/woocommerce/assets/js/js-cookie/js.cookie.min.js?ver=2.1.4-wc.10.6.1 /*! js-cookie v3.0.5 | MIT */ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self,function(){var n=e.Cookies,o=e.Cookies=t();o.noConflict=function(){return e.Cookies=n,o}}())}(this,function(){"use strict";function e(e){for(var t=1;t https://fonon.store/wp-content/plugins/translatepress-multilingual/assets/js/trp-frontend-compatibility.js?ver=3.1.3 document.addEventListener("DOMContentLoaded", function(event) { function trpClearWooCartFragments(){ // clear WooCommerce cart fragments when switching language var trp_language_switcher_urls = document.querySelectorAll(".trp-language-switcher-container a:not(.trp-ls-disabled-language), .trp-language-item:not(.trp-language-item__current)"); for (i = 0; i < trp_language_switcher_urls.length; i++) { trp_language_switcher_urls[i].addEventListener("click", function(){ if ( typeof wc_cart_fragments_params !== 'undefined' && typeof wc_cart_fragments_params.fragment_name !== 'undefined' ) { window.sessionStorage.removeItem(wc_cart_fragments_params.fragment_name); } }); } } trpClearWooCartFragments(); }); // source --> https://fonon.store/wp-content/plugins/translatepress-multilingual/assets/js/trp-frontend-language-switcher.js?ver=3.1.3 class BaseSwitcher { constructor(rootEl) { this.root = rootEl; this.list = rootEl?.querySelector('.trp-switcher-dropdown-list') || null; this.isOpen = false; this._pendingFocusOnOpen = false; if (!this.root || !this.list) return; if (!this.list.id) { this.list.id = `trp-list-${Math.random().toString(36).slice(2, 9)}`; } // Single transitionend handler to drop .is-transitioning and finalize hidden/inert this._onTe = (e) => { if (e.target !== this.list || e.propertyName !== 'max-height') return; this.root.classList.remove('is-transitioning'); if (!this.isOpen) { this.list.hidden = true; this.list.setAttribute('inert', ''); } else if (this._pendingFocusOnOpen) { this._pendingFocusOnOpen = false; const first = this.list.querySelector( '[role="option"], a, button, [tabindex]:not([tabindex="-1"])' ); first?.focus?.({ preventScroll: true }); } }; this.list.addEventListener('transitionend', this._onTe); this.collapse(); this.setAutoWidth(); this.bindKeyboard(); } /** * Returns true if the list has a non-zero transition duration (for any property). * We use this to decide whether to rely on `transitionend` or fall back to sync behavior. */ _hasAnimatedTransition() { if (!this.list) return false; const cs = getComputedStyle(this.list); const durationsRaw = cs.transitionDuration || ''; if (!durationsRaw) return false; const durations = durationsRaw .split(',') .map(str => parseFloat(str) || 0); return durations.some(d => d > 0); } collapse() { this.list.hidden = true; this.list.setAttribute('inert', ''); this.setExpanded(false); this.root.classList.remove('is-transitioning'); } /** * If width is set to auto, fix it to the calculated width + 20px * We do this in order to avoid width shift on hover * */ setAutoWidth() { const bonusWidth = 10; const cs = getComputedStyle(this.root); const declaredWidth = cs.getPropertyValue('--switcher-width').trim(); if (declaredWidth === 'auto' && this.root.querySelector('.trp-language-item-name')) { // In case trp-language-item-name is not present, we are in flags only mode - so no auto width sizing is needed const initialWidth = this.root.getBoundingClientRect().width; this.root.style.setProperty('--switcher-width', (initialWidth + bonusWidth) + 'px'); } } setExpanded(open) { const trigger = this.root.querySelector('.trp-language-item__current[role="button"]'); const val = String( !!open ); trigger?.setAttribute('aria-expanded', val); this.root.classList.toggle('is-open', !!open); } setOpen( open, { source = null } = {} ) { if ( !this.root || !this.list || open === this.isOpen ) return; const prefersReduced = window.matchMedia?.('(prefers-reduced-motion: reduce)')?.matches; const hasTransition = !prefersReduced && this._hasAnimatedTransition(); this.isOpen = open; // No transitions (0s duration) OR reduced motion: do everything synchronously, if ( !hasTransition ) { if ( open ) { this.list.hidden = false; this.list.removeAttribute( 'inert' ); this.setExpanded( true ); this._pendingFocusOnOpen = ( source?.type === 'keydown' ); if ( this._pendingFocusOnOpen ) { this._pendingFocusOnOpen = false; const first = this.list.querySelector( '[role="option"], a, button, [tabindex]:not([tabindex="-1"])' ); first?.focus?.({ preventScroll: true }); } } else { this.setExpanded( false ); this.list.hidden = true; this.list.setAttribute( 'inert', '' ); this._pendingFocusOnOpen = false; } return; } // Animated path: rely on transitionend to remove .is-transitioning if ( open ) { // Must be visible for CSS transition to run this.list.hidden = false; this.list.removeAttribute( 'inert' ); this._pendingFocusOnOpen = ( source?.type === 'keydown' ); this.root.classList.add( 'is-transitioning' ); // Next frame so browser registers pre-open (max-height: 0) state requestAnimationFrame( () => this.setExpanded( true ) ); } else { this.root.classList.add( 'is-transitioning' ); this.setExpanded( false ); } } bindKeyboard() { const trigger = this.root.querySelector('.trp-language-item__current[role="button"]'); if ( !trigger ) return; trigger.addEventListener('keydown', (e) => { const inList = !!e.target.closest?.('.trp-switcher-dropdown-list'); if ( e.key === 'Enter' || e.key === ' ' ) { e.preventDefault(); this.setOpen(!this.isOpen, { source: e }); return; } if ( e.key === 'ArrowDown' && !this.isOpen ) { e.preventDefault(); this.setOpen(true, { source: e }); } if ( e.key === 'Escape' ) { this.setOpen(false, { source: e }); trigger.focus?.(); } }); } } class ShortcodeSwitcher extends BaseSwitcher { constructor(wrapper) { const overlay = wrapper.querySelector('.trp-language-switcher.trp-shortcode-overlay') || [...wrapper.querySelectorAll('.trp-language-switcher')] .find(el => el.classList.contains('trp-shortcode-overlay')); // Overlay must be interactable; ensure no accidental hidden/inert from server overlay.hidden = false; overlay.removeAttribute('hidden'); overlay.removeAttribute('inert'); if ('inert' in overlay) overlay.inert = false; super(overlay); if (!this.root || !this.list) return; const control = this.root.querySelector('.trp-language-item__current[role="button"]'); if (control && this.list && !control.hasAttribute('aria-controls')) { control.setAttribute('aria-controls', this.list.id); } const isClickMode = this.root.classList.contains('trp-open-on-click') || wrapper.dataset.openMode === 'click' || wrapper.classList.contains('trp-open-on-click'); if (isClickMode) { // Click anywhere on overlay EXCEPT inside the list this.root.addEventListener('click', (e) => { const inList = e.target.closest('.trp-switcher-dropdown-list'); if (!inList) { e.preventDefault(); e.stopPropagation(); this.setOpen(!this.isOpen, { source: e }); } }, true); // Outside click closes this.onDocClick = (evt) => { if (!wrapper.contains(evt.target)) this.setOpen(false, { source: evt }); }; document.addEventListener('click', this.onDocClick, true); // Focus leaving wrapper closes wrapper.addEventListener('focusout', () => { setTimeout(() => { if (!wrapper.contains(document.activeElement)) { this.setOpen(false, { source: 'keyboard' }); } }, 0); }); } else { // Hover mode on overlay this.root.addEventListener('mouseenter', (e) => this.setOpen(true, { source: e })); this.root.addEventListener('mouseleave', (e) => this.setOpen(false, { source: e })); } } } class FloaterSwitcher extends BaseSwitcher { constructor(el) { super(el); el.addEventListener('mouseenter', (e) => this.setOpen(true, { source: e })); el.addEventListener('mouseleave', (e) => this.setOpen(false, { source: e })); this.onDocClick = (evt) => { if (!el.contains(evt.target)) this.setOpen(false, { source: evt }); }; document.addEventListener('click', this.onDocClick, true); } } document.addEventListener('DOMContentLoaded', () => { // Front-end or classic admin initLanguageSwitchers(document); // If no wrapper and we are in Gutenberg, watch for async SSR insert if ( inGutenberg() && !getEditorDoc().querySelector(WRAPPER) ) { observeWrapperUntilFound(); } if ( !inGutenberg() ) observeShortcodeSwitcher(); }); /** For shortcode switcher * Mark the shortcodes that were initialized * */ const TRP_BOUND = new WeakSet(); const mark = (el) => TRP_BOUND.add(el); const isMarked = (el) => TRP_BOUND.has(el); const WRAPPER = '.trp-shortcode-switcher__wrapper'; const OVERLAY = '.trp-language-switcher:not(.trp-opposite-button)'; // Helpers function inGutenberg() { return document.body?.classList?.contains('block-editor-page') || !!(window.wp?.data?.select?.('core/block-editor')); } // If editor uses an iframe canvas, work inside it function getEditorDoc() { const ifr = document.querySelector('iframe[name="editor-canvas"], .editor-canvas__iframe'); return (ifr && ifr.contentDocument) ? ifr.contentDocument : document; } function initLanguageSwitchers(root = document) { const floater = root.querySelector( '.trp-language-switcher.trp-ls-dropdown:not(.trp-shortcode-switcher):not(.trp-opposite-language)' ); if (floater) new FloaterSwitcher(floater); root.querySelectorAll(WRAPPER) .forEach(wrapper => { const overlay = wrapper.querySelector('.trp-language-switcher:not(.trp-opposite-button)'); if (overlay && !isMarked(overlay)) { mark(overlay); new ShortcodeSwitcher(wrapper); } }); } /** * Observes the document for dynamically inserted shortcode switchers and initializes them automatically when detected. */ function observeShortcodeSwitcher() { const initWrapper = ( wrapper ) => { if ( !wrapper ) return; const overlay = wrapper.querySelector( OVERLAY ); if ( !overlay || isMarked( overlay ) ) return; mark( overlay ); new ShortcodeSwitcher( wrapper ); } const mo = new MutationObserver( ( mutations ) => { for ( const m of mutations ) { for ( const n of m.addedNodes ) { if ( n.nodeType !== 1 ) continue; if ( n.matches?.( WRAPPER ) ) initWrapper( n ); n.querySelectorAll?.( WRAPPER ).forEach( initWrapper ); } } }); mo.observe( document, { childList: true, subtree: true } ); } /** * Observe Gutenberg for the shortcode wrapper being inserted asynchronously. * * Supports both Blocks API v2 (no editor iframe; wrapper appears in the outer document) * and Blocks API v3 (editor content rendered inside an iframe canvas). * * Strategy: * 1) Check the current editor document for `.trp-shortcode-switcher__wrapper` and init immediately. * 2) If an editor canvas iframe exists, watch its document (and reattach on iframe load) for the wrapper. * 3) If no iframe yet, watch the outer document for either the iframe (v3) or the wrapper itself (v2). * * Initialization is performed once per context to avoid duplicate bindings. */ function observeWrapperUntilFound() { // If wrapper already exists in current editor doc, init const edDoc = getEditorDoc(); const existing = edDoc.querySelector(WRAPPER); if ( existing ) { initLanguageSwitchers( edDoc ); return; } // Helper to locate the editor canvas iframe in the OUTER document const findCanvasIframe = () => document.querySelector('iframe[name="editor-canvas"], .editor-canvas__iframe'); // If iframe is already present in the outer doc, start watching inside it const iframeNow = findCanvasIframe(); if ( iframeNow ) { watchIframe( iframeNow ); return; } // Otherwise, observe the OUTER document until the iframe appears const outerMO = new MutationObserver( ( mutations ) => { for ( const m of mutations ) { for ( const n of m.addedNodes ) { if ( n.nodeType !== 1 ) continue; const iframe = n.matches?.('iframe[name="editor-canvas"], .editor-canvas__iframe') ? n : n.querySelector?.('iframe[name="editor-canvas"], .editor-canvas__iframe'); if ( iframe ) { outerMO.disconnect(); watchIframe( iframe ); return; } // Also catch shortcode wrapper added directly to the outer document (API v2, no iframe) const wrapper = n.matches?.(WRAPPER) ? n : n.querySelector?.(WRAPPER); if ( wrapper ) { outerMO.disconnect(); initLanguageSwitchers( document ); return; } } } } ); outerMO.observe( document, { childList: true, subtree: true } ); function watchIframe( iframe ) { // Try immediately (some builds inject srcdoc synchronously) tryAttachInside(); // Also on load/navigate (Gutenberg may reload the canvas) iframe.addEventListener( 'load', tryAttachInside ); function tryAttachInside() { let doc; try { doc = iframe.contentDocument || iframe.contentWindow?.document; } catch (e) { console.warn('Cannot access iframe content due to cross-origin restrictions', e); return; } if ( !doc ) return; // If wrapper is already there, init once and stop. const hit = doc.querySelector(WRAPPER); if ( hit ) { initLanguageSwitchers( doc ); return; } // Observe INSIDE the iframe until wrapper appears const innerMO = new MutationObserver( ( muts ) => { for ( const mm of muts ) { for ( const nn of mm.addedNodes ) { if ( nn.nodeType !== 1 ) continue; if ( nn.matches?.(WRAPPER) || nn.querySelector?.(WRAPPER) ) { innerMO.disconnect(); initLanguageSwitchers( doc ); return; } } } if ( doc.querySelector(WRAPPER) ) { innerMO.disconnect(); initLanguageSwitchers( doc ); } } ); innerMO.observe( doc, { childList: true, subtree: true } ); } } };