PageSourceSearch

https://the-mattress-company.co.za/wp-content/plugins/woolentor-ad…/js/woolentor-widgets-active.js?ver=3.3.2

js the-mattress-company.co.za collected 2026-09-25 10:24:46 UTC 26,438 bytes, 643 lines download raw bytes

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 '&amp;';
12                    case '<': return '&lt;';
13                    case '>': return '&gt;';
14                    case '"': return '&quot;';
15                    case "'": return '&#39;';
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.