+
+ {% for r, label in [("3m","3M"),("6m","6M"),("1y","1Y"),("2y","2Y"),("5y","5Y")] %}
+
+ {% endfor %}
+
+
+ {% if location_id %}
+
← All Locations
+ {% endif %}
+
+
+
+
+
+ {{ loc.location_name }}
+ {{ loc.country }}
+ {{ loc.variety }}
+
+
{{ loc.lat | round(2) }}°, {{ loc.lon | round(2) }}°
+
+
+
+
+
+
Stress Index
+
+ {% if latest %}{{ "{:.0f}".format(latest.crop_stress_index) }}/100{% else %}--{% endif %}
+
+
crop stress composite{% if latest %} · {{ latest.observation_date }}{% endif %}
+
+
+
7-Day Precipitation
+
+ {% if latest %}{{ "{:.1f}".format(latest.precip_sum_7d_mm) }} mm{% else %}--{% endif %}
+
+
rolling 7-day total
+
+
+
30-Day Precipitation
+
+ {% if latest %}{{ "{:.0f}".format(latest.precip_sum_30d_mm) }} mm{% else %}--{% endif %}
+
+
rolling 30-day total
+
+
+
Temp Anomaly
+
+ {% if latest and latest.temp_anomaly_c is not none %}{{ "{:+.1f}°C".format(latest.temp_anomaly_c) }}{% else %}--{% endif %}
+
+
vs trailing 30-day mean
+
+
+
+{% if location_series %}
+
+
+
+
+
Avg Crop Stress Index
+
+ {% if stress_latest %}{{ "{:.0f}".format(stress_latest.avg_crop_stress_index) }}/100{% else %}--{% endif %}
+
+
across 12 origins{% if stress_latest %} · {{ stress_latest.observation_date }}{% endif %}
+
+
+
Locations Under Stress
+
+ {% if stress_latest %}{{ stress_latest.locations_under_stress }}/12{% else %}--{% endif %}
+
+
stress index > 20
+
+
+
Worst Origin
+
+ {% if stress_latest and stress_latest.worst_location_name %}{{ stress_latest.worst_location_name }}{% else %}--{% endif %}
+
+
{% if stress_latest and stress_latest.max_crop_stress_index %}peak stress {{ "{:.0f}".format(stress_latest.max_crop_stress_index) }}/100{% endif %}
+
+
+
Active Alerts
+
+ {{ active_alerts | length }}
+
+
drought / heat / frost / VPD
+
+
+
+
+