Skip to content

feat(strength): rebuild the Strength screen on the shared design kit - #31

Merged
DX23876 merged 8 commits into
mainfrom
redesign/f-strength
Sep 17, 2026
Merged

DX23876 merged 8 commits into
mainfrom
redesign/f-strength

Conversation

@DX23876

@DX23876 DX23876 commented Sep 17, 2026

Copy link
Copy Markdown
Owner

Summary

Last package of the redesign. Stacked on #26 → #27 → #28 → #29 → #30; until those merge, this diff includes them.

The Strength screen now reads:

  1. Week control: the shared stepper and history window.
  2. Strength load hero: the same lane reading Training Load shows (refactor(training): one lane load reading for Training Load, Cardio and Strength #27). It carries percentage vs usual, pill, trend, working sets and weighted sets, rated sets, and the thin-RPE caveat.
  3. Week figures: sessions, working sets, volume, Effort, and bodyweight when there is any. Charge stays underneath as its own strip, followed by the "week still running" note.
  4. Muscle map and working sets per muscle: unchanged, kept high on the screen.
  5. Strength load over time: 7D / 4W / 12W, in weighted sets, with the usual-week band once a personal range exists.
  6. Balance: unchanged.
  7. Range overview: all nine figures and recent records. The duration and RPE coverage notes stay beside the figures.
  8. Exercise progress, then the consistency heatmap.
  9. One session list: logged sessions and Apple Health envelopes awaiting details, newest first, with "Show all" as before.
  10. Actions: unchanged.
  11. How it works: strength load, bodyweight volume, Effort, Charge, active weeks. The existing info texts are reused verbatim.

Removed from the week grid: the "Strength load" tile, now the hero. The in-card info buttons for muscle bands and balance stay where they are.

Value checklist

Before After
Sessions, working sets, volume, bodyweight (+ unpriced sets), Effort, Charge KPI strip + Charge strip ✅
Strength load tile (% vs usual) Hero, plus weighted sets and coverage ✅
Range overview: 9 facts, records, coverage notes, active-weeks note Card; the active-weeks definition moves to an explainer ✅
Heatmap, muscle map, working sets, balance, exercise progress Unchanged cards, reordered ✅
"Needs details" list + recent sessions One list ✅
Info sheets: strength load, Effort, Charge, bodyweight Explainer rows ✅

Verification

  • xcodebuild -scheme Strand test -only-testing:StrandTests: 3,376 tests, 0 failures (3 skipped, as on main). macOS and iOS simulator builds succeed.
  • iPhone 17 Pro simulator, German, demo data: the whole screen in dark mode, top to bottom, plus the top in light mode.
  • Strings: 7 new keys, translated into all nine languages and mirrored in Tools/translations. i18n_audit --ci origin/main exits 0.
  • doc_comment_lint: OK.

Analysis migration required: no

Strength and Cardio both used effortColor, so the two training lanes were
indistinguishable. Each lane now owns one identity colour for all seven
chart styles in light and dark: electric teal for Strength and violet for
Cardio, kept clear of the status and Charge colours so a lane never reads
as a warning. The hexes live in LaneColorTable and LaneColorTests pin hue
separation and white-text contrast on the deep tones.

Analysis migration required: no
Move the detached computation in TrainingLoadModel.load into a static
prepare function without changing a line of its arithmetic, so a fixture
can run it. The pinned figures cover rated and unrated sets, an unknown
cardio day inside and outside the window, a duplicate awaiting review and
a session rated twice.

Analysis migration required: no
…s lanes

The Cardio and Strength screens computed "load vs your usual" their own
way: Cardio could fall back to non-TRIMP effort and knew no unknown days,
and both compared only through today. Tapping from Training Load to either
screen could therefore show a different percentage for the same week.

TrainingLoadLanes now holds the one strength and cardio lane computation,
read through any day. Training Load reads it through today. Cardio and
Strength read it through the selected week's Sunday, over their history
window plus the 84-day lookback a reading needs, and their load tiles and
coach context use it.

Analysis migration required: no
The three screens get one visual grammar while each keeps its own layout:
a lane hero card with status pill, count-up percentage and trend line,
a KPI strip, a load-over-time chart with 7D/4W/12W and the usual-week
band, summary tiles that open their full card, explainer rows that move
method text into sheets, a shared week control and a two-column layout
for wide windows. Blocks take finished values and only design tokens.
No screen uses them yet.

Analysis migration required: no
The screen stacked thirteen full-width cards under a dual ring whose two
arcs and centre words were hard to tell apart. It now opens on two lane
cards (percentage, status, measured figure, trend, coverage, caveat and
the provisional strength amount), a maturity line, the duplicate and
overload notices, four tiles that open the full Adaptation, Recovery,
8-week and Session load cards, the development cards, week shape, and
explainer rows for maturity, data coverage and method.

The dual ring, its reading type and hero surface, the unused statement
and legend cards and the dial scale helpers are removed.

Analysis migration required: no
The week now opens on the cardio load hero (the same reading Training
Load shows), the week's figures in a two-by-two strip with room for
four-digit distances, the load chart, intensity, and two tiles: the
sport carrying most of the week's measured load with its pace in that
sport's unit, and the week's average heart rate against the usual. The
load, bests and zone-provenance explanations move into explainer rows.

Adds CardioSession.loadShareBySport, weeklyPaceSecPerKm, weeklyAverageHr
and typicalWeeklyAverageHr with tests. The KPI strip, legend and tile
titles in the design kit get more room for long values and German labels.

Analysis migration required: no
The week now opens on the strength load hero (the same reading Training
Load shows), the week's figures with Charge beneath them, then the muscle
map and working sets, the load chart, balance, the range overview with
records, exercise progress, the consistency heatmap, and one session list
where envelopes awaiting details sit in date order beside logged
sessions. Strength load, bodyweight, Effort, Charge and active-weeks
explanations move into explainer rows; the data-gap notes stay beside
their figures.

Analysis migration required: no
Copilot AI balanced review requested due to automatic review settings September 17, 2026 16:42

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@DX23876
DX23876 merged commit 205c0c0 into main Sep 17, 2026
21 of 24 checks passed
DX23876 added a commit that referenced this pull request Sep 17, 2026
…o dodge an x86_64 emit-module crash

The universal macOS leg of app-build.yml crashes swift-frontend during x86_64
module emission (the -experimental-skip-non-inlinable-function-bodies path of
incremental Debug mode) with a stack dump and no source diagnostic. It failed
on every redesign PR (#26-#31) and on the upstream sync branch. Whole-module
mode, set only on the CI xcodebuild invocation, avoids that code path; local
incremental builds are unchanged.

Taken from 4bb8e9e on sync/upstream-2026-09-17, which is not merged yet.

Analysis migration required: no
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.

2 participants