Skip to content

refactor(ui): unify animation curves, share card/detail components, fill a11y gaps - #1199

Merged
everpcpc merged 2 commits into
mainfrom
fix/ui-review-batch-3
Oct 4, 2026
Merged

everpcpc merged 2 commits into
mainfrom
fix/ui-review-batch-3

Conversation

@everpcpc

@everpcpc everpcpc commented Oct 4, 2026

Copy link
Copy Markdown
Member

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 shared Animation.appCurve(_:)/.appSpring (durations preserved). The broad Form-level .animation(.default) chains in ReaderSettingsSheet and DivinaPreferencesView (rule 15 violations) became explicit withAnimation at each mutation point, so only the dependent sections animate; ExpandableSummaryView/ExpandToggleButton no 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 to Animation+App).

Component deduplication and accessibility. Collection/read list grid cards now build on GridCardView (their text styles scale with cardWidth like book/series cards); horizontal cards share a new HorizontalCardSkeleton (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 (generic EntityPickerSheet, Create sheets split per the one-type-per-file rule), membership sections (DetailMembershipSection), media information (BookMediaInfoSection), ServerInfoView rows (via InfoRow), select-all (SelectAllButton), and the capsule reading button (ReadingActionButton) are each a single shared implementation. Neutral fills share LayoutConfig.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 format
  • make build — iOS, macOS, tvOS all pass
  • make localize clean, misc/translate.py list — no missing keys (no new keys; all reused)
  • repo-conventions skill updated for the new shared components

@everpcpc
everpcpc force-pushed the fix/ui-review-batch-3 branch from 3400d33 to de37432 Compare October 4, 2026 09:49
@everpcpc
everpcpc merged commit dd22409 into main Oct 4, 2026
3 checks passed
@everpcpc
everpcpc deleted the fix/ui-review-batch-3 branch October 4, 2026 09:53
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