// source --> https://fonon.store/wp-content/plugins/woocommerce/assets/js/frontend/add-to-cart.min.js?ver=10.6.1
jQuery(function(t){if("undefined"==typeof wc_add_to_cart_params)return!1;var a=function(){this.requests=[],this.addRequest=this.addRequest.bind(this),this.run=this.run.bind(this),this.$liveRegion=this.createLiveRegion(),t(document.body).on("click",".add_to_cart_button:not(.wc-interactive)",{addToCartHandler:this},this.onAddToCart).on("keydown",".add_to_cart_button:not(.wc-interactive)",{addToCartHandler:this},t=>{" "===t.key&&(t.preventDefault(),t.target.click())}).on("click",".remove_from_cart_button",{addToCartHandler:this},this.onRemoveFromCart).on("keydown",".remove_from_cart_button",this.onKeydownRemoveFromCart).on("added_to_cart",{addToCartHandler:this},this.onAddedToCart).on("removed_from_cart",{addToCartHandler:this},this.onRemovedFromCart).on("ajax_request_not_sent.adding_to_cart",this.updateButton)};a.prototype.addRequest=function(t){this.requests.push(t),1===this.requests.length&&this.run()},a.prototype.run=function(){var a=this,e=a.requests[0].complete;a.requests[0].complete=function(){"function"==typeof e&&e(),a.requests.shift(),a.requests.length>0&&a.run()},t.ajax(this.requests[0])},a.prototype.onAddToCart=function(a){var e=t(this);if(e.is(".ajax_add_to_cart")){if(!e.attr("data-product_id"))return!0;if(a.data.addToCartHandler.$liveRegion.text("").removeAttr("aria-relevant"),a.preventDefault(),e.removeClass("added"),e.addClass("loading"),!1===t(document.body).triggerHandler("should_send_ajax_request.adding_to_cart",[e]))return t(document.body).trigger("ajax_request_not_sent.adding_to_cart",[!1,!1,e]),!0;var r={};t.each(e.data(),function(t,a){r[t]=a}),t.each(e[0].dataset,function(t,a){r[t]=a}),t(document.body).trigger("adding_to_cart",[e,r]),a.data.addToCartHandler.addRequest({type:"POST",url:wc_add_to_cart_params.wc_ajax_url.toString().replace("%%endpoint%%","add_to_cart"),data:r,success:function(a){a&&(a.error&&a.product_url?window.location=a.product_url:"yes"!==wc_add_to_cart_params.cart_redirect_after_add?t(document.body).trigger("added_to_cart",[a.fragments,a.cart_hash,e]):window.location=wc_add_to_cart_params.cart_url)},dataType:"json"})}},a.prototype.onRemoveFromCart=function(a){var e=t(this),r=e.closest(".woocommerce-mini-cart-item");a.data.addToCartHandler.$liveRegion.text("").removeAttr("aria-relevant"),a.preventDefault(),r.block({message:null,overlayCSS:{opacity:.6}}),a.data.addToCartHandler.addRequest({type:"POST",url:wc_add_to_cart_params.wc_ajax_url.toString().replace("%%endpoint%%","remove_from_cart"),data:{cart_item_key:e.data("cart_item_key")},success:function(a){a&&a.fragments?t(document.body).trigger("removed_from_cart",[a.fragments,a.cart_hash,e]):window.location=e.attr("href")},error:function(){window.location=e.attr("href")},dataType:"json"})},a.prototype.onKeydownRemoveFromCart=function(a){" "===a.key&&(a.preventDefault(),t(this).trigger("click"))},a.prototype.updateButton=function(a,e,r,o){if(o=void 0!==o&&o){if(o.removeClass("loading"),e&&o.addClass("added"),e&&!wc_add_to_cart_params.is_cart&&0===o.parent().find(".added_to_cart").length){var d=document.createElement("a");d.href=wc_add_to_cart_params.cart_url,d.className="added_to_cart wc-forward",d.title=wc_add_to_cart_params.i18n_view_cart,d.textContent=wc_add_to_cart_params.i18n_view_cart,o.after(d)}t(document.body).trigger("wc_cart_button_updated",[o])}},a.prototype.updateFragments=function(a,e){e&&(t.each(e,function(a){t(a).addClass("updating").fadeTo("400","0.6").block({message:null,overlayCSS:{opacity:.6}})}),t.each(e,function(a,e){t(a).replaceWith(e),t(a).stop(!0).css("opacity","1").unblock()}),t(document.body).trigger("wc_fragments_loaded"))},a.prototype.alertCartUpdated=function(t,a,e,r){if(r=void 0!==r&&r){var o=r.data("success_message");if(!o)return;t.data.addToCartHandler.$liveRegion.delay(1e3).text(o).attr("aria-relevant","all")}},a.prototype.createLiveRegion=function(){var a=t(".widget_shopping_cart_live_region");return a.length?a:t('
').appendTo("body")},a.prototype.onAddedToCart=function(t,a,e,r){t.data.addToCartHandler.updateButton(t,a,e,r),t.data.addToCartHandler.updateFragments(t,a),t.data.addToCartHandler.alertCartUpdated(t,a,e,r)},a.prototype.onRemovedFromCart=function(t,a,e,r){t.data.addToCartHandler.updateFragments(t,a),t.data.addToCartHandler.alertCartUpdated(t,a,e,r)},new a});
// 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 } );
}
}
};