fix(settings): give every nav row one shape, and stop the exercise-media rows centring themselves - #32
Merged
Conversation
…dia rows centring themselves Manage offline exercise media and Available equipment were bare Labels dropped into a VStack whose every other child fills the width, so they centred themselves mid-list, tinted icon AND text with the accent, offered no chevron, and gave a hit area only as wide as their text. A divider between the Exercise media picker and the first of them was missing too. The rest of Settings already had the right pattern — coloured identity tile, primary-text title, chevron in tertiary — but written out by hand eight times, which had drifted into six shapes: three HStack spacings, three chevron fonts (two of them raw .system(size:) rather than a token), Spacer() versus Spacer(minLength: 0), and .contentShape forgotten on half of them. Extract SettingsNavRow and route all eight through it. Rows now share a 44pt minimum touch target and take the whole row as their hit area. Adds one AppleInspiredColors id, exerciseMedia, so the offline-media row gets its own identity colour instead of the default blue. Verified: xcodebuild build for Strand (macOS) and NOOPiOS (iOS) — app-build.yml is disabled, so no CI compiles this. StrandTests SettingsSearchCatalogTests + SettingsDisclosureDefaultsTests pass (9 tests). Checked on the simulator in both dark and light. Analysis migration required: no — presentation only.
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.
Was kaputt war
Manage offline exercise mediaundAvailable equipmentwaren nackteLabelin einemVStack, dessen jedes andere Kind die volle Breite füllt — also haben sie sich mittig zentriert, Icon und Text komplett mit dem Accent eingefärbt, kein Chevron gezeigt, und ihre Trefferfläche war nur so breit wie der Text. Zwischen demExercise media-Picker und der ersten der beiden fehlte außerdem der Divider.Was sonst noch auffiel
Das richtige Muster gab es im selben File schon — farbige Identitäts-Kachel, Titel in
textPrimary, Chevron intextTertiary— aber achtmal von Hand geschrieben, und die Kopien waren in sechs Formen auseinandergelaufen:HStack-Spacings (8 / 10 / default).system(size: 12, weight: .semibold)statt eines TokensSpacer()vs.Spacer(minLength: 0).contentShape(Rectangle())auf der Hälfte vergessenWas dieser PR macht
Zieht ein
SettingsNavRowheraus und routet alle acht Zeilen darüber. Jede Zeile bekommt damit ein 44 pt Mindest-Touch-Target und die ganze Zeile als Trefferfläche. Dazu eine neueAppleInspiredColors-IdexerciseMedia, damit die Offline-Medien-Zeile eine eigene Identitätsfarbe hat statt des Default-Blaus.Verifikation
xcodebuild … buildfür Strand (macOS) und NOOPiOS (iOS) —app-build.ymlist deaktiviert, es kompiliert also kein CI dieses App-Target-Swift.StrandTests/SettingsSearchCatalogTests+SettingsDisclosureDefaultsTests: 9 Tests, 0 Fehler.swift testinStrandDesignzeigt 5 Fehler inPlaceholderTests.testRecoveryStateWords— die sind vorbestehend (auf sauberem Baum identisch) und locale-bedingt: der Test erwartet englische Zustandswörter, meine Maschine löst deutsch auf.Analysis migration required: nein — reine Darstellung.