Commit Graph
10046 Commits
Author SHA1 Message Date
Marc-André Bombeck d0763e273f fix(dashboard): give the tappable averages a 44 px touch target
The averages on a dashboard tile open their colour hint on a tap now,
which made them touch targets of 16 px height. On a touch screen the
trigger is 44 px tall, and a negative margin keeps the tile's line
where it was.
2026-11-12 17:16:10 +01:00
Marc-André Bombeck 5691ddcffb chore(release): v1.47.5 2026-11-12 16:35:27 +01:00
Marc-André Bombeck 3366a7a74c test: lower the size and comment baselines after the merges
Functions and files that shrank across the merged branches; every entry goes down.
2026-11-12 16:35:13 +01:00
Marc-André Bombeck 6e56c63234 Merge branch 'fix/v1475-no-sheet-back' into release/v1.47.5 2026-11-12 16:27:49 +01:00
Marc-André Bombeck 919c508d59 revert(sheets): take out Back closing the open sheet
Opening a sheet pushed a history entry, and closing it took that entry
off again with a history back. The browser answers that back later, so
when the close started a navigation it landed after the router's push
and undid it: the medication wizard stayed on the list instead of
opening the new medication, a section picked from the settings list on
a phone stayed on the account page, and a link followed from a sheet
could put the page under it back.

The sheet history goes, with its wiring in ResponsiveSheet, the
document sheet's opt-out, the account form's deference to it, Back
answering the discard question, and their tests. Back behaves as
before: it leaves the page and the sheet goes with it, and the account
form's own Back guard answers every Back again. A tap outside, Escape,
the X and a swipe still ask before dropping typed input. The two size
baselines return to their earlier numbers.
2026-11-12 16:27:10 +01:00
Marc-André Bombeck 6994cb5ce8 Merge remote-tracking branch 'origin/main' into release/v1.47.5 2026-11-12 15:46:29 +01:00
Marc-André Bombeck 0310172095 Merge pull request #1374 from MBombeck/release/v1.47.4 v1.47.4 2026-11-12 15:46:07 +01:00
Marc-André Bombeck e6a7e33a31 Merge branch 'fix/v1475-review' into release/v1.47.5 2026-11-12 15:28:48 +01:00
Marc-André Bombeck 80ee228899 fix(pwa): clear the leftover app badge from the page, not the worker
A badge call from the service worker stalled Chromium's worker thread
while it activated, awaited or not: the worker reached "activated" but
never claimed its pages, so no page was ever controlled and every
offline path was gone. The worker no longer touches the badge. The
installed app clears a leftover count from the page once the worker is
registered; a browser tab leaves it alone.

The filter-sync test no longer reads `history.length`, which the
browser caps; the recorded push without a replace already proves the
new entry.
2026-11-12 15:28:37 +01:00
Marc-André Bombeck 159f40c0fc test(reminders): run the ketone checkup cases beside the glucose ones
The two ketone cases repeated the glucose cases with one type changed; they are now one parametrized case each, which keeps the mocked client casts at their count.
2026-11-12 15:22:46 +01:00
Marc-André Bombeck 352a170313 docs: past tense for the Fitbit turndown, plain punctuation in new text
The Fitbit guide still called the integration experimental and spoke of
the 30 October 2026 turndown as ahead. Three new files carried em
dashes in a doc comment and two test titles.
2026-11-12 15:19:19 +01:00
Marc-André Bombeck 9ed27c47f4 fix(i18n): release notes label, neutral discard and prefill wording
- The About button opens the release notes and now says so in all ten
  languages; six of them still showed the English word "Changelog".
- The discard question now also covers edit sheets, where "Discard this
  entry?" read like deleting the target or episode being edited. It
  asks about the changes in every language; Russian also loses the
  ambiguous "Отменить" on both the title and the button.
- The 7-day trend figure on a dashboard tile had an English screen
  reader label in every language.
- Outlier terms in the new checkup and ketone strings follow each
  catalog (ru "Кетоны в крови", "Коуч"; es "Desactivado"; nl
  "rusthartslag"), the French steps question reads naturally, and the
  shared Polish and Russian Coach question no longer assumes a
  masculine speaker.
2026-11-12 15:19:19 +01:00
Marc-André Bombeck 7683e84a84 test(medications): fail the dose history test on a read of every intake
The case with a year of earlier takes proved the ledger stays the same,
which the old read of every intake satisfied as well, so a revert of
the bounded read passed every test. It now also counts the rows the
route read and expects only the window's.
2026-11-12 15:17:50 +01:00
Marc-André Bombeck 8d2ba7cd4b docs: list every integration and channel, and correct two stale rules
- README: the integrations line now names Strava, Garmin and the Health
  Connect import, the reminder channels include email and the webhook,
  and the last two feature labels say what they cover.
- UI guidelines: the password form was said to carry a hidden username
  field it does not have; the line now states when one helps.
- CONTRIBUTING: strings go into every locale file, not only English and
  German.
2026-11-12 15:17:32 +01:00
Marc-André Bombeck d7eac1f87e chore: drop tooling and host references from templates and comments
- The translation issue template called eight locales "AI-initial",
  left Russian out of its list and its dropdown; it now says they
  started as machine-translated drafts reviewed by the community.
- The pull request template asked for two locales where the checks
  require all ten, and pointed at an ignored docs folder.
- Code comments named the maintainer notes file, a release by its
  working name and an internal host; old changelog entries explained
  the notes files by their tool-specific names. A fixture token and
  the deploy webhook test's application id (a real one) are replaced.
2026-11-12 15:17:06 +01:00
Marc-André Bombeck a10a0e8f84 chore: name no local tool folders in the ignore files
The git and docker ignore files and the lint config listed the folders
and notes of particular editors and tools. Local workspace folders
belong in a contributor's own global excludes. The image copies only
named paths, so nothing local reaches it, and the lint config now skips
every hidden top-level folder, which covers local worktrees under any
name; no tracked hidden folder holds code.
2026-11-12 15:15:52 +01:00
Marc-André Bombeck 5b5b5fcc03 chore: make the commit-message check name no product
The commit-msg hook listed the tools and the session link format it
refused, so the file read as a description of how commits are written.
It now states the rule: commits are authored by the maintainer's
identity, and a co-author trailer is only for a contributor. It refuses
a generator line, any "<Word>-Session:" trailer and a co-author trailer
whose address is not a GitHub noreply address, so a contributor's
credit still passes.
2026-11-12 15:15:35 +01:00
Marc-André Bombeck 7dd251184f test: describe analytics fixtures without tying them to a real profile
Several test titles and comments said whose readings a fixture came
from, with a host name beside them: a blood pressure average, a month
of paired readings with dates, a cached insight about weight, cycle
history and dose timing. They now describe the fixture itself (a
profile averaging 134/87, a ten-pair month, a long history); the values
and what each test proves are unchanged.
2026-11-12 15:14:46 +01:00
Marc-André Bombeck c9264c047e docs(nutrients): keep the batch eviction note to its old length
The longer note pushed the batch handler one line past its size baseline.
2026-11-12 15:14:45 +01:00
Marc-André Bombeck a6c3916910 docs: point comments at the queue table's home and fix a bench note
Four comments still named `queue-runtime.ts` without its folder after it
moved under src/__tests__/helpers/, and the v1.45.0 boot page described
two dumps that are no longer kept.
2026-11-12 15:13:07 +01:00
Marc-André Bombeck 442d97cc66 fix(nutrients): refresh the correlation scan after a water or nutrient write
Water, caffeine and the nutrient channels feed the correlation scan
behind /api/insights/correlations and the Coach read line on the metric
pages, but the water and nutrient batch writes evicted only the
dashboard snapshot. After logging water both could serve the read taken
before it until the cell went stale. Both writes now sweep the record's
analytics cells, as measurement and mood writes do.
2026-11-12 15:12:47 +01:00
Marc-André Bombeck d430981caa fix(workouts): refresh the Insights Workouts pill after a workout write
The tab strip shows the Workouts pill from the presence read, which
stays fresh for five minutes and was not part of the workout write's
invalidation. After the first manual workout, or after deleting the
last one, the pill stayed missing or stayed on for up to five minutes.
2026-11-12 15:12:07 +01:00
Marc-André Bombeck 6f8a342edf fix(insights): offer no metric pill inside a switched-to record
Inside a managed child's record, or as a delegate with manage access,
the tab strip showed Weight, Pulse, Blood pressure and the other metric
pills, and every one of them opened an error. The strip now reads the
record's own presence answer, but the metric pages read /api/analytics,
which serves only the signed-in account's own record and refuses a
switched session. The strip again shows those pills only in the
account's own record, as before; mood, medication, workout and ECG
pills keep following the presence answer.
2026-11-12 15:11:40 +01:00
Marc-André Bombeck 6e8554fd37 fix(reminders): gate ketone checkups on the Glucose module
A "Measure blood ketones" checkup kept sending its push, Telegram or
email with the Glucose module switched off, while the glucose checkup
beside it went quiet. The checkup job kept its own copy of the module
map, which knew glucose but not ketones.

The job now asks the one ownership table the rest of the app gates on.
That table did not list the four mental-wellbeing screenings, which only
the job's copy knew, so they join it under the mental-health module; a
screening score row now also follows that module in the day view and
search.
2026-11-12 15:10:53 +01:00
Marc-André Bombeck 7b6d518ca6 fix(mobile): coach padding with the keyboard up, chip remove targets
- The Coach thread kept 80 px free under the last message for the New
  conversation button while the keyboard hid that button.
- The remove buttons on lab alias chips and attached-document chips
  reached sideways into their own label and the next chip, and an
  alias is removed at once. Their tap area now stays inside the chip's
  gaps sideways and keeps its height.
- A capture menu comment described a dialog that is gone.
2026-11-12 15:09:34 +01:00
Marc-André Bombeck cb569b6c9d fix(sheets): stop two capture forms asking before anything was entered
The symptom form and the dashboard's medication intake asked "Discard?"
on every close, untouched. The sheet's fallback check read the input
Radix keeps for the intensity slider (value "0" before anyone moves
it) and the dose the form fills in from the preselected medication as
typed input.

The check now skips a slider's own input and counts a slider moved off
unanswered instead, and compares a field against the value its form
says it filled in (`data-seed`). A controlled input's defaultValue
follows its value, so it cannot tell the two apart. The dose field
names the medication's dose, one line more for the form's baseline.
2026-11-12 15:09:29 +01:00
Marc-André Bombeck 218986ea89 fix(sheets): let Back answer the discard question with "keep editing"
Back on a sheet with unsaved input asks whether to discard it. A second
Back while that question was open put the sheet's entry back and asked
again, so the Android button could never get past the question. It now
closes the question and keeps the sheet and its entry, like Cancel.
2026-11-12 15:09:22 +01:00
Marc-André Bombeck 555a529260 fix(sheets): keep Back on the page a closed sheet returns to
Three ways the sheet's history entry could still cost a Back:

- A close that also writes the URL (the day's date picker, the life
  event sheet opened by ?add=lifeEvent) let the router's answer to that
  write land on the page entry with the closed sheet's mark. The next
  sheet close then stepped one entry past the page, and on an installed
  app opened from a notification that closed the app. A write that
  carries the mark of a sheet that is gone now loses it.
- A sheet's entry started empty, and landing below it copied that empty
  state onto the page entry, so an open day or document lost the key it
  keys its own Back on. The sheet's entry now starts as a copy of the
  page entry's state.
- The account form's Back guard heard the sheet's own Back first when
  it was mounted before the first sheet of the visit, and asked to
  discard the form's edits for closing the section list. The guard now
  leaves a popstate the sheet history owns to it.

The browser tests run against Chromium's session history and fail
without each fix.
2026-11-12 15:09:13 +01:00
Marc-André Bombeck 45a5d4e353 fix(pwa): never let the badge call hold up the worker's activation
The new worker cleared a leftover app badge inside its activation and
waited for it. A browser that never settles that call keeps the worker
activating, so it never takes over its pages and every offline path is
gone. The badge is now cleared beside the activation, best effort.

The sign-in journey expects the page's own sentence for a wrong
password, not the server's text.
2026-11-12 15:02:11 +01:00
Marc-André Bombeck 3faf1b1c8b Merge branch 'release/v1.47.4' into release/v1.47.5
# Conflicts:
#	src/__tests__/baselines/source-file-lines.json
#	src/__tests__/baselines/source-function-lines.json
#	src/__tests__/baselines/test-as-never.json
#	src/__tests__/baselines/test-source-reads.json
#	src/__tests__/baselines/version-stamp-comments.json
#	src/app/auth/login/page.tsx
2026-11-12 14:47:38 +01:00
Marc-André Bombeck 5ac998e4f0 Merge remote-tracking branch 'origin/main' into release/v1.47.5
# Conflicts:
#	src/__tests__/baselines/source-file-lines.json
#	src/__tests__/baselines/source-function-lines.json
#	src/__tests__/baselines/test-as-never.json
#	src/__tests__/baselines/version-stamp-comments.json
#	src/__tests__/sharing-surface-guard.test.ts
2026-11-12 14:25:05 +01:00
Marc-André Bombeck fbb3ad7852 chore(release): v1.47.4 2026-11-12 14:24:36 +01:00
Marc-André Bombeck 02f4f8116c Merge remote-tracking branch 'origin/main' into release/v1.47.4 2026-11-12 14:23:50 +01:00
Marc-André Bombeck 62988f95ff Merge branch 'fix/v1474-review' into release/v1.47.4 2026-11-12 14:23:49 +01:00
Marc-André Bombeck ae005f020b refactor(auth): navigate for single sign-on at the call sites again
Moving the navigation into the shared helper took both sign-in hand-offs
out of what the headerless-transport guard walks, which only reads the
component and page trees. The helper now only clears the offline copies
with the capped wait, and each page navigates itself. The device
registration test checks the end of the no-device rest inside the test
that already pairs an iPhone instead of a copy of it.
2026-11-12 14:19:47 +01:00
Marc-André Bombeck f78c9b0b78 chore: restore the Telegram handler's size baseline
Merging the previous release in kept this branch's older numbers for
telegram-webhook-handlers.ts (1335 lines, handleCallback 590), although
the file is unchanged at 1319 and 582, the numbers the previous release
recorded. The gap sat inside the ratchet's slack, so nothing flagged it.
2026-11-12 14:16:17 +01:00
Marc-André Bombeck a880f764fc chore: keep the handlers this release touched within their size baseline
The register refusal codes, the end of the no-device rest, the
no-recipient annotation and the sign-in shell comment had each grown a
function the size ratchet holds. The codes become constants, the rest
ends through a helper beside the one that starts it, and the
annotation moves into that helper. The settings Web Push card dropped
under the limit when its subscription post moved out, so its entry goes.
2026-11-12 14:16:06 +01:00
Marc-André Bombeck d8c270859b refactor(auth): leave for single sign-on through one helper
The sign-in page and the profile take-over page each cleared the offline
copies with the same capped wait before leaving for the identity
provider, with the limit written down twice. leaveForSingleSignOn does
it once for both.
2026-11-12 14:15:55 +01:00
Marc-André Bombeck 4ff3e4e1b7 fix(notifications): rest a channel that had nobody to send to
A send with no browser subscribed, no iPhone paired or a transport the
operator has not set up no longer counts as a failure, but nothing else
replaced it. The mood reminder and the daily briefing retry every
minute until delivered, so such a channel wrote a skipped row each
minute, for good; the dispatch still counted as an attempt, so the
watchdog and status alerts took it as announced; and the status screen
said "active" with no hint why nothing arrived.

The channel now rests for an hour after such a send, with the reason on
its status, and the send does not count as an attempt. Subscribing a
browser or pairing an iPhone ends the rest at once.
2026-11-12 14:12:45 +01:00
Marc-André Bombeck 5d1c3ffbaf Merge pull request #1373 from MBombeck/release/v1.47.3 v1.47.3 2026-11-12 14:11:26 +01:00
Marc-André Bombeck 95e2ba5477 test(e2e): read the dashboard snapshot inside a record, not only the caches
The record fence journey called the page cache its positive control,
but signed-in pages are never stored, so the entry it counted was the
install precache, and the half inside the record repeated a claim that
holds by construction now that the worker keeps no API answers. The
comment now names the precache, and inside the record the journey reads
the IndexedDB dashboard snapshot, which must be missing or still the
caller's own.
2026-11-12 14:10:32 +01:00
Marc-André Bombeck 5a274b8792 fix(push): give the subscription removal a five-second limit
Sign-out removes the push row first, through the raw fetch helper, which
has no default timeout. On a connection that is up but carries nothing,
the sign-out waited for the browser's own timeout before the logout
request even started. The removal now gives up after five seconds.
2026-11-12 14:09:36 +01:00
Marc-André Bombeck e498a44d70 chore: correct comments that describe the removed clear push and API cache
The dose tag comment still explained the clear push sent for a logged
dose, the session-end wipe comment still named the worker's API cache as
a live layer, and the worker's header and foreign-origin note did not
match what the worker stores and when it resumes.
2026-11-12 14:09:18 +01:00
Marc-André Bombeck d15fb27bce docs: list Russian among the README's languages
The line also lost its dash.
2026-11-12 14:08:35 +01:00
Marc-André Bombeck 95a906b2a7 fix(pwa): keep the status bar readable on the sign-in pages too
The light-theme fix painted the strip behind the white status bar only
in the signed-in shell. The sign-in, registration and take-over pages
and the onboarding shell padded the strip without painting it, so after
a sign-out in the installed iOS app the clock was white on near-white.
They now use the same shell-safe-area band.
2026-11-12 14:08:34 +01:00
Marc-André Bombeck e59ef4533d fix(push): say why a test push failed, under its own title
The Web Push test answered a refused push with `ok: false` and the
sender's `reason`, but the Test button reads `meta.errorCode`, so it
only said "Test failed". The answer now carries `upstream_rejected`, or
`connection_failed` when no push service answered.

The test push used the administrator's test title, which put the brand
first in several languages; it has its own title now.
2026-11-12 14:07:19 +01:00
Marc-André Bombeck d5980bdaee fix(i18n): tidy the German and Spanish sign-out failure
The German sentence dropped its article, and the Spanish one read as if
the sign-out had been the session's own state ("Tu sesión sigue
abierta"); it now says the person is still signed in.
2026-11-12 14:05:54 +01:00
Marc-André Bombeck 7c3988865d fix(push): name the real button in the Home Screen hint
The hint for iPhone and iPad Safari ended with "turn on push here", but
the button reads "Enable push"; it now names the button in every
language. The hint is two sentences of steps, so it is shown as content
rather than muted, and the French one uses the typographic apostrophe
like its neighbours.
2026-11-12 14:05:37 +01:00
Marc-André Bombeck fd92e9fd23 fix(i18n): say "back online" once in the offline strip
The offline strip joins two sentences, and both ended on "once you're
back online"; in French it ran to four lines on a phone, and the
Russian one was ungrammatical. The first sentence now only says that
changes can't be saved.
2026-11-12 14:05:13 +01:00
Marc-André Bombeck b617c1f88e fix(shell): stop restoring the list's offset once the person scrolls
On Back, the shell set the list's saved offset again on every frame
while the list was still shorter than that offset. Someone who started
scrolling in that time was pulled back, and a list whose data took more
than a second ended up where the skeleton allowed. The restore now stops
at the first wheel, touch, key or pointer input and keeps trying for up
to three seconds.
2026-11-12 14:04:31 +01:00