feat(ios): comprehensive iPhone+iPad UX polish — refined-native design system
Freeze a shared design system (DesignSystem/{Tokens,Typography,StatusStyle,
Primitives}.swift): indigo #7C8CFF accent (root .tint), semantic status colors,
2-4-8-12-16-20-24 spacing + sm8/md12/lg16 radii scale, SF Mono tabular numbers,
reduce-motion-gated animations, haptics, reusable StatusBadge/TelemetryChip/Card/
SectionHeader/DSButtonStyle/ContinueLastBanner. Every changed view consumes tokens
— no hardcoded colors/spacing.
Applied across all surfaces (visual only — zero behavior/logic change, all suites
green): session list rows + status system (shape+color, not color-alone) +
telemetry chips + thumbnail placeholders; terminal gate card (≥44pt approve/reject)
+ keybar + reconnect + quick-reply + digest + SwiftTerm accent theme; pairing hero
+ warning tiers + Projects cards + Timeline/Diff; nav chrome + iPad split placeholder
+ privacy shade + motion. Chinese gate copy. UX finding fixed: timeline class colors
now via DS.Palette (+timelineTool/timelineUser tokens).
Design review 8.5/10. Verified: iPhone 16 290 + iPad Pro 11 290 tests green;
packages + integration green; consistency audit ~clean; zero changes under
ios/Packages, src/, public/.
This commit is contained in:
@@ -163,14 +163,16 @@ struct TimelineSheetTests {
|
||||
#expect(TimelineClassStyle.glyph(for: "") == TimelineClassStyle.fallbackGlyph)
|
||||
}
|
||||
|
||||
@Test("颜色语义映射:对齐 SessionListScreen 状态色约定;未知 → secondary")
|
||||
@Test("颜色语义映射:全部走冻结 DS.Palette(无裸色);未知 → textSecondary")
|
||||
func colorMappingIsSemantic() {
|
||||
#expect(TimelineClassStyle.color(for: "waiting") == .orange) // 列表 waiting 同色
|
||||
#expect(TimelineClassStyle.color(for: "stuck") == .red) // 列表 stuck 同色
|
||||
#expect(TimelineClassStyle.color(for: "done") == .green)
|
||||
#expect(TimelineClassStyle.color(for: "tool") == .blue)
|
||||
#expect(TimelineClassStyle.color(for: "user") == .purple)
|
||||
#expect(TimelineClassStyle.color(for: "future-class") == .secondary)
|
||||
// waiting/stuck 复用状态 token(与列表同义);done 复用 statusWorking;
|
||||
// tool/user 用 timeline 专属 token —— 无一裸色(UX 一致性 finding)。
|
||||
#expect(TimelineClassStyle.color(for: "waiting") == DS.Palette.statusWaiting)
|
||||
#expect(TimelineClassStyle.color(for: "stuck") == DS.Palette.statusStuck)
|
||||
#expect(TimelineClassStyle.color(for: "done") == DS.Palette.statusWorking)
|
||||
#expect(TimelineClassStyle.color(for: "tool") == DS.Palette.timelineTool)
|
||||
#expect(TimelineClassStyle.color(for: "user") == DS.Palette.timelineUser)
|
||||
#expect(TimelineClassStyle.color(for: "future-class") == DS.Palette.textSecondary)
|
||||
}
|
||||
|
||||
// MARK: - 行时间格式(镜像 web formatHHMM:24h 墙钟 HH:mm)
|
||||
|
||||
Reference in New Issue
Block a user