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
		
			
				
	
	
		
			131 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
	
		
			5.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const triggerActiveAttributeButton = () => {
 | |
|     const activeAttributeButton = document.querySelector('.ast-variation-button-group .ast-single-variation.active');
 | |
|     if (activeAttributeButton) {
 | |
|         activeAttributeButton.click();
 | |
|     }
 | |
| };
 | |
| 
 | |
| const productVariation = (image_slider_wrap) => {
 | |
|     const productSingleVariations = document.querySelectorAll( '.ast-single-variation' );
 | |
|     const productVariationReset   = document.querySelector( '.reset_variations' );
 | |
| 
 | |
|     // Resets Buttons on Clear Button.
 | |
|     if( productVariationReset ) {
 | |
|         productVariationReset.addEventListener( 'click', (e) => {
 | |
|             const allVariationButtons = document.querySelectorAll( '.ast-single-variation' );
 | |
|             allVariationButtons.forEach( element => {
 | |
|                 element.classList.remove( 'active' );
 | |
|                 element.style.opacity = '1';
 | |
|                 element.style.pointerEvents = 'inherit';
 | |
|             } );
 | |
|         } );
 | |
|     }
 | |
| 
 | |
|     if( productSingleVariations ) {
 | |
|         productSingleVariations.forEach( element => {
 | |
| 
 | |
|             // Single Product Variation Buttons.
 | |
|             element.addEventListener( 'click', (e) => {
 | |
|                 const allVariationButtons = e.target.closest( '.ast-variation-button-group' );
 | |
| 
 | |
|                 if( allVariationButtons ) {
 | |
|                     const allVariationButtonSingle = allVariationButtons.querySelectorAll( '.ast-single-variation' );
 | |
|                     if( allVariationButtonSingle ) {
 | |
|                         allVariationButtonSingle.forEach( element => {
 | |
|                             element.classList.remove( 'active' );
 | |
|                         } );
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 const allVariationContainer = document.querySelector( '.ast-product-single-variable form .variations' )
 | |
| 
 | |
|                 if( allVariationContainer ) {
 | |
|                     allVariationSelector = allVariationContainer.querySelectorAll( 'select' );
 | |
|                     allVariationButton   = allVariationContainer.querySelectorAll( '.ast-variation-button-group' );
 | |
| 
 | |
|                     // Enables and Disables Variation Buttons.
 | |
|                     if( allVariationSelector && allVariationButton ) {
 | |
|                         setTimeout( () => {
 | |
|                             allVariationSelector.forEach( select => {
 | |
|                                 const options = select.querySelectorAll('option');
 | |
|                                 const node = [];
 | |
| 
 | |
|                                 options.forEach( element => {
 | |
|                                     node.push( element.getAttribute('value') );
 | |
|                                 });
 | |
| 
 | |
|                                 const buttons = select.nextElementSibling;
 | |
|                                 const buttonList = buttons !== null ? buttons.querySelectorAll('.ast-single-variation') : null;                                
 | |
| 
 | |
|                                 if (buttonList !== null) {
 | |
|                                     buttonList.forEach(button => {
 | |
|                                         buttonList.forEach( element => {
 | |
|                                             if( ! node.includes( element.getAttribute('data-slug') ) ) {
 | |
|                                                 element.style.opacity = '.5';
 | |
|                                                 element.style.pointerEvents = 'none';
 | |
|                                             } else {
 | |
|                                                 element.style.opacity = '1';
 | |
|                                                 element.style.pointerEvents = 'inherit';
 | |
|                                             }
 | |
|         
 | |
|                                         } );                                    });
 | |
|                                 }
 | |
| 
 | |
|                             } );
 | |
|                         }, 100 );
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 const currentSlug   = e.target.getAttribute( 'data-slug' );
 | |
|                 const currentTarget = e.target.closest( 'td' ).querySelector( 'select' );
 | |
| 
 | |
|                 // On Variation Change Trigger Hidden Select.
 | |
|                 if( currentSlug && currentTarget ) {
 | |
|                     e.target.classList.add( 'active' );
 | |
|                     currentTarget.value = currentSlug;
 | |
|                     currentTarget.dispatchEvent( new Event( 'change', { 'bubbles': true } ) )
 | |
| 
 | |
|                     // Triggering the active Attribute button to ensure the state is updated
 | |
|                     triggerActiveAttributeButton();
 | |
|                 }
 | |
| 
 | |
|                 if (image_slider_wrap != null) {
 | |
| 					image_slider_wrap.flexslider(0);
 | |
| 				}
 | |
|             } );
 | |
|         } );
 | |
|     }
 | |
| }
 | |
| 
 | |
| document.addEventListener("DOMContentLoaded", function(event) {
 | |
|     productVariation();
 | |
| });
 | |
| 
 | |
| document.addEventListener( "astUpdateSingleProductVariations", function() {
 | |
| 	productVariation();
 | |
| });
 | |
| 
 | |
| // Composite product plugin compatibility.
 | |
| jQuery('.composite_data').on('wc-composite-initializing', function (event, composite) {
 | |
|     composite.actions.add_action('component_scripts_initialized', function () {
 | |
|         productVariation();
 | |
|     }, 100)
 | |
| });
 | |
| 
 | |
| // Adding Function to read URL parameters dynamically.
 | |
| document.addEventListener("DOMContentLoaded", function () {
 | |
|     const urlParams = new URLSearchParams(window.location.search);
 | |
| 
 | |
|     urlParams.forEach((value, key) => {
 | |
|         const variationButton = document.querySelector(`.ast-single-variation[data-slug="${value}"]`);
 | |
| 
 | |
|         if (variationButton) {
 | |
|             variationButton.classList.add('active');
 | |
|             const selectElement = document.querySelector(`select[name="${key}"]`);
 | |
|             if (selectElement) {
 | |
|                 selectElement.value = value;
 | |
|                 selectElement.dispatchEvent(new Event('change', { bubbles: true }));
 | |
|             }
 | |
|         }
 | |
|     });
 | |
| });
 |