<sectionclass="rep-timeline"data-timeline{% ifletSome(p) = play %} data-play="{{ p }}"{% endif %}>
20
<divclass="rep-tl-bar">
21
<buttontype="button"class="rep-tl-btn"data-tl-playaria-label="{% if play.is_some() %}Stop playing{% else %}Play through the runs{% endif %}">{% if play.is_some() %}■ Stop{% else %}▶ Play{% endif %}</button>
22
<labelclass="small mute">every <selectdata-tl-speedaria-label="Seconds per run">{% for s in [1u32, 2, 3, 5, 10] %}<optionvalue="{{ s }}"{% ifplay.unwrap_or(2) == *s %} selected{% endif %}>{{ s }} s</option>{% endfor %}</select></label>
<labelclass="mute">compare with <selectname="compare"data-autosubmitaria-label="Run to compare with"><optionvalue="">none</option>{% for t in timeline %}{% if !t.current %}<optionvalue="{{ t.id }}"{% ift.compared %} selected{% endif %}>{{ t.label }}</option>{% endif %}{% endfor %}</select></label>
<spanclass="small mute rep-tl-keys">← → step through runs</span>
29
</div>
30
<olclass="rep-tl-stops">
31
{% for t in timeline %}<li><ahref="{{ t.href }}"class="rep-tl-stop{% if t.current %} on{% endif %}{% if t.compared %} cmp{% endif %}"title="{{ t.tip }}"{% ift.current %} aria-current="true"{% endif %} data-tl-stop><spanclass="sr">{{ t.label }}</span></a></li>{% endfor %}
32
</ol>
33
<divclass="rep-tl-ends small mute"><span>{% if let Some(f) = timeline.first() %}{{ f.label }}{% endif %}</span><span>{% if let Some(l) = timeline.last() %}{{ l.label }}{% endif %}</span></div>
34
</section>
35
{% endif %}
36
37
{% if let Some((other, rows, _)) = compare %}
38
<sectionclass="panel">
39
<h2class="rep-cmp-h">This run against {% if let Some(n) = other.run_number %}run #{{ n }}{% else %}an upload{% endif %} <aclass="small"href="{{ repo.url }}/reports/{{ report.name }}?id={{ report.id }}">stop comparing</a></h2>
40
<tableclass="rep-table">
41
<thead><tr><th>Metric</th><thclass="num">{% if let Some(n) = report.run_number %}run #{{ n }}{% else %}this{% endif %}</th><thclass="num">{% if let Some(n) = other.run_number %}run #{{ n }}{% else %}that{% endif %}</th><thclass="num">Difference</th></tr></thead>
{% if report.files_expired_ms.is_some() %}<pclass="strip">This run's files have expired under retention: its metrics and summary are kept, its page and data are not. Runs on {{ repo.default_bookmark }} keep their files, and the newest {{ crate::reports::KEEP_OTHER_RUNS }} runs on any other bookmark.</p>{% endif %}
<pclass="small mute">The report's own page, in a sandbox: its scripts run with no access to your session or this hub. <ahref="{{ src }}"target="_blank"rel="noopener">Open it alone</a>.</p>
76
</section>
77
{% endif %}
78
79
<divclass="cov-grid">
80
{% if !context.is_empty() %}
81
<sectionclass="panel cov-card">
82
<h2>Context</h2>
83
<dlclass="rep-context">{% for (k, v) in context %}<dt>{{ k }}</dt><dd>{{ v }}</dd>{% endfor %}</dl>
84
</section>
85
{% endif %}
86
<sectionclass="panel cov-card">
87
<h2>Runs on {{ report.bookmark }}</h2>
88
<ulclass="rep-runs">
89
{% for r in runs.iter().take(15) %}
90
<li{% ifr.id==report.id %} class="on"{% endif %}><ahref="{{ repo.url }}/reports/{{ report.name }}?id={{ r.id }}">{% if let Some(n) = r.run_number %}run #{{ n }}{% else %}upload{% endif %}</a><spanclass="mute small"><timetitle="{{ r.created_ms|when_i }}">{{ r.created_ms|ago_i }}</time>{% if !r.summary.is_empty() %} · {{ r.summary }}{% endif %}</span></li>