@jaimevalasek/aioson 1.4.0 → 1.5.1
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/CHANGELOG.md +31 -1
- package/LICENSE +661 -21
- package/README.md +3 -1
- package/docs/en/squad-dashboard.md +372 -0
- package/docs/openclaw-bridge.md +308 -0
- package/docs/pt/agentes.md +124 -10
- package/docs/pt/cenarios.md +46 -2
- package/docs/pt/comandos-cli.md +60 -1
- package/docs/pt/inicio-rapido.md +18 -2
- package/docs/pt/squad-dashboard.md +373 -0
- package/docs/testing/genome-2.0-matrix.md +5 -5
- package/docs/testing/genome-2.0-rollout.md +9 -9
- package/package.json +2 -2
- package/src/backup-local.js +74 -0
- package/src/cli.js +98 -0
- package/src/commands/backup-local-cmd.js +25 -0
- package/src/commands/runtime.js +242 -0
- package/src/commands/setup-context.js +7 -2
- package/src/commands/squad-daemon.js +209 -0
- package/src/commands/squad-dashboard.js +39 -0
- package/src/commands/squad-deploy.js +64 -0
- package/src/commands/squad-doctor.js +52 -0
- package/src/commands/squad-mcp.js +270 -0
- package/src/commands/squad-processes.js +56 -0
- package/src/commands/squad-recovery.js +42 -0
- package/src/commands/squad-roi.js +291 -0
- package/src/commands/squad-score.js +250 -0
- package/src/commands/squad-status.js +37 -1
- package/src/commands/squad-validate.js +62 -1
- package/src/commands/squad-webhook.js +160 -0
- package/src/commands/squad-worker.js +191 -0
- package/src/commands/squad-worktrees.js +75 -0
- package/src/commands/web-map.js +70 -0
- package/src/commands/web-scrape.js +71 -0
- package/src/constants.js +8 -0
- package/src/context-writer.js +45 -1
- package/src/i18n/messages/en.js +127 -1
- package/src/i18n/messages/es.js +117 -0
- package/src/i18n/messages/fr.js +117 -0
- package/src/i18n/messages/pt-BR.js +126 -1
- package/src/lib/webhook-server.js +328 -0
- package/src/mcp-connectors/registry.js +602 -0
- package/src/runtime-store.js +259 -2
- package/src/squad/external-session.js +180 -0
- package/src/squad/inter-squad.js +74 -0
- package/src/squad/recovery-context.js +201 -0
- package/src/squad/worktree-manager.js +114 -0
- package/src/squad-daemon.js +490 -0
- package/src/squad-dashboard/api.js +223 -0
- package/src/squad-dashboard/attachment-handler.js +93 -0
- package/src/squad-dashboard/context-monitor.js +157 -0
- package/src/squad-dashboard/execution-logs.js +115 -0
- package/src/squad-dashboard/hunk-review.js +209 -0
- package/src/squad-dashboard/metrics.js +133 -0
- package/src/squad-dashboard/process-monitor.js +125 -0
- package/src/squad-dashboard/renderer.js +858 -0
- package/src/squad-dashboard/server.js +232 -0
- package/src/squad-dashboard/styles.js +525 -0
- package/src/squad-dashboard/token-tracker.js +99 -0
- package/src/web.js +284 -0
- package/src/worker-runner.js +339 -0
- package/template/.aioson/agents/analyst.md +4 -0
- package/template/.aioson/agents/architect.md +4 -0
- package/template/.aioson/agents/dev.md +120 -11
- package/template/.aioson/agents/deyvin.md +8 -0
- package/template/.aioson/agents/neo.md +152 -0
- package/template/.aioson/agents/orache.md +17 -0
- package/template/.aioson/agents/orchestrator.md +26 -0
- package/template/.aioson/agents/product.md +60 -12
- package/template/.aioson/agents/qa.md +1 -0
- package/template/.aioson/agents/setup.md +63 -19
- package/template/.aioson/agents/sheldon.md +603 -0
- package/template/.aioson/agents/squad.md +191 -0
- package/template/.aioson/agents/tester.md +254 -0
- package/template/.aioson/agents/ux-ui.md +12 -0
- package/template/.aioson/config.md +6 -0
- package/template/.aioson/locales/en/agents/analyst.md +8 -0
- package/template/.aioson/locales/en/agents/architect.md +8 -0
- package/template/.aioson/locales/en/agents/dev.md +66 -7
- package/template/.aioson/locales/en/agents/deyvin.md +8 -0
- package/template/.aioson/locales/en/agents/neo.md +8 -0
- package/template/.aioson/locales/en/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/en/agents/qa.md +49 -0
- package/template/.aioson/locales/en/agents/setup.md +2 -1
- package/template/.aioson/locales/en/agents/sheldon.md +340 -0
- package/template/.aioson/locales/en/agents/ux-ui.md +8 -0
- package/template/.aioson/locales/es/agents/analyst.md +8 -0
- package/template/.aioson/locales/es/agents/architect.md +8 -0
- package/template/.aioson/locales/es/agents/dev.md +66 -7
- package/template/.aioson/locales/es/agents/deyvin.md +8 -0
- package/template/.aioson/locales/es/agents/neo.md +48 -0
- package/template/.aioson/locales/es/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/es/agents/qa.md +26 -0
- package/template/.aioson/locales/es/agents/setup.md +2 -1
- package/template/.aioson/locales/es/agents/sheldon.md +192 -0
- package/template/.aioson/locales/es/agents/squad.md +63 -0
- package/template/.aioson/locales/es/agents/ux-ui.md +8 -0
- package/template/.aioson/locales/fr/agents/analyst.md +8 -0
- package/template/.aioson/locales/fr/agents/architect.md +8 -0
- package/template/.aioson/locales/fr/agents/dev.md +66 -7
- package/template/.aioson/locales/fr/agents/deyvin.md +8 -0
- package/template/.aioson/locales/fr/agents/neo.md +48 -0
- package/template/.aioson/locales/fr/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/fr/agents/qa.md +26 -0
- package/template/.aioson/locales/fr/agents/setup.md +2 -1
- package/template/.aioson/locales/fr/agents/sheldon.md +192 -0
- package/template/.aioson/locales/fr/agents/squad.md +63 -0
- package/template/.aioson/locales/fr/agents/ux-ui.md +8 -0
- package/template/.aioson/locales/pt-BR/agents/analyst.md +19 -0
- package/template/.aioson/locales/pt-BR/agents/architect.md +19 -0
- package/template/.aioson/locales/pt-BR/agents/dev.md +75 -12
- package/template/.aioson/locales/pt-BR/agents/deyvin.md +8 -0
- package/template/.aioson/locales/pt-BR/agents/neo.md +147 -0
- package/template/.aioson/locales/pt-BR/agents/orchestrator.md +26 -0
- package/template/.aioson/locales/pt-BR/agents/product.md +8 -3
- package/template/.aioson/locales/pt-BR/agents/qa.md +60 -0
- package/template/.aioson/locales/pt-BR/agents/setup.md +2 -1
- package/template/.aioson/locales/pt-BR/agents/sheldon.md +192 -0
- package/template/.aioson/locales/pt-BR/agents/squad.md +105 -0
- package/template/.aioson/locales/pt-BR/agents/ux-ui.md +8 -0
- package/template/.aioson/schemas/squad-blueprint.schema.json +21 -0
- package/template/.aioson/schemas/squad-manifest.schema.json +178 -1
- package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +205 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -0
- package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -0
- package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +210 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -0
- package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -0
- package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +55 -9
- package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -0
- package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +1 -1
- package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +100 -0
- package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +43 -9
- package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +40 -0
- package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +1 -1
- package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +99 -12
- package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +209 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -0
- package/template/.aioson/skills/design/warm-craft-ui/references/websites.md +289 -0
- package/template/.aioson/skills/premium-visual-design/SKILL.md +83 -0
- package/template/.aioson/skills/premium-visual-design/components/agent-badge.md +92 -0
- package/template/.aioson/skills/premium-visual-design/components/dependency-node.md +102 -0
- package/template/.aioson/skills/premium-visual-design/components/mention-autocomplete.md +136 -0
- package/template/.aioson/skills/premium-visual-design/components/notification-center.md +136 -0
- package/template/.aioson/skills/premium-visual-design/components/review-action-bar.md +188 -0
- package/template/.aioson/skills/premium-visual-design/components/team-switcher.md +131 -0
- package/template/.aioson/skills/premium-visual-design/patterns/agent-message-thread.md +198 -0
- package/template/.aioson/skills/premium-visual-design/patterns/notification-panel.md +275 -0
- package/template/.aioson/skills/premium-visual-design/patterns/review-workflow-ui.md +234 -0
- package/template/.aioson/skills/premium-visual-design/patterns/task-dependency-graph.md +147 -0
- package/template/.aioson/skills/premium-visual-design/tokens/status-extended.md +142 -0
- package/template/.aioson/skills/squad/formats/catalog.json +15 -0
- package/template/.aioson/skills/squad/formats/content/blog-post.md +47 -0
- package/template/.aioson/skills/squad/formats/content/newsletter.md +47 -0
- package/template/.aioson/skills/squad/formats/creative/podcast-script.md +43 -0
- package/template/.aioson/skills/squad/formats/creative/video-script.md +41 -0
- package/template/.aioson/skills/squad/formats/social/instagram-feed.md +42 -0
- package/template/.aioson/skills/squad/formats/social/linkedin-post.md +42 -0
- package/template/.aioson/skills/squad/formats/social/tiktok.md +39 -0
- package/template/.aioson/skills/squad/formats/social/twitter-thread.md +39 -0
- package/template/.aioson/skills/squad/formats/social/youtube-long.md +47 -0
- package/template/.aioson/skills/squad/formats/social/youtube-shorts.md +39 -0
- package/template/.aioson/skills/squad/patterns/multi-platform-pattern.md +108 -0
- package/template/.aioson/skills/squad/patterns/persona-based-pattern.md +98 -0
- package/template/.aioson/skills/squad/patterns/pipeline-pattern.md +106 -0
- package/template/.aioson/skills/squad/patterns/review-loop-pattern.md +81 -0
- package/template/.aioson/skills/squad/references/checklist-templates.md +122 -0
- package/template/.aioson/skills/squad/references/executor-archetypes.md +123 -0
- package/template/.aioson/skills/squad/references/workflow-templates.md +169 -0
- package/template/.aioson/skills/static/debugging-protocol.md +42 -0
- package/template/.aioson/skills/static/git-worktrees.md +36 -0
- package/template/.aioson/tasks/implementation-plan.md +19 -0
- package/template/.aioson/tasks/squad-design.md +28 -0
- package/template/.aioson/tasks/squad-profile.md +48 -0
- package/template/.aioson/tasks/squad-review.md +61 -0
- package/template/.aioson/tasks/squad-task-decompose.md +66 -0
- package/template/.claude/commands/aioson/agent/neo.md +5 -0
- package/template/.claude/commands/aioson/agent/tester.md +5 -0
- package/template/.gemini/GEMINI.md +1 -0
- package/template/.gemini/commands/aios-neo.toml +4 -0
- package/template/.gemini/commands/aios-tester.toml +6 -0
- package/template/AGENTS.md +3 -0
- package/template/CLAUDE.md +5 -2
- package/template/OPENCODE.md +2 -0
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
# Components — Warm Craft UI
|
|
2
|
+
|
|
3
|
+
Reusable component specifications. Every component must use tokens from `design-tokens.md`. Never hardcode colors, sizes, or radii.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Navigation
|
|
8
|
+
|
|
9
|
+
### Top Bar
|
|
10
|
+
```
|
|
11
|
+
height: 64px
|
|
12
|
+
background: var(--bg-surface)
|
|
13
|
+
border-bottom: 1px solid var(--border-subtle)
|
|
14
|
+
shadow: var(--shadow-xs)
|
|
15
|
+
padding: 0 var(--space-6)
|
|
16
|
+
display: flex; align-items: center; justify-content: space-between
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Content slots:
|
|
20
|
+
- **Left:** Logo (mark or wordmark, max-height 28px)
|
|
21
|
+
- **Center:** Search bar (optional, rounded pill `var(--radius-full)`, `var(--bg-elevated)` background, max-width 480px)
|
|
22
|
+
- **Right:** Notification icon + User avatar (rounded full, 36px)
|
|
23
|
+
|
|
24
|
+
### Sidebar Navigation
|
|
25
|
+
```
|
|
26
|
+
width: 240px
|
|
27
|
+
background: var(--bg-void)
|
|
28
|
+
padding: var(--space-4) var(--space-3)
|
|
29
|
+
border-right: 1px solid var(--border-subtle)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Nav item:
|
|
33
|
+
```
|
|
34
|
+
height: var(--control-md) /* 40px */
|
|
35
|
+
padding: 0 var(--space-3)
|
|
36
|
+
border-radius: var(--radius-lg)
|
|
37
|
+
font: var(--font-body), var(--text-sm), var(--weight-medium)
|
|
38
|
+
color: var(--text-secondary)
|
|
39
|
+
transition: var(--transition-fast)
|
|
40
|
+
display: flex; align-items: center; gap: var(--space-3)
|
|
41
|
+
icon: 20px, stroke-width 1.5
|
|
42
|
+
|
|
43
|
+
hover:
|
|
44
|
+
background: var(--bg-elevated)
|
|
45
|
+
color: var(--text-primary)
|
|
46
|
+
|
|
47
|
+
active:
|
|
48
|
+
background: var(--bg-elevated)
|
|
49
|
+
color: var(--text-heading)
|
|
50
|
+
font-weight: var(--weight-semibold)
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Nav section label:
|
|
54
|
+
```
|
|
55
|
+
font: var(--font-body), var(--text-xs), var(--weight-medium)
|
|
56
|
+
color: var(--text-muted)
|
|
57
|
+
letter-spacing: var(--tracking-wider)
|
|
58
|
+
text-transform: uppercase
|
|
59
|
+
padding: var(--space-6) var(--space-3) var(--space-2)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### Bottom Tab Bar (mobile)
|
|
63
|
+
```
|
|
64
|
+
height: 56px
|
|
65
|
+
background: var(--bg-surface)
|
|
66
|
+
border-top: 1px solid var(--border-subtle)
|
|
67
|
+
display: flex; justify-content: space-around; align-items: center
|
|
68
|
+
|
|
69
|
+
tab item:
|
|
70
|
+
icon: 24px
|
|
71
|
+
label: var(--text-xs), var(--weight-medium)
|
|
72
|
+
color: var(--text-muted)
|
|
73
|
+
gap: var(--space-1)
|
|
74
|
+
|
|
75
|
+
active:
|
|
76
|
+
color: var(--accent)
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Cards
|
|
82
|
+
|
|
83
|
+
### Base Card
|
|
84
|
+
```
|
|
85
|
+
background: var(--bg-surface)
|
|
86
|
+
border: 1px solid var(--border-subtle)
|
|
87
|
+
border-radius: var(--radius-xl)
|
|
88
|
+
padding: var(--space-6)
|
|
89
|
+
shadow: var(--shadow-sm)
|
|
90
|
+
transition: var(--transition-base)
|
|
91
|
+
|
|
92
|
+
hover (when clickable):
|
|
93
|
+
shadow: var(--shadow-md)
|
|
94
|
+
transform: translateY(-1px)
|
|
95
|
+
border-color: var(--border-medium)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Stat Card
|
|
99
|
+
```
|
|
100
|
+
extends: Base Card
|
|
101
|
+
padding: var(--space-5) var(--space-6)
|
|
102
|
+
|
|
103
|
+
number:
|
|
104
|
+
font: var(--font-display), var(--text-4xl), var(--weight-bold)
|
|
105
|
+
color: var(--text-heading)
|
|
106
|
+
letter-spacing: var(--tracking-tight)
|
|
107
|
+
|
|
108
|
+
label:
|
|
109
|
+
font: var(--font-body), var(--text-sm), var(--weight-medium)
|
|
110
|
+
color: var(--text-secondary)
|
|
111
|
+
margin-top: var(--space-1)
|
|
112
|
+
|
|
113
|
+
trend:
|
|
114
|
+
font: var(--font-body), var(--text-sm), var(--weight-medium)
|
|
115
|
+
color: var(--semantic-green) or var(--semantic-red)
|
|
116
|
+
includes: arrow icon + percentage
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Feature Card
|
|
120
|
+
```
|
|
121
|
+
extends: Base Card
|
|
122
|
+
padding: var(--space-8)
|
|
123
|
+
border-radius: var(--radius-2xl)
|
|
124
|
+
|
|
125
|
+
icon area:
|
|
126
|
+
width: 48px; height: 48px
|
|
127
|
+
background: var(--accent-subtle)
|
|
128
|
+
border-radius: var(--radius-lg)
|
|
129
|
+
display: flex; align-items: center; justify-content: center
|
|
130
|
+
icon color: var(--accent)
|
|
131
|
+
|
|
132
|
+
title:
|
|
133
|
+
font: var(--font-display), var(--text-xl), var(--weight-semibold)
|
|
134
|
+
color: var(--text-heading)
|
|
135
|
+
margin-top: var(--space-4)
|
|
136
|
+
|
|
137
|
+
description:
|
|
138
|
+
font: var(--font-body), var(--text-base), var(--weight-normal)
|
|
139
|
+
color: var(--text-secondary)
|
|
140
|
+
line-height: var(--leading-relaxed)
|
|
141
|
+
margin-top: var(--space-2)
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### Media Card
|
|
145
|
+
```
|
|
146
|
+
extends: Base Card
|
|
147
|
+
padding: 0
|
|
148
|
+
overflow: hidden
|
|
149
|
+
border-radius: var(--radius-2xl)
|
|
150
|
+
|
|
151
|
+
media:
|
|
152
|
+
width: 100%
|
|
153
|
+
aspect-ratio: 16/9 or 4/3
|
|
154
|
+
object-fit: cover
|
|
155
|
+
|
|
156
|
+
body:
|
|
157
|
+
padding: var(--space-5) var(--space-6)
|
|
158
|
+
|
|
159
|
+
title:
|
|
160
|
+
font: var(--font-display), var(--text-lg), var(--weight-semibold)
|
|
161
|
+
color: var(--text-heading)
|
|
162
|
+
|
|
163
|
+
meta:
|
|
164
|
+
font: var(--font-body), var(--text-sm)
|
|
165
|
+
color: var(--text-secondary)
|
|
166
|
+
margin-top: var(--space-2)
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## Buttons
|
|
172
|
+
|
|
173
|
+
### Primary Button
|
|
174
|
+
```
|
|
175
|
+
height: var(--control-md)
|
|
176
|
+
padding: 0 var(--space-5)
|
|
177
|
+
background: var(--accent)
|
|
178
|
+
color: var(--accent-contrast)
|
|
179
|
+
border: none
|
|
180
|
+
border-radius: var(--radius-lg)
|
|
181
|
+
font: var(--font-body), var(--text-sm), var(--weight-semibold)
|
|
182
|
+
cursor: pointer
|
|
183
|
+
transition: var(--transition-fast)
|
|
184
|
+
|
|
185
|
+
hover:
|
|
186
|
+
background: var(--accent-hover)
|
|
187
|
+
|
|
188
|
+
active:
|
|
189
|
+
transform: scale(0.98)
|
|
190
|
+
|
|
191
|
+
disabled:
|
|
192
|
+
opacity: 0.5
|
|
193
|
+
pointer-events: none
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Secondary Button
|
|
197
|
+
```
|
|
198
|
+
extends: Primary (dimensions, font, radius)
|
|
199
|
+
background: transparent
|
|
200
|
+
color: var(--text-heading)
|
|
201
|
+
border: 1px solid var(--border-medium)
|
|
202
|
+
|
|
203
|
+
hover:
|
|
204
|
+
background: var(--bg-elevated)
|
|
205
|
+
border-color: var(--border-strong)
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Ghost Button
|
|
209
|
+
```
|
|
210
|
+
extends: Primary (dimensions, font)
|
|
211
|
+
background: transparent
|
|
212
|
+
color: var(--text-secondary)
|
|
213
|
+
border: none
|
|
214
|
+
|
|
215
|
+
hover:
|
|
216
|
+
background: var(--bg-elevated)
|
|
217
|
+
color: var(--text-heading)
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Large CTA (hero sections)
|
|
221
|
+
```
|
|
222
|
+
height: var(--control-xl)
|
|
223
|
+
padding: 0 var(--space-8)
|
|
224
|
+
border-radius: var(--radius-xl)
|
|
225
|
+
font-size: var(--text-base)
|
|
226
|
+
shadow: var(--shadow-md)
|
|
227
|
+
|
|
228
|
+
hover:
|
|
229
|
+
shadow: var(--shadow-lg)
|
|
230
|
+
transform: translateY(-1px)
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Forms
|
|
236
|
+
|
|
237
|
+
### Text Input
|
|
238
|
+
```
|
|
239
|
+
height: var(--control-md)
|
|
240
|
+
padding: 0 var(--space-4)
|
|
241
|
+
background: var(--bg-surface)
|
|
242
|
+
border: 1px solid var(--border-medium)
|
|
243
|
+
border-radius: var(--radius-md)
|
|
244
|
+
font: var(--font-body), var(--text-base)
|
|
245
|
+
color: var(--text-heading)
|
|
246
|
+
transition: var(--transition-fast)
|
|
247
|
+
|
|
248
|
+
placeholder:
|
|
249
|
+
color: var(--text-muted)
|
|
250
|
+
|
|
251
|
+
focus:
|
|
252
|
+
border-color: var(--accent)
|
|
253
|
+
box-shadow: 0 0 0 3px var(--accent-dim)
|
|
254
|
+
outline: none
|
|
255
|
+
|
|
256
|
+
error:
|
|
257
|
+
border-color: var(--semantic-red)
|
|
258
|
+
box-shadow: 0 0 0 3px var(--semantic-red-dim)
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
### Label
|
|
262
|
+
```
|
|
263
|
+
font: var(--font-body), var(--text-sm), var(--weight-medium)
|
|
264
|
+
color: var(--text-heading)
|
|
265
|
+
margin-bottom: var(--space-2)
|
|
266
|
+
display: block
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Helper Text
|
|
270
|
+
```
|
|
271
|
+
font: var(--font-body), var(--text-sm)
|
|
272
|
+
color: var(--text-secondary)
|
|
273
|
+
margin-top: var(--space-1)
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Error Message
|
|
277
|
+
```
|
|
278
|
+
font: var(--font-body), var(--text-sm), var(--weight-medium)
|
|
279
|
+
color: var(--semantic-red)
|
|
280
|
+
margin-top: var(--space-1)
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Textarea
|
|
284
|
+
```
|
|
285
|
+
extends: Text Input
|
|
286
|
+
min-height: 120px
|
|
287
|
+
padding: var(--space-3) var(--space-4)
|
|
288
|
+
resize: vertical
|
|
289
|
+
line-height: var(--leading-normal)
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
### Select
|
|
293
|
+
```
|
|
294
|
+
extends: Text Input
|
|
295
|
+
appearance: none
|
|
296
|
+
background-image: chevron-down SVG
|
|
297
|
+
background-position: right var(--space-3) center
|
|
298
|
+
background-repeat: no-repeat
|
|
299
|
+
padding-right: var(--space-10)
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### Checkbox / Radio
|
|
303
|
+
```
|
|
304
|
+
width: 20px; height: 20px
|
|
305
|
+
border: 2px solid var(--border-strong)
|
|
306
|
+
border-radius: var(--radius-sm) (checkbox) or var(--radius-full) (radio)
|
|
307
|
+
transition: var(--transition-fast)
|
|
308
|
+
|
|
309
|
+
checked:
|
|
310
|
+
background: var(--accent)
|
|
311
|
+
border-color: var(--accent)
|
|
312
|
+
color: var(--accent-contrast) (checkmark)
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Toggle Switch
|
|
316
|
+
```
|
|
317
|
+
width: 44px; height: 24px
|
|
318
|
+
border-radius: var(--radius-full)
|
|
319
|
+
background: var(--border-strong)
|
|
320
|
+
transition: var(--transition-base)
|
|
321
|
+
|
|
322
|
+
thumb:
|
|
323
|
+
width: 20px; height: 20px
|
|
324
|
+
border-radius: var(--radius-full)
|
|
325
|
+
background: white
|
|
326
|
+
shadow: var(--shadow-sm)
|
|
327
|
+
|
|
328
|
+
checked:
|
|
329
|
+
background: var(--accent)
|
|
330
|
+
thumb: translate right
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## Data Display
|
|
336
|
+
|
|
337
|
+
### Table
|
|
338
|
+
```
|
|
339
|
+
width: 100%
|
|
340
|
+
border-collapse: separate
|
|
341
|
+
border-spacing: 0
|
|
342
|
+
|
|
343
|
+
header row:
|
|
344
|
+
background: var(--bg-elevated)
|
|
345
|
+
font: var(--font-body), var(--text-sm), var(--weight-semibold)
|
|
346
|
+
color: var(--text-heading)
|
|
347
|
+
text-align: left
|
|
348
|
+
padding: var(--space-3) var(--space-4)
|
|
349
|
+
border-bottom: 1px solid var(--border-medium)
|
|
350
|
+
|
|
351
|
+
body row:
|
|
352
|
+
font: var(--font-body), var(--text-sm)
|
|
353
|
+
color: var(--text-primary)
|
|
354
|
+
padding: var(--space-3) var(--space-4)
|
|
355
|
+
border-bottom: 1px solid var(--border-subtle)
|
|
356
|
+
transition: var(--transition-fast)
|
|
357
|
+
|
|
358
|
+
hover:
|
|
359
|
+
background: var(--bg-elevated)
|
|
360
|
+
|
|
361
|
+
first cell + last cell:
|
|
362
|
+
border-radius: var(--radius-lg) on outer corners (first and last row)
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Badge
|
|
366
|
+
```
|
|
367
|
+
display: inline-flex; align-items: center
|
|
368
|
+
height: 24px
|
|
369
|
+
padding: 0 var(--space-3)
|
|
370
|
+
border-radius: var(--radius-full)
|
|
371
|
+
font: var(--font-body), var(--text-xs), var(--weight-medium)
|
|
372
|
+
|
|
373
|
+
variants:
|
|
374
|
+
default: background: var(--bg-elevated), color: var(--text-secondary)
|
|
375
|
+
accent: background: var(--accent-dim), color: var(--accent-strong)
|
|
376
|
+
success: background: var(--semantic-green-dim), color: var(--semantic-green)
|
|
377
|
+
warning: background: var(--semantic-amber-dim), color: var(--semantic-amber)
|
|
378
|
+
error: background: var(--semantic-red-dim), color: var(--semantic-red)
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
### Avatar
|
|
382
|
+
```
|
|
383
|
+
border-radius: var(--radius-full)
|
|
384
|
+
object-fit: cover
|
|
385
|
+
|
|
386
|
+
sizes:
|
|
387
|
+
xs: 24px
|
|
388
|
+
sm: 32px
|
|
389
|
+
md: 40px
|
|
390
|
+
lg: 56px
|
|
391
|
+
xl: 80px
|
|
392
|
+
|
|
393
|
+
fallback:
|
|
394
|
+
background: var(--accent-dim)
|
|
395
|
+
color: var(--accent)
|
|
396
|
+
font: var(--font-body), var(--weight-semibold)
|
|
397
|
+
display: flex; align-items: center; justify-content: center
|
|
398
|
+
(shows initials)
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### Empty State
|
|
402
|
+
```
|
|
403
|
+
text-align: center
|
|
404
|
+
padding: var(--space-16) var(--space-8)
|
|
405
|
+
|
|
406
|
+
illustration:
|
|
407
|
+
max-width: 240px
|
|
408
|
+
margin: 0 auto var(--space-6)
|
|
409
|
+
(warm, hand-drawn style — never cold geometric)
|
|
410
|
+
|
|
411
|
+
title:
|
|
412
|
+
font: var(--font-display), var(--text-xl), var(--weight-semibold)
|
|
413
|
+
color: var(--text-heading)
|
|
414
|
+
|
|
415
|
+
description:
|
|
416
|
+
font: var(--font-body), var(--text-base)
|
|
417
|
+
color: var(--text-secondary)
|
|
418
|
+
max-width: 400px
|
|
419
|
+
margin: var(--space-2) auto var(--space-6)
|
|
420
|
+
|
|
421
|
+
action:
|
|
422
|
+
Primary Button
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
---
|
|
426
|
+
|
|
427
|
+
## Feedback
|
|
428
|
+
|
|
429
|
+
### Toast / Notification
|
|
430
|
+
```
|
|
431
|
+
background: var(--bg-surface)
|
|
432
|
+
border: 1px solid var(--border-medium)
|
|
433
|
+
border-radius: var(--radius-xl)
|
|
434
|
+
padding: var(--space-4) var(--space-5)
|
|
435
|
+
shadow: var(--shadow-lg)
|
|
436
|
+
max-width: 420px
|
|
437
|
+
display: flex; gap: var(--space-3); align-items: flex-start
|
|
438
|
+
|
|
439
|
+
icon: 20px, colored by semantic type
|
|
440
|
+
title: var(--font-body), var(--text-sm), var(--weight-semibold), var(--text-heading)
|
|
441
|
+
message: var(--font-body), var(--text-sm), var(--text-secondary)
|
|
442
|
+
dismiss: Ghost Button, icon-only, top-right
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### Modal
|
|
446
|
+
```
|
|
447
|
+
background: var(--bg-surface)
|
|
448
|
+
border: 1px solid var(--border-subtle)
|
|
449
|
+
border-radius: var(--radius-2xl)
|
|
450
|
+
shadow: var(--shadow-xl)
|
|
451
|
+
padding: var(--space-8)
|
|
452
|
+
max-width: 480px
|
|
453
|
+
width: 90vw
|
|
454
|
+
|
|
455
|
+
backdrop:
|
|
456
|
+
background: rgba(45, 40, 35, 0.40)
|
|
457
|
+
backdrop-filter: blur(4px)
|
|
458
|
+
|
|
459
|
+
title:
|
|
460
|
+
font: var(--font-display), var(--text-xl), var(--weight-semibold)
|
|
461
|
+
color: var(--text-heading)
|
|
462
|
+
|
|
463
|
+
body:
|
|
464
|
+
font: var(--font-body), var(--text-base)
|
|
465
|
+
color: var(--text-primary)
|
|
466
|
+
margin-top: var(--space-4)
|
|
467
|
+
|
|
468
|
+
actions:
|
|
469
|
+
margin-top: var(--space-6)
|
|
470
|
+
display: flex; gap: var(--space-3); justify-content: flex-end
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Tooltip
|
|
474
|
+
```
|
|
475
|
+
background: var(--text-heading)
|
|
476
|
+
color: var(--text-inverse)
|
|
477
|
+
padding: var(--space-2) var(--space-3)
|
|
478
|
+
border-radius: var(--radius-md)
|
|
479
|
+
font: var(--font-body), var(--text-xs), var(--weight-medium)
|
|
480
|
+
shadow: var(--shadow-md)
|
|
481
|
+
max-width: 240px
|
|
482
|
+
```
|
|
483
|
+
|
|
484
|
+
### Progress Bar
|
|
485
|
+
```
|
|
486
|
+
height: 8px
|
|
487
|
+
background: var(--bg-elevated)
|
|
488
|
+
border-radius: var(--radius-full)
|
|
489
|
+
overflow: hidden
|
|
490
|
+
|
|
491
|
+
fill:
|
|
492
|
+
height: 100%
|
|
493
|
+
background: var(--accent)
|
|
494
|
+
border-radius: var(--radius-full)
|
|
495
|
+
transition: width var(--transition-slow)
|
|
496
|
+
```
|
|
497
|
+
|
|
498
|
+
### Skeleton Loader
|
|
499
|
+
```
|
|
500
|
+
background: var(--bg-elevated)
|
|
501
|
+
border-radius: var(--radius-md) (for text) or var(--radius-xl) (for cards)
|
|
502
|
+
animation: warm-pulse 1.8s ease-in-out infinite
|
|
503
|
+
|
|
504
|
+
@keyframes warm-pulse {
|
|
505
|
+
0%, 100% { opacity: 1; }
|
|
506
|
+
50% { opacity: 0.5; }
|
|
507
|
+
}
|
|
508
|
+
```
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# Dashboard Presets — Warm Craft UI
|
|
2
|
+
|
|
3
|
+
Composition guides for common dashboard types. Every preset uses the App Shell from `patterns.md`, tokens from `design-tokens.md`, and components from `components.md`.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## General Dashboard Rules
|
|
8
|
+
|
|
9
|
+
1. **Never start with four equal stat cards.** Find the hero insight first.
|
|
10
|
+
2. **Charts use warm palette only:** terracotta, sage, amber, slate-blue, muted purple. Never default library colors.
|
|
11
|
+
3. **Serif stat numbers:** all prominent numbers use `var(--font-display)` — this is the visual signature in data-heavy pages.
|
|
12
|
+
4. **Card depth hierarchy:** hero insight gets `var(--shadow-md)`, secondary cards get `var(--shadow-sm)`, tables get `var(--shadow-xs)`.
|
|
13
|
+
5. **Breathing room:** dashboards in Warm Craft are NOT dense. Keep `var(--space-5)` or `var(--space-6)` gap between cards.
|
|
14
|
+
6. **Section headers use serif:** `var(--font-display)`, `var(--text-lg)`, `var(--weight-semibold)`.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Preset 1: Overview Dashboard
|
|
19
|
+
|
|
20
|
+
Use for: general-purpose analytics, admin home, project overview.
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
GREETING HEADER (optional but encouraged)
|
|
24
|
+
"Good morning, {name}" or "Dashboard Overview"
|
|
25
|
+
font: var(--font-display), var(--text-2xl), var(--weight-bold)
|
|
26
|
+
subtitle: date or summary context
|
|
27
|
+
margin-bottom: var(--space-6)
|
|
28
|
+
|
|
29
|
+
HERO INSIGHT (one card, full width or 2/3 width)
|
|
30
|
+
Large serif number + trend + context sentence
|
|
31
|
+
"Revenue this month: $48,250 — 12% above target"
|
|
32
|
+
background: var(--bg-surface)
|
|
33
|
+
border-radius: var(--radius-2xl)
|
|
34
|
+
padding: var(--space-8)
|
|
35
|
+
shadow: var(--shadow-md)
|
|
36
|
+
|
|
37
|
+
SECONDARY STATS (grid, 3-4 columns)
|
|
38
|
+
Stat Card components
|
|
39
|
+
Smaller than hero, var(--shadow-sm)
|
|
40
|
+
|
|
41
|
+
CHART SECTION
|
|
42
|
+
Section header + one or two charts side by side
|
|
43
|
+
Chart container: Base Card with padding var(--space-6)
|
|
44
|
+
Colors: var(--accent), var(--accent-secondary), var(--accent-tertiary), var(--semantic-blue)
|
|
45
|
+
|
|
46
|
+
RECENT ACTIVITY or TABLE
|
|
47
|
+
Section header + Table component or Activity Feed
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
---
|
|
51
|
+
|
|
52
|
+
## Preset 2: Analytics Dashboard
|
|
53
|
+
|
|
54
|
+
Use for: marketing analytics, traffic analysis, conversion tracking, growth metrics.
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
DATE RANGE SELECTOR (top right, next to page title)
|
|
58
|
+
Pill-shaped select or date picker
|
|
59
|
+
background: var(--bg-elevated)
|
|
60
|
+
border-radius: var(--radius-full)
|
|
61
|
+
|
|
62
|
+
METRIC STRIP (3-5 metrics, horizontal scroll on mobile)
|
|
63
|
+
Each: serif number + label + trend badge
|
|
64
|
+
NOT cards — just a clean horizontal row with dividers
|
|
65
|
+
background: var(--bg-surface)
|
|
66
|
+
border-radius: var(--radius-xl)
|
|
67
|
+
padding: var(--space-4) var(--space-6)
|
|
68
|
+
|
|
69
|
+
PRIMARY CHART (full width)
|
|
70
|
+
Area chart or line chart — main KPI over time
|
|
71
|
+
Warm gradient fill under the line
|
|
72
|
+
background: var(--bg-surface) card
|
|
73
|
+
border-radius: var(--radius-xl)
|
|
74
|
+
height: 320px
|
|
75
|
+
|
|
76
|
+
BREAKDOWN SECTION (two columns)
|
|
77
|
+
Left: Donut chart or horizontal bar chart (top sources, categories)
|
|
78
|
+
Right: Table with sortable columns (detailed breakdown)
|
|
79
|
+
|
|
80
|
+
COMPARISON TABLE (full width)
|
|
81
|
+
Table with trend sparklines in cells
|
|
82
|
+
Warm-colored inline mini charts
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Preset 3: Activity Feed Dashboard
|
|
88
|
+
|
|
89
|
+
Use for: social, CRM activity, team updates, notification center, audit log.
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
LAYOUT: Two columns on desktop, single column on mobile
|
|
93
|
+
Left (2/3): Activity Feed
|
|
94
|
+
Right (1/3): Summary + Quick Actions
|
|
95
|
+
|
|
96
|
+
ACTIVITY FEED
|
|
97
|
+
Vertical timeline with warm connecting line
|
|
98
|
+
line: 2px solid var(--border-subtle), left side
|
|
99
|
+
|
|
100
|
+
Each item:
|
|
101
|
+
avatar: var(--space-10) (40px)
|
|
102
|
+
content: user action description
|
|
103
|
+
timestamp: var(--text-xs), var(--text-muted)
|
|
104
|
+
padding: var(--space-4) 0
|
|
105
|
+
border-bottom: 1px solid var(--border-subtle)
|
|
106
|
+
|
|
107
|
+
action types have different icons/colors:
|
|
108
|
+
create: var(--semantic-green) icon
|
|
109
|
+
update: var(--semantic-blue) icon
|
|
110
|
+
delete: var(--semantic-red) icon
|
|
111
|
+
comment: var(--accent) icon
|
|
112
|
+
|
|
113
|
+
SUMMARY SIDEBAR
|
|
114
|
+
Quick stats: Stat Cards (compact variant)
|
|
115
|
+
Quick actions: Stack of Ghost Buttons
|
|
116
|
+
Filters: Badge chips for filtering activity type
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Preset 4: Project Board Dashboard
|
|
122
|
+
|
|
123
|
+
Use for: project management, kanban overview, sprint planning, task tracking.
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
PROJECT HEADER
|
|
127
|
+
Project name (serif, large) + status badge + team avatars (overlapping)
|
|
128
|
+
Progress bar: overall project completion
|
|
129
|
+
margin-bottom: var(--space-6)
|
|
130
|
+
|
|
131
|
+
BOARD VIEW (default)
|
|
132
|
+
Horizontal columns: "To Do" | "In Progress" | "Review" | "Done"
|
|
133
|
+
Column header:
|
|
134
|
+
title + count badge
|
|
135
|
+
font: var(--font-body), var(--text-sm), var(--weight-semibold)
|
|
136
|
+
color: var(--text-heading)
|
|
137
|
+
|
|
138
|
+
Column:
|
|
139
|
+
background: var(--bg-void)
|
|
140
|
+
border-radius: var(--radius-xl)
|
|
141
|
+
padding: var(--space-3)
|
|
142
|
+
min-width: 280px
|
|
143
|
+
|
|
144
|
+
Task card:
|
|
145
|
+
Base Card, compact padding var(--space-4)
|
|
146
|
+
title: var(--text-sm), var(--weight-medium)
|
|
147
|
+
assignee avatar: 24px, bottom-right
|
|
148
|
+
priority badge: colored dot or badge
|
|
149
|
+
due date: var(--text-xs), var(--text-muted)
|
|
150
|
+
|
|
151
|
+
TABLE VIEW (alternative)
|
|
152
|
+
Table component with:
|
|
153
|
+
task name, assignee (avatar + name), status (badge), priority, due date
|
|
154
|
+
row click opens detail panel
|
|
155
|
+
|
|
156
|
+
FOOTER STATS
|
|
157
|
+
Horizontal strip: tasks completed / total, team velocity, overdue count
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Preset 5: Admin Panel Dashboard
|
|
163
|
+
|
|
164
|
+
Use for: system admin, user management, configuration, moderation.
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
SYSTEM STATUS BANNER (conditional — only when issues)
|
|
168
|
+
full width, above content
|
|
169
|
+
background: var(--semantic-amber-dim) or var(--semantic-red-dim)
|
|
170
|
+
border-radius: var(--radius-xl)
|
|
171
|
+
padding: var(--space-4) var(--space-6)
|
|
172
|
+
icon + message + action button
|
|
173
|
+
margin-bottom: var(--space-6)
|
|
174
|
+
|
|
175
|
+
QUICK STATS ROW
|
|
176
|
+
4 Stat Cards: Total Users, Active Today, Pending Reviews, Open Issues
|
|
177
|
+
Compact variant, var(--shadow-sm)
|
|
178
|
+
|
|
179
|
+
USER MANAGEMENT SECTION
|
|
180
|
+
Section header: "Recent Users" + "View All" link
|
|
181
|
+
Table: avatar + name + email + role (badge) + status + last active + actions
|
|
182
|
+
Warm hover, rounded corners
|
|
183
|
+
|
|
184
|
+
SYSTEM HEALTH (two columns)
|
|
185
|
+
Left: simple bar chart (API response times, warm colored)
|
|
186
|
+
Right: recent error log (compact list, severity badges)
|
|
187
|
+
|
|
188
|
+
QUICK ACTIONS
|
|
189
|
+
Grid of action cards (2-3 columns):
|
|
190
|
+
"Manage Users", "Review Queue", "System Settings", "Export Data"
|
|
191
|
+
Feature Card style (icon + title + description)
|
|
192
|
+
Click navigates to section
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Chart Color Palette
|
|
198
|
+
|
|
199
|
+
For all dashboards, use these colors in order. Never use library defaults.
|
|
200
|
+
|
|
201
|
+
```css
|
|
202
|
+
/* Primary data series */
|
|
203
|
+
--chart-1: var(--accent); /* #E07A5F — terracotta */
|
|
204
|
+
--chart-2: var(--accent-secondary); /* #7C9A82 — sage */
|
|
205
|
+
--chart-3: var(--accent-tertiary); /* #D4A76A — amber */
|
|
206
|
+
--chart-4: var(--semantic-blue); /* #5B8DB8 — slate blue */
|
|
207
|
+
--chart-5: var(--semantic-purple); /* #9B8EC4 — muted purple */
|
|
208
|
+
--chart-6: #8B7355; /* warm brown */
|
|
209
|
+
|
|
210
|
+
/* Background fills (use with 0.15 opacity) */
|
|
211
|
+
--chart-fill-1: rgba(224, 122, 95, 0.15);
|
|
212
|
+
--chart-fill-2: rgba(124, 154, 130, 0.15);
|
|
213
|
+
--chart-fill-3: rgba(212, 167, 106, 0.15);
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
Rules:
|
|
217
|
+
- Area charts: use gradient fill from `--chart-fill-*` to transparent
|
|
218
|
+
- Bar charts: solid `--chart-*` colors, rounded top corners (`border-radius: 4px 4px 0 0`)
|
|
219
|
+
- Donut charts: `--chart-*` colors, warm gray for remaining (`var(--bg-elevated)`)
|
|
220
|
+
- Line charts: 2px stroke, dot markers on hover only
|
|
221
|
+
- Grid lines: `var(--border-subtle)`, never dark
|
|
222
|
+
- Axis labels: `var(--text-muted)`, `var(--text-xs)`
|
|
223
|
+
- Tooltips: uses Tooltip component from `components.md`
|