diff --git a/src/App.jsx b/src/App.jsx index b10ab3b..8a5f05e 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -572,6 +572,439 @@ const App = () => { 35 + ) : config.layout === 'tablet' ? ( + /* TABLET LAYOUT - Optimized for 7-10" widescreen displays (16:9) */ +
+ {/* COMPACT TOP BAR */} +
+ {/* Callsign */} + setShowSettings(true)} + title="Settings" + > + {config.callsign} + + + {/* UTC */} +
+ UTC + {utcTime} +
+ + {/* Local */} +
+ LOC + {localTime} +
+ + {/* Solar Quick Stats */} +
+ + SFI + {solarIndices?.data?.sfi?.current || spaceWeather?.data?.solarFlux || '--'} + + + K + = 4 ? 'var(--accent-red)' : 'var(--accent-green)', fontWeight: '700' }}> + {solarIndices?.data?.kp?.current ?? spaceWeather?.data?.kIndex ?? '--'} + + + + SSN + {solarIndices?.data?.ssn?.current || '--'} + +
+ + {/* Controls */} +
+ + +
+
+ + {/* MAIN AREA: Map + Data Sidebar */} +
+ {/* MAP */} +
+ +
+ + {/* DATA SIDEBAR */} +
+ {/* Band Conditions Grid */} +
+
Band Conditions
+
+ {(bandConditions?.data || []).slice(0, 13).map((band, idx) => { + const colors = { + GOOD: { bg: 'rgba(0,255,136,0.2)', color: '#00ff88', border: 'rgba(0,255,136,0.4)' }, + FAIR: { bg: 'rgba(255,180,50,0.2)', color: '#ffb432', border: 'rgba(255,180,50,0.4)' }, + POOR: { bg: 'rgba(255,68,102,0.2)', color: '#ff4466', border: 'rgba(255,68,102,0.4)' } + }; + const s = colors[band.condition] || colors.FAIR; + return ( +
+
{band.band}
+
{band.condition}
+
+ ); + })} +
+ {/* MUF/LUF */} + {propagation.data && ( +
+ MUF {propagation.data.muf || '?'} + LUF {propagation.data.luf || '?'} +
+ )} +
+ + {/* Compact DX Cluster */} +
+
+ DX Cluster + {dxCluster.data?.length || 0} spots +
+
+ {dxCluster.data?.slice(0, 30).map((spot, i) => ( +
setHoveredSpot(spot)} + onMouseLeave={() => setHoveredSpot(null)} + > + {parseFloat(spot.freq).toFixed(1)} + {spot.call} + {spot.time || '--'} +
+ ))} +
+
+
+
+
+ + ) : config.layout === 'compact' ? ( + /* COMPACT LAYOUT - Optimized for 4:3 screens and data-first display */ +
+ {/* TOP: Callsign + Times + Solar */} +
+ {/* Row 1: Callsign + Times */} +
+ setShowSettings(true)} + title="Settings" + > + {config.callsign} + +
+
+
UTC
+
{utcTime}
+
{utcDate}
+
+
+
Local
+
{localTime}
+
{localDate}
+
+
+
+ + +
+
+ {/* Row 2: Solar indices inline */} +
+ + SFI + {solarIndices?.data?.sfi?.current || spaceWeather?.data?.solarFlux || '--'} + + + K + = 4 ? 'var(--accent-red)' : 'var(--accent-green)', fontWeight: '700' }}> + {solarIndices?.data?.kp?.current ?? spaceWeather?.data?.kIndex ?? '--'} + + + + SSN + {solarIndices?.data?.ssn?.current || '--'} + + {propagation.data && ( + <> + + MUF + {propagation.data.muf || '?'} MHz + + + LUF + {propagation.data.luf || '?'} MHz + + + )} + {localWeather?.data && ( + + {localWeather.data.icon} + {localWeather.data.temp}°{localWeather.data.tempUnit || tempUnit} + + )} +
+
+ + {/* BAND CONDITIONS - Full Width */} +
+
+ {(bandConditions?.data || []).slice(0, 13).map((band, idx) => { + const colors = { + GOOD: { bg: 'rgba(0,255,136,0.2)', color: '#00ff88', border: 'rgba(0,255,136,0.4)' }, + FAIR: { bg: 'rgba(255,180,50,0.2)', color: '#ffb432', border: 'rgba(255,180,50,0.4)' }, + POOR: { bg: 'rgba(255,68,102,0.2)', color: '#ff4466', border: 'rgba(255,68,102,0.4)' } + }; + const s = colors[band.condition] || colors.FAIR; + return ( +
+
{band.band}
+
{band.condition}
+
+ ); + })} +
+
+ + {/* MAIN: Map + DX Cluster side by side */} +
+ {/* Map */} +
+ +
+ {deGrid} → {dxGrid} • Click map to set DX +
+
+ + {/* Compact DX Cluster */} +
+
+ DX Cluster + {dxCluster.data?.length || 0} +
+
+ {dxCluster.data?.slice(0, 40).map((spot, i) => ( +
setHoveredSpot(spot)} + onMouseLeave={() => setHoveredSpot(null)} + > + {parseFloat(spot.freq).toFixed(1)} + {spot.call} + {spot.time || '--'} +
+ ))} +
+
+
+
+ ) : ( /* MODERN LAYOUT */
{ const layoutDescriptions = { modern: t('station.settings.layout.modern.describe'), - classic: t('station.settings.layout.classic.describe') + classic: t('station.settings.layout.classic.describe'), + tablet: t('station.settings.layout.tablet.describe'), + compact: t('station.settings.layout.compact.describe') }; return ( @@ -461,7 +463,7 @@ export const SettingsPanel = ({ isOpen, onClose, config, onSave }) => { {t('station.settings.layout')}
- {['modern', 'classic'].map((l) => ( + {['modern', 'classic', 'tablet', 'compact'].map((l) => ( ))}
diff --git a/src/lang/de.json b/src/lang/de.json index 7f23a69..bd17759 100644 --- a/src/lang/de.json +++ b/src/lang/de.json @@ -53,5 +53,9 @@ "plugins.layers.earthquakes.description": "Live-USGS-Erdbebendaten (M2,5+ der letzten 24 Stunden)", "plugins.layers.wxradar.name": "Wetterradar", "plugins.layers.wxradar.description": "NEXRAD-Wetterradar-Überlagerung für Nordamerika", - "plugins.layers.wxradar.attribution": "Wetterdaten © Iowa State University Mesonet" + "plugins.layers.wxradar.attribution": "Wetterdaten © Iowa State University Mesonet", + "station.settings.layout.tablet": "Tablet", + "station.settings.layout.tablet.describe": "→ Optimized for 7-10\" widescreen displays (16:9)", + "station.settings.layout.compact": "Compact", + "station.settings.layout.compact.describe": "→ Data-first layout for 4:3 and smaller screens" } diff --git a/src/lang/en.json b/src/lang/en.json index 49a03bd..08a0d2a 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -28,6 +28,10 @@ "station.settings.layout.classic.describe": "→ Original HamClock-style layout", "station.settings.layout.modern": "Modern", "station.settings.layout.modern.describe": "→ Modern responsive grid layout", + "station.settings.layout.tablet": "Tablet", + "station.settings.layout.tablet.describe": "→ Optimized for 7-10\" widescreen displays (16:9)", + "station.settings.layout.compact": "Compact", + "station.settings.layout.compact.describe": "→ Data-first layout for 4:3 and smaller screens", "station.settings.latitude": "Latitude", "station.settings.locator": "Grid Square (or enter Lat/Lon below)", "station.settings.longitude": "Longitude", diff --git a/src/lang/es.json b/src/lang/es.json index 4bda44d..dcd99e0 100644 --- a/src/lang/es.json +++ b/src/lang/es.json @@ -54,5 +54,9 @@ "plugins.layers.earthquakes.description": "Datos sísmicos en vivo del USGS (M2.5+ de las últimas 24 horas)", "plugins.layers.wxradar.name": "Radar meteorológico", "plugins.layers.wxradar.description": "Superposición del radar meteorológico NEXRAD para Norteamérica", - "plugins.layers.wxradar.attribution": "Datos meteorológicos © Iowa State University Mesonet" + "plugins.layers.wxradar.attribution": "Datos meteorológicos © Iowa State University Mesonet", + "station.settings.layout.tablet": "Tablet", + "station.settings.layout.tablet.describe": "→ Optimized for 7-10\" widescreen displays (16:9)", + "station.settings.layout.compact": "Compact", + "station.settings.layout.compact.describe": "→ Data-first layout for 4:3 and smaller screens" } diff --git a/src/lang/fr.json b/src/lang/fr.json index cae97fc..5d33094 100644 --- a/src/lang/fr.json +++ b/src/lang/fr.json @@ -53,5 +53,9 @@ "plugins.layers.earthquakes.description": "Données sismiques USGS en direct (M2,5+ sur les dernières 24 heures)", "plugins.layers.wxradar.name": "Radar météo", "plugins.layers.wxradar.description": "Surcouche du radar météo NEXRAD pour l’Amérique du Nord", - "plugins.layers.wxradar.attribution": "Données météo © Iowa State University Mesonet" + "plugins.layers.wxradar.attribution": "Données météo © Iowa State University Mesonet", + "station.settings.layout.tablet": "Tablet", + "station.settings.layout.tablet.describe": "→ Optimized for 7-10\" widescreen displays (16:9)", + "station.settings.layout.compact": "Compact", + "station.settings.layout.compact.describe": "→ Data-first layout for 4:3 and smaller screens" } diff --git a/src/lang/it.json b/src/lang/it.json index b18d457..d2d24fa 100644 --- a/src/lang/it.json +++ b/src/lang/it.json @@ -53,5 +53,9 @@ "plugins.layers.earthquakes.description": "Dati sismici USGS in tempo reale (M2,5+ delle ultime 24 ore)", "plugins.layers.wxradar.name": "Radar meteorologico", "plugins.layers.wxradar.description": "Sovrapposizione del radar meteorologico NEXRAD per il Nord America", - "plugins.layers.wxradar.attribution": "Dati meteo © Iowa State University Mesonet" + "plugins.layers.wxradar.attribution": "Dati meteo © Iowa State University Mesonet", + "station.settings.layout.tablet": "Tablet", + "station.settings.layout.tablet.describe": "→ Optimized for 7-10\" widescreen displays (16:9)", + "station.settings.layout.compact": "Compact", + "station.settings.layout.compact.describe": "→ Data-first layout for 4:3 and smaller screens" } diff --git a/src/lang/ja.json b/src/lang/ja.json index 59d4447..1407a08 100644 --- a/src/lang/ja.json +++ b/src/lang/ja.json @@ -53,5 +53,9 @@ "plugins.layers.earthquakes.description": "USGSのリアルタイム地震データ(過去24時間のM2.5以上)", "plugins.layers.wxradar.name": "気象レーダー", "plugins.layers.wxradar.description": "北米向けNEXRAD気象レーダーのオーバーレイ", - "plugins.layers.wxradar.attribution": "気象データ © Iowa State University Mesonet" + "plugins.layers.wxradar.attribution": "気象データ © Iowa State University Mesonet", + "station.settings.layout.tablet": "Tablet", + "station.settings.layout.tablet.describe": "→ Optimized for 7-10\" widescreen displays (16:9)", + "station.settings.layout.compact": "Compact", + "station.settings.layout.compact.describe": "→ Data-first layout for 4:3 and smaller screens" } diff --git a/src/lang/ko.json b/src/lang/ko.json index 8d703c0..21db534 100644 --- a/src/lang/ko.json +++ b/src/lang/ko.json @@ -53,5 +53,9 @@ "plugins.layers.earthquakes.description": "USGS 실시간 지진 데이터 (지난 24시간 동안 일어난 규모 M2.5 이상의 지진)", "plugins.layers.wxradar.name": "기상 레이더", "plugins.layers.wxradar.description": "북아메리카 지역 NEXRAD 기상 레이더 오버레이", - "plugins.layers.wxradar.attribution": "기상 데이터 © Iowa State University Mesonet" + "plugins.layers.wxradar.attribution": "기상 데이터 © Iowa State University Mesonet", + "station.settings.layout.tablet": "Tablet", + "station.settings.layout.tablet.describe": "→ Optimized for 7-10\" widescreen displays (16:9)", + "station.settings.layout.compact": "Compact", + "station.settings.layout.compact.describe": "→ Data-first layout for 4:3 and smaller screens" } diff --git a/src/lang/nl.json b/src/lang/nl.json index b45fcb5..b46b5d9 100644 --- a/src/lang/nl.json +++ b/src/lang/nl.json @@ -53,5 +53,9 @@ "plugins.layers.earthquakes.description": "Live USGS-aardbevingsgegevens (M2,5+ van de afgelopen 24 uur)", "plugins.layers.wxradar.name": "Weerradar", "plugins.layers.wxradar.description": "NEXRAD-weerradaroverlay voor Noord-Amerika", - "plugins.layers.wxradar.attribution": "Weergegevens © Iowa State University Mesonet" + "plugins.layers.wxradar.attribution": "Weergegevens © Iowa State University Mesonet", + "station.settings.layout.tablet": "Tablet", + "station.settings.layout.tablet.describe": "→ Optimized for 7-10\" widescreen displays (16:9)", + "station.settings.layout.compact": "Compact", + "station.settings.layout.compact.describe": "→ Data-first layout for 4:3 and smaller screens" } diff --git a/src/lang/pt.json b/src/lang/pt.json index 8091927..4cd8cb2 100644 --- a/src/lang/pt.json +++ b/src/lang/pt.json @@ -53,5 +53,9 @@ "plugins.layers.earthquakes.description": "Dados sísmicos do USGS ao vivo (M2,5+ das últimas 24 horas)", "plugins.layers.wxradar.name": "Radar meteorológico", "plugins.layers.wxradar.description": "Sobreposição do radar meteorológico NEXRAD para a América do Norte", - "plugins.layers.wxradar.attribution": "Dados meteorológicos © Iowa State University Mesonet" + "plugins.layers.wxradar.attribution": "Dados meteorológicos © Iowa State University Mesonet", + "station.settings.layout.tablet": "Tablet", + "station.settings.layout.tablet.describe": "→ Optimized for 7-10\" widescreen displays (16:9)", + "station.settings.layout.compact": "Compact", + "station.settings.layout.compact.describe": "→ Data-first layout for 4:3 and smaller screens" } diff --git a/src/styles/main.css b/src/styles/main.css index ad8b710..eda3aa7 100644 --- a/src/styles/main.css +++ b/src/styles/main.css @@ -905,3 +905,105 @@ body::before { position: relative; z-index: 10000 !important; } + +/* ============================================ + RESPONSIVE: Phone & Small Screen Overrides + ============================================ */ + +/* Tablets and small screens (under 1024px) */ +@media (max-width: 1024px) { + .panel { + padding: 6px !important; + border-radius: 4px !important; + } + + .panel-header { + font-size: 11px !important; + padding: 4px 6px !important; + } +} + +/* Phone landscape and small tablets (under 768px) */ +@media (max-width: 768px) { + /* Force single-column on modern layout */ + .ohc-mobile-stack { + display: flex !important; + flex-direction: column !important; + grid-template-columns: unset !important; + } + + .panel { + padding: 4px !important; + margin-bottom: 2px !important; + border-radius: 3px !important; + } + + .panel-header { + font-size: 10px !important; + padding: 3px 6px !important; + } + + /* Prevent horizontal overflow */ + body { + overflow-x: hidden; + } +} + +/* Phone portrait (under 480px) */ +@media (max-width: 480px) { + /* Extra compact for phones */ + .panel { + padding: 3px !important; + font-size: 11px !important; + } + + .panel-header { + font-size: 9px !important; + } + + /* Reduce font sizes globally for very small screens */ + body { + font-size: 12px; + } +} + +/* Short screens (Pi 7" touchscreen at 480px height) */ +@media (max-height: 520px) { + .panel { + padding: 3px !important; + } + + .panel-header { + padding: 2px 4px !important; + font-size: 10px !important; + } +} + +/* Touch device improvements */ +@media (pointer: coarse) { + /* Larger tap targets for touchscreens */ + button { + min-height: 36px; + min-width: 36px; + } + + /* Prevent text selection on tap */ + .panel-header { + user-select: none; + -webkit-user-select: none; + } + + /* Scrollbar styling for touch */ + ::-webkit-scrollbar { + width: 4px; + } + + ::-webkit-scrollbar-track { + background: transparent; + } + + ::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.15); + border-radius: 2px; + } +}