Add massive collection of CSS, JavaScript and theme assets that were previously excluded: **CSS Files (681 total):** - HVAC plugin-specific styles (hvac-*.css): 34 files including dashboard, certificates, registration, mobile nav, accessibility fixes, animations, and welcome popup - Theme framework files (Astra, builder systems, layouts): 200+ files - Plugin compatibility styles (WooCommerce, WPForms, Elementor, Contact Form 7): 150+ files - WordPress core and editor styles: 50+ files - Responsive and RTL language support: 200+ files **JavaScript Files (400+ total):** - HVAC plugin functionality (hvac-*.js): 27 files including menu systems, dashboard enhancements, profile sharing, mobile responsive features, accessibility, and animations - Framework and library files: jQuery plugins, GSAP, AOS, Swiper, Chart.js, Lottie, Isotope - Plugin compatibility scripts: WPForms, WooCommerce, Elementor, Contact Form 7, LifterLMS - WordPress core functionality: customizer, admin, block editor compatibility - Third-party integrations: Stripe, SMTP, analytics, search functionality **Assets:** - Certificate background images and logos - Comprehensive theme styling infrastructure - Mobile-responsive design systems - Cross-browser compatibility assets - Performance-optimized minified versions **Updated .gitignore:** - Fixed asset directory whitelisting patterns to properly include CSS/JS/images - Added proper directory structure recognition (!/assets/css/, !/assets/js/, etc.) - Maintains security by excluding sensitive files while including essential assets This commit provides the complete frontend infrastructure needed for: - Full theme functionality and styling - Plugin feature implementations - Mobile responsiveness and accessibility - Cross-browser compatibility - Performance optimization - Developer workflow support
		
			
				
	
	
		
			172 lines
		
	
	
	
		
			6.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
	
		
			6.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| function slideUp( target, duration ) {
 | |
| 	target.style.transitionProperty = 'height, margin, padding';
 | |
| 	target.style.transitionDuration = duration + 'ms';
 | |
| 	target.style.boxSizing = 'border-box';
 | |
| 	target.style.height = target.offsetHeight + 'px';
 | |
| 	target.offsetHeight; // eslint-disable-line no-unused-expressions
 | |
| 	target.style.overflow = 'hidden';
 | |
| 	target.style.height = 0;
 | |
| 	target.style.paddingTop = 0;
 | |
| 	target.style.paddingBottom = 0;
 | |
| 	target.style.marginTop = 0;
 | |
| 	target.style.marginBottom = 0;
 | |
| 	window.setTimeout( function () {
 | |
| 		target.style.display = 'none';
 | |
| 		target.style.removeProperty( 'height' );
 | |
| 		target.style.removeProperty( 'padding-top' );
 | |
| 		target.style.removeProperty( 'padding-bottom' );
 | |
| 		target.style.removeProperty( 'margin-top' );
 | |
| 		target.style.removeProperty( 'margin-bottom' );
 | |
| 		target.style.removeProperty( 'overflow' );
 | |
| 		target.style.removeProperty( 'transition-duration' );
 | |
| 		target.style.removeProperty( 'transition-property' );
 | |
| 	}, duration );
 | |
| }
 | |
| 
 | |
| function slideDown( target, duration ) {
 | |
| 	target.style.removeProperty( 'display' );
 | |
| 	let display = window.getComputedStyle( target ).display;
 | |
| 
 | |
| 	if ( display === 'none' ) display = 'block';
 | |
| 
 | |
| 	target.style.display = display;
 | |
| 	const height = target.offsetHeight;
 | |
| 	target.style.overflow = 'hidden';
 | |
| 	target.style.height = 0;
 | |
| 	target.style.paddingTop = 0;
 | |
| 	target.style.paddingBottom = 0;
 | |
| 	target.style.marginTop = 0;
 | |
| 	target.style.marginBottom = 0;
 | |
| 	target.offsetHeight; // eslint-disable-line no-unused-expressions
 | |
| 	target.style.boxSizing = 'border-box';
 | |
| 	target.style.transitionProperty = 'height, margin, padding';
 | |
| 	target.style.transitionDuration = duration + 'ms';
 | |
| 	target.style.height = height + 'px';
 | |
| 	target.style.removeProperty( 'padding-top' );
 | |
| 	target.style.removeProperty( 'padding-bottom' );
 | |
| 	target.style.removeProperty( 'margin-top' );
 | |
| 	target.style.removeProperty( 'margin-bottom' );
 | |
| 	window.setTimeout( function () {
 | |
| 		target.style.removeProperty( 'height' );
 | |
| 		target.style.removeProperty( 'overflow' );
 | |
| 		target.style.removeProperty( 'transition-duration' );
 | |
| 		target.style.removeProperty( 'transition-property' );
 | |
| 	}, duration );
 | |
| }
 | |
| 
 | |
| function setupFAQ() {
 | |
| 	const pattern = new RegExp( '^[\\w\\-]+$' );
 | |
| 	const hashval = window.location.hash.substring( 1 );
 | |
| 	const expandFirstelements = document.getElementsByClassName( 'uagb-faq-expand-first-true' );
 | |
| 	const inactiveOtherelements = document.getElementsByClassName( 'uagb-faq-inactive-other-false' );
 | |
| 
 | |
| 	if (
 | |
| 		document.getElementById( hashval ) !== undefined &&
 | |
| 		document.getElementById( hashval ) !== null &&
 | |
| 		document.getElementById( hashval ) !== '' &&
 | |
| 		pattern.test( hashval )
 | |
| 	) {
 | |
| 		const elementToOpen = document.getElementById( hashval );
 | |
| 
 | |
| 		if ( elementToOpen !== undefined ) {
 | |
| 			elementToOpen.classList.add( 'uagb-faq-item-active' );
 | |
| 			elementToOpen.setAttribute( 'aria-expanded', true );
 | |
| 			const faqContent = elementToOpen.getElementsByClassName( 'uagb-faq-content' )[ 0 ];
 | |
| 			if ( faqContent ) {
 | |
| 				slideDown( faqContent, 500 );
 | |
| 			}
 | |
| 		}
 | |
| 	} else {
 | |
| 		for ( let item = 0; item < expandFirstelements.length; item++ ) {
 | |
| 			if ( true === expandFirstelements[ item ].classList.contains( 'uagb-faq-layout-accordion' ) ) {
 | |
| 				let faqItem = expandFirstelements[ item ].querySelectorAll(
 | |
| 					'.uagb-faq-child__outer-wrap.uagb-faq-item'
 | |
| 				)[ 0 ];
 | |
| 
 | |
| 				if ( ! faqItem ) {
 | |
| 					faqItem = expandFirstelements[ item ].querySelectorAll(
 | |
| 						'.uagb-faq-child__outer-wrap .uagb-faq-item'
 | |
| 					)[ 0 ];
 | |
| 				}
 | |
| 
 | |
| 				faqItem.classList.add( 'uagb-faq-item-active' );
 | |
| 
 | |
| 				faqItem.setAttribute( 'aria-expanded', true );
 | |
| 				faqItem.querySelectorAll( '.uagb-faq-content' )[ 0 ].style.display = 'block';
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	for ( let item = 0; item < inactiveOtherelements.length; item++ ) {
 | |
| 		if ( true === inactiveOtherelements[ item ].classList.contains( 'uagb-faq-layout-accordion' ) ) {
 | |
| 			let otherItems = inactiveOtherelements[ item ].querySelectorAll(
 | |
| 				'.uagb-faq-child__outer-wrap.uagb-faq-item'
 | |
| 			);
 | |
| 
 | |
| 			if ( ! otherItems || 0 === otherItems.length ) {
 | |
| 				otherItems = inactiveOtherelements[ item ].querySelectorAll(
 | |
| 					'.uagb-faq-child__outer-wrap .uagb-faq-item'
 | |
| 				);
 | |
| 			}
 | |
| 
 | |
| 			for ( let childItem = 0; childItem < otherItems.length; childItem++ ) {
 | |
| 				otherItems[ childItem ].classList.add( 'uagb-faq-item-active' );
 | |
| 				otherItems[ childItem ].setAttribute( 'aria-expanded', true );
 | |
| 				otherItems[ childItem ].querySelectorAll( '.uagb-faq-content' )[ 0 ].style.display = 'block';
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| window.addEventListener( 'load', function () {
 | |
| 	setupFAQ();
 | |
| 
 | |
| 	const accordionElements = document.getElementsByClassName( 'uagb-faq-layout-accordion' );
 | |
| 	for ( let item = 0; item < accordionElements.length; item++ ) {
 | |
| 		const questionButtons = accordionElements[ item ].querySelectorAll( '.uagb-faq-questions-button' );
 | |
| 		const faqItems = accordionElements[ item ].querySelectorAll( '.uagb-faq-item' );
 | |
| 
 | |
| 		for ( let button = 0; button < questionButtons.length; button++ ) {
 | |
| 			questionButtons[ button ].addEventListener( 'click', function ( e ) {
 | |
| 				faqClick( e, this.parentElement, questionButtons );
 | |
| 			} );
 | |
| 		}
 | |
| 
 | |
| 		for ( let button = 0; button < faqItems.length; button++ ) {
 | |
| 			faqItems[ button ].addEventListener( 'keyup', function ( e ) {
 | |
| 				faqClick( e, this, questionButtons );
 | |
| 			} );
 | |
| 		}
 | |
| 	}
 | |
| } );
 | |
| 
 | |
| function faqClick( e, faqItem, questionButtons ) {
 | |
| 	if ( e.keyCode === 13 || e.keyCode === 32 || e.button === 0 ) {
 | |
| 		// enter || spacebar || left mouse click.
 | |
| 		if ( faqItem.classList.contains( 'uagb-faq-item-active' ) ) {
 | |
| 			faqItem.classList.remove( 'uagb-faq-item-active' );
 | |
| 			faqItem.setAttribute( 'aria-expanded', false );
 | |
| 			slideUp( faqItem.getElementsByClassName( 'uagb-faq-content' )[ 0 ], 500 );
 | |
| 		} else {
 | |
| 			const parent = e.currentTarget.closest( '.wp-block-uagb-faq' );
 | |
| 			let faqToggle = 'true';
 | |
| 			if ( parent.classList.contains( 'wp-block-uagb-faq' ) ) {
 | |
| 				faqToggle = parent.getAttribute( 'data-faqtoggle' );
 | |
| 			}
 | |
| 			faqItem.classList.add( 'uagb-faq-item-active' );
 | |
| 			faqItem.setAttribute( 'aria-expanded', true );
 | |
| 			slideDown( faqItem.getElementsByClassName( 'uagb-faq-content' )[ 0 ], 500 );
 | |
| 			if ( 'true' === faqToggle ) {
 | |
| 				questionButtons = parent.querySelectorAll( '.uagb-faq-content' );
 | |
| 				for ( let buttonChild = 0; buttonChild < questionButtons.length; buttonChild++ ) {
 | |
| 					const buttonItem = questionButtons[ buttonChild ].parentElement;
 | |
| 					if ( buttonItem === faqItem ) {
 | |
| 						continue;
 | |
| 					}
 | |
| 					buttonItem.classList.remove( 'uagb-faq-item-active' );
 | |
| 					buttonItem.setAttribute( 'aria-expanded', false );
 | |
| 					slideUp( buttonItem.getElementsByClassName( 'uagb-faq-content' )[ 0 ], 500 );
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |