Add UI redesign: design system, dashboard density, game intelligence, feed tab, league leaders
Phase 1 - Design System: DesignSystem.swift (typography, colors, spacing constants) and DataPanel.swift (reusable panel container with 3 densities and optional team accent bar). Phase 2 - Dashboard Density: LiveSituationBar (compact strip of all live games with scores/innings/outs), MiniLinescoreView (R-H-E footer for game cards), DiamondView (visual baseball diamond with runners and count). Dashboard shows live situation bar when games are active. Game cards now display mini linescore for live/final games. Phase 3 - Game Center Intelligence: WinProbabilityChartView (full-game line chart using Swift Charts with area fills), PitchArsenalView (pitch type distribution with velocity bars). GameCenterViewModel now stores full WP history array instead of just latest values. Phase 4 - Feed Tab: MLBWebDataService (fetches league leaders from Stats API, news headlines, transactions), FeedViewModel, FeedView with reverse-chronological feed items. FeedItemView with colored edge bars by category. Added 5th "Feed" tab to both tvOS and iOS. Phase 5 - Intel Tab: LeaderboardView (top-5 stat cards with headshots), integrated into LeagueCenterView. Renamed tabs: Games->Today, League->Intel. LeagueCenterViewModel now fetches league leaders. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -73,6 +73,30 @@
|
||||
FAFA9B29273C4D8A54CD5916 /* FeaturedGameCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 102E5E8674E188A04637D3EB /* FeaturedGameCard.swift */; };
|
||||
FD31074216AC0115B3F1C057 /* mlbTVOSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 45142562E644AF04F7719083 /* mlbTVOSApp.swift */; };
|
||||
FD9322BED3A2B827CB021163 /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DE9E708FA75ABB9F49D2392 /* SettingsView.swift */; };
|
||||
37407BFDD8DE522452EF59A9 /* DesignSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60A41C116893411524EA91B1 /* DesignSystem.swift */; };
|
||||
E1C4B52624855C00D4248CF7 /* DesignSystem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60A41C116893411524EA91B1 /* DesignSystem.swift */; };
|
||||
1709C71D035868F36D786A6C /* DataPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2BCF01456B595D46DBEDFD4 /* DataPanel.swift */; };
|
||||
9F57F341DE0236C88F5D9AB4 /* DataPanel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C2BCF01456B595D46DBEDFD4 /* DataPanel.swift */; };
|
||||
3A707B3D07159E3794810DA6 /* MiniLinescoreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D48B64BA00C6B2DF270EF92 /* MiniLinescoreView.swift */; };
|
||||
394BFB3C349C866C45652736 /* MiniLinescoreView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D48B64BA00C6B2DF270EF92 /* MiniLinescoreView.swift */; };
|
||||
E1EE34169F3361C53FB042C2 /* DiamondView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92817781B4EB8AC773F94A1B /* DiamondView.swift */; };
|
||||
C9BAFB42FB62DB304C446C5F /* DiamondView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92817781B4EB8AC773F94A1B /* DiamondView.swift */; };
|
||||
C3245C14690AF4CE8882130E /* LiveSituationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0502ADB4033DE026238AAE01 /* LiveSituationBar.swift */; };
|
||||
492CF47C161A3F31DED29740 /* LiveSituationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0502ADB4033DE026238AAE01 /* LiveSituationBar.swift */; };
|
||||
312CC5DD0539384FDF65BEB7 /* WinProbabilityChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26F2E60D9F3315064FC7B793 /* WinProbabilityChartView.swift */; };
|
||||
4DDB697A8363736A0E0C345E /* WinProbabilityChartView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26F2E60D9F3315064FC7B793 /* WinProbabilityChartView.swift */; };
|
||||
F17BF3697CF0008A9417FE08 /* PitchArsenalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A86C820F4ABDD390A1E3F1FA /* PitchArsenalView.swift */; };
|
||||
026E8F398909A35C0DD41D16 /* PitchArsenalView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A86C820F4ABDD390A1E3F1FA /* PitchArsenalView.swift */; };
|
||||
CB3E29DA692C18137C037F93 /* MLBWebDataService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EB8E3E205222A55700CF24C /* MLBWebDataService.swift */; };
|
||||
E1DA8514E6177069C04B0416 /* MLBWebDataService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7EB8E3E205222A55700CF24C /* MLBWebDataService.swift */; };
|
||||
C7C0D9F7B6A3EBD4D9F4B973 /* FeedViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C920FA380D9DDDED113068E3 /* FeedViewModel.swift */; };
|
||||
560051D308A26379374EC9C4 /* FeedViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = C920FA380D9DDDED113068E3 /* FeedViewModel.swift */; };
|
||||
5802E2BE747B7B59F00AE1E7 /* FeedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F68D38B739C81D7747CC412 /* FeedItemView.swift */; };
|
||||
9BF7942D0252B0EB87DE58B3 /* FeedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9F68D38B739C81D7747CC412 /* FeedItemView.swift */; };
|
||||
C5057ECFA9FCBFFC6A8A7E15 /* FeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981C95E73FFDAFE2E26B06C2 /* FeedView.swift */; };
|
||||
6581BE8213BB231538C9EB8E /* FeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 981C95E73FFDAFE2E26B06C2 /* FeedView.swift */; };
|
||||
DB34919E15ABAA1B40DF9A5B /* LeaderboardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 726AEA37AC2C75C017A888C1 /* LeaderboardView.swift */; };
|
||||
94D2242FE48B5FECE15116FF /* LeaderboardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 726AEA37AC2C75C017A888C1 /* LeaderboardView.swift */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXContainerItemProxy section */
|
||||
@@ -129,6 +153,18 @@
|
||||
E80EF8B01452220FA6BCD9B2 /* GameCenterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameCenterView.swift; sourceTree = "<group>"; };
|
||||
F5DA48863884BB6B4983BEE6 /* GameCenterViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameCenterViewModel.swift; sourceTree = "<group>"; };
|
||||
FA4AF68CDF4FC8D07194B4D0 /* SingleStreamPlayerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SingleStreamPlayerView.swift; sourceTree = "<group>"; };
|
||||
60A41C116893411524EA91B1 /* DesignSystem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DesignSystem.swift; sourceTree = "<group>"; };
|
||||
C2BCF01456B595D46DBEDFD4 /* DataPanel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataPanel.swift; sourceTree = "<group>"; };
|
||||
1D48B64BA00C6B2DF270EF92 /* MiniLinescoreView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MiniLinescoreView.swift; sourceTree = "<group>"; };
|
||||
92817781B4EB8AC773F94A1B /* DiamondView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DiamondView.swift; sourceTree = "<group>"; };
|
||||
0502ADB4033DE026238AAE01 /* LiveSituationBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LiveSituationBar.swift; sourceTree = "<group>"; };
|
||||
26F2E60D9F3315064FC7B793 /* WinProbabilityChartView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WinProbabilityChartView.swift; sourceTree = "<group>"; };
|
||||
A86C820F4ABDD390A1E3F1FA /* PitchArsenalView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PitchArsenalView.swift; sourceTree = "<group>"; };
|
||||
7EB8E3E205222A55700CF24C /* MLBWebDataService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MLBWebDataService.swift; sourceTree = "<group>"; };
|
||||
C920FA380D9DDDED113068E3 /* FeedViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedViewModel.swift; sourceTree = "<group>"; };
|
||||
9F68D38B739C81D7747CC412 /* FeedItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedItemView.swift; sourceTree = "<group>"; };
|
||||
981C95E73FFDAFE2E26B06C2 /* FeedView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedView.swift; sourceTree = "<group>"; };
|
||||
726AEA37AC2C75C017A888C1 /* LeaderboardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LeaderboardView.swift; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
@@ -137,6 +173,7 @@
|
||||
children = (
|
||||
F5DA48863884BB6B4983BEE6 /* GameCenterViewModel.swift */,
|
||||
9BD2DEA6BBA55E86B2555099 /* GamesViewModel.swift */,
|
||||
C920FA380D9DDDED113068E3 /* FeedViewModel.swift */,
|
||||
7E9E572D932D96FE2C5BD7A4 /* LeagueCenterViewModel.swift */,
|
||||
);
|
||||
path = ViewModels;
|
||||
@@ -170,6 +207,15 @@
|
||||
children = (
|
||||
C3D1C29BF9DF2B8F811368BC /* AtBatTimelineView.swift */,
|
||||
327A33F2676712C2B5B4AF2F /* LinescoreView.swift */,
|
||||
726AEA37AC2C75C017A888C1 /* LeaderboardView.swift */,
|
||||
9F68D38B739C81D7747CC412 /* FeedItemView.swift */,
|
||||
A86C820F4ABDD390A1E3F1FA /* PitchArsenalView.swift */,
|
||||
26F2E60D9F3315064FC7B793 /* WinProbabilityChartView.swift */,
|
||||
0502ADB4033DE026238AAE01 /* LiveSituationBar.swift */,
|
||||
92817781B4EB8AC773F94A1B /* DiamondView.swift */,
|
||||
1D48B64BA00C6B2DF270EF92 /* MiniLinescoreView.swift */,
|
||||
C2BCF01456B595D46DBEDFD4 /* DataPanel.swift */,
|
||||
60A41C116893411524EA91B1 /* DesignSystem.swift */,
|
||||
81584770090BAFBEF3ABE6FD /* LiveIndicator.swift */,
|
||||
C6E303B753C604504C2762C7 /* PitcherHeadshotView.swift */,
|
||||
7F13A88254E53AF5A4AAA2AA /* PitchSequenceView.swift */,
|
||||
@@ -227,6 +273,7 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
70E610D24BA83FB2F7490B00 /* MLBServerAPI.swift */,
|
||||
7EB8E3E205222A55700CF24C /* MLBWebDataService.swift */,
|
||||
6067FE4F340FC0DCCFA62C67 /* MLBStatsAPI.swift */,
|
||||
C3A003EA560655E4B2200DBE /* VideoShuffle.swift */,
|
||||
);
|
||||
@@ -238,6 +285,7 @@
|
||||
children = (
|
||||
3FB99FBEDA096B95C3D2E5B4 /* ContentView.swift */,
|
||||
5EA4C33F029665B80F1A6B6D /* DashboardView.swift */,
|
||||
981C95E73FFDAFE2E26B06C2 /* FeedView.swift */,
|
||||
102E5E8674E188A04637D3EB /* FeaturedGameCard.swift */,
|
||||
E21E3115B8A9B4C798ECE828 /* GameCardView.swift */,
|
||||
E80EF8B01452220FA6BCD9B2 /* GameCenterView.swift */,
|
||||
@@ -392,6 +440,18 @@
|
||||
8649D4F513A663D2493D91C9 /* LeagueCenterView.swift in Sources */,
|
||||
E42B27D852AB037246167C23 /* LeagueCenterViewModel.swift in Sources */,
|
||||
4CB947BC5B5ECF83EF84F7E4 /* LinescoreView.swift in Sources */,
|
||||
94D2242FE48B5FECE15116FF /* LeaderboardView.swift in Sources */,
|
||||
6581BE8213BB231538C9EB8E /* FeedView.swift in Sources */,
|
||||
9BF7942D0252B0EB87DE58B3 /* FeedItemView.swift in Sources */,
|
||||
560051D308A26379374EC9C4 /* FeedViewModel.swift in Sources */,
|
||||
E1DA8514E6177069C04B0416 /* MLBWebDataService.swift in Sources */,
|
||||
026E8F398909A35C0DD41D16 /* PitchArsenalView.swift in Sources */,
|
||||
4DDB697A8363736A0E0C345E /* WinProbabilityChartView.swift in Sources */,
|
||||
492CF47C161A3F31DED29740 /* LiveSituationBar.swift in Sources */,
|
||||
C9BAFB42FB62DB304C446C5F /* DiamondView.swift in Sources */,
|
||||
394BFB3C349C866C45652736 /* MiniLinescoreView.swift in Sources */,
|
||||
9F57F341DE0236C88F5D9AB4 /* DataPanel.swift in Sources */,
|
||||
E1C4B52624855C00D4248CF7 /* DesignSystem.swift in Sources */,
|
||||
0653C2F5CC55F4234E8950E5 /* LiveIndicator.swift in Sources */,
|
||||
D864A2844FD222A04B48F6EF /* MLBNetworkSheet.swift in Sources */,
|
||||
8801888DFD48351B1D344D45 /* MLBServerAPI.swift in Sources */,
|
||||
@@ -439,6 +499,18 @@
|
||||
07BBD0E7B7F122213708A406 /* LeagueCenterView.swift in Sources */,
|
||||
B0A9FFD5C20A80E16532CC91 /* LeagueCenterViewModel.swift in Sources */,
|
||||
051C3D14A06061D44E325FCC /* LinescoreView.swift in Sources */,
|
||||
DB34919E15ABAA1B40DF9A5B /* LeaderboardView.swift in Sources */,
|
||||
C5057ECFA9FCBFFC6A8A7E15 /* FeedView.swift in Sources */,
|
||||
5802E2BE747B7B59F00AE1E7 /* FeedItemView.swift in Sources */,
|
||||
C7C0D9F7B6A3EBD4D9F4B973 /* FeedViewModel.swift in Sources */,
|
||||
CB3E29DA692C18137C037F93 /* MLBWebDataService.swift in Sources */,
|
||||
F17BF3697CF0008A9417FE08 /* PitchArsenalView.swift in Sources */,
|
||||
312CC5DD0539384FDF65BEB7 /* WinProbabilityChartView.swift in Sources */,
|
||||
C3245C14690AF4CE8882130E /* LiveSituationBar.swift in Sources */,
|
||||
E1EE34169F3361C53FB042C2 /* DiamondView.swift in Sources */,
|
||||
3A707B3D07159E3794810DA6 /* MiniLinescoreView.swift in Sources */,
|
||||
1709C71D035868F36D786A6C /* DataPanel.swift in Sources */,
|
||||
37407BFDD8DE522452EF59A9 /* DesignSystem.swift in Sources */,
|
||||
E7FB366456557069990F550C /* LiveIndicator.swift in Sources */,
|
||||
820FB03D0E97C521BA239071 /* MLBNetworkSheet.swift in Sources */,
|
||||
1E31C6F500CEEA5284081D22 /* MLBServerAPI.swift in Sources */,
|
||||
|
||||
Reference in New Issue
Block a user