fix(ui): remap dark article colors in dark theme
Colors set by dictionaries such as navy, dark red and brown are nearly invisible on the dark background. Swap the dark named colors for lighter tones when rendering in the dark theme; the light theme keeps the original colors.
This commit is contained in:
1 parent
c9b4a958bf
commit
ec28d63656
2 files changed
+42
-2
No files matched your search
@@ -11,6 +11,7 @@ import androidx.compose.runtime.*
|
|||||||
import androidx.compose.runtime.saveable.rememberSaveable
|
import androidx.compose.runtime.saveable.rememberSaveable
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.luminance
|
||||||
import androidx.compose.ui.layout.onSizeChanged
|
import androidx.compose.ui.layout.onSizeChanged
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
import androidx.compose.ui.platform.LocalDensity
|
||||||
import androidx.compose.ui.platform.testTag
|
import androidx.compose.ui.platform.testTag
|
||||||
@@ -197,12 +198,22 @@ fun ArticleContent(
|
|||||||
articleState.dslContent.size > HEAVY_ARTICLE_BLOCK_COUNT
|
articleState.dslContent.size > HEAVY_ARTICLE_BLOCK_COUNT
|
||||||
|
|
||||||
val density = LocalDensity.current
|
val density = LocalDensity.current
|
||||||
|
val darkTheme = MaterialTheme.colorScheme.background.luminance() < 0.5f
|
||||||
val displayBlocks = remember(
|
val displayBlocks = remember(
|
||||||
articleState.dslContent,
|
articleState.dslContent,
|
||||||
density,
|
density,
|
||||||
baseTextStyle
|
baseTextStyle,
|
||||||
|
darkTheme
|
||||||
) {
|
) {
|
||||||
mergeDslBlocks(articleState.dslContent, density, baseTextStyle)
|
val merged =
|
||||||
|
mergeDslBlocks(articleState.dslContent, density, baseTextStyle)
|
||||||
|
if (darkTheme) {
|
||||||
|
merged.map {
|
||||||
|
it.copy(text = DslAnnotatedParser.remapForDarkTheme(it.text))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
merged
|
||||||
|
}
|
||||||
}
|
}
|
||||||
val articleList: @Composable (Modifier) -> Unit = { listModifier ->
|
val articleList: @Composable (Modifier) -> Unit = { listModifier ->
|
||||||
LazyColumn(
|
LazyColumn(
|
||||||
|
|||||||
@@ -411,6 +411,35 @@ object DslAnnotatedParser {
|
|||||||
linkText = Color(0xFF1E88E5),
|
linkText = Color(0xFF1E88E5),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private val DARK_THEME_COLORS: Map<Color, Color> = mapOf(
|
||||||
|
Color(0xFF000000) to Color(0xFFE8E6E3),
|
||||||
|
Color(0xFF000080) to Color(0xFF8FA8E0),
|
||||||
|
Color(0xFF00008B) to Color(0xFF8FA8E0),
|
||||||
|
Color(0xFF0000FF) to Color(0xFF7C9CE8),
|
||||||
|
Color(0xFF006400) to Color(0xFF66BB6A),
|
||||||
|
Color(0xFF008000) to Color(0xFF66BB6A),
|
||||||
|
Color(0xFF8B0000) to Color(0xFFE57373),
|
||||||
|
Color(0xFF800000) to Color(0xFFE57373),
|
||||||
|
Color(0xFF800080) to Color(0xFFBA68C8),
|
||||||
|
Color(0xFFA52A2A) to Color(0xFFBCAAA4),
|
||||||
|
Color(0xFF008080) to Color(0xFF4DB6AC),
|
||||||
|
Color(0xFF808000) to Color(0xFFC0CA33),
|
||||||
|
)
|
||||||
|
|
||||||
|
fun remapForDarkTheme(text: AnnotatedString): AnnotatedString {
|
||||||
|
if (text.spanStyles.none { it.item.color in DARK_THEME_COLORS }) return text
|
||||||
|
val builder = AnnotatedString.Builder(text.text)
|
||||||
|
text.spanStyles.forEach { range ->
|
||||||
|
val style = DARK_THEME_COLORS[range.item.color]
|
||||||
|
?.let { range.item.copy(color = it) } ?: range.item
|
||||||
|
builder.addStyle(style, range.start, range.end)
|
||||||
|
}
|
||||||
|
text.paragraphStyles.forEach { range ->
|
||||||
|
builder.addStyle(range.item, range.start, range.end)
|
||||||
|
}
|
||||||
|
return builder.toAnnotatedString()
|
||||||
|
}
|
||||||
|
|
||||||
// Allow external cache clearing (e.g., when dictionaries change)
|
// Allow external cache clearing (e.g., when dictionaries change)
|
||||||
fun clearRefCache() {
|
fun clearRefCache() {
|
||||||
refCache.evictAll()
|
refCache.evictAll()
|
||||||
|
|||||||
Reference in new issue
Block a user