@@ -459,45 +459,48 @@ const Analysis: React.FC<Props> = ({
459
459
) ,
460
460
) }
461
461
</ div >
462
- < div className = "flex w-full items-center justify-between text-sm opacity-80 md:hidden" >
463
- < div className = "flex items-center gap-1.5 " >
462
+ < div className = "flex w-full items-center justify-between text-xs md:hidden" >
463
+ < div className = "flex items-center gap-1" >
464
464
< div className = "h-2 w-2 rounded-full bg-white" />
465
465
< span className = "font-medium" > { analyzedGame . whitePlayer . name } </ span >
466
466
{ analyzedGame . whitePlayer . rating && (
467
- < span className = "text-primary/70 " >
467
+ < span className = "text-primary/60 " >
468
468
({ analyzedGame . whitePlayer . rating } )
469
469
</ span >
470
470
) }
471
471
</ div >
472
- < div className = "flex items-center gap-1.5" >
473
- < span
474
- className = {
475
- analyzedGame . termination . winner === 'white'
476
- ? 'font-medium text-engine-3'
477
- : 'text-primary/70'
478
- }
479
- >
480
- { analyzedGame . termination . winner === 'white' ? '1' : '0' }
481
- </ span >
482
- < span className = "text-primary/70" > -</ span >
483
- < span
484
- className = {
485
- analyzedGame . termination . winner === 'black'
486
- ? 'font-medium text-engine-3'
487
- : 'text-primary/70'
488
- }
489
- >
490
- { analyzedGame . termination . winner === 'black' ? '1' : '0' }
491
- </ span >
492
- { analyzedGame . termination . winner === 'none' && (
493
- < span className = "font-medium text-primary/70" > ½-½</ span >
472
+ < div className = "flex items-center gap-1" >
473
+ { analyzedGame . termination . winner === 'none' ? (
474
+ < span className = "font-medium text-primary/80" > ½-½</ span >
475
+ ) : (
476
+ < span className = "font-medium" >
477
+ < span
478
+ className = {
479
+ analyzedGame . termination . winner === 'white'
480
+ ? 'text-engine-3'
481
+ : 'text-primary/70'
482
+ }
483
+ >
484
+ { analyzedGame . termination . winner === 'white' ? '1' : '0' }
485
+ </ span >
486
+ < span className = "text-primary/70" > -</ span >
487
+ < span
488
+ className = {
489
+ analyzedGame . termination . winner === 'black'
490
+ ? 'text-engine-3'
491
+ : 'text-primary/70'
492
+ }
493
+ >
494
+ { analyzedGame . termination . winner === 'black' ? '1' : '0' }
495
+ </ span >
496
+ </ span >
494
497
) }
495
498
</ div >
496
- < div className = "flex items-center gap-1.5 " >
499
+ < div className = "flex items-center gap-1" >
497
500
< div className = "h-2 w-2 rounded-full border-[0.5px] bg-black" />
498
501
< span className = "font-medium" > { analyzedGame . blackPlayer . name } </ span >
499
502
{ analyzedGame . blackPlayer . rating && (
500
- < span className = "text-primary/70 " >
503
+ < span className = "text-primary/60 " >
501
504
({ analyzedGame . blackPlayer . rating } )
502
505
</ span >
503
506
) }
@@ -519,9 +522,15 @@ const Analysis: React.FC<Props> = ({
519
522
< div className = "flex max-h-[25vh] min-h-[25vh] flex-col bg-backdrop/30" >
520
523
< AnalysisGameList
521
524
currentId = { currentId }
522
- loadNewTournamentGame = { getAndSetTournamentGame }
523
- loadNewLichessGames = { getAndSetLichessGames }
524
- loadNewUserGames = { getAndSetUserGames }
525
+ loadNewTournamentGame = { ( newId , setCurrentMove ) =>
526
+ getAndSetTournamentGame ( newId , setCurrentMove )
527
+ }
528
+ loadNewLichessGames = { ( id , pgn , setCurrentMove ) =>
529
+ getAndSetLichessGames ( id , pgn , setCurrentMove )
530
+ }
531
+ loadNewUserGames = { ( id , type , setCurrentMove ) =>
532
+ getAndSetUserGames ( id , type , setCurrentMove )
533
+ }
525
534
/>
526
535
</ div >
527
536
< div className = "flex h-1/2 w-full flex-1 flex-col gap-2" >
@@ -625,82 +634,139 @@ const Analysis: React.FC<Props> = ({
625
634
</ div >
626
635
)
627
636
637
+ const [ showGameListMobile , setShowGameListMobile ] = useState ( false )
638
+
628
639
const mobileLayout = (
629
640
< >
630
641
< div className = "flex h-full flex-1 flex-col justify-center gap-1" >
631
- < div className = "flex w-full flex-col items-start justify-start gap-1" >
632
- < GameInfo
633
- title = "Analysis"
634
- icon = "bar_chart"
635
- type = "analysis"
636
- currentMaiaModel = { currentMaiaModel }
637
- setCurrentMaiaModel = { setCurrentMaiaModel }
638
- MAIA_MODELS = { MAIA_MODELS }
639
- >
640
- < NestedGameInfo />
641
- </ GameInfo >
642
- < div className = "relative flex h-[100vw] w-screen" >
643
- < AnalysisGameBoard
644
- game = { analyzedGame }
645
- moves = { moves }
646
- setCurrentSquare = { setCurrentSquare }
647
- shapes = { hoverArrow ? [ ...arrows , hoverArrow ] : [ ...arrows ] }
648
- currentNode = { controller . currentNode as GameNode }
649
- orientation = { controller . orientation }
650
- goToNode = { controller . goToNode }
651
- />
652
- </ div >
653
- < div className = "flex w-full flex-col gap-0" >
654
- < div className = "w-full !flex-grow-0" >
655
- < AnalysisBoardController />
642
+ { showGameListMobile ? (
643
+ < div className = "flex w-full flex-col items-start justify-start gap-1" >
644
+ < div className = "flex w-full flex-col items-start justify-start overflow-hidden bg-background-1 p-3" >
645
+ < div className = "flex w-full items-center justify-between" >
646
+ < div className = "flex items-center justify-start gap-1.5" >
647
+ < span className = "material-symbols-outlined text-xl" >
648
+ format_list_bulleted
649
+ </ span >
650
+ < h2 className = "text-xl font-semibold" > Switch Game</ h2 >
651
+ </ div >
652
+ < button
653
+ className = "flex items-center gap-1 rounded bg-background-2 px-2 py-1 text-sm duration-200 hover:bg-background-3"
654
+ onClick = { ( ) => setShowGameListMobile ( false ) }
655
+ >
656
+ < span className = "material-symbols-outlined text-sm" >
657
+ arrow_back
658
+ </ span >
659
+ < span > Back to Analysis</ span >
660
+ </ button >
661
+ </ div >
662
+ < p className = "mt-1 text-sm text-secondary" >
663
+ Select a game to analyze
664
+ </ p >
656
665
</ div >
657
- < div className = "relative bottom-0 h-48 max-h-48 flex-1 overflow-auto overflow-y-hidden" >
658
- < AnalysisMovesContainer
659
- game = { analyzedGame }
660
- termination = { analyzedGame . termination }
666
+ < div className = "flex h-[calc(100vh-10rem)] w-full flex-col overflow-hidden rounded bg-backdrop/30" >
667
+ < AnalysisGameList
668
+ currentId = { currentId }
669
+ loadNewTournamentGame = { ( newId , setCurrentMove ) =>
670
+ loadGameAndCloseList (
671
+ getAndSetTournamentGame ( newId , setCurrentMove ) ,
672
+ )
673
+ }
674
+ loadNewLichessGames = { ( id , pgn , setCurrentMove ) =>
675
+ loadGameAndCloseList (
676
+ getAndSetLichessGames ( id , pgn , setCurrentMove ) ,
677
+ )
678
+ }
679
+ loadNewUserGames = { ( id , type , setCurrentMove ) =>
680
+ loadGameAndCloseList (
681
+ getAndSetUserGames ( id , type , setCurrentMove ) ,
682
+ )
683
+ }
661
684
/>
662
685
</ div >
663
686
</ div >
664
- < div className = "flex w-full flex-col gap-1 overflow-hidden" >
665
- < BlunderMeter
666
- hover = { hover }
667
- makeMove = { makeMove }
668
- data = { blunderMeter }
669
- colorSanMapping = { colorSanMapping }
670
- />
671
- < Highlight
672
- hover = { hover }
673
- makeMove = { makeMove }
687
+ ) : (
688
+ < div className = "flex w-full flex-col items-start justify-start gap-1" >
689
+ < GameInfo
690
+ title = "Analysis"
691
+ icon = "bar_chart"
692
+ type = "analysis"
674
693
currentMaiaModel = { currentMaiaModel }
675
- recommendations = { moveRecommendations }
676
- moveEvaluation = {
677
- moveEvaluation as {
678
- maia ?: MaiaEvaluation
679
- stockfish ?: StockfishEvaluation
694
+ setCurrentMaiaModel = { setCurrentMaiaModel }
695
+ MAIA_MODELS = { MAIA_MODELS }
696
+ onGameListClick = { ( ) => setShowGameListMobile ( true ) }
697
+ showGameListButton = { true }
698
+ >
699
+ < NestedGameInfo />
700
+ </ GameInfo >
701
+ < div className = "relative flex h-[100vw] w-screen" >
702
+ < AnalysisGameBoard
703
+ game = { analyzedGame }
704
+ moves = { moves }
705
+ setCurrentSquare = { setCurrentSquare }
706
+ shapes = { hoverArrow ? [ ...arrows , hoverArrow ] : [ ...arrows ] }
707
+ currentNode = { controller . currentNode as GameNode }
708
+ orientation = { controller . orientation }
709
+ goToNode = { controller . goToNode }
710
+ />
711
+ </ div >
712
+ < div className = "flex w-full flex-col gap-0" >
713
+ < div className = "w-full !flex-grow-0" >
714
+ < AnalysisBoardController />
715
+ </ div >
716
+ < div className = "relative bottom-0 h-48 max-h-48 flex-1 overflow-auto overflow-y-hidden" >
717
+ < AnalysisMovesContainer
718
+ game = { analyzedGame }
719
+ termination = { analyzedGame . termination }
720
+ />
721
+ </ div >
722
+ </ div >
723
+ < div className = "flex w-full flex-col gap-1 overflow-hidden" >
724
+ < BlunderMeter
725
+ hover = { hover }
726
+ makeMove = { makeMove }
727
+ data = { blunderMeter }
728
+ colorSanMapping = { colorSanMapping }
729
+ />
730
+ < Highlight
731
+ hover = { hover }
732
+ makeMove = { makeMove }
733
+ currentMaiaModel = { currentMaiaModel }
734
+ recommendations = { moveRecommendations }
735
+ moveEvaluation = {
736
+ moveEvaluation as {
737
+ maia ?: MaiaEvaluation
738
+ stockfish ?: StockfishEvaluation
739
+ }
680
740
}
681
- }
682
- movesByRating = { movesByRating }
683
- colorSanMapping = { colorSanMapping }
684
- />
685
- < MoveMap
686
- moveMap = { moveMap }
687
- colorSanMapping = { colorSanMapping }
688
- setHoverArrow = { setHoverArrow }
741
+ movesByRating = { movesByRating }
742
+ colorSanMapping = { colorSanMapping }
743
+ />
744
+ < MoveMap
745
+ moveMap = { moveMap }
746
+ colorSanMapping = { colorSanMapping }
747
+ setHoverArrow = { setHoverArrow }
748
+ />
749
+ </ div >
750
+ < ConfigurableScreens
751
+ currentMaiaModel = { currentMaiaModel }
752
+ setCurrentMaiaModel = { setCurrentMaiaModel }
753
+ launchContinue = { launchContinue }
754
+ MAIA_MODELS = { MAIA_MODELS }
755
+ game = { analyzedGame }
756
+ currentNode = { controller . currentNode as GameNode }
689
757
/>
690
758
</ div >
691
- < ConfigurableScreens
692
- currentMaiaModel = { currentMaiaModel }
693
- setCurrentMaiaModel = { setCurrentMaiaModel }
694
- launchContinue = { launchContinue }
695
- MAIA_MODELS = { MAIA_MODELS }
696
- game = { analyzedGame }
697
- currentNode = { controller . currentNode as GameNode }
698
- />
699
- </ div >
759
+ ) }
700
760
</ div >
701
761
</ >
702
762
)
703
763
764
+ // Helper function to load a game and close the game list
765
+ const loadGameAndCloseList = async ( loadFunction : Promise < void > ) => {
766
+ await loadFunction
767
+ setShowGameListMobile ( false )
768
+ }
769
+
704
770
return (
705
771
< >
706
772
< Head >
0 commit comments