Skip to content

v1.22.1 — Mobile and Coach polish#370

Merged
MBombeck merged 20 commits into
mainfrom
release/v1.22.1
Jun 27, 2026
Merged

v1.22.1 — Mobile and Coach polish#370
MBombeck merged 20 commits into
mainfrom
release/v1.22.1

Conversation

@MBombeck

Copy link
Copy Markdown
Owner

Reliability and quality-of-life patch focused on the mobile interface and the Coach.

Added

  • A short description under each lab biomarker heading, matching the Insights pattern.
  • A per-message Coach action row (copy, read aloud, rate, regenerate, timestamp).

Changed

  • Read-aloud selects a natural device voice instead of the default robotic one.
  • Settings/admin section navigation stays fixed while only the content scrolls.
  • Admin "Module availability" section renamed to "Modules".

Fixed

  • Settings/admin side navigation no longer drifts on scroll; mobile section selection no longer animates a scroll from the top.
  • Profile-menu spacing evened out; "More" menu labels no longer clipped on narrow screens.
  • Charts no longer crush the layout in landscape on small screens.
  • Sleep insights no longer repeats the nightly average above its tiles.

No schema changes, no migrations. Full gate green (typecheck, lint, OpenAPI, 11799 tests, build). Two review passes (code-correctness + design/a11y); all Medium and Low findings reconciled.

MBombeck added 20 commits June 27, 2026 17:53
The Theme sub-trigger inherited the shared sub-trigger padding (py-1.5,
no min-height) while every sibling row carries min-h-11 py-2, so the
Theme row sat a few pixels shorter and the menu read as unevenly spaced.
Match the item height on this instance only, leaving other dropdowns'
sub-triggers untouched.
The long single-word labels (de "Benachrichtigungen") clipped their last
character at the tile edge on a 320 px phone. Trim the grid gutters and the
tile padding/gap to hand each label more horizontal room, and cap the bottom
sheet at max-w-md, so the label wraps cleanly onto a second line instead of
running off the tile. Tile height stays uniform.
The Sleep view led with an average-per-night headline card that repeated
the same figure and label already shown in the average-sleep tile within
the sleep-rhythm grid row below it. Remove the leading card and let the
tile carry the readout; the stage-distribution bar and duration trend
chart stay in place.
Fixed-pixel chart bands ate roughly half the screen when a small phone
was rotated to landscape. Swap the brittle heights for viewport-relative
clamps so the chart envelope holds its previous size on desktop and
portrait but shrinks toward a floor on short landscape viewports. Covers
the overview trends-row slot and the mood distribution, weekday, and
time-of-day charts (with matching skeleton heights). Chart series and
styling are untouched; only the container heights flex.
Surface a short, factual subtitle under every catalog-linked lab marker on
the Labs page, mirroring the descriptive line the Insights overview carries
under its metric headings. The text states what each biomarker measures,
sourced from the seed catalog via a new labs.catalog.desc.<slug> i18n map in
all six locales.

A reading's analyte resolves back to its catalog slug by a case- and
whitespace-insensitive match against the localised catalog name; free-text
markers with no catalog match carry no subtitle rather than a fabricated one.
Rendered in both the compact list view and the card/tile view.
Shorten the composer placeholder across all locales to a short, inviting
one-liner and clip the placeholder pseudo-element so a longer hint can
never wrap to a second line inside the single-row composer on a narrow
phone. The textarea value still wraps and auto-grows for real typing.
The history search rendered as a thin, short strip that read as an
afterthought. Give it the app's standard full-width input height and
padding so it matches the standalone conversations page and looks
intentional.
Read-aloud only set the utterance language and let the browser fall back
to its default voice, which on most systems is a legacy compact engine
that reads robotically. Enumerate the installed voices, rank them for the
active locale (prefer enhanced/premium, Siri, Microsoft Natural/Online,
Google, and an exact lang-region match; penalise known compact engines),
and assign the winner with a natural rate and pitch. The voice list loads
asynchronously, so subscribe to voiceschanged and re-rank lazily; when no
voice beats the legacy default, fall back gracefully to prior behaviour.
…nerate, read-aloud)

Surface an icon-only action row below each message, sharing the row with
the hover timestamp: muted until the bubble is hovered or focused on
pointer devices, and always visible on touch where there is no hover.
User turns get Copy; assistant turns get Copy, Read-aloud, a thumbs-up /
thumbs-down feedback pair (wired to the existing per-message feedback
endpoint), and Try-again. Copy strips inline chart tokens from assistant
prose so they are never pasted. Try-again resubmits the user turn that
produced the reply as a fresh turn, leaving the composer untouched.
Hide the copy button on insecure-context (plain-HTTP) self-hosts where the
Clipboard API is undefined: a new SSR-safe useClipboardSupported() detector
mirrors the speech-synthesis hook so the button is absent rather than
error-toasting on tap.

Stop the per-message action row compressing below the 44px touch floor on
narrow phones: the icon buttons keep their tap size (shrink-0 + min-w-11) and
the row wraps instead of shrinking the up-to-six targets to ~30px.
Standardise the labs marker subtitle to text-xs across both the compact list
and the card grid, and build the localized name->slug lookup map once per
locale instead of re-scanning the catalog seeds per group on every render.

Add relative to the mobile section strips in the settings and admin shells so
the active chip's offsetLeft is measured from the strip, giving an exact
horizontal scroll target.

Drop the orphaned insights.sleep.headlineCaption and headlineCaptionSuffix
keys from all six locales; nothing references them after the sleep headline
removal.
@MBombeck MBombeck merged commit bed8795 into main Jun 27, 2026
13 checks passed
@MBombeck MBombeck deleted the release/v1.22.1 branch June 27, 2026 16:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant