1;(function($){ 2"use strict"; 3 4 /** 5 * Senitize HTML 6 */ 7 var woolentorSanitizeHTML = function (str) { 8 if( str ){ 9 return str.replace(/[&<>"']/g, function (c) { 10 switch (c) { 11 case '&': return '&'; 12 case '<': return '<'; 13 case '>': return '>'; 14 case '"': return '"'; 15 case "'": return '''; 16 default: return c; 17 } 18 }); 19 }else{ 20 return ''; 21 } 22 } 23 24 /** 25 * Sanitize Object 26 */ 27 var woolentorSanitizeObject = function (inputObj) { 28 const sanitizedObj = {}; 29 30 for (let key in inputObj) { 31 if (inputObj.hasOwnProperty(key)) { 32 let value = inputObj[key]; 33 34 // Sanitize based on the value type 35 if (typeof value === 'string') { 36 // Sanitize strings to prevent injection 37 sanitizedObj[key] = woolentorSanitizeHTML(value); 38 } else if (typeof value === 'number') { 39 // Ensure numbers are valid (you could also set limits if needed) 40 sanitizedObj[key] = Number.isFinite(value) ? value : 0; 41 } else if (typeof value === 'boolean') { 42 // Keep boolean values as they are 43 sanitizedObj[key] = value; 44 } else { 45 // Handle other types if needed (e.g., arrays, objects) 46 sanitizedObj[key] = value; 47 } 48 } 49 } 50 51 return sanitizedObj; 52 } 53 54 /* 55 * Product Slider 56 */ 57 var WidgetProductSliderHandler = function ($scope, $) { 58 59 var slider_elem = $scope.find('.product-slider').eq(0); 60 61 if (slider_elem.length > 0) { 62 63 slider_elem[0].style.display='block'; 64 65 var settings = woolentorSanitizeObject(slider_elem.data('settings')); 66 var arrows = settings['arrows']; 67 var dots = settings['dots']; 68 var autoplay = settings['autoplay']; 69 var infinite = settings.hasOwnProperty('infinite') ? settings['infinite'] : true; 70 var rtl = settings['rtl']; 71 var autoplay_speed = parseInt(settings['autoplay_speed']) || 3000; 72 var animation_speed = parseInt(settings['animation_speed']) || 300; 73 var fade = settings['fade']; 74 var pause_on_hover = settings['pause_on_hover']; 75 var display_columns = parseInt(settings['product_items']) || 4; 76 var scroll_columns = parseInt(settings['scroll_columns']) || 4; 77 var tablet_width = parseInt(settings['tablet_width']) || 800; 78 var tablet_display_columns = parseInt(settings['tablet_display_columns']) || 2; 79 var tablet_scroll_columns = parseInt(settings['tablet_scroll_columns']) || 2; 80 var mobile_width = parseInt(settings['mobile_width']) || 480; 81 var mobile_display_columns = parseInt(settings['mobile_display_columns']) || 1; 82 var mobile_scroll_columns = parseInt(settings['mobile_scroll_columns']) || 1; 83 84 slider_elem.not('.slick-initialized').slick({ 85 arrows: arrows, 86 prevArrow: '<button type="button" class="slick-prev"><i class="fa fa-angle-left"></i></button>', 87 nextArrow: '<button type="button" class="slick-next"><i class="fa fa-angle-right"></i></button>', 88 dots: dots, 89 infinite: infinite, 90 autoplay: autoplay, 91 autoplaySpeed: autoplay_speed, 92 speed: animation_speed, 93 fade: false, 94 pauseOnHover: pause_on_hover, 95 slidesToShow: display_columns, 96 slidesToScroll: scroll_columns, 97 rtl: rtl, 98 responsive: [ 99 { 100 breakpoint: tablet_width, 101 settings: { 102 slidesToShow: tablet_display_columns, 103 slidesToScroll: tablet_scroll_columns 104 } 105 }, 106 { 107 breakpoint: mobile_width, 108 settings: { 109 slidesToShow: mobile_display_columns, 110 slidesToScroll: mobile_scroll_columns 111 } 112 } 113 ] 114 }); 115 }; 116 }; 117 118 /* 119 * Custom Tab 120 */ 121 function woolentor_tabs( $tabmenus, $tabpane ){ 122 $tabmenus.on('click', 'a', function(e){ 123 e.preventDefault(); 124 var $this = $(this), 125 $target = $this.attr('href'); 126 $this.addClass('htactive').parent().siblings().children('a').removeClass('htactive'); 127 $( $tabpane + $target ).addClass('htactive').siblings().removeClass('htactive'); 128 129 // slick refresh 130 if( $('.slick-slider').length > 0 ){ 131 var $id = $this.attr('href'); 132 $( $id ).find('.slick-slider').slick('refresh'); 133 } 134 135 }); 136 } 137 138 /* 139 * Universal product 140 */ 141 function productImageThumbnailsSlider( $slider ){ 142 $slider.slick({ 143 dots: true, 144 arrows: true, 145 prevArrow: '<button class="slick-prev"><i class="sli sli-arrow-left"></i></button>', 146 nextArrow: '<button class="slick-next"><i class="sli sli-arrow-right"></i></button>', 147 }); 148 } 149 if( $(".ht-product-image-slider").length > 0 ) { 150 productImageThumbnailsSlider( $(".ht-product-image-slider") ); 151 } 152 153 var WidgetThumbnaisImagesHandler = function thumbnailsimagescontroller(){ 154 woolentor_tabs( $(".ht-product-cus-tab-links"), '.ht-product-cus-tab-pane' ); 155 woolentor_tabs( $(".ht-tab-menus"), '.ht-tab-pane' ); 156 157 // Countdown 158 var finalTime, daysTime, hours, minutes, second; 159 $('.ht-product-countdown').each(function() { 160 var $this = $(this), finalDate = $(this).data('countdown'); 161 var customlavel = $(this).data('customlavel'); 162 $this.countdown(finalDate, function(event) { 163 $this.html(event.strftime('<div class="cd-single"><div class="cd-single-inner"><h3>%D</h3><p>'+woolentorSanitizeHTML(customlavel.daytxt)+'</p></div></div><div class="cd-single"><div class="cd-single-inner"><h3>%H</h3><p>'+woolentorSanitizeHTML(customlavel.hourtxt)+'</p></div></div><div class="cd-single"><div class="cd-single-inner"><h3>%M</h3><p>'+woolentorSanitizeHTML(customlavel.minutestxt)+'</p></div></div><div class="cd-single"><div class="cd-single-inner"><h3>%S</h3><p>'+woolentorSanitizeHTML(customlavel.secondstxt)+'</p></div></div>')); 164 }); 165 }); 166 167 } 168 169 /* 170 * Tool Tip 171 */ 172 function woolentor_tool_tips(element, content) { 173 if ( content == 'html' ) { 174 var tipText = element.text(); 175 } else { 176 var tipText = element.attr('title'); 177 } 178 element.on('mouseover', function() { 179 if ( $('.woolentor-tip').length == 0 ) { 180 element.before('<span class="woolentor-tip">' + woolentorSanitizeHTML(tipText) + '</span>'); 181 $('.woolentor-tip').css('transition', 'all 0.5s ease 0s'); 182 $('.woolentor-tip').css('margin-left', 0); 183 } 184 }); 185 element.on('mouseleave', function() { 186 $('.woolentor-tip').remove(); 187 }); 188 } 189 190 /* 191 * Tooltip Render 192 */ 193 var WidgetWoolentorTooltipHandler = function woolentor_tool_tip(){
194 $('a.woolentor-compare').each(function() { 195 woolentor_tool_tips( $(this), 'title' ); 196 }); 197 $('.woolentor-cart a.add_to_cart_button,.woolentor-cart a.added_to_cart,.woolentor-cart a.button').each(function() { 198 woolentor_tool_tips( $(this), 'html'); 199 }); 200 $('a.woolentor-quick-checkout-button').each(function() { 201 woolentor_tool_tips( $(this), 'title' ); 202 }); 203 } 204 205 /* 206 * Product Tab 207 */ 208 var WidgetProducttabsHandler = woolentor_tabs( $(".ht-tab-menus"),'.ht-tab-pane' ); 209 210 /* 211 * Single Product Video Gallery tab 212 */ 213 var WidgetProductVideoGallery = function thumbnailsvideogallery(){ 214 woolentor_tabs( $(".woolentor-product-video-tabs"), '.video-cus-tab-pane' ); 215 } 216 217 /** 218 * WoolentorAccordion 219 */ 220 var WoolentorAccordion = function ( $scope, $ ){ 221 var accordion_elem = $scope.find('.htwoolentor-faq').eq(0); 222 223 var data_opt = accordion_elem.data('settings'); 224 225 if ( accordion_elem.length > 0 ) { 226 var $id = accordion_elem.attr('id'); 227 new Accordion('#' + $id, { 228 duration: 500, 229 showItem: data_opt.showitem, 230 elementClass: 'htwoolentor-faq-card', 231 questionClass: 'htwoolentor-faq-head', 232 answerClass: 'htwoolentor-faq-body', 233 }); 234 } 235 236 }; 237 238 239 /** 240 * WoolentorOnePageSlider 241 */ 242 var WoolentorOnePageSlider = function ( $scope, $ ){ 243 244 var slider_elem = $scope.find('.ht-full-slider-area').eq(0); 245 246 if ( slider_elem.length > 0 ) { 247 248 /* Jarallax active */ 249 $('.ht-parallax-active').jarallax({ 250 speed: 0.4, 251 }); 252 253 $('#ht-nav').onePageNav({ 254 currentClass: 'current', 255 changeHash: false, 256 scrollSpeed: 750, 257 scrollThreshold: 0.5, 258 filter: '', 259 easing: 'swing', 260 }); 261 262 /*------ Wow Active ----*/ 263 new WOW().init(); 264 265 /*--------------------- 266 Video popup 267 --------------------- */ 268 $('.ht-video-popup').magnificPopup({ 269 type: 'iframe', 270 mainClass: 'mfp-fade', 271 removalDelay: 160, 272 preloader: false, 273 zoom: { 274 enabled: true, 275 } 276 }); 277 278 } 279 280 }; 281 282 /** 283 * LoadMore Product Ajax Action handeler 284 * @param {String} selectorBtn // LoadMore Button Selector 285 * @param {String} loadMoreWrapper // LoadMore Enable Track Class 286 */ 287 var WooLentorLoadMore = function( selectorBtn, loadMoreWrapper ){ 288 289 selectorBtn.on('click', function(e) { 290 e.preventDefault(); 291 292 const $button = selectorBtn; 293 const $loader = $button.siblings('.woolentor-ajax-loader'); 294 const $grid = $('#' + $button.data('grid-id')); 295 const currentPage = parseInt($button.data('page')); 296 const maxPages = parseInt($button.data('max-pages')); 297 const dataLayout = $grid.attr('data-show-layout'); 298 299 if (currentPage > maxPages) { 300 return; 301 } 302 303 $button.hide(); 304 $loader.show(); 305 306 let settings = loadMoreWrapper.attr( 'data-wl-widget-settings' ); 307 308 // Prepare AJAX data 309 const ajaxData = { 310 action: 'woolentor_load_more_products', 311 nonce: typeof woolentor_addons !== 'undefined' ? woolentor_addons.ajax_nonce : '', 312 page: currentPage, 313 settings: settings, 314 viewlayout: typeof dataLayout === 'undefined' ? '' : dataLayout 315 }; 316 317 // AJAX request to load more products 318 $.ajax({ 319 url: typeof woolentor_addons !== 'undefined' ? woolentor_addons.woolentorajaxurl : '', 320 type: 'POST', 321 data: ajaxData, 322 success: function(response) { 323 if (response.success && response.data.html) { 324 325 // Append new products 326 const $newProducts = $(response.data.html); 327 $grid.append($newProducts); 328 329 // Update page counter 330 $button.data('page', currentPage+1); 331 332 // Show button if more pages available 333 if (currentPage < maxPages) { 334 $button.show(); 335 } else { 336 $button.text($button.data('complete-loadtxt')).prop('disabled', true).show(); 337 } 338 } 339 $loader.hide(); 340 }, 341 error: function(xhr, status, error) { 342 $loader.hide(); 343 $button.show(); 344 console.log("Status:", status, "Error:", error); 345 } 346 }); 347 }); 348 349 } 350 351 var WooLentorInfiniteScroll = function(selectorBtn, productLoadWrapper ){ 352 353 let isLoading = false;
354 const $loader = selectorBtn.find('.woolentor-ajax-loader'); 355 const $grid = $('#' + selectorBtn.data('grid-id')); 356 const paginationArea = productLoadWrapper.find('.woolentor-pagination-infinite'); 357 358 function loadMoreOnScroll() { 359 if (isLoading) return; 360 361 // Calculate trigger point based on product grid bottom position 362 const gridOffset = $grid.offset().top; 363 const gridHeight = $grid.outerHeight(); 364 const gridBottom = gridOffset + gridHeight; 365 const scrollTop = $(window).scrollTop(); 366 const windowHeight = $(window).height(); 367 const triggerPoint = gridBottom - windowHeight - 100; // 100px before grid end 368 369 if (scrollTop >= triggerPoint) { 370 const currentPage = parseInt(selectorBtn.data('page')); 371 const maxPages = parseInt(selectorBtn.data('max-pages')); 372 373 if (currentPage > maxPages) { 374 $(window).off('scroll', loadMoreOnScroll); 375 return; 376 } 377 378 paginationArea.css('margin-top', '30px'); 379 isLoading = true; 380 $loader.show(); 381 382 let settings = productLoadWrapper.attr( 'data-wl-widget-settings' ); 383 const dataLayout = $grid.attr('data-show-layout'); 384 385 // AJAX request to load more products 386 $.ajax({ 387 url: typeof woolentor_addons !== 'undefined' ? woolentor_addons.woolentorajaxurl : '', 388 type: 'POST', 389 data: { 390 action: 'woolentor_load_more_products', 391 nonce: typeof woolentor_addons !== 'undefined' ? woolentor_addons.ajax_nonce : '', 392 page: currentPage, 393 settings: settings, 394 viewlayout: typeof dataLayout === 'undefined' ? '' : dataLayout 395 }, 396 success: function(response) { 397 if (response.success && response.data.html) { 398 // Append new products 399 const $newProducts = $(response.data.html); 400 $grid.append($newProducts); 401 402 // Update page counter 403 selectorBtn.data('page', currentPage + 1); 404 405 // Check if we've reached the last page 406 if (currentPage > maxPages) { 407 $(window).off('scroll', loadMoreOnScroll); 408 selectorBtn.remove(); 409 } 410 } 411 }, 412 complete: function() { 413 $loader.hide(); 414 isLoading = false; 415 paginationArea.css('margin-top', '0'); 416 }, 417 error: function() { 418 $loader.hide(); 419 isLoading = false; 420 } 421 }); 422 } 423 } 424 425 // Bind scroll event 426 $(window).on('scroll', loadMoreOnScroll); 427 428 } 429 430 /** 431 * Quantaty Manager 432 */ 433 var WooLentorQtnManager = function(){ 434 $(document).on('click', '.woolentor-qty-minus', function(e) { 435 e.preventDefault(); 436 const $input = $(this).siblings('.woolentor-qty-input'); 437 const $qtnSelector = $(this).parent('.woolentor-quantity-selector').siblings('.add_to_cart_button'); 438 const currentVal = parseInt($input.val()) || 1; 439 const minVal = parseInt($input.attr('min')) || 1; 440 441 if (currentVal > minVal) { 442 $input.val(currentVal - 1); 443 $qtnSelector.attr('data-quantity', currentVal - 1); 444 $input.trigger('change'); 445 } 446 }); 447 448 $(document).on('click', '.woolentor-qty-plus', function(e) { 449 e.preventDefault(); 450 const $input = $(this).siblings('.woolentor-qty-input'); 451 const $qtnSelector = $(this).parent('.woolentor-quantity-selector').siblings('.add_to_cart_button'); 452 const currentVal = parseInt($input.val()) || 1; 453 const maxVal = parseInt($input.attr('max')) || 999; 454 455 if (currentVal < maxVal) { 456 $input.val(currentVal + 1); 457 $qtnSelector.attr('data-quantity', currentVal + 1); 458 $input.trigger('change'); 459 } 460 }); 461 } 462 463 /** 464 * Grid and View Mode Manager 465 */ 466 var WooLentorViewModeManager = function($selector, $style = 'modern'){ 467 $(document).on('click', '.woolentor-layout-btn', function(e){ 468 e.preventDefault(); 469 470 const $this = $(this); 471 const layout = $this.data('layout'); 472 const $gridContainer = $this.closest('.woolentor-product-grid, .woolentor-filters-enabled').find($selector); 473 474 // Update active button state 475 $this.siblings().removeClass('woolentor-active'); 476 $this.addClass('woolentor-active'); 477 478 // Update grid container layout classes 479 if ($gridContainer.length > 0) { 480 // Remove existing layout classes from container 481 $gridContainer.removeClass('woolentor-layout-grid woolentor-layout-list'); 482 483 // Add new layout class to container 484 $gridContainer.addClass('woolentor-layout-' + layout); 485 $gridContainer.attr('data-show-layout', layout); 486 487 // Update product card classes 488 const $productCards = $gridContainer.find('.woolentor-product-card'); 489 $productCards.removeClass('woolentor-grid-card woolentor-list-card'); 490 491 if (layout === 'grid') { 492 if($style === 'editorial'){ 493 $productCards.removeClass('woolentor-editorial-list-card'); 494 $productCards.addClass('woolentor-editorial-grid-card'); 495 }else if($style === 'magazine'){ 496 $productCards.removeClass('woolentor-magazine-list-card'); 497 $productCards.addClass('woolentor-magazine-grid-card'); 498 }else{ 499 $productCards.addClass('woolentor-grid-card'); 500 } 501 } else if (layout === 'list') { 502 if($style === 'editorial'){ 503 $productCards.removeClass('woolentor-editorial-grid-card'); 504 $productCards.addClass('woolentor-editorial-list-card'); 505 }else if($style === 'magazine'){ 506 $productCards.removeClass('woolentor-magazine-grid-card'); 507 $productCards.addClass('woolentor-magazine-list-card'); 508 }else{ 509 $productCards.addClass('woolentor-list-card'); 510 } 511 } 512 } 513 }); 514 } 515 516 /** 517 * New Product Grid 518 * @param {*} $scope 519 * @param {*} $ 520 */
521 var WoolentorProductGridModern = function ( $scope, $ ){ 522 // Selector 523 let loadMoreWrapper = $scope.find('.woolentor-ajax-enabled').eq(0); 524 let loadMoreButton = $scope.find('.woolentor-load-more-btn').eq(0); 525 let infiniteScroll = $scope.find('.woolentor-infinite-scroll').eq(0); 526 let layoutList = $scope.find('.woolentor-layout-list').eq(0); 527 528 // LoadMore Button 529 if (loadMoreButton.length > 0) { 530 WooLentorLoadMore(loadMoreButton, loadMoreWrapper); 531 } 532 533 // Infinite Scroll 534 if (infiniteScroll.length > 0) { 535 WooLentorInfiniteScroll(infiniteScroll, loadMoreWrapper); 536 } 537 538 // Quantity selector - using event delegation to handle dynamically loaded products 539 if(layoutList.length > 0){ 540 WooLentorQtnManager(); 541 } 542 543 // View Manager 544 WooLentorViewModeManager('.woolentor-product-grid-modern'); 545 546 } 547 548 /** 549 * New Product Grid - Editorial Style 550 * @param {*} $scope 551 * @param {*} $ 552 */ 553 var WoolentorProductGridEditorial = function ($scope, $){ 554 // Selector 555 let loadMoreWrapper = $scope.find('.woolentor-ajax-enabled').eq(0); 556 let loadMoreButton = $scope.find('.woolentor-load-more-btn').eq(0); 557 let infiniteScroll = $scope.find('.woolentor-infinite-scroll').eq(0); 558 559 // LoadMore Button 560 if (loadMoreButton.length > 0) { 561 WooLentorLoadMore(loadMoreButton, loadMoreWrapper); 562 } 563 564 // Infinite Scroll 565 if (infiniteScroll.length > 0) { 566 WooLentorInfiniteScroll(infiniteScroll, loadMoreWrapper); 567 } 568 569 // View Manager 570 WooLentorViewModeManager('.woolentor-product-grid-editorial','editorial'); 571 } 572 573 /** 574 * New Product Grid - Magazine Style 575 * @param {*} $scope 576 * @param {*} $ 577 */ 578 var WoolentorProductGridMagazine = function ($scope, $){ 579 // Selector 580 let loadMoreWrapper = $scope.find('.woolentor-ajax-enabled').eq(0); 581 let loadMoreButton = $scope.find('.woolentor-load-more-btn').eq(0); 582 let infiniteScroll = $scope.find('.woolentor-infinite-scroll').eq(0); 583 584 // LoadMore Button 585 if (loadMoreButton.length > 0) { 586 WooLentorLoadMore(loadMoreButton, loadMoreWrapper); 587 } 588 589 // Infinite Scroll 590 if (infiniteScroll.length > 0) { 591 WooLentorInfiniteScroll(infiniteScroll, loadMoreWrapper); 592 } 593 594 // View Manager 595 WooLentorViewModeManager('.woolentor-product-grid-magazine','magazine'); 596 } 597 598 /* 599 * Run this code under Elementor. 600 */ 601 $(window).on('elementor/frontend/init', function () { 602 603 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-product-tab.default', WidgetProductSliderHandler); 604 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-product-tab.default', WidgetProducttabsHandler); 605 606 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-universal-product.default', WidgetProductSliderHandler); 607 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-universal-product.default', WidgetWoolentorTooltipHandler); 608 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-universal-product.default', WidgetThumbnaisImagesHandler); 609 610 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-cross-sell-product-custom.default', WidgetProductSliderHandler); 611 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-cross-sell-product-custom.default', WidgetWoolentorTooltipHandler); 612 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-cross-sell-product-custom.default', WidgetThumbnaisImagesHandler); 613 614 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-upsell-product-custom.default', WidgetProductSliderHandler); 615 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-upsell-product-custom.default', WidgetWoolentorTooltipHandler); 616 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-upsell-product-custom.default', WidgetThumbnaisImagesHandler); 617 618 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-related-product-custom.default', WidgetProductSliderHandler); 619 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-related-product-custom.default', WidgetWoolentorTooltipHandler); 620 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-related-product-custom.default', WidgetThumbnaisImagesHandler); 621 622 elementorFrontend.hooks.addAction( 'frontend/element_ready/wl-product-video-gallery.default', WidgetProductVideoGallery ); 623 624 elementorFrontend.hooks.addAction( 'frontend/element_ready/wl-brand-logo.default', WidgetProductSliderHandler ); 625 elementorFrontend.hooks.addAction( 'frontend/element_ready/wl-faq.default', WoolentorAccordion ); 626 627 elementorFrontend.hooks.addAction( 'frontend/element_ready/wl-category-grid.default', WidgetProductSliderHandler ); 628 elementorFrontend.hooks.addAction( 'frontend/element_ready/wl-testimonial.default', WidgetProductSliderHandler ); 629 elementorFrontend.hooks.addAction( 'frontend/element_ready/wl-product-grid.default', WidgetProductSliderHandler ); 630 elementorFrontend.hooks.addAction( 'frontend/element_ready/wl-recently-viewed-products.default', WidgetProductSliderHandler ); 631 elementorFrontend.hooks.addAction( 'frontend/element_ready/wl-onepage-slider.default', WoolentorOnePageSlider ); 632 633 elementorFrontend.hooks.addAction( 'frontend/element_ready/wl-customer-veview.default', WidgetProductSliderHandler ); 634 635 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-product-grid-modern.default', WoolentorProductGridModern ); 636 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-product-grid-luxury.default', WoolentorProductGridModern ); 637 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-product-grid-editorial.default', WoolentorProductGridEditorial ); 638 elementorFrontend.hooks.addAction( 'frontend/element_ready/woolentor-product-grid-magazine.default', WoolentorProductGridMagazine ); 639 640 }); 641 642 643})(jQuery);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.