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
		
			
				
	
	
		
			309 lines
		
	
	
	
		
			9.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			309 lines
		
	
	
	
		
			9.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| (function ($) {
 | |
| 
 | |
| 	"use strict";
 | |
| 
 | |
| 	// Variables
 | |
| 	var content_container 	= '#main.site-main';
 | |
| 	var post_title_selector = 'h1.entry-title';
 | |
| 	var nav_container 		= 'nav.post-navigation';
 | |
| 	var comments_container 	= 'div#comments';
 | |
| 	var remove_comments     = 'yes';
 | |
| 	var track_pageviews     = 'yes';
 | |
| 	var curr_url            = window.location.href;
 | |
| 	var post_count          = 0;
 | |
| 	var stop_reading        = false;
 | |
| 	var show_comments       = astra.show_comments || 'Show Comments';
 | |
| 	var edit_post_url		= astra.edit_post_url || '';
 | |
| 	var siteUrl		    	= astra.site_url || '';
 | |
| 
 | |
| 	$( document ).ready( function() {
 | |
| 
 | |
| 		var in_customizer = false;
 | |
| 
 | |
| 		// check for wp.customize return boolean
 | |
| 		if ( typeof wp !== 'undefined' ) {
 | |
| 			in_customizer =  typeof wp.customize !== 'undefined' ? true : false;
 | |
| 		}
 | |
| 
 | |
| 		// Don't do this if looking for comments or in customizer.
 | |
| 		if ( in_customizer || window.location.href.indexOf( '#comments' ) > -1 ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Remove Comments.
 | |
| 		if ( remove_comments === 'yes' ) {
 | |
| 			initialise_comment( comments_container );
 | |
| 		}
 | |
| 
 | |
| 		var temp_content_container = $( content_container );
 | |
| 		var post_ID = temp_content_container.find('.ast-article-single').attr('id');
 | |
| 
 | |
| 		if ( typeof post_ID !== typeof undefined && post_ID !== "" ) {
 | |
| 			post_ID = post_ID.replace('post-', '');
 | |
| 		}
 | |
| 
 | |
| 		// Add a post divider.
 | |
| 		temp_content_container.prepend( DOMPurify.sanitize( '<hr style="height: 0" class="post-divider" data-title="' + window.document.title + '" data-url="' + window.location.href + '" data-post-id="' + post_ID + '"/>' ) );
 | |
| 
 | |
| 		// Initialise scrollSpy
 | |
| 		initialise_scrollspy();
 | |
| 
 | |
| 		$('body').on( 'click', '.ast-show-comments', function( e ) {
 | |
| 			var parent = $(this).closest('.ast-show-comments-data');
 | |
| 			parent.hide();
 | |
| 			parent.siblings().show();
 | |
| 		});
 | |
| 
 | |
| 		/**
 | |
| 		 * Track Page View with Google Analytics.
 | |
| 		 *
 | |
| 		 * It will first detect if Google Analytics is installed before
 | |
| 		 * attempting to send a pageview.
 | |
| 		 *
 | |
| 		 * The tracker detects both classic and universal tracking methods.
 | |
| 		 *
 | |
| 		 * Also supports Google Analytics by Monster Insights should it be used.
 | |
| 		 */
 | |
| 		$('body').on( 'asta-post-changed', function( e, post_title, post_url, post_id, post_count, stop_reading ) {
 | |
| 			if ( track_pageviews != 'yes' ) {
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			if ( typeof pageTracker === "undefined" && typeof _gaq === 'undefined' && typeof ga === 'undefined' && typeof __gaTracker === 'undefined' ) {
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			// Remove the base URL from the post_url.
 | |
| 			var regexp = new RegExp(siteUrl, 'gi')
 | |
| 			var postUrl = post_url.replace(regexp, '');
 | |
| 
 | |
| 			// This uses Asynchronous version of Google Analytics tracking method.
 | |
| 			if ( typeof pageTracker !== "undefined" && pageTracker !== null ) {
 | |
| 				pageTracker._trackPageview( postUrl );
 | |
| 			}
 | |
| 
 | |
| 			// This uses Google's classic Google Analytics tracking method.
 | |
| 			if ( typeof _gaq !== 'undefined' && _gaq !== null ) {
 | |
| 				_gaq.push(['_trackPageview', postUrl]);
 | |
| 			}
 | |
| 
 | |
| 			// This uses Google Analytics Universal Analytics tracking method.
 | |
| 			if ( typeof ga !== 'undefined' && ga !== null ) {
 | |
| 				ga( 'send', 'pageview', postUrl );
 | |
| 			}
 | |
| 
 | |
| 			// This uses Monster Insights method of tracking Google Analytics.
 | |
| 			if ( typeof __gaTracker !== 'undefined' && __gaTracker !== null ) {
 | |
| 				__gaTracker( 'send', 'pageview', postUrl );
 | |
| 			}
 | |
| 
 | |
| 			// This uses Google Analytics Universal Analytics tracking method.
 | |
| 			if ( typeof gtag !== 'undefined' && gtag !== null ) {
 | |
| 				gtag('event', 'page_view', {
 | |
| 				  'page_title' : post_title,
 | |
| 				  'page_path': postUrl
 | |
| 				});
 | |
| 			}
 | |
| 
 | |
| 		});
 | |
| 
 | |
| 	}); // END document()
 | |
| 
 | |
| 	function initialise_comment( comments_wrapper ) {
 | |
| 
 | |
| 		var $comments_container = $( comments_wrapper );
 | |
| 
 | |
| 		if (  0 === $comments_container.length ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		$comments_container.each(function( index ) {
 | |
| 
 | |
| 			var $this = $(this);
 | |
| 
 | |
| 			if ( $this.find('.ast-show-comments-data').length === 0  ) {
 | |
| 				var comments_count_wrapper 	= $this.find( '.comments-count-wrapper' );
 | |
| 				var comment_data = '<div class="ast-show-comments-data">';
 | |
| 
 | |
| 				$this.find( '.comment-respond' ).hide();
 | |
| 
 | |
| 				if ( comments_count_wrapper.length > 0 ) {
 | |
| 					comments_count_wrapper.hide();
 | |
| 					$this.find( '.ast-comment-list' ).hide();
 | |
| 					comment_data += '<div class="ast-show-comments-count"><h3 class="comments-title">' + comments_count_wrapper.find('.comments-title').text() + '</h3></div>';
 | |
| 				}
 | |
| 
 | |
| 				comment_data += '<div class="ast-show-comments button ast-button">' + show_comments + '</div>';
 | |
| 
 | |
| 				comment_data += '</div>';
 | |
| 
 | |
| 				$this.find( '.no-comments' ).hide();
 | |
| 
 | |
| 				$this.prepend( comment_data );
 | |
| 			}
 | |
| 		});
 | |
| 	}
 | |
| 
 | |
| 	function initialise_scrollspy() {
 | |
| 		scrollspy();
 | |
| 	} // END initialise_scrollspy()
 | |
| 
 | |
| 	function scrollspy() {
 | |
| 
 | |
| 		$( '.post-divider').off( 'scrollSpy:enter', astra_enter );
 | |
| 		$( '.post-divider').off( 'scrollSpy:exit', astra_leave );
 | |
| 
 | |
| 		// Spy on post-divider - changes the URL in browser location and loads new post.
 | |
| 		$( '.post-divider').on( 'scrollSpy:enter', astra_enter );
 | |
| 		$( '.post-divider').on( 'scrollSpy:exit', astra_leave );
 | |
| 		$( '.post-divider').scrollSpy();
 | |
| 	} // END scrollspy()
 | |
| 
 | |
| 	function astra_enter() {
 | |
| 		var $enter = $(this);
 | |
| 		changeURL($enter, 'enter' );
 | |
| 	} // END astra_enter()
 | |
| 
 | |
| 	function astra_leave() {
 | |
| 		var $leave = $(this);
 | |
| 		changeURL($leave, 'leave' );
 | |
| 	} // END astra_leave()
 | |
| 
 | |
| 	function changeURL( $this, in_out_style ) {
 | |
| 		var el           = $($this);
 | |
| 		var this_url     = el.attr( 'data-url' );
 | |
| 		var this_title   = el.attr( 'data-title' );
 | |
| 		var this_post_id = el.attr( 'data-post-id' );
 | |
| 		var offset       = el.offset();
 | |
| 		var scrollTop    = $(document).scrollTop();
 | |
| 
 | |
| 		// If exiting or entering from top, change URL.
 | |
| 		if ( ( offset.top - scrollTop ) < 200 && curr_url != this_url ) {
 | |
| 			curr_url = this_url;
 | |
| 			History.pushState(null, this_title, this_url);
 | |
| 
 | |
| 			// Update edit link if possible
 | |
| 			if( $('#wp-admin-bar-edit').length > 0 && '' != edit_post_url ) {
 | |
| 
 | |
| 				var new_edit_post_url = edit_post_url.replace( "{{id}}", this_post_id );
 | |
| 
 | |
| 				$('#wp-admin-bar-edit a').attr( 'href', new_edit_post_url );
 | |
| 			}
 | |
| 			$('body').trigger( 'asta-post-changed', [ this_title, this_url, this_post_id, post_count, stop_reading ] );
 | |
| 		}
 | |
| 
 | |
| 		if ( el.nextAll( '.post-divider' ).length === 0 ) {
 | |
| 			// Look for the next post to load if any.
 | |
| 			auto_load_next_post();
 | |
| 		}
 | |
| 	} // END changeURL()
 | |
| 
 | |
| 	/**
 | |
| 	 * This is the main function.
 | |
| 	 */
 | |
| 	function auto_load_next_post() {
 | |
| 		// If the user can no read any more then stop looking for new posts.
 | |
| 		if ( stop_reading ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Grab the url for the next post in the post navigation.
 | |
| 		var post_url = $( nav_container ).find( 'a[rel="prev"]').attr( 'href' );
 | |
| 
 | |
| 		// Return if previous post URL is same as current URL.
 | |
| 		if ( ! post_url || post_url === window.location.href ) {
 | |
| 			return;
 | |
| 		}
 | |
| 
 | |
| 		// Check to see if pretty permalinks, if not then add partial-prev=1
 | |
| 		if ( post_url.indexOf( '?' ) > -1 ) {
 | |
| 			var np_url = post_url + '&partial-prev=1'
 | |
| 		} else {
 | |
| 			var np_url = post_url + '?partial-prev=1'
 | |
| 		}
 | |
| 
 | |
| 		// Remove the post navigation HTML once the next post has loaded.
 | |
| 		$( nav_container ).remove();
 | |
| 
 | |
| 		let request = new XMLHttpRequest();
 | |
| 		request.open('GET', post_url, true);
 | |
| 		request.send();
 | |
| 		request.onload = function() {
 | |
| 			let string = request.response;
 | |
| 			let postData = new DOMParser().parseFromString(string, 'text/html'),
 | |
| 				postId = postData.querySelector( 'article.ast-article-single' ) ? postData.querySelector( 'article.ast-article-single' ).getAttribute('id') : '';
 | |
| 			postId = '' != postId ? postId.replace('post-', '') : ''; // Make sure that only the post ID remains.
 | |
| 
 | |
| 			let linkId = postData.getElementById("uag-style-" + postId + "-css"),
 | |
| 				styleId = postData.getElementById("uagb-style-frontend-" + postId);
 | |
| 
 | |
| 			if ( '' !== postId && linkId ) {
 | |
| 				// If file generation is enabled.
 | |
| 				let href = linkId.href,
 | |
| 					styleLink = document.createElement("link");
 | |
| 
 | |
| 				styleLink.rel = "stylesheet";
 | |
| 				styleLink.id = "uag-style-" + postId + "-css";
 | |
| 				styleLink.href = href;
 | |
| 				styleLink.media = "all";
 | |
| 
 | |
| 				document.head.appendChild( styleLink );
 | |
| 			}
 | |
| 
 | |
| 			if ( '' !== postId && styleId ) {
 | |
| 				// If inline dynamic styles loaded.
 | |
| 				let styleLink = document.createElement("style");
 | |
| 
 | |
| 				styleLink.id = "uagb-style-frontend-" + postId;
 | |
| 				styleLink.textContent = styleId.innerText;
 | |
| 
 | |
| 				document.head.appendChild( styleLink );
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		$.get( np_url , function( data ) {
 | |
| 
 | |
| 			var post = $( "<div>" + data + "</div>" );
 | |
| 
 | |
| 			data = post.html(); // Returns the HTML data of the next post that was loaded.
 | |
| 
 | |
| 			var post_divider = '<hr style="height: 0" class="ast-single-previous-hr post-divider" data-url="' + post_url + '"/>';
 | |
| 			var post_html    = $( post_divider + data );
 | |
| 			var post_title   = post_html.find( post_title_selector ); // Find the post title of the loaded article.
 | |
| 			var post_ID      = $(post).find( 'article' ).attr( 'id' ); // Find the post ID of the loaded article.
 | |
| 
 | |
| 			if ( typeof post_ID !== typeof undefined && post_ID !== "" ) {
 | |
| 				post_ID = post_ID.replace('post-', ''); // Make sure that only the post ID remains.
 | |
| 			}
 | |
| 
 | |
| 			const purifyConfig = {
 | |
| 				ADD_TAGS: ['iframe'], // We can Add other tags as needed.
 | |
| 				ADD_ATTR: ['src', 'width', 'height', 'frameborder', 'allow', 'allowfullscreen'], // Added required iframe attributes.
 | |
| 				ALLOW_DATA_ATTR: false,
 | |
| 			};
 | |
| 			
 | |
| 			post_html?.each( ( _, element ) => {
 | |
| 				const sanitizedElement = DOMPurify.sanitize(element, purifyConfig);
 | |
| 				$(content_container).append(sanitizedElement);
 | |
| 			});
 | |
| 			
 | |
| 			// Remove Comments.
 | |
| 			if ( remove_comments === 'yes' ) {
 | |
| 				initialise_comment( comments_container );
 | |
| 			}
 | |
| 
 | |
| 			// Get the hidden "HR" element and add the missing post title and post id attributes. Also make sure it remains hidden.
 | |
| 			$( 'hr[data-url="' + post_url + '"]').attr( 'data-title' , post_title.text() ).attr( 'data-post-id' , post_ID );// .css( 'display', 'inline-block' );
 | |
| 
 | |
| 			scrollspy(); // Need to set up ScrollSpy now that the new content has loaded.
 | |
| 
 | |
| 			post_count = post_count+1; // Updates the post count.
 | |
| 
 | |
| 			// Run an event once the post has loaded.
 | |
| 			$('body').trigger( 'astra-post-loaded', [ post_title.text(), post_url, post_ID, post_count ] );
 | |
| 		});
 | |
| 
 | |
| 	} // END auto_load_next_post()
 | |
| 
 | |
| 
 | |
| })(jQuery);
 |