refactor(ui): unify animation curves, share card/detail components, fill a11y gaps - #1199
Merged
Merged
Conversation
everpcpc
force-pushed
the
fix/ui-review-batch-3
branch
from
October 4, 2026 09:49
3400d33 to
de37432
Compare
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.
Stacked on #1198 (itself stacked on #1197) — review those first; this diff shrinks to batch-3 only once they merge.
What
Third batch from the UI review, in two parts:
Animation curve unification. Ad-hoc
.easeInOut/.easeOut/.default/hand-rolled springs across ~55 files now ride the sharedAnimation.appCurve(_:)/.appSpring(durations preserved). The broad Form-level.animation(.default)chains inReaderSettingsSheetandDivinaPreferencesView(rule 15 violations) became explicitwithAnimationat each mutation point, so only the dependent sections animate;ExpandableSummaryView/ExpandToggleButtonno longer double-drive the same transition. Four intentional exceptions remain: the squish press style (needs an underdamped bounce), two autoreversing pulse loops (a timing curve with initial velocity stutters at the loop point), and the widget target (no access toAnimation+App).Component deduplication and accessibility. Collection/read list grid cards now build on
GridCardView(their text styles scale withcardWidthlike book/series cards); horizontal cards share a newHorizontalCardSkeleton(book, collection, read list, read-list-continuation); the read list offline actions (~150 lines duplicated between the context menu and the detail section) are one shared command layer; tri-state filter icons/colors, library scope loading (now@Observable LibraryScopeStore), library add/edit form sections, picker sheets (genericEntityPickerSheet, Create sheets split per the one-type-per-file rule), membership sections (DetailMembershipSection), media information (BookMediaInfoSection),ServerInfoViewrows (viaInfoRow), select-all (SelectAllButton), and the capsule reading button (ReadingActionButton) are each a single shared implementation. Neutral fills shareLayoutConfig.neutralFillColor; the chip-flow "+N" capsule can now collapse; reader chrome close/options buttons, unread-count and completed badges, and the book Read button gained VoiceOver labels; the keyboard-help overlay's key column adapts to content width instead of clipping at large type sizes; two decorative sort icons that looked tappable are gone.Why
The review found the same UI built three to five times with drifting details (fill opacities 0.1/0.12/0.15, footnote vs width-scaled card text, one-way vs two-way expand toggles), animation curves invented per site, and hit-area/VoiceOver gaps on icon-only controls.
Validation
make formatmake build— iOS, macOS, tvOS all passmake localizeclean,misc/translate.py list— no missing keys (no new keys; all reused)