fix(log): the table grid was nearly invisible and the sent column vanished at night

Three contrast defects, each measured with a WCAG relative-luminance probe rather than
eyeballed.

GridLineColor was 0xFF3A3A3A: 1.65:1 against the navBar background and 1.36:1 against a
card, where Material asks 3:1 for non-text elements. Every rule and column separator on the
Log page is drawn with it, so the grid the page is built around was barely there - and gone
in sunlight. 0xFF6D6D6D is the lowest grey clearing 3:1 against both (3.62:1 and 3.00:1).

The upload column was a green tick and nothing else. This app applies a night filter that
zeroes green and blue, under which CheckGreen computes to 1.17:1 - the column disappeared
entirely. Changing the colour does not fix it, because colour was also the only thing
separating sent from waiting, which is the case Material calls out directly. The cell now
reads OK or an ellipsis, so the state survives both the filter and colour blindness, and a
contact that has not been tried is finally distinguishable from one that has.

The linear-transponder passband range was 11sp, below Material's body-small floor of 12sp.
That is the frequency an operator reads mid-pass to know where the transponder ends. The
session group header stays at 11sp: it is a label, not information.

Yellow survives the night filter at 4.69:1 because it is red-dominant, so the swipe and undo
affordances needed nothing here.
This commit is contained in:
mckero committed 2026-08-26 10:25:39 +00:00
1 parent 91263674a9
commit e2263668ce
2 files changed
+25 -11

No files matched your search

@@ -405,7 +405,7 @@ private fun ExpandedLogInput(
if (isLinearRange) {
Text(
text = " (${formatFrequency(upLow)} – ${formatFrequency(upHigh)})",
fontSize = 11.sp,
fontSize = 12.sp,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
@@ -426,7 +426,7 @@ private fun ExpandedLogInput(
if (downLow != null && downHigh != null && downLow != downHigh) {
Text(
text = " (${formatFrequency(downLow)} – ${formatFrequency(downHigh)})",
fontSize = 11.sp,
fontSize = 12.sp,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
@@ -44,7 +44,15 @@ import java.util.Calendar
import java.util.TimeZone
private val CheckGreen = Color(0xFF4CAF50)
private val GridLineColor = Color(0xFF3A3A3A)
/**
* Grid rules and column separators.
*
* Was 0xFF3A3A3A, which computes to 1.65:1 against the navBar background and 1.36:1 against a card,
* where Material asks 3:1 for non-text elements - the grid this page is built around was nearly
* invisible, and gone in sunlight. 0xFF6D6D6D is the lowest grey clearing 3:1 against both
* (3.62:1 and 3.00:1).
*/
private val GridLineColor = Color(0xFF6D6D6D)
@Composable
fun WavelogLogScreen(
@@ -139,15 +147,21 @@ fun WavelogLogScreen(
GridVLine()
Cell(entry.call, 0.dp, weight = 1f)
GridVLine()
// Upload state carried by the glyph, not by colour alone. The
// green tick collapses to 1.17:1 under this app's night filter,
// which zeroes green and blue, so the column disappeared entirely -
// and colour was the only thing separating sent from waiting.
Box(modifier = Modifier.width(44.dp)) {
if (entry.uploaded) {
Text(
text = "✓",
fontSize = 15.sp,
fontWeight = FontWeight.Bold,
color = CheckGreen
)
}
Text(
text = if (entry.uploaded) "OK" else "...",
fontSize = 13.sp,
fontWeight = FontWeight.Bold,
color = if (entry.uploaded) {
CheckGreen
} else {
MaterialTheme.colorScheme.onSurfaceVariant
}
)
}
}
// Row divider