Files
kangkang/康康/Features/Timeline/TimelineRow.swift
link2026 77a4ee1c37 缺少代码差异信息,无法生成具体的commit message。请提供code differences内容以便分析并生成符合Angular规范的提交信息。
当您提供代码差异后,我将按照以下格式生成:

```
<type>(<scope>): <subject>

<body>
```

其中type会根据更改类型选择(feat、fix、docs、style、refactor等),scope表示影响范围,subject简要描述变更内容,body详细说明修改内容。
2026-06-07 14:17:18 +08:00

68 lines
2.4 KiB
Swift

import SwiftUI
struct TimelineRow: View {
let entry: TimelineEntry
var body: some View {
HStack(spacing: 12) {
ZStack {
RoundedRectangle(cornerRadius: 8, style: .continuous)
.fill(entry.kind.accent.opacity(0.12))
Image(systemName: entry.kind.icon)
.font(.tjScaled( 14, weight: .semibold))
.foregroundStyle(entry.kind.accent)
}
.frame(width: 36, height: 36)
.overlay(alignment: .topTrailing) {
if entry.isOngoing {
Circle()
.fill(Tj.Palette.brick)
.frame(width: 7, height: 7)
.overlay(Circle().strokeBorder(Tj.Palette.sand, lineWidth: 1.5))
.offset(x: 3, y: -3)
}
}
VStack(alignment: .leading, spacing: 2) {
Text("\(entry.date.timelineLabel) · \(entry.subtitle)")
.font(.tjScaled( 11))
.tracking(0.3)
.foregroundStyle(Tj.Palette.text3)
.lineLimit(1)
Text(entry.title)
.font(.tjScaled( 14, weight: .medium))
.foregroundStyle(Tj.Palette.text)
.lineLimit(1)
.truncationMode(.tail)
}
Spacer(minLength: 8)
if let trailing = entry.trailing {
Text(trailing)
.font(.tjScaled( 12, weight: .semibold, design: .monospaced))
.foregroundStyle(entry.trailingIsAlert ? Tj.Palette.brick : Tj.Palette.text2)
.lineLimit(1)
.fixedSize()
}
}
.padding(12)
.tjCard(bordered: true)
}
}
extension Date {
var timelineLabel: String {
let cal = Calendar.current
if cal.isDateInToday(self) {
return self.formatted(date: .omitted, time: .shortened)
}
if cal.isDateInYesterday(self) {
return String(appLoc: "昨天") + " " + self.formatted(date: .omitted, time: .shortened)
}
let now = Date.now
if cal.isDate(self, equalTo: now, toGranularity: .year) {
return self.formatted(.dateTime.month().day())
}
return self.formatted(.dateTime.year().month().day())
}
}