Compare commits
No commits in common. "0b033f7f4f23815ad128b63fcaf59cc264addc82" and "83ef8f746317de8a1476872c0f4188897fefb1e2" have entirely different histories.
0b033f7f4f
...
83ef8f7463
6 changed files with 1191 additions and 397 deletions
|
|
@ -576,15 +576,6 @@ body .hvac-find-training-page {
|
|||
background: #f0f0f0;
|
||||
}
|
||||
|
||||
/* Override global img { max-width: 100% } from theme/WP that shrinks
|
||||
Google Maps tile images, causing markers to drift from tiles on zoom.
|
||||
See: https://developers.google.com/maps/documentation/javascript/best-practices */
|
||||
#hvac-training-map img,
|
||||
#hvac-training-map .gm-style img {
|
||||
max-width: none !important;
|
||||
max-height: none !important;
|
||||
}
|
||||
|
||||
/* Map Loading State */
|
||||
.hvac-map-loading {
|
||||
display: flex;
|
||||
|
|
@ -668,37 +659,6 @@ body .hvac-find-training-page {
|
|||
background: var(--hvac-event-color);
|
||||
}
|
||||
|
||||
/* Reset Map View Button */
|
||||
.hvac-reset-map-btn {
|
||||
position: absolute;
|
||||
bottom: 24px;
|
||||
right: 12px;
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
background: #fff;
|
||||
border: none;
|
||||
border-radius: 6px;
|
||||
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
|
||||
cursor: pointer;
|
||||
z-index: 10;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: background 0.2s, box-shadow 0.2s;
|
||||
}
|
||||
|
||||
.hvac-reset-map-btn:hover {
|
||||
background: #f0f0f0;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25);
|
||||
}
|
||||
|
||||
.hvac-reset-map-btn .dashicons {
|
||||
font-size: 18px;
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
color: var(--hvac-text-muted);
|
||||
}
|
||||
|
||||
/* Map Toggles Overlay */
|
||||
.hvac-map-toggles {
|
||||
position: absolute;
|
||||
|
|
@ -1260,49 +1220,19 @@ body .hvac-find-training-page {
|
|||
--hvac-sidebar-width: 320px;
|
||||
}
|
||||
|
||||
/* On mobile/tablet, allow natural page scrolling instead of fixed viewport */
|
||||
.hvac-find-training-page {
|
||||
height: auto !important;
|
||||
overflow: visible !important;
|
||||
}
|
||||
|
||||
/* Keep filter bar visible while scrolling */
|
||||
.hvac-filter-bar {
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.admin-bar .hvac-filter-bar {
|
||||
top: 46px;
|
||||
}
|
||||
|
||||
/* Switch to stacked layout - map on top, sidebar below */
|
||||
.hvac-map-layout {
|
||||
grid-template-areas:
|
||||
"map"
|
||||
"sidebar" !important;
|
||||
grid-template-columns: 1fr !important;
|
||||
grid-template-rows: 55vh auto !important;
|
||||
overflow: visible !important;
|
||||
}
|
||||
|
||||
/* Map needs explicit height since page no longer constrains it */
|
||||
.hvac-map-container {
|
||||
min-height: 300px;
|
||||
grid-template-rows: 55vh 1fr !important;
|
||||
}
|
||||
|
||||
.hvac-sidebar {
|
||||
border-right: none;
|
||||
border-top: 1px solid var(--hvac-border);
|
||||
overflow-x: hidden !important;
|
||||
overflow-y: visible !important;
|
||||
max-height: none !important;
|
||||
}
|
||||
|
||||
/* Sidebar content scrolls with page, not independently */
|
||||
.hvac-sidebar-content {
|
||||
overflow-y: visible !important;
|
||||
max-height: 45vh;
|
||||
}
|
||||
|
||||
/* Show sidebar toggle on tablet/mobile */
|
||||
|
|
@ -1313,7 +1243,7 @@ body .hvac-find-training-page {
|
|||
/* Collapsible sidebar */
|
||||
.hvac-sidebar.collapsed {
|
||||
max-height: 80px;
|
||||
overflow: hidden !important;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.hvac-sidebar.collapsed .hvac-sidebar-content {
|
||||
|
|
@ -1362,20 +1292,14 @@ body .hvac-find-training-page {
|
|||
font-size: 12px;
|
||||
}
|
||||
|
||||
.hvac-marker-checkbox {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
.hvac-visibility-toggles {
|
||||
gap: 8px;
|
||||
padding: 4px 0;
|
||||
}
|
||||
|
||||
.hvac-marker-checkbox::after {
|
||||
left: 2px;
|
||||
top: 0px;
|
||||
width: 3px;
|
||||
height: 6px;
|
||||
}
|
||||
|
||||
.hvac-marker-toggle {
|
||||
margin-right: 2px;
|
||||
.hvac-toggle-dot {
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1385,7 +1309,11 @@ body .hvac-find-training-page {
|
|||
|
||||
@media (max-width: 767px) {
|
||||
.hvac-map-layout {
|
||||
grid-template-rows: 50vh auto;
|
||||
grid-template-rows: 50vh 1fr;
|
||||
}
|
||||
|
||||
.hvac-sidebar {
|
||||
max-height: 50vh;
|
||||
}
|
||||
|
||||
/* Filter bar adjustments */
|
||||
|
|
@ -1454,7 +1382,7 @@ body .hvac-find-training-page {
|
|||
font-size: 11px;
|
||||
}
|
||||
|
||||
.hvac-marker-toggle {
|
||||
.hvac-visibility-toggles {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
|
@ -1515,7 +1443,11 @@ body .hvac-find-training-page {
|
|||
|
||||
@media (max-width: 480px) {
|
||||
.hvac-map-layout {
|
||||
grid-template-rows: 45vh auto;
|
||||
grid-template-rows: 45vh 1fr;
|
||||
}
|
||||
|
||||
.hvac-sidebar {
|
||||
max-height: 55vh;
|
||||
}
|
||||
|
||||
.hvac-map-legend {
|
||||
|
|
@ -1770,12 +1702,10 @@ body .hvac-find-training-page {
|
|||
border-bottom: 2px solid var(--hvac-border);
|
||||
margin: 0 -16px;
|
||||
padding: 0 16px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.hvac-tab {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
padding: 10px 8px;
|
||||
background: transparent;
|
||||
border: none;
|
||||
|
|
@ -1787,8 +1717,6 @@ body .hvac-find-training-page {
|
|||
cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.hvac-tab:hover {
|
||||
|
|
@ -1810,71 +1738,57 @@ body .hvac-find-training-page {
|
|||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* Marker Toggle Checkboxes (inline in tab buttons) */
|
||||
.hvac-marker-toggle {
|
||||
display: inline-flex;
|
||||
/* Visibility Toggles */
|
||||
.hvac-visibility-toggles {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
margin-right: 4px;
|
||||
vertical-align: middle;
|
||||
position: relative;
|
||||
gap: 12px;
|
||||
padding: 8px 0;
|
||||
}
|
||||
|
||||
.hvac-marker-toggle input {
|
||||
.hvac-visibility-toggle {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.hvac-visibility-toggle input {
|
||||
position: absolute;
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.hvac-marker-checkbox {
|
||||
width: 14px;
|
||||
height: 14px;
|
||||
border: 2px solid #999;
|
||||
border-radius: 3px;
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
transition: all 0.15s ease;
|
||||
background: #fff;
|
||||
flex-shrink: 0;
|
||||
.hvac-toggle-dot {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
border-radius: 50%;
|
||||
border: 2px solid;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.hvac-marker-checkbox::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 3px;
|
||||
top: 0px;
|
||||
width: 4px;
|
||||
height: 8px;
|
||||
border: solid #fff;
|
||||
border-width: 0 2px 2px 0;
|
||||
transform: rotate(45deg);
|
||||
opacity: 0;
|
||||
transition: opacity 0.15s ease;
|
||||
.hvac-toggle-trainer {
|
||||
background: var(--hvac-trainer-color);
|
||||
border-color: #5a8a1a;
|
||||
}
|
||||
|
||||
.hvac-marker-toggle input:checked + .hvac-marker-checkbox::after {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Category-specific checkbox colors */
|
||||
.hvac-marker-toggle-trainer input:checked + .hvac-marker-checkbox {
|
||||
background: #6aad1e;
|
||||
border-color: #6aad1e;
|
||||
}
|
||||
|
||||
.hvac-marker-toggle-venue input:checked + .hvac-marker-checkbox {
|
||||
.hvac-toggle-venue {
|
||||
background: var(--hvac-venue-color);
|
||||
border-color: var(--hvac-venue-color);
|
||||
border-color: #6fa024;
|
||||
}
|
||||
|
||||
.hvac-marker-toggle-event input:checked + .hvac-marker-checkbox {
|
||||
.hvac-toggle-event {
|
||||
background: var(--hvac-event-color);
|
||||
border-color: var(--hvac-event-color);
|
||||
border-color: #0a9a8a;
|
||||
}
|
||||
|
||||
.hvac-marker-toggle:hover .hvac-marker-checkbox {
|
||||
border-color: #666;
|
||||
.hvac-visibility-toggle input:not(:checked) + .hvac-toggle-dot {
|
||||
background: #f5f5f5;
|
||||
border-color: #ccc;
|
||||
}
|
||||
|
||||
.hvac-visibility-toggle:hover .hvac-toggle-dot {
|
||||
transform: scale(1.1);
|
||||
}
|
||||
|
||||
/* Tab Panels */
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@
|
|||
visibleEvents: [],
|
||||
|
||||
// Active tab
|
||||
activeTab: 'events',
|
||||
activeTab: 'trainers',
|
||||
|
||||
// Items per page for load more
|
||||
itemsPerPage: 6,
|
||||
|
|
@ -110,7 +110,6 @@
|
|||
// Initialize responsive features
|
||||
this.handleWindowResize();
|
||||
this.initSidebarToggle();
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
@ -170,13 +169,9 @@
|
|||
mapElement.innerHTML = '';
|
||||
|
||||
// Create map with options
|
||||
// minZoom: 3 prevents tile/marker drift at low zoom levels caused by
|
||||
// Google Maps WebGL renderer reading viewport width instead of container width
|
||||
// in CSS Grid layouts. Drift is invisible at zoom 4+ but severe at zoom 1-2.
|
||||
this.map = new google.maps.Map(mapElement, {
|
||||
center: this.config.defaultCenter,
|
||||
zoom: this.config.defaultZoom,
|
||||
minZoom: 3,
|
||||
mapTypeControl: true,
|
||||
mapTypeControlOptions: {
|
||||
position: google.maps.ControlPosition.TOP_RIGHT
|
||||
|
|
@ -327,9 +322,6 @@
|
|||
|
||||
// Fit bounds if we have markers
|
||||
this.fitBounds();
|
||||
|
||||
// Highlight markers for active tab
|
||||
this.highlightMarkersForTab(this.activeTab);
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
@ -513,122 +505,6 @@
|
|||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Get highlighted trainer marker icon (larger, brighter stroke)
|
||||
*/
|
||||
getTrainerIconHighlighted: function() {
|
||||
if (hvacFindTraining.marker_icons?.trainer) {
|
||||
return {
|
||||
url: hvacFindTraining.marker_icons.trainer,
|
||||
scaledSize: new google.maps.Size(40, 40),
|
||||
anchor: new google.maps.Point(20, 20)
|
||||
};
|
||||
}
|
||||
return {
|
||||
path: google.maps.SymbolPath.CIRCLE,
|
||||
fillColor: '#f0f7e8',
|
||||
fillOpacity: 1,
|
||||
strokeColor: '#3d6e00',
|
||||
strokeWeight: 3,
|
||||
scale: 14
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Get highlighted champion marker icon (larger, brighter stroke)
|
||||
*/
|
||||
getChampionIconHighlighted: function() {
|
||||
return {
|
||||
path: google.maps.SymbolPath.CIRCLE,
|
||||
fillColor: '#f0f7e8',
|
||||
fillOpacity: 1,
|
||||
strokeColor: '#e0e0e0',
|
||||
strokeWeight: 3.5,
|
||||
scale: 14
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Get highlighted venue marker icon (larger, brighter stroke)
|
||||
*/
|
||||
getVenueIconHighlighted: function() {
|
||||
if (hvacFindTraining.marker_icons?.venue) {
|
||||
return {
|
||||
url: hvacFindTraining.marker_icons.venue,
|
||||
scaledSize: new google.maps.Size(40, 40),
|
||||
anchor: new google.maps.Point(20, 20)
|
||||
};
|
||||
}
|
||||
return {
|
||||
path: google.maps.SymbolPath.BACKWARD_CLOSED_ARROW,
|
||||
fillColor: '#89c92e',
|
||||
fillOpacity: 1,
|
||||
strokeColor: '#e0e0e0',
|
||||
strokeWeight: 3,
|
||||
scale: 8
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Get highlighted event marker icon (larger, brighter stroke)
|
||||
*/
|
||||
getEventIconHighlighted: function() {
|
||||
if (hvacFindTraining.marker_icons?.event) {
|
||||
return {
|
||||
url: hvacFindTraining.marker_icons.event,
|
||||
scaledSize: new google.maps.Size(40, 40),
|
||||
anchor: new google.maps.Point(20, 20)
|
||||
};
|
||||
}
|
||||
return {
|
||||
path: google.maps.SymbolPath.CIRCLE,
|
||||
fillColor: '#0ebaa6',
|
||||
fillOpacity: 1,
|
||||
strokeColor: '#e0e0e0',
|
||||
strokeWeight: 3,
|
||||
scale: 11
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Highlight markers for the active tab category.
|
||||
* Active tab markers get larger icons + higher zIndex.
|
||||
* Inactive tab markers revert to normal icons + default zIndex.
|
||||
*/
|
||||
highlightMarkersForTab: function(tab) {
|
||||
if (!this.map) return;
|
||||
|
||||
const DEFAULT_Z = 1;
|
||||
const HIGHLIGHT_Z = 100;
|
||||
|
||||
// Trainer markers
|
||||
const trainerHighlighted = (tab === 'trainers');
|
||||
this.trainerMarkers.forEach(function(marker) {
|
||||
const isChampion = marker.trainerData && marker.trainerData.is_champion;
|
||||
if (trainerHighlighted) {
|
||||
marker.setIcon(isChampion ? HVACTrainingMap.getChampionIconHighlighted() : HVACTrainingMap.getTrainerIconHighlighted());
|
||||
marker.setZIndex(HIGHLIGHT_Z);
|
||||
} else {
|
||||
marker.setIcon(isChampion ? HVACTrainingMap.getChampionIcon() : HVACTrainingMap.getTrainerIcon());
|
||||
marker.setZIndex(DEFAULT_Z);
|
||||
}
|
||||
});
|
||||
|
||||
// Venue markers
|
||||
const venueHighlighted = (tab === 'venues');
|
||||
this.venueMarkers.forEach(function(marker) {
|
||||
marker.setIcon(venueHighlighted ? HVACTrainingMap.getVenueIconHighlighted() : HVACTrainingMap.getVenueIcon());
|
||||
marker.setZIndex(venueHighlighted ? HIGHLIGHT_Z : DEFAULT_Z);
|
||||
});
|
||||
|
||||
// Event markers
|
||||
const eventHighlighted = (tab === 'events');
|
||||
this.eventMarkers.forEach(function(marker) {
|
||||
marker.setIcon(eventHighlighted ? HVACTrainingMap.getEventIconHighlighted() : HVACTrainingMap.getEventIcon());
|
||||
marker.setZIndex(eventHighlighted ? HIGHLIGHT_Z : DEFAULT_Z);
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Initialize marker clustering
|
||||
*/
|
||||
|
|
@ -1276,11 +1152,6 @@
|
|||
$('#hvac-load-more').on('click', function() {
|
||||
self.loadMoreTrainers();
|
||||
});
|
||||
|
||||
// Reset map view button
|
||||
$('#hvac-reset-map').on('click', function() {
|
||||
self.resetMapView();
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
@ -1486,14 +1357,6 @@
|
|||
this.map.setZoom(zoom || 10);
|
||||
},
|
||||
|
||||
/**
|
||||
* Reset map to fit all markers (or default view if none)
|
||||
*/
|
||||
resetMapView: function() {
|
||||
if (!this.map) return;
|
||||
this.fitBounds();
|
||||
},
|
||||
|
||||
/**
|
||||
* Sync sidebar lists with visible map viewport
|
||||
*/
|
||||
|
|
@ -1549,16 +1412,14 @@
|
|||
* Show loading state
|
||||
*/
|
||||
showLoading: function() {
|
||||
const gridId = this.activeTab === 'events' ? '#hvac-event-grid' : this.activeTab === 'venues' ? '#hvac-venue-grid' : '#hvac-trainer-grid';
|
||||
const label = this.activeTab === 'events' ? 'events' : this.activeTab === 'venues' ? 'venues' : 'trainers';
|
||||
$(gridId).html('<div class="hvac-grid-loading"><span class="dashicons dashicons-update-alt hvac-spin"></span> Loading ' + label + '...</div>');
|
||||
$('#hvac-trainer-grid').html('<div class="hvac-grid-loading"><span class="dashicons dashicons-update-alt hvac-spin"></span> Loading trainers...</div>');
|
||||
},
|
||||
|
||||
/**
|
||||
* Hide loading state
|
||||
*/
|
||||
hideLoading: function() {
|
||||
$('.hvac-grid-loading').remove();
|
||||
$('#hvac-trainer-grid .hvac-grid-loading').remove();
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
@ -1641,9 +1502,6 @@
|
|||
// Update search placeholder
|
||||
this.updateSearchPlaceholder(tab);
|
||||
|
||||
// Highlight markers for active tab
|
||||
this.highlightMarkersForTab(tab);
|
||||
|
||||
// Reset displayed count for current tab
|
||||
this.displayedCounts[tab] = 0;
|
||||
|
||||
|
|
|
|||
|
|
@ -112,10 +112,10 @@ final class HVAC_Plugin {
|
|||
*/
|
||||
private function defineConstants(): void {
|
||||
if (!defined('HVAC_PLUGIN_VERSION')) {
|
||||
define('HVAC_PLUGIN_VERSION', '2.2.18');
|
||||
define('HVAC_PLUGIN_VERSION', '2.2.11');
|
||||
}
|
||||
if (!defined('HVAC_VERSION')) {
|
||||
define('HVAC_VERSION', '2.2.18');
|
||||
define('HVAC_VERSION', '2.2.11');
|
||||
}
|
||||
if (!defined('HVAC_PLUGIN_FILE')) {
|
||||
define('HVAC_PLUGIN_FILE', dirname(__DIR__) . '/hvac-community-events.php');
|
||||
|
|
|
|||
|
|
@ -956,8 +956,8 @@ class HVAC_Training_Map_Data {
|
|||
$event_end = tribe_get_end_date($event->ID, false, 'U');
|
||||
$is_past = $event_end < time();
|
||||
|
||||
// Get cost (decode HTML entities so JS doesn't double-escape $ → $)
|
||||
$cost = html_entity_decode(tribe_get_formatted_cost($event->ID), ENT_QUOTES | ENT_HTML5, 'UTF-8');
|
||||
// Get cost
|
||||
$cost = tribe_get_formatted_cost($event->ID);
|
||||
if (empty($cost)) {
|
||||
$cost = 'Free';
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,15 +22,15 @@ $api_key_configured = $find_training->is_api_key_configured();
|
|||
|
||||
<div class="hvac-find-training-page">
|
||||
<!-- Skip link for accessibility -->
|
||||
<a href="#hvac-event-grid" class="hvac-skip-link">Skip to event results</a>
|
||||
<a href="#hvac-trainer-grid" class="hvac-skip-link">Skip to trainer results</a>
|
||||
|
||||
<!-- Compact Filter Bar -->
|
||||
<div class="hvac-filter-bar" role="search" aria-label="Filter events, trainers, and venues">
|
||||
<div class="hvac-filter-bar" role="search" aria-label="Filter trainers and venues">
|
||||
<div class="hvac-filter-bar-inner">
|
||||
<!-- Search -->
|
||||
<div class="hvac-filter-item hvac-filter-search">
|
||||
<span class="dashicons dashicons-search" aria-hidden="true"></span>
|
||||
<input type="text" id="hvac-training-search" placeholder="Search events..." aria-label="Search events">
|
||||
<input type="text" id="hvac-training-search" placeholder="Search trainers..." aria-label="Search trainers">
|
||||
</div>
|
||||
|
||||
<!-- Info Button -->
|
||||
|
|
@ -137,27 +137,31 @@ $api_key_configured = $find_training->is_api_key_configured();
|
|||
<div class="hvac-sidebar-header">
|
||||
<!-- Tab Navigation -->
|
||||
<div class="hvac-sidebar-tabs" role="tablist" aria-label="Browse by category">
|
||||
<button role="tab" class="hvac-tab active" data-tab="events" aria-selected="true" aria-controls="hvac-panel-events">
|
||||
<label class="hvac-marker-toggle hvac-marker-toggle-event" title="Show events on map" onclick="event.stopPropagation()">
|
||||
<input type="checkbox" id="hvac-show-events" checked>
|
||||
<span class="hvac-marker-checkbox"></span>
|
||||
</label>
|
||||
Events (<span data-count="events">0</span>)
|
||||
</button>
|
||||
<button role="tab" class="hvac-tab" data-tab="trainers" aria-selected="false" aria-controls="hvac-panel-trainers">
|
||||
<label class="hvac-marker-toggle hvac-marker-toggle-trainer" title="Show trainers on map" onclick="event.stopPropagation()">
|
||||
<input type="checkbox" id="hvac-show-trainers" checked>
|
||||
<span class="hvac-marker-checkbox"></span>
|
||||
</label>
|
||||
<button role="tab" class="hvac-tab active" data-tab="trainers" aria-selected="true" aria-controls="hvac-panel-trainers">
|
||||
Trainers (<span data-count="trainers">0</span>)
|
||||
</button>
|
||||
<button role="tab" class="hvac-tab" data-tab="venues" aria-selected="false" aria-controls="hvac-panel-venues">
|
||||
<label class="hvac-marker-toggle hvac-marker-toggle-venue" title="Show venues on map" onclick="event.stopPropagation()">
|
||||
<input type="checkbox" id="hvac-show-venues" checked>
|
||||
<span class="hvac-marker-checkbox"></span>
|
||||
</label>
|
||||
Venues (<span data-count="venues">0</span>)
|
||||
</button>
|
||||
<button role="tab" class="hvac-tab" data-tab="events" aria-selected="false" aria-controls="hvac-panel-events">
|
||||
Events (<span data-count="events">0</span>)
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Visibility Toggles (moved from map overlay) -->
|
||||
<div class="hvac-visibility-toggles">
|
||||
<label class="hvac-visibility-toggle" title="Show trainers on map">
|
||||
<input type="checkbox" id="hvac-show-trainers" checked>
|
||||
<span class="hvac-toggle-dot hvac-toggle-trainer"></span>
|
||||
</label>
|
||||
<label class="hvac-visibility-toggle" title="Show venues on map">
|
||||
<input type="checkbox" id="hvac-show-venues" checked>
|
||||
<span class="hvac-toggle-dot hvac-toggle-venue"></span>
|
||||
</label>
|
||||
<label class="hvac-visibility-toggle" title="Show events on map">
|
||||
<input type="checkbox" id="hvac-show-events" checked>
|
||||
<span class="hvac-toggle-dot hvac-toggle-event"></span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Mobile collapse toggle -->
|
||||
|
|
@ -171,26 +175,26 @@ $api_key_configured = $find_training->is_api_key_configured();
|
|||
</div>
|
||||
|
||||
<div id="hvac-sidebar-content" class="hvac-sidebar-content">
|
||||
<!-- Events Panel -->
|
||||
<div role="tabpanel" id="hvac-panel-events" class="hvac-tab-panel active" aria-labelledby="tab-events">
|
||||
<div id="hvac-event-grid" class="hvac-item-list">
|
||||
<!-- Trainers Panel -->
|
||||
<div role="tabpanel" id="hvac-panel-trainers" class="hvac-tab-panel active" aria-labelledby="tab-trainers">
|
||||
<div id="hvac-trainer-grid" class="hvac-item-list">
|
||||
<div class="hvac-grid-loading">
|
||||
<span class="dashicons dashicons-update-alt hvac-spin" aria-hidden="true"></span>
|
||||
Loading events...
|
||||
Loading trainers...
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Trainers Panel -->
|
||||
<div role="tabpanel" id="hvac-panel-trainers" class="hvac-tab-panel" aria-labelledby="tab-trainers" hidden>
|
||||
<div id="hvac-trainer-grid" class="hvac-item-list"></div>
|
||||
</div>
|
||||
|
||||
<!-- Venues Panel -->
|
||||
<div role="tabpanel" id="hvac-panel-venues" class="hvac-tab-panel" aria-labelledby="tab-venues" hidden>
|
||||
<div id="hvac-venue-grid" class="hvac-item-list"></div>
|
||||
</div>
|
||||
|
||||
<!-- Events Panel -->
|
||||
<div role="tabpanel" id="hvac-panel-events" class="hvac-tab-panel" aria-labelledby="tab-events" hidden>
|
||||
<div id="hvac-event-grid" class="hvac-item-list"></div>
|
||||
</div>
|
||||
|
||||
<!-- Load More Button -->
|
||||
<div class="hvac-load-more-wrapper" style="display: none;">
|
||||
<button type="button" id="hvac-load-more" class="hvac-btn-secondary">
|
||||
|
|
@ -225,11 +229,6 @@ $api_key_configured = $find_training->is_api_key_configured();
|
|||
<?php endif; ?>
|
||||
</div>
|
||||
|
||||
<!-- Reset Map View Button -->
|
||||
<button type="button" id="hvac-reset-map" class="hvac-reset-map-btn" aria-label="Reset map view" title="Reset map view">
|
||||
<span class="dashicons dashicons-image-rotate" aria-hidden="true"></span>
|
||||
</button>
|
||||
|
||||
<!-- Map Legend Overlay -->
|
||||
<div class="hvac-map-legend">
|
||||
<div class="hvac-legend-item">
|
||||
|
|
@ -336,9 +335,6 @@ $api_key_configured = $find_training->is_api_key_configured();
|
|||
<label for="venue-contact-message">Message</label>
|
||||
<textarea id="venue-contact-message" name="message" rows="4" placeholder="Tell us about your training needs..."></textarea>
|
||||
</div>
|
||||
<div class="hvac-form-group hvac-recaptcha-wrapper">
|
||||
<div class="g-recaptcha" data-sitekey="<?php echo esc_attr(class_exists('HVAC_Recaptcha') ? HVAC_Recaptcha::SITE_KEY : ''); ?>"></div>
|
||||
</div>
|
||||
<button type="submit" class="hvac-btn-primary">Send Message</button>
|
||||
</form>
|
||||
<div class="hvac-form-success" style="display: none;">
|
||||
|
|
|
|||
Loading…
Reference in a new issue