Show the age counter as weeks with a months breakdown
Weeks and calendar months disagreed at a glance ("16 weeks" but only
"3 months"). Now the counter reads "16 weeks (3 months and 3 weeks)
old" so the two units line up, and drops the weeks past 4 months to
show just the months form.
This commit is contained in:
+13
-2
@@ -245,16 +245,27 @@
|
|||||||
(ref.getMonth() - birth.getMonth());
|
(ref.getMonth() - birth.getMonth());
|
||||||
if (ref.getDate() < birth.getDate()) months--;
|
if (ref.getDate() < birth.getDate()) months--;
|
||||||
if (months < 0) months = 0;
|
if (months < 0) months = 0;
|
||||||
return { days, weeks, months };
|
// Whole weeks left over after the calendar months (so "N months and M weeks").
|
||||||
|
const anchor = startOfDay(new Date(birth.getFullYear(),
|
||||||
|
birth.getMonth() + months, birth.getDate()));
|
||||||
|
const remWeeks = Math.floor((ref - anchor) / 86_400_000 / 7);
|
||||||
|
return { days, weeks, months, remWeeks };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// e.g. "16 weeks (3 months and 3 weeks) old". Weeks are the headline unit while
|
||||||
|
// the puppy is young; once it's 4+ months the week count is just noise, so we
|
||||||
|
// drop it and lead with the months form ("4 months and 1 week old").
|
||||||
function formatAge(birthday, at) {
|
function formatAge(birthday, at) {
|
||||||
const a = ageParts(birthday, at);
|
const a = ageParts(birthday, at);
|
||||||
if (!a) return "";
|
if (!a) return "";
|
||||||
const wk = `${a.weeks} week${a.weeks === 1 ? "" : "s"}`;
|
const wk = `${a.weeks} week${a.weeks === 1 ? "" : "s"}`;
|
||||||
if (a.months < 1) return `${wk} old`;
|
if (a.months < 1) return `${wk} old`;
|
||||||
const mo = `${a.months} month${a.months === 1 ? "" : "s"}`;
|
const mo = `${a.months} month${a.months === 1 ? "" : "s"}`;
|
||||||
return `${wk} · ${mo} old`;
|
const rw = a.remWeeks > 0
|
||||||
|
? ` and ${a.remWeeks} week${a.remWeeks === 1 ? "" : "s"}` : "";
|
||||||
|
const monthPhrase = `${mo}${rw}`;
|
||||||
|
if (a.months >= 4) return `${monthPhrase} old`;
|
||||||
|
return `${wk} (${monthPhrase}) old`;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rough age-based daily sleep goal (hours), for the trend chart's goal band:
|
// Rough age-based daily sleep goal (hours), for the trend chart's goal band:
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
[
|
[
|
||||||
|
{ "date": "2026-07-24", "text": "The age counter reads \"16 weeks (3 months and 3 weeks) old\" so weeks and months line up; past 4 months it drops the weeks and shows just months (e.g. \"5 months and 2 weeks old\")" },
|
||||||
{ "date": "2026-07-17", "text": "The Sleep trend chart follows the selected day — pick a past day to see its full curve against the day before and the average leading up to it" },
|
{ "date": "2026-07-17", "text": "The Sleep trend chart follows the selected day — pick a past day to see its full curve against the day before and the average leading up to it" },
|
||||||
{ "date": "2026-07-15", "text": "The Sleep trend y-axis is stretched above 10h, giving the hours around the sleep goal most of the chart" },
|
{ "date": "2026-07-15", "text": "The Sleep trend y-axis is stretched above 10h, giving the hours around the sleep goal most of the chart" },
|
||||||
{ "date": "2026-07-15", "text": "The Sleep trend chart shows the sleep goal for your puppy's age as a shaded band — the projection chip gets a ✓ when today is on track" },
|
{ "date": "2026-07-15", "text": "The Sleep trend chart shows the sleep goal for your puppy's age as a shaded band — the projection chip gets a ✓ when today is on track" },
|
||||||
|
|||||||
Reference in New Issue
Block a user