PageSourceSearch

https://roadkill.ch/assets/js/main.js

js roadkill.ch collected 2026-10-10 02:29:16 UTC 6,628 bytes, 278 lines download raw bytes

1/**
2* Template Name: Restaurantly - v3.1.0
3* Template URL: https://bootstrapmade.com/restaurantly-restaurant-template/
4* Author: BootstrapMade.com
5* License: https://bootstrapmade.com/license/
6*/
7(function() {
8  "use strict";
9
10  /**
11   * Easy selector helper function
12   */
13  const select = (el, all = false) => {
14    el = el.trim()
15    if (all) {
16      return [...document.querySelectorAll(el)]
17    } else {
18      return document.querySelector(el)
19    }
20  }
21
22  /**
23   * Easy event listener function
24   */
25  const on = (type, el, listener, all = false) => {
26    let selectEl = select(el, all)
27    if (selectEl) {
28      if (all) {
29        selectEl.forEach(e => e.addEventListener(type, listener))
30      } else {
31        selectEl.addEventListener(type, listener)
32      }
33    }
34  }
35
36  /**
37   * Easy on scroll event listener 
38   */
39  const onscroll = (el, listener) => {
40    el.addEventListener('scroll', listener)
41  }
42
43  /**
44   * Navbar links active state on scroll
45   */
46  let navbarlinks = select('#navbar .scrollto', true)
47  const navbarlinksActive = () => {
48    let position = window.scrollY + 200
49    navbarlinks.forEach(navbarlink => {
50      if (!navbarlink.hash) return
51      let section = select(navbarlink.hash)
52      if (!section) return
53      if (position >= section.offsetTop && position <= (section.offsetTop + section.offsetHeight)) {
54        navbarlink.classList.add('active')
55      } else {
56        navbarlink.classList.remove('active')
57      }
58    })
59  }
60  window.addEventListener('load', navbarlinksActive)
61  onscroll(document, navbarlinksActive)
62
63  /**
64   * Scrolls to an element with header offset
65   */
66  const scrollto = (el) => {
67    let header = select('#header')
68    let offset = header.offsetHeight
69
70    let elementPos = select(el).offsetTop
71    window.scrollTo({
72      top: elementPos - offset,
73      behavior: 'smooth'
74    })
75  }
76
77  /**
78   * Toggle .header-scrolled class to #header when page is scrolled
79   */
80  let selectHeader = select('#header')
81  let selectTopbar = select('#topbar')
82  if (selectHeader) {
83    const headerScrolled = () => {
84      if (window.scrollY > 100) {
85        selectHeader.classList.add('header-scrolled')
86        if (selectTopbar) {
87          selectTopbar.classList.add('topbar-scrolled')
88        }
89      } else {
90        selectHeader.classList.remove('header-scrolled')
91        if (selectTopbar) {
92          selectTopbar.classList.remove('topbar-scrolled')
93        }
94      }
95    }
96    window.addEventListener('load', headerScrolled)
97    onscroll(document, headerScrolled)
98  }
99
100  /**
101   * Back to top button
102   */
103  let backtotop = select('.back-to-top')
104  if (backtotop) {
105    const toggleBacktotop = () => {
106      if (window.scrollY > 100) {
107        backtotop.classList.add('active')
108      } else {
109        backtotop.classList.remove('active')
110      }
111    }
112    window.addEventListener('load', toggleBacktotop)
113    onscroll(document, toggleBacktotop)
114  }
115
116  /**
117   * Mobile nav toggle
118   */
119  on('click', '.mobile-nav-toggle', function(e) {
120    select('#navbar').classList.toggle('navbar-mobile')
121    this.classList.toggle('bi-list')
122    this.classList.toggle('bi-x')
123  })
124
125  /**
126   * Mobile nav dropdowns activate
127   */
128  on('click', '.navbar .dropdown > a', function(e) {
129    if (select('#navbar').classList.contains('navbar-mobile')) {
130      e.preventDefault()
131      this.nextElementSibling.classList.toggle('dropdown-active')
132    }
133  }, true)
134
135  /**
136   * Scrool with ofset on links with a class name .scrollto
137   */
138  on('click', '.scrollto', function(e) {
139    if (select(this.hash)) {
140      e.preventDefault()
141
142      let navbar = select('#navbar')
143      if (navbar.classList.contains('navbar-mobile')) {
144        navbar.classList.remove('navbar-mobile')
145        let navbarToggle = select('.mobile-nav-toggle')
146        navbarToggle.classList.toggle('bi-list')
147        navbarToggle.classList.toggle('bi-x')
148      }
149      scrollto(this.hash)
150    }
151  }, true)
152
153  /**
154   * Scroll with ofset on page load with hash links in the url
155   */
156  window.addEventListener('load', () => {
157    if (window.location.hash) {
158      if (select(window.location.hash)) {
159        scrollto(window.location.hash)
160      }
161    }
162  });
163
164  /**
165   * Preloader
166   */
167  let preloader = select('#preloader');
168  if (preloader) {
169    window.addEventListener('load', () => {
170      preloader.remove()
171    });
172  }
173
174  /**
175   * Menu isotope and filter
176   */
177  window.addEventListener('load', () => {
178    let menuContainer = select('.menu-container');
179    if (menuContainer) {
180      let menuIsotope = new Isotope(menuContainer, {
181        itemSelector: '.menu-item',
182        layoutMode: 'fitRows'
183      });
184
185      let menuFilters = select('#menu-flters li', true);
186
187      on('click', '#menu-flters li', function(e) {
188        e.preventDefault();
189        menuFilters.forEach(function(el) {
190          el.classList.remove('filter-active');
191        });
192        this.classList.add('filter-active');
193
194        menuIsotope.arrange({
195          filter: this.getAttribute('data-filter')
196        });
197        menuIsotope.on('arrangeComplete', function() {
198          AOS.refresh()
199        });
200      }, true);
201    }
202
203  });
204
205  /**
206   * Initiate glightbox 
207   */
208  const glightbox = GLightbox({
209    selector: '.glightbox'
210  });
211
212  /**
213   * Events slider
214   */
215  new Swiper('.events-slider', {
216    speed: 600,
217    loop: true,
218    autoplay: {
219      delay: 5000,
220      disableOnInteraction: false
221    },
222    slidesPerView: 'auto',
223    pagination: {
224      el: '.swiper-pagination',
225      type: 'bullets',
226      clickable: true
227    }
228  });
229
230  /**
231   * Testimonials slider
232   */
233  new Swiper('.testimonials-slider', {
234    speed: 600,
235    loop: true,
236    autoplay: {
237      delay: 5000,
238      disableOnInteraction: false
239    },
240    slidesPerView: 'auto',
241    pagination: {
242      el: '.swiper-pagination',
243      type: 'bullets',
244      clickable: true
245    },
246    breakpoints: {
247      320: {
248        slidesPerView: 1,
249        spaceBetween: 20
250      },
251
252      1200: {
253        slidesPerView: 3,
254        spaceBetween: 20
255      }
256    }
257  });
258
259  /**
260   * Initiate gallery lightbox 
261   */
262  const galleryLightbox = GLightbox({
263    selector: '.gallery-lightbox'
264  });
265
266  /**
267   * Animation on scroll
268   */
269  window.addEventListener('load', () => {
270    AOS.init({
271      duration: 1000,
272      easing: 'ease-in-out',
273      once: true,
274      mirror: false
275    })
276  });
277
278})()

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.