Files
thrillwiki_django_no_react/apps/parks/static/parks/css/search.css
2025-09-21 20:19:12 -04:00

1245 lines
27 KiB
CSS

/* ===============================================
ENHANCED SEARCH CSS - COMPREHENSIVE STYLING
=============================================== */
/* CSS Variables for Theme Colors */
:root {
--primary-blue: #3b82f6;
--primary-purple: #8b5cf6;
--primary-green: #10b981;
--primary-yellow: #f59e0b;
--primary-red: #ef4444;
--primary-pink: #ec4899;
--primary-indigo: #6366f1;
--primary-teal: #14b8a6;
--gradient-primary: linear-gradient(135deg, var(--primary-blue), var(--primary-purple));
--gradient-success: linear-gradient(135deg, var(--primary-green), var(--primary-teal));
--gradient-warning: linear-gradient(135deg, var(--primary-yellow), #fb923c);
--gradient-danger: linear-gradient(135deg, var(--primary-red), var(--primary-pink));
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
--timing-fast: 150ms;
--timing-normal: 300ms;
--timing-slow: 500ms;
--easing-smooth: cubic-bezier(0.4, 0, 0.2, 1);
--easing-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
}
/* Enhanced Loading States and Indicators */
.htmx-request .htmx-indicator {
opacity: 1;
transform: scale(1);
}
.htmx-request.htmx-indicator {
opacity: 1;
transform: scale(1);
}
.htmx-indicator {
opacity: 0;
transform: scale(0.8);
transition: all var(--timing-normal) var(--easing-smooth);
}
/* Enhanced Loading Animations */
@keyframes loading-pulse {
0%, 100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.5;
transform: scale(0.98);
}
}
@keyframes shimmer {
0% {
background-position: -200px 0;
}
100% {
background-position: calc(200px + 100%) 0;
}
}
@keyframes skeleton-loading {
0% {
opacity: 1;
}
50% {
opacity: 0.4;
}
100% {
opacity: 1;
}
}
@keyframes ripple {
0% {
transform: scale(0);
opacity: 1;
}
100% {
transform: scale(4);
opacity: 0;
}
}
@keyframes bounce-in {
0% {
transform: scale(0.3);
opacity: 0;
}
50% {
transform: scale(1.05);
}
70% {
transform: scale(0.9);
}
100% {
transform: scale(1);
opacity: 1;
}
}
@keyframes slide-up {
from {
transform: translateY(30px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
@keyframes fade-in-scale {
from {
transform: scale(0.95);
opacity: 0;
}
to {
transform: scale(1);
opacity: 1;
}
}
.htmx-request {
animation: loading-pulse 1.5s ease-in-out infinite;
}
/* Enhanced Skeleton Loaders */
.skeleton {
background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
background-size: 200px 100%;
animation: shimmer 1.5s infinite;
border-radius: 8px;
}
.skeleton-card {
animation: skeleton-loading 1.5s ease-in-out infinite;
}
.skeleton-text {
height: 1rem;
margin: 0.5rem 0;
border-radius: 4px;
}
.skeleton-title {
height: 1.5rem;
width: 70%;
margin-bottom: 1rem;
border-radius: 6px;
}
.skeleton-avatar {
width: 3rem;
height: 3rem;
border-radius: 50%;
}
/* Dark mode skeletons */
.dark .skeleton {
background: linear-gradient(90deg, #374151 25%, #4b5563 50%, #374151 75%);
background-size: 200px 100%;
}
/* Results container transitions */
#park-results {
transition: all var(--timing-normal) var(--easing-smooth);
}
.htmx-request #park-results {
opacity: 0.7;
transform: scale(0.98);
}
.htmx-settling #park-results {
opacity: 1;
transform: scale(1);
}
/* ===============================================
ENHANCED INTERACTIVE ELEMENTS & MICRO-INTERACTIONS
=============================================== */
/* Ripple Effect Component */
.ripple-effect {
position: relative;
overflow: hidden;
}
.ripple-effect::before {
content: '';
position: absolute;
top: 50%;
left: 50%;
width: 0;
height: 0;
border-radius: 50%;
background: rgba(255, 255, 255, 0.5);
transform: translate(-50%, -50%);
transition: width 0.6s, height 0.6s;
}
.ripple-effect:active::before {
width: 300px;
height: 300px;
}
/* Enhanced Filter UI Components */
.quick-filter-btn {
position: relative;
overflow: hidden;
display: inline-flex;
align-items: center;
padding: 0.75rem 1.5rem;
font-size: 0.875rem;
font-weight: 500;
border-radius: 0.75rem;
transition: all var(--timing-normal) var(--easing-smooth);
border: 1px solid transparent;
background: var(--gradient-primary);
color: white;
box-shadow: var(--shadow-md);
}
.quick-filter-btn:hover {
transform: translateY(-2px) scale(1.02);
box-shadow: var(--shadow-xl);
}
.quick-filter-btn:active {
transform: translateY(0) scale(0.98);
transition: all var(--timing-fast) var(--easing-smooth);
}
.quick-filter-btn.inactive {
background: white;
color: #6b7280;
border-color: #e5e7eb;
}
.dark .quick-filter-btn.inactive {
background: #374151;
color: #9ca3af;
border-color: #4b5563;
}
.filter-count {
font-size: 0.75rem;
opacity: 0.75;
margin-left: 0.25rem;
animation: bounce-in var(--timing-normal) var(--easing-bounce);
}
/* Enhanced Filter Chips with Micro-interactions */
.filter-chip {
display: inline-flex;
align-items: center;
padding: 0.5rem 1rem;
border-radius: 9999px;
font-size: 0.875rem;
background: linear-gradient(135deg, #dbeafe, #bfdbfe);
color: #1e40af;
transition: all var(--timing-normal) var(--easing-smooth);
animation: slide-up var(--timing-normal) var(--easing-smooth);
cursor: pointer;
border: 1px solid #93c5fd;
}
.dark .filter-chip {
background: linear-gradient(135deg, #1e3a8a, #1e40af);
color: #bfdbfe;
border-color: #3b82f6;
}
.filter-chip:hover {
transform: translateY(-2px) scale(1.05);
box-shadow: var(--shadow-lg);
background: linear-gradient(135deg, #bfdbfe, #93c5fd);
}
.dark .filter-chip:hover {
background: linear-gradient(135deg, #1e40af, #2563eb);
}
.filter-chip .remove-btn {
margin-left: 0.5rem;
display: inline-flex;
align-items: center;
justify-content: center;
width: 1rem;
height: 1rem;
color: currentColor;
opacity: 0.7;
transition: all var(--timing-fast) var(--easing-smooth);
border-radius: 50%;
}
.filter-chip .remove-btn:hover {
transform: scale(1.2) rotate(90deg);
opacity: 1;
background: rgba(239, 68, 68, 0.1);
color: #ef4444;
}
@keyframes slideIn {
from {
opacity: 0;
transform: translateX(-10px);
}
to {
opacity: 1;
transform: translateX(0);
}
}
/* Enhanced Search Input */
.search-input {
@apply transition-all duration-200 ease-in-out;
}
.search-input:focus {
@apply ring-2 ring-blue-500 border-blue-500;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
/* Enhanced Form Controls */
.filter-field select,
.filter-field input[type="text"],
.filter-field input[type="number"],
.filter-field input[type="search"],
.form-field-wrapper input,
.form-field-wrapper select {
@apply transition-all duration-200 ease-in-out;
@apply border-gray-300 dark:border-gray-600 dark:bg-gray-700 dark:text-white;
@apply focus:border-blue-500 focus:ring-blue-500;
@apply rounded-md shadow-sm;
}
.filter-field select:focus,
.filter-field input:focus,
.form-field-wrapper input:focus,
.form-field-wrapper select:focus {
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
.filter-field input[type="checkbox"],
.form-field-wrapper input[type="checkbox"] {
@apply rounded transition-colors duration-200;
@apply text-blue-600 focus:ring-blue-500;
@apply border-gray-300 dark:border-gray-600;
}
/* Enhanced Status Indicators */
.status-indicator {
@apply inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium;
animation: fadeIn 0.3s ease-out;
}
.status-indicator.filtered {
@apply bg-blue-100 text-blue-800 dark:bg-blue-800 dark:text-blue-100;
}
.status-indicator.loading {
@apply bg-yellow-100 text-yellow-800 dark:bg-yellow-800 dark:text-yellow-100;
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
/* Grid/List transitions */
.park-card {
transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1);
position: relative;
background-color: white;
border-radius: 0.75rem;
border: 1px solid #e5e7eb;
}
/* Grid view styles */
.park-card[data-view-mode="grid"] {
display: flex;
flex-direction: column;
}
.park-card[data-view-mode="grid"]:hover {
transform: translateY(-4px);
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
}
/* List view styles */
.park-card[data-view-mode="list"] {
display: flex;
gap: 1rem;
padding: 1rem;
}
.park-card[data-view-mode="list"]:hover {
background-color: #f9fafb;
transform: translateX(4px);
}
/* Image containers */
.park-card .image-container {
position: relative;
overflow: hidden;
border-radius: 0.5rem;
}
.park-card[data-view-mode="grid"] .image-container {
aspect-ratio: 16 / 9;
width: 100%;
}
.park-card[data-view-mode="list"] .image-container {
width: 6rem;
height: 6rem;
flex-shrink: 0;
}
/* Content */
.park-card .content {
display: flex;
flex-direction: column;
flex: 1;
min-width: 0; /* Enables text truncation in flex child */
}
/* Enhanced Status badges */
.park-card .status-badge {
transition: all 200ms ease-in-out;
border-radius: 9999px;
font-weight: 500;
}
.park-card:hover .status-badge {
transform: scale(1.05);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
/* Images */
.park-card img {
transition: transform 300ms ease-in-out;
object-fit: cover;
width: 100%;
height: 100%;
}
.park-card:hover img {
transform: scale(1.08);
}
/* Placeholders for missing images */
.park-card .placeholder {
background: linear-gradient(110deg, #ececec 8%, #f5f5f5 18%, #ececec 33%);
background-size: 200% 100%;
animation: shimmer 1.5s linear infinite;
border-radius: 0.5rem;
}
@keyframes shimmer {
to {
background-position: 200% center;
}
}
/* Enhanced No Results State */
.no-results {
@apply text-center py-12;
animation: fadeInUp 0.5s ease-out;
}
.no-results-icon {
@apply mx-auto w-24 h-24 text-gray-400 dark:text-gray-500 mb-6;
animation: float 3s ease-in-out infinite;
}
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes float {
0%, 100% { transform: translateY(0px); }
50% { transform: translateY(-10px); }
}
/* Enhanced Buttons */
.btn-enhanced {
@apply transition-all duration-200 ease-in-out;
@apply transform hover:scale-105 active:scale-95;
@apply focus:outline-none focus:ring-2 focus:ring-offset-2;
}
.btn-enhanced:hover {
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
}
/* Tooltip Styles */
.tooltip {
@apply absolute z-50 px-2 py-1 text-xs font-medium text-white bg-gray-900 rounded shadow-lg;
@apply dark:bg-gray-700 dark:text-gray-200;
animation: tooltipFadeIn 0.2s ease-out;
}
@keyframes tooltipFadeIn {
from { opacity: 0; transform: scale(0.8); }
to { opacity: 1; transform: scale(1); }
}
/* Enhanced Dark mode */
@media (prefers-color-scheme: dark) {
.park-card {
background-color: #1f2937;
border-color: #374151;
}
.park-card[data-view-mode="list"]:hover {
background-color: #374151;
}
.park-card .text-gray-900 {
color: #f3f4f6;
}
.park-card .text-gray-500 {
color: #9ca3af;
}
.park-card .placeholder {
background: linear-gradient(110deg, #2d3748 8%, #374151 18%, #2d3748 33%);
}
.search-input {
@apply dark:bg-gray-700 dark:border-gray-600 dark:text-white;
}
.quick-filter-btn:not(.active) {
@apply dark:bg-gray-700 dark:text-gray-300 dark:hover:bg-gray-600;
}
/* Enhanced filter panel styling */
.filter-container {
@apply dark:text-gray-200;
}
.filter-field label {
@apply dark:text-gray-300;
}
}
/* Additional enhancements for better visual hierarchy */
.filter-container h3 {
@apply font-semibold tracking-wide;
}
.filter-field {
@apply mb-4;
}
.filter-field label {
@apply font-medium text-sm;
}
/* Status badge improvements */
.status-badge {
@apply inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium;
@apply transition-all duration-200;
}
/* Loading state improvements */
.htmx-request .filter-container {
@apply pointer-events-none;
}
.htmx-request .quick-filter-btn {
@apply opacity-75;
}
/* Mobile Responsive Enhancements */
@media (max-width: 768px) {
.quick-filter-btn {
@apply text-xs px-2 py-1;
}
.filter-chip {
@apply text-xs px-2 py-1;
}
.park-card[data-view-mode="grid"]:hover {
transform: translateY(-2px);
}
.park-card[data-view-mode="list"]:hover {
transform: none;
}
}
/* Accessibility Enhancements */
@media (prefers-reduced-motion: reduce) {
.park-card,
.quick-filter-btn,
.filter-chip,
.btn-enhanced {
transition: none;
animation: none;
}
.park-card:hover {
transform: none;
}
.no-results-icon {
animation: none;
}
}
/* Focus States for Keyboard Navigation */
.park-card:focus-within {
@apply ring-2 ring-blue-500 ring-offset-2;
}
.quick-filter-btn:focus,
.filter-chip .remove-btn:focus {
@apply ring-2 ring-blue-500 ring-offset-2;
}
/* High Contrast Mode Support */
@media (prefers-contrast: high) {
.park-card {
border-width: 2px;
}
.filter-chip {
border: 2px solid currentColor;
}
.quick-filter-btn {
border: 2px solid currentColor;
}
}
/* Enhanced Search Input with Focus States */
.search-input {
transition: all var(--timing-normal) var(--easing-smooth);
position: relative;
}
.search-input:focus {
transform: translateY(-1px);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1), var(--shadow-lg);
}
.search-input-container {
position: relative;
}
.search-input-container::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 0;
height: 2px;
background: var(--gradient-primary);
transition: width var(--timing-normal) var(--easing-smooth);
}
.search-input-container:focus-within::after {
width: 100%;
}
/* Enhanced Form Controls with Better Animations */
.filter-field select,
.filter-field input[type="text"],
.filter-field input[type="number"],
.filter-field input[type="search"],
.filter-field input[type="date"],
.form-field-wrapper input,
.form-field-wrapper select {
transition: all var(--timing-normal) var(--easing-smooth);
border: 2px solid #e5e7eb;
border-radius: 0.75rem;
background: white;
box-shadow: var(--shadow-sm);
}
.dark .filter-field select,
.dark .filter-field input[type="text"],
.dark .filter-field input[type="number"],
.dark .filter-field input[type="search"],
.dark .filter-field input[type="date"],
.dark .form-field-wrapper input,
.dark .form-field-wrapper select {
border-color: #4b5563;
background: #374151;
color: white;
}
.filter-field select:focus,
.filter-field input:focus,
.form-field-wrapper input:focus,
.form-field-wrapper select:focus {
border-color: var(--primary-blue);
transform: translateY(-1px);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1), var(--shadow-md);
}
.filter-field input[type="checkbox"] {
width: 1.25rem;
height: 1.25rem;
border-radius: 0.375rem;
transition: all var(--timing-normal) var(--easing-smooth);
border: 2px solid #d1d5db;
cursor: pointer;
}
.filter-field input[type="checkbox"]:checked {
background: var(--gradient-primary);
border-color: var(--primary-blue);
transform: scale(1.1);
}
.filter-field input[type="checkbox"]:hover {
transform: scale(1.05);
border-color: var(--primary-blue);
}
/* Enhanced Status Indicators with Animations */
.status-indicator {
display: inline-flex;
align-items: center;
padding: 0.375rem 0.75rem;
border-radius: 9999px;
font-size: 0.75rem;
font-weight: 500;
animation: fade-in-scale var(--timing-normal) var(--easing-smooth);
position: relative;
overflow: hidden;
}
.status-indicator::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
transition: left var(--timing-slow) var(--easing-smooth);
}
.status-indicator:hover::before {
left: 100%;
}
.status-indicator.filtered {
background: var(--gradient-primary);
color: white;
box-shadow: var(--shadow-md);
}
.status-indicator.loading {
background: var(--gradient-warning);
color: white;
animation: loading-pulse 1.5s ease-in-out infinite;
}
.status-indicator.success {
background: var(--gradient-success);
color: white;
}
.status-indicator.error {
background: var(--gradient-danger);
color: white;
}
/* =============================================
MOBILE OPTIMIZATIONS & RESPONSIVE DESIGN
============================================= */
/* Mobile-First Media Queries */
@media (max-width: 640px) {
/* Enhanced touch targets for mobile */
.filter-field button,
.btn,
.search-input,
.filter-select {
min-height: 44px; /* Apple/iOS guideline */
min-width: 44px;
}
/* Mobile filter panel optimizations */
.filter-panel {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 50;
background: var(--background-primary);
transform: translateY(100%);
transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.filter-panel.is-open {
transform: translateY(0);
}
/* Mobile search optimizations */
.search-input {
font-size: 16px; /* Prevent zoom on iOS */
border-radius: 12px;
}
/* Card spacing adjustments */
.park-card {
margin-bottom: 1rem;
border-radius: 16px;
}
/* Typography scaling */
.park-title {
font-size: 1.125rem;
line-height: 1.4;
}
.park-description {
font-size: 0.875rem;
line-height: 1.5;
}
/* Button optimizations */
.btn-primary,
.btn-secondary {
padding: 0.75rem 1.5rem;
font-size: 1rem;
border-radius: 12px;
}
/* Mobile navigation enhancements */
.mobile-nav-toggle {
display: block;
position: fixed;
bottom: 2rem;
right: 2rem;
width: 56px;
height: 56px;
background: var(--primary);
border-radius: 50%;
border: none;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
z-index: 60;
transition: all 0.3s ease;
}
.mobile-nav-toggle:hover {
transform: scale(1.1);
box-shadow: 0 12px 40px rgba(0, 0, 0, 0.16);
}
/* Swipe gestures support */
.swipe-container {
touch-action: pan-x;
overflow-x: auto;
scroll-snap-type: x mandatory;
-webkit-overflow-scrolling: touch;
}
.swipe-item {
scroll-snap-align: start;
min-width: 280px;
margin-right: 1rem;
}
}
/* Tablet optimizations */
@media (min-width: 641px) and (max-width: 1024px) {
.filter-panel {
width: 320px;
}
.park-grid {
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: 1.5rem;
}
.search-container {
max-width: 600px;
}
}
/* Desktop enhancements */
@media (min-width: 1025px) {
.park-card:hover {
transform: translateY(-8px);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.1);
}
.filter-field:hover .field-icon {
color: var(--primary);
transform: scale(1.1);
}
/* Enhanced tooltips for desktop */
.tooltip {
position: relative;
}
.tooltip::after {
content: attr(data-tooltip);
position: absolute;
bottom: 125%;
left: 50%;
transform: translateX(-50%);
background: var(--text-primary);
color: var(--background-primary);
padding: 0.5rem 0.75rem;
border-radius: 6px;
font-size: 0.75rem;
white-space: nowrap;
opacity: 0;
pointer-events: none;
transition: opacity 0.3s ease;
z-index: 100;
}
.tooltip:hover::after {
opacity: 1;
}
}
/* =============================================
ACCESSIBILITY ENHANCEMENTS
============================================= */
/* Focus indicators */
.focus-visible,
*:focus-visible {
outline: 2px solid var(--primary);
outline-offset: 2px;
border-radius: 4px;
}
/* High contrast mode support */
@media (prefers-contrast: high) {
.park-card {
border: 2px solid var(--border-primary);
}
.btn-primary {
border: 2px solid var(--primary);
}
.search-input {
border: 2px solid var(--border-primary);
}
}
/* Reduced motion support */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
.shimmer::before {
animation: none;
}
.park-card {
transform: none !important;
}
}
/* Screen reader optimizations */
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
/* Skip links */
.skip-link {
position: absolute;
top: -40px;
left: 6px;
background: var(--primary);
color: white;
padding: 8px;
border-radius: 4px;
text-decoration: none;
z-index: 1000;
transition: top 0.3s ease;
}
.skip-link:focus {
top: 6px;
}
/* =============================================
PRINT STYLES
============================================= */
@media print {
/* Reset for print */
* {
background: transparent !important;
color: black !important;
box-shadow: none !important;
text-shadow: none !important;
}
body {
font-size: 12pt;
line-height: 1.5;
}
/* Hide interactive elements */
.filter-panel,
.btn,
.search-input,
.mobile-nav-toggle,
.loading-spinner {
display: none !important;
}
/* Optimize content for print */
.park-card {
border: 1px solid #ccc;
margin-bottom: 1rem;
page-break-inside: avoid;
}
.park-title {
font-size: 14pt;
font-weight: bold;
}
.park-description {
font-size: 10pt;
}
/* Page breaks */
h1, h2, h3 {
page-break-after: avoid;
}
/* Print URLs */
a[href]:after {
content: " (" attr(href) ")";
font-size: 9pt;
}
}
/* =============================================
DARK MODE ENHANCEMENTS
============================================= */
[data-theme="dark"] {
/* Enhanced dark mode shadows */
.park-card {
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
}
.filter-panel {
box-shadow: 2px 0 16px rgba(0, 0, 0, 0.4);
}
/* Dark mode specific animations */
.shimmer::before {
background: linear-gradient(
90deg,
transparent,
rgba(255, 255, 255, 0.1),
transparent
);
}
/* Enhanced dark mode borders */
.search-input,
.filter-select,
.park-card {
border-color: rgba(255, 255, 255, 0.1);
}
/* Dark mode scrollbars */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: var(--background-secondary);
}
::-webkit-scrollbar-thumb {
background: rgba(255, 255, 255, 0.2);
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: rgba(255, 255, 255, 0.3);
}
}
/* =============================================
PERFORMANCE OPTIMIZATIONS
============================================= */
/* GPU acceleration for animations */
.park-card,
.filter-panel,
.btn,
.loading-spinner {
will-change: transform;
backface-visibility: hidden;
-webkit-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);
}
/* Optimize repaints */
.shimmer,
.loading-spinner,
.ripple {
contain: layout style paint;
}
/* =============================================
UTILITY CLASSES
============================================= */
/* Spacing utilities */
.mt-1 { margin-top: 0.25rem; }
.mt-2 { margin-top: 0.5rem; }
.mt-3 { margin-top: 0.75rem; }
.mt-4 { margin-top: 1rem; }
.mb-1 { margin-bottom: 0.25rem; }
.mb-2 { margin-bottom: 0.5rem; }
.mb-3 { margin-bottom: 0.75rem; }
.mb-4 { margin-bottom: 1rem; }
.p-1 { padding: 0.25rem; }
.p-2 { padding: 0.5rem; }
.p-3 { padding: 0.75rem; }
.p-4 { padding: 1rem; }
/* Text utilities */
.text-center { text-align: center; }
.text-left { text-align: left; }
.text-right { text-align: right; }
.font-bold { font-weight: bold; }
.font-medium { font-weight: 500; }
.font-normal { font-weight: normal; }
/* Display utilities */
.hidden { display: none; }
.block { display: block; }
.inline-block { display: inline-block; }
.flex { display: flex; }
.grid { display: grid; }
/* Flexbox utilities */
.justify-center { justify-content: center; }
.justify-between { justify-content: space-between; }
.items-center { align-items: center; }
.items-start { align-items: flex-start; }
/* =============================================
FINAL POLISH & CONSISTENCY
============================================= */
/* Ensure consistent border radius */
.park-card,
.search-input,
.btn,
.filter-select,
.modal {
border-radius: var(--border-radius);
}
/* Consistent transitions */
.park-card,
.btn,
.search-input,
.filter-select,
.filter-field {
transition-duration: var(--transition-duration);
transition-timing-function: var(--transition-timing);
}
/* Ensure proper z-index layering */
.modal-backdrop { z-index: 40; }
.modal { z-index: 50; }
.filter-panel { z-index: 45; }
.mobile-nav-toggle { z-index: 60; }
.tooltip { z-index: 100; }
/* Final accessibility tweaks */
button:disabled,
input:disabled,
select:disabled {
opacity: 0.6;
cursor: not-allowed;
}
/* Ensure proper contrast ratios */
.text-muted {
color: var(--text-secondary);
opacity: 0.8;
}
.text-error {
color: var(--error);
}
.text-success {
color: var(--success);
}
.text-warning {
color: var(--warning);
}
/* End of enhanced search.css */