Main coves client

refactor(ui): unify duplicated UI machinery behind shared primitives master

Eliminate five clusters of copy-paste divergence that were already visible to users (mismatched fallback colors, lowercase-k counts, missing scroll- jitter fixes), driven test-first per cluster and hardened by a seven- reviewer multi-model review pass. Changes: - counts: delete DateTimeUtils.formatCount (no M tier: 1.5M -> "1500.0k"), two private copies, and one raw-int render; DisplayUtils.formatCount ("5.2K"/"1.5M") is the only formatter - urls: new Flutter-free utils/url_policy.dart (scheme + non-empty host); six divergent allowlist copies now delegate; fixes create_post accepting httpx:// schemes and adds host checks at the launcher and both model constructors - avatars: new UserAvatar widget + CommunityAvatar fallbackIcon/ fallbackColor params; 13 hand-rolled sites migrated; fallback colors unified on DisplayUtils.getFallbackColor; fixes comment-card 14/24px size mismatch and a RangeError on empty community names - media: new widgets/media/ (fill/badge, aspect clamp, play chip, native + Streamable video, image thumb/gallery, favicon) and utils/url_display.dart; post_card 883->553 lines, detailed_post_view 1079->647; fixes case-sensitive embedType matching, missing Semantics(enabled:) while resolving, divergent snackbar copy; non-Streamable video taps now launch the external URL instead of silently no-oping - pagination: new CursorPaginationController (single-flight + generation supersede, error/loadMoreError channels, idOf dedupe, empty-page stop, onUnexpectedError -> Sentry), PaginatedSliverList (stable childCount, keyed footer, findChildIndexCallback, fixed 80px footer), and PaginationScrollListener (throttled trigger + checkNow for short first pages); adopted by community feed, communities see-all, and profile posts/comments; fixes silent pull-to-refresh failures, the sort-change race, build-phase load-more triggers, and a load-more retry storm MultiFeedProvider/FeedPage deliberately unchanged (For You session-discard logic); follow-ups recorded in project memory. Suite grows 1201 -> 1463 tests; flutter analyze drops 444 -> 436 pre-existing infos; verified on the Android emulator against prod data. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>


+8372 -2388
71 changed files