{#
The chart macros. Every SVG on /progress comes through here, and every coordinate in it
was computed by core/chart.py โ this file prints, it does not calculate. That split is
the whole point: the geometry has tests (tests/test_chart.py), and a Jinja loop that
builds polyline points out of `{% set %}` list mutation does not.
๐ด NO LIBRARY, AND NOT AS A SACRIFICE. The app's CSP is `default-src 'self'` and
nothing on this box is fetched from anywhere. A line chart is a list of coordinates.
๐ด THE GAP RULE IS VISIBLE HERE: a series renders as SEVERAL polylines, one per run of
consecutive measured points, plus dots for the runs of one. A single polyline through
the lot would draw a confident line across a fortnight nobody measured.
#}
{% macro axes(c) %}
{% for g in c.grid %}
{{ c.why }}
{% endmacro %} {% macro line(c, note="") %}Each line is scaled to its own range (shown above) so they fit one picture. Only the time axis is shared โ how far apart two lines sit means nothing.
{% endif %} {% if note %}{{ note }}
{% endif %} {% endif %}{{ note }}
{% endif %} {% endif %}{{ note }}
{% endif %} {{ body }}