feat(strength): rebuild the Strength screen on the shared design kit - #31
Merged
Merged
Conversation
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
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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:
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
Verification
xcodebuild -scheme Strand test -only-testing:StrandTests: 3,376 tests, 0 failures (3 skipped, as on main). macOS and iOS simulator builds succeed.Tools/translations.i18n_audit --ci origin/mainexits 0.doc_comment_lint: OK.Analysis migration required: no