aprs.me/assets/css/mobile.css
Graham McIntire 4de48294c6
Remove DaisyUI, migrate to pure Tailwind CSS with TailwindUI patterns
Replace all DaisyUI component classes with pure Tailwind CSS utility
classes following TailwindUI conventions. Use dark: variants for dark
mode instead of DaisyUI's data-theme semantic color system.

- Remove DaisyUI plugin and theme vendor files
- Configure Tailwind v4 custom dark variant for data-theme attribute
- Migrate all components: cards, tables, badges, buttons, forms,
  navigation, dropdowns, modals, alerts, star ratings, spinners
- Update all auth pages (login, register, settings, password reset,
  confirmation) to TailwindUI card layout
- Update content pages (about, API docs, status, packets, bad packets,
  info, weather) to TailwindUI patterns
- Replace opacity-based text styling with semantic gray colors
- Update test assertions to match new class names
2026-02-19 10:07:50 -06:00

235 lines
No EOL
4.8 KiB
CSS

/* Mobile-specific optimizations for APRS.me */
/* Prevent iOS bounce scrolling on the map */
html, body {
overscroll-behavior: none;
-webkit-overflow-scrolling: touch;
}
/* Ensure map takes full height on mobile */
@media (max-width: 768px) {
#map {
height: calc(100vh - 56px); /* Account for header */
height: calc(100dvh - 56px); /* Dynamic viewport height for mobile browsers */
touch-action: pan-x pan-y;
}
/* Optimize header for mobile */
.site-header {
padding: 0.5rem;
position: sticky;
top: 0;
z-index: 1000;
}
/* Larger touch targets for mobile controls */
.leaflet-control-zoom a,
.leaflet-control-layers-toggle,
.leaflet-control button {
width: 44px !important;
height: 44px !important;
line-height: 44px !important;
font-size: 20px !important;
}
/* Better popup positioning on mobile */
.leaflet-popup {
bottom: 50px !important;
max-width: 90vw !important;
}
.leaflet-popup-content {
max-height: 50vh;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
padding: 1rem;
}
/* Optimize sidebar for mobile */
.map-sidebar {
position: fixed;
bottom: 0;
left: 0;
right: 0;
max-height: 40vh;
background: white;
border-top: 2px solid #e5e7eb;
transform: translateY(100%);
transition: transform 0.3s ease;
z-index: 1001;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
.map-sidebar.open {
transform: translateY(0);
}
/* Mobile-friendly search box */
.search-container {
position: absolute;
top: 10px;
left: 10px;
right: 60px;
z-index: 1000;
}
.search-input {
width: 100%;
padding: 12px 16px;
font-size: 16px; /* Prevent zoom on iOS */
border-radius: 8px;
border: 1px solid #d1d5db;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
/* Mobile-friendly buttons */
button {
min-height: 44px;
}
/* Hide non-essential elements on small screens */
.hide-mobile {
display: none !important;
}
/* Improve marker touch targets */
.leaflet-marker-icon {
margin-left: -12px !important;
margin-top: -41px !important;
}
/* Better clustering on mobile */
.marker-cluster {
width: 48px !important;
height: 48px !important;
margin-left: -24px !important;
margin-top: -24px !important;
}
/* Mobile-friendly trail duration controls */
.trail-controls {
position: fixed;
bottom: 60px;
right: 10px;
display: flex;
flex-direction: column;
gap: 8px;
}
.trail-controls button {
width: 44px;
height: 44px;
border-radius: 50%;
background: white;
border: 2px solid #e5e7eb;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
/* Improve dropdown menus on mobile */
select {
font-size: 16px; /* Prevent zoom on iOS */
padding: 12px;
min-height: 44px;
}
/* Mobile-friendly tooltips */
.tooltip {
font-size: 14px;
padding: 8px 12px;
}
/* Optimize data tables for mobile */
.table-container {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
table {
font-size: 14px;
}
/* Safe area insets for devices with notches */
.site-header {
padding-left: env(safe-area-inset-left);
padding-right: env(safe-area-inset-right);
padding-top: env(safe-area-inset-top);
}
#map {
padding-bottom: env(safe-area-inset-bottom);
}
}
/* Landscape mode optimizations */
@media (max-width: 768px) and (orientation: landscape) {
.site-header {
padding: 0.25rem 0.5rem;
}
#map {
height: calc(100vh - 40px);
height: calc(100dvh - 40px);
}
.leaflet-control-zoom {
transform: scale(0.9);
}
}
/* High DPI screen optimizations */
@media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) {
.leaflet-tile {
image-rendering: -webkit-optimize-contrast;
image-rendering: crisp-edges;
}
}
/* Disable hover effects on touch devices */
@media (hover: none) {
.leaflet-interactive:hover {
stroke-opacity: 1 !important;
fill-opacity: 0.2 !important;
}
a:hover, button:hover {
background-color: inherit !important;
}
}
/* Loading spinner for mobile */
.mobile-loading {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
z-index: 9999;
}
/* Improve form inputs on mobile */
input[type="text"],
input[type="email"],
input[type="search"],
input[type="tel"],
input[type="url"],
input[type="password"],
textarea {
font-size: 16px; /* Prevent zoom on iOS */
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}
/* Better focus states for mobile */
:focus {
outline: 3px solid #6366f1;
outline-offset: 2px;
}
/* Optimize animations for mobile performance */
@media (max-width: 768px) {
* {
animation-duration: 0.2s !important;
transition-duration: 0.2s !important;
}
}