PageSourceSearch

https://hyperzon.io/files/scripts.js?v=1790597439

js hyperzon.io collected 2026-09-28 12:11:00 UTC 25,440 bytes, 819 lines download raw bytes

1// lazy loading
2var lazyLoadInstance = new LazyLoad({
3  // Your custom settings go here
4});
5
6
7if ($('.lazyscroll').length > 0) {
8  var myLazyLoad = new LazyLoad({
9    container: document.querySelector(".lazyscroll")
10  });
11}   
12
13
14$(document).ready(function () {
15
16    //mobile menu toggle
17        function toggleMobileMenu() {
18            $(".menudrop").slideToggle();
19            $('.menubar__trigger__link').toggleClass('menubar__trigger__link--active');
20            $(".menudrop").toggleClass('menudrop--active');
21
22            $(".menu").toggleClass('menu-open');
23            $("body").toggleClass('noscroll');
24        }
25        $(".menubar__trigger__link").click(function (event) {
26            event.preventDefault();
27            toggleMobileMenu();
28        });
29
30        //dropdown nav desktop
31      $( ".menubar__list__item.with-dropdown .menubar__list__item-link" ).click(function(event) {
32          var dropdownid = $("#" + $(this).data( "dropdown" ));
33          var dropdowntrigger = $(this);
34       
35            $(".menubar__list__item.with-dropdown .menubar__list__item-link").not($(this)).removeClass('active');
36            $(this).toggleClass('open');
37
38              event.preventDefault();
39              event.stopPropagation();
40
41              dropdownid.fadeToggle();  
42              $('.menubar__list__item__dropdown').not(dropdownid).hide();
43          
44          $(document).click(function() {
45            dropdowntrigger.removeClass('open');
46              dropdownid.hide();
47              dropdownid.unbind( "click" );
48          });
49
50      });
51//dropdown nav - mobile
52   $('.menudrop__list__item.with-dropdown .menudrop__list__item-link').click(function () {
53      // Toggle the accordion content
54      $(this).toggleClass('active');
55      $(this).next('.menudrop__list__item-drop').slideToggle();
56    });
57
58});
59
60
61
62
63
64  const controls_main_video = `
65      <div class="plyr__controls">
66              <button type="button" class="plyr__control plyr__custombtn" data-plyr="play" title="Play/Pause Video">
67                <i class="icon--pressed icn icn-pause"></i>
68                <i class="icon--not-pressed icn icn-play"></i>
69              </button>
70      </div>
71      <button type="button" class="plyr__control plyr__btn-full" data-plyr="fullscreen" title="Open Video in full screen">
72        <i class="icon--pressed icn icn-full-false"></i>
73        <i class="icon--not-pressed icn icn-full-true"></i>
74      </button>
75      <div class="plyr__progress">
76          <input data-plyr="seek" type="range" min="0" max="100" step="0.01" value="0" aria-label="Seek">
77          <progress class="plyr__progress__buffer" min="0" max="100" value="0">% buffered</progress>
78      </div>
79  `;
80
81
82$(document).ready(function() {
83    if ($('#mainVideoPlayer').length > 0) {
84      const mainVideoPlayer = new Plyr('#mainVideoPlayer', {
85          preload:false,
86          controls: controls_main_video
87      });
88    }
89  });
90
91
92
93
94
95  //glightbox - lightbox modal and gallery
96  const customLightboxHTML = `
97      <div id="glightbox-body" class="glightbox-container lightboxgallery brand-general--video">
98          <div class="gloader visible lightboxgallery__loader"></div>
99          <div class="goverlay lightboxgallery__overlay"></div>
100          <div class="gcontainer lightboxgallery__cont">
101              <div class="lightboxgallery__btn">
102                  <div class="lightboxgallery__btn__cont">
103                      <button class="gmute gbtn lightboxgallery__btn__cont-volume"  tabindex="2"  aria-label="Mute">
104                          <i class="icn-unmute"></i>
105                      </button>
106                      <button class="gprev gbtn lightboxgallery__btn__cont-prev" tabindex="1" aria-label="Previous">
107                          <i class="icn-arrow-left"></i>
108                      </button>
109                      <button class="gnext gbtn lightboxgallery__btn__cont-next" tabindex="0" aria-label="Next">
110                      <i class="icn-arrow-right"></i>
111                      </button>
112                      <button class="gclose gbtn lightboxgallery__btn__cont-close" tabindex="2" aria-label="Close">
113                      <i class="icn-close"></i>
114                      </button>
115                      
116                  </div>
117              </div>
118              <div id="glightbox-slider" class="gslider lightboxgallery__slider"></div>
119          </div>
120      </div>
121  `;
122
123    let customSlideHTML = `
124    <div class="gslide">
125        <div class="gslide-inner-content">
126            <div class="ginner-container">
127                <div class="gslide-media">
128                </div>
129                <div class="gslide-description">
130                    <div class="gdesc-inner">
131                        <div class="gslide-title"></div>
132                        <div class="gslide-desc"></div>
133                    </div>
134                </div>
135            </div>
136        </div>
137    </div>
138`;
139$(document).ready(function() {
140    if ($('.glightbox').length > 0) {
141      const lightbox = GLightbox({
142          lightboxHTML: customLightboxHTML,
143          slideHTML: customSlideHTML,
144          skin: 'custom',
145          closeOnOutsideClick: false,
146          zoomable: true,
147          plyr: {
148              css: '',
149              js: '', 
150              autopause: false,
151              preload:false,
152              autoplay:false,
153              muted: false,
154              config: {
155                  controls: controls_main_video,
156                  muted: false
157              }
158              
159          }    
160      });
161
162      lightbox.on('slide_after_load', (data) => {
163          const { slideIndex, slideNode, slideConfig, player, trigger } = data;
164        //  console.log(data)
165          var posterimage = trigger.getAttribute('data-poster');
166
167      });
168    }
169  });
170
171
172
173
174
175
176
177 //blogs slider
178 
179//  const swiper5 = new Swiper('#blogslider', {
180//     loop: false, 
181//     spaceBetween: 40,
182//     slidesPerView: 1,
183//     breakpoints: {
184//         992: {
185//             slidesPerView: 2
186//         },
187//         1200: {
188//             slidesPerView: 3
189//         },
190//     }
191//   });
192
193
194  
195
196//client video slider
197$(document).ready(function() {
198    if ($('.client-players').length > 0) {
199  
200      const controls3 = `
201        <div class="plyr__controls">
202
203          <button type="button" class="plyr__control plyr__custombtn" data-plyr="play" title="Play/Pause Video">
204            <i class="icon--pressed icn icn-pause"></i>
205            <i class="icon--not-pressed icn icn-play"></i>
206          </button>
207
208
209
210          <button type="button" class="plyr__control plyr__custombtn" data-plyr="mute" title="Mute Video">
211            <i class="icon--pressed icn icn-unmute"></i>
212          </button>
213
214        </div>
215        <button type="button" class="plyr__control plyr__btn-full" data-plyr="fullscreen" title="Open Video in full screen"> 
216          <i class="icon--pressed icn icn-full-false"></i>
217          <i class="icon--not-pressed icn icn-full-true"></i>
218        </button>
219        <div class="plyr__progress">
220          <input data-plyr="seek" type="range" min="0" max="100" step="0.01" value="0" aria-label="Seek">
221          <progress class="plyr__progress__buffer" min="0" max="100" value="0">% buffered</progress>
222        </div>
223      `;
224  
225      const players = Plyr.setup('.client-players', {
226        muted: true,
227        preload: false,
228        captions: { active: true },
229        controls: controls3
230      });
231  
232      players.forEach(player => {
233        // const poster = $(player.elements.container).find('.plyr__poster');
234        // const mediaElement = player.media; 
235  
236        // player.on('play', () => {
237        //   poster.css('opacity', 0);
238        // });
239  
240        // player.on('pause', () => {
241        //   poster.css('opacity', 1);
242        // });
243        // player.on('ready', () => {
244  
245        // });
246      });
247  
248
249      let userInteracted = false;
250
251      // Set flag when user clicks or touches the page
252      window.addEventListener('click', () => userInteracted = true, { once: true });
253      window.addEventListener('touchstart', () => userInteracted = true, { once: true });
254
255      // Initialize Swiper
256      const swiper6 = new Swiper('#clientv-slider', {
257        spaceBetween: 20,
258        slidesPerView: 1,
259       // mousewheel: true,
260        centeredSlides: true,
261        loop: true,
262        initialSlide: 3,
263        observer: true,
264        direction: 'horizontal',
265        observeParents: true,
266        parallax:true,
267        
268        navigation: {
269          nextEl: '.clientv__controls--next',
270          prevEl: '.clientv__controls--prev',
271        },
272        breakpoints: {
273          992: {
274            slidesPerView: 3,
275            spaceBetween: 40,
276          },
277        },
278        on: {
279          init: function() {
280
281            const activePlyrInstance = players[this.realIndex];
282            activePlyrInstance.muted = true; 
283
284
285            ScrollTrigger.create({
286              once: true,
287              trigger: '#clientv-slider',
288              start: 'top 50%', // Adjust trigger position as needed
289              end: 'bottom 40%',
290             immediateRender:false,
291              onEnter: () => {
292               //   activePlyrInstance.play();
293              },
294              onLeave: () => {
295                  activePlyrInstance.pause();
296              },
297
298              onLeaveBack: () => {
299                if (activePlyrInstance.isHTML5) {
300                  activePlyrInstance.pause();
301                }
302              },
303
304            });
305          },
306          // Swiper callback
307          slideChange: function () {
308            const activeSlideIndex = this.realIndex;
309            const activePlyrInstance = players[activeSlideIndex];
310          
311            players.forEach((instance, index) => {
312              if (index !== activeSlideIndex) {
313                if (instance.isHTML5) {
314                  instance.pause();
315                }
316                const muteButton = $(instance.elements.container).find('[data-plyr="mute"]');
317                if (muteButton.length > 0) {
318                  muteButton.hide();
319                }
320              }
321            });
322          
323            activePlyrInstance.muted = false;
324          
325            if (activePlyrInstance.isHTML5 && userInteracted) {
326              activePlyrInstance.play().catch(err => console.warn('Play blocked:', err));
327            }
328          }
329        },
330      });
331  
332      // Play video on slide click
333      $('.clientv__item').on('click', function() {
334        const index = $(this).index();
335        swiper6.slideTo(index);
336      });
337
338      // Hide mute button on click
339      $('[data-plyr="mute"]').on('click', function() {
340        
341        $(this).fadeOut();
342      });
343
344      
345  
346    }
347  });
348
349
350
351  const swiper8 = new Swiper('#clientext-slider', {
352    loop: true, 
353    autoHeight: true, //enable auto height
354    spaceBetween: 40,
355    slidesPerView: 1,
356    autoplay: {
357      delay: 5000,
358      pauseOnMouseEnter:true
359    },
360      navigation: {
361        nextEl: '.clientext__wrapper__controls--next',
362        prevEl: '.clientext__wrapper__controls--prev',
363      },
364  });
365
366
367//case studies slider
368
369// Initialize Swiper without autoplay
370const swcasest = new Swiper(".swcasest", {
371  loop: true,
372  spaceBetween: 100, 
373
374  autoplay: false,  // Disable autoplay for now, will trigger when the slider is in view
375
376  navigation: {
377    nextEl: "#swcasest-next", 
378    prevEl: "#swcasest-prev"
379  },
380
381              allowTouchMove: false, // Default (for large screens)
382              breakpoints: {
383                1136: { allowTouchMove: false},  // Tablets
384                0: { allowTouchMove: true  }     // Mobile phones
385              },
386
387  on: {
388    // Event that runs when Swiper is initialized
389    init: function() {
390      // Ensure the animation runs when Swiper is initialized (for the first slide)
391      const activeSlide = this.slides[this.activeIndex];
392      const cover = activeSlide.querySelector('.casestudysw__cover');
393      if (cover) {
394        cover.classList.add('slidein');
395      }
396    },
397    
398    // Event that runs when the slide change starts
399    slideChangeTransitionStart: function() {
400      const activeSlide = this.slides[this.activeIndex];
401
402      // Handle .casestudysw__cover animation (from translateX(100%) to translateX(0%))
403      const cover = activeSlide.querySelector('.casestudysw__cover');
404      if (cover) {
405        cover.classList.remove('slidein');
406        void cover.offsetWidth; // Forces reflow
407        cover.classList.add('slidein');
408      }
409    },
410    
411    // Event that runs when the slide change transition ends
412    slideChangeTransitionEnd: function() {
413      const activeSlide = this.slides[this.activeIndex];
414      const arrows = activeSlide.querySelectorAll('.casestudysw__bx__row--num---item----arrow');
415      
416      arrows.forEach((arrow, index) => {
417        setTimeout(() => {
418          arrow.classList.add('pulse');
419        }, index * 500); // Stagger the pulse animation for each arrow
420      });
421    }
422  }
423});
424
425// Set up IntersectionObserver to trigger autoplay when the slider is in view
426const swcasestobserver = new IntersectionObserver((entries, swcasestobserver) => {
427  entries.forEach(entry => {
428    if (entry.isIntersecting) {
429      // Start the Swiper autoplay when it's in view
430      swcasest.autoplay.start();
431    } else {
432      // Stop autoplay when it's out of view (optional)
433      swcasest.autoplay.stop();
434    }
435  });
436}, {
437  threshold: 0.5 // Trigger when 50% of the slider is in view
438});
439
440
441if ($('.swcasest').length > 0) {
442  // Observe the Swiper container
443  const swiperContainer = document.querySelector('.swcasest');
444  swcasestobserver.observe(swiperContainer);
445};    
446
447
448//services grid load on mobile only
449$(document).ready(function () {
450    const breakpoint = window.matchMedia('(min-width:993px)');
451  
452    let mySwiper;
453  
454    const breakpointChecker = function () {
455      if (breakpoint.matches === true) {
456        if (mySwiper !== undefined) mySwiper.destroy(true, true)
457        return;
458      } else if (breakpoint.matches === false) {
459        return enableSwiper();
460      }
461    };
462    const enableSwiper = function () {
463        mySwiper = new Swiper('#servicesgrid-slider', {
464            loop: true,
465            slidesPerView: 'auto',
466            keyboardControl: true,
467            grabCursor: true,
468            pagination: '.swiper-pagination',
469            paginationClickable: true
470        });
471    };
472    breakpoint.addListener(breakpointChecker);
473    breakpointChecker();
474});
475
476
477
478
479
480
481//video gallery play on hover
482$(document).ready(function () {
483  $(".gallerygrid__item.type-video").hover(function () {
484    var videoElement = $(this).children("video");
485
486      if (videoElement.length > 0) {
487          var el = videoElement[0];
488          if (el.paused) {
489              el.play();
490          }
491      }
492    }, function () {
493        var videoElement2 = $(this).children("video");
494
495        if (videoElement2.length > 0) {
496            var el2 = videoElement2[0];
497            el2.pause();
498        }
499    });
500});
501
502
503//----------------faq section
504
505//accordion setup
506function setupFAQAccordion(itemContentClass, itemClass, activeClass) {
507  $(itemContentClass).each(function() {
508    if ($(this).parent().parent('li').hasClass(activeClass)) {
509      $(this).show();
510    }
511  });
512
513  $(itemClass).on('click', function() {
514    var content = $(this).find(itemContentClass);
515
516    $(itemContentClass).not(content).slideUp();
517    $(itemContentClass).not(content).parent().parent('li').removeClass(activeClass);
518
519    content.slideToggle();
520    content.parent().parent('li').toggleClass(activeClass);
521  });
522
523}
524//light up on mouse over effect
525function setupProximityManager(contProximityClass, itemProximityClass, ProxColor, ProxRad) {
526  const proximityContainer = document.querySelector(contProximityClass);
527  proximityContainer.addEventListener("mousemove", function(e) {
528    let proxims = document.querySelectorAll(itemProximityClass);
529    proxims.forEach(function(proxim) {
530      effect(proxim, e);
531    });
532  });
533
534  function effect(proxim, e) {
535    let rect = proxim.getBoundingClientRect();
536    let x = e.x - rect.left; // offset from corner
537    let y = e.y - rect.top;
538    proxim.style.background = `radial-gradient( circle at ${x}px ${y}px, ${ProxColor} 0%, transparent ${ProxRad}%)`;
539  }
540}
541
542$(document).ready(function() {
543    if ($('.faq').length) {
544      setupFAQAccordion('.faqacc__item__content', '.faqacc__item', 'active');
545     // setupProximityManager('.faqacc','.faqacc__item__inner','rgba( 255, 255, 255, 0.2 )','50');
546    }
547});
548
549
550
551
552//expandcard
553$(document).ready(function () {
554  var flexaccItems = $(".expandcard_acc__item");
555
556  // Click event handler for 'flexacc__item'
557  flexaccItems.on("click", function () {
558    var dataAttribute = $(this).data("text-id");
559
560    // Hide all elements with the class 'flexacctxt--text'
561    $(".expandcard_text-item").hide().removeClass("active");
562
563    // Remove the 'active' class from all 'flexacc__item' elements
564    flexaccItems.removeClass("active");
565
566    // Add the 'active' class to the clicked 'flexacc__item'
567    $(this).addClass("active");
568
569    $(".expandcard_text-item[data-text-id='" + dataAttribute + "']").show();
570  });
571
572  flexaccItems.first().click(); // Trigger click on the first item to show initial content
573});
574
575
576
577//modal
578$('.modal-open').on('click', function(event) {
579  event.preventDefault();
580  var modal_id = $(this).data('modal');
581  var modal = document.getElementById(modal_id);
582  modal.showModal();
583}); 
584
585$('.modal-close').on('click', function(event) {
586  event.preventDefault();
587  var modal_id = $(this).data('modal');
588  var modal = document.getElementById(modal_id);
589  modal.close(); 
590}); 
591
592
593
594
595
596
597//video
598$(document).ready(function() {
599  var $gridItems = $('.gallerygrid__item.item-video-hover');
600  if ($gridItems.length) {
601    $gridItems.hover(
602      function() {
603        var video = $(this).find('video').get(0);
604        if (video.paused) {
605          video.play();
606        }
607      },
608      function() {
609        var video = $(this).find('video').get(0);
610        if (!video.paused) {
611          video.pause();
612         // video.currentTime = 0; // Resets video to beginning
613        }
614      }
615    );
616  }  
617});
618
619
620
621
622
623$(document).ready(function() {
624  var glowingButtons = document.querySelectorAll('.btn-glow');
625
626  var observer = new IntersectionObserver(function(entries) {
627      entries.forEach(function(entry) {
628          if (entry.isIntersecting) {
629              entry.target.classList.add('glow');
630          } else {
631              entry.target.classList.remove('glow');
632          }
633      });
634  }, { threshold: 0 });
635
636  glowingButtons.forEach(function(button) {
637      observer.observe(button);
638  });
639
640  setInterval(function() {
641      glowingButtons.forEach(function(button) {
642          if (button.classList.contains('glow')) {
643              button.classList.remove('glow');
644          } else {
645              button.classList.add('glow');
646          }
647      });
648  }, 5000); // Toggle glow effect every 5 seconds
649});
650
651
652
653
654
655//link reveal buttons for services expand
656$(document).ready(function(){
657  $('.sliderexp__btn-link').click(function() {
658    $('.sliderexp__collapsed').slideToggle();
659    $(this).toggleClass('active');
660  });
661
662
663
664  $('.reveal__btn-link').click(function() {
665    $(this).closest('.reveal__item').find('.reveal__collapsed').slideToggle();
666    $(this).toggleClass('active');
667  });
668
669  $('.linkreveal__btn-link').click(function() {
670    $(this).closest('.linkreveal').find('.linkreveal__collapsed').slideToggle();
671    $(this).toggleClass('active');
672  });
673
674  $('.boxreveal__btn-link').one('click', function() {  // .one() ensures it runs only once
675    $(this).closest('.boxreveal').find('.boxreveal__collapsed').slideToggle();
676    $(this).closest('.boxreveal').addClass('expanded');
677    $(this).closest('.boxreveal__btn').remove(); // Removes the button from the DOM
678  });
679});
680
681
682
683document.addEventListener("DOMContentLoaded", () => {
684  // Query all the service slider containers (assuming each container has a unique class or structure)
685  const sliders = document.querySelectorAll('.servicegallery');
686
687  sliders.forEach((sliderContainer, index) => {
688    const ServicethumbsElement = sliderContainer.querySelector('.swserviceth');
689    const ServicemainElement = sliderContainer.querySelector('.swservice');
690    const navigationContainer = sliderContainer.querySelector('.swarrownav'); // Container for the navigation buttons
691
692    // Determine allowTouchMove value based on a class on the .servicegallery element
693    const allowTouchMove = !sliderContainer.classList.contains('disable-swipe');
694
695    // Initialize the thumbs swiper only if the element exists
696    let ServicethumbsSwiper = null;
697    if (ServicethumbsElement) {
698      ServicethumbsSwiper = new Swiper(ServicethumbsElement, {
699        spaceBetween: 10, // Spacing between thumbnails
700        watchSlidesProgress: true, // Helps with syncing
701        slidesPerView: 5, // Default (for large screens)
702        breakpoints: {
703          1024: { slidesPerView: 5 }, // Large screens (e.g., desktops)
704          768: { slidesPerView: 4 },  // Tablets
705          480: { slidesPerView: 3 },  // Small tablets
706          320: { slidesPerView: 2.5 },     // Mobile phones
707          0: { slidesPerView: 2.5 }     // Mobile phones
708        }
709      });
710    }
711
712    // Initialize the main swiper only if the element exists
713    if (ServicemainElement) {
714      const mainSwiper = new Swiper(ServicemainElement, {
715        loop: true,
716        spaceBetween: 20, // Set space in pixels between slides
717        autoplay: {
718          delay: 9000,
719          disableOnInteraction: true,
720          pauseOnMouseEnter: true
721        },
722        allowTouchMove: allowTouchMove, // Control swipe interactions based on the class
723        navigation: {
724          nextEl: navigationContainer?.querySelector('.swarrownav-next'), // Use the shared class inside the container
725          prevEl: navigationContainer?.querySelector('.swarrownav-prev')  // Use the shared class inside the container
726        },
727        thumbs: ServicethumbsSwiper ? { swiper: ServicethumbsSwiper } : undefined // Only include thumbs if they exist
728      });
729    }
730
731    // Select all slides with a scroll message
732    const slides = sliderContainer.querySelectorAll('.swiper-slide');
733
734    slides.forEach((slide) => {
735      const scrollMessage = slide.querySelector('.swservice__item__image-message');
736      const scrollElement = slide.querySelector('.swservice__item__image'); // The element that scrolls
737
738      if (scrollMessage && scrollElement) {
739        // Function to check if there is a scrollbar and toggle the scroll message visibility
740        const toggleScrollMessage = () => {
741          const hasScrollbar = scrollElement.scrollHeight > scrollElement.clientHeight; // Check if scrollbar exists
742
743          if (hasScrollbar) {
744            // If there's a scrollbar, we show the message
745            scrollElement.classList.add('scroll-fade');
746            scrollElement.addEventListener('scroll', () => {
747              // Add a class to hide the message when the user scrolls
748              scrollMessage.classList.add('hidden');
749              
750              scrollElement.classList.remove('scroll-fade');
751            });
752          } else {
753     
754          
755              scrollMessage.classList.add('hidden');
756  
757
758            
759          }
760        };
761
762        // Add a scroll event listener to the scrollable element
763        scrollElement.addEventListener('scroll', toggleScrollMessage);
764
765        // Optionally, call the function on page load to set initial visibility
766        toggleScrollMessage();
767      }
768    });
769  });
770});
771
772
773            // Initialize Swiper without autoplay
774            const swclutch = new Swiper("#clutchrev-slider", {
775              loop: true,
776              spaceBetween: 50, 
777
778              autoplay: false,  // Disable autoplay for now, will trigger when the slider is 
778in view
779              allowTouchMove: false, // Default (for large screens)
780              breakpoints: {
781                1136: { slidesPerView: 3.5,spaceBetween: 30},  // Tablets
782                768: { slidesPerView: 2.5,spaceBetween: 20 },  // Tablets
783                0: { slidesPerView: 1.5,spaceBetween: 20,allowTouchMove: true  }     // Mobile phones
784              },
785              navigation: {
786                nextEl: "#swclutch-next", 
787                prevEl: "#swclutch-prev"
788              }
789            });
790
791
792            // Initialize Swiper without autoplay
793            const swsalesl = new Swiper("#salesl-slider", {
794              loop: true,
795              spaceBetween: 20, 
796
797        centeredSlides: true,
798        initialSlide: 2,
799              autoplay: true,  // Disable autoplay for now, will trigger when the slider is in view
800              allowTouchMove: false, 
801              slidesPerView: 1.2, // Default (for large screens)
802              breakpoints: {
803                1136: { slidesPerView: 1.2,spaceBetween: 20},  // Tablets
804                0: { slidesPerView: 1,spaceBetween: 20,allowTouchMove: true }     // Mobile phones
805              },
806              navigation: {
807                nextEl: "#swsalesl-next", 
808                prevEl: "#swsalesl-prev"
809              }
810            });
811
812
813
814            document.addEventListener("input", function (e) {
815                if (e.target.classList.contains("auto-expand")) {
816                e.target.style.height = "auto"; // Reset height
817                e.target.style.height = e.target.scrollHeight + "px"; // Set to scroll height
818                }
819            });

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.