PageSourceSearch

https://www.fisioterapiaitalia.com/wp-content/themes/dragonfly-theme/assets/js/theme.min.js?t=1.86

js fisioterapiaitalia.com collected 2026-10-02 17:42:42 UTC 8,211 bytes, 282 lines download raw bytes

1import * as Vue from 'https://unpkg.com/vue@3/dist/vue.esm-browser.js'
2import * as Utils from "./utils.js";
3import * as Components from './components/vue-components.js';
4
5const { createApp, ref, computed, watch, reactive, onMounted, useTemplateRef, watchEffect } = Vue
6
7/** functions */
8function t( s ){
9	return df_vars.strings[s] || s;
10}
11
12/* const loadVueApp = ( selector = '', config = {} ) => {
13
14    const els = document.querySelectorAll(selector);
15    if( ! els.length ){ return; }
16
17    els.forEach( appContainer => {
18        appContainer.style.visibility = 'invisible';
19    
20        var app = createApp({
21            setup(){
22                onMounted( async () => {
23                    appContainer.style.visibility = 'visible';
24                })
25                
26                return {
27                    u: Utils,
28                }
29            }
30        });
31    
32        app.directive( 'click-outside', Components.click_outside );
33        app.component('spinner', Components.spinner );
34    
35        app.mount( appContainer )
36        
37    })
38} */
39
40/* mobile menu */
41
42jQuery(document).on( 'click', '#toggle-sidebar', function(){
43	jQuery('#sidemenu-mobile').toggleClass('active')
44	jQuery('body').toggleClass('overflow-hidden')
45} )
46
47jQuery(document).on( 'click', '#sidemenu-mobile .overlay', function(){
48	jQuery('#sidemenu-mobile').removeClass('active')
49	jQuery('body').removeClass('overflow-hidden')
50} )
51
52jQuery(document).on( 'click', '#sidemenu-mobile .nav-arrow-down', function(e){
53	e.preventDefault();
54	var item = jQuery(this).closest('.menu-item');
55	item.toggleClass('active');
56} )
57
58jQuery(document).ready(function(){
59    function toggle_submenu(){
60        jQuery(this).closest('li').toggleClass('active-accordion');
61        jQuery(this).siblings('.sub-menu, .submenu, .dropdown-menu').slideToggle(300);
62    }
63
64    const els = document.querySelectorAll('.accordion .menu-item-has-children > a');
65
66    els.forEach( el => {
67        const icon = document.createElement('i');
68        icon.classList.add("arrow")
69        icon.addEventListener('click', toggle_submenu)
70        el.after(icon)
71    })
72})
73
74/** Shortcodes */
75
76// vue apps
77const loadPosts = ( appIdPrefix = 'df-posts-' ) => {
78
79    const els = document.querySelectorAll('.df-posts');
80    els.forEach( el => {
81
82        const id = Utils.makeid(appIdPrefix);
83        el.setAttribute('id', id);
84
85        var app = createApp({
86            setup(){
87                const loop = useTemplateRef('loop');
88                const swiper = ref();
89
90                onMounted( () => {
91                    el.style.visibility = 'visible'
92                    watchEffect( () => {
93                        loop.value.swiper = swiper.value
94                    })
95                })
96
97                return {
98                    loop,
99					swiper
100                }
101            }
102        });
103
104		app.component('swiper-slider', Components.swiper_slider )
105		app.component('posts-loop', Components.posts_loop_app )
106		app.component('spinner', Components.spinner )
107        app.mount(`#${id}`);
108    })
109
110}
111
112const loadCarousels = ( appIdPrefix = 'df-carousel-' ) => {
113    const els = document.querySelectorAll('.df-carousel');
114    els.forEach( el => {
115
116        const id = Utils.makeid(appIdPrefix);
117        el.setAttribute('id', id);
118
119        var app = createApp({
120            setup(){
121                onMounted( () => {
122                    el.style.visibility = 'visible'
123                })
124            }
125        });
126
127		app.component('swiper-slider', Components.swiper_slider )
128        app.mount(`#${id}`);
129    })
130}
131
132const loadModals = ( selector = '.df-modal', config = {} ) => {
133
134    const els = document.querySelectorAll(selector);
135    if( ! els.length ){ return; }
136
137    els.forEach( appContainer => {
138        appContainer.style.visibility = 'invisible';
139    
140        var app = createApp({
141            setup(){
142                onMounted( async () => {
143                    appContainer.style.visibility = 'visible';
144                })
145                
146                return {
147                    u: Utils,
148                }
149            }
150        });
151    
152        app.directive( 'click-outside', Components.click_outside );
153        app.component('spinner', Components.spinner );
154        app.component('modal', Components.modal );
155    
156        app.mount( appContainer )
157        
158    })
159}
160
161const loadForms = (selector = '.df-form', config = {}) => {
162    const els = document.querySelectorAll(selector)
163    if (!els.length) return
164    
165    els.forEach(appContainer => {
166        appContainer.style.visibility = 'hidden'
167        
168        const app = createApp(Components.df_form)
169        
170        app.directive('click-outside', Components.click_outside)
171        app.component('spinner', Components.spinner)
172        app.component('modal', Components.modal)
173        
174        app.mount(appContainer)
175        
176        appContainer.style.visibility = 'visible'
177    })
178}  
179
180// static
181const loadCounters = ( selector = '.df-counter' ) => {
182    const els = document.querySelectorAll(selector);
183    els.forEach( element => {
184
185        const number = element.querySelector('.counter .number');
186        
187        let count = 0;
188        const maxCount = parseInt(number.textContent);
189        
190        if( ! maxCount ){ return; }
191        
192        const totalDuration = element.getAttribute('data-seconds') * 1000;
193        const steps = maxCount - count;
194        const interval = (totalDuration < 1000 ? 1000 : totalDuration) / steps;
195
196        const timer = setInterval(() => {
197            number.textContent = count;
198            count++;
199
200            if (count > maxCount) {
201                clearInterval(timer);
202            }
203        }, interval);
204        
205    });
206}
207
208function renderShortcodes(){
209    loadCounters();
210}
211
212function setDropdownVisibility() {
213    const dropdowns = document.querySelectorAll('.dropdown');
214
215    dropdowns.forEach(dropdown => {
216        const menu = dropdown.querySelector(':scope > .dropdown-menu'); // solo menu diretto
217        if (!menu) return;
218
219        // Se è un sottomenu (dropdown-submenu)
220        const isSubmenu = dropdown.classList.contains('dropdown-submenu');
221
222        // Imposta la posizione base
223        if (isSubmenu) {
224            menu.style.top = '0';
225            menu.style.left = '100%';
226            menu.style.right = 'auto';
227        } else {
228            menu.style.left = '0';
229            menu.style.right = 'auto';
230        }
231
232        function calculatePosition() {
233            const rect = menu.getBoundingClientRect();
234
235            // Se il menu esce a destra, inverti il lato
236            if (rect.right > window.innerWidth) {
237                if (isSubmenu) {
238                    menu.style.left = 'auto';
239                    menu.style.right = '100%';
240                } else {
241                    menu.style.left = 'auto';
242                    menu.style.right = '0';
243                }
244            }
245
246            // Se il menu esce a sinistra, riporta a sinistra
247            if (rect.left < 0) {
248                menu.style.left = '0';
249                menu.style.right = 'auto';
250            }
251        }
252
253        dropdown.removeEventListener('mouseenter', calculatePosition);
254        dropdown.addEventListener('mouseenter', calculatePosition);
255    });
256}
257
258
259jQuery(document).ready(function($){
260    // vue apps
261	loadPosts();
262    loadCarousels();
263    loadModals();
264    loadForms();
265    // static
266    renderShortcodes();
267    setDropdownVisibility();
268    window.addEventListener( 'resize', setDropdownVisibility );
269
270    // copy code button
271    document.querySelectorAll(".copy-btn").forEach(btn => {
272        btn.addEventListener("click", () => {
273            const code = btn.nextElementSibling.innerText;
274            const span = btn.querySelector("span");
275
276            navigator.clipboard.writeText(code).then(() => {
277                span.innerText = "Copiato!";
278                setTimeout(() => span.innerText = "Copia", 2000);
279            });
280        });
281    });
282})

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.