Hide buttons and panels that were marked hidden
A guest opening an entry the owner had logged still saw Delete and Save on it.
The read-only branch had been setting .hidden on both since guest links landed;
the attribute was there, and the buttons rendered anyway.
The user agent hides [hidden] elements with display: none, but that is a UA
rule and loses to any author rule setting a display — and `button` here sets
display: inline-flex, so no button the app hides has ever actually gone away.
The stylesheet already knew this in eight places: .auth-screen[hidden],
.snackbar[hidden], dialog label[hidden] and five more, each added when someone
noticed that particular element misbehaving. What that pattern cannot do is fix
the cases nobody has hit yet, and there were five sitting there: the 🌳 pedigree
button showed before a pedigree ID was set, the reminder rule rows showed while
unsubscribed, "send a test notification" showed when push was unavailable, the
pedigree disambiguation list stayed up after being dismissed, and the exercise
dialog offered Delete while adding a new exercise rather than editing one.
So this states it once, globally, and drops all ten per-selector rules. It
needs !important: the offenders are not all the same weight, and
`#reminders-rules { display: flex }` is an id selector that outranks any
attribute selector available. That is the right trade here — nothing should
ever want an element painted after being marked hidden, so there is no case the
blunt version gets wrong.
Only the two dialog buttons are new breakage; the other five predate the recent
work and are the reason this is a global fix rather than a sixth patch.
This commit is contained in:
@@ -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-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-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" },
|
{ "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" },
|
||||||
|
|||||||
+16
-13
@@ -69,6 +69,22 @@
|
|||||||
|
|
||||||
* { box-sizing: border-box; }
|
* { 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 {
|
html, body {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
@@ -232,7 +248,6 @@ body::before {
|
|||||||
font-variant-numeric: tabular-nums;
|
font-variant-numeric: tabular-nums;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
.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-ink); }
|
.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 h3 { margin: 0 0 12px; }
|
||||||
|
|
||||||
dialog label { display: block; font-size: 0.85rem; color: var(--muted); margin-bottom: 10px; }
|
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 label input, dialog label textarea { margin-top: 4px; }
|
||||||
|
|
||||||
dialog menu {
|
dialog menu {
|
||||||
@@ -647,7 +659,6 @@ dialog menu {
|
|||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
}
|
}
|
||||||
.photo-preview[hidden] { display: none; }
|
|
||||||
.photo-thumb { position: relative; }
|
.photo-thumb { position: relative; }
|
||||||
.photo-thumb img {
|
.photo-thumb img {
|
||||||
display: block;
|
display: block;
|
||||||
@@ -863,8 +874,6 @@ dialog menu {
|
|||||||
background: var(--bg);
|
background: var(--bg);
|
||||||
z-index: 50;
|
z-index: 50;
|
||||||
}
|
}
|
||||||
/* The display rule above beats the UA [hidden] rule, so hide explicitly. */
|
|
||||||
.auth-screen[hidden] { display: none; }
|
|
||||||
.auth-card {
|
.auth-card {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 360px;
|
max-width: 360px;
|
||||||
@@ -952,7 +961,6 @@ button.linklike:hover { text-decoration: underline; filter: none; }
|
|||||||
border-color: transparent;
|
border-color: transparent;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
}
|
}
|
||||||
.exclude-btn[hidden] { display: none; }
|
|
||||||
|
|
||||||
.excluded-note { margin: 8px 0 0; }
|
.excluded-note { margin: 8px 0 0; }
|
||||||
|
|
||||||
@@ -1032,7 +1040,6 @@ button.guest-revoke { color: var(--danger); flex: none; }
|
|||||||
font-size: 0.85rem;
|
font-size: 0.85rem;
|
||||||
line-height: 1.4;
|
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
|
/* 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.
|
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;
|
color: #fff;
|
||||||
box-shadow: var(--shadow);
|
box-shadow: var(--shadow);
|
||||||
}
|
}
|
||||||
.update-banner[hidden] { display: none; }
|
|
||||||
.update-banner-row {
|
.update-banner-row {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
@@ -1116,7 +1122,6 @@ input.switch:checked::after { transform: translateX(18px); }
|
|||||||
line-height: 1.45;
|
line-height: 1.45;
|
||||||
opacity: 0.92;
|
opacity: 0.92;
|
||||||
}
|
}
|
||||||
.update-changelog[hidden] { display: none; }
|
|
||||||
|
|
||||||
.app-footer {
|
.app-footer {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@@ -1187,7 +1192,6 @@ input.switch:checked::after { transform: translateX(18px); }
|
|||||||
pointer-events: none;
|
pointer-events: none;
|
||||||
transition: opacity 0.18s ease, transform 0.18s ease;
|
transition: opacity 0.18s ease, transform 0.18s ease;
|
||||||
}
|
}
|
||||||
.snackbar[hidden] { display: none; }
|
|
||||||
.snackbar.show {
|
.snackbar.show {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
transform: translate(-50%, 0);
|
transform: translate(-50%, 0);
|
||||||
@@ -1303,7 +1307,6 @@ input.switch:checked::after { transform: translateX(18px); }
|
|||||||
.lg.wtrend-today .sw { background: var(--walk); }
|
.lg.wtrend-today .sw { background: var(--walk); }
|
||||||
.lg.wtrend-yesterday .sw { background: var(--eat); }
|
.lg.wtrend-yesterday .sw { background: var(--eat); }
|
||||||
.lg.wtrend-avg .sw { background: var(--weight); }
|
.lg.wtrend-avg .sw { background: var(--weight); }
|
||||||
.lg[hidden] { display: none; }
|
|
||||||
|
|
||||||
.chart-svg .hm-cell { stroke: none; }
|
.chart-svg .hm-cell { stroke: none; }
|
||||||
/* Focused block: an accent ring, drawn at full opacity so it stays visible on
|
/* Focused block: an accent ring, drawn at full opacity so it stays visible on
|
||||||
|
|||||||
Reference in New Issue
Block a user