diff --git a/public/analytics.js b/public/analytics.js index 902c73f7..6813f3ca 100644 --- a/public/analytics.js +++ b/public/analytics.js @@ -312,12 +312,23 @@ { label: 'Good', snr: [0, 6], rssi: [-100, -80], color: '#f59e0b15' }, { label: 'Weak', snr: [-12, 0], rssi: [-130, -100], color: '#ef444410' }, ]; + // Define patterns for color-blind accessibility + svg += ``; + svg += ``; + svg += ``; + svg += ``; + svg += ``; + const zonePatterns = { 'Excellent': 'pat-excellent', 'Good': 'pat-good', 'Weak': 'pat-weak' }; + const zoneDash = { 'Excellent': '4,2', 'Good': '6,3', 'Weak': '2,2' }; + const zoneBorder = { 'Excellent': '#22c55e', 'Good': '#f59e0b', 'Weak': '#ef4444' }; zones.forEach(z => { const x1 = pad + (z.snr[0] - snrMin) / (snrMax - snrMin) * (w - pad * 2); const x2 = pad + (z.snr[1] - snrMin) / (snrMax - snrMin) * (w - pad * 2); const y1 = h - pad - (z.rssi[1] - rssiMin) / (rssiMax - rssiMin) * (h - pad * 2); const y2 = h - pad - (z.rssi[0] - rssiMin) / (rssiMax - rssiMin) * (h - pad * 2); svg += ``; + svg += ``; + svg += ``; svg += `${z.label}`; }); // Dots (sample if too many) @@ -785,7 +796,7 @@ const cellSize = 36; const headerSize = 24; - let html = `
`; + let html = `
`; html += ``; for (const n of nibbles) { html += ``; diff --git a/public/style.css b/public/style.css index b962d75f..27b45236 100644 --- a/public/style.css +++ b/public/style.css @@ -1249,3 +1249,27 @@ tr[data-hops]:hover { background: rgba(59,130,246,0.1); } .hide-col-path .col-path, .hide-col-rpt .col-rpt, .hide-col-details .col-details { display: none; } + +/* === Bug fixes: #17 #20 #21 #69 === */ + +/* #17 — Hash matrix mobile overflow */ +.hash-matrix-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; max-width: 100%; } +@media (max-width: 640px) { + .hash-matrix-table td { width: 24px !important; height: 24px !important; font-size: 0.7em !important; } + .hash-matrix-table td .hash-cell { padding: 0; } +} + +/* #20 — Observers table horizontal scroll on mobile */ +.obs-table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; } +.obs-table-scroll .obs-table { min-width: 640px; } +@media (max-width: 640px) { + .spark-bar { min-width: 60px; width: auto; } +} + +/* #21 — Chat message bubble max-width */ +.ch-msg-bubble { max-width: 720px; } + +/* #69 — Touch-friendly resize handle */ +@media (pointer: coarse) { + .panel-resize-handle { width: 12px !important; } +}
${n}