diff --git a/app/src/main/assets/steam-startup/droiddeck-startup.webm b/app/src/main/assets/steam-startup/droiddeck-startup.webm index 0c69191f9..ee181257b 100644 Binary files a/app/src/main/assets/steam-startup/droiddeck-startup.webm and b/app/src/main/assets/steam-startup/droiddeck-startup.webm differ diff --git a/app/src/main/java/com/droiddeck/launcher/ui/FrontEndScreen.kt b/app/src/main/java/com/droiddeck/launcher/ui/FrontEndScreen.kt index b5d9bb716..7ec03096b 100644 --- a/app/src/main/java/com/droiddeck/launcher/ui/FrontEndScreen.kt +++ b/app/src/main/java/com/droiddeck/launcher/ui/FrontEndScreen.kt @@ -71,6 +71,7 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.foundation.layout.width +import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape @@ -478,7 +479,7 @@ private fun FrontEndScreenBody(s: FrontEndState, a: FrontEndActions, page: (@Com } Box(modifier = Modifier.fillMaxSize()) { Column(modifier = Modifier.fillMaxSize()) { - LauncherTopBar(frontFocus.menuToggle) { navOpen = true } + LauncherTopBar(frontFocus.menuToggle, s.buildLabel, a.onCheckLatestBuild) { navOpen = true } content(Modifier.weight(1f).fillMaxWidth()) } AnimatedVisibility( @@ -569,7 +570,12 @@ private fun FrontEndScreenBody(s: FrontEndState, a: FrontEndActions, page: (@Com @Composable -private fun LauncherTopBar(menuRequester: FocusRequester, onMenu: () -> Unit) { +private fun LauncherTopBar( + menuRequester: FocusRequester, + buildLabel: String, + onCheckLatestBuild: () -> Unit, + onMenu: () -> Unit, +) { val colors = MaterialTheme.colorScheme val palette = LocalPalette.current var menuFocused by remember { mutableStateOf(false) } @@ -588,6 +594,12 @@ private fun LauncherTopBar(menuRequester: FocusRequester, onMenu: () -> Unit) { Image(painterResource(R.drawable.logo), null, modifier = Modifier.size(24.dp)) Spacer(Modifier.width(8.dp)) Text("DroidDeck", fontSize = 14.sp, fontWeight = FontWeight.SemiBold, color = colors.onBackground) + Spacer(Modifier.weight(1f)) + BuildStatus( + label = buildLabel, + onCheckLatest = onCheckLatestBuild, + modifier = Modifier.widthIn(max = 220.dp).padding(start = 12.dp, end = 8.dp), + ) } } @@ -682,11 +694,6 @@ private fun Rail( .padding(horizontal = 10.dp, vertical = 8.dp), ) } - BuildStatus( - label = s.buildLabel, - onCheckLatest = a.onCheckLatestBuild, - modifier = Modifier.align(Alignment.Start).padding(start = 8.dp, top = 4.dp, bottom = 2.dp), - ) } } @@ -840,11 +847,11 @@ private fun BuildStatus(label: String, onCheckLatest: () -> Unit, modifier: Modi horizontalArrangement = Arrangement.spacedBy(5.dp), modifier = Modifier.fillMaxWidth(), ) { - Text(branch, modifier = Modifier.weight(1f), fontSize = 9.sp, fontFamily = FontFamily.Monospace, fontWeight = FontWeight.Medium, color = if (hot) colors.onSurfaceVariant else colors.onSurfaceVariant.copy(alpha = 0.82f), maxLines = 1, overflow = TextOverflow.Ellipsis) - if (commit.isNotEmpty()) Text("@$commit", fontSize = 8.sp, fontFamily = FontFamily.Monospace, fontWeight = FontWeight.Medium, color = colors.onSurfaceVariant.copy(alpha = 0.82f), maxLines = 1) + Text(branch, modifier = Modifier.weight(1f), fontSize = 10.sp, fontFamily = FontFamily.Monospace, fontWeight = FontWeight.Medium, color = if (hot) colors.onSurfaceVariant else colors.onSurfaceVariant.copy(alpha = 0.82f), maxLines = 1, overflow = TextOverflow.Ellipsis) + if (commit.isNotEmpty()) Text("@$commit", fontSize = 9.sp, fontFamily = FontFamily.Monospace, fontWeight = FontWeight.Medium, color = colors.onSurfaceVariant.copy(alpha = 0.82f), maxLines = 1) Icon(Icons.Filled.Refresh, contentDescription = null, tint = if (hot) pal.signal else colors.onSurfaceVariant.copy(alpha = 0.82f), modifier = Modifier.size(12.dp)) } - if (context.isNotEmpty()) Text(context, fontSize = 8.sp, fontFamily = FontFamily.Monospace, fontWeight = FontWeight.Medium, color = colors.onSurfaceVariant.copy(alpha = 0.82f), maxLines = 1) + if (context.isNotEmpty()) Text(context, fontSize = 9.sp, fontFamily = FontFamily.Monospace, fontWeight = FontWeight.Medium, color = colors.onSurfaceVariant.copy(alpha = 0.82f), maxLines = 1, overflow = TextOverflow.Ellipsis) } } diff --git a/app/src/main/java/com/droiddeck/launcher/ui/SessionOverlay.kt b/app/src/main/java/com/droiddeck/launcher/ui/SessionOverlay.kt index 7a4169e70..36430efc6 100644 --- a/app/src/main/java/com/droiddeck/launcher/ui/SessionOverlay.kt +++ b/app/src/main/java/com/droiddeck/launcher/ui/SessionOverlay.kt @@ -351,10 +351,11 @@ fun SessionDrawer(open: Boolean, page: Int, controllerActive: Boolean, onPageCha a.onSteamMenu.invoke() }, shape = RoundedCornerShape(12.dp), + contentPadding = PaddingValues(horizontal = 8.dp, vertical = 0.dp), border = BorderStroke(if (steamHot) 2.dp else 1.dp, if (steamHot) pal.signal else colors.outline), colors = ButtonDefaults.outlinedButtonColors(containerColor = if (steamHot) pal.signal.copy(alpha = 0.16f) else Color.Transparent), ) { - Text("STEAM", fontSize = 13.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 0.5.sp) + Text("STEAM", fontSize = 13.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 0.5.sp, maxLines = 1) } OutlinedButton( onClick = { @@ -369,10 +370,11 @@ fun SessionDrawer(open: Boolean, page: Int, controllerActive: Boolean, onPageCha a.onQam.invoke() }, shape = RoundedCornerShape(12.dp), + contentPadding = PaddingValues(horizontal = 8.dp, vertical = 0.dp), border = BorderStroke(if (qamHot) 2.dp else 1.dp, if (qamHot) pal.signal else colors.outline), colors = ButtonDefaults.outlinedButtonColors(containerColor = if (qamHot) pal.signal.copy(alpha = 0.16f) else Color.Transparent), ) { - Text("QAM", fontSize = 13.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 0.5.sp) + Text("QAM", fontSize = 13.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 0.5.sp, maxLines = 1) } // Big Picture's own "Switch to Desktop" waits on SteamOS Manager for ever // here; this does the switch without the client. @@ -388,10 +390,11 @@ fun SessionDrawer(open: Boolean, page: Int, controllerActive: Boolean, onPageCha a.onSwitchToDesktop.invoke() }, shape = RoundedCornerShape(12.dp), + contentPadding = PaddingValues(horizontal = 8.dp, vertical = 0.dp), border = BorderStroke(if (deskHot) 2.dp else 1.dp, if (deskHot) pal.signal else colors.outline), colors = ButtonDefaults.outlinedButtonColors(containerColor = if (deskHot) pal.signal.copy(alpha = 0.16f) else Color.Transparent), ) { - Text("DESKTOP", fontSize = 13.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 0.5.sp) + Text("DESKTOP", fontSize = 13.sp, fontWeight = FontWeight.SemiBold, letterSpacing = 0.5.sp, maxLines = 1) } } } @@ -767,4 +770,3 @@ private const val DRAWER_TAB_SPACING_DP = 64f private const val DRAWER_TAB_LEAN_DP = 12f private const val DRAWER_TAB_SIDE_SCALE = 0.5f private const val DRAWER_TAB_SIDE_ALPHA = 0.7f - diff --git a/artwork/boot-animation-source/README.md b/artwork/boot-animation-source/README.md index 72f7d0c1b..e1915c39a 100644 --- a/artwork/boot-animation-source/README.md +++ b/artwork/boot-animation-source/README.md @@ -1,7 +1,7 @@ # DroidDeck boot animation This source accompanies the single Steam startup movie bundled by the app: -`app/src/main/assets/steam-startup/droiddeck-startup.webm` (1920×1080, dark theme, VP9 video +`app/src/main/assets/steam-startup/droiddeck-startup.webm` (1920×1080, pitch black background, VP9 video with Opus audio). `droiddeck-boot.html` is the editable animation; the scripts and WAV below reproduce the selected render. No alternate MP4 or WebM exports are kept in the repository. diff --git a/artwork/boot-animation-source/droiddeck-boot.html b/artwork/boot-animation-source/droiddeck-boot.html index 78d5e6f65..353ebc0a9 100644 --- a/artwork/boot-animation-source/droiddeck-boot.html +++ b/artwork/boot-animation-source/droiddeck-boot.html @@ -36,7 +36,7 @@ h1{font-size:1.35rem;font-weight:600;letter-spacing:-.01em;margin:0} .meta{color:var(--muted);font-size:.9rem;margin:0} .stage{position:relative;width:100%;aspect-ratio:16/10;border-radius:14px;overflow:hidden;background:#D6E1EA;box-shadow:0 0 0 1px var(--stage-edge),0 18px 50px -24px rgba(10,20,30,.45)} .stage canvas{display:block;width:100%;height:100%;cursor:pointer} -.stage.dark{background:#07090C} +.stage.dark{background:#000} .stage.dark .hint{color:#C9D3DD} .head-l{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap} .version{display:inline-flex;border-radius:999px;background:var(--panel);box-shadow:inset 0 0 0 1px var(--line);padding:3px} @@ -185,7 +185,8 @@ const DD = (() => { const ORB = '#1A9FFF'; const THEMES = { light: { ink: '#1b1b1b', bg: ['#EDF3F8', '#DCE6EE', '#B6C7D6'], shadow: '22,40,58', shadowK: 1, ringA: 1, ringGlow: 0, glow: 0, noise: 3 }, - dark: { ink: '#FFFFFF', bg: ['#1B222B', '#0F1419', '#030405'], shadow: '0,0,0', shadowK: 2.3, ringA: 1.5, ringGlow: 14, glow: .34, noise: 4 }, + // Keep the shipped Steam render black between and around the animated pieces. + dark: { ink: '#FFFFFF', bg: ['#000000', '#000000', '#000000'], shadow: '0,0,0', shadowK: 2.3, ringA: 1.5, ringGlow: 14, glow: .34, noise: 0 }, }; let TH = THEMES.light, THN = 'light'; const setTheme = n => { THN = THEMES[n] ? n : 'light'; TH = THEMES[THN]; };