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
348 lines
No EOL
12 KiB
JavaScript
348 lines
No EOL
12 KiB
JavaScript
/**
|
|
* HVAC Mobile Responsive JavaScript
|
|
*
|
|
* Provides enhanced mobile functionality including:
|
|
* - Collapsible form sections
|
|
* - Mobile navigation toggle
|
|
* - Touch-friendly interactions
|
|
* - Responsive table enhancements
|
|
*
|
|
* @version 1.0.0
|
|
* @author HVAC Community Events Plugin
|
|
*/
|
|
|
|
(function($) {
|
|
'use strict';
|
|
|
|
// Wait for DOM to be ready
|
|
$(document).ready(function() {
|
|
initMobileResponsive();
|
|
});
|
|
|
|
/**
|
|
* Initialize all mobile responsive functionality
|
|
*/
|
|
function initMobileResponsive() {
|
|
setupCollapsibleFormSections();
|
|
setupMobileNavigation();
|
|
setupTableResponsiveness();
|
|
setupTouchEnhancements();
|
|
setupMobileModalHandling();
|
|
}
|
|
|
|
/**
|
|
* Setup collapsible form sections for registration forms
|
|
*/
|
|
function setupCollapsibleFormSections() {
|
|
// Only run on screens smaller than 768px
|
|
if (window.innerWidth > 768) {
|
|
return;
|
|
}
|
|
|
|
// Convert existing form sections to collapsible
|
|
var $formContainer = $('.hvac-registration-form-container, .hvac-trainer-registration-page');
|
|
if ($formContainer.length === 0) {
|
|
return;
|
|
}
|
|
|
|
// Find form sections by common headings
|
|
$formContainer.find('h2, h3').each(function(index) {
|
|
var $heading = $(this);
|
|
var $section = $('<div class="hvac-registration-section"></div>');
|
|
var $header = $('<div class="hvac-registration-section-header"></div>');
|
|
var $content = $('<div class="hvac-registration-section-content"></div>');
|
|
var $toggle = $('<span class="hvac-registration-section-toggle">▼</span>');
|
|
|
|
// Clone heading content
|
|
$header.html($heading.html()).append($toggle);
|
|
|
|
// Find content until next heading
|
|
var $nextElements = $heading.nextUntil('h2, h3');
|
|
if ($nextElements.length === 0) {
|
|
$nextElements = $heading.nextAll();
|
|
}
|
|
|
|
// Move content to collapsible section
|
|
$content.append($nextElements.clone());
|
|
$nextElements.remove();
|
|
|
|
// Build collapsible section
|
|
$section.append($header, $content);
|
|
$heading.replaceWith($section);
|
|
|
|
// Collapse all sections except the first one
|
|
if (index > 0) {
|
|
$section.addClass('collapsed');
|
|
}
|
|
});
|
|
|
|
// Add click handlers for collapsible sections
|
|
$(document).on('click', '.hvac-registration-section-header', function() {
|
|
var $section = $(this).parent();
|
|
$section.toggleClass('collapsed');
|
|
|
|
// Smooth height animation
|
|
var $content = $section.find('.hvac-registration-section-content');
|
|
if ($section.hasClass('collapsed')) {
|
|
$content.slideUp(300);
|
|
} else {
|
|
$content.slideDown(300);
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Setup mobile navigation toggle functionality
|
|
*/
|
|
function setupMobileNavigation() {
|
|
// Only run on mobile screens
|
|
if (window.innerWidth > 768) {
|
|
return;
|
|
}
|
|
|
|
var $navigation = $('.hvac-trainer-navigation');
|
|
if ($navigation.length === 0) {
|
|
return;
|
|
}
|
|
|
|
// Create mobile menu toggle if it doesn't exist
|
|
if ($navigation.find('.hvac-mobile-menu-toggle').length === 0) {
|
|
var $toggle = $('<button class="hvac-mobile-menu-toggle" aria-label="Toggle navigation menu">Menu</button>');
|
|
$navigation.prepend($toggle);
|
|
|
|
// Wrap existing menu in mobile container
|
|
var $menu = $navigation.find('ul, nav').first();
|
|
if ($menu.length > 0) {
|
|
$menu.wrap('<div class="hvac-trainer-nav-menu"></div>');
|
|
}
|
|
}
|
|
|
|
// Toggle functionality
|
|
$(document).on('click', '.hvac-mobile-menu-toggle', function() {
|
|
var $button = $(this);
|
|
var $menu = $navigation.find('.hvac-trainer-nav-menu');
|
|
|
|
$button.toggleClass('active');
|
|
$menu.toggleClass('active');
|
|
|
|
// Update ARIA attributes
|
|
var isExpanded = $button.hasClass('active');
|
|
$button.attr('aria-expanded', isExpanded);
|
|
});
|
|
|
|
// Setup submenu toggles
|
|
$navigation.find('li').has('ul').addClass('has-submenu');
|
|
$(document).on('click', '.has-submenu > a', function(e) {
|
|
if (window.innerWidth <= 768) {
|
|
e.preventDefault();
|
|
var $item = $(this).parent();
|
|
$item.toggleClass('active');
|
|
$item.find('.submenu, ul').first().slideToggle(200);
|
|
}
|
|
});
|
|
|
|
// Close mobile menu when clicking outside
|
|
$(document).on('click', function(e) {
|
|
if (window.innerWidth <= 768) {
|
|
if (!$(e.target).closest('.hvac-trainer-navigation').length) {
|
|
$('.hvac-mobile-menu-toggle').removeClass('active');
|
|
$('.hvac-trainer-nav-menu').removeClass('active');
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Enhance table responsiveness with JavaScript
|
|
*/
|
|
function setupTableResponsiveness() {
|
|
// Add data labels to table cells for mobile card layout
|
|
$('.events-table, .hvac-certificate-table').each(function() {
|
|
var $table = $(this);
|
|
var $headers = $table.find('th');
|
|
|
|
$table.find('tbody tr').each(function() {
|
|
$(this).find('td').each(function(index) {
|
|
var $cell = $(this);
|
|
var $header = $headers.eq(index);
|
|
if ($header.length > 0) {
|
|
$cell.attr('data-label', $header.text());
|
|
}
|
|
});
|
|
});
|
|
});
|
|
|
|
// Add horizontal scrolling indicators for tables that overflow
|
|
function addScrollIndicators() {
|
|
$('.hvac-events-table-wrapper, .hvac-certificate-table-wrapper').each(function() {
|
|
var $wrapper = $(this);
|
|
var $table = $wrapper.find('table');
|
|
|
|
if ($table.length > 0) {
|
|
var wrapperWidth = $wrapper.width();
|
|
var tableWidth = $table.width();
|
|
|
|
if (tableWidth > wrapperWidth) {
|
|
$wrapper.addClass('has-horizontal-scroll');
|
|
} else {
|
|
$wrapper.removeClass('has-horizontal-scroll');
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
// Check on load and resize
|
|
addScrollIndicators();
|
|
$(window).on('resize', debounce(addScrollIndicators, 250));
|
|
}
|
|
|
|
/**
|
|
* Setup touch enhancements for mobile devices
|
|
*/
|
|
function setupTouchEnhancements() {
|
|
// Add touch feedback for buttons
|
|
$('.hvac-button, .hvac-form-submit, button, input[type="submit"]').each(function() {
|
|
$(this).addClass('hvac-touch-target');
|
|
});
|
|
|
|
// Improve touch scrolling for modal content
|
|
if ('ontouchstart' in window) {
|
|
$('.hvac-modal-content, .hvac-popup-content').css({
|
|
'-webkit-overflow-scrolling': 'touch',
|
|
'overflow-scrolling': 'touch'
|
|
});
|
|
}
|
|
|
|
// Add touch feedback for interactive elements
|
|
$(document).on('touchstart', '.hvac-touch-target', function() {
|
|
$(this).addClass('hvac-touch-active');
|
|
});
|
|
|
|
$(document).on('touchend touchcancel', '.hvac-touch-target', function() {
|
|
var $this = $(this);
|
|
setTimeout(function() {
|
|
$this.removeClass('hvac-touch-active');
|
|
}, 150);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Setup mobile modal handling
|
|
*/
|
|
function setupMobileModalHandling() {
|
|
// Prevent body scrolling when modal is open on mobile
|
|
$(document).on('show', '.hvac-modal, .hvac-popup', function() {
|
|
if (window.innerWidth <= 768) {
|
|
$('body').addClass('hvac-modal-open');
|
|
}
|
|
});
|
|
|
|
$(document).on('hide', '.hvac-modal, .hvac-popup', function() {
|
|
$('body').removeClass('hvac-modal-open');
|
|
});
|
|
|
|
// Close modal when tapping backdrop on mobile
|
|
$(document).on('click', '.hvac-modal, .hvac-popup', function(e) {
|
|
if (e.target === this && window.innerWidth <= 768) {
|
|
$(this).trigger('hide');
|
|
}
|
|
});
|
|
|
|
// Swipe to close functionality for mobile
|
|
if ('ontouchstart' in window) {
|
|
setupSwipeToClose();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Setup swipe to close functionality for mobile modals
|
|
*/
|
|
function setupSwipeToClose() {
|
|
var startY = 0;
|
|
var currentY = 0;
|
|
var isDragging = false;
|
|
|
|
$(document).on('touchstart', '.hvac-modal, .hvac-popup', function(e) {
|
|
if ($(e.target).is('.hvac-modal, .hvac-popup')) {
|
|
startY = e.originalEvent.touches[0].pageY;
|
|
isDragging = true;
|
|
}
|
|
});
|
|
|
|
$(document).on('touchmove', '.hvac-modal, .hvac-popup', function(e) {
|
|
if (!isDragging) return;
|
|
|
|
currentY = e.originalEvent.touches[0].pageY;
|
|
var deltaY = currentY - startY;
|
|
|
|
// Add visual feedback for swipe gesture
|
|
if (Math.abs(deltaY) > 50) {
|
|
$(this).addClass('hvac-swipe-feedback');
|
|
}
|
|
});
|
|
|
|
$(document).on('touchend', '.hvac-modal, .hvac-popup', function(e) {
|
|
if (!isDragging) return;
|
|
|
|
var deltaY = currentY - startY;
|
|
$(this).removeClass('hvac-swipe-feedback');
|
|
|
|
// Close modal if swiped down significantly
|
|
if (deltaY > 100) {
|
|
$(this).trigger('hide');
|
|
}
|
|
|
|
isDragging = false;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Handle window resize events
|
|
*/
|
|
$(window).on('resize', debounce(function() {
|
|
// Re-initialize mobile features when crossing breakpoints
|
|
var width = window.innerWidth;
|
|
|
|
if (width > 768) {
|
|
// Desktop: Clean up mobile-specific modifications
|
|
$('.hvac-registration-section').removeClass('collapsed');
|
|
$('.hvac-trainer-nav-menu').removeClass('active');
|
|
$('.hvac-mobile-menu-toggle').removeClass('active');
|
|
} else {
|
|
// Mobile: Re-initialize if needed
|
|
setupMobileNavigation();
|
|
}
|
|
}, 250));
|
|
|
|
/**
|
|
* Debounce utility function
|
|
*/
|
|
function debounce(func, wait) {
|
|
var timeout;
|
|
return function executedFunction() {
|
|
var context = this;
|
|
var args = arguments;
|
|
var later = function() {
|
|
timeout = null;
|
|
func.apply(context, args);
|
|
};
|
|
clearTimeout(timeout);
|
|
timeout = setTimeout(later, wait);
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Utility function to detect touch devices
|
|
*/
|
|
function isTouchDevice() {
|
|
return 'ontouchstart' in window || navigator.maxTouchPoints > 0 || navigator.msMaxTouchPoints > 0;
|
|
}
|
|
|
|
/**
|
|
* Add body class for touch devices
|
|
*/
|
|
if (isTouchDevice()) {
|
|
$('body').addClass('hvac-touch-device');
|
|
}
|
|
|
|
})(jQuery); |