upskill-event-manager/assets/css/find-training-map.css
ben fcd55fd164 feat(find-training): Differentiate measureQuick Certified Champions from Trainers
Champions are identified by "Certified measureQuick Champion" certification.
Unlike Trainers, Champions do not offer public training, so they display
differently:

- White marker outline (vs green for Trainers)
- Show only state, not city, in sidebar and info windows
- No "View Profile" button or modal popup on click
- Sorted to end of trainer list (after all Trainers)
- Non-clickable card styling

Code review fixes (Gemini 3):
- Fixed location formatting to handle empty city gracefully
- Added secondary sort by name for stable ordering

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 02:01:15 -04:00

2161 lines
42 KiB
CSS

/**
* Find Training Page Styles
*
* Google Maps-style full-screen layout with sidebar and compact filter bar.
*
* @package HVAC_Community_Events
* @since 2.2.0
*/
/* ==========================================================================
CSS Custom Properties
========================================================================== */
:root {
--hvac-header-offset: 0px;
--hvac-primary: #00b3a4;
--hvac-primary-dark: #009688;
--hvac-secondary: #164B60;
--hvac-secondary-dark: #1a5a73;
--hvac-venue-color: #89c92e;
--hvac-trainer-color: #f0f7e8;
--hvac-event-color: #0ebaa6;
--hvac-text: #333;
--hvac-text-muted: #666;
--hvac-border: #e0e0e0;
--hvac-sidebar-width: 380px;
--hvac-filter-bar-height: auto;
}
/* Astra theme header offset */
body:not(.ast-header-break-point) .hvac-find-training-page {
--hvac-header-offset: 0px;
}
/* WordPress admin bar adjustment */
.admin-bar .hvac-find-training-page {
--hvac-header-offset: 32px;
}
@media (max-width: 782px) {
.admin-bar .hvac-find-training-page {
--hvac-header-offset: 46px;
}
}
/* ==========================================================================
Skip Link (Accessibility)
========================================================================== */
.hvac-skip-link {
position: absolute;
top: -40px;
left: 0;
background: var(--hvac-secondary);
color: #fff;
padding: 8px 16px;
z-index: 100000;
transition: top 0.2s;
}
.hvac-skip-link:focus {
top: 0;
outline: 2px solid var(--hvac-primary);
outline-offset: 2px;
}
/* ==========================================================================
Page Layout - Full Height
========================================================================== */
.hvac-find-training-page {
display: flex !important;
flex-direction: column !important;
height: 100vh !important;
height: 100dvh !important; /* Modern browsers - accounts for mobile browser UI */
overflow: hidden !important;
position: relative !important;
padding: 0 !important;
margin: 0 !important;
}
/* Remove default Astra container constraints */
.hvac-find-training-page .ast-container,
.hvac-find-training-page > .ast-container,
body .hvac-find-training-page {
max-width: none !important;
padding: 0 !important;
width: 100% !important;
}
/* ==========================================================================
Filter Bar - Fixed at Top
========================================================================== */
.hvac-filter-bar {
flex-shrink: 0;
background: #fff;
border-bottom: 1px solid var(--hvac-border);
padding: 12px 16px;
z-index: 100;
}
.hvac-filter-bar-inner {
display: flex !important;
flex-direction: row !important;
gap: 12px;
align-items: center;
flex-wrap: wrap;
max-width: 1600px;
margin: 0 auto;
}
/* Search Input */
.hvac-filter-search {
position: relative;
flex: 1;
min-width: 180px;
max-width: 300px;
}
.hvac-filter-search .dashicons {
position: absolute;
left: 12px;
top: 50%;
transform: translateY(-50%);
color: #999;
pointer-events: none;
}
.hvac-filter-search input {
width: 100%;
padding: 10px 12px 10px 38px;
font-size: 14px;
border: 1px solid var(--hvac-border);
border-radius: 6px;
transition: border-color 0.2s, box-shadow 0.2s;
}
.hvac-filter-search input:focus {
outline: none;
border-color: var(--hvac-primary);
box-shadow: 0 0 0 3px rgba(0, 179, 164, 0.15);
}
/* Filter Dropdowns */
.hvac-filter-dropdowns {
display: flex !important;
flex-direction: row !important;
gap: 10px;
}
.hvac-filter-select {
padding: 10px 32px 10px 12px;
font-size: 14px;
border: 1px solid var(--hvac-border);
border-radius: 6px;
background: #fff url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M2 4l4 4 4-4'/%3E%3C/svg%3E") no-repeat right 10px center;
cursor: pointer;
min-width: 130px;
appearance: none;
}
.hvac-filter-select:focus {
outline: none;
border-color: var(--hvac-primary);
}
/* Near Me Button */
.hvac-near-me-btn {
display: flex;
align-items: center;
gap: 6px;
padding: 10px 16px;
background: var(--hvac-secondary);
color: #fff;
border: none;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: background 0.2s;
white-space: nowrap;
}
.hvac-near-me-btn:hover {
background: var(--hvac-secondary-dark);
}
.hvac-near-me-btn:disabled {
background: #ccc;
cursor: not-allowed;
}
.hvac-near-me-btn.active {
background: var(--hvac-primary);
}
.hvac-near-me-btn .dashicons {
font-size: 16px;
width: 16px;
height: 16px;
}
/* Clear Filters Button */
.hvac-clear-filters {
padding: 10px 14px;
background: transparent;
color: var(--hvac-primary);
border: 1px solid var(--hvac-primary);
border-radius: 6px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s;
}
.hvac-clear-filters:hover {
background: var(--hvac-primary);
color: #fff;
}
/* Mobile Filter Toggle - Hidden on Desktop */
.hvac-mobile-filter-toggle {
display: none !important;
align-items: center;
gap: 6px;
padding: 10px 14px;
background: #f5f5f5;
color: var(--hvac-text);
border: 1px solid var(--hvac-border);
border-radius: 6px;
font-size: 14px;
cursor: pointer;
}
/* Sidebar Toggle - Hidden on Desktop */
.hvac-sidebar-toggle {
display: none !important;
}
.hvac-mobile-filter-toggle .dashicons {
font-size: 16px;
width: 16px;
height: 16px;
}
/* Active Filters Chips */
.hvac-active-filters {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 8px;
max-width: 1600px;
margin-left: auto;
margin-right: auto;
}
.hvac-active-filters:empty {
display: none;
}
.hvac-active-filter {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 5px 10px;
background: #e8f5f4;
color: #00736a;
border-radius: 20px;
font-size: 13px;
}
.hvac-active-filter button {
background: none;
border: none;
color: inherit;
cursor: pointer;
padding: 0;
line-height: 1;
font-size: 16px;
opacity: 0.7;
}
.hvac-active-filter button:hover {
opacity: 1;
}
/* Mobile Filter Panel */
.hvac-mobile-filter-panel {
display: none;
padding: 16px 0;
border-top: 1px solid var(--hvac-border);
margin-top: 12px;
}
.hvac-mobile-filter-panel:not([hidden]) {
display: flex;
flex-direction: column;
gap: 12px;
}
.hvac-mobile-filter-group label {
display: block;
font-size: 13px;
font-weight: 500;
color: var(--hvac-text-muted);
margin-bottom: 6px;
}
.hvac-mobile-filter-group .hvac-filter-select {
width: 100%;
}
/* ==========================================================================
Main Layout - CSS Grid for Sidebar + Map
========================================================================== */
.hvac-map-layout {
flex: 1 !important;
display: grid !important;
grid-template-areas: "sidebar map" !important;
grid-template-columns: var(--hvac-sidebar-width) 1fr !important;
overflow: hidden !important;
min-height: 0 !important; /* Prevent grid blowout */
}
/* ==========================================================================
Left Sidebar
========================================================================== */
.hvac-sidebar {
grid-area: sidebar !important;
background: #fff;
border-right: 1px solid var(--hvac-border);
display: flex !important;
flex-direction: column !important;
overflow: hidden !important;
min-height: 0 !important;
width: var(--hvac-sidebar-width) !important;
}
.hvac-sidebar-header {
flex-shrink: 0;
display: flex;
justify-content: space-between;
align-items: center;
padding: 14px 16px;
background: #f9fafb;
border-bottom: 1px solid var(--hvac-border);
}
.hvac-results-summary {
font-size: 14px;
font-weight: 600;
color: var(--hvac-secondary);
}
.hvac-results-summary #hvac-trainer-count {
font-size: 18px;
}
/* Sidebar Toggle styling (visibility controlled by media queries) */
.hvac-sidebar-toggle.hvac-sidebar-toggle {
align-items: center;
justify-content: center;
width: 32px;
height: 32px;
background: transparent;
border: none;
cursor: pointer;
border-radius: 4px;
}
.hvac-sidebar-toggle:hover {
background: #eee;
}
.hvac-sidebar-toggle .dashicons {
font-size: 20px;
width: 20px;
height: 20px;
color: var(--hvac-text-muted);
transition: transform 0.2s;
}
.hvac-sidebar.collapsed .hvac-sidebar-toggle .dashicons {
transform: rotate(180deg);
}
/* Sidebar Content - Scrollable */
.hvac-sidebar-content {
flex: 1;
overflow-y: auto;
padding: 16px;
display: flex;
flex-direction: column;
gap: 16px;
}
/* Trainer List */
.hvac-trainer-list {
display: flex;
flex-direction: column;
gap: 12px;
}
/* Loading State */
.hvac-grid-loading {
text-align: center;
padding: 40px 20px;
color: var(--hvac-text-muted);
}
.hvac-spin {
animation: hvac-spin 1s linear infinite;
}
@keyframes hvac-spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
/* Trainer Card - Compact for Sidebar */
.hvac-trainer-card {
background: #fff;
border: 1px solid var(--hvac-border);
border-radius: 8px;
padding: 14px;
cursor: pointer;
transition: border-color 0.2s, box-shadow 0.2s;
display: flex;
gap: 12px;
}
.hvac-trainer-card:hover {
border-color: var(--hvac-primary);
box-shadow: 0 2px 8px rgba(0, 179, 164, 0.15);
}
/* Champion Cards - Non-clickable appearance (Champions don't offer public training) */
.hvac-champion-card {
cursor: default;
opacity: 0.9;
}
.hvac-champion-card:hover {
border-color: var(--hvac-border);
box-shadow: none;
transform: none;
}
.hvac-trainer-card-image {
width: 56px;
height: 56px;
flex-shrink: 0;
position: relative;
}
.hvac-trainer-card-image img {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: 50%;
}
.hvac-trainer-card-avatar {
width: 100%;
height: 100%;
background: #e8f5f4;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.hvac-trainer-card-avatar .dashicons {
font-size: 24px;
color: var(--hvac-primary);
}
.hvac-mq-badge-small {
position: absolute;
bottom: -2px;
right: -2px;
width: 20px;
height: 20px;
}
.hvac-trainer-card-info {
flex: 1;
min-width: 0;
}
.hvac-trainer-card-name {
font-weight: 600;
color: var(--hvac-secondary);
margin-bottom: 3px;
font-size: 15px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.hvac-trainer-card-location {
color: var(--hvac-text-muted);
font-size: 13px;
margin-bottom: 6px;
}
.hvac-trainer-card-certs {
display: flex;
flex-wrap: wrap;
gap: 4px;
}
.hvac-cert-badge {
display: inline-block;
padding: 2px 6px;
background: #e8f5f4;
color: #00736a;
border-radius: 3px;
font-size: 11px;
font-weight: 500;
}
/* No Results */
.hvac-no-results {
text-align: center;
padding: 30px 20px;
color: var(--hvac-text-muted);
}
/* Load More Button */
.hvac-load-more-wrapper {
text-align: center;
padding-top: 8px;
}
#hvac-load-more {
width: 100%;
}
/* Sidebar CTA */
.hvac-sidebar-cta {
margin-top: auto;
padding: 16px;
background: #f8fafa;
border-radius: 8px;
text-align: center;
}
.hvac-sidebar-cta p {
font-size: 14px;
color: var(--hvac-text);
margin: 0 0 12px;
}
.hvac-btn-small {
padding: 10px 20px;
font-size: 14px;
}
/* ==========================================================================
Map Container
========================================================================== */
.hvac-map-container {
grid-area: map;
position: relative;
min-height: 0; /* Prevent grid blowout */
}
.hvac-google-map {
width: 100%;
height: 100%;
background: #f0f0f0;
}
/* Map Loading State */
.hvac-map-loading {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
color: var(--hvac-text-muted);
}
.hvac-map-loading .dashicons {
font-size: 48px;
width: 48px;
height: 48px;
margin-bottom: 15px;
color: var(--hvac-primary);
}
/* Map Error State */
.hvac-map-error {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
height: 100%;
color: var(--hvac-text-muted);
text-align: center;
padding: 30px;
}
.hvac-map-error .dashicons {
font-size: 48px;
width: 48px;
height: 48px;
margin-bottom: 15px;
color: #e57373;
}
.hvac-map-error a {
color: var(--hvac-primary);
}
/* Map Legend Overlay */
.hvac-map-legend {
position: absolute;
bottom: 24px;
left: 12px;
display: flex;
gap: 16px;
background: #fff;
padding: 10px 14px;
border-radius: 6px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
font-size: 13px;
z-index: 10;
}
.hvac-legend-item {
display: flex;
align-items: center;
gap: 6px;
color: var(--hvac-text);
}
.hvac-legend-marker {
width: 14px;
height: 14px;
border-radius: 50%;
}
.hvac-legend-trainer {
background: var(--hvac-trainer-color);
border: 2px solid #5a8a1a;
}
.hvac-legend-venue {
background: var(--hvac-venue-color);
}
.hvac-legend-event {
background: var(--hvac-event-color);
}
/* Map Toggles Overlay */
.hvac-map-toggles {
position: absolute;
top: 12px;
left: 12px;
display: flex;
gap: 12px;
background: #fff;
padding: 8px 12px;
border-radius: 6px;
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
z-index: 10;
}
.hvac-toggle-compact {
display: flex;
align-items: center;
gap: 6px;
cursor: pointer;
font-size: 13px;
color: var(--hvac-text);
}
.hvac-toggle-compact input {
width: 16px;
height: 16px;
accent-color: var(--hvac-primary);
}
/* ==========================================================================
Buttons
========================================================================== */
.hvac-btn-primary {
display: inline-block;
padding: 12px 24px;
background: var(--hvac-primary);
color: #fff;
border: none;
border-radius: 6px;
font-size: 15px;
font-weight: 600;
text-decoration: none;
cursor: pointer;
transition: background 0.2s;
text-align: center;
}
.hvac-btn-primary:hover {
background: var(--hvac-primary-dark);
color: #fff;
}
.hvac-btn-secondary {
display: inline-block;
padding: 10px 20px;
background: #fff;
color: var(--hvac-secondary);
border: 2px solid var(--hvac-secondary);
border-radius: 6px;
font-size: 14px;
font-weight: 600;
text-decoration: none;
cursor: pointer;
transition: all 0.2s;
}
.hvac-btn-secondary:hover {
background: var(--hvac-secondary);
color: #fff;
}
/* ==========================================================================
Modal Styles
========================================================================== */
.hvac-training-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 99999;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
.hvac-modal-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
}
.hvac-modal-content {
position: relative;
background: #fff;
border-radius: 12px;
max-width: 600px;
width: 100%;
max-height: 90vh;
overflow-y: auto;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
}
.hvac-modal-loading {
padding: 60px;
text-align: center;
color: var(--hvac-text-muted);
}
.hvac-modal-close {
position: absolute;
top: 16px;
right: 16px;
background: #f5f5f5;
border: none;
width: 36px;
height: 36px;
border-radius: 50%;
font-size: 24px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
z-index: 10;
}
.hvac-modal-close:hover {
background: #eee;
}
/* Trainer Modal Content */
.hvac-training-modal-header {
padding: 24px 24px 0;
}
.hvac-training-modal-header h2 {
color: var(--hvac-secondary);
font-size: 1.5rem;
margin: 0;
padding-right: 40px;
}
.hvac-training-modal-body {
padding: 24px;
}
.hvac-training-profile-section {
margin-bottom: 24px;
}
.hvac-training-profile-header {
display: flex;
gap: 20px;
margin-bottom: 20px;
}
.hvac-training-profile-image {
width: 100px;
height: 100px;
border-radius: 50%;
object-fit: cover;
}
.hvac-training-profile-avatar {
width: 100px;
height: 100px;
background: #e8f5f4;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.hvac-training-profile-avatar .dashicons {
font-size: 48px;
color: var(--hvac-primary);
}
.hvac-training-profile-info {
flex: 1;
}
.hvac-training-location {
color: var(--hvac-text-muted);
margin-bottom: 8px;
}
.hvac-training-certifications {
display: flex;
flex-wrap: wrap;
gap: 6px;
margin-bottom: 8px;
}
.hvac-training-company {
color: #555;
margin-bottom: 8px;
}
.hvac-training-events-count {
color: var(--hvac-text);
}
.hvac-training-detail {
padding: 10px 0;
border-bottom: 1px solid #eee;
}
.hvac-training-events {
margin-top: 20px;
}
.hvac-training-events h4 {
color: var(--hvac-secondary);
margin-bottom: 12px;
}
.hvac-events-list {
list-style: none;
padding: 0;
margin: 0;
}
.hvac-events-list li {
padding: 8px 0;
border-bottom: 1px solid #eee;
}
.hvac-events-list li:last-child {
border-bottom: none;
}
.hvac-events-list a {
color: var(--hvac-primary);
text-decoration: none;
}
.hvac-events-list a:hover {
text-decoration: underline;
}
.hvac-event-date {
display: block;
font-size: 13px;
color: var(--hvac-text-muted);
margin-top: 2px;
}
/* Contact Form in Modal */
.hvac-training-contact-section {
border-top: 1px solid #eee;
padding-top: 24px;
}
.hvac-training-contact-section h4 {
color: var(--hvac-secondary);
margin-bottom: 16px;
}
.hvac-training-contact-form .hvac-form-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
margin-bottom: 12px;
}
.hvac-training-contact-form .hvac-form-field {
margin-bottom: 12px;
}
.hvac-training-contact-form input,
.hvac-training-contact-form textarea {
width: 100%;
padding: 10px 12px;
font-size: 14px;
border: 1px solid #ddd;
border-radius: 6px;
}
.hvac-training-contact-form input:focus,
.hvac-training-contact-form textarea:focus {
outline: none;
border-color: var(--hvac-primary);
}
.hvac-form-message {
padding: 12px 16px;
border-radius: 6px;
margin-top: 16px;
}
.hvac-form-success {
background: #d4edda;
color: #155724;
}
.hvac-form-error {
background: #f8d7da;
color: #721c24;
}
/* Venue Modal */
.hvac-venue-modal-header {
padding: 24px 24px 0;
}
.hvac-venue-modal-header h2 {
color: var(--hvac-secondary);
font-size: 1.5rem;
margin: 0;
padding-right: 40px;
}
.hvac-venue-modal-body {
padding: 24px;
}
.hvac-venue-address {
color: var(--hvac-text-muted);
margin-bottom: 20px;
}
.hvac-venue-events h4 {
color: var(--hvac-secondary);
margin-bottom: 12px;
}
.hvac-venue-events-list {
list-style: none;
padding: 0;
margin: 0 0 20px;
}
.hvac-venue-events-list li {
padding: 8px 0;
border-bottom: 1px solid #eee;
}
.hvac-venue-directions {
display: inline-flex;
align-items: center;
gap: 6px;
}
/* ==========================================================================
Google Maps Info Windows
========================================================================== */
.hvac-info-window {
padding: 12px;
max-width: 280px;
}
.hvac-info-window-title {
font-weight: 600;
color: var(--hvac-secondary);
margin-bottom: 6px;
font-size: 15px;
}
.hvac-info-window-location {
color: var(--hvac-text-muted);
font-size: 13px;
margin-bottom: 8px;
}
.hvac-info-window-cert {
display: inline-block;
padding: 3px 8px;
background: #e8f5f4;
color: #00736a;
border-radius: 4px;
font-size: 12px;
margin-bottom: 10px;
}
.hvac-info-window-btn {
display: inline-block;
padding: 8px 16px;
background: var(--hvac-primary);
color: #fff;
border: none;
border-radius: 4px;
font-size: 13px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
}
.hvac-info-window-btn:hover {
background: var(--hvac-primary-dark);
}
/* Venue Info Window */
.hvac-info-window-venue {
padding: 12px;
max-width: 250px;
}
.hvac-info-window-address {
color: var(--hvac-text-muted);
font-size: 13px;
margin-bottom: 8px;
}
.hvac-info-window-events-count {
font-size: 13px;
color: #00736a;
margin-bottom: 10px;
}
/* Event Info Window */
.hvac-info-window-event {
padding: 12px;
max-width: 280px;
}
.hvac-info-window-event .hvac-info-window-title {
font-weight: 600;
color: var(--hvac-secondary);
margin-bottom: 6px;
font-size: 15px;
}
.hvac-info-window-date {
color: var(--hvac-text);
font-size: 13px;
margin-bottom: 4px;
}
.hvac-info-window-date .dashicons {
font-size: 14px;
width: 14px;
height: 14px;
vertical-align: middle;
margin-right: 4px;
color: var(--hvac-event-color);
}
.hvac-info-window-venue-name {
color: var(--hvac-text-muted);
font-size: 13px;
margin-bottom: 8px;
}
.hvac-info-window-cost {
display: inline-block;
padding: 3px 8px;
background: #e8f5f4;
color: #00736a;
border-radius: 4px;
font-size: 12px;
font-weight: 500;
margin-bottom: 10px;
}
.hvac-info-window-cost.hvac-free {
background: #d1fae5;
color: #065f46;
}
.hvac-info-window-past-badge {
display: inline-block;
padding: 3px 8px;
background: #f3f4f6;
color: #6b7280;
border-radius: 4px;
font-size: 11px;
font-weight: 500;
margin-left: 6px;
}
.hvac-info-window-event-link {
display: inline-block;
padding: 8px 16px;
background: var(--hvac-event-color);
color: #fff;
border: none;
border-radius: 4px;
font-size: 13px;
font-weight: 500;
cursor: pointer;
text-decoration: none;
}
.hvac-info-window-event-link:hover {
background: #0ca696;
color: #fff;
}
/* Filter checkbox for Include Past Events */
.hvac-filter-checkbox {
display: flex;
align-items: center;
gap: 6px;
padding: 10px 0;
font-size: 14px;
color: var(--hvac-text);
cursor: pointer;
white-space: nowrap;
}
.hvac-filter-checkbox input[type="checkbox"] {
width: 16px;
height: 16px;
accent-color: var(--hvac-event-color);
}
/* ==========================================================================
Location Error Message
========================================================================== */
.hvac-location-error {
display: flex;
align-items: center;
gap: 8px;
margin-top: 10px;
padding: 10px 14px;
background: #fef2f2;
border: 1px solid #fecaca;
border-radius: 6px;
color: #991b1b;
font-size: 0.875rem;
}
.hvac-location-error .dashicons {
color: #dc2626;
flex-shrink: 0;
}
.hvac-location-error .hvac-dismiss-error {
margin-left: auto;
background: none;
border: none;
color: #991b1b;
cursor: pointer;
font-size: 1.25rem;
line-height: 1;
padding: 0;
opacity: 0.7;
}
.hvac-location-error .hvac-dismiss-error:hover {
opacity: 1;
}
/* ==========================================================================
Tablet Responsive (768px - 991px)
========================================================================== */
@media (max-width: 991px) {
:root {
--hvac-sidebar-width: 320px;
}
/* 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 1fr !important;
}
.hvac-sidebar {
border-right: none;
border-top: 1px solid var(--hvac-border);
max-height: 45vh;
}
/* Show sidebar toggle on tablet/mobile */
.hvac-sidebar-toggle {
display: flex !important;
}
/* Collapsible sidebar */
.hvac-sidebar.collapsed {
max-height: 80px;
overflow: hidden;
}
.hvac-sidebar.collapsed .hvac-sidebar-content {
display: none;
}
/* Hide filter dropdowns, show toggle */
.hvac-filter-dropdowns {
display: none !important;
}
.hvac-mobile-filter-toggle {
display: flex !important;
}
/* Override sidebar width for tablet/mobile */
.hvac-sidebar {
width: 100% !important;
}
/* Adjust map overlays */
.hvac-map-legend {
bottom: 12px;
left: 8px;
padding: 8px 10px;
font-size: 12px;
}
/* Tabs on tablet */
.hvac-sidebar-header {
flex-direction: row;
align-items: center;
flex-wrap: wrap;
gap: 8px;
}
.hvac-sidebar-tabs {
flex: 1;
min-width: 0;
margin: 0;
padding: 0;
}
.hvac-tab {
padding: 8px 4px;
font-size: 12px;
}
.hvac-visibility-toggles {
gap: 8px;
padding: 4px 0;
}
.hvac-toggle-dot {
width: 14px;
height: 14px;
}
}
/* ==========================================================================
Mobile Responsive (<768px)
========================================================================== */
@media (max-width: 767px) {
.hvac-map-layout {
grid-template-rows: 50vh 1fr;
}
.hvac-sidebar {
max-height: 50vh;
}
/* Filter bar adjustments */
.hvac-filter-bar {
padding: 10px 12px;
}
.hvac-filter-bar-inner {
gap: 8px;
}
.hvac-filter-search {
min-width: 0;
max-width: none;
flex: 1;
}
.hvac-filter-search input {
padding: 8px 10px 8px 34px;
font-size: 14px;
}
.hvac-near-me-btn {
padding: 8px 12px;
}
.hvac-near-me-btn .hvac-btn-text {
display: none;
}
.hvac-mobile-filter-toggle {
padding: 8px 12px;
}
.hvac-mobile-filter-toggle .hvac-btn-text {
display: none;
}
.hvac-clear-filters {
padding: 8px 12px;
font-size: 13px;
}
.hvac-info-btn {
width: 32px;
height: 32px;
}
/* Sidebar adjustments */
.hvac-sidebar-header {
padding: 10px 12px;
}
.hvac-sidebar-content {
padding: 12px;
}
/* Tab adjustments */
.hvac-sidebar-tabs {
margin: 0 -12px;
padding: 0 12px;
}
.hvac-tab {
padding: 6px 2px;
font-size: 11px;
}
.hvac-visibility-toggles {
display: none;
}
.hvac-trainer-card,
.hvac-venue-card,
.hvac-event-card {
padding: 12px;
}
.hvac-trainer-card-image,
.hvac-venue-card-icon,
.hvac-event-card-date {
width: 44px;
height: 44px;
}
.hvac-trainer-card-name,
.hvac-venue-card-name,
.hvac-event-card-title {
font-size: 13px;
}
.hvac-trainer-card-location,
.hvac-venue-card-location,
.hvac-event-card-venue {
font-size: 11px;
}
.hvac-event-card-month {
font-size: 9px;
}
.hvac-event-card-day {
font-size: 16px;
}
/* Modal adjustments */
.hvac-modal-content {
max-height: 85vh;
border-radius: 12px 12px 0 0;
margin-top: auto;
}
.hvac-training-profile-header {
flex-direction: column;
align-items: center;
text-align: center;
}
.hvac-training-contact-form .hvac-form-row {
grid-template-columns: 1fr;
}
}
/* ==========================================================================
Small Mobile (<480px)
========================================================================== */
@media (max-width: 480px) {
.hvac-map-layout {
grid-template-rows: 45vh 1fr;
}
.hvac-sidebar {
max-height: 55vh;
}
.hvac-map-legend {
flex-direction: column;
gap: 6px;
bottom: 8px;
left: 6px;
padding: 6px 10px;
}
.hvac-map-toggles {
flex-direction: column;
gap: 4px;
top: 6px;
left: 6px;
padding: 6px 10px;
}
}
/* ==========================================================================
Equipment & Amenities Badges
========================================================================== */
.hvac-badge-list {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-bottom: 16px;
}
.hvac-badge {
display: inline-block;
padding: 4px 12px;
border-radius: 16px;
font-size: 13px;
font-weight: 500;
}
.hvac-badge-equipment {
background: #e6f7f5;
color: #00736a;
border: 1px solid #00a89d;
}
.hvac-badge-amenity {
background: #f5f5f5;
color: #555;
border: 1px solid #ddd;
}
/* ==========================================================================
Enhanced Venue Modal
========================================================================== */
.hvac-venue-modal-content {
max-width: 600px;
}
.hvac-venue-phone,
.hvac-venue-capacity {
color: var(--hvac-text);
margin-bottom: 8px;
font-size: 14px;
}
.hvac-venue-description {
margin-bottom: 20px;
padding: 16px;
background: #f9fafb;
border-radius: 8px;
font-size: 14px;
line-height: 1.6;
color: var(--hvac-text);
}
.hvac-venue-equipment,
.hvac-venue-amenities {
margin-bottom: 20px;
}
.hvac-venue-equipment h4,
.hvac-venue-amenities h4 {
font-size: 14px;
font-weight: 600;
color: var(--hvac-secondary);
margin-bottom: 10px;
}
.hvac-venue-actions {
margin-bottom: 24px;
}
.hvac-venue-no-events {
color: var(--hvac-text-muted);
font-style: italic;
margin-bottom: 20px;
}
/* ==========================================================================
Venue Contact Form
========================================================================== */
.hvac-venue-contact-section {
border-top: 1px solid #eee;
padding-top: 24px;
margin-top: 24px;
}
.hvac-venue-contact-section h4 {
color: var(--hvac-secondary);
margin-bottom: 16px;
font-size: 16px;
}
.hvac-venue-contact-form .hvac-form-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 12px;
margin-bottom: 12px;
}
.hvac-venue-contact-form .hvac-form-group {
margin-bottom: 12px;
}
.hvac-venue-contact-form label {
display: block;
font-size: 13px;
font-weight: 500;
color: var(--hvac-text);
margin-bottom: 4px;
}
.hvac-venue-contact-form label .required {
color: #dc2626;
}
.hvac-venue-contact-form input,
.hvac-venue-contact-form textarea {
width: 100%;
padding: 10px 12px;
font-size: 14px;
border: 1px solid #ddd;
border-radius: 6px;
background: #fff;
transition: border-color 0.2s;
}
.hvac-venue-contact-form input:focus,
.hvac-venue-contact-form textarea:focus {
outline: none;
border-color: var(--hvac-primary);
box-shadow: 0 0 0 3px rgba(0, 168, 157, 0.1);
}
.hvac-venue-contact-form textarea {
resize: vertical;
min-height: 80px;
}
.hvac-venue-contact-form button[type="submit"] {
width: 100%;
margin-top: 8px;
}
.hvac-venue-contact-section .hvac-form-success,
.hvac-venue-contact-section .hvac-form-error {
display: flex;
align-items: flex-start;
gap: 12px;
padding: 16px;
border-radius: 8px;
margin-top: 16px;
}
.hvac-venue-contact-section .hvac-form-success {
background: #d1fae5;
color: #065f46;
}
.hvac-venue-contact-section .hvac-form-error {
background: #fee2e2;
color: #991b1b;
}
.hvac-venue-contact-section .hvac-form-success .dashicons,
.hvac-venue-contact-section .hvac-form-error .dashicons {
font-size: 24px;
margin-top: 2px;
}
.hvac-venue-contact-section .hvac-form-success p,
.hvac-venue-contact-section .hvac-form-error p {
margin: 0;
font-size: 14px;
}
/* Responsive venue contact form */
@media (max-width: 600px) {
.hvac-venue-contact-form .hvac-form-row {
grid-template-columns: 1fr;
}
}
/* ==========================================================================
reCAPTCHA Widget Styles
========================================================================== */
.hvac-recaptcha-wrapper {
margin: 16px 0;
}
/* Ensure reCAPTCHA widget fits in narrow modal/form containers */
.hvac-recaptcha-wrapper .g-recaptcha {
transform-origin: left top;
}
.hvac-training-contact-form .hvac-recaptcha-wrapper,
.hvac-venue-contact-form .hvac-recaptcha-wrapper {
margin: 12px 0;
}
/* Scale down reCAPTCHA on very narrow screens */
@media (max-width: 400px) {
.hvac-recaptcha-wrapper .g-recaptcha {
transform: scale(0.9);
margin-right: -30px;
}
}
/* Scale for very narrow modals */
@media (max-width: 340px) {
.hvac-recaptcha-wrapper .g-recaptcha {
transform: scale(0.77);
margin-right: -70px;
}
}
/* ==========================================================================
Sidebar Tabs
========================================================================== */
.hvac-sidebar-header {
flex-direction: column;
align-items: stretch;
gap: 10px;
}
.hvac-sidebar-tabs {
display: flex;
gap: 0;
border-bottom: 2px solid var(--hvac-border);
margin: 0 -16px;
padding: 0 16px;
}
.hvac-tab {
flex: 1;
padding: 10px 8px;
background: transparent;
border: none;
border-bottom: 2px solid transparent;
margin-bottom: -2px;
font-size: 13px;
font-weight: 500;
color: var(--hvac-text-muted);
cursor: pointer;
transition: all 0.2s;
white-space: nowrap;
}
.hvac-tab:hover {
color: var(--hvac-secondary);
background: #f5f5f5;
}
.hvac-tab.active {
color: var(--hvac-primary);
border-bottom-color: var(--hvac-primary);
}
.hvac-tab:focus {
outline: none;
box-shadow: inset 0 0 0 2px rgba(0, 179, 164, 0.3);
}
.hvac-tab [data-count] {
font-weight: 600;
}
/* Visibility Toggles */
.hvac-visibility-toggles {
display: flex;
align-items: center;
gap: 12px;
padding: 8px 0;
}
.hvac-visibility-toggle {
display: flex;
align-items: center;
cursor: pointer;
}
.hvac-visibility-toggle input {
position: absolute;
opacity: 0;
width: 0;
height: 0;
}
.hvac-toggle-dot {
width: 18px;
height: 18px;
border-radius: 50%;
border: 2px solid;
transition: all 0.2s;
}
.hvac-toggle-trainer {
background: var(--hvac-trainer-color);
border-color: #5a8a1a;
}
.hvac-toggle-venue {
background: var(--hvac-venue-color);
border-color: #6fa024;
}
.hvac-toggle-event {
background: var(--hvac-event-color);
border-color: #0a9a8a;
}
.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 */
.hvac-tab-panel {
display: none;
}
.hvac-tab-panel.active {
display: block;
}
.hvac-item-list {
display: flex;
flex-direction: column;
gap: 12px;
}
/* ==========================================================================
Venue Cards
========================================================================== */
.hvac-venue-card {
background: #fff;
border: 1px solid var(--hvac-border);
border-radius: 8px;
padding: 14px;
cursor: pointer;
transition: border-color 0.2s, box-shadow 0.2s;
display: flex;
gap: 12px;
}
.hvac-venue-card:hover {
border-color: var(--hvac-venue-color);
box-shadow: 0 2px 8px rgba(137, 201, 46, 0.15);
}
.hvac-venue-card-icon {
width: 48px;
height: 48px;
flex-shrink: 0;
background: #f0f9e8;
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
}
.hvac-venue-card-icon .dashicons {
font-size: 24px;
width: 24px;
height: 24px;
color: var(--hvac-venue-color);
}
.hvac-venue-card-info {
flex: 1;
min-width: 0;
}
.hvac-venue-card-name {
font-weight: 600;
color: var(--hvac-secondary);
margin-bottom: 3px;
font-size: 14px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.hvac-venue-card-location {
color: var(--hvac-text-muted);
font-size: 12px;
margin-bottom: 4px;
}
.hvac-venue-card-events {
font-size: 12px;
color: var(--hvac-venue-color);
font-weight: 500;
}
/* ==========================================================================
Event Cards
========================================================================== */
.hvac-event-card {
background: #fff;
border: 1px solid var(--hvac-border);
border-radius: 8px;
padding: 14px;
cursor: pointer;
transition: border-color 0.2s, box-shadow 0.2s;
display: flex;
gap: 12px;
}
.hvac-event-card:hover {
border-color: var(--hvac-event-color);
box-shadow: 0 2px 8px rgba(14, 186, 166, 0.15);
}
.hvac-event-card.hvac-event-past {
opacity: 0.7;
}
.hvac-event-card-date {
width: 48px;
flex-shrink: 0;
background: var(--hvac-event-color);
border-radius: 8px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 6px;
color: #fff;
}
.hvac-event-card.hvac-event-past .hvac-event-card-date {
background: #9ca3af;
}
.hvac-event-card-month {
font-size: 10px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.5px;
}
.hvac-event-card-day {
font-size: 18px;
font-weight: 700;
line-height: 1;
}
.hvac-event-card-info {
flex: 1;
min-width: 0;
}
.hvac-event-card-title {
font-weight: 600;
color: var(--hvac-secondary);
margin-bottom: 3px;
font-size: 14px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.hvac-event-card-venue {
color: var(--hvac-text-muted);
font-size: 12px;
margin-bottom: 4px;
}
.hvac-event-card-meta {
display: flex;
align-items: center;
gap: 8px;
}
.hvac-event-card-cost {
font-size: 12px;
font-weight: 600;
color: var(--hvac-primary);
}
.hvac-event-card-cost.hvac-free {
color: #059669;
}
.hvac-event-card-past-badge {
font-size: 10px;
padding: 2px 6px;
background: #f3f4f6;
color: #6b7280;
border-radius: 3px;
font-weight: 500;
}
/* ==========================================================================
Info Button & Modal
========================================================================== */
.hvac-info-btn {
display: flex;
align-items: center;
justify-content: center;
width: 36px;
height: 36px;
background: #f5f5f5;
border: 1px solid var(--hvac-border);
border-radius: 50%;
cursor: pointer;
transition: all 0.2s;
flex-shrink: 0;
}
.hvac-info-btn:hover {
background: var(--hvac-primary);
border-color: var(--hvac-primary);
color: #fff;
}
.hvac-info-btn .dashicons {
font-size: 18px;
width: 18px;
height: 18px;
color: var(--hvac-text-muted);
}
.hvac-info-btn:hover .dashicons {
color: #fff;
}
/* Info Modal Content */
.hvac-info-modal-content {
max-width: 560px;
}
.hvac-info-modal-header {
padding: 24px 24px 0;
position: relative;
}
.hvac-info-modal-header h2 {
color: var(--hvac-secondary);
font-size: 1.5rem;
margin: 0;
padding-right: 40px;
}
.hvac-info-modal-body {
padding: 24px;
}
.hvac-info-section {
margin-bottom: 24px;
}
.hvac-info-section:last-child {
margin-bottom: 0;
}
.hvac-info-section h3 {
font-size: 1rem;
font-weight: 600;
color: var(--hvac-secondary);
margin: 0 0 12px;
}
.hvac-info-section p {
font-size: 14px;
line-height: 1.6;
color: var(--hvac-text);
margin: 0;
}
.hvac-info-list {
list-style: none;
padding: 0;
margin: 0;
}
.hvac-info-list li {
font-size: 14px;
line-height: 1.5;
color: var(--hvac-text);
padding: 8px 0;
border-bottom: 1px solid #f3f4f6;
}
.hvac-info-list li:last-child {
border-bottom: none;
}
.hvac-info-list li strong {
color: var(--hvac-secondary);
}
/* Info Modal Legend */
.hvac-info-legend {
display: flex;
flex-direction: column;
gap: 12px;
}
.hvac-info-legend-item {
display: flex;
align-items: flex-start;
gap: 12px;
padding: 10px;
background: #f9fafb;
border-radius: 8px;
}
.hvac-info-legend-item .hvac-legend-marker {
margin-top: 4px;
flex-shrink: 0;
}
.hvac-info-legend-item strong {
display: block;
font-size: 14px;
color: var(--hvac-secondary);
margin-bottom: 2px;
}
.hvac-info-legend-item p {
font-size: 13px;
color: var(--hvac-text-muted);
margin: 0;
}
/* ==========================================================================
Empty States
========================================================================== */
.hvac-empty-state {
text-align: center;
padding: 40px 20px;
color: var(--hvac-text-muted);
}
.hvac-empty-state .dashicons {
font-size: 48px;
width: 48px;
height: 48px;
color: #ddd;
margin-bottom: 12px;
}
.hvac-empty-state p {
font-size: 14px;
margin: 0;
}
/* ==========================================================================
Print Styles
========================================================================== */
@media print {
.hvac-find-training-page {
height: auto;
overflow: visible;
}
.hvac-filter-bar,
.hvac-map-container,
.hvac-sidebar-toggle,
.hvac-load-more-wrapper,
.hvac-sidebar-cta {
display: none;
}
.hvac-map-layout {
display: block;
}
.hvac-sidebar {
max-height: none;
border: none;
}
.hvac-trainer-card {
break-inside: avoid;
}
}