diff --git a/app/src/main/java/com/bitchat/android/ui/AboutSections.kt b/app/src/main/java/com/bitchat/android/ui/AboutSections.kt
index e36ee7be..4307ea09 100644
--- a/app/src/main/java/com/bitchat/android/ui/AboutSections.kt
+++ b/app/src/main/java/com/bitchat/android/ui/AboutSections.kt
@@ -39,6 +39,7 @@ import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.bitchat.android.ui.theme.BitchatFontFamily
@@ -46,6 +47,8 @@ import com.bitchat.android.R
import com.bitchat.android.core.ui.icon.BitChatIcon
import com.bitchat.android.ui.theme.BitchatMotion
import com.bitchat.android.ui.theme.LocalBitchatPalette
+import com.bitchat.android.util.sdp
+import com.bitchat.android.util.ssp
/**
* Building blocks for the redesigned About sheet.
@@ -497,14 +500,14 @@ internal fun BitchatBadge(
Box(
modifier = modifier
.background(colorScheme.primary.copy(alpha = 0.15f), RoundedCornerShape(4.dp))
- .padding(horizontal = 5.dp, vertical = 2.dp)
+ .padding(horizontal = 5.sdp(), vertical = 2.sdp())
) {
Text(
text = text.uppercase(),
fontFamily = BitchatFontFamily,
- fontSize = 10.sp,
+ fontSize = 9.ssp(),
fontWeight = FontWeight.Bold,
- letterSpacing = 0.5.sp,
+ letterSpacing = 0.5.ssp(),
color = colorScheme.primary
)
}
@@ -513,7 +516,8 @@ internal fun BitchatBadge(
// MARK: - Shared bottom-sheet primitives
/** Horizontal inset for sheet content. Cards inset from here; labels align to the same edge. */
-internal val SheetHorizontalPadding = 16.dp
+internal val SheetHorizontalPadding: Dp
+ @Composable get() = 16.sdp()
/**
* Section divider label used across the sheets, e.g. `BOOKMARKED`, `NEARBY`, `ON LOCATION`.
diff --git a/app/src/main/java/com/bitchat/android/ui/LocationChannelsSheet.kt b/app/src/main/java/com/bitchat/android/ui/LocationChannelsSheet.kt
index 2b4d6514..c7729922 100644
--- a/app/src/main/java/com/bitchat/android/ui/LocationChannelsSheet.kt
+++ b/app/src/main/java/com/bitchat/android/ui/LocationChannelsSheet.kt
@@ -74,6 +74,8 @@ import com.bitchat.android.net.TorMode
import com.bitchat.android.net.TorPreferenceManager
import com.bitchat.android.ui.theme.BitchatMotion
import com.bitchat.android.ui.theme.LocalBitchatPalette
+import com.bitchat.android.util.sdp
+import com.bitchat.android.util.ssp
import com.bitchat.android.wifiaware.WifiAwareController
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.first
@@ -237,13 +239,13 @@ fun LocationChannelsSheet(
iconRes = R.drawable.ic_spec_range,
title = stringResource(R.string.mesh_title),
subtitle = stringResource(R.string.mesh_section_subtitle),
- modifier = Modifier.padding(top = 8.dp)
+ modifier = Modifier.padding(top = 8.sdp())
)
Surface(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = AboutHorizontalPadding)
- .padding(top = 10.dp),
+ .padding(top = 10.sdp()),
color = colorScheme.surface,
shape = AboutCardShape
) {
@@ -1049,7 +1051,7 @@ private fun ChannelSettingsToggleRow(
Text(
text = title,
fontFamily = BitchatFontFamily,
- fontSize = 14.sp,
+ fontSize = 14.ssp(),
fontWeight = FontWeight.Medium,
color = if (enabled) colorScheme.onSurface else palette.textTertiary
)
@@ -1058,12 +1060,12 @@ private fun ChannelSettingsToggleRow(
Text(
text = subtitle,
fontFamily = BitchatFontFamily,
- fontSize = 12.sp,
- lineHeight = 17.sp,
+ fontSize = 12.ssp(),
+ lineHeight = 17.ssp(),
color = if (enabled) colorScheme.onSurfaceVariant else palette.textTertiary
)
}
- Spacer(modifier = Modifier.width(16.dp))
+ Spacer(modifier = Modifier.width(16.sdp()))
Switch(
checked = checked,
onCheckedChange = { if (enabled) onCheckedChange(it) },
diff --git a/app/src/main/java/com/bitchat/android/util/DynamicSizeSpAndDp.kt b/app/src/main/java/com/bitchat/android/util/DynamicSizeSpAndDp.kt
new file mode 100644
index 00000000..5f3a68fb
--- /dev/null
+++ b/app/src/main/java/com/bitchat/android/util/DynamicSizeSpAndDp.kt
@@ -0,0 +1,54 @@
+package com.bitchat.android.util
+
+import android.annotation.SuppressLint
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.remember
+import androidx.compose.ui.platform.LocalConfiguration
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.TextUnit
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import kotlin.math.min
+
+/** Reference design width (dp) the UI was designed against — matches a standard phone viewport. */
+private const val BASE_WIDTH = 360f
+
+/** Clamp scaling so tiny/huge screens (foldables, tablets) don't over- or under-scale content. */
+private const val MIN_SCALE = 0.85f
+private const val MAX_SCALE = 1.30f
+
+/**
+ * Returns the current width-based scale factor, clamped to [MIN_SCALE, MAX_SCALE].
+ * Uses the smaller of width/height dp so rotation to landscape doesn't blow up the scale.
+ */
+@SuppressLint("ConfigurationScreenWidthHeight")
+@Composable
+private fun rememberUiScale(): Float {
+ val configuration = LocalConfiguration.current
+ val shortestDp = min(configuration.screenWidthDp, configuration.screenHeightDp)
+ return remember(shortestDp) {
+ (shortestDp / BASE_WIDTH).coerceIn(MIN_SCALE, MAX_SCALE)
+ }
+}
+
+/** Scales a dp value relative to [BASE_WIDTH], clamped to avoid extreme scaling on outlier screens. */
+@Composable
+fun Float.sdp(): Dp = (this * rememberUiScale()).dp
+
+/** Scales a sp value relative to [BASE_WIDTH], clamped to avoid extreme scaling on outlier screens. */
+@Composable
+fun Float.ssp(): TextUnit = (this * rememberUiScale()).sp
+
+/** Int convenience overload — lets you write `16.sdp()` directly. */
+@Composable
+fun Int.sdp(): Dp = this.toFloat().sdp()
+
+@Composable
+fun Int.ssp(): TextUnit = this.toFloat().ssp()
+
+/** Double convenience overload — covers decimal literals like `8.5.sdp()`, which Kotlin infers as Double by default. */
+@Composable
+fun Double.sdp(): Dp = this.toFloat().sdp()
+
+@Composable
+fun Double.ssp(): TextUnit = this.toFloat().ssp()
\ No newline at end of file
diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml
index a62cbff6..709b9b56 100644
--- a/gradle/verification-metadata.xml
+++ b/gradle/verification-metadata.xml
@@ -3,11 +3,6 @@
true
false
-
-
-
-
-