PageSourceSearch

https://daib.org.tr/wp-content/themes/hello-elementor-child/assets/daib-custom.js?ver=1788939831

js daib.org.tr collected 2026-09-24 10:56:58 UTC 6,116 bytes, 163 lines download raw bytes

1/**
2 * DAİB — özel JS
3 * -----------------------------------------------------------------------------
4 * 1) Mega menü panelini viewport'a hizala (soldan sağa tam kapsama)
5 * 2) Alt logolar için Swiper slider (2sn autoplay + ok butonları)
6 */
7( function () {
8	'use strict';
9
10	/* ---------------------------------------------------------------------
11	 * 1) Mega menü panel offset düzeltmesi
12	 *    Widget'ın viewport konumunu ölç, panele negatif left uygula ki
13	 *    panel viewport'un sol kenarından başlayıp 100vw kaplasın.
14	 * -------------------------------------------------------------------- */
15	function alignMegaPanels() {
16		var menus = document.querySelectorAll( '.elementor-widget-n-menu' );
17		menus.forEach( function ( menu ) {
18			var panels = menu.querySelectorAll( '.e-n-menu-content' );
19			if ( ! panels.length ) return;
20			var rect       = menu.getBoundingClientRect();
21			var leftOffset = -rect.left; // widget'ın soluna göre viewport'un solu
22			var scrollBar  = window.innerWidth - document.documentElement.clientWidth;
23			var vw         = document.documentElement.clientWidth;
24			panels.forEach( function ( panel ) {
25				panel.style.setProperty( 'left',       leftOffset + 'px', 'important' );
26				panel.style.setProperty( 'right',      'auto',            'important' );
27				panel.style.setProperty( 'width',      vw + 'px',         'important' );
28				panel.style.setProperty( 'max-width',  vw + 'px',         'important' );
29				panel.style.setProperty( 'margin',     '0',               'important' );
30			} );
31		} );
32	}
33
34	/**
35	 * Nav-menu ul'lerinin sütun düzenini link sayısına göre ayarla:
36	 *   ≤2 link → tek kolon (İletişim)
37	 *   3+ link → 2 kolon column-major, satır sayısı = ceil(count / 2)
38	 */
39	function tuneNavColumns() {
40		var uls = document.querySelectorAll( '.elementor-widget-n-menu .e-n-menu-content ul.elementor-nav-menu' );
41		uls.forEach( function ( ul ) {
42			var count = ul.querySelectorAll( ':scope > li' ).length;
43			ul.classList.remove( 'daib-single-col' );
44			if ( count <= 2 ) {
45				ul.classList.add( 'daib-single-col' );
46				ul.style.removeProperty( '--daib-nav-rows' );
47			} else {
48				ul.style.setProperty( '--daib-nav-rows', Math.ceil( count / 2 ) );
49			}
50		} );
51	}
52
53	function scheduleAlign() {
54		alignMegaPanels();
55		tuneNavColumns();
56		setTimeout( function () { alignMegaPanels(); tuneNavColumns(); }, 100 );
57		setTimeout( function () { alignMegaPanels(); tuneNavColumns(); }, 300 );
58		setTimeout( function () { alignMegaPanels(); tuneNavColumns(); }, 800 );
59	}
60
61	window.addEventListener( 'resize',        scheduleAlign );
62	window.addEventListener( 'orientationchange', scheduleAlign );
63
64	// Hover / focus / click hepsi tetikleyicidir; delegasyon ile yakala
65	document.addEventListener( 'mouseover', function ( e ) {
66		if ( e.target.closest && e.target.closest( '.elementor-widget-n-menu' ) ) scheduleAlign();
67	}, true );
68	document.addEventListener( 'focusin', function ( e ) {
69		if ( e.target.closest && e.target.closest( '.elementor-widget-n-menu' ) ) scheduleAlign();
70	}, true );
71	document.addEventListener( 'click', function ( e ) {
72		if ( e.target.closest && e.target.closest( '.elementor-widget-n-menu' ) ) scheduleAlign();
73	}, true );
74
75	if ( document.readyState === 'loading' ) {
76		document.addEventListener( 'DOMContentLoaded', scheduleAlign );
77	} else {
78		scheduleAlign();
79	}
80	window.addEventListener( 'load', scheduleAlign );
81
82	var HOST_SELECTOR = '.elementor-element-ae08f23';
83	var AUTOPLAY_MS   = 2000;
84
85	function ready( fn ) {
86		if ( document.readyState !== 'loading' ) fn();
87		else document.addEventListener( 'DOMContentLoaded', fn );
88	}
89
90	function waitForSwiper( cb, tries ) {
91		tries = tries || 0;
92		if ( typeof window.Swiper === 'function' ) return cb();
93		if ( tries > 40 ) return; // ~4s, sonra vazgeç
94		setTimeout( function () { waitForSwiper( cb, tries + 1 ); }, 100 );
95	}
96
97	function buildSlider() {
98		var host = document.querySelector( HOST_SELECTOR );
99		if ( ! host ) return;
100		if ( host.dataset.daibSliderReady === '1' ) return;
101
102		// Elementor container'ın iç track'i
103		var track = host.querySelector( ':scope > .elementor-widget-wrap' ) ||
104		            host.querySelector( ':scope > .e-con-inner' );
105		if ( ! track ) return;
106
107		// Halihazırda direkt çocukları slide olarak kullanalım
108		var slides = Array.prototype.slice.call( track.children );
109		if ( slides.length === 0 ) return;
110
111		// Swiper markup'ına sar
112		var swiperWrap = document.createElement( 'div' );
113		swiperWrap.className = 'swiper daib-logos-swiper';
114		swiperWrap.innerHTML =
115			'<div class="swiper-wrapper"></div>' +
116			'<button class="swiper-button-prev daib-nav" type="button" aria-label="Önceki"></button>' +
117			'<button class="swiper-button-next daib-nav" type="button" aria-label="Sonraki"></button>';
118		var wrapper = swiperWrap.querySelector( '.swiper-wrapper' );
119
120		slides.forEach( function ( child ) {
121			var slide = document.createElement( 'div' );
122			slide.className = 'swiper-slide daib-logo-slide';
123			slide.appendChild( child ); // orijinal Elementor image widget'ı taşı
124			wrapper.appendChild( slide );
125		} );
126
127		// Track'i boşalt, Swiper'ı yerleştir
128		track.innerHTML = '';
129		track.appendChild( swiperWrap );
130
131		try {
132			new window.Swiper( swiperWrap, {
133				loop: true,
134				slidesPerView: 5,
135				spaceBetween: 40,
136				speed: 700,
137				autoplay: {
138					delay: AUTOPLAY_MS,
139					disableOnInteraction: false,
140					pauseOnMouseEnter: true,
141				},
142				navigation: {
143					nextEl: swiperWrap.querySelector( '.swiper-button-next' ),
144					prevEl: swiperWrap.querySelector( '.swiper-button-prev' ),
145				},
146				breakpoints: {
147					0:    { slidesPerView: 2, spaceBetween: 20 },
148					640:  { slidesPerView: 3, spaceBetween: 24 },
149					1024: { slidesPerView: 5, spaceBetween: 40 },
150				},
151			} );
152			host.dataset.daibSliderReady = '1';
153		} catch ( e ) {
154			// Swiper başarısız olursa track'i geri koymaya gerek yok; sessizce bekle
155			// bir sonraki init için (Elementor bazen widget'ları yeniden render eder).
156			host.dataset.daibSliderReady = '';
157		}
158	}
159
160	ready( function () {
161		waitForSwiper( buildSlider );
162	} );
163} )();

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.