package Ġcom . d oo ol . poke dex . presentation . ui . pokemon _ info Ċ Ċ import Ġandroidx . compose . animation . animate Color As State Ċ import Ġandroidx . compose . foundation . Image Ċ import Ġandroidx . compose . foundation . background Ċ import Ġandroidx . compose . foundation . gest ures . animate Scroll By Ċ import Ġandroidx . compose . foundation . interaction . collect Is Drag ged As State Ċ import Ġandroidx . compose . foundation . layout .* Ċ import Ġandroidx . compose . foundation . lazy . Lazy Column Ċ import Ġandroidx . compose . foundation . lazy . Lazy List State Ċ import Ġandroidx . compose . foundation . lazy . items Ċ import Ġandroidx . compose . foundation . lazy . remember Lazy List State Ċ import Ġandroidx . compose . material . Circular Progress Indicator Ċ import Ġandroidx . compose . material . Material Theme Ċ import Ġandroidx . compose . material . Tab Ċ import Ġandroidx . compose . material . Tab Row Ċ import Ġandroidx . compose . material . Text Ċ import Ġandroidx . compose . runtime . Composable Ċ import Ġandroidx . compose . runtime . Composition Local Provider Ċ import Ġandroidx . compose . runtime . La unched Effect Ċ import Ġandroidx . compose . runtime . collect As State Ċ import Ġandroidx . compose . runtime . derived State Of Ċ import Ġandroidx . compose . runtime . getValue Ċ import Ġandroidx . compose . runtime . mutable State Of Ċ import Ġandroidx . compose . runtime . remember Ċ import Ġandroidx . compose . runtime . remember Coroutine Scope Ċ import Ġandroidx . compose . runtime . setValue Ċ import Ġandroidx . compose . ui . Alignment Ċ import Ġandroidx . compose . ui . Modifier Ċ import Ġandroidx . compose . ui . draw . alpha Ċ import Ġandroidx . compose . ui . graphics . Blend Mode Ċ import Ġandroidx . compose . ui . graphics . Color Ċ import Ġandroidx . compose . ui . graphics . Color Filter Ċ import Ġandroidx . compose . ui . platform . Local Density Ċ import Ġandroidx . compose . ui . res . color Resource Ċ import Ġandroidx . compose . ui . text . font . Font Weight Ċ import Ġandroidx . compose . ui . unit . dp Ċ import Ġandroidx . compose . ui . unit . sp Ċ import Ġandroidx . h ilt . navigation . compose . h ilt ViewModel Ċ import Ġco il . compose . remember Image Painter Ċ import Ġcom . d oo ol . core . Local Pokemon Color Ċ import Ġcom . d oo ol . core . nav . Local Nav Controller Ċ import Ġcom . d oo ol . core . utils . capitalize And Remove Hy phen Ċ import Ġcom . d oo ol . core . utils . default Placeholder Ċ import Ġcom . d oo ol . core . utils . getItem Top Offset Ċ import Ġcom . d oo ol . core . utils . localized Ċ import Ġcom . d oo ol . core . widget . Default AppBar Ċ import Ġcom . d oo ol . core . widget . Space Ċ import Ġcom . d oo ol . core . widget . Space Fill Ċ import Ġcom . d oo ol . core . widget . TOOL BAR _ HEIGHT Ċ import Ġcom . d oo ol . core . widget . TypeList With Title Ċ import Ġcom . d oo ol . poke dex . R Ċ import Ġcom . d oo ol . poke dex . domain . Load State Ċ import Ġcom . d oo ol . poke dex . domain . getData Ċ import Ġcom . d oo ol . poke dex . domain . isLoading Ċ import Ġcom . d oo ol . poke dex . domain . model . Pokemon Ċ import Ġcom . d oo ol . poke dex . presentation . extensions . get BackgroundColor Ċ import Ġcom . d oo ol . poke dex . presentation . ui . move . info . Move Info Destination Ċ import Ġcom . d oo ol . poke dex . presentation . ui . pokemon _ info . model . Header UI Model Ċ import Ġcom . google . ac comp an ist . pager . Experimental Pager Api Ċ import Ġcom . google . ac comp an ist . pager . Horizontal Pager Ċ import Ġcom . google . ac comp an ist . pager . Pager State Ċ import Ġcom . google . ac comp an ist . pager . calculate Current Offset For Page Ċ import Ġcom . google . ac comp an ist . pager . remember Pager State Ċ import Ġkotlinx . coroutines . launch Ċ import Ġkotlin . math . abs Ċ Ċ private Ġval ĠTH UMB NA IL _ VIEW P AGER _ HEIGHT Ġ= Ġ 1 3 0 . dp Ċ private Ġval ĠTITLE _ HEIGHT Ġ= Ġ 1 1 2 . dp Ċ private Ġval ĠTAB _ HEIGHT Ġ= Ġ 4 2 . dp Ċ Ċ private Ġval ĠHEADER _ HEIGHT Ġ= ĠTO OL BAR _ HEIGHT Ġ+ ĠTH UMB NA IL _ VIEW P AGER _ HEIGHT Ġ+ ĠTITLE _ HEIGHT Ġ+ ĠTAB _ HEIGHT Ċ private Ġval ĠHEADER _ HEIGHT _ EXCL UDE _ P AGER Ġ= ĠHEADER _ HEIGHT Ġ- ĠTH UMB NA IL _ VIEW P AGER _ HEIGHT Ċ Ċ enum Ġclass ĠTab State Ġ{ ĊĠĠĠ ĠAbout , ĠStats , ĠMove , ĠE volution Ċ } Ċ Ċ @ Opt In ( Experimental Pager Api :: class ) Ċ @ Composable Ċ fun ĠPokemon Info Screen ( ĊĠĠĠ ĠviewModel : ĠPokemon Info ViewModel Ġ= Ġh ilt ViewModel () Ċ ) Ġ{ ĊĠĠĠ Ġval Ġpokemon List Ġby ĠviewModel . pokemon List . collect As State ( emptyList ()) ĊĊĠĠĠ Ġif Ġ( pokemon List . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġpager State Ġ= Ġremember Pager State ( initial Page Ġ= ĠviewModel . init Index ) ĊĊĠĠĠĠĠĠĠ ĠPokemon Info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpager State , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpokemon List ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠLa unched Effect ( pager State . currentPage ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel . setCurrent Pokemon ( pokemon List [ pager State . currentPage ]. name ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Experimental Pager Api Ċ @ Composable Ċ fun ĠPokemon Info ( ĊĠĠĠ Ġpager State : ĠP ager State Ġ= Ġremember Pager State (), ĊĠĠĠ ĠviewModel : ĠPokemon Info ViewModel , ĊĠĠĠ Ġitems : ĠList < Pokemon > Ċ ) Ġ{ ĊĠĠĠ Ġval Ġcoroutine Ġ= Ġremember Coroutine Scope () ĊĠĠĠ Ġval Ġdensity Ġ= ĠLocal Density . current ĊĊĠĠĠ Ġval Ġlazy List State Ġ= Ġremember Lazy List State () ĊĠĠĠ Ġvar Ġtab State Ġby Ġremember Ġ{ Ġmutable State Of ( Tab State . About ) Ġ} ĊĊĠĠĠ Ġval Ġoffset Ġby Ġderived State Of Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtop Offset Ġ= Ġlazy List State . getItem Top Offset ( 1 ) ĊĠĠĠĠĠĠĠ Ġval Ġheight Ġ= Ġdensity . run Ġ{ Ġ( top Offset . to Dp () Ġ- ĠHEADER _ HEIGHT _ EXCL UDE _ P AGER ) Ġ} ĊĠĠĠĠĠĠĠ Ġ( height Ġ/ ĠTH UMB NA IL _ VIEW P AGER _ HEIGHT ). coerce In ( 0 f , Ġ 1 f ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdrag ged Ġby Ġlazy List State . interaction Source . collect Is Drag ged As State () ĊĊĠĠĠ ĠLa unched Effect ( lazy List State . is Scroll InProgress ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! drag ged Ġ&& Ġoffset Ġ!= Ġ 0 f Ġ&& Ġoffset Ġ!= Ġ 1 f ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdirection Ġ= Ġif Ġ( offset Ġ> Ġ 0 . 5 f ) Ġ- offset Ġelse Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlazy List State . animate Scroll By ( direction Ġ* Ġdensity . run Ġ{ ĠTH UMB NA IL _ VIEW P AGER _ HEIGHT . to Px () Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ ĠBox With Constraints Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠminHeight Ġ= ĠmaxHeight Ġ- ĠHEADER _ HEIGHT _ EXCL UDE _ P AGER ĊĠĠĠĠĠĠĠ Ġval Ġheader State Ġby ĠviewModel . header State . collect As State () ĊĊĠĠĠĠĠĠĠ ĠComp osition Local Provider ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Pokemon Color Ġprovides Ġcolor Resource ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid Ġ= Ġheader State . getData ()?. types ?. get BackgroundColor () Ġ?: ĠR . color . background _ bug ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBody ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . default Min Size ( min Height Ġ= ĠminHeight ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlazy List State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtab State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠviewModel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġname Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcoroutine . launch Ġ{ Ġpager State . scrollTo Page ( items . indexOf First Ġ{ Ġit . name Ġ== Ġname Ġ}) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmain Color Ġby Ġanimate Color As State ( target Value Ġ= ĠLocal Pokemon Color . current ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠColumn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. background ( color Ġ= Ġmain Color ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( top Ġ= ĠTO OL BAR _ HEIGHT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHeader ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpager State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoffset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠTab ( tab State ) Ġ{ Ġtab State Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDefault AppBar ( back Button Color Ġ= ĠColor . White , Ġshow Divider Ġ= Ġfalse ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠBody ( ĊĠĠĠ Ġmodifier : ĠModifier , ĊĠĠĠ Ġstate : ĠLazy List State Ġ= Ġremember Lazy List State (), ĊĠĠĠ Ġtab State : ĠTab State , ĊĠĠĠ ĠviewModel : ĠPokemon Info ViewModel , ĊĠĠĠ ĠonClick Pokemon : Ġ( String ) Ġ-> ĠUnit , Ċ ) Ġ{ ĊĠĠĠ Ġval Ġnav Controller Ġ= ĠLocal Nav Controller . current ĊĠĠĠ Ġval Ġmove UIState Ġby ĠviewModel . move UIState . collect As State () ĊĊĠĠĠ ĠLazy Column ( ĊĠĠĠĠĠĠĠ Ġstate Ġ= Ġstate ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġitem Ġ{ ĠBox ( Modifier . padding ( top Ġ= ĠHEADER _ HEIGHT )) Ġ} ĊĠĠĠĠĠĠĠ Ġwhen Ġ( tab State ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTab State . About Ġ-> Ġitem (" About ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġabout UIState Ġby ĠviewModel . about UIState . collect As State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAbout ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier . padding ( 2 0 . dp ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġabout UIState Ġ= Ġabout UIState ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTab State . Stats Ġ-> Ġitem (" Stats ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstats UIState Ġby ĠviewModel . stats UIState . collect As State () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPokemon Stats ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier . padding ( 2 0 . dp ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstats UIState Ġ= Ġstats UIState , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTab State . Move Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcom . d oo ol . poke dex . presentation . ui . move . list . Move Headers ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . padding ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġ 2 0 . dp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġ 2 0 . dp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġ 2 0 . dp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbottom Ġ= Ġ 1 0 . dp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( move UIState . isLoading ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitem Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠBox ( Modifier . fill Parent MaxSize ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCircular Progress Indicator ( Modifier . align ( Alignment . Center )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmove UIState . getData ()?. let Ġ{ Ġmove Items Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġitems ( move Items . moves , Ġkey Ġ= Ġ{ Ġit . name Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmove Ġby Ġremember ( it . name ) Ġ{ ĠviewModel . load Pokemon Move ( it . name ) Ġ}. collect As State () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcom . d oo ol . poke dex . presentation . ui . move . list . Move ( move ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnav Controller . navigate ( Move Info Destination . get Route ByName ( it )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTab State . E volution Ġ-> Ġitem (" E volution ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġevolution List UIState Ġby ĠviewModel . e volution List UIState . collect As State () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠE volution List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= Ġmodifier . padding ( 2 0 . dp ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevolution List UIState Ġ= Ġevolution List UIState , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠonClick Pokemon Ġ= ĠonClick Pokemon ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Experimental Pager Api Ċ @ Composable Ċ private Ġfun ĠHeader ( ĊĠĠĠ Ġpager State : ĠP ager State Ġ= Ġremember Pager State (), ĊĠĠĠ Ġitems : ĠList < Pokemon >, ĊĠĠĠ Ġheader UI Model : ĠLoad State < Header UI Model >, ĊĠĠĠ Ġoffset : ĠFloat Ċ ) Ġ{ ĊĠĠĠ ĠBox Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġview Pager Height Ġ= ĠTH UMB NA IL _ VIEW P AGER _ HEIGHT Ġ* Ġoffset ĊĊĠĠĠĠĠĠĠ Ġif Ġ( view Pager Height Ġ> ĠTH UMB NA IL _ VIEW P AGER _ HEIGHT Ġ- ĠTITLE _ HEIGHT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠHorizontal Pager ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. required Height ( TH UMB NA IL _ VIEW P AGER _ HEIGHT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. alpha ( offset . coerce In ( 0 f , Ġ 1 f )), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ= Ġitems . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġ{ Ġitems [ it ]. id Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= Ġpager State , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontent Padding Ġ= ĠPadding Values ( horizontal Ġ= Ġ 1 0 0 . dp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ Ġindex Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpokemon Ġ= Ġitems [ index ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPokemon Image ( pokemon . imageUrl , Ġcalculate Current Offset For Page ( index )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠTitle Layout ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. padding ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop Ġ= Ġview Pager Height , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstart Ġ= Ġ 2 0 . dp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġend Ġ= Ġ 2 0 . dp ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader UIState Ġ= Ġheader UI Model ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠPokemon Image ( imageUrl : ĠString , Ġpage Offset : ĠFloat ) Ġ{ ĊĠĠĠ Ġval Ġpage Offset Ġ= Ġ( 1 Ġ- Ġabs ( page Offset )). coerce In ( 0 f , Ġ 1 f ) ĊĠĠĠ Ġval Ġsize Percent Ġ= Ġ 0 . 5 f Ġ+ Ġpage Offset Ġ/ Ġ 2 f ĊĊĠĠĠ ĠImage ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. fill MaxSize ( size Percent ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. alpha (( page Offset ). coerce In ( 0 . 1 f , Ġ 1 f )), ĊĠĠĠĠĠĠĠ Ġcolor Filter Ġ= ĠColor Filter . tint ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠColor . Black . copy ( alpha Ġ= Ġ 1 f Ġ- Ġpage Offset ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġblend Mode Ġ= ĠBlend Mode . Src A top ĊĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠ Ġpainter Ġ= Ġremember Image Painter ( imageUrl ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġplaceholder ( R . drawable . ic _ poke ball ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġerror ( R . drawable . ic _ poke ball ) ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġcontent Description Ġ= Ġnull ĊĠĠĠ Ġ) Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠTitle Layout ( modifier : ĠModifier , Ġheader UIState : ĠLoad State < Header UI Model >) Ġ{ ĊĠĠĠ Ġval ĠisLoading Ġ= Ġheader UIState . isLoading () ĊĠĠĠ Ġval Ġheader UI Model Ġ= Ġheader UIState . getData () Ġ?: ĠHeader UI Model () ĊĊĠĠĠ ĠColumn ( modifier . height ( TITLE _ HEIGHT )) Ġ{ ĊĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . default Placeholder ( isLoading ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġheader UI Model . form Names . localized . capitalize And Remove Hy phen (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠMaterial Theme . typography . subtitle 1 , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . White . copy ( alpha Ġ= Ġ 0 . 5 f ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ ĠRow ( vertical Alignment Ġ= ĠAlignment . Center Vert ically ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . default Placeholder ( isLoading ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġheader UI Model . names . localized . capitalize And Remove Hy phen (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfontWeight Ġ= ĠFontWeight . Bold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfontSize Ġ= Ġ 3 0 . sp , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . White ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSpace Fill () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . default Placeholder ( isLoading ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġ"# % 0 3 d ". format ( header UI Model . id ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstyle Ġ= ĠMaterial Theme . typography . h 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . White . copy ( alpha Ġ= Ġ 0 . 7 f ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠSpace ( height Ġ= Ġ 6 . dp ) ĊĠĠĠĠĠĠĠ ĠType List With Title ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . default Placeholder ( isLoading ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtypes Ġ= Ġheader UI Model . types ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Composable Ċ private Ġfun ĠTab ( tab State : ĠTab State , Ġchange Tab : Ġ( Tab State ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ ĠTab Row ( ĊĠĠĠĠĠĠĠ Ġmodifier Ġ= ĠModifier . height ( TAB _ HEIGHT ), ĊĠĠĠĠĠĠĠ Ġselected TabIndex Ġ= Ġtab State . ordinal , ĊĠĠĠĠĠĠĠ ĠbackgroundColor Ġ= ĠColor . Transparent , ĊĠĠĠĠĠĠĠ Ġcontent Color Ġ= ĠColor . White ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ ĠTab State . values (). forEach Ġ{ Ġtab Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠTab ( selected Ġ= Ġtab State Ġ== Ġtab , ĠonClick Ġ= Ġ{ Ġchange Tab ( tab ) Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtext Ġ= Ġtab . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolor Ġ= ĠColor . Black ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ