diff --git a/src/main.js b/src/main.js index b99a827..3ab6bb8 100644 --- a/src/main.js +++ b/src/main.js @@ -1128,42 +1128,9 @@ function handleResize(state) { // --- Bootstrap --------------------------------------------------------------- -// --- Mobile Detection -------------------------------------------------------- - -function isMobile() { - // Check both user agent and viewport width for robust detection - const uaMatch = - /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( - navigator.userAgent, - ); - const narrowViewport = window.innerWidth <= 768; - return uaMatch || narrowViewport; -} - -function buildMobileUI() { - const app = document.getElementById("app"); - app.innerHTML = ` -
`; -} - async function init() { log.info("NetWatch starting"); - if (isMobile()) { - log.info("Mobile device detected — showing placeholder"); - buildMobileUI(); - return; - } - // Probe common gateway IPs to find the local router const gateway = await detectGateway(); const localHosts = [LOCAL_CPE]; diff --git a/src/styles.css b/src/styles.css index 24e0fe3..600e453 100644 --- a/src/styles.css +++ b/src/styles.css @@ -21,3 +21,96 @@ body { rgba(255, 255, 255, 0) 100% ); } + +/* ---- Mobile responsive layout (portrait / narrow viewports) ---- */ +@media (max-width: 768px) { + /* Header: stack title and controls vertically */ + header .flex.items-center.justify-between { + flex-direction: column; + align-items: flex-start !important; + gap: 1rem; + } + + header .flex.flex-col.items-end { + align-items: flex-start !important; + flex-direction: row; + flex-wrap: wrap; + gap: 0.75rem; + } + + /* Pause button: smaller on mobile */ + #pause-btn { + padding: 0.5rem 1rem; + } + + #pause-btn svg { + width: 1.25rem; + height: 1.25rem; + } + + #pause-text { + font-size: 0.875rem; + } + + /* Summary box: wrap into a grid for readability */ + #summary { + display: flex; + flex-wrap: wrap; + gap: 0.25rem 0.5rem; + justify-content: center; + line-height: 1.6; + } + + /* Hide the pipe separators on mobile */ + #summary .text-gray-600.mx-3 { + display: none; + } + + /* Host row: stack vertically */ + .host-row .flex.items-center.gap-4 { + flex-direction: column; + align-items: stretch !important; + gap: 0.5rem; + } + + /* Info section: full width, remove fixed width */ + .host-row .w-\[420px\] { + width: 100% !important; + display: grid; + grid-template-columns: 1fr auto; + align-items: center; + } + + /* Host name row with dot */ + .host-row .flex.items-center.gap-2.min-w-\[200px\] { + min-width: 0; + } + + /* Latency value: slightly smaller on mobile */ + .host-row .latency-value { + font-size: 1.875rem; + line-height: 2.25rem; + } + + /* Sparkline: full width below the info */ + .host-row .sparkline-container { + width: 100%; + flex-shrink: 0; + } + + /* Pin button: inline with the host info */ + .host-row .pin-btn { + position: absolute; + right: 0.5rem; + top: 0.5rem; + } + + .host-row { + position: relative; + } + + /* Footer legend: wrap nicely */ + footer p { + line-height: 1.8; + } +}