mirror of
https://github.com/KRTirtho/spotube.git
synced 2026-08-05 19:59:51 +00:00
refactor: update UI components in AppBottombar, AppFloatingPlayer, AppSidebar, and LibraryPlaylistsScreen for consistency and improved theming
This commit is contained in:
parent
49e969cc0f
commit
6ac934ad19
@ -1,96 +0,0 @@
|
|||||||
-------------------------------
|
|
||||||
UBUNTU FONT LICENCE Version 1.0
|
|
||||||
-------------------------------
|
|
||||||
|
|
||||||
PREAMBLE
|
|
||||||
This licence allows the licensed fonts to be used, studied, modified and
|
|
||||||
redistributed freely. The fonts, including any derivative works, can be
|
|
||||||
bundled, embedded, and redistributed provided the terms of this licence
|
|
||||||
are met. The fonts and derivatives, however, cannot be released under
|
|
||||||
any other licence. The requirement for fonts to remain under this
|
|
||||||
licence does not require any document created using the fonts or their
|
|
||||||
derivatives to be published under this licence, as long as the primary
|
|
||||||
purpose of the document is not to be a vehicle for the distribution of
|
|
||||||
the fonts.
|
|
||||||
|
|
||||||
DEFINITIONS
|
|
||||||
"Font Software" refers to the set of files released by the Copyright
|
|
||||||
Holder(s) under this licence and clearly marked as such. This may
|
|
||||||
include source files, build scripts and documentation.
|
|
||||||
|
|
||||||
"Original Version" refers to the collection of Font Software components
|
|
||||||
as received under this licence.
|
|
||||||
|
|
||||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
||||||
or substituting -- in part or in whole -- any of the components of the
|
|
||||||
Original Version, by changing formats or by porting the Font Software to
|
|
||||||
a new environment.
|
|
||||||
|
|
||||||
"Copyright Holder(s)" refers to all individuals and companies who have a
|
|
||||||
copyright ownership of the Font Software.
|
|
||||||
|
|
||||||
"Substantially Changed" refers to Modified Versions which can be easily
|
|
||||||
identified as dissimilar to the Font Software by users of the Font
|
|
||||||
Software comparing the Original Version with the Modified Version.
|
|
||||||
|
|
||||||
To "Propagate" a work means to do anything with it that, without
|
|
||||||
permission, would make you directly or secondarily liable for
|
|
||||||
infringement under applicable copyright law, except executing it on a
|
|
||||||
computer or modifying a private copy. Propagation includes copying,
|
|
||||||
distribution (with or without modification and with or without charging
|
|
||||||
a redistribution fee), making available to the public, and in some
|
|
||||||
countries other activities as well.
|
|
||||||
|
|
||||||
PERMISSION & CONDITIONS
|
|
||||||
This licence does not grant any rights under trademark law and all such
|
|
||||||
rights are reserved.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
copy of the Font Software, to propagate the Font Software, subject to
|
|
||||||
the below conditions:
|
|
||||||
|
|
||||||
1) Each copy of the Font Software must contain the above copyright
|
|
||||||
notice and this licence. These can be included either as stand-alone
|
|
||||||
text files, human-readable headers or in the appropriate machine-
|
|
||||||
readable metadata fields within text or binary files as long as those
|
|
||||||
fields can be easily viewed by the user.
|
|
||||||
|
|
||||||
2) The font name complies with the following:
|
|
||||||
(a) The Original Version must retain its name, unmodified.
|
|
||||||
(b) Modified Versions which are Substantially Changed must be renamed to
|
|
||||||
avoid use of the name of the Original Version or similar names entirely.
|
|
||||||
(c) Modified Versions which are not Substantially Changed must be
|
|
||||||
renamed to both (i) retain the name of the Original Version and (ii) add
|
|
||||||
additional naming elements to distinguish the Modified Version from the
|
|
||||||
Original Version. The name of such Modified Versions must be the name of
|
|
||||||
the Original Version, with "derivative X" where X represents the name of
|
|
||||||
the new work, appended to that name.
|
|
||||||
|
|
||||||
3) The name(s) of the Copyright Holder(s) and any contributor to the
|
|
||||||
Font Software shall not be used to promote, endorse or advertise any
|
|
||||||
Modified Version, except (i) as required by this licence, (ii) to
|
|
||||||
acknowledge the contribution(s) of the Copyright Holder(s) or (iii) with
|
|
||||||
their explicit written permission.
|
|
||||||
|
|
||||||
4) The Font Software, modified or unmodified, in part or in whole, must
|
|
||||||
be distributed entirely under this licence, and must not be distributed
|
|
||||||
under any other licence. The requirement for fonts to remain under this
|
|
||||||
licence does not affect any document created using the Font Software,
|
|
||||||
except any version of the Font Software extracted from a document
|
|
||||||
created using the Font Software may only be distributed under this
|
|
||||||
licence.
|
|
||||||
|
|
||||||
TERMINATION
|
|
||||||
This licence becomes null and void if any of the above conditions are
|
|
||||||
not met.
|
|
||||||
|
|
||||||
DISCLAIMER
|
|
||||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
|
|
||||||
COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
||||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER
|
|
||||||
DEALINGS IN THE FONT SOFTWARE.
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -33,7 +33,6 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
|
|||||||
import androidx.compose.foundation.lazy.grid.items
|
import androidx.compose.foundation.lazy.grid.items
|
||||||
import androidx.compose.foundation.lazy.grid.rememberLazyGridState
|
import androidx.compose.foundation.lazy.grid.rememberLazyGridState
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.IconButton
|
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.runtime.LaunchedEffect
|
import androidx.compose.runtime.LaunchedEffect
|
||||||
@ -46,6 +45,7 @@ import androidx.compose.ui.Alignment
|
|||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
|
import dev.krtirtho.spotube.core.ui.base.IconButton
|
||||||
import dev.krtirtho.spotube.core.ui.component.ErrorDisplay
|
import dev.krtirtho.spotube.core.ui.component.ErrorDisplay
|
||||||
import dev.krtirtho.spotube.core.ui.base.TextField
|
import dev.krtirtho.spotube.core.ui.base.TextField
|
||||||
import dev.krtirtho.spotube.core.ui.component.LikedTracksCard
|
import dev.krtirtho.spotube.core.ui.component.LikedTracksCard
|
||||||
|
|||||||
@ -91,7 +91,7 @@ fun AppBottombar(
|
|||||||
contentDescription = label,
|
contentDescription = label,
|
||||||
tint = if (selected) MaterialTheme.colorScheme.primary
|
tint = if (selected) MaterialTheme.colorScheme.primary
|
||||||
else MaterialTheme.colorScheme.onSurfaceVariant,
|
else MaterialTheme.colorScheme.onSurfaceVariant,
|
||||||
modifier = Modifier.size(20.dp),
|
modifier = Modifier.size(20.dp)
|
||||||
)
|
)
|
||||||
if (screen == Routes.Library) {
|
if (screen == Routes.Library) {
|
||||||
DownloadBadgeIndicator(
|
DownloadBadgeIndicator(
|
||||||
|
|||||||
@ -25,6 +25,7 @@ import androidx.compose.foundation.layout.Arrangement
|
|||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
import androidx.compose.foundation.layout.Row
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.Spacer
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.layout.fillMaxSize
|
||||||
import androidx.compose.foundation.layout.fillMaxWidth
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
import androidx.compose.foundation.layout.height
|
import androidx.compose.foundation.layout.height
|
||||||
@ -33,10 +34,8 @@ import androidx.compose.foundation.layout.size
|
|||||||
import androidx.compose.foundation.shape.CircleShape
|
import androidx.compose.foundation.shape.CircleShape
|
||||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||||
import androidx.compose.material3.Icon
|
import androidx.compose.material3.Icon
|
||||||
import androidx.compose.material3.IconButton
|
|
||||||
import androidx.compose.material3.LinearProgressIndicator
|
import androidx.compose.material3.LinearProgressIndicator
|
||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.OutlinedIconButton
|
|
||||||
import androidx.compose.material3.Surface
|
import androidx.compose.material3.Surface
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
@ -69,6 +68,9 @@ import org.koin.compose.koinInject
|
|||||||
import org.koin.compose.viewmodel.koinViewModel
|
import org.koin.compose.viewmodel.koinViewModel
|
||||||
import org.koin.core.parameter.parametersOf
|
import org.koin.core.parameter.parametersOf
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
|
import dev.krtirtho.spotube.core.ui.base.BaseUITheme
|
||||||
|
import dev.krtirtho.spotube.core.ui.base.IconButton
|
||||||
|
import dev.krtirtho.spotube.core.ui.base.LocalBaseUITheme
|
||||||
|
|
||||||
// The floating player on small screens that appears above the floating AppBottombar
|
// The floating player on small screens that appears above the floating AppBottombar
|
||||||
//
|
//
|
||||||
@ -185,15 +187,17 @@ fun AppFloatingPlayer(
|
|||||||
audioPlayerQueue = audioPlayerQueue,
|
audioPlayerQueue = audioPlayerQueue,
|
||||||
savedTracksViewModel = savedTracksViewModel,
|
savedTracksViewModel = savedTracksViewModel,
|
||||||
)
|
)
|
||||||
OutlinedIconButton(
|
Spacer(modifier = Modifier.size(8.dp))
|
||||||
|
IconButton(
|
||||||
onClick = ::onPlayPause,
|
onClick = ::onPlayPause,
|
||||||
enabled = playerUiState.queue.isNotEmpty()
|
enabled = playerUiState.queue.isNotEmpty(),
|
||||||
|
theme = LocalBaseUITheme.current.iconButtons.outline.copy(
|
||||||
|
shape = BaseUITheme.InteractionState.fromSingleValue(CircleShape)
|
||||||
|
)
|
||||||
) {
|
) {
|
||||||
Icon(
|
Icon(
|
||||||
if (playerUiState.isPlaying) Iconsax.IconsaxPause else Iconsax.IconsaxPlay,
|
if (playerUiState.isPlaying) Iconsax.IconsaxPause else Iconsax.IconsaxPlay,
|
||||||
contentDescription = if (playerUiState.isPlaying) "Pause" else "Play",
|
contentDescription = if (playerUiState.isPlaying) "Pause" else "Play",
|
||||||
modifier = Modifier.size(20.dp),
|
|
||||||
tint = MaterialTheme.colorScheme.inverseOnSurface,
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,7 +22,6 @@ import androidx.compose.animation.core.animateDpAsState
|
|||||||
import androidx.compose.animation.fadeIn
|
import androidx.compose.animation.fadeIn
|
||||||
import androidx.compose.animation.fadeOut
|
import androidx.compose.animation.fadeOut
|
||||||
import androidx.compose.foundation.background
|
import androidx.compose.foundation.background
|
||||||
import androidx.compose.foundation.clickable
|
|
||||||
import androidx.compose.foundation.layout.Arrangement
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
import androidx.compose.foundation.layout.Box
|
import androidx.compose.foundation.layout.Box
|
||||||
import androidx.compose.foundation.layout.Column
|
import androidx.compose.foundation.layout.Column
|
||||||
@ -40,18 +39,22 @@ import androidx.compose.material3.Icon
|
|||||||
import androidx.compose.material3.MaterialTheme
|
import androidx.compose.material3.MaterialTheme
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.collectAsState
|
||||||
import androidx.compose.runtime.getValue
|
import androidx.compose.runtime.getValue
|
||||||
import androidx.compose.runtime.mutableStateOf
|
import androidx.compose.runtime.mutableStateOf
|
||||||
import androidx.compose.runtime.setValue
|
|
||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
|
import androidx.compose.runtime.setValue
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.runtime.collectAsState
|
|
||||||
import androidx.compose.ui.graphics.vector.ImageVector
|
import androidx.compose.ui.graphics.vector.ImageVector
|
||||||
|
import androidx.compose.ui.text.font.Font
|
||||||
|
import androidx.compose.ui.text.font.FontFamily
|
||||||
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import dev.krtirtho.spotube.core.navigation.NavigationState
|
import dev.krtirtho.spotube.core.navigation.NavigationState
|
||||||
import dev.krtirtho.spotube.core.navigation.Navigator
|
import dev.krtirtho.spotube.core.navigation.Navigator
|
||||||
import dev.krtirtho.spotube.core.navigation.Routes
|
import dev.krtirtho.spotube.core.navigation.Routes
|
||||||
|
import dev.krtirtho.spotube.core.ui.base.GhostIconButton
|
||||||
import dev.krtirtho.spotube.core.ui.base.LocalBaseUITheme
|
import dev.krtirtho.spotube.core.ui.base.LocalBaseUITheme
|
||||||
import dev.krtirtho.spotube.core.ui.base.OutlineButton
|
import dev.krtirtho.spotube.core.ui.base.OutlineButton
|
||||||
import dev.krtirtho.spotube.core.ui.base.SecondaryButton
|
import dev.krtirtho.spotube.core.ui.base.SecondaryButton
|
||||||
@ -63,7 +66,10 @@ import dev.krtirtho.spotube.resources.iconsax.Iconsax
|
|||||||
import dev.krtirtho.spotube.resources.iconsax.IconsaxSidebarLeftBroken
|
import dev.krtirtho.spotube.resources.iconsax.IconsaxSidebarLeftBroken
|
||||||
import dev.krtirtho.spotube.resources.iconsax.IconsaxSidebarRightBroken
|
import dev.krtirtho.spotube.resources.iconsax.IconsaxSidebarRightBroken
|
||||||
import dev.krtirtho.spotube.tabs
|
import dev.krtirtho.spotube.tabs
|
||||||
|
import org.jetbrains.compose.resources.Font
|
||||||
import org.koin.compose.koinInject
|
import org.koin.compose.koinInject
|
||||||
|
import spotube.composeapp.generated.resources.Res
|
||||||
|
import spotube.composeapp.generated.resources.cookie_regular
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun AppSidebar(
|
fun AppSidebar(
|
||||||
@ -93,19 +99,26 @@ fun AppSidebar(
|
|||||||
AnimatedVisibility(visible = expanded, enter = fadeIn(), exit = fadeOut()) {
|
AnimatedVisibility(visible = expanded, enter = fadeIn(), exit = fadeOut()) {
|
||||||
Text(
|
Text(
|
||||||
text = "Spotube",
|
text = "Spotube",
|
||||||
style = MaterialTheme.typography.titleMedium,
|
style = MaterialTheme.typography.headlineLarge.copy(
|
||||||
|
fontFamily = FontFamily(
|
||||||
|
listOf(
|
||||||
|
Font(Res.font.cookie_regular, weight = FontWeight.Normal)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
color = MaterialTheme.colorScheme.onSurface
|
color = MaterialTheme.colorScheme.onSurface
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
GhostIconButton(
|
||||||
|
onClick = { expanded = !expanded }
|
||||||
|
) {
|
||||||
Icon(
|
Icon(
|
||||||
imageVector = if (expanded) Iconsax.IconsaxSidebarLeftBroken else Iconsax.IconsaxSidebarRightBroken,
|
imageVector = if (expanded) Iconsax.IconsaxSidebarLeftBroken else Iconsax.IconsaxSidebarRightBroken,
|
||||||
contentDescription = if (expanded) "Collapse sidebar" else "Expand sidebar",
|
contentDescription = if (expanded) "Collapse sidebar" else "Expand sidebar",
|
||||||
tint = MaterialTheme.colorScheme.onSurfaceVariant,
|
tint = MaterialTheme.colorScheme.onSurfaceVariant,
|
||||||
modifier = Modifier
|
|
||||||
.size(22.dp)
|
|
||||||
.clickable { expanded = !expanded }
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Spacer(modifier = Modifier.height(8.dp))
|
Spacer(modifier = Modifier.height(8.dp))
|
||||||
|
|
||||||
@ -189,7 +202,7 @@ fun SidebarItem(
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Spacer(modifier = Modifier.weight(if (expanded) 1f else 0f))
|
Spacer(modifier = if (expanded) Modifier.weight(1f) else Modifier)
|
||||||
}
|
}
|
||||||
|
|
||||||
val buttonModifier = Modifier
|
val buttonModifier = Modifier
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user