Compare page (frontend/compare.{html,js} + /thermograph/compare route):
line up several places over a date range and rank which best matches a
comfort temperature. Per location it pulls the same daily record the
Calendar uses and, per day, takes a chosen temperature (daytime high /
daily mean / overnight low / feels-like) against the comfort target. A
day "hits comfort" when it lands within an adjustable band; otherwise it
counts as colder or warmer and the average miss is tracked. Results are
ranked by comfort-day share (tie-broken by the smaller typical miss),
with a diverging below/comfort/above bar and per-bucket stats. Comfort,
band and judged temperature re-rank instantly client-side; only the
location set or date range trigger a data load (shared calendar cache).
Feels calendar filter: drop the comfort-temperature slider and the
client-side felt-high/felt-low re-pick. The Feels metric now colors by
the server's combined feels-like value like the other metrics, so its
tab matches the rest of the metric selector.
84 lines
3.4 KiB
HTML
84 lines
3.4 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
<title>Thermograph — 2-year calendar</title>
|
|
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
|
|
<link rel="stylesheet" href="style.css" />
|
|
</head>
|
|
<body>
|
|
<header>
|
|
<div class="brand">
|
|
<span class="logo">▚</span>
|
|
<div>
|
|
<h1>Thermograph · Calendar</h1>
|
|
<p class="tag">Two years of daily grades vs local climate history</p>
|
|
</div>
|
|
<nav class="view-nav" aria-label="Views">
|
|
<a href="./" data-view="map">Weekly</a>
|
|
<a href="calendar" data-view="calendar" class="active">Calendar</a>
|
|
<a href="day" data-view="day">Day</a>
|
|
<a href="compare" data-view="compare">Compare</a>
|
|
</nav>
|
|
</div>
|
|
</header>
|
|
|
|
<main>
|
|
<section class="controls">
|
|
<div class="find-bar">
|
|
<button type="button" id="find-btn" class="find-btn"></button>
|
|
<span id="loc-label" class="loc-label" hidden></span>
|
|
</div>
|
|
</section>
|
|
|
|
<div id="cal-head" class="cal-head" hidden></div>
|
|
|
|
<!-- Time filters: month/year range + season + year, each a compact dropdown. -->
|
|
<div id="cal-filters" class="cal-filters" hidden>
|
|
<div class="cal-range" id="cal-range">
|
|
<div class="cal-range-head">
|
|
<span class="cal-filter-label">Range</span>
|
|
<span class="hint">longer spans load 2 years at a time</span>
|
|
</div>
|
|
<label>From <input id="range-start" type="month" /></label>
|
|
<label>To <input id="range-end" type="month" /></label>
|
|
<button type="button" id="range-refresh" class="range-refresh" hidden>Refresh dates ↻</button>
|
|
</div>
|
|
<div id="cal-seasonyear" class="cal-seasonyear"></div>
|
|
</div>
|
|
|
|
<!-- Metric selector sits below the time filters, right above the grid it colors. -->
|
|
<div id="metric-block" class="metric-block" hidden>
|
|
<span class="cal-filter-label">Color the calendar by</span>
|
|
<div class="metric-toggle" id="metric-toggle" role="group" aria-label="Color the calendar by">
|
|
<button type="button" data-metric="tmax" class="active">High</button>
|
|
<button type="button" data-metric="tmin">Low</button>
|
|
<button type="button" data-metric="feels">Feels</button>
|
|
<button type="button" data-metric="humid">Humid</button>
|
|
<button type="button" data-metric="wind">Wind</button>
|
|
<button type="button" data-metric="gust">Gust</button>
|
|
<button type="button" data-metric="precip">Precip</button>
|
|
<button type="button" data-metric="dsr">Dry streak</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Category totals for the current metric across the shown (and weather-
|
|
filtered) days: a stacked share bar + per-category percentages. -->
|
|
<div id="cal-totals" class="cal-totals" hidden></div>
|
|
|
|
<div class="placeholder" id="cal-placeholder">
|
|
<p>Search a place — or open this from a graded location on the map — to see how
|
|
every day of the last two years graded against that spot's own climate history.</p>
|
|
</div>
|
|
<div id="calendar" class="calendar"></div>
|
|
<div id="cal-key"></div>
|
|
<div id="cal-tip" class="chart-tip" hidden></div>
|
|
</main>
|
|
|
|
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
|
|
<script src="nav.js"></script>
|
|
<script src="mappicker.js"></script>
|
|
<script src="calendar.js"></script>
|
|
</body>
|
|
</html>
|