summaryrefslogtreecommitdiff
path: root/modules
diff options
context:
space:
mode:
Diffstat (limited to 'modules')
-rw-r--r--modules/orgflow-ui/src/commonMain/kotlin/jp/orgflow/web/PieMenu.kt24
-rw-r--r--modules/orgflow-ui/src/commonMain/kotlin/jp/orgflow/web/WebTheme.kt35
2 files changed, 51 insertions, 8 deletions
diff --git a/modules/orgflow-ui/src/commonMain/kotlin/jp/orgflow/web/PieMenu.kt b/modules/orgflow-ui/src/commonMain/kotlin/jp/orgflow/web/PieMenu.kt
index 48728a9..784e8e4 100644
--- a/modules/orgflow-ui/src/commonMain/kotlin/jp/orgflow/web/PieMenu.kt
+++ b/modules/orgflow-ui/src/commonMain/kotlin/jp/orgflow/web/PieMenu.kt
@@ -75,7 +75,12 @@ fun PieMenu(
diameterDp: Int = 132,
) {
val accent = MaterialTheme.colors.primary
- val disc = MaterialTheme.colors.secondary
+ // パイの面の色はテーマから取る(WebTheme がダーク/ライト両方の値を
+ // 持つ)。以前は MaterialTheme.colors.secondary を使っていたが、
+ // ダークの secondary は地色とほぼ同じ明るさで、円盤が背景に
+ // 溶けていた(2026-09-27 指摘「おかしいしみにくい」)。
+ val cal = LocalCalendarColors.current
+ val disc = cal.pieFace
var touched by remember { mutableStateOf(-1) }
var outward by remember { mutableStateOf(false) }
var childIndex by remember { mutableStateOf(-1) }
@@ -130,7 +135,7 @@ fun PieMenu(
val r = w / 2f
val c = Offset(r, r)
- // 円(地)
+ // 円盤の面(テーマの pieFace)。地色との差が十分にある。
drawCircle(disc, radius = r, center = c)
// 各項目の扇。中心角 ± (360/n)/2 を占める。
@@ -144,7 +149,10 @@ fun PieMenu(
for (i in 0 until n) {
val isTouched = i == touched
drawArc(
- color = if (isTouched) accent else Color.White.copy(alpha = 0.16f),
+ // 触れていない扇は pieWedge(テーマ値)。
+ // 以前は白の alpha 0.16 で、地色とほぼ同じ面の上では
+ // 見えなかった。不透明な色にして段差を付ける。
+ color = if (isTouched) accent else cal.pieWedge,
startAngle = angles[i] - sweep / 2f,
sweepAngle = sweep,
useCenter = true,
@@ -164,7 +172,7 @@ fun PieMenu(
for (i in 0 until n) {
val a = (angles[i] - sweep / 2f) * PI.toFloat() / 180f
drawLine(
- Color.White.copy(alpha = 0.85f),
+ cal.pieLine.copy(alpha = 0.85f),
c,
Offset(c.x + cos(a) * r, c.y + sin(a) * r),
2.6f,
@@ -176,7 +184,7 @@ fun PieMenu(
// 円の縁が地色との淡い差だけで決まっており、円の範囲が
// 分かりにくかった。外周に白い輪を1本入れて円を閉じる。
drawCircle(
- Color.White.copy(alpha = 0.85f),
+ cal.pieLine,
radius = r - 1.2f,
center = c,
style = Stroke(2.4f),
@@ -213,7 +221,7 @@ fun PieMenu(
}
Text("W", color = Color.White, fontWeight = FontWeight.Bold)
// 項目名を円の中に置く。外側に置くとどの扇の名前か分からない。
- PieInDiscLabels(items, touched)
+ PieInDiscLabels(items, touched, cal.pieInk)
}
}
@@ -236,7 +244,7 @@ fun PieMenu(
* 定数で補正できない(§2.35 に記録)。
*/
@Composable
-private fun PieInDiscLabels(items: List<PieItem>, touched: Int) {
+private fun PieInDiscLabels(items: List<PieItem>, touched: Int, ink: Color) {
// 4項目のとき、左上/右上/左下/右下 の4スロットに置く。
// 4以外は数が合わないので出さない(現状 4 のみ運用)。
if (items.size != 4) return
@@ -282,7 +290,7 @@ private fun PieInDiscLabels(items: List<PieItem>, touched: Int) {
// 白は十分なコントラストがある。
// 触れている扇は主色(ワイン)で塗られるので、
// その上でも白は読める。
- color = Color.White,
+ color = ink,
maxLines = 1,
)
}
diff --git a/modules/orgflow-ui/src/commonMain/kotlin/jp/orgflow/web/WebTheme.kt b/modules/orgflow-ui/src/commonMain/kotlin/jp/orgflow/web/WebTheme.kt
index 91f0e15..8f68cab 100644
--- a/modules/orgflow-ui/src/commonMain/kotlin/jp/orgflow/web/WebTheme.kt
+++ b/modules/orgflow-ui/src/commonMain/kotlin/jp/orgflow/web/WebTheme.kt
@@ -72,6 +72,19 @@ data class CalendarColors(
val onHeader: Color, // 見出し帯の上の文字
val onToday: Color, // 今日のセルの上の文字
val barColors: List<Color>, // 予定の色(パイ4象限+象限なし)
+
+ // パイメニューの面(2026-09-27 追加)。
+ //
+ // なぜ専用の色が要るか: 前版は円盤に MaterialTheme.colors.secondary を
+ // 使っていた。ダークの secondary は DiscordHigh #3A3C42 で、
+ // 地色 #313338 との差がわずかしかない。そのため円盤が背景に溶け、
+ // 扇の塗り(alpha 0.16)も合わせて消えていた(2026-09-27 指摘
+ // 「おかしいしみにくい」)。面と地の差は「見えるかどうか」を
+ // 決めるので、テーマ側で明示的に持つ。
+ val pieFace: Color, // 円盤の面
+ val pieWedge: Color, // 扇(触れていない)
+ val pieLine: Color, // 区切り線と外枠
+ val pieInk: Color, // 扇の上の文字
)
/**
@@ -148,6 +161,13 @@ fun WebTheme(
onHeader = White,
onToday = White,
barColors = EventPalette,
+ // 地 #313338 に対し、面 #4A4D55 / 扇 #5C6068 と
+ // 段階を付ける。secondary #3A3C42 では地との差が
+ // 足りず円盤が消えていた(2026-09-27 の指摘)。
+ pieFace = Color(0xFF4A4D55),
+ pieWedge = Color(0xFF5C6068),
+ pieLine = Color(0xFFEDEDEF),
+ pieInk = White,
)
} else {
CalendarColors(
@@ -159,6 +179,16 @@ fun WebTheme(
onHeader = Color(0xFF1A1617),
onToday = White,
barColors = EventPalette,
+ // ライトでは地 #F2F0F0 に対し、面を白・扇を
+ // はっきりした灰にして段階を付ける。
+ // 最初は扇を #E2E0E0 にしたが、地との差が
+ // 小さすぎて「境界が分からない」と判定された。
+ // 地とのコントラストを確保できる値にする
+ // (白い面 #FFFFFF と扇 #C9C6C6 の組)。
+ pieFace = Color(0xFFFFFFFF),
+ pieWedge = Color(0xFFC9C6C6),
+ pieLine = Color(0xFF3A3436),
+ pieInk = Color(0xFF1A1617),
)
},
content = content,
@@ -169,6 +199,7 @@ fun WebTheme(
/** カレンダーの色。WebTheme の内側でのみ有効。 */
val LocalCalendarColors = staticCompositionLocalOf {
+ // 既定はダーク(WebTheme の既定 dark = true に合わせる)。
CalendarColors(
ground = DiscordGround,
cell = CalendarDarkCell,
@@ -178,5 +209,9 @@ val LocalCalendarColors = staticCompositionLocalOf {
onHeader = White,
onToday = White,
barColors = EventPalette,
+ pieFace = Color(0xFF4A4D55),
+ pieWedge = Color(0xFF5C6068),
+ pieLine = Color(0xFFEDEDEF),
+ pieInk = White,
)
}