diff --git a/src/changelog.json b/src/changelog.json index d1b1c53..4465a92 100644 --- a/src/changelog.json +++ b/src/changelog.json @@ -1,4 +1,5 @@ [ + { "date": "2026-09-07", "text": "Fixed buttons that were meant to be hidden but showed anyway. A guest opening an entry the owner logged saw Delete and Save on it — they never worked (the server refuses the change) but they had no business being there. The same fault had been quietly affecting three other things for a while: the 🌳 pedigree button appeared before you had set a pedigree ID, “Send a test notification” appeared when reminders weren't available, and the exercise dialog offered Delete while you were adding a new exercise rather than editing one. One styling rule was overriding every one of them" }, { "date": "2026-09-07", "text": "A day can now be left out of the stats. Open the day, tap “⊘ Not counted” next to the overview heading, and it stops feeding the charts and averages — useful when someone else had the puppy and the record is thinner than the day really was, so it isn't fair to count it. Nothing is deleted or hidden: the day's own overview, history and sleep & wake list are exactly as they were, just dimmed and labelled, and you can switch it back at any time. In the day-by-day charts the day keeps its place but is drawn as a hatch instead of a bar, so a deliberate gap can't be misread as a day the puppy barely slept. Weigh-ins and notes still count wherever they fall — those are facts you recorded, not behaviour a sparse day distorts — so the weight curve and the Notes log are untouched. The Timing panel throws away gaps that reach across a skipped day rather than measuring them, which would otherwise turn two normal days into one enormous fake gap" }, { "date": "2026-09-06", "text": "You can hand someone temporary access without giving them your login. Settings → “Guest access” creates a link — say who it's for and pick the last day it should work — and whoever opens it lands straight in the app on your dog, able to log events and read all the history and charts. They can't change your entries: a guest may fix up or delete what they logged themselves, but everything you logged is read-only to them, and so is the puppy profile, the pedigree ID, your reminders, the exercise list, other guest links and deleting the account. You can still edit anything on your own account, theirs included. The link is shown once when you make it, so copy it then; every live link is listed in Settings with when it expires and when it was last used, and Revoke cuts access off immediately, mid-session. Anything logged on a link is tagged with that link's name in the History log — “💧 Pee · Anna” — and the tag sticks even if you edit the entry afterwards" }, { "date": "2026-09-04", "text": "The three day-long charts — “By hour of day”, “When sleeping” and “When walking” — now mark the current time with a small vertical line and caret. On the sleeping and walking rows it also shows where today's row stops, and it lines the same clock position up across every day above it" }, diff --git a/src/style.css b/src/style.css index 0451c38..768a294 100644 --- a/src/style.css +++ b/src/style.css @@ -69,6 +69,22 @@ * { box-sizing: border-box; } +/* The user agent's [hidden] { display: none } loses to any author rule that + sets a display, so every element given one here went on rendering while + hidden. This had been patched one selector at a time as each case was + noticed — .auth-screen[hidden], .snackbar[hidden], dialog label[hidden] and + seven more — which left the ones nobody had hit yet still broken: the 🌳 + pedigree button, the reminder rule rows, "send a test notification", the + pedigree disambiguation list, and Delete in both the exercise and event + dialogs. Stating it once replaces all ten of those rules and stops the next + hidden element joining the list. + + !important, because the offenders aren't all the same weight: + `#reminders-rules { display: flex }` is an id selector and outranks any + attribute selector we could write. Nothing should ever want a hidden element + painted, so the blunt instrument is the right one here. */ +[hidden] { display: none !important; } + html, body { margin: 0; padding: 0; @@ -232,7 +248,6 @@ body::before { font-variant-numeric: tabular-nums; flex-shrink: 0; } -.bar-clock[hidden] { display: none; } /* Big timer still on screen: keep the pill's slot but show nothing. */ .bar-clock.standby { visibility: hidden; } .bar-clock.asleep { background: color-mix(in srgb, var(--sleep) 18%, var(--surface)); color: var(--sleep-ink); } @@ -619,9 +634,6 @@ dialog::backdrop { background: rgba(0,0,0,0.4); } dialog h3 { margin: 0 0 12px; } dialog label { display: block; font-size: 0.85rem; color: var(--muted); margin-bottom: 10px; } -/* The display rule above beats the UA [hidden] rule, so hide explicitly — - otherwise the weight/grams fields show on event types that don't use them. */ -dialog label[hidden] { display: none; } dialog label input, dialog label textarea { margin-top: 4px; } dialog menu { @@ -647,7 +659,6 @@ dialog menu { flex-wrap: wrap; gap: 10px; } -.photo-preview[hidden] { display: none; } .photo-thumb { position: relative; } .photo-thumb img { display: block; @@ -863,8 +874,6 @@ dialog menu { background: var(--bg); z-index: 50; } -/* The display rule above beats the UA [hidden] rule, so hide explicitly. */ -.auth-screen[hidden] { display: none; } .auth-card { width: 100%; max-width: 360px; @@ -952,7 +961,6 @@ button.linklike:hover { text-decoration: underline; filter: none; } border-color: transparent; color: #fff; } -.exclude-btn[hidden] { display: none; } .excluded-note { margin: 8px 0 0; } @@ -1032,7 +1040,6 @@ button.guest-revoke { color: var(--danger); flex: none; } font-size: 0.85rem; line-height: 1.4; } -.guest-banner[hidden] { display: none; } /* Who logged an event, when it came in on a guest link. Small caps so it reads as a margin note against the event label rather than competing with it. @@ -1100,7 +1107,6 @@ input.switch:checked::after { transform: translateX(18px); } color: #fff; box-shadow: var(--shadow); } -.update-banner[hidden] { display: none; } .update-banner-row { display: flex; align-items: center; @@ -1116,7 +1122,6 @@ input.switch:checked::after { transform: translateX(18px); } line-height: 1.45; opacity: 0.92; } -.update-changelog[hidden] { display: none; } .app-footer { text-align: center; @@ -1187,7 +1192,6 @@ input.switch:checked::after { transform: translateX(18px); } pointer-events: none; transition: opacity 0.18s ease, transform 0.18s ease; } -.snackbar[hidden] { display: none; } .snackbar.show { opacity: 1; transform: translate(-50%, 0); @@ -1303,7 +1307,6 @@ input.switch:checked::after { transform: translateX(18px); } .lg.wtrend-today .sw { background: var(--walk); } .lg.wtrend-yesterday .sw { background: var(--eat); } .lg.wtrend-avg .sw { background: var(--weight); } -.lg[hidden] { display: none; } .chart-svg .hm-cell { stroke: none; } /* Focused block: an accent ring, drawn at full opacity so it stays visible on