The server-rendered SEO pages shared base.html.j2's nav but carried no JS, so
they lacked the °F/°C toggle and account/bell, and their temperatures were baked
as dual-unit strings that couldn't respond to a toggle.
- Load units.js + account.js + climate.js on base.html.j2, so every SEO page gets
the same header as the interactive pages (nav + °F/°C toggle + account + bell).
- Emit each temperature as <span class="temp" data-temp-f> (default °F text, real
for crawlers/no-JS); climate.js rewrites them to the active unit on load and on
toggle. Tint classes stay pinned to absolute °F. Drops the inline "(NN°C)".
- Make account.js base-aware: derive the app base from import.meta.url so its
api/v2 fetches and the alerts links resolve from deep /climate/{slug} URLs
instead of 404ing. Equivalent on the depth-1 interactive pages.
- Default the unit from the browser locale for first-time visitors (no stored
pref): en-US → °F, everyone else → °C. A stored choice always wins.
36 lines
2.3 KiB
Django/Jinja
36 lines
2.3 KiB
Django/Jinja
{% extends "base.html.j2" %}
|
||
{% block title %}{{ page_title }}{% endblock %}
|
||
{% block description %}{{ page_description }}{% endblock %}
|
||
{% block canonical_path %}{{ canonical_path }}{% endblock %}
|
||
{% block content %}
|
||
<nav class="breadcrumb" aria-label="Breadcrumb">
|
||
{% for label, href in breadcrumb %}{% if href %}<a href="{{ href }}">{{ label }}</a>{% else %}<span>{{ label }}</span>{% endif %}{% if not loop.last %} <span class="sep">›</span> {% endif %}{% endfor %}
|
||
</nav>
|
||
<article class="climate-page">
|
||
<h1>About Thermograph</h1>
|
||
<p class="lede">Thermograph answers one question for any point on Earth: <b>how unusual is this
|
||
weather?</b> Instead of an absolute temperature, it shows where a day falls in that exact
|
||
location's own climate history.</p>
|
||
|
||
<h2>Where the data comes from</h2>
|
||
<p>The ~45-year daily record — high, low, feels-like, humidity, wind, gust and precipitation —
|
||
comes from the <b>ERA5 reanalysis</b> (ECMWF), served via <a href="https://open-meteo.com/" rel="nofollow">Open-Meteo</a>.
|
||
Because reanalysis is a gridded, model-consistent record, Thermograph works even where there's
|
||
no weather station — anywhere on the ~4 sq mi grid.</p>
|
||
|
||
<h2>How a day is graded</h2>
|
||
<p>For each metric and date, Thermograph builds a reference distribution from every historical day
|
||
within <b>±7 days of that day-of-year</b> — a 15-day seasonal window across all years. The
|
||
observed value is placed on that distribution as an <a href="{{ base }}/glossary/percentile">empirical
|
||
percentile</a>, then mapped to a grade from “Below Normal” through “High” to “Near Record”.</p>
|
||
<p>Everything is <b>relative to the location</b>: a {{ temp(60) }} day can be “Above Normal” in one place and
|
||
“Below Normal” in another. Precipitation is graded only among days that actually rained, so “Heavy”
|
||
means heavy for a rainy day <i>here</i>. See the <a href="{{ base }}/legend">grade guide</a> for the full scale.</p>
|
||
|
||
<h2>Freshness</h2>
|
||
<p>The historical archive updates as new days are added; recent and forecast conditions refresh hourly.
|
||
City climate pages show the latest recorded day graded against the local normal.</p>
|
||
|
||
<p><a class="cta" href="{{ base }}/">Open the weather grader →</a></p>
|
||
</article>
|
||
{% endblock %}
|