tasks: rebalance row layout, countdown+icons move to right column (KC-62 follow-up)

The category icon column sat empty for most rows (default tasks have
no glyph/alarm/series), leaving a lone repeat icon floating in dead
space on the right per user's device screenshot. Move the countdown
label out from under the title into a trailing column paired with the
indicator icons, so both sides of the row carry equal weight.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
kutesir
2026-07-09 14:26:40 +03:00
committed by kutesir
parent 80fbbd7895
commit 92a533a930
2 changed files with 39 additions and 27 deletions

View File

@@ -2165,3 +2165,14 @@ imbalance confirmed via `git stash` to predate this change — a comment
artifact, not introduced here). `TagChip` itself is left intact in artifact, not introduced here). `TagChip` itself is left intact in
`SharedComponents.swift` since it's a generic shared component, just no `SharedComponents.swift` since it's a generic shared component, just no
longer called from these two sites. longer called from these two sites.
### Follow-up — right side was dead space
Device screenshot of the "Later" list showed the icon column sitting empty
for most rows (default `.reminder` tasks have no glyph, no alarm, no
series), leaving a lone floating repeat icon on recurring rows and a big
gap everywhere else. Rebalanced `TaskRowView`: the countdown (`in 1 wk`
etc., previously crammed under the title on the left) moved to a trailing
`VStack` on the right, with the icon row underneath it — so the row now
reads title/date on the left, countdown/indicators on the right, instead of
all metadata piled on the left and the right column empty. `TodayTLRow` was
left as-is (its leading time-track column already fills that role there).

View File

@@ -1355,38 +1355,39 @@ struct TaskRowView: View {
.font(AppFonts.sans(13)) .font(AppFonts.sans(13))
.foregroundColor(AppColors.text(cs)) .foregroundColor(AppColors.text(cs))
if let d = task.dueDate, showDetails { if let d = task.dueDate, showDetails {
HStack(spacing: 4) { Text("\(dueFmt.string(from: d))\(task.isRecurring ? " · \(task.recurrenceLabel ?? "Repeat")" : "")")
Text("\(dueFmt.string(from: d))\(task.isRecurring ? " · \(task.recurrenceLabel ?? "Repeat")" : "")") .font(AppFonts.mono(9.5))
.font(AppFonts.mono(9.5)) .foregroundColor(AppColors.text3(cs))
.foregroundColor(AppColors.text3(cs))
Text("·")
.font(AppFonts.mono(9.5))
.foregroundColor(AppColors.text3(cs).opacity(0.4))
Text(countdownLabel(to: d))
.font(AppFonts.mono(9.5, weight: .semibold))
.foregroundColor(countdownColor(to: d))
}
} }
} }
Spacer() Spacer(minLength: 8)
// reminder · 🔁 recurring · tag icon indicators (TickTick-style icon only, no text badge) // Right column mirrors the left: countdown metadata on top,
HStack(spacing: 5) { // icon-only category/reminder/series indicators below fills
if let glyph = task.category.glyph { // what used to be dead space instead of a lone floating icon.
Image(systemName: glyph) VStack(alignment: .trailing, spacing: 3) {
.font(.system(size: 11)) if let d = task.dueDate, showDetails {
.foregroundColor(task.quadrant.color) Text(countdownLabel(to: d))
.font(AppFonts.mono(9.5, weight: .semibold))
.foregroundColor(countdownColor(to: d))
} }
if task.reminderDate != nil || task.constantReminder { HStack(spacing: 5) {
Image(systemName: "alarm") if let glyph = task.category.glyph {
.font(.system(size: 11)) Image(systemName: glyph)
.foregroundColor(AppColors.text3(cs)) .font(.system(size: 10.5))
} .foregroundColor(task.quadrant.color)
if task.isRecurring { }
Image(systemName: "repeat") if task.reminderDate != nil || task.constantReminder {
.font(.system(size: 11)) Image(systemName: "alarm")
.foregroundColor(AppColors.text3(cs)) .font(.system(size: 10.5))
.foregroundColor(AppColors.text3(cs))
}
if task.isRecurring {
Image(systemName: "repeat")
.font(.system(size: 10.5))
.foregroundColor(AppColors.text3(cs))
}
} }
} }
.padding(.trailing, 9) .padding(.trailing, 9)