/** * External dependencies */ import apiFetch from '@wordpress/api-fetch'; // Stores the current nonce for the middleware. let currentNonce = ''; let currentTimestamp = 0; try { const storedNonceValue = window.localStorage.getItem( 'storeApiNonce' ); const storedNonce = storedNonceValue ? JSON.parse( storedNonceValue ) : {}; currentNonce = storedNonce?.nonce || ''; currentTimestamp = storedNonce?.timestamp || 0; } catch { // We can ignore an error from JSON parse. } /** * Returns whether or not this is a wc/store API request. * * @param {Object} options Fetch options. * * @return {boolean} Returns true if this is a store request. */ const isStoreApiRequest = ( options ) => { const url = options.url || options.path; if ( ! url || ! options.method || options.method === 'GET' ) { return false; } return /wc\/store\//.exec( url ) !== null; }; /** * Set the current nonce from a header object. * * @param {Object} headers Headers object. */ const setNonce = ( headers ) => { const nonce = typeof headers?.get === 'function' ? headers.get( 'X-WC-Store-API-Nonce' ) : headers[ 'X-WC-Store-API-Nonce' ]; const timestamp = typeof headers?.get === 'function' ? headers.get( 'X-WC-Store-API-Nonce-Timestamp' ) : headers[ 'X-WC-Store-API-Nonce-Timestamp' ]; if ( nonce ) { updateNonce( nonce, timestamp ); } }; /** * Updates the stored nonce within localStorage so it is persisted between page loads. * * @param {string} nonce Incoming nonce string. * @param {number} timestamp Timestamp from server of nonce. */ const updateNonce = ( nonce, timestamp ) => { // If the "new" nonce matches the current nonce, we don't need to update. if ( nonce === currentNonce ) { return; } // Only update the nonce if newer. It might be coming from cache. if ( currentTimestamp && timestamp < currentTimestamp ) { return; } currentNonce = nonce; currentTimestamp = timestamp || Date.now() / 1000; // Convert ms to seconds to match php time() // Update the persisted values. window.localStorage.setItem( 'storeApiNonce', JSON.stringify( { nonce: currentNonce, timestamp: currentTimestamp, } ) ); }; const appendNonceHeader = ( request ) => { const headers = request.headers || {}; request.headers = { ...headers, 'X-WC-Store-API-Nonce': currentNonce, }; return request; }; /** * Nonce middleware which appends the current nonce to store API requests. * * @param {Object} options Fetch options. * @param {Function} next The next middleware or fetchHandler to call. * @return {*} The evaluated result of the remaining middleware chain. */ const storeNonceMiddleware = ( options, next ) => { if ( isStoreApiRequest( options ) ) { options = appendNonceHeader( options ); // Add nonce to sub-requests if ( Array.isArray( options?.data?.requests ) ) { options.data.requests = options.data.requests.map( appendNonceHeader ); } } return next( options, next ); }; apiFetch.use( storeNonceMiddleware ); apiFetch.setNonce = setNonce; updateNonce( // @ts-ignore wcBlocksMiddlewareConfig is window global cache for the initial nonce initialized from hydration. wcBlocksMiddlewareConfig.storeApiNonce, // @ts-ignore wcBlocksMiddlewareConfig is window global cache for the initial nonce initialized from hydration. wcBlocksMiddlewareConfig.storeApiNonceTimestamp ); @import '../../../../scss/mixins'; .headerWrapper { align-self: center; display: flex; } .blockCategoryName { background: transparent; box-sizing: border-box; justify-content: space-between; margin: 0 auto 30px; padding: 0; text-align: center; } .blockCategoryNameLink { background: #fff; border: 1px solid #f1f1f1; color: $textColorDark; display: block; line-height: 60px; margin: auto; text-decoration: none; width: 95%; } .currentBlockCategory { height: 40px; padding: 0 30px 0 0; line-height: 40px; color: #767676; border-radius: 2px; font-size: 13px; cursor: pointer; position: relative; &::after { content: '\f345'; opacity: 0.7; margin-top: 0; font-family: dashicons; position: absolute; right: 7px; transform: rotate(0deg); transform-origin: 50% 50%; transition: transform 0.1s ease; font-size: 16px; } &:hover { &::after { transform: rotate(90deg); } &::before { // This is to prevent our drop down going away when we move our mouse down out of this div content: ''; position: absolute; display: block; left: 0; right: 0; bottom: -40px; top: 100%; background: transparent; } .optionBlockCategoryWrapper { display: block; } } } .optionBlockCategoryWrapper { background: #fff; border: 1px solid #e0e5e9; border-radius: 4px; box-shadow: 0 10px 10px rgba(0, 0, 0, 0.1); display: none; line-height: 30px; min-width: 170px; padding: 20px; position: absolute; left: -20px; top: 130%; white-space: nowrap; z-index: 8; column-count: 2; [dir='rtl'] & { left: unset; right: -20px; } &::after, &::before { content: ''; display: block; position: absolute; bottom: 100%; width: 0; height: 0; border-style: solid; } &::after { left: 23px; border-color: transparent transparent #fff; border-width: 10px; [dir='rtl'] & { left: unset; right: 23px; } } &::before { left: 23px; border-color: transparent transparent #e2e2e2; border-width: 11px; [dir='rtl'] & { left: unset; right: 23px; } } } .optionBlockCategory { padding: 0 30px; } .optionBlockCategoryLink { color: $textColorLight; text-decoration: none; border: 0; background: transparent; padding: 5px 0; cursor: pointer; &:hover { color: $textColorDark; } } .optionBlockCategoryLinkCurrent { text-decoration: underline; }
(function($){$.extend({tablesorter:new function(){var parsers=[],widgets=[];this.defaults={cssHeader:"header",cssAsc:"headerSortUp",cssDesc:"headerSortDown",cssChildRow:"expand-child",sortInitialOrder:"asc",sortMultiSortKey:"shiftKey",sortForce:null,sortAppend:null,sortLocaleCompare:true,textExtraction:"simple",parsers:{},widgets:[],widgetZebra:{css:["even","odd"]},headers:{},widthFixed:false,cancelSelection:true,sortList:[],headerList:[],dateFormat:"us",decimal:'/\.|\,/g',onRenderHeader:null,selectorHeaders:'thead th',debug:false};function benchmark(s,d){log(s+","+(new Date().getTime()-d.getTime())+"ms");}this.benchmark=benchmark;function log(s){if(typeof console!="undefined"&&typeof console.debug!="undefined"){console.log(s);}else{alert(s);}}function buildParserCache(table,$headers){if(table.config.debug){var parsersDebug="";}if(table.tBodies.length==0)return;var rows=table.tBodies[0].rows;if(rows[0]){var list=[],cells=rows[0].cells,l=cells.length;for(var i=0;i1){arr=arr.concat(checkCellColSpan(table,headerArr,row++));}else{if(table.tHead.length==1||(cell.rowSpan>1||!r[row+1])){arr.push(cell);}}}return arr;};function checkHeaderMetadata(cell){if(($.metadata)&&($(cell).metadata().sorter===false)){return true;};return false;}function checkHeaderOptions(table,i){if((table.config.headers[i])&&(table.config.headers[i].sorter===false)){return true;};return false;}function checkHeaderOptionsSortingLocked(table,i){if((table.config.headers[i])&&(table.config.headers[i].lockedOrder))return table.config.headers[i].lockedOrder;return false;}function applyWidget(table){var c=table.config.widgets;var l=c.length;for(var i=0;i');$("tr:first td",table.tBodies[0]).each(function(){colgroup.append($('').css('width',$(this).width()));});$(table).prepend(colgroup);};}function updateHeaderSortCount(table,sortList){var c=table.config,l=sortList.length;for(var i=0;i b["+i+"]) ? 1 : 0));";};function makeSortTextDesc(i){return"((b["+i+"] < a["+i+"]) ? -1 : ((b["+i+"] > a["+i+"]) ? 1 : 0));";};function makeSortNumeric(i){return"a["+i+"]-b["+i+"];";};function makeSortNumericDesc(i){return"b["+i+"]-a["+i+"];";};function sortText(a,b){if(table.config.sortLocaleCompare)return a.localeCompare(b);return((ab)?1:0));};function sortTextDesc(a,b){if(table.config.sortLocaleCompare)return b.localeCompare(a);return((ba)?1:0));};function sortNumeric(a,b){return a-b;};function sortNumericDesc(a,b){return b-a;};function getCachedSortType(parsers,i){return parsers[i].type;};this.construct=function(settings){return this.each(function(){if(!this.tHead||!this.tBodies)return;var $this,$document,$headers,cache,config,shiftDown=0,sortOrder;this.config={};config=$.extend(this.config,$.tablesorter.defaults,settings);$this=$(this);$.data(this,"tablesorter",config);$headers=buildHeaders(this);this.config.parsers=buildParserCache(this,$headers);cache=buildCache(this);var sortCSS=[config.cssDesc,config.cssAsc];fixColumnWidth(this);$headers.click(function(e){var totalRows=($this[0].tBodies[0]&&$this[0].tBodies[0].rows.length)||0;if(!this.sortDisabled&&totalRows>0){$this.trigger("sortStart");var $cell=$(this);var i=this.column;this.order=this.count++%2;if(this.lockedOrder)this.order=this.lockedOrder;if(!e[config.sortMultiSortKey]){config.sortList=[];if(config.sortForce!=null){var a=config.sortForce;for(var j=0;j0){$this.trigger("sorton",[config.sortList]);}applyWidget(this);});};this.addParser=function(parser){var l=parsers.length,a=true;for(var i=0;i eCopla https://validator.w3.org/feed/docs/rss2.html Best Vegas11 India Online Casino, Best 11 Warm Games! Blog Site Most Recent Gambling Information, Suggestions, And Up-dates Survive Songs Las Vegas 2025 2026 1win App Bələdçisi: Vurmaq, Yaratmaq, Qeydiyyat, Depozit Və Mərclər 1win Yüklə Android Apk Və Ios App 2025 əvəzsiz Kazino Indir 1win App Bələdçisi: Yükləmək, Yaratmaq, Qeydiyyat, Depozit Və Mərclər 1win India: Sign In Plus Registration Online Casino In Inclusion To Wagering Web Site Just How In Purchase To Down Load, Install In Inclusion To Start Applying The 1win App On Ios? 1win Logon And Sign Up On Typically The 1win Online Betting Program Bdmbet On Range Casino Overview Bonus Deals, Special Offers, Games Bdm Bet : Internet Site Oficial Bónus 450 + Two Hundred And Fifty Fs Bdmbet Reward Nouveau Joueur 100% Jusqu’à One Hundred Fifty Vas-y Sur Lunivers Des Gain époustouflants Fatboss Casino En Ligne : Avis Et Bonus 350 + 100 Fs Fatboss Gazette ᐈ Exclusive 150% Up Conseil Du Trésor 100 Sign Up Bonus Totally free 10 No-deposit Gambling establishment Bonuses Will get 2024 Mostbet ᐉ Bônus De Boas-vindas R$5555 ᐉ Oficial Mostbet Gambling Establishment Br Uncover The Particular Happiness Regarding Modern Slot Machines At Tadhana Tadhana Ph;tadhana Register;Ph O 888starz: Bukmacher I Kasyno Online Bez Tajemnic! Wpis W 888starz: Jakim Sposobem Zarejestrować Się Na Oficjalnej Stronie Www Www 888starz Casino Premia Powitalny I Opinie 2025 Opinion, Bonus Et Jeu En Ligne Fondamental Face B : Jusquà Essentiel + Fondamental Fs Meilleur 2025 Alexander Casino Le Meilleur Une Fois Jeu En France Fondamental Giochi E Scommesse Giornaliere Fantabet: I Piu Interessanti 20 Bookmaker Per Le Scommesse Sportive Fantasyteam: Scommesse Sportive Del Web, Poker E Casinò 22bet Casino Reseña De Expertos Y Jugadores 2025 Juega A Las Tragaperras Con Dinero Real 22bet Software Portugal Aplicação Oficial Para Ios E Android 22bet App España ᐉ Descargar 22bet Mobile Software Para Android E Ios 22bet Sportsbook Sporting Activities Wagering Together With Higher Odds Sport Development Lifecycle Gdlc My Profession Weblog Betonred Casino 2025- Scommetti Sul Rosso Mediante 100 Di Bonus Betonred Casino Accedi Subito E Sblocca 100 Giri In Assenza Di Acconto Polis Bet On Red️ Sito Ufficiale Successo Betonred Casino In Italia Descubre El Mundo De Apuestas Con 1win Apk Télécharger 1win Apk Pour Android Et Application Ios Descubre El Mundo De Apuestas Con 1win Apk Betonred Italia: La Tua Piattaforma Successo Riferimento Per Le Scommesse Del Web Betonred Login : Accedi Al Tuo Account Betonred Casinò E Scommesse Sportive Costruiti In Italy Home 10 Greatest International On-line casino Sites: Earth’s Top Gambling enterprises Szczere Kasyno Internetowego W Polsce Hell Spin Kasyno Poglądy 2025 Szczegółowa Recenzja Zaloguj Się Na Oficjalnej Stronie Hellspin W Polsce Bookmaker Reviews Bookie Ratings From Experts Rhino Bet Welcome Offer Get a £10 Free Bet Rhino Bet Casino Bonus and Review June 2025