From 8b1c65fa4305302482a8349955c242f7dfd460b2 Mon Sep 17 00:00:00 2001 From: nk Date: Sun, 7 Jun 2026 17:43:10 +0300 Subject: [PATCH] =?UTF-8?q?feat(filters):=20=D1=87=D0=B8=D0=BF=20=D1=83?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=8C=D1=88=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D0=B8=20=D1=82=D0=B0=D0=B5=D1=82=20=D1=83=20=D0=BA=D0=BD=D0=BE?= =?UTF-8?q?=D0=BF=D0=BA=D0=B8=20(=D1=8D=D1=84=D1=84=D0=B5=D0=BA=D1=82=20?= =?UTF-8?q?=D0=BE=D1=82=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=B2?= =?UTF-8?q?=20=D0=B3=D0=BB=D1=83=D0=B1=D0=B8=D0=BD=D1=83)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Вместо простого затухания края — per-chip трансформация по позиции: чип масштабируется 0.42..1 + alpha по recedeFactor (offset элемента в LazyRow: правее 92dp — норма, к 46dp — исчез). transformOrigin центр-лево → будто уходит в глубину под кнопку-категорию. Отступ слева увеличен (взлётка под кнопкой 96/100dp). Радио и Чарты. --- .../com/radiola/ui/charts/ChartsScreen.kt | 31 +++++++++--------- .../com/radiola/ui/components/FilterChips.kt | Bin 4560 -> 5479 bytes .../com/radiola/ui/stations/StationsScreen.kt | 3 +- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/radiola/ui/charts/ChartsScreen.kt b/app/src/main/java/com/radiola/ui/charts/ChartsScreen.kt index cea287c..5a46607 100644 --- a/app/src/main/java/com/radiola/ui/charts/ChartsScreen.kt +++ b/app/src/main/java/com/radiola/ui/charts/ChartsScreen.kt @@ -16,6 +16,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.itemsIndexed +import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.* @@ -46,7 +47,8 @@ import com.radiola.domain.model.StatPoint import com.radiola.domain.model.TrackStats import com.radiola.ui.components.CategoryPicker import com.radiola.ui.components.EmptyState -import com.radiola.ui.components.fadingStartEdge +import com.radiola.ui.components.recede +import com.radiola.ui.components.recedeFactor import com.radiola.ui.components.PopularityChart import com.radiola.ui.components.crossfadeModel import com.radiola.ui.components.serviceLogoRes @@ -108,11 +110,10 @@ fun ChartsScreen( genres = genres, selected = selectedGenre, onSelect = viewModel::selectGenre, - contentPadding = PaddingValues(start = 70.dp, end = 20.dp), + contentPadding = PaddingValues(start = 100.dp, end = 20.dp), modifier = Modifier .fillMaxWidth() .align(Alignment.Center) - .fadingStartEdge(62.dp) ) CategoryPicker( title = "Стиль музыки", @@ -233,24 +234,22 @@ private fun GenreSelector( modifier: Modifier = Modifier, contentPadding: PaddingValues = PaddingValues(horizontal = 20.dp) ) { + val listState = rememberLazyListState() + val all = remember(genres) { listOf(null) + genres } LazyRow( modifier = modifier, + state = listState, horizontalArrangement = Arrangement.spacedBy(9.dp), contentPadding = contentPadding ) { - item { - PeriodChip( - label = "Все", - selected = selected == null, - onClick = { onSelect(null) } - ) - } - items(genres) { genre -> - PeriodChip( - label = genre, - selected = selected == genre, - onClick = { onSelect(genre) } - ) + itemsIndexed(all, key = { _, g -> g ?: " all" }) { index, g -> + Box(modifier = Modifier.recede(recedeFactor(listState, index))) { + PeriodChip( + label = g ?: "Все", + selected = selected == g, + onClick = { onSelect(g) } + ) + } } } } diff --git a/app/src/main/java/com/radiola/ui/components/FilterChips.kt b/app/src/main/java/com/radiola/ui/components/FilterChips.kt index bd0d751fedd27ddc6818c868162f58a429fad598..7c05692502c800c2865c7c85a92c2ea9c0ade6c3 100644 GIT binary patch delta 1920 zcmZWqOK%%h6ee*fsat`vNCAn*Y1oW|Gj^&Lfgx=~qew=9L`oN}tcXtRJIRRgj5RX} zF;Qfvsc5AXLYXXBQ3=F~jh$E1Bu+|x!5w}An~EQR#DWFiy)$EyGL}ca=Y78Won!va zv;OZs^d}R=hfmKnN0S|ikL?A&C-FLte!j!?`#J~w&5qnld8@=0SSeQZbpHKvi8;nR zD@}Tu$HsMNF8XH^pZGh8G5>bgS>NyKf8~awS*~t7<#ETDF)aVL#2ZrgS68aHVrrgH zsbh9gGe?-^8eUaey!B$Ew$2avey~Qzzw)D?&Ubl}@8i7_Jmf8W4uj?34&OcAr{EhX zw)p|REr=RaFhr?S#5bs58m=eno66B3{ZU^hglz_^!95tS@+XAQ4gOeo2X#_pss`WS z+cmzOq<$*6p5}NXm8n#kveG|TpX*@|G<9|Eu*M?D4Ph`3Re8encf<*H(P3CK!MAAwP9l2 z&+t@P01XX=l|&s9VkS2>6R3PX-Q8mC6k$cQ2LReV#N40$!v`JA$Yn4CW?t}LA`yv zpCcGGz{~q`1e%mpFJDsCL3)>bI`dkM#H>+p7hZc}B7!Pub%XM^+#^MoxiG7IWBbHSIep`^p#Rf6Q zdKG)NA@|9C@F3cnA<xMKbUsmJw?COyZnX0BaT zEbumkT7}-9IQO&$R?Ghw1p(6Z1*;;;B7L4FFz_l~AaCCb(Dl)hh!>3;+@WrhP85N^ zFr^&bFJi>^8DI6OP1YW@^u;h@Duv*u!ikXAXN`*DYu&xCn%XoI{fWGyq7d~y|91C< nH(h43qQ^>5$3Jht3=;`!Vc}anN&olrZ~J$9E^IzK|7X{~%DohI delta 1064 zcmZ`&TTc@~6i%`AQi!S7#A_xHlU;&~#wQ^fxfm~j0Ak{U;bFR+wyVo-ogJ)&m{N(6 zL?gtga}-EX-weEns+Df`1c2NRrT4fS)&66r425zG;YJucsd z_w4SpnUm;s6LKJQRK5;3L^}D1mtIew+u!95XI#$`mXjJ3oC=nbmm()rrQ8wGli0}^Hk zEFqxiPZ14PaaV!G;QT}p`vv5DrW4#3i9ZQtOqF2;DQ-7qt%OJq8Bx+q;5|lH{iiK~ z4Je_R1w|Z#13;q-Wi%K7_ zSb`+UlOqnnURp_uaU)3+LDwi3mlG+L*8-z$q&uUxZKB8pBGQ%@CAf?f zr=py`I`GH$XC(d&9b^Q=*31nI3R#dU+3Lfhm~TyZr*$Q6u|k#@N?>N*XA z+E+OC1gB4v-wzzl4+=NqA&hcPbA8EL4#lI^nIsV|-r07!ag$TW%TSICEj5BwC?Q&w zw35GkZk2Z0)Vy0;BZp)A&g->A@%4WLQ|>qRMz<%fIh)1R+s}8@->H-L_I^Hvz1`4P z->$Tk(QF!LHgYt=G){l1u|?L$j>Vl3+t%@2UFRlE4Kf=W#}ZmKT75S~u(h)U8}>9o cQ=Y2AFFAej|5}(=GABd2yc#3(ld*5%Kg;c#U;qFB diff --git a/app/src/main/java/com/radiola/ui/stations/StationsScreen.kt b/app/src/main/java/com/radiola/ui/stations/StationsScreen.kt index 9bedf69..e4bc430 100644 --- a/app/src/main/java/com/radiola/ui/stations/StationsScreen.kt +++ b/app/src/main/java/com/radiola/ui/stations/StationsScreen.kt @@ -185,11 +185,10 @@ fun StationsScreen( tags = tags, selectedTag = selectedTag, onTagSelected = viewModel::onTagSelected, - contentPadding = PaddingValues(start = 66.dp, end = 16.dp), + contentPadding = PaddingValues(start = 96.dp, end = 16.dp), modifier = Modifier .fillMaxWidth() .align(Alignment.Center) - .fadingStartEdge(60.dp) ) // Кнопка-категории — поверх чипов, слева. CategoryPicker(