Transformed HealthProbe's data type detail views from table-heavy to graphics-rich design, emphasizing visual indicators over text rows.
┌─ Data Type ─────────────────────────┐
│ Name Step Count │
│ Identifier HKQuantity... │
│ Current Count 1,250 │
│ Previous Count 1,180 │
└──────────────────────────────────────┘
┌─ Range ──────────────────────────────┐
│ Earliest 2025-04-15 │
│ Latest 2025-05-13 │
│ ⚠️ Incomplete... │
└──────────────────────────────────────┘
┌─ Changes ────────────────────────────┐
│ Compared To 2025-05-12 15:30 │
│ Net Change [+70 records] │
│ Added Records 45 │
│ Disappeared 12 │
│ Preparing... │
└──────────────────────────────────────┘
Problems: - Dense text, hard to scan - Data repeated (counts in text + badge) - No visual evolution story - 8+ section/row layers
┌─ Metric Comparison ───────────────────┐
│ Now │ │ Before │
│ 1,250 │ │ 1,180 │
├─────────────┼────┼────────────────────┤
│ ↗ Green +70 (5.9%) ✓ │
│ +70 records │
└───────────────────────────────────────┘
┌─ Evolution Timeline ──────────────────┐
│ ▲ ▲ ▲ ▼ ▲ │
│ 1250 1140 1100 950 1070 │
│ 5/8 5/9 5/10 5/11 5/12 │
│ │
│ Min 1,100 Max 1,250 Latest 1,070│
└───────────────────────────────────────┘
┌─ Data Range ──────────────────────────┐
│ 🕐 28 days 🕐 │
│ Apr 15 ────────────────── May 13 │
│ │
└───────────────────────────────────────┘
┌─ Record Changes ──────────────────────┐
│ ✚ Added 45 (78.9%) [━━━━░░] │
│ ✕ Gone 12 (21.1%) [░░░░░░] │
└───────────────────────────────────────┘
Improvements: - ✨ One card = one story (metric, timeline, range, changes) - 📊 Data shown graphically (bars, arrows, progress) - 🎯 Visual hierarchy clear (size, color, position) - ↕️ Evolution visible in one glance - 🎨 Color-coded meaning (green ↑, red ↓, amber ⚠)
┌─────────────────────────────────────┐
│ Step Count │
│ Now 1,250 Prev 1,180 [+70] ✓ │
└─────────────────────────────────────┘
Problems: - Text metrics hard to compare - Delta only shown as badge - No direction indicator - Dense layout
┌─────────────────────────────────────┐
│ Step Count │
│ Now 1250 Before 1180 │
│ ↗ Green +70 records ✓ │
└─────────────────────────────────────┘
Improvements: - Metric boxes with proper spacing - Directional arrow (↑ green, ↓ red, - gray) - "New" sparkle (✨) for new data types - Better visual scanning
Shows current vs previous with delta. - Use: When comparing two values - Deduplicates: 4 text rows → 1 visual card - Visual: Color boxes, arrow indicator, percentage
Shows 5-point progression. - Use: When you have multiple snapshots - Deduplicates: Historical date/count rows → 1 timeline - Visual: Bar chart, connectors, min/max stats
Shows added/disappeared records. - Use: When showing record diffs - Deduplicates: 2 text rows → 1 interactive component - Visual: Color buttons, progress bar, percentages
Shows earliest/latest dates and quality. - Use: When showing data capture range - Deduplicates: 3 rows (Earliest, Latest, Quality) → 1 card - Visual: Calendar icons, gradient bar, badge
| Principle | Implementation |
|---|---|
| Graphics over Text | Arrows instead of "Increase/Decrease", bar charts instead of numbers |
| Deduplication | One visual component replaces 3-4 text rows |
| Direction First | ↑↓- symbols immediately show transition direction |
| Color Coding | Green (healthy), Red (critical), Amber (warning), Gray (neutral) |
| Scanability | Large, spaced metrics are easy to read at a glance |
| Interaction | Buttons are tappable, not just informational |
| Metric | Before | After | Change |
|---|---|---|---|
| DataTypeSnapshotDetailView lines | 800 | 580 | -27% |
| Sections/Cards | 8+ | 4 | -50% |
| Text rows (detail view) | 15+ | 4 | -73% |
| Reusable components | 0 | 4 | +400% |
Preview → Light (default)
Check: Colors visible, text readable, badges clear
Preview → Dark
Check: Contrast sufficient, gradient visible, no black-on-black
VoiceOver: Read order should be: name → metrics → evolution → range → changes
Dynamic Type: Test at xSmall (1.0) and AX3 (1.3+)
- No previous snapshot → show empty state
- No date range → show "–" placeholder
- Legacy record format → show warning banner
- Loading state → show spinner in record section
Views/DataTypes/
├── DataTypesView.swift (refactored row)
├── MetricComparisonCard.swift (NEW)
├── TypeEvolutionTimeline.swift (NEW)
├── RecordChangeIndicator.swift (NEW)
└── DataTypeRangeIndicator.swift (NEW)
Views/Snapshots/
└── DataTypeSnapshotDetailView.swift (refactored layout)