1+ package com.bera.collegesearch.components
2+
3+ import androidx.compose.animation.core.AnimationSpec
4+ import androidx.compose.animation.core.animateDpAsState
5+ import androidx.compose.animation.core.tween
6+ import androidx.compose.foundation.BorderStroke
7+ import androidx.compose.foundation.background
8+ import androidx.compose.foundation.border
9+ import androidx.compose.foundation.clickable
10+ import androidx.compose.foundation.layout.Box
11+ import androidx.compose.foundation.layout.Row
12+ import androidx.compose.foundation.layout.height
13+ import androidx.compose.foundation.layout.offset
14+ import androidx.compose.foundation.layout.padding
15+ import androidx.compose.foundation.layout.size
16+ import androidx.compose.foundation.layout.width
17+ import androidx.compose.foundation.shape.CircleShape
18+ import androidx.compose.material.icons.Icons
19+ import androidx.compose.material.icons.filled.LightMode
20+ import androidx.compose.material.icons.filled.Nightlight
21+ import androidx.compose.material3.Icon
22+ import androidx.compose.material3.MaterialTheme
23+ import androidx.compose.runtime.Composable
24+ import androidx.compose.runtime.getValue
25+ import androidx.compose.ui.Alignment
26+ import androidx.compose.ui.Modifier
27+ import androidx.compose.ui.draw.clip
28+ import androidx.compose.ui.graphics.Shape
29+ import androidx.compose.ui.unit.Dp
30+ import androidx.compose.ui.unit.dp
31+
32+ @Composable
33+ fun ThemeSwitcher (
34+ darkTheme : Boolean = false,
35+ size : Dp = 150.dp,
36+ iconSize : Dp = size / 3,
37+ padding : Dp = 10.dp,
38+ borderWidth : Dp = 1.dp,
39+ parentShape : Shape = CircleShape ,
40+ toggleShape : Shape = CircleShape ,
41+ animationSpec : AnimationSpec <Dp > = tween(durationMillis = 300),
42+ onClick : () -> Unit
43+ ) {
44+ val offset by animateDpAsState(
45+ targetValue = if (darkTheme) 0 .dp else size,
46+ animationSpec = animationSpec, label = " "
47+ )
48+
49+ Box (modifier = Modifier
50+ .width(size * 2 )
51+ .height(size)
52+ .clip(shape = parentShape)
53+ .clickable { onClick() }
54+ .background(MaterialTheme .colorScheme.secondaryContainer)
55+ ) {
56+ Box (
57+ modifier = Modifier
58+ .size(size)
59+ .offset(x = offset)
60+ .padding(all = padding)
61+ .clip(shape = toggleShape)
62+ .background(MaterialTheme .colorScheme.primary)
63+ ) {}
64+ Row (
65+ modifier = Modifier
66+ .border(
67+ border = BorderStroke (
68+ width = borderWidth,
69+ color = MaterialTheme .colorScheme.primary
70+ ),
71+ shape = parentShape
72+ )
73+ ) {
74+ Box (
75+ modifier = Modifier .size(size),
76+ contentAlignment = Alignment .Center
77+ ) {
78+ Icon (
79+ modifier = Modifier .size(iconSize),
80+ imageVector = Icons .Default .Nightlight ,
81+ contentDescription = " Theme Icon" ,
82+ tint = if (darkTheme) MaterialTheme .colorScheme.secondaryContainer
83+ else MaterialTheme .colorScheme.primary
84+ )
85+ }
86+ Box (
87+ modifier = Modifier .size(size),
88+ contentAlignment = Alignment .Center
89+ ) {
90+ Icon (
91+ modifier = Modifier .size(iconSize),
92+ imageVector = Icons .Default .LightMode ,
93+ contentDescription = " Theme Icon" ,
94+ tint = if (darkTheme) MaterialTheme .colorScheme.primary
95+ else MaterialTheme .colorScheme.secondaryContainer
96+ )
97+ }
98+ }
99+ }
100+ }
0 commit comments