From 4b098442c40f6156649fc71cc88d59788b9cd5ca Mon Sep 17 00:00:00 2001 From: xfy Date: Thu, 9 Jul 2026 16:36:36 +0800 Subject: [PATCH] fix(shift): badge color contrast and dynamic calendar rows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 角标文字色按背景类别配对:班=onPrimary,休=onError,起=onTertiary - 迷你月历复用 getMonthGridInfo 动态算行数(4/5/6),不再固定 6 行 --- .../plus/rua/project/ui/ShiftCalendarGrid.kt | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/core/src/main/kotlin/plus/rua/project/ui/ShiftCalendarGrid.kt b/core/src/main/kotlin/plus/rua/project/ui/ShiftCalendarGrid.kt index b5ad972..c24a99f 100644 --- a/core/src/main/kotlin/plus/rua/project/ui/ShiftCalendarGrid.kt +++ b/core/src/main/kotlin/plus/rua/project/ui/ShiftCalendarGrid.kt @@ -69,9 +69,10 @@ fun ShiftCalendarGrid( var viewYear by remember { mutableStateOf(today.year) } var viewMonth by remember { mutableStateOf(today.month.number) } - val firstOfMonth = LocalDate(viewYear, Month(viewMonth), 1) - val daysInMonth = firstOfMonth.plus(DatePeriod(months = 1)).minus(DatePeriod(days = 1)).day - val firstWeekdayOffset = firstOfMonth.dayOfWeek.isoDayNumber - 1 + // 复用主日历的网格计算(周一为首日,动态行数 4/5/6) + val gridInfo = remember(viewYear, viewMonth) { getMonthGridInfo(viewYear, viewMonth) } + val firstWeekdayOffset = gridInfo.offset + val rows = gridInfo.rows Card( modifier = modifier.fillMaxWidth(), @@ -115,12 +116,12 @@ fun ShiftCalendarGrid( } } - (0 until 6).forEach { row -> + (0 until rows).forEach { row -> Row(Modifier.fillMaxWidth()) { (0 until 7).forEach { col -> val cellIndex = row * 7 + col val dayNum = cellIndex - firstWeekdayOffset + 1 - if (dayNum in 1..daysInMonth) { + if (dayNum in 1..gridInfo.daysInMonth) { val date = LocalDate(viewYear, Month(viewMonth), dayNum) ShiftDayCell( date = date, @@ -209,12 +210,19 @@ private fun ShiftDayCell( // rephaseFlip 的 rephaseFrom = 当天,表示该天为重排起点 val isRephaseStart = pattern.rephaseFlips.any { it.rephaseFrom == date } + // 背景色与文字色配对,保证对比度(对照 DayCell 的配色风格) val badgeColor = when { isRephaseStart -> MaterialTheme.colorScheme.tertiary kind == ShiftKind.WORK -> MaterialTheme.colorScheme.primary kind == ShiftKind.OFF -> MaterialTheme.colorScheme.error else -> Color.Transparent } + val badgeTextColor = when { + isRephaseStart -> MaterialTheme.colorScheme.onTertiary + kind == ShiftKind.WORK -> MaterialTheme.colorScheme.onPrimary + kind == ShiftKind.OFF -> MaterialTheme.colorScheme.onError + else -> Color.Transparent + } val badgeText = when { isRephaseStart -> "起" kind == ShiftKind.WORK -> "班" @@ -243,7 +251,7 @@ private fun ShiftDayCell( ) { Text( text = badgeText, - color = MaterialTheme.colorScheme.onPrimary, + color = badgeTextColor, fontSize = 8.sp, fontWeight = FontWeight.Bold, lineHeight = 8.sp