|
|
|
@@ -106,6 +106,7 @@
|
|
|
|
|
<p id="guest-banner" class="guest-banner" hidden></p>
|
|
|
|
|
|
|
|
|
|
<main>
|
|
|
|
|
|
|
|
|
|
<section class="day-bar">
|
|
|
|
|
<!-- Compact twin of the big timer below: invisible (but keeping its
|
|
|
|
|
slot) while the big card is on screen, shown once it scrolls
|
|
|
|
@@ -128,12 +129,6 @@
|
|
|
|
|
<button type="button" id="day-today" class="ghost">Today</button>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section id="big-clock" class="big-clock" hidden>
|
|
|
|
|
<div class="bc-label" id="bc-label">—</div>
|
|
|
|
|
<div class="bc-time" id="bc-time">0:00</div>
|
|
|
|
|
<div class="bc-since" id="bc-since"></div>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="quick-actions">
|
|
|
|
|
<h2>Log event</h2>
|
|
|
|
|
<!-- Explicit rows rather than one auto-fit grid: a start/end pair has
|
|
|
|
@@ -162,6 +157,17 @@
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<!-- Five tabs so each screen holds one subject rather than all
|
|
|
|
|
fourteen panels in one column. The day bar and the log buttons stay
|
|
|
|
|
above them: logging has to be one tap from wherever you are. -->
|
|
|
|
|
<nav class="tabs" role="tablist" aria-label="Sections">
|
|
|
|
|
<button type="button" class="tab" role="tab" data-tab="today" id="tab-today" aria-controls="tabpanel-today" aria-selected="false" tabindex="-1">Today</button>
|
|
|
|
|
<button type="button" class="tab" role="tab" data-tab="sleep" id="tab-sleep" aria-controls="tabpanel-sleep" aria-selected="false" tabindex="-1">Sleep</button>
|
|
|
|
|
<button type="button" class="tab" role="tab" data-tab="walks" id="tab-walks" aria-controls="tabpanel-walks" aria-selected="false" tabindex="-1">Walks</button>
|
|
|
|
|
<button type="button" class="tab" role="tab" data-tab="habits" id="tab-habits" aria-controls="tabpanel-habits" aria-selected="false" tabindex="-1">Habits</button>
|
|
|
|
|
<button type="button" class="tab" role="tab" data-tab="growth" id="tab-growth" aria-controls="tabpanel-growth" aria-selected="false" tabindex="-1">Growth</button>
|
|
|
|
|
</nav>
|
|
|
|
|
|
|
|
|
|
<!-- Page-level, not a panel's: every panel below that covers more than
|
|
|
|
|
one day reads this, so it sits on its own row above them all rather
|
|
|
|
|
than inside one of them, where it read as that panel's own control
|
|
|
|
@@ -175,230 +181,247 @@
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<section class="training" data-panel="training">
|
|
|
|
|
<h2>Training</h2>
|
|
|
|
|
<ul id="training-list" class="training-list"></ul>
|
|
|
|
|
<p id="training-empty" class="empty">No exercises yet. Add one to start tracking training.</p>
|
|
|
|
|
<button type="button" id="exercise-add" class="ghost training-add">Add exercise</button>
|
|
|
|
|
<div class="chart training-chart" id="training-chart-wrap" hidden>
|
|
|
|
|
<div class="chart-title">Consistency <span data-chart-days-label>(last 7 days)</span></div>
|
|
|
|
|
<svg id="chart-training" class="chart-svg" viewBox="0 0 320 60" role="img" aria-label="Training sessions per exercise per day"></svg>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
<div class="tab-panel" data-tab="today" id="tabpanel-today" role="tabpanel" aria-labelledby="tab-today" hidden>
|
|
|
|
|
<section id="big-clock" class="big-clock" hidden>
|
|
|
|
|
<div class="bc-label" id="bc-label">—</div>
|
|
|
|
|
<div class="bc-time" id="bc-time">0:00</div>
|
|
|
|
|
<div class="bc-since" id="bc-since"></div>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="overview" data-panel="overview">
|
|
|
|
|
<!-- The toggle lives here rather than in the day bar: that bar is held
|
|
|
|
|
to one row on small phones and a sixth control would break it,
|
|
|
|
|
while this panel is the selected day's summary and has the room. -->
|
|
|
|
|
<div class="overview-head">
|
|
|
|
|
<h2 id="overview-title">Today's overview</h2>
|
|
|
|
|
<button type="button" id="exclude-day" class="ghost exclude-btn"
|
|
|
|
|
aria-pressed="false"
|
|
|
|
|
title="Leave this day out of the charts and averages">⊘ Not counted</button>
|
|
|
|
|
</div>
|
|
|
|
|
<p id="excluded-note" class="muted-note excluded-note" hidden>
|
|
|
|
|
Not counted in the charts and averages. Everything below is unchanged.
|
|
|
|
|
</p>
|
|
|
|
|
<div class="stats">
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Sleep</div>
|
|
|
|
|
<div class="stat-value" id="stat-sleep">0h 0m</div>
|
|
|
|
|
<section class="overview" data-panel="overview">
|
|
|
|
|
<!-- The toggle lives here rather than in the day bar: that bar is held
|
|
|
|
|
to one row on small phones and a sixth control would break it,
|
|
|
|
|
while this panel is the selected day's summary and has the room. -->
|
|
|
|
|
<div class="overview-head">
|
|
|
|
|
<h2 id="overview-title">Today's overview</h2>
|
|
|
|
|
<button type="button" id="exclude-day" class="ghost exclude-btn"
|
|
|
|
|
aria-pressed="false"
|
|
|
|
|
title="Leave this day out of the charts and averages">⊘ Not counted</button>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Awake</div>
|
|
|
|
|
<div class="stat-value" id="stat-awake">0h 0m</div>
|
|
|
|
|
<p id="excluded-note" class="muted-note excluded-note" hidden>
|
|
|
|
|
Not counted in the charts and averages. Everything below is unchanged.
|
|
|
|
|
</p>
|
|
|
|
|
<div class="stats">
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Sleep</div>
|
|
|
|
|
<div class="stat-value" id="stat-sleep">0h 0m</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Awake</div>
|
|
|
|
|
<div class="stat-value" id="stat-awake">0h 0m</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Walks</div>
|
|
|
|
|
<div class="stat-value" id="stat-walk">0m</div>
|
|
|
|
|
<div class="stat-sub" id="stat-walk-count" hidden></div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Meals</div>
|
|
|
|
|
<div class="stat-value" id="stat-meals">0</div>
|
|
|
|
|
<div class="stat-sub" id="stat-meals-grams" hidden></div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Pees</div>
|
|
|
|
|
<div class="stat-value" id="stat-pees">0</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Poos</div>
|
|
|
|
|
<div class="stat-value" id="stat-poos">0</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Training</div>
|
|
|
|
|
<div class="stat-value" id="stat-training">0</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Walks</div>
|
|
|
|
|
<div class="stat-value" id="stat-walk">0m</div>
|
|
|
|
|
<div class="stat-sub" id="stat-walk-count" hidden></div>
|
|
|
|
|
|
|
|
|
|
<div class="lasts">
|
|
|
|
|
<div class="last-row"><span>Last pee</span><span id="last-pee">—</span></div>
|
|
|
|
|
<div class="last-row"><span>Last poo</span><span id="last-poo">—</span></div>
|
|
|
|
|
<div class="last-row"><span>Last meal</span><span id="last-eat">—</span></div>
|
|
|
|
|
<div class="last-row"><span>Last sleep</span><span id="last-sleep">—</span></div>
|
|
|
|
|
<div class="last-row"><span>Last walk</span><span id="last-walk">—</span></div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Meals</div>
|
|
|
|
|
<div class="stat-value" id="stat-meals">0</div>
|
|
|
|
|
<div class="stat-sub" id="stat-meals-grams" hidden></div>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<!-- Sleep and wake windows are the same boundaries read two ways — a wake
|
|
|
|
|
window is exactly the gap between two sleeps — so they interleave into
|
|
|
|
|
one alternating list rather than sitting in two panels that each show
|
|
|
|
|
half the day. Every row carries its state; the open one keeps the
|
|
|
|
|
highlight. -->
|
|
|
|
|
<section class="sleepwake" data-panel="sleep-wake">
|
|
|
|
|
<h2>Sleep & wake</h2>
|
|
|
|
|
<ul id="sleep-wake-list" class="wake-list"></ul>
|
|
|
|
|
<p id="sleep-wake-empty" class="empty">No sleep or wake windows yet for this day.</p>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="history" data-panel="history">
|
|
|
|
|
<h2>History</h2>
|
|
|
|
|
<ul id="event-list" class="event-list"></ul>
|
|
|
|
|
<p id="empty-state" class="empty">No events logged for this day.</p>
|
|
|
|
|
</section>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="tab-panel" data-tab="sleep" id="tabpanel-sleep" role="tabpanel" aria-labelledby="tab-sleep" hidden>
|
|
|
|
|
<section class="patterns" data-panel="sleep-daily">
|
|
|
|
|
<h2>Sleep <span class="muted-note" data-chart-days-label>(last 7 days)</span></h2>
|
|
|
|
|
<div class="chart">
|
|
|
|
|
<div class="chart-title">Hours per day</div>
|
|
|
|
|
<svg id="chart-sleep" class="chart-svg" viewBox="0 0 320 160" role="img" aria-label="Sleep hours per day"></svg>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Pees</div>
|
|
|
|
|
<div class="stat-value" id="stat-pees">0</div>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="patterns" data-panel="sleep-timeline">
|
|
|
|
|
<h2><span id="sleep-timeline-title">When sleeping</span> <span class="muted-note" data-chart-days-label>(last 7 days)</span></h2>
|
|
|
|
|
<svg id="chart-sleep-timeline" class="chart-svg" viewBox="0 0 320 125" role="img" aria-label="Sleep periods per day"></svg>
|
|
|
|
|
<p class="muted-note">Each row is a day, midnight to midnight; shaded = asleep. The marker is now. Tap a row to open that day.</p>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="patterns" data-panel="sleep-trend">
|
|
|
|
|
<h2>Sleep trend</h2>
|
|
|
|
|
<svg id="chart-sleep-trend" class="chart-svg" viewBox="0 0 320 220" role="img" aria-label="Cumulative sleep hours through the selected day, the day before it, the recent average and (for today) the projected end-of-day total, with the age-based sleep goal band"></svg>
|
|
|
|
|
<div class="legend">
|
|
|
|
|
<span class="lg trend-today"><span class="sw"></span><span id="legend-trend-today-text">Today</span></span>
|
|
|
|
|
<span class="lg trend-projected" id="legend-trend-projected" hidden><span class="sw"></span><span id="legend-trend-projected-text">Projected</span></span>
|
|
|
|
|
<span class="lg trend-yesterday" id="legend-trend-yesterday"><span class="sw"></span><span id="legend-trend-yesterday-text">Yesterday</span></span>
|
|
|
|
|
<span class="lg trend-avg" id="legend-trend-avg"><span class="sw"></span><span id="legend-trend-avg-text">7-day avg</span></span>
|
|
|
|
|
<span class="lg trend-goal" id="legend-trend-goal" hidden><span class="sw"></span><span id="legend-trend-goal-text">Goal</span></span>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Poos</div>
|
|
|
|
|
<div class="stat-value" id="stat-poos">0</div>
|
|
|
|
|
<p class="muted-note">Hours slept so far at each point of the day, against yesterday and the average over the picked chart window. The dashed tail continues today's line the way the average day usually plays out. The axis is stretched above 10h to give the hours around the goal more room.</p>
|
|
|
|
|
</section>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="tab-panel" data-tab="walks" id="tabpanel-walks" role="tabpanel" aria-labelledby="tab-walks" hidden>
|
|
|
|
|
<section class="walks" data-panel="walks">
|
|
|
|
|
<h2>Walks <span class="muted-note" id="walk-total"></span></h2>
|
|
|
|
|
<ul id="walk-list" class="wake-list"></ul>
|
|
|
|
|
<p id="walk-empty" class="empty">No walks yet for this day. Use 🦮 Walk start / 🏁 Walk end to time one.</p>
|
|
|
|
|
<div class="chart walk-chart" id="walk-chart-wrap" hidden>
|
|
|
|
|
<div class="chart-title">Minutes per day <span data-chart-days-label>(last 7 days)</span></div>
|
|
|
|
|
<svg id="chart-walk" class="chart-svg" viewBox="0 0 320 160" role="img" aria-label="Minutes walked per day"></svg>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Training</div>
|
|
|
|
|
<div class="stat-value" id="stat-training">0</div>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<!-- The two walk patterns mirror the sleep ones on the Sleep tab, drawn
|
|
|
|
|
from walk windows instead of sleep windows. Both stay hidden until
|
|
|
|
|
there is a walk to draw, so they cost nothing to anyone not
|
|
|
|
|
tracking walks. -->
|
|
|
|
|
<section class="patterns" data-panel="walk-timeline" hidden>
|
|
|
|
|
<h2><span id="walk-timeline-title">When walking</span> <span class="muted-note" data-chart-days-label>(last 7 days)</span></h2>
|
|
|
|
|
<svg id="chart-walk-timeline" class="chart-svg" viewBox="0 0 320 125" role="img" aria-label="Walks per day"></svg>
|
|
|
|
|
<p class="muted-note">Each row is a day, midnight to midnight; shaded = out on a walk. The marker is now. Tap a row to open that day.</p>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="patterns" data-panel="walk-trend" hidden>
|
|
|
|
|
<h2>Walk trend</h2>
|
|
|
|
|
<svg id="chart-walk-trend" class="chart-svg" viewBox="0 0 320 180" role="img" aria-label="Cumulative minutes walked through the selected day, the day before it, and the recent average"></svg>
|
|
|
|
|
<div class="legend">
|
|
|
|
|
<span class="lg wtrend-today"><span class="sw"></span><span id="legend-wtrend-today-text">Today</span></span>
|
|
|
|
|
<span class="lg wtrend-yesterday" id="legend-wtrend-yesterday"><span class="sw"></span><span id="legend-wtrend-yesterday-text">Yesterday</span></span>
|
|
|
|
|
<span class="lg wtrend-avg" id="legend-wtrend-avg"><span class="sw"></span><span id="legend-wtrend-avg-text">7-day avg</span></span>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<p class="muted-note">Minutes walked so far at each point of the day, against yesterday and the average over the picked window. The line climbs only while a walk is on, so every step is one walk.</p>
|
|
|
|
|
</section>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="lasts">
|
|
|
|
|
<div class="last-row"><span>Last pee</span><span id="last-pee">—</span></div>
|
|
|
|
|
<div class="last-row"><span>Last poo</span><span id="last-poo">—</span></div>
|
|
|
|
|
<div class="last-row"><span>Last meal</span><span id="last-eat">—</span></div>
|
|
|
|
|
<div class="last-row"><span>Last sleep</span><span id="last-sleep">—</span></div>
|
|
|
|
|
<div class="last-row"><span>Last walk</span><span id="last-walk">—</span></div>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="timing" data-panel="timing">
|
|
|
|
|
<h2>Timing <span class="muted-note" data-chart-days-label>(last 7 days)</span></h2>
|
|
|
|
|
<!-- One range chart per type, drawn by drawTimingChart: the band spans
|
|
|
|
|
the shortest to the typical gap and the marker is how long it has
|
|
|
|
|
been since the last one, so a marker past the band reads as due. -->
|
|
|
|
|
<div class="timing-charts">
|
|
|
|
|
<div class="timing-item">
|
|
|
|
|
<div class="timing-name">Pees</div>
|
|
|
|
|
<svg id="timing-chart-pee" class="timing-chart" viewBox="0 0 320 50" role="img"></svg>
|
|
|
|
|
<p class="muted-note timing-note" id="timing-note-pee" hidden></p>
|
|
|
|
|
<div class="tab-panel" data-tab="habits" id="tabpanel-habits" role="tabpanel" aria-labelledby="tab-habits" hidden>
|
|
|
|
|
<section class="timing" data-panel="timing">
|
|
|
|
|
<h2>Timing <span class="muted-note" data-chart-days-label>(last 7 days)</span></h2>
|
|
|
|
|
<!-- One range chart per type, drawn by drawTimingChart: the band spans
|
|
|
|
|
the shortest to the typical gap and the marker is how long it has
|
|
|
|
|
been since the last one, so a marker past the band reads as due. -->
|
|
|
|
|
<div class="timing-charts">
|
|
|
|
|
<div class="timing-item">
|
|
|
|
|
<div class="timing-name">Pees</div>
|
|
|
|
|
<svg id="timing-chart-pee" class="timing-chart" viewBox="0 0 320 50" role="img"></svg>
|
|
|
|
|
<p class="muted-note timing-note" id="timing-note-pee" hidden></p>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="timing-item">
|
|
|
|
|
<div class="timing-name">Poos</div>
|
|
|
|
|
<svg id="timing-chart-poo" class="timing-chart" viewBox="0 0 320 50" role="img"></svg>
|
|
|
|
|
<p class="muted-note timing-note" id="timing-note-poo" hidden></p>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="timing-item">
|
|
|
|
|
<div class="timing-name">Meals</div>
|
|
|
|
|
<svg id="timing-chart-eat" class="timing-chart" viewBox="0 0 320 50" role="img"></svg>
|
|
|
|
|
<p class="muted-note timing-note" id="timing-note-eat" hidden></p>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="timing-item">
|
|
|
|
|
<div class="timing-name">Poos</div>
|
|
|
|
|
<svg id="timing-chart-poo" class="timing-chart" viewBox="0 0 320 50" role="img"></svg>
|
|
|
|
|
<p class="muted-note timing-note" id="timing-note-poo" hidden></p>
|
|
|
|
|
<!-- The axis is stretched (see drawTimingChart), so say what the middle
|
|
|
|
|
of a bar means rather than leave it to be inferred. -->
|
|
|
|
|
<p class="muted-note">The middle of every bar is that type's typical gap: left of it is sooner than usual, right of it is longer, and the faded stretch runs out to the longest gap in the window.</p>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<!-- One panel for the three views of the same events: how many a day,
|
|
|
|
|
how much food went with them, and what hours they fall in. -->
|
|
|
|
|
<section class="patterns" data-panel="counts">
|
|
|
|
|
<h2>Pees, poos & meals <span class="muted-note" data-chart-days-label>(last 7 days)</span></h2>
|
|
|
|
|
<div class="chart">
|
|
|
|
|
<div class="chart-title">Daily counts</div>
|
|
|
|
|
<svg id="chart-counts" class="chart-svg" viewBox="0 0 320 180" role="img" aria-label="Pee, poo and meal counts per day"></svg>
|
|
|
|
|
<div class="legend legend-toggle" id="counts-metrics" role="group" aria-label="Which counts to show">
|
|
|
|
|
<label class="lg pee"><input type="checkbox" data-metric="pees" checked /><span class="sw"></span>Pees</label>
|
|
|
|
|
<label class="lg poo"><input type="checkbox" data-metric="poos" checked /><span class="sw"></span>Poos</label>
|
|
|
|
|
<label class="lg eat"><input type="checkbox" data-metric="meals" checked /><span class="sw"></span>Meals</label>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="timing-item">
|
|
|
|
|
<div class="timing-name">Meals</div>
|
|
|
|
|
<svg id="timing-chart-eat" class="timing-chart" viewBox="0 0 320 50" role="img"></svg>
|
|
|
|
|
<p class="muted-note timing-note" id="timing-note-eat" hidden></p>
|
|
|
|
|
<div class="chart" id="grams-chart-wrap" hidden>
|
|
|
|
|
<div class="chart-title">Food (grams)</div>
|
|
|
|
|
<svg id="chart-grams" class="chart-svg" viewBox="0 0 320 160" role="img" aria-label="Grams of food eaten per day"></svg>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<!-- The axis is stretched (see drawTimingChart), so say what the middle
|
|
|
|
|
of a bar means rather than leave it to be inferred. -->
|
|
|
|
|
<p class="muted-note">The middle of every bar is that type's typical gap: left of it is sooner than usual, right of it is longer, and the faded stretch runs out to the longest gap in the window.</p>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<!-- Sleep and wake windows are the same boundaries read two ways — a wake
|
|
|
|
|
window is exactly the gap between two sleeps — so they interleave into
|
|
|
|
|
one alternating list rather than sitting in two panels that each show
|
|
|
|
|
half the day. Every row carries its state; the open one keeps the
|
|
|
|
|
highlight. -->
|
|
|
|
|
<section class="sleepwake" data-panel="sleep-wake">
|
|
|
|
|
<h2>Sleep & wake</h2>
|
|
|
|
|
<ul id="sleep-wake-list" class="wake-list"></ul>
|
|
|
|
|
<p id="sleep-wake-empty" class="empty">No sleep or wake windows yet for this day.</p>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="patterns" data-panel="sleep-daily">
|
|
|
|
|
<h2>Sleep <span class="muted-note" data-chart-days-label>(last 7 days)</span></h2>
|
|
|
|
|
<div class="chart">
|
|
|
|
|
<div class="chart-title">Hours per day</div>
|
|
|
|
|
<svg id="chart-sleep" class="chart-svg" viewBox="0 0 320 160" role="img" aria-label="Sleep hours per day"></svg>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="patterns" data-panel="sleep-timeline">
|
|
|
|
|
<h2><span id="sleep-timeline-title">When sleeping</span> <span class="muted-note" data-chart-days-label>(last 7 days)</span></h2>
|
|
|
|
|
<svg id="chart-sleep-timeline" class="chart-svg" viewBox="0 0 320 125" role="img" aria-label="Sleep periods per day"></svg>
|
|
|
|
|
<p class="muted-note">Each row is a day, midnight to midnight; shaded = asleep. The marker is now. Tap a row to open that day.</p>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="patterns" data-panel="sleep-trend">
|
|
|
|
|
<h2>Sleep trend</h2>
|
|
|
|
|
<svg id="chart-sleep-trend" class="chart-svg" viewBox="0 0 320 220" role="img" aria-label="Cumulative sleep hours through the selected day, the day before it, the recent average and (for today) the projected end-of-day total, with the age-based sleep goal band"></svg>
|
|
|
|
|
<div class="legend">
|
|
|
|
|
<span class="lg trend-today"><span class="sw"></span><span id="legend-trend-today-text">Today</span></span>
|
|
|
|
|
<span class="lg trend-projected" id="legend-trend-projected" hidden><span class="sw"></span><span id="legend-trend-projected-text">Projected</span></span>
|
|
|
|
|
<span class="lg trend-yesterday" id="legend-trend-yesterday"><span class="sw"></span><span id="legend-trend-yesterday-text">Yesterday</span></span>
|
|
|
|
|
<span class="lg trend-avg" id="legend-trend-avg"><span class="sw"></span><span id="legend-trend-avg-text">7-day avg</span></span>
|
|
|
|
|
<span class="lg trend-goal" id="legend-trend-goal" hidden><span class="sw"></span><span id="legend-trend-goal-text">Goal</span></span>
|
|
|
|
|
</div>
|
|
|
|
|
<p class="muted-note">Hours slept so far at each point of the day, against yesterday and the average over the picked chart window. The dashed tail continues today's line the way the average day usually plays out. The axis is stretched above 10h to give the hours around the goal more room.</p>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<!-- One panel for the three views of the same events: how many a day,
|
|
|
|
|
how much food went with them, and what hours they fall in. -->
|
|
|
|
|
<section class="patterns" data-panel="counts">
|
|
|
|
|
<h2>Pees, poos & meals <span class="muted-note" data-chart-days-label>(last 7 days)</span></h2>
|
|
|
|
|
<div class="chart">
|
|
|
|
|
<div class="chart-title">Daily counts</div>
|
|
|
|
|
<svg id="chart-counts" class="chart-svg" viewBox="0 0 320 180" role="img" aria-label="Pee, poo and meal counts per day"></svg>
|
|
|
|
|
<div class="legend legend-toggle" id="counts-metrics" role="group" aria-label="Which counts to show">
|
|
|
|
|
<label class="lg pee"><input type="checkbox" data-metric="pees" checked /><span class="sw"></span>Pees</label>
|
|
|
|
|
<label class="lg poo"><input type="checkbox" data-metric="poos" checked /><span class="sw"></span>Poos</label>
|
|
|
|
|
<label class="lg eat"><input type="checkbox" data-metric="meals" checked /><span class="sw"></span>Meals</label>
|
|
|
|
|
<div class="chart">
|
|
|
|
|
<div class="chart-title">By hour of day</div>
|
|
|
|
|
<svg id="chart-hour-heatmap" class="chart-svg" viewBox="0 0 320 120" role="img" aria-label="Pee, poo and meal frequency by hour of day"></svg>
|
|
|
|
|
<p id="hour-heatmap-info" class="muted-note hour-point-info" aria-live="polite"></p>
|
|
|
|
|
<p class="muted-note">Darker = happens more often at that hour; the marker is now.</p>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="chart" id="grams-chart-wrap" hidden>
|
|
|
|
|
<div class="chart-title">Food (grams)</div>
|
|
|
|
|
<svg id="chart-grams" class="chart-svg" viewBox="0 0 320 160" role="img" aria-label="Grams of food eaten per day"></svg>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="chart">
|
|
|
|
|
<div class="chart-title">By hour of day</div>
|
|
|
|
|
<svg id="chart-hour-heatmap" class="chart-svg" viewBox="0 0 320 120" role="img" aria-label="Pee, poo and meal frequency by hour of day"></svg>
|
|
|
|
|
<p id="hour-heatmap-info" class="muted-note hour-point-info" aria-live="polite"></p>
|
|
|
|
|
<p class="muted-note">Darker = happens more often at that hour; the marker is now.</p>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
</section>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<section class="walks" data-panel="walks">
|
|
|
|
|
<h2>Walks <span class="muted-note" id="walk-total"></span></h2>
|
|
|
|
|
<ul id="walk-list" class="wake-list"></ul>
|
|
|
|
|
<p id="walk-empty" class="empty">No walks yet for this day. Use 🦮 Walk start / 🏁 Walk end to time one.</p>
|
|
|
|
|
<div class="chart walk-chart" id="walk-chart-wrap" hidden>
|
|
|
|
|
<div class="chart-title">Minutes per day <span data-chart-days-label>(last 7 days)</span></div>
|
|
|
|
|
<svg id="chart-walk" class="chart-svg" viewBox="0 0 320 160" role="img" aria-label="Minutes walked per day"></svg>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<!-- The two walk patterns mirror the sleep ones below, drawn from walk
|
|
|
|
|
windows instead of sleep windows. Both stay hidden until there is a
|
|
|
|
|
walk to draw, so they cost nothing to anyone not tracking walks. -->
|
|
|
|
|
<section class="patterns" data-panel="walk-timeline" hidden>
|
|
|
|
|
<h2><span id="walk-timeline-title">When walking</span> <span class="muted-note" data-chart-days-label>(last 7 days)</span></h2>
|
|
|
|
|
<svg id="chart-walk-timeline" class="chart-svg" viewBox="0 0 320 125" role="img" aria-label="Walks per day"></svg>
|
|
|
|
|
<p class="muted-note">Each row is a day, midnight to midnight; shaded = out on a walk. The marker is now. Tap a row to open that day.</p>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="patterns" data-panel="walk-trend" hidden>
|
|
|
|
|
<h2>Walk trend</h2>
|
|
|
|
|
<svg id="chart-walk-trend" class="chart-svg" viewBox="0 0 320 180" role="img" aria-label="Cumulative minutes walked through the selected day, the day before it, and the recent average"></svg>
|
|
|
|
|
<div class="legend">
|
|
|
|
|
<span class="lg wtrend-today"><span class="sw"></span><span id="legend-wtrend-today-text">Today</span></span>
|
|
|
|
|
<span class="lg wtrend-yesterday" id="legend-wtrend-yesterday"><span class="sw"></span><span id="legend-wtrend-yesterday-text">Yesterday</span></span>
|
|
|
|
|
<span class="lg wtrend-avg" id="legend-wtrend-avg"><span class="sw"></span><span id="legend-wtrend-avg-text">7-day avg</span></span>
|
|
|
|
|
</div>
|
|
|
|
|
<p class="muted-note">Minutes walked so far at each point of the day, against yesterday and the average over the picked window. The line climbs only while a walk is on, so every step is one walk.</p>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="weight" data-panel="weight">
|
|
|
|
|
<h2>Weight</h2>
|
|
|
|
|
<div class="weight-summary">
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Latest</div>
|
|
|
|
|
<div class="stat-value" id="weight-latest">—</div>
|
|
|
|
|
<div class="tab-panel" data-tab="growth" id="tabpanel-growth" role="tabpanel" aria-labelledby="tab-growth" hidden>
|
|
|
|
|
<section class="weight" data-panel="weight">
|
|
|
|
|
<h2>Weight</h2>
|
|
|
|
|
<div class="weight-summary">
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Latest</div>
|
|
|
|
|
<div class="stat-value" id="weight-latest">—</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Since last</div>
|
|
|
|
|
<div class="stat-value" id="weight-change">—</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="stat">
|
|
|
|
|
<div class="stat-label">Since last</div>
|
|
|
|
|
<div class="stat-value" id="weight-change">—</div>
|
|
|
|
|
<div class="chart">
|
|
|
|
|
<div class="chart-title">Weight (kg)</div>
|
|
|
|
|
<svg id="chart-weight" class="chart-svg" viewBox="0 0 320 180" role="img" aria-label="Weight in kilograms over time"></svg>
|
|
|
|
|
<p id="weight-point-info" class="muted-note weight-point-info"></p>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="chart">
|
|
|
|
|
<div class="chart-title">Weight (kg)</div>
|
|
|
|
|
<svg id="chart-weight" class="chart-svg" viewBox="0 0 320 180" role="img" aria-label="Weight in kilograms over time"></svg>
|
|
|
|
|
<p id="weight-point-info" class="muted-note weight-point-info"></p>
|
|
|
|
|
</div>
|
|
|
|
|
<!-- Folds on its own h3, independently of the Weight panel around it:
|
|
|
|
|
the row list grows by one every weigh-in, and the summary and the
|
|
|
|
|
curve above it are what you usually want left on screen. -->
|
|
|
|
|
<div class="subpanel" data-panel="weight-history">
|
|
|
|
|
<h3>History</h3>
|
|
|
|
|
<ul id="weight-list" class="wake-list"></ul>
|
|
|
|
|
<p id="weight-empty" class="empty">No weigh-ins logged yet.</p>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
<!-- Folds on its own h3, independently of the Weight panel around it:
|
|
|
|
|
the row list grows by one every weigh-in, and the summary and the
|
|
|
|
|
curve above it are what you usually want left on screen. -->
|
|
|
|
|
<div class="subpanel" data-panel="weight-history">
|
|
|
|
|
<h3>History</h3>
|
|
|
|
|
<ul id="weight-list" class="wake-list"></ul>
|
|
|
|
|
<p id="weight-empty" class="empty">No weigh-ins logged yet.</p>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="notes-log" data-panel="notes">
|
|
|
|
|
<h2>Notes</h2>
|
|
|
|
|
<ul id="notes-list" class="event-list"></ul>
|
|
|
|
|
<p id="notes-empty" class="empty">No notes yet. Use the 📝 Note button to jot down things like vaccinations or vet visits — they'll be listed here across every day.</p>
|
|
|
|
|
</section>
|
|
|
|
|
<section class="training" data-panel="training">
|
|
|
|
|
<h2>Training</h2>
|
|
|
|
|
<ul id="training-list" class="training-list"></ul>
|
|
|
|
|
<p id="training-empty" class="empty">No exercises yet. Add one to start tracking training.</p>
|
|
|
|
|
<button type="button" id="exercise-add" class="ghost training-add">Add exercise</button>
|
|
|
|
|
<div class="chart training-chart" id="training-chart-wrap" hidden>
|
|
|
|
|
<div class="chart-title">Consistency <span data-chart-days-label>(last 7 days)</span></div>
|
|
|
|
|
<svg id="chart-training" class="chart-svg" viewBox="0 0 320 60" role="img" aria-label="Training sessions per exercise per day"></svg>
|
|
|
|
|
</div>
|
|
|
|
|
</section>
|
|
|
|
|
|
|
|
|
|
<section class="history" data-panel="history">
|
|
|
|
|
<h2>History</h2>
|
|
|
|
|
<ul id="event-list" class="event-list"></ul>
|
|
|
|
|
<p id="empty-state" class="empty">No events logged for this day.</p>
|
|
|
|
|
</section>
|
|
|
|
|
<section class="notes-log" data-panel="notes">
|
|
|
|
|
<h2>Notes</h2>
|
|
|
|
|
<ul id="notes-list" class="event-list"></ul>
|
|
|
|
|
<p id="notes-empty" class="empty">No notes yet. Use the 📝 Note button to jot down things like vaccinations or vet visits — they'll be listed here across every day.</p>
|
|
|
|
|
</section>
|
|
|
|
|
</div>
|
|
|
|
|
</main>
|
|
|
|
|
|
|
|
|
|
<footer class="app-footer">
|
|
|
|
|