Compare commits
5
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ea9374b46 | ||
|
|
f9becddbc6 | ||
|
|
a7608829e9 | ||
|
|
9d69bac73b | ||
|
|
68840847f0 |
+12
-5
@@ -1030,14 +1030,17 @@
|
|||||||
// Sleep and wake windows are the same boundaries read two ways — a wake
|
// Sleep and wake windows are the same boundaries read two ways — a wake
|
||||||
// window is precisely the gap between two sleeps — so they alternate by
|
// window is precisely the gap between two sleeps — so they alternate by
|
||||||
// construction and sorting the two sets by start time interleaves them back
|
// construction and sorting the two sets by start time interleaves them back
|
||||||
// into the day's actual rhythm. Read in order, "45 minutes asleep after two
|
// into the day's actual rhythm, "45 minutes asleep after two and a half hours
|
||||||
// and a half hours up" is a single glance instead of a comparison between
|
// up" in one glance instead of a comparison between two lists.
|
||||||
// two lists.
|
//
|
||||||
|
// Newest first, like the history and notes logs: the row still running is
|
||||||
|
// then the first one you see, and today's list grows downward from where you
|
||||||
|
// are rather than pushing the current state further away with every window.
|
||||||
function sleepWakeWindowsForDay(events, day) {
|
function sleepWakeWindowsForDay(events, day) {
|
||||||
return [
|
return [
|
||||||
...sleepWindowsForDay(events, day).map(w => ({ ...w, cls: "sleep-ww", tag: "Asleep" })),
|
...sleepWindowsForDay(events, day).map(w => ({ ...w, cls: "sleep-ww", tag: "Asleep" })),
|
||||||
...wakeWindowsForDay(events, day).map(w => ({ ...w, cls: "wake-ww", tag: "Awake" })),
|
...wakeWindowsForDay(events, day).map(w => ({ ...w, cls: "wake-ww", tag: "Awake" })),
|
||||||
].sort((a, b) => a.start - b.start);
|
].sort((a, b) => b.start - a.start);
|
||||||
}
|
}
|
||||||
|
|
||||||
function renderSleepWake(events) {
|
function renderSleepWake(events) {
|
||||||
@@ -1051,9 +1054,13 @@
|
|||||||
function renderWalks(events) {
|
function renderWalks(events) {
|
||||||
const day = selectedDay();
|
const day = selectedDay();
|
||||||
const windows = walkWindowsForDay(events, day);
|
const windows = walkWindowsForDay(events, day);
|
||||||
|
// Newest first, like every other list in the app, so a walk in progress is
|
||||||
|
// the first row. Reversed here rather than in walkWindowsForDay, whose
|
||||||
|
// other callers — the day's total and the history rails — read the windows
|
||||||
|
// as a set and would only be made harder to follow by a display order.
|
||||||
renderWindowList(
|
renderWindowList(
|
||||||
"walk-list", "walk-empty",
|
"walk-list", "walk-empty",
|
||||||
windows,
|
[...windows].reverse(),
|
||||||
"Walking", "walk-ww",
|
"Walking", "walk-ww",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
+5
-1
@@ -1,6 +1,10 @@
|
|||||||
[
|
[
|
||||||
|
{ "date": "2026-08-31", "text": "The asleep timer text is a deeper blue, so “Asleep for” in the day-bar pill and on the big card is properly readable against its own pale blue background instead of the near-invisible blue-on-blue it was — the same treatment the awake gold just got, and it applies to the Asleep labels in the Sleep & wake list too" },
|
||||||
|
{ "date": "2026-08-31", "text": "The awake timer is sunshine too now — both the big “Awake for” card and the pill in the day bar — so the whole app tells asleep and awake apart by night-blue against day-gold rather than by blue against purple" },
|
||||||
|
{ "date": "2026-08-31", "text": "Awake stretches in the Sleep & wake list are sunshine yellow now instead of the app's purple — the same idea as the ☀️ on the timer pill — so asleep and awake read as night and day down the list rather than as two shades of the same accent" },
|
||||||
|
{ "date": "2026-08-31", "text": "The Walks list reads newest first as well, so a walk in progress is the top row and every list in the app now runs the same way" },
|
||||||
{ "date": "2026-08-31", "text": "The Walks panel and its two charts have moved down the page, below “Pees, poos & meals”" },
|
{ "date": "2026-08-31", "text": "The Walks panel and its two charts have moved down the page, below “Pees, poos & meals”" },
|
||||||
{ "date": "2026-08-31", "text": "Sleep windows and Wake windows are one “Sleep & wake” panel now, with the two interleaved into a single list in time order — asleep 22:10–06:05, awake until 08:30, asleep 45 min, and so on down the day. A wake window is just the gap between two sleeps, so the two lists were always halves of the same sequence, and reading them in order makes “only a 45-minute nap after two and a half hours up” obvious in a way two separate lists never did. Each row says which it is and carries a stripe in its colour; whichever one is still running keeps the highlight" },
|
{ "date": "2026-08-31", "text": "Sleep windows and Wake windows are one “Sleep & wake” panel now, with the two interleaved into a single list, newest first — awake since 12:30, asleep 11:40–12:30, awake since 09:15, and so on back through the day. A wake window is just the gap between two sleeps, so the two lists were always halves of the same sequence, and reading them together makes “only a 45-minute nap after two and a half hours up” obvious in a way two separate lists never did. Whatever is happening right now is the first row, as in the history and notes logs. Each row says which it is and carries a stripe in its colour; whichever one is still running keeps the highlight" },
|
||||||
{ "date": "2026-08-31", "text": "The list of weigh-ins under the Weight chart folds away on its own now — tap “History” inside the panel to collapse just the rows and keep the latest figure and the curve on screen. It remembers the choice like the panels do, and folding the whole Weight panel still takes everything with it" },
|
{ "date": "2026-08-31", "text": "The list of weigh-ins under the Weight chart folds away on its own now — tap “History” inside the panel to collapse just the rows and keep the latest figure and the curve on screen. It remembers the choice like the panels do, and folding the whole Weight panel still takes everything with it" },
|
||||||
{ "date": "2026-08-31", "text": "Walks now get the same two pattern views sleep has. “When … walks” is a day-per-row grid shaded where a walk was on, so you can see at a glance whether the routine is actually regular or drifts around. “Walk trend” draws the minutes walked so far at each point of the day against yesterday and the average over the picked window, with the age-based goal as a line and a ✓ once the day clears it — the line climbs only while a walk is on, so every step is one walk. Both appear under the Walks panel as soon as you have logged a walk, and stay out of the way until then" },
|
{ "date": "2026-08-31", "text": "Walks now get the same two pattern views sleep has. “When … walks” is a day-per-row grid shaded where a walk was on, so you can see at a glance whether the routine is actually regular or drifts around. “Walk trend” draws the minutes walked so far at each point of the day against yesterday and the average over the picked window, with the age-based goal as a line and a ✓ once the day clears it — the line climbs only while a walk is on, so every step is one walk. Both appear under the Walks panel as soon as you have logged a walk, and stay out of the way until then" },
|
||||||
{ "date": "2026-08-31", "text": "The 7d / 14d / 30d buttons now set the window for the Timing panel too. Until now the typical, shortest and longest gaps between pees, poos and meals were always measured over the last 7 days whatever you picked; switch to 30d and they are measured over 30, which settles down the typical gap once there is a month of history to draw on" },
|
{ "date": "2026-08-31", "text": "The 7d / 14d / 30d buttons now set the window for the Timing panel too. Until now the typical, shortest and longest gaps between pees, poos and meals were always measured over the last 7 days whatever you picked; switch to 30d and they are measured over 30, which settles down the typical gap once there is a month of history to draw on" },
|
||||||
|
|||||||
+27
-12
@@ -12,6 +12,13 @@
|
|||||||
--weight: #2bb3a3;
|
--weight: #2bb3a3;
|
||||||
--training: #b04ecf;
|
--training: #b04ecf;
|
||||||
--walk: #3f9e63;
|
--walk: #3f9e63;
|
||||||
|
/* Asleep and awake each come in two values: the bright one for stripes,
|
||||||
|
tints and fills, and an -ink for text on those pale grounds. Both inks
|
||||||
|
flip with the theme; the brights don't. --sleep itself was doing both
|
||||||
|
jobs and failing the second — 2.6:1 on the timer pill it painted. */
|
||||||
|
--sleep-ink: #4258cc;
|
||||||
|
--wake: #f2b705;
|
||||||
|
--wake-ink: #8f6400;
|
||||||
--note: #6f7a90;
|
--note: #6f7a90;
|
||||||
--danger: #d64545;
|
--danger: #d64545;
|
||||||
--gain: #2e9e5b;
|
--gain: #2e9e5b;
|
||||||
@@ -32,6 +39,8 @@
|
|||||||
--muted: #9c9bab;
|
--muted: #9c9bab;
|
||||||
--accent: #a690ff;
|
--accent: #a690ff;
|
||||||
--accent-soft: #2a2640;
|
--accent-soft: #2a2640;
|
||||||
|
--sleep-ink: #8ba4ff;
|
||||||
|
--wake-ink: #f5c451;
|
||||||
--border: #2c2a3a;
|
--border: #2c2a3a;
|
||||||
--shadow: 0 1px 2px rgba(0, 0, 0, 0.3), 0 4px 16px rgba(0, 0, 0, 0.3);
|
--shadow: 0 1px 2px rgba(0, 0, 0, 0.3), 0 4px 16px rgba(0, 0, 0, 0.3);
|
||||||
}
|
}
|
||||||
@@ -43,6 +52,8 @@
|
|||||||
--muted: #9c9bab;
|
--muted: #9c9bab;
|
||||||
--accent: #a690ff;
|
--accent: #a690ff;
|
||||||
--accent-soft: #2a2640;
|
--accent-soft: #2a2640;
|
||||||
|
--sleep-ink: #8ba4ff;
|
||||||
|
--wake-ink: #f5c451;
|
||||||
--border: #2c2a3a;
|
--border: #2c2a3a;
|
||||||
--shadow: 0 1px 2px rgba(0, 0, 0, 0.3), 0 4px 16px rgba(0, 0, 0, 0.3);
|
--shadow: 0 1px 2px rgba(0, 0, 0, 0.3), 0 4px 16px rgba(0, 0, 0, 0.3);
|
||||||
}
|
}
|
||||||
@@ -215,8 +226,10 @@ body::before {
|
|||||||
.bar-clock[hidden] { display: none; }
|
.bar-clock[hidden] { display: none; }
|
||||||
/* Big timer still on screen: keep the pill's slot but show nothing. */
|
/* Big timer still on screen: keep the pill's slot but show nothing. */
|
||||||
.bar-clock.standby { visibility: hidden; }
|
.bar-clock.standby { visibility: hidden; }
|
||||||
.bar-clock.asleep { background: color-mix(in srgb, var(--sleep) 18%, var(--surface)); color: var(--sleep); }
|
.bar-clock.asleep { background: color-mix(in srgb, var(--sleep) 18%, var(--surface)); color: var(--sleep-ink); }
|
||||||
.bar-clock.awake { background: color-mix(in srgb, var(--accent) 18%, var(--surface)); color: var(--accent); }
|
/* Dark text on the yellow, the way the pee button already does it: a gold
|
||||||
|
light enough to read as sunshine is never legible as text on a pale ground. */
|
||||||
|
.bar-clock.awake { background: color-mix(in srgb, var(--wake) 18%, var(--surface)); color: var(--wake-ink); }
|
||||||
|
|
||||||
.big-clock {
|
.big-clock {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@@ -243,9 +256,9 @@ body::before {
|
|||||||
font-variant-numeric: tabular-nums;
|
font-variant-numeric: tabular-nums;
|
||||||
}
|
}
|
||||||
.big-clock.asleep { background: linear-gradient(180deg, var(--surface), color-mix(in srgb, var(--sleep) 10%, var(--surface))); }
|
.big-clock.asleep { background: linear-gradient(180deg, var(--surface), color-mix(in srgb, var(--sleep) 10%, var(--surface))); }
|
||||||
.big-clock.asleep .bc-time { color: var(--sleep); }
|
.big-clock.asleep .bc-time { color: var(--sleep-ink); }
|
||||||
.big-clock.awake { background: linear-gradient(180deg, var(--surface), color-mix(in srgb, var(--accent) 10%, var(--surface))); }
|
.big-clock.awake { background: linear-gradient(180deg, var(--surface), color-mix(in srgb, var(--wake) 10%, var(--surface))); }
|
||||||
.big-clock.awake .bc-time { color: var(--accent); }
|
.big-clock.awake .bc-time { color: var(--wake-ink); }
|
||||||
|
|
||||||
/* Quick actions: a stack of explicit rows (see index.html) instead of one
|
/* Quick actions: a stack of explicit rows (see index.html) instead of one
|
||||||
auto-fit grid, so the grouping is the same at every width. Equal columns
|
auto-fit grid, so the grouping is the same at every width. Equal columns
|
||||||
@@ -474,24 +487,26 @@ textarea { resize: vertical; }
|
|||||||
/* A stripe in the row's own colour, so an alternating list reads as alternating
|
/* A stripe in the row's own colour, so an alternating list reads as alternating
|
||||||
before you get to the words. */
|
before you get to the words. */
|
||||||
.ww.sleep-ww { border-left: 3px solid color-mix(in srgb, var(--sleep) 55%, transparent); }
|
.ww.sleep-ww { border-left: 3px solid color-mix(in srgb, var(--sleep) 55%, transparent); }
|
||||||
.ww.wake-ww { border-left: 3px solid color-mix(in srgb, var(--accent) 45%, transparent); }
|
.ww.wake-ww { border-left: 3px solid color-mix(in srgb, var(--wake) 75%, transparent); }
|
||||||
.ww.walk-ww { border-left: 3px solid color-mix(in srgb, var(--walk) 55%, transparent); }
|
.ww.walk-ww { border-left: 3px solid color-mix(in srgb, var(--walk) 55%, transparent); }
|
||||||
.ww.sleep-ww .ww-tag { color: var(--sleep); }
|
.ww.sleep-ww .ww-tag { color: var(--sleep-ink); }
|
||||||
.ww.wake-ww .ww-tag { color: var(--accent); }
|
.ww.wake-ww .ww-tag { color: var(--wake-ink); }
|
||||||
.ww.walk-ww .ww-tag { color: var(--walk); }
|
.ww.walk-ww .ww-tag { color: var(--walk); }
|
||||||
.ww.ongoing .ww-tag { color: var(--accent); }
|
.ww.ongoing .ww-tag { color: var(--accent); }
|
||||||
.ww.sleep-ww.ongoing {
|
.ww.sleep-ww.ongoing {
|
||||||
border-color: var(--sleep);
|
border-color: var(--sleep);
|
||||||
background: color-mix(in srgb, var(--sleep) 14%, var(--surface));
|
background: color-mix(in srgb, var(--sleep) 14%, var(--surface));
|
||||||
}
|
}
|
||||||
.ww.sleep-ww.ongoing .ww-tag { color: var(--sleep); }
|
.ww.sleep-ww.ongoing .ww-tag { color: var(--sleep-ink); }
|
||||||
/* Spelled out like the other two: the faded stripe above would otherwise win
|
/* Spelled out like the other two: the faded stripe above would otherwise win
|
||||||
over the generic .ww.ongoing on specificity ties and leave the open awake
|
over the generic .ww.ongoing on specificity ties and leave the open awake
|
||||||
row without its full-strength edge. */
|
row without its full-strength edge. The tag needs saying too — .ww.wake-ww
|
||||||
|
.ww-tag ties with .ww.ongoing .ww-tag and loses on order. */
|
||||||
.ww.wake-ww.ongoing {
|
.ww.wake-ww.ongoing {
|
||||||
border-color: var(--accent);
|
border-color: var(--wake);
|
||||||
background: color-mix(in srgb, var(--accent) 14%, var(--surface));
|
background: color-mix(in srgb, var(--wake) 16%, var(--surface));
|
||||||
}
|
}
|
||||||
|
.ww.wake-ww.ongoing .ww-tag { color: var(--wake-ink); }
|
||||||
.ww.walk-ww.ongoing {
|
.ww.walk-ww.ongoing {
|
||||||
border-color: var(--walk);
|
border-color: var(--walk);
|
||||||
background: color-mix(in srgb, var(--walk) 14%, var(--surface));
|
background: color-mix(in srgb, var(--walk) 14%, var(--surface));
|
||||||
|
|||||||
Reference in New Issue
Block a user