@ericrisco/rsc 3.3.0 → 3.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -3
- package/manifest.json +43 -22
- package/package.json +1 -1
- package/scripts/lib/default-skill-floor.js +5 -1
- package/scripts/lib/domains.js +2 -2
- package/scripts/lib/retired-skills.js +4 -0
- package/skills/design/SKILL.md +4 -3
- package/skills/design/evals/cases.yaml +2 -2
- package/skills/react/SKILL.md +2 -1
- package/skills/suggest/SKILL.md +12 -8
- package/skills/suggest/evals/cases.yaml +6 -0
- package/skills/ux/SKILL.md +149 -0
- package/skills/ux/THIRD_PARTY.md +32 -0
- package/skills/ux/evals/cases.yaml +40 -0
- package/skills/ux/references/flows.md +124 -0
- package/skills/ux/upstream/UPSTREAM.json +59 -0
- package/skills/ux/upstream/ux-designer/GUIDE.md +180 -0
- package/skills/ux/upstream/ux-designer/LICENSE +21 -0
- package/skills/ux/upstream/ux-designer/references/01-core-principles.md +251 -0
- package/skills/ux/upstream/ux-designer/references/02-laws-of-ux.md +330 -0
- package/skills/ux/upstream/ux-designer/references/03-accessibility.md +411 -0
- package/skills/ux/upstream/ux-designer/references/04-visual-design.md +433 -0
- package/skills/ux/upstream/ux-designer/references/05-information-architecture.md +432 -0
- package/skills/ux/upstream/ux-designer/references/06-interaction-design.md +495 -0
- package/skills/ux/upstream/ux-designer/references/07-forms-and-inputs.md +491 -0
- package/skills/ux/upstream/ux-designer/references/08-mobile-ux.md +539 -0
- package/skills/ux/upstream/ux-designer/references/09-ux-writing.md +493 -0
- package/skills/ux/upstream/ux-designer/references/10-user-research.md +533 -0
- package/skills/ux/upstream/ux-designer/references/11-design-systems.md +618 -0
- package/skills/ux/upstream/ux-designer/references/12a-presence-awareness.md +395 -0
- package/skills/ux/upstream/ux-designer/references/12b-conflict-resolution-sync.md +420 -0
- package/skills/ux/upstream/ux-designer/references/13a-canvas-navigation.md +388 -0
- package/skills/ux/upstream/ux-designer/references/13b-canvas-objects-performance.md +559 -0
- package/skills/ux/upstream/ux-designer/references/14-ai-ux-patterns.md +511 -0
- package/skills/ux/upstream/ux-designer/references/15-ethical-design.md +419 -0
- package/skills/ux/upstream/ux-designer/references/16-onboarding.md +430 -0
- package/skills/ux/upstream/ux-designer/references/17-notifications.md +461 -0
- package/skills/ux/upstream/ux-designer/references/18-data-visualization.md +453 -0
- package/skills/ux/upstream/ux-designer/references/19-search-ux.md +479 -0
- package/skills/ux/upstream/ux-designer/references/20-emotional-design.md +382 -0
- package/skills/ux/upstream/ux-designer/references/21-data-tables.md +629 -0
- package/skills/ux/upstream/ux-designer/references/22-performance-ux.md +626 -0
- package/skills/ux/upstream/ux-designer/references/23-internationalization.md +347 -0
- package/skills/ux/upstream/ux-designer/references/24-voice-and-multimodal.md +308 -0
- package/skills/ux/upstream/ux-designer/references/25a-barcode-camera-scanning.md +342 -0
- package/skills/ux/upstream/ux-designer/references/25b-barcode-scanner-workflows.md +412 -0
- package/skills/ux/upstream/ux-designer/references/25c-barcode-display.md +277 -0
- package/skills/ux/upstream/ux-usability-foundations/GUIDE.md +285 -0
- package/skills/ux/upstream/ux-usability-foundations/LICENSE +21 -0
- package/skills/ux/upstream/ux-usability-foundations/references/anti-patterns.md +267 -0
- package/skills/ux/upstream/ux-usability-foundations/references/checklists.md +130 -0
- package/skills/ux/upstream/ux-usability-foundations/references/decision-prompts.md +340 -0
- package/skills/ux/upstream/ux-usability-foundations/references/principle-cards.md +449 -0
- package/targets/clone-bootstrap.mjs +1 -1
- package/skills/ui-engineering/SKILL.md +0 -113
- package/skills/ui-engineering/evals/cases.yaml +0 -38
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
# Data Visualization & Dashboard UX
|
|
2
|
+
|
|
3
|
+
Data visualization and dashboard design are specialized UX disciplines critical for enterprise products and analytics interfaces. This reference covers chart selection, dashboard layout, data tables, and accessibility for data-heavy interfaces.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Contents
|
|
8
|
+
|
|
9
|
+
- Chart Selection
|
|
10
|
+
- Dashboard Layout
|
|
11
|
+
- Color in Data Visualization
|
|
12
|
+
- Interaction Patterns
|
|
13
|
+
- Responsive Charts
|
|
14
|
+
- Data Tables
|
|
15
|
+
- Empty & Error States
|
|
16
|
+
- Accessibility
|
|
17
|
+
- Key Metrics
|
|
18
|
+
- Anti-Patterns
|
|
19
|
+
- Sources
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Chart Selection
|
|
24
|
+
|
|
25
|
+
### When to Use Each Chart Type
|
|
26
|
+
|
|
27
|
+
| Data Relationship | Recommended Chart | Avoid |
|
|
28
|
+
|-------------------|------------------|-------|
|
|
29
|
+
| **Part of whole** | Pie (≤6 slices), donut, stacked bar, treemap | Pie with >6 slices |
|
|
30
|
+
| **Comparison** | Bar (vertical/horizontal), grouped bar | 3D bars, radar (hard to read) |
|
|
31
|
+
| **Trend over time** | Line, area, sparkline | Pie (no time axis) |
|
|
32
|
+
| **Distribution** | Histogram, box plot, violin plot | Pie or bar |
|
|
33
|
+
| **Correlation** | Scatter plot, bubble chart | Line (implies time) |
|
|
34
|
+
| **Ranking** | Horizontal bar (sorted), lollipop chart | Vertical bar (hard to label) |
|
|
35
|
+
| **Geographic** | Choropleth map, dot map | Bar chart for location data |
|
|
36
|
+
| **Hierarchy** | Treemap, sunburst | Nested pie charts |
|
|
37
|
+
| **Flow/process** | Sankey diagram, funnel | Bar chart |
|
|
38
|
+
| **Single value** | KPI card, gauge, big number | Chart with one data point |
|
|
39
|
+
|
|
40
|
+
### Chart Decision Tree
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
What are you showing?
|
|
44
|
+
├── Single number → KPI card / big number display
|
|
45
|
+
├── Change over time?
|
|
46
|
+
│ ├── Few series (1-3) → Line chart
|
|
47
|
+
│ ├── Many series → Small multiples or highlight key lines
|
|
48
|
+
│ └── Cumulative → Stacked area chart
|
|
49
|
+
├── Comparing categories?
|
|
50
|
+
│ ├── Few categories (≤6) → Vertical bar chart
|
|
51
|
+
│ ├── Many categories → Horizontal bar chart (easier labels)
|
|
52
|
+
│ └── Two variables → Grouped or stacked bar
|
|
53
|
+
├── Part of a whole?
|
|
54
|
+
│ ├── Few parts (≤5) → Pie or donut chart
|
|
55
|
+
│ ├── Many parts → Treemap or stacked bar
|
|
56
|
+
│ └── Hierarchical → Sunburst or treemap
|
|
57
|
+
├── Relationship between variables?
|
|
58
|
+
│ ├── Two variables → Scatter plot
|
|
59
|
+
│ └── Three variables → Bubble chart (size = 3rd variable)
|
|
60
|
+
└── Distribution?
|
|
61
|
+
├── Single variable → Histogram
|
|
62
|
+
└── Multiple groups → Box plot or violin plot
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Dashboard Layout
|
|
68
|
+
|
|
69
|
+
### Information Hierarchy
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
┌─────────────────────────────────────────────────────┐
|
|
73
|
+
│ KPI Cards (most important metrics at a glance) │
|
|
74
|
+
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │
|
|
75
|
+
│ │ $42K │ │ 1.2K │ │ 89% │ │ 4.2s │ │
|
|
76
|
+
│ │ Rev │ │Users │ │ Sat │ │ Load │ │
|
|
77
|
+
│ │ ↑12% │ │ ↑8% │ │ ↓2% │ │ ↑0.3 │ │
|
|
78
|
+
│ └──────┘ └──────┘ └──────┘ └──────┘ │
|
|
79
|
+
├─────────────────────────────────────────────────────┤
|
|
80
|
+
│ Primary chart (main trend or most viewed data) │
|
|
81
|
+
│ ┌─────────────────────────────────────────────┐ │
|
|
82
|
+
│ │ 📈 Revenue Over Time │ │
|
|
83
|
+
│ │ ▁▂▃▅▆▇█▇▆▅▆▇██▇▅▆▇█ │ │
|
|
84
|
+
│ └─────────────────────────────────────────────┘ │
|
|
85
|
+
├─────────────────────┬───────────────────────────────┤
|
|
86
|
+
│ Secondary chart 1 │ Secondary chart 2 │
|
|
87
|
+
│ ┌───────────────┐ │ ┌───────────────────────┐ │
|
|
88
|
+
│ │ 🥧 By Source │ │ │ 📊 By Region │ │
|
|
89
|
+
│ └───────────────┘ │ └───────────────────────┘ │
|
|
90
|
+
├─────────────────────┴───────────────────────────────┤
|
|
91
|
+
│ Data table (details on demand) │
|
|
92
|
+
│ ┌─────────────────────────────────────────────┐ │
|
|
93
|
+
│ │ Name │ Revenue │ Users │ Conversion │ │
|
|
94
|
+
│ │ ... │ ... │ ... │ ... │ │
|
|
95
|
+
│ └─────────────────────────────────────────────┘ │
|
|
96
|
+
└─────────────────────────────────────────────────────┘
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Layout Principles
|
|
100
|
+
|
|
101
|
+
- **Top**: KPI summary cards (3-6 metrics)
|
|
102
|
+
- **Middle**: Primary visualizations (1-2 charts)
|
|
103
|
+
- **Bottom**: Secondary charts and detail tables
|
|
104
|
+
- **Shneiderman's mantra**: Overview first, zoom and filter, details on demand
|
|
105
|
+
- Use consistent grid (12-column for flexibility)
|
|
106
|
+
- Group related metrics visually
|
|
107
|
+
|
|
108
|
+
### KPI Card Design
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
┌────────────────────────┐
|
|
112
|
+
│ Revenue ⓘ │ ← Label + info tooltip
|
|
113
|
+
│ $42,350 │ ← Big number (primary)
|
|
114
|
+
│ ↑ 12.3% vs last month │ ← Trend with comparison
|
|
115
|
+
│ ▁▂▃▅▆▇█▇▆▅ │ ← Sparkline (optional)
|
|
116
|
+
└────────────────────────┘
|
|
117
|
+
|
|
118
|
+
Colors:
|
|
119
|
+
↑ Green = positive trend (contextual — could be red for cost metrics)
|
|
120
|
+
↓ Red = negative trend
|
|
121
|
+
→ Gray = no change
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
- Display the most important number prominently
|
|
125
|
+
- Include comparison period and trend direction
|
|
126
|
+
- Add sparkline for quick trend visualization
|
|
127
|
+
- Info icon for metric definition/calculation
|
|
128
|
+
- Contextual coloring (up isn't always good — e.g., error rate)
|
|
129
|
+
|
|
130
|
+
### Customizable Dashboards
|
|
131
|
+
|
|
132
|
+
- Drag-and-drop widget rearrangement
|
|
133
|
+
- Resizable panels with snap-to-grid
|
|
134
|
+
- Add/remove widgets from a library
|
|
135
|
+
- Save multiple dashboard layouts
|
|
136
|
+
- Share dashboards with team members
|
|
137
|
+
- Reset to default layout option
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## Color in Data Visualization
|
|
142
|
+
|
|
143
|
+
### Palette Types
|
|
144
|
+
|
|
145
|
+
```
|
|
146
|
+
Sequential (low → high):
|
|
147
|
+
□ → ■ Light blue → Dark blue
|
|
148
|
+
Use for: continuous data, heatmaps, density
|
|
149
|
+
|
|
150
|
+
Diverging (negative ← neutral → positive):
|
|
151
|
+
■ ← □ → ■ Red ← White → Blue
|
|
152
|
+
Use for: data with a meaningful midpoint (profit/loss, deviation)
|
|
153
|
+
|
|
154
|
+
Categorical (distinct groups):
|
|
155
|
+
■ ■ ■ ■ ■ Blue, Orange, Green, Red, Purple
|
|
156
|
+
Use for: comparing distinct categories, legend items
|
|
157
|
+
Maximum: 6-8 distinct colors before confusion
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Colorblind-Safe Palettes
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
❌ Red vs. Green (indistinguishable for ~8% of males)
|
|
164
|
+
✅ Blue vs. Orange (safe for most colorblind types)
|
|
165
|
+
|
|
166
|
+
Recommended categorical palette (colorblind-safe):
|
|
167
|
+
#4477AA #EE6677 #228833 #CCBB44 #66CCEE #AA3377
|
|
168
|
+
Blue Rose Green Gold Cyan Purple
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
**Rules:**
|
|
172
|
+
- Never use color as the only differentiator
|
|
173
|
+
- Add patterns, shapes, or labels as secondary encoding
|
|
174
|
+
- Test with colorblind simulation tools
|
|
175
|
+
- Provide alternative text descriptions for all charts
|
|
176
|
+
- Use 3:1 minimum contrast between adjacent data colors
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## Interaction Patterns
|
|
181
|
+
|
|
182
|
+
### Hover Tooltips
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
┌──────────────────────┐
|
|
186
|
+
│ January 2025 │
|
|
187
|
+
│ Revenue: $42,350 │
|
|
188
|
+
│ Users: 1,234 │
|
|
189
|
+
│ ↑ 12% vs Dec 2024 │
|
|
190
|
+
└──────────┬───────────┘
|
|
191
|
+
│
|
|
192
|
+
▁▂▃▅▆▇█▇▆▅▆▇██
|
|
193
|
+
▲ cursor position
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
- Show on hover (desktop) or tap (mobile)
|
|
197
|
+
- Include exact values, context, and comparison
|
|
198
|
+
- Position near cursor without obscuring the data point
|
|
199
|
+
- Follow cursor smoothly (no jittering)
|
|
200
|
+
- Dismiss on mouse-out or tap elsewhere
|
|
201
|
+
|
|
202
|
+
### Drill-Down
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
Overview: Revenue by Region
|
|
206
|
+
┌─────────────────────────┐
|
|
207
|
+
│ 📊 Americas | EMEA │ ← Click "Americas"
|
|
208
|
+
└─────────────────────────┘
|
|
209
|
+
↓
|
|
210
|
+
Detail: Revenue by Country (Americas)
|
|
211
|
+
┌─────────────────────────┐
|
|
212
|
+
│ 📊 US | CA | BR | MX │ ← Click "US"
|
|
213
|
+
└─────────────────────────┘
|
|
214
|
+
↓
|
|
215
|
+
Granular: Revenue by State (US)
|
|
216
|
+
┌─────────────────────────┐
|
|
217
|
+
│ 📊 CA | TX | NY | FL │
|
|
218
|
+
└─────────────────────────┘
|
|
219
|
+
|
|
220
|
+
Breadcrumb: All Regions > Americas > US
|
|
221
|
+
[← Back to Americas]
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
- Clear visual affordance that elements are clickable
|
|
225
|
+
- Breadcrumb navigation showing drill-down path
|
|
226
|
+
- "Back" button to return to previous level
|
|
227
|
+
- Maintain filters and time range across drill-downs
|
|
228
|
+
|
|
229
|
+
### Filtering & Time Range
|
|
230
|
+
|
|
231
|
+
```
|
|
232
|
+
┌─────────────────────────────────────────────────────┐
|
|
233
|
+
│ Time: [Last 30 days ▾] Region: [All ▾] [⟳] │
|
|
234
|
+
│ [Custom range...] Segment: [All ▾] │
|
|
235
|
+
├─────────────────────────────────────────────────────┤
|
|
236
|
+
│ Active filters: [Americas ✕] [Enterprise ✕] [Clear]│
|
|
237
|
+
└─────────────────────────────────────────────────────┘
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
- Persistent filter bar visible at all times
|
|
241
|
+
- Show active filters as removable chips
|
|
242
|
+
- Preset time ranges (Today, 7d, 30d, 90d, YTD, Custom)
|
|
243
|
+
- Filters apply to all dashboard widgets simultaneously
|
|
244
|
+
- "Reset filters" to return to default view
|
|
245
|
+
- Date range picker with calendar and quick presets
|
|
246
|
+
|
|
247
|
+
### Zoom & Pan (Time-Series)
|
|
248
|
+
|
|
249
|
+
- Click-drag to select a time range (brush selection)
|
|
250
|
+
- Mouse wheel to zoom in/out on time axis
|
|
251
|
+
- Reset zoom button always visible when zoomed
|
|
252
|
+
- Mini-timeline showing selected range in context
|
|
253
|
+
|
|
254
|
+
---
|
|
255
|
+
|
|
256
|
+
## Responsive Charts
|
|
257
|
+
|
|
258
|
+
### Mobile Considerations
|
|
259
|
+
|
|
260
|
+
```
|
|
261
|
+
Desktop: Full chart with legend, axis labels, gridlines
|
|
262
|
+
Tablet: Simplified chart, condensed legend
|
|
263
|
+
Mobile: Sparkline or KPI card, tap for full chart
|
|
264
|
+
|
|
265
|
+
Breakpoints:
|
|
266
|
+
> 1024px: Full dashboard grid
|
|
267
|
+
768-1024: 2-column grid, condensed charts
|
|
268
|
+
< 768px: Single column, KPI cards + expandable charts
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
- Prioritize KPI cards on mobile (most information-dense)
|
|
272
|
+
- Collapse charts to sparklines with "Expand" option
|
|
273
|
+
- Horizontal scrolling for wide data tables (with shadow indicators)
|
|
274
|
+
- Stack dashboard columns vertically on narrow screens
|
|
275
|
+
- Touch-friendly tooltips (tap instead of hover)
|
|
276
|
+
|
|
277
|
+
### Small Multiples
|
|
278
|
+
|
|
279
|
+
```
|
|
280
|
+
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
|
|
281
|
+
│US ▁▅█│ │UK ▁▃▅│ │DE ▁▂▃│ │JP ▅▃▁│
|
|
282
|
+
└──────┘ └──────┘ └──────┘ └──────┘
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
- Same scale across all multiples for fair comparison
|
|
286
|
+
- Consistent axes (shared y-axis range)
|
|
287
|
+
- Label each clearly (top-left corner)
|
|
288
|
+
- Effective for comparing trends across many categories
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## Data Tables
|
|
293
|
+
|
|
294
|
+
### Core Features
|
|
295
|
+
|
|
296
|
+
```
|
|
297
|
+
┌──┬──────────┬──────────┬─────────┬────────┬──────┐
|
|
298
|
+
│☐ │ Name ↕ │ Revenue ↓│ Users ↕ │ Conv. │ ··· │
|
|
299
|
+
├──┼──────────┼──────────┼─────────┼────────┼──────┤
|
|
300
|
+
│☐ │ Acme Inc │ $42,350 │ 1,234 │ 3.4% │ ··· │
|
|
301
|
+
│☑ │ Beta Co │ $38,200 │ 987 │ 4.1% │ ··· │
|
|
302
|
+
│☐ │ Gamma │ $35,100 │ 856 │ 2.8% │ ··· │
|
|
303
|
+
├──┴──────────┴──────────┴─────────┴────────┴──────┤
|
|
304
|
+
│ ☑ 1 selected [Export] [Delete] │
|
|
305
|
+
├──────────────────────────────────────────────────┤
|
|
306
|
+
│ Showing 1-25 of 342 [← 1 2 3 ... 14 →] │
|
|
307
|
+
└──────────────────────────────────────────────────┘
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Table Interaction Patterns
|
|
311
|
+
|
|
312
|
+
| Feature | Implementation |
|
|
313
|
+
|---------|---------------|
|
|
314
|
+
| **Sorting** | Click column header, toggle asc/desc, show arrow indicator |
|
|
315
|
+
| **Filtering** | Per-column filter dropdowns or global search |
|
|
316
|
+
| **Pagination** | 10/25/50/100 rows per page, page numbers, prev/next |
|
|
317
|
+
| **Infinite scroll** | For exploration (prefer pagination for data analysis) |
|
|
318
|
+
| **Row selection** | Checkbox column, shift-click for range, bulk actions bar |
|
|
319
|
+
| **Column resizing** | Drag column borders, double-click to auto-fit |
|
|
320
|
+
| **Column reordering** | Drag column headers |
|
|
321
|
+
| **Pinned columns** | Pin first 1-2 columns on horizontal scroll |
|
|
322
|
+
| **Inline editing** | Click to edit cell, Enter to save, Esc to cancel |
|
|
323
|
+
| **Row expansion** | Expand row for nested detail without leaving the table |
|
|
324
|
+
| **Export** | CSV, Excel, PDF — selected rows or all |
|
|
325
|
+
|
|
326
|
+
### Pagination vs. Infinite Scroll
|
|
327
|
+
|
|
328
|
+
| Use Pagination | Use Infinite Scroll |
|
|
329
|
+
|----------------|-------------------|
|
|
330
|
+
| Data analysis tasks | Content browsing |
|
|
331
|
+
| Need to return to specific position | Feed/timeline content |
|
|
332
|
+
| Large datasets (1000+ rows) | Progressive loading |
|
|
333
|
+
| Printable/exportable views | Mobile-first interfaces |
|
|
334
|
+
|
|
335
|
+
---
|
|
336
|
+
|
|
337
|
+
## Empty & Error States
|
|
338
|
+
|
|
339
|
+
### Data States
|
|
340
|
+
|
|
341
|
+
```
|
|
342
|
+
Loading:
|
|
343
|
+
┌─────────────────────────────┐
|
|
344
|
+
│ ░░░░░░░░░░░░░░░░░░░░░░░░ │ ← Skeleton chart
|
|
345
|
+
│ ░░░░░░░░░░░░░░░░░░░░░░░░ │
|
|
346
|
+
│ ░░░░░░░░░░░░░░░░░░░░░░░░ │
|
|
347
|
+
└─────────────────────────────┘
|
|
348
|
+
|
|
349
|
+
No data:
|
|
350
|
+
┌─────────────────────────────┐
|
|
351
|
+
│ 📊 │
|
|
352
|
+
│ No data for this period │
|
|
353
|
+
│ Try a different date range │
|
|
354
|
+
│ or adjust your filters. │
|
|
355
|
+
│ [Reset filters] │
|
|
356
|
+
└─────────────────────────────┘
|
|
357
|
+
|
|
358
|
+
Error:
|
|
359
|
+
┌─────────────────────────────┐
|
|
360
|
+
│ ⚠️ │
|
|
361
|
+
│ Unable to load chart data │
|
|
362
|
+
│ [Retry] [Report issue] │
|
|
363
|
+
└─────────────────────────────┘
|
|
364
|
+
|
|
365
|
+
Partial data:
|
|
366
|
+
┌─────────────────────────────┐
|
|
367
|
+
│ 📈 Revenue (partial data) │
|
|
368
|
+
│ ▁▂▃▅▆▇█▇▆ ░░░ │
|
|
369
|
+
│ ℹ️ Data available through │
|
|
370
|
+
│ Jan 15. Processing... │
|
|
371
|
+
└─────────────────────────────┘
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### Stale Data Indicators
|
|
375
|
+
|
|
376
|
+
- Show "Last updated: X minutes ago" for live dashboards
|
|
377
|
+
- Auto-refresh indicator with countdown
|
|
378
|
+
- Manual refresh button
|
|
379
|
+
- Visual indicator (dimmed chart, banner) for stale data
|
|
380
|
+
- Alert when data is significantly outdated
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
## Accessibility
|
|
385
|
+
|
|
386
|
+
### Chart Accessibility
|
|
387
|
+
|
|
388
|
+
- **Alt text**: Descriptive summary of what the chart shows
|
|
389
|
+
- **Data table alternative**: Provide raw data table for every chart
|
|
390
|
+
- **Keyboard navigation**: Tab through data points, arrow keys within chart
|
|
391
|
+
- **Screen reader**: Announce data points, trends, and outliers
|
|
392
|
+
- **High contrast**: Ensure chart elements meet 3:1 contrast minimum
|
|
393
|
+
- **Pattern fills**: Use patterns in addition to colors for categories
|
|
394
|
+
|
|
395
|
+
```html
|
|
396
|
+
<figure role="img" aria-label="Revenue trend showing 12% growth from January to December 2025, with a peak of $52K in November">
|
|
397
|
+
<canvas id="revenue-chart"></canvas>
|
|
398
|
+
<figcaption>
|
|
399
|
+
Monthly revenue, Jan-Dec 2025.
|
|
400
|
+
<a href="#revenue-data-table">View as data table</a>
|
|
401
|
+
</figcaption>
|
|
402
|
+
</figure>
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Data Table Accessibility
|
|
406
|
+
|
|
407
|
+
- Use semantic `<table>`, `<thead>`, `<tbody>`, `<th scope>` markup
|
|
408
|
+
- `aria-sort` on sortable column headers
|
|
409
|
+
- `aria-selected` on selected rows
|
|
410
|
+
- `aria-describedby` for column filter descriptions
|
|
411
|
+
- Announce row count and current position to screen readers
|
|
412
|
+
- Keyboard navigation: Tab between cells, Enter to activate
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
## Key Metrics
|
|
417
|
+
|
|
418
|
+
| Metric | Target | Context |
|
|
419
|
+
|--------|--------|---------|
|
|
420
|
+
| Dashboard load time | < 3s | Including data fetch |
|
|
421
|
+
| Chart render time | < 500ms | After data available |
|
|
422
|
+
| Tooltip response | < 100ms | On hover/tap |
|
|
423
|
+
| Data refresh interval | 15-60s | Live dashboards |
|
|
424
|
+
| Color contrast (data) | ≥ 3:1 | Adjacent data colors |
|
|
425
|
+
| Max chart categories | 6-8 | Before readability drops |
|
|
426
|
+
| Max KPI cards | 3-6 | Above fold visibility |
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
## Anti-Patterns
|
|
431
|
+
|
|
432
|
+
1. **3D charts** — Add visual noise without informational value
|
|
433
|
+
2. **Pie charts with 10+ slices** — Impossible to compare small slices
|
|
434
|
+
3. **Dual y-axes** — Misleading correlation; use small multiples instead
|
|
435
|
+
4. **Truncated y-axis** — Starting y-axis above zero exaggerates differences
|
|
436
|
+
5. **Rainbow color schemes** — Colorblind-unfriendly and visually noisy
|
|
437
|
+
6. **Chart junk** — Decorative gridlines, borders, and backgrounds
|
|
438
|
+
7. **No loading states** — Blank areas while data fetches
|
|
439
|
+
8. **Auto-refresh without warning** — Dashboard changes while user is analyzing
|
|
440
|
+
9. **Tooltip that obscures data** — Covering the very thing user is trying to read
|
|
441
|
+
10. **Color-only encoding** — No patterns, labels, or shapes as redundant encoding
|
|
442
|
+
|
|
443
|
+
---
|
|
444
|
+
|
|
445
|
+
## Sources
|
|
446
|
+
|
|
447
|
+
- [Edward Tufte: The Visual Display of Quantitative Information](https://www.edwardtufte.com/) — Data visualization theory
|
|
448
|
+
- [Material Design: Data Visualization](https://m3.material.io/styles/color/dynamic/choosing-a-scheme) — Google guidelines
|
|
449
|
+
- [D3.js Gallery](https://d3-graph-gallery.com/) — Implementation patterns
|
|
450
|
+
- [Chartability](https://chartability.fizz.studio/) — Chart accessibility audit toolkit
|
|
451
|
+
- [ColorBrewer](https://colorbrewer2.org/) — Colorblind-safe palettes
|
|
452
|
+
- [Stephen Few: Information Dashboard Design](https://www.perceptualedge.com/) — Dashboard principles
|
|
453
|
+
- [WAI: Images Tutorial](https://www.w3.org/WAI/tutorials/images/complex/) — Complex image accessibility
|