From 6e13e7e4199c459fa74af25a56dd94e002982d34 Mon Sep 17 00:00:00 2001 From: Prateek batra Date: Fri, 22 May 2026 11:14:56 +0530 Subject: [PATCH 1/2] feat/pane-expansion : Add expansion anchors and enforce 250dp minimum width for adaptive layout --- .../cahier/features/home/CahierHomeScreen.kt | 75 +++++++++++++++--- .../features/home/HomeScreenComponents.kt | 3 +- screenshots/reference_screenshot_navrail.png | Bin 39927 -> 40389 bytes 3 files changed, 68 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/example/cahier/features/home/CahierHomeScreen.kt b/app/src/main/java/com/example/cahier/features/home/CahierHomeScreen.kt index 6684754f..0bb7224c 100644 --- a/app/src/main/java/com/example/cahier/features/home/CahierHomeScreen.kt +++ b/app/src/main/java/com/example/cahier/features/home/CahierHomeScreen.kt @@ -34,6 +34,7 @@ import androidx.compose.material3.VerticalDragHandle import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffold import androidx.compose.material3.adaptive.layout.ListDetailPaneScaffoldRole +import androidx.compose.material3.adaptive.layout.PaneExpansionAnchor import androidx.compose.material3.adaptive.layout.PaneExpansionState import androidx.compose.material3.adaptive.layout.rememberPaneExpansionState import androidx.compose.material3.adaptive.navigation.ThreePaneScaffoldNavigator @@ -52,10 +53,15 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clipToBounds +import androidx.compose.ui.layout.layout import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp +import androidx.compose.ui.zIndex import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.ink.strokes.Stroke import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -70,6 +76,31 @@ import com.example.cahier.features.home.viewmodel.HomeScreenViewModel import com.example.cahier.features.home.viewmodel.NoteListUiState import kotlinx.coroutines.launch +private val MinPaneWidth = 250.dp + + +// The layout modifier implements a minimum width for the pane while +// allowing it to report its original width to the scaffold, preventing +// content from being overly compressed during resizing. +private fun Modifier.minimumWidthLayout(minWidth: Dp): Modifier = this + .clipToBounds() + .layout { measurable, constraints -> + if (constraints.maxWidth == 0) { + layout(0, 0) {} + } else { + val fixedWidth = minWidth.roundToPx() + val placeable = measurable.measure( + constraints.copy( + minWidth = fixedWidth, + maxWidth = maxOf(fixedWidth, constraints.maxWidth) + ) + ) + val reportedWidth = constraints.maxWidth + layout(reportedWidth, placeable.height) { + placeable.placeRelative(0, 0) + } + } + } object HomeDestination : NavigationDestination { override val route = "home" @@ -108,7 +139,7 @@ fun HomePane( modifier: Modifier = Modifier, forceCompact: Boolean? = null, homeScreenViewModel: HomeScreenViewModel = hiltViewModel(), - ) { +) { var currentDestination by rememberSaveable { mutableStateOf(AppDestinations.Home) } val navigator = rememberListDetailPaneScaffoldNavigator() val noteList by homeScreenViewModel.noteList.collectAsStateWithLifecycle() @@ -116,7 +147,22 @@ fun HomePane( val coroutineScope = rememberCoroutineScope() val activity = LocalActivity.current val windowSizeClass = activity?.let { calculateWindowSizeClass(it) } - val paneExpansionState = rememberPaneExpansionState() + val paneExpansionState = rememberPaneExpansionState( + keyProvider = navigator.scaffoldValue, + anchors = listOf( + // 1. Fully collapsed state (0% screen fraction) + PaneExpansionAnchor.Proportion(proportion = 0f), + + // 2. The 25 % minimum width snapping boundary anchor + PaneExpansionAnchor.Proportion(proportion = 0.25f), + + // 3. Middle split state (50% screen fraction) + PaneExpansionAnchor.Proportion(proportion = 0.5f), + + // 4. Fully expanded list state (100% screen fraction, detail collapsed) + PaneExpansionAnchor.Proportion(proportion = 1f) + ) + ) var hasSetInitialProportion by remember { mutableStateOf(false) } @@ -153,7 +199,7 @@ fun HomePane( LaunchedEffect(isCompact, hasSetInitialProportion) { if (!isCompact && !hasSetInitialProportion) { - paneExpansionState.setFirstPaneProportion(0.3f) + paneExpansionState.setFirstPaneProportion(0.5f) hasSetInitialProportion = true } } @@ -236,6 +282,7 @@ private fun CahierNavigationSuite( when (currentDestination) { AppDestinations.Home -> { ListDetailPaneScaffold( + modifier = Modifier.fillMaxSize(), directive = navigator.scaffoldDirective, value = navigator.scaffoldValue, paneExpansionState = paneExpansionState, @@ -243,16 +290,21 @@ private fun CahierNavigationSuite( val interactionSource = remember { MutableInteractionSource() } VerticalDragHandle( modifier = - Modifier.paneExpansionDraggable( - state, - LocalMinimumInteractiveComponentSize - .current, - interactionSource, - ), + Modifier + .paneExpansionDraggable( + state, + LocalMinimumInteractiveComponentSize + .current, + interactionSource, + ) + .zIndex(2f), // Specify z-index to ensure the drag handle is drawn on top of the panes ) }, listPane = { ListPaneContent( + modifier = Modifier + .fillMaxSize() + .minimumWidthLayout(MinPaneWidth), noteList = noteList.noteList, isCompact = isCompact, selectedNoteId = if (isCompact) null @@ -294,6 +346,11 @@ private fun CahierNavigationSuite( if (!isCompact) { selectedNoteUIState.note.let { note -> DetailPaneContent( + modifier = Modifier + .fillMaxSize() + // Specify z-index to ensure the detail pane content is correctly layered + .zIndex(1f) + .minimumWidthLayout(MinPaneWidth), note = note, strokes = selectedNoteUIState.strokes, onClickToEdit = { diff --git a/app/src/main/java/com/example/cahier/features/home/HomeScreenComponents.kt b/app/src/main/java/com/example/cahier/features/home/HomeScreenComponents.kt index a71ab206..1c109d77 100644 --- a/app/src/main/java/com/example/cahier/features/home/HomeScreenComponents.kt +++ b/app/src/main/java/com/example/cahier/features/home/HomeScreenComponents.kt @@ -390,7 +390,8 @@ fun NoteDetail( Surface( modifier = modifier.fillMaxSize(), shape = RoundedCornerShape(12.dp), - tonalElevation = 6.dp + tonalElevation = 6.dp, + shadowElevation = 8.dp ) { Spacer(modifier = Modifier.height(16.dp)) when (note.type) { diff --git a/screenshots/reference_screenshot_navrail.png b/screenshots/reference_screenshot_navrail.png index a6c3d5a93bd4101c3d6d09b180cc279198ca93d2..fc5ed6714ffc5a4e1cc1c51da722723dc4f9d6b8 100644 GIT binary patch literal 40389 zcmeIb2T)UK_%D2dpeQQ37C@v}QK>FUk!nE}QLv(j5EPZA21E!oiEBXx#1$1;nyVrz zRWXE`1QAe?u!;~MkOU$kC5@5<(!O&7tP8vUZ|2T?cjkU`amGn<&Rd@M_xzsrp2CfT zPWFoytXcp7z#@lV_8bNP=<8ft#kt@IHdmbp02shw&(5Ra9)q0&7am*^Y}uNcocb(cs|7kbx*@V9D|5_LJ5D2FGy*iNi&F97$@Yf|T67yc9YKXh>W| z$Qab{5fQ(Q!)~e1^dhW&0s~J72tlaG&jh|krkMccr|AxvfP2tASYEj(&S5Q*3qPDWA{0cbAZq&Q!|Ztm#}k47JaAf+dM7kwQ!kc%D@HKQG;CQcTxyN9_nVYz@U zxxNr=M%1E=^)+z&+fo^WeQh?JA+spn;fdCN_4f+ctZ{fP+OUANs1BOsV#KJ389elL zq{s;|e`4N!;-PWA2M7Q{51RI2Q@uALQ6 zmQA#FVojUwU53^KxXELn4av+q!33J;V3Ef_#xNUFJ!g}N*)(c4ft*d9(rcKtvSE+n2Dgf^Ge5V{VF%-5dTH+f+mCxVwuEAi*4 z4Iq6vqB04@45j{cKl-1mjUfmWWyTSMVhKU;~BO@NpAy($ZHnrFh1pMFxxO_+X zT6w4mCTnV6NwXE;e2BuG->I(Ec+U~{w7PT53c7_9XwjV-gf2&PBL_OCs#vj*&Bd&a zCO55)j82(2o-vdAPs#JP02MD|%-qY263HhLf)RCAB%$p7>0JAX`!Gj_Y~?Ww?rY7l zD3s+-s?Zeo*Gx{aSqsp#8sZ;F6j>n{8ByzvptHHhCp#Xt20BpQ=#|;Q)?w7n%=CHC z*&x)^%%5R&Y{F&NyR~Dhyl?kH2m)z|le=zN{y=z0Z_vueFEtr@L($MVOi}VA`ga!s z`~qr*f%}8lUvuls;(|9uI6*ClZByXvn~OUir+LAC;5d00QN z^FCG~X|MgnKpBf18GmrY>CxyFjQF7rXbMcx6w&U^2b7Tml5tvi1)Gs57U}VXn=-|1 zI!}|~k)b^E74gQayzlkOfX(%of_)=UQS3TQmezX3XhnRl)*KUl9}%UKYX_9k-JjY9 z7*>o?QN@B<*Pbz%XgPo5Iv>Cpuo`z2ZBS3-#z3H5jj0xFCq|*W5TadlZ)dFuhmcCX~#0OAZZIDr+9xuW?rsmi_g+x`kMQ=br}z8qV0FmlHfaT&Kb5UAQT6W zob*7Os;>Us6Yu?gaeik;`a0PVC;u_TxJ!DS)LQxxmu+u7wkA;|e*4%yQP?oh6fO<7 z`8}>Brtx(`YNMe*L;M@v-ts5G za|^VWC@;G4bG&hVh|J(zrfkJE8VE13IFM}caZb?&wP0HKenf3#wW0M`R-e7rx>ohX z`I2W3IYo(9!OQ1=i@JX{t<9|5(isxnGjxg$HS;j#$;#frZFl19hO9+@#aa#_?GgvA z#zoE_wdPxD8duzGv~e^=F81!75B1D-npD^;0l?`O;?AFLyL0w|X*_&Rbi`G{U#6(j z9OFz$X&X&#sC~m2oz&J7Av2Pkq)9u_vj!@LJo11b%VPd$BKIAQ5#P8vaT$q_OxAz@ zpYl=IgN<)qZ7^qRvn!-jpZKEs;Rzh3*a_lL5_$*-FBq0YWp5=JG|H^xMEWGg=eRI> zt$I{Zp}zyk;++MXfLz5G9I}LHglT?1ai6xwN-e;n%t*QZ{@04j75_bs9T2{+SL16s zpJuTLrVaK6(x%iXn<7;c7XAMsLW`Ra62WQJ*PhV2_k8r1-me3WKmVt+q;ff8=7{;& z_?`b;Y&aMOTu&6Q*I6_)RL1x!wCN8S8r`7go%|mvYOk%*({sC%G&drmGk8d>H42S- ziemX7T?bl0;f_fT*LTk$rdq^KN~nSC3@)ItLmiF&Q@$?NHpunX-|v31lNwCc;E#(v zaDj}Ewg08<)y1^7Ooj7~!JoC+B?Gsj#Ha!{Tso5P-79;LB-dri1FQuq@S#RZAE%EB zvh)1ETUwTcMXh|GU*mAOf{|~*8WmOsb}r7R{fA`+wU(89tOGK)y|ZAIF+2#gffk>C zJAo8{bD5850KJHr&uwH!Xk8_WK+bEzE=rU_DG6ry_LLikd|S2;BcamOzc>)oz^!st z37O3=3sv*pM%vP-4550Wa>~5-17?Gu<5ch-xWAL?klx&zOEG(FX$m!>`+t=^abRnh zB}Y6x+;C33z;kYdPN+*}krTszr~+z(DVj2yyGj6pwVL#%DD;Ci`w6K(1YE^|4ComH zASi6gn89#RINBo7vvx~fIONoyYwhh`oAT9s!k15Zjm>HRb)3$-*!RYAmzPzoYrOIM z5SfXR{?^3L!0P+FO>~mwxNL%!byHzL9au~@S$ux$s$Rdeof**c5v_r1Pp z2}~Tn1`W+n2uyKw&QgFnS_LxN#S2^eA0b}>Q=P!9?)!W-qNKJjJ}T0yHzG&$!&@^4*3Yt?nyD;Elv2goye(m(7(9l^uIG>5}C!kkEkc&}Fo+pidVr$Wz|# zQ9s~3MdZngn7QwYXo4bF0g@c9UtlxkkteT!7OrLdPEeC{{%6Nu_M$icM-MeoR)ysC z6c<`x^s3S7zVRM)`#{!Ug9m}!pewY&hgBHDWf{ynx?#^~_SA*c*NXwTwCZZ#d$<6* zu2I5;lfVwcjiTnn0&$hDOf;xF|o%D$FzZO$DOTsyGA*cx-W)FX`dqS%u)0g{6wOE_Dq-I z&EW$zM92?AD?}Z+Vj;e(^uoB#+3MMAYDR(r@#s6h0{t{3qOl#1w0>b=$-n7zs30aC z;f916i3w56gyXo2Eq6vj_~QZYS#QG|I4|xQB3oF3&PN&8qvL)B4Z;Sks1|6|m~|>j z=tF6UEpuhhvfZ_V73O%F9(@UfH}r&9_(f48vw7zA$&%6{$=l2frt5$KP|HVIbL_nJ z-3?dMQmM@z=<_vkR(_@*%kqkfqlDCUYK}qapV%;}n(>PQYl(M&1~iXZ^h=IP&Dhg3 z6YI^k}11>9>cd=Fs#&z5WB1%ttN5aisD`JT-0ztKwX6WBZ>AFb+Gm z8|5{WeE*}py-C*v$;*!(8Oy+CW`;TpjJ<6#@Q>NM&Fe!hi5e4S^P*Dyf10kUQ)Gi| zZYl4ihIR%b53!q+tp_YKBiasNW8PCNsLYQaD^aM%_D`FDr_03cjj?CgB)%_OR;n(B z>xt}w@y}IdPxKvJsX#>R3$i~6h=v{)>}XUz`q{Bq8sqK#t=L>CvgOuZn302yG^^KJ z>VFb@k-IMTHCsamfK0>I=ItB!^4`>&mkc2(&m98%PXPO$!p(|CMe)HZ$1sVH3%8 z#T+>F^TQ)Ra6m2J2WAw(Xx4Aup4`y4xh>rsR`uR?m%CYfV?Uv90L0_kv)N*&g^5k496&@fJl3MPSXQDvV#pRq&<(Wq6bWcZ-5^;m%W*v9#U)QYuwjPW2J-|<`p!&2G92Qx0DY1HOc}A+hvCLB3^UJ zi~jRSyE^*ATi?Dru`goSgX~=8!A^MRcFEpi1NqN$`QMYd&b1J>7G~#?ieAqW_ z#HFM8b1HRW!lGrREvIv)+ixYlnRAzSZS6gAclpYXgmM$plHHIS~grGxZRDC7n1Nzyn^%0G2CdYm1dybl$;(Sba^c(C($l=acRw?ubJ7&$|S`=si5 zlJ}SMkV-IJD`rGAj!{;Uq`NOF(J<yE6hY$2rUPT&ceqK=( zFi)aM%h)9gxc^>O?B*4`Gu*&0T(1|$bm7k$_V%5m1$*hV@Q~Dyj=!kGq9ZxVA}c&< zrMHZ0T{Dvvj*&R$EjdaYNYM}JZT?oyuNk}SioFmTfOgxl*@&dmXAwXx#G1(HurTvq zplZ7}TbvsjIXT}jgQ2M$mXfyF&7p^GUh}DXyt9i@XN^ z(0`_{KtFFCgIX`z<0pLVlP?yr6UfePv#KBuXvg)}jsih?@9~?8# zzM+jBpEoEspP!qw?{X*m1a|0Z`~Evr4T8+F4qp4wXWeZlMrv49Jct$K?fk4*=DkMw zFzde7PgvxW%xtF&kJJPC6&KG3XhI879s41*a?{gAZZEjm`*ZJc?p#Icy=cH?4MZ|T zRk~CctFh1|mqb zFFafpQtO3?TpZRg-v5MA`-PW{taF9t_Wb%I@weO$vD~F1O7gtQF)CnA6#uwmvgOeO zDVCL?zVI!|PyH@8y+_4{B(S{}5oA2MP58&6jX;yk=c zi8ej)Efx@7jeV#-`6|Jfk2PNALZ=P$*PyHE=yJ|p4b!J5!@&sjJ~}{&eaiAl6VS9j z(zzq^3DU5#_s{+(1vWXtG5wIhf=byM{)v9#!7{4pN-n72-@pigB(A0B2bAZu6@6RH zvv9Ty8-dYeUE-sEB*KgI%-%V~Ty_wSkLF+02%2!S|0Kh;+JuyYx;KDy871`)jpYhDyw8JED@NK*79Z8rA|D>yLPk;U{>Xnuo(R1974?P`- z@G3=o_}Yi%?@zaU?7h)rMVbUHC9|C}KV`V$&c`sVAhp_>|G-zMeQy+sRlJITPRD_$ z4>8XNRlGN*2csH4LMC~>9ileYQ__j;m34Lf(KXfqS!!tB5egm0Z2FsKK@Z;kM)T~J zh4^WQpZKA@-m^WQf&{0?%z4R=J%hzbo0GE1H&OGFKKwQjwr!XHT}_$oU)k~Unaha9 zgKg@3nQHg^fEbz`Ncq82SxNHl$F7Jrbl&zKb-b*=`T0k!CUeWTf0W9$PzTKZAF|0Z z(6c`_9AtHj_RMl;Rs;yQ{}F}y>v{kfT;Y}6{-?em({c_J1U$EnkT$h{noiX&enq5V%ZjCkoJ_C*S!Erf|=^g@z0ZwNx6tRo`9=-tKhtQXbg6^!5wQw zo9Ar#>eaA2yDVVm#QqK4c8aKb_rnUy_aKdQG%d=;h2ss_$^#-^t=o$@!*R5JCR_NZ z*!pftU9wf%*sWnS^7y~H?|}u8i>;c`;_q*rZUlCv$K^0n!;XSw{KHTM<32nVX<) z{Aa;&xlA=Q@p?Q5OAvOYnM|M z>zg_vFHa}Av82p+_{&XizX5yS!V9#6-VmU`;^UJWeD&8i0n~^AtsM&GJ<66YZq6Ce zBYnOj&zerI6nCNh1{}8ZT189O<>f>|=~Vjmt_ojXZt4rNWE|J-U)F+bIYvJI_?A}F z*q~p2N&cu_y0zJtl(P)o0$j!hL(9siy&)1&Yg0Owk3^pk_guv`Hzzl|Kt+B~Yrewu zJ|5yt>(~L?iXs%}p(!on8XF}eY5gO?-dJli6lb?LinE5PNF@F^B{?^O*W>%GhwQSf zHr+klWPGImO{Q}WWWterDYc+MW>3|IlMdtDp5?$1p91&7)C-cD=4>sLORCyO3kzBf z$!b_cih4AU6;a|X`I3ZoN%e7)CNJ8Z;gAt==2-7oOq}N6SXz0Y+h4Bby#6*Uf4xrT zMPICU9krc3(p_YD+(uHx#g1u-g~82@jirUd!=$`&-zcsca`8o;<*1;j`LS}|uj$KMJ)}*a?cEyNb@~^b+oNGTyBZP@@@nR(=#}cuvuM>&H<{7LC^AnrbZk zmVv#5;~!%gDbI}@v~P8)QUx#Md;IJz0wsD-!stE`MiKwUhO z{iG#~cO~;USVk2v9SkZ3A1>eTx&z-|_6%#%f8}NKaV=?)cK}58^Vd!SmVfb`H`Kij z>;K*qm4VFsRnYPj{e{<1)<1q(LNcXYbn_0V8MQKJG)l^rud;qZ+!(ob!SR>C`*)qozG}w z<<@|KeXcHl(YdEI1>)H^C1|nJbHx&Nx)>W13uY{5;BNe3$T@n8E*|!#)nXA}sIu#? z3p1zi8dSo(kMM^7wK=PDsJpB^@(xJIlnv;L0&gadM*ZaK2JH?|FJ`ffbzPb>bdq#p z+*rb|VrRdB-6`g)6o@oxxT80%ny=4xb*#ZFky2Y+*#-bgB+*IlZ8CUpNLX=EjEIV9 z{?Lq-lW#M1qxD9%A8v?a`+ z>MFE`7)<2cnA~DlTM9zk20D)(JnIbQ(vw|o9jTVWufur*7Z}l$tu~f_MzR_WzwkQC zzh7$iw^T#OCf^HF{4tIRT=G;ssLJltv+ z3>4oA&x5=CoSZ~yTO^!MTbDk!AhP$pFzsclSveD{qHLqtN)~Sj(KeVro(XCKmd1Gd{@Av zWsw1)>_=J6&z9AOIZ53lbOyE(QkSjfRLEEk*gw0-WPhwLU@jLg{t99}aS=&Y?%t05 zQ2{LtYzRR=N5wP`_J8@5eY{S@x#BzMTzi~+D%gGWL)?IGk!)a(9|O-Os&6<yZH3#!3^u>Qr@4u{C?l|a|O8a zvYbqJtL>fV_*7@B%=GAdp4~Y@PCjbvJe1krK00xq@3YB!GiQI#;sI44vwWENiv+Xw zFl!I9_Au)YX8qx;KLo?#Y`!#`FUsyro%IK^{$SQ0%=*LG`e3#`n5_@~KdTRj17)RB z0`ptNGdF^jwepD#!4uC|O}=biXNTq+v42?6lhk1r&-i-dJeQr*=tp$du|u2kP%Vr3 zfp@>4g_WutYSE3xMfW#MJox=(;+@N$YeWNGlqHe_h}Q#2)nP`Z)Wx+m9pepR9N#-= z#PSLz_Ybp)2MH(M;r#Gfs!+LvSzwQDs-|?&1d$Xijn`wp5*mcFoxGiph^0dHR5a}4ZZF5 zwBh|iq8s50b#yorK@f#x9>|kklemo|`U!c`T8Wzw!6H=JT$bqZ>iB1f zj9O%aN9uZ_?Kod0ZZJEHrNcCJ*~01=gm4NxvCTuoL*rN>)AHOzDEhOCzIOK;aA#uW6BW$5*c1u33;+G0+#*MQCw`CaDRz zV!w3Sg4TyEmuMtP^PLy7Yti6+F+3G5A#Yb&Z4x(`AWZLCIPR*q2NSYX+goLNx6qR! z(@v@%e2jv2zy3M=)wtSqAmUW_#3R8Ie>M|y#VJ8r%xiaSB(zf{PaE~+eJowY3q8hJ zIcse-Ezz<4Ky z!+}k5Uk^=Z^9{YX=wTs3I)M8)N|B<3$MI!L{(N}~Ef|1nk-UqIwMZ}QQ>}nO?|*l7 zcq=Fv;L?JGw6Bq=Oj0aGnt|r^TouGObKZp5l*TC0e?^-Wg)2Q&ydAq@Itojw30*uw zTRKJh6bH_2TA$FO!!)Jx5|z5ta=MUI@qTs0{#Y`=KW@S=ii1HTOouJuuEFQoL=tcAASjaeAww zg{E{gD3>N7?|y|6(u|$Oo@-3Jwp$6u(CUvGx{eW(26hAChvikJTH4b&>T)!`>Q*;F zy$FsB=XJaQyb@*EStrTM?m_J9@(RY)-Ho+y`$Mfu0O}2Cq*1X=S%{EU`y_@LC&e#GdD)KV)ksx6Iy(@s!QM8+MawdU zgYxgxr|UEK0Xa@urg@W@sC+HR|CM>bjmo^wCA|qne1EuO3uPZxUQ~eK6SmV!Pdi$iOuGhcoszFqK z-kZuW0S$2YlZ3N{jv|RaI^P5sQl%M~e0>XWNKCZV!huUClxuil=c}1$3vw8x*IN8$ z*NMH0!6zUL7Z(I&1RkLHBf$reIxNhAic&+luc+xnyJ@ynVi6{!bpnM12{HEtm?+>8>2~z9L z%RF5Q^D*dzp#^D0v5l+!(u4zPLcjDxIig?{J+r|MlcqOgDCL{dTQmvMs8myq*jXHL zE+>Yb2S2G;|L)JsPA>RXoOUgbInm33GKJes(;;;X3z1ggq@AthNFiLgdVB!QFZK?o zFjsr?vZ3CMnGR_hToEcvyqzQtB|%Gy2IZ)(6e3{pxIMMfb-vS0=>Fha0U~UWN9gOi z0i*M<>BYejA#1j*OHPs_qP`&!u(b5mu>b4^7~v(z=t_{S?fyvWQ@5yq*IPB;yi9PE zBMuhl2jV(M52gA$#||?KB3Rz6?Zk?u(-rblr;4-zVeerNqjOfZGA1x(DPXKtyAfW$ zTyppK`j≷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 SlZl3AbFg#TlfTRJxBmw{Rkn8k literal 39927 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 From ae027297f40048a9af2b81b09bb91edfb14ddaf5 Mon Sep 17 00:00:00 2001 From: Prateek batra Date: Thu, 18 Jun 2026 12:21:24 +0530 Subject: [PATCH 2/2] feat/pane-expansion : Use `rememberSaveable` for initial proportion state --- .../java/com/example/cahier/features/home/CahierHomeScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/example/cahier/features/home/CahierHomeScreen.kt b/app/src/main/java/com/example/cahier/features/home/CahierHomeScreen.kt index 0bb7224c..190f6077 100644 --- a/app/src/main/java/com/example/cahier/features/home/CahierHomeScreen.kt +++ b/app/src/main/java/com/example/cahier/features/home/CahierHomeScreen.kt @@ -163,7 +163,7 @@ fun HomePane( PaneExpansionAnchor.Proportion(proportion = 1f) ) ) - var hasSetInitialProportion by remember { + var hasSetInitialProportion by rememberSaveable { mutableStateOf(false) } val isCompact = forceCompact