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.