open-ds 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +66 -2
- package/assets/schemes/accessible-first.json +3093 -0
- package/assets/schemes/brand-expressive.json +3124 -0
- package/assets/schemes/content-first.json +3110 -0
- package/assets/schemes/dense-data.json +3489 -0
- package/assets/schemes/grammar.json +3903 -0
- package/assets/schemes/multi-brand.json +4359 -0
- package/assets/skills/open-ds/SKILL.md +50 -0
- package/assets/skills/open-ds-build/SKILL.md +19 -0
- package/assets/skills/open-ds-change/SKILL.md +19 -0
- package/assets/skills/open-ds-choose/SKILL.md +18 -0
- package/assets/skills/open-ds-review/SKILL.md +22 -0
- package/assets/skills/open-ds-write/SKILL.md +13 -0
- package/assets/stories/accordion.stories.tsx +46 -0
- package/assets/stories/alert-dialog.stories.tsx +65 -0
- package/assets/stories/alert.stories.tsx +44 -0
- package/assets/stories/aspect-ratio.stories.tsx +37 -0
- package/assets/stories/avatar.stories.tsx +42 -0
- package/assets/stories/badge.stories.tsx +39 -0
- package/assets/stories/breadcrumb.stories.tsx +54 -0
- package/assets/stories/button.stories.tsx +46 -0
- package/assets/stories/calendar.stories.tsx +30 -0
- package/assets/stories/card.stories.tsx +50 -0
- package/assets/stories/carousel.stories.tsx +64 -0
- package/assets/stories/chart.stories.tsx +61 -0
- package/assets/stories/checkbox.stories.tsx +29 -0
- package/assets/stories/collapsible.stories.tsx +39 -0
- package/assets/stories/combobox.stories.tsx +57 -0
- package/assets/stories/command.stories.tsx +60 -0
- package/assets/stories/context-menu.stories.tsx +55 -0
- package/assets/stories/data-table.stories.tsx +93 -0
- package/assets/stories/date-picker.stories.tsx +27 -0
- package/assets/stories/dialog.stories.tsx +70 -0
- package/assets/stories/drawer.stories.tsx +62 -0
- package/assets/stories/dropdown-menu.stories.tsx +65 -0
- package/assets/stories/empty.stories.tsx +39 -0
- package/assets/stories/field.stories.tsx +42 -0
- package/assets/stories/form.stories.tsx +56 -0
- package/assets/stories/input-group.stories.tsx +41 -0
- package/assets/stories/input-otp.stories.tsx +48 -0
- package/assets/stories/input.stories.tsx +32 -0
- package/assets/stories/kbd.stories.tsx +30 -0
- package/assets/stories/label.stories.tsx +26 -0
- package/assets/stories/native-select.stories.tsx +39 -0
- package/assets/stories/navigation-menu.stories.tsx +41 -0
- package/assets/stories/pagination.stories.tsx +61 -0
- package/assets/stories/popover.stories.tsx +37 -0
- package/assets/stories/progress.stories.tsx +30 -0
- package/assets/stories/radio-group.stories.tsx +45 -0
- package/assets/stories/resizable.stories.tsx +54 -0
- package/assets/stories/scroll-area.stories.tsx +47 -0
- package/assets/stories/select.stories.tsx +57 -0
- package/assets/stories/separator.stories.tsx +28 -0
- package/assets/stories/sheet.stories.tsx +46 -0
- package/assets/stories/sidebar.stories.tsx +62 -0
- package/assets/stories/skeleton.stories.tsx +27 -0
- package/assets/stories/slider.stories.tsx +44 -0
- package/assets/stories/spinner.stories.tsx +25 -0
- package/assets/stories/switch.stories.tsx +29 -0
- package/assets/stories/table.stories.tsx +97 -0
- package/assets/stories/tabs.stories.tsx +55 -0
- package/assets/stories/textarea.stories.tsx +28 -0
- package/assets/stories/toast.stories.tsx +30 -0
- package/assets/stories/toggle-group.stories.tsx +41 -0
- package/assets/stories/toggle.stories.tsx +20 -0
- package/assets/stories/tooltip.stories.tsx +49 -0
- package/assets/tokens/accessible-first/content.json +32 -0
- package/assets/tokens/accessible-first/dark.tokens.json +581 -0
- package/assets/tokens/accessible-first/light.tokens.json +581 -0
- package/assets/tokens/accessible-first/shadcn.css +21 -0
- package/assets/tokens/accessible-first/theme.css +101 -0
- package/assets/tokens/accessible-first/tokens.css +331 -0
- package/assets/tokens/accessible-first/tokens.json +1616 -0
- package/assets/tokens/accessible-first/tokens.scoped.css +333 -0
- package/assets/tokens/brand-expressive/content.json +32 -0
- package/assets/tokens/brand-expressive/dark.tokens.json +585 -0
- package/assets/tokens/brand-expressive/light.tokens.json +585 -0
- package/assets/tokens/brand-expressive/shadcn.css +21 -0
- package/assets/tokens/brand-expressive/theme.css +101 -0
- package/assets/tokens/brand-expressive/tokens.css +331 -0
- package/assets/tokens/brand-expressive/tokens.json +1651 -0
- package/assets/tokens/brand-expressive/tokens.scoped.css +333 -0
- package/assets/tokens/content-first/content.json +32 -0
- package/assets/tokens/content-first/dark.tokens.json +582 -0
- package/assets/tokens/content-first/light.tokens.json +582 -0
- package/assets/tokens/content-first/shadcn.css +21 -0
- package/assets/tokens/content-first/theme.css +101 -0
- package/assets/tokens/content-first/tokens.css +331 -0
- package/assets/tokens/content-first/tokens.json +1631 -0
- package/assets/tokens/content-first/tokens.scoped.css +333 -0
- package/assets/tokens/dense-data/content.json +32 -0
- package/assets/tokens/dense-data/dark.tokens.json +580 -0
- package/assets/tokens/dense-data/light.tokens.json +580 -0
- package/assets/tokens/dense-data/shadcn.css +21 -0
- package/assets/tokens/dense-data/theme.css +101 -0
- package/assets/tokens/dense-data/tokens.css +331 -0
- package/assets/tokens/dense-data/tokens.json +1623 -0
- package/assets/tokens/dense-data/tokens.scoped.css +333 -0
- package/assets/tokens/index.json +143 -0
- package/assets/tokens/multi-brand/aster-dark.tokens.json +625 -0
- package/assets/tokens/multi-brand/aster-light.tokens.json +625 -0
- package/assets/tokens/multi-brand/birch-dark.tokens.json +625 -0
- package/assets/tokens/multi-brand/birch-light.tokens.json +625 -0
- package/assets/tokens/multi-brand/content.json +32 -0
- package/assets/tokens/multi-brand/coral-dark.tokens.json +625 -0
- package/assets/tokens/multi-brand/coral-light.tokens.json +625 -0
- package/assets/tokens/multi-brand/shadcn.css +21 -0
- package/assets/tokens/multi-brand/theme.css +101 -0
- package/assets/tokens/multi-brand/tokens.css +1002 -0
- package/assets/tokens/multi-brand/tokens.json +1754 -0
- package/assets/tokens/multi-brand/tokens.scoped.css +1022 -0
- package/assets/tokens/shadcn-map.json +34 -0
- package/assets/ui/components/accordion.tsx +60 -0
- package/assets/ui/components/alert-dialog.tsx +171 -0
- package/assets/ui/components/alert.tsx +56 -0
- package/assets/ui/components/aspect-ratio.tsx +17 -0
- package/assets/ui/components/avatar.tsx +96 -0
- package/assets/ui/components/badge.tsx +36 -0
- package/assets/ui/components/breadcrumb.tsx +99 -0
- package/assets/ui/components/button.tsx +53 -0
- package/assets/ui/components/calendar.tsx +169 -0
- package/assets/ui/components/card.tsx +72 -0
- package/assets/ui/components/carousel.tsx +224 -0
- package/assets/ui/components/chart.tsx +315 -0
- package/assets/ui/components/checkbox.tsx +29 -0
- package/assets/ui/components/collapsible.tsx +25 -0
- package/assets/ui/components/combobox.tsx +275 -0
- package/assets/ui/components/command.tsx +145 -0
- package/assets/ui/components/context-menu.tsx +218 -0
- package/assets/ui/components/data-table.tsx +307 -0
- package/assets/ui/components/date-picker.tsx +79 -0
- package/assets/ui/components/dialog.tsx +68 -0
- package/assets/ui/components/drawer.tsx +115 -0
- package/assets/ui/components/dropdown-menu.tsx +58 -0
- package/assets/ui/components/empty.tsx +92 -0
- package/assets/ui/components/field.tsx +234 -0
- package/assets/ui/components/form.tsx +146 -0
- package/assets/ui/components/input-group.tsx +154 -0
- package/assets/ui/components/input-otp.tsx +75 -0
- package/assets/ui/components/input.tsx +25 -0
- package/assets/ui/components/kbd.tsx +30 -0
- package/assets/ui/components/label.tsx +22 -0
- package/assets/ui/components/native-select.tsx +59 -0
- package/assets/ui/components/navigation-menu.tsx +149 -0
- package/assets/ui/components/pagination.tsx +108 -0
- package/assets/ui/components/popover.tsx +61 -0
- package/assets/ui/components/progress.tsx +31 -0
- package/assets/ui/components/radio-group.tsx +40 -0
- package/assets/ui/components/resizable.tsx +54 -0
- package/assets/ui/components/scroll-area.tsx +55 -0
- package/assets/ui/components/select.tsx +81 -0
- package/assets/ui/components/separator.tsx +35 -0
- package/assets/ui/components/sheet.tsx +114 -0
- package/assets/ui/components/sidebar.tsx +685 -0
- package/assets/ui/components/skeleton.tsx +15 -0
- package/assets/ui/components/slider.tsx +70 -0
- package/assets/ui/components/spinner.tsx +16 -0
- package/assets/ui/components/switch.tsx +32 -0
- package/assets/ui/components/table.tsx +78 -0
- package/assets/ui/components/tabs.tsx +49 -0
- package/assets/ui/components/textarea.tsx +25 -0
- package/assets/ui/components/toast.tsx +54 -0
- package/assets/ui/components/toggle-group.tsx +88 -0
- package/assets/ui/components/toggle.tsx +48 -0
- package/assets/ui/components/tooltip.tsx +34 -0
- package/assets/ui/lib/use-mobile.ts +20 -0
- package/assets/ui/lib/utils.ts +7 -0
- package/assets/ui/styles.css +27 -0
- package/bin/open-ds.js +6 -0
- package/package.json +56 -4
- package/src/agents.mjs +150 -0
- package/src/cli.mjs +445 -0
- package/src/components.mjs +69 -0
- package/src/context.mjs +143 -0
- package/src/create.mjs +377 -0
- package/src/docs.mjs +570 -0
- package/src/guidance.mjs +63 -0
- package/src/index.mjs +20 -0
- package/src/mcp.mjs +660 -0
- package/src/readmes.mjs +106 -0
- package/src/schemes.mjs +188 -0
- package/src/tokens.mjs +127 -0
- package/templates/project/.github/workflows/ci.yml +15 -0
- package/templates/project/.storybook/component-docs.mdx +26 -0
- package/templates/project/.storybook/main.ts +17 -0
- package/templates/project/.storybook/manager-head.html +3 -0
- package/templates/project/.storybook/manager.ts +37 -0
- package/templates/project/.storybook/preview-head.html +3 -0
- package/templates/project/.storybook/preview.tsx +82 -0
- package/templates/project/docs/docusaurus.config.ts +64 -0
- package/templates/project/docs/sidebars.ts +8 -0
- package/templates/project/docs/src/css/custom.css +275 -0
- package/templates/project/gitignore +6 -0
- package/templates/project/src/styles/index.css +16 -0
- package/templates/project/src/vite-env.d.ts +7 -0
- package/templates/project/stories/docs-blocks.tsx +190 -0
- package/templates/project/stories/samples.tsx +102 -0
- package/templates/project/stories/usage.tsx +31 -0
- package/templates/project/tokens/build.mjs +468 -0
- package/templates/project/tsconfig.json +15 -0
|
@@ -0,0 +1,3903 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../schema/grammar.schema.json",
|
|
3
|
+
"id": "open-ds-grammar",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"status": "draft",
|
|
6
|
+
"description": "The Open DS grammar: a finite set of questions a design system must answer. Reasons come first (business, people, content, tasks, human factors, outcomes, brand, use scenarios, team). Scopes follow, from typography to voice and tone. Every scope answers the same five method questions (roles, how many, how defined, values, lands in) and has the same parts: the tokens it owns, the components it lands in and its situations. Each scheme answers every question, and each answer says why and which earlier answers it follows from. Situations are the moments where people need to know what to use; each scheme answers them too. Component keys are the shared component API every scheme fills.",
|
|
7
|
+
"ai": {
|
|
8
|
+
"use_when": "You need the list of questions behind a design system, or the meaning of a question id such as typography.definition or a situation id such as number-in-table.",
|
|
9
|
+
"how_to_read": "Reasons are answered first. A scope answer lists in 'because' the answers that pulled it. Scope question ids are <scope>.<method>, so typography.values and voice.values answer the same kind of question. Tokens follow from the answers. Components read only component keys. Written text in a scheme (voice, scenarios) lists in 'follows' the answers it was written from."
|
|
10
|
+
},
|
|
11
|
+
"layers": [
|
|
12
|
+
{
|
|
13
|
+
"id": "reasons",
|
|
14
|
+
"description": "Why the system exists: product, people, content, tasks, human factors, outcomes, brand, use scenarios, team."
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "scopes",
|
|
18
|
+
"description": "The design decisions: typography, color, spacing, shape, elevation, motion, iconography, theming, accessibility, naming, voice and tone, components. Each answers the five method questions."
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "tokens",
|
|
22
|
+
"description": "Primitives are the options. Semantics are the decisions, in light and dark. Brands and modes are themes."
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "component-api",
|
|
26
|
+
"description": "One key per component element, variant and state. Every scheme fills every key."
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"methods": [
|
|
30
|
+
{
|
|
31
|
+
"id": "roles",
|
|
32
|
+
"title": "Roles",
|
|
33
|
+
"description": "Which roles the scope needs. Each role becomes a group of decisions."
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "count",
|
|
37
|
+
"title": "How many",
|
|
38
|
+
"description": "How many steps, levels or variants each role gets."
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "definition",
|
|
42
|
+
"title": "How defined",
|
|
43
|
+
"description": "The rule that produces the values: a scale, a base unit, a style or a policy."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"id": "values",
|
|
47
|
+
"title": "Values",
|
|
48
|
+
"description": "Where the values sit, as a word. The exact values live in the tokens."
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "lands",
|
|
52
|
+
"title": "Lands in",
|
|
53
|
+
"description": "Where the scope does its most visible work in the product."
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"reasons": [
|
|
57
|
+
{
|
|
58
|
+
"id": "business",
|
|
59
|
+
"kind": "reason",
|
|
60
|
+
"title": "Business and product",
|
|
61
|
+
"description": "Why the product exists and what it does for the business. It frames every later answer.",
|
|
62
|
+
"questions": [
|
|
63
|
+
{
|
|
64
|
+
"id": "business.q1",
|
|
65
|
+
"text": "What does the product do for the business?",
|
|
66
|
+
"description": "The main job of the product. Operating tools, publishing, selling and public services pull the system in different directions.",
|
|
67
|
+
"options": [
|
|
68
|
+
{
|
|
69
|
+
"id": "operate",
|
|
70
|
+
"label": "Runs daily operations"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"id": "inform",
|
|
74
|
+
"label": "Informs and publishes"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"id": "convert",
|
|
78
|
+
"label": "Sells and converts"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"id": "serve-public",
|
|
82
|
+
"label": "Serves the public"
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "business.q2",
|
|
88
|
+
"text": "How many brands or products share the system?",
|
|
89
|
+
"description": "One brand keeps the system small. Many brands need a theming layer.",
|
|
90
|
+
"options": [
|
|
91
|
+
{
|
|
92
|
+
"id": "one",
|
|
93
|
+
"label": "One"
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"id": "few",
|
|
97
|
+
"label": "A few"
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"id": "many",
|
|
101
|
+
"label": "Many"
|
|
102
|
+
}
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
]
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"id": "people",
|
|
109
|
+
"kind": "reason",
|
|
110
|
+
"title": "People and work context",
|
|
111
|
+
"description": "Who uses the product, how often and with what abilities.",
|
|
112
|
+
"questions": [
|
|
113
|
+
{
|
|
114
|
+
"id": "people.q1",
|
|
115
|
+
"text": "Who uses it most?",
|
|
116
|
+
"description": "The main audience. Experts learn an interface; occasional visitors must understand it at first sight.",
|
|
117
|
+
"options": [
|
|
118
|
+
{
|
|
119
|
+
"id": "experts",
|
|
120
|
+
"label": "Daily experts"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"id": "occasional",
|
|
124
|
+
"label": "Occasional visitors"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"id": "everyone",
|
|
128
|
+
"label": "Everyone, including people with disabilities"
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "customers",
|
|
132
|
+
"label": "Customers who choose us"
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"id": "people.q2",
|
|
138
|
+
"text": "What accessibility level do we commit to?",
|
|
139
|
+
"description": "The accessibility promise. It sets floors for contrast, targets and states.",
|
|
140
|
+
"options": [
|
|
141
|
+
{
|
|
142
|
+
"id": "aa",
|
|
143
|
+
"label": "AA"
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"id": "aa-plus",
|
|
147
|
+
"label": "AA, with AAA where it is cheap"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"id": "aaa",
|
|
151
|
+
"label": "AAA"
|
|
152
|
+
}
|
|
153
|
+
]
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
"id": "content",
|
|
159
|
+
"kind": "reason",
|
|
160
|
+
"title": "Content and data",
|
|
161
|
+
"description": "What fills the screen.",
|
|
162
|
+
"questions": [
|
|
163
|
+
{
|
|
164
|
+
"id": "content.q1",
|
|
165
|
+
"text": "What is the main content?",
|
|
166
|
+
"description": "Numbers, long text, forms and media each need different type, spacing and color.",
|
|
167
|
+
"options": [
|
|
168
|
+
{
|
|
169
|
+
"id": "numbers",
|
|
170
|
+
"label": "Numbers and records"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"id": "long-text",
|
|
174
|
+
"label": "Long-form text"
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"id": "forms",
|
|
178
|
+
"label": "Forms and tasks"
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
"id": "media",
|
|
182
|
+
"label": "Images and campaigns"
|
|
183
|
+
}
|
|
184
|
+
]
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
"id": "content.q2",
|
|
188
|
+
"text": "How much is on one screen?",
|
|
189
|
+
"description": "Information density. It drives spacing, type size and how groups separate.",
|
|
190
|
+
"options": [
|
|
191
|
+
{
|
|
192
|
+
"id": "a-lot",
|
|
193
|
+
"label": "A lot"
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"id": "moderate",
|
|
197
|
+
"label": "A moderate amount"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"id": "one-idea",
|
|
201
|
+
"label": "One idea at a time"
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
}
|
|
205
|
+
]
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"id": "tasks",
|
|
209
|
+
"kind": "reason",
|
|
210
|
+
"title": "Tasks and flows",
|
|
211
|
+
"description": "What people do with the content.",
|
|
212
|
+
"questions": [
|
|
213
|
+
{
|
|
214
|
+
"id": "tasks.q1",
|
|
215
|
+
"text": "What is the main task?",
|
|
216
|
+
"description": "The task that must be fastest. Comparing, reading, completing and exploring need different layouts.",
|
|
217
|
+
"options": [
|
|
218
|
+
{
|
|
219
|
+
"id": "compare",
|
|
220
|
+
"label": "Scan and compare"
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"id": "read",
|
|
224
|
+
"label": "Read start to end"
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"id": "complete",
|
|
228
|
+
"label": "Complete a form"
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"id": "explore",
|
|
232
|
+
"label": "Browse and explore"
|
|
233
|
+
}
|
|
234
|
+
]
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"id": "tasks.q2",
|
|
238
|
+
"text": "How often do people repeat actions?",
|
|
239
|
+
"description": "Repetition. Frequent actions must be quiet and fast; rare ones can be explicit.",
|
|
240
|
+
"options": [
|
|
241
|
+
{
|
|
242
|
+
"id": "constantly",
|
|
243
|
+
"label": "Constantly"
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"id": "sometimes",
|
|
247
|
+
"label": "Sometimes"
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"id": "rarely",
|
|
251
|
+
"label": "Rarely"
|
|
252
|
+
}
|
|
253
|
+
]
|
|
254
|
+
}
|
|
255
|
+
]
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"id": "human",
|
|
259
|
+
"kind": "reason",
|
|
260
|
+
"title": "Human factors",
|
|
261
|
+
"description": "Attention, memory and effort.",
|
|
262
|
+
"questions": [
|
|
263
|
+
{
|
|
264
|
+
"id": "human.q1",
|
|
265
|
+
"text": "What must the interface protect?",
|
|
266
|
+
"description": "The scarce human resource on this product.",
|
|
267
|
+
"options": [
|
|
268
|
+
{
|
|
269
|
+
"id": "place",
|
|
270
|
+
"label": "People keep their place"
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
"id": "attention",
|
|
274
|
+
"label": "Attention on the content"
|
|
275
|
+
},
|
|
276
|
+
{
|
|
277
|
+
"id": "effort",
|
|
278
|
+
"label": "Low effort to understand"
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"id": "delight",
|
|
282
|
+
"label": "Delight"
|
|
283
|
+
}
|
|
284
|
+
]
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"id": "human.q2",
|
|
288
|
+
"text": "How do people recall the interface?",
|
|
289
|
+
"description": "Learned interfaces can rely on recognition. Fresh visits need explicit labels.",
|
|
290
|
+
"options": [
|
|
291
|
+
{
|
|
292
|
+
"id": "learned",
|
|
293
|
+
"label": "They learn it and recognise it"
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
"id": "fresh",
|
|
297
|
+
"label": "They see it fresh each time"
|
|
298
|
+
}
|
|
299
|
+
]
|
|
300
|
+
}
|
|
301
|
+
]
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
"id": "outcomes",
|
|
305
|
+
"kind": "reason",
|
|
306
|
+
"title": "Outcomes",
|
|
307
|
+
"description": "What success looks like and what failure costs.",
|
|
308
|
+
"questions": [
|
|
309
|
+
{
|
|
310
|
+
"id": "outcomes.q1",
|
|
311
|
+
"text": "Which outcome matters most?",
|
|
312
|
+
"description": "The measure the system optimises for.",
|
|
313
|
+
"options": [
|
|
314
|
+
{
|
|
315
|
+
"id": "time-on-task",
|
|
316
|
+
"label": "Time on task"
|
|
317
|
+
},
|
|
318
|
+
{
|
|
319
|
+
"id": "reading-comfort",
|
|
320
|
+
"label": "Reading comfort"
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
"id": "completion",
|
|
324
|
+
"label": "Completion without errors"
|
|
325
|
+
},
|
|
326
|
+
{
|
|
327
|
+
"id": "engagement",
|
|
328
|
+
"label": "Engagement"
|
|
329
|
+
}
|
|
330
|
+
]
|
|
331
|
+
},
|
|
332
|
+
{
|
|
333
|
+
"id": "outcomes.q2",
|
|
334
|
+
"text": "What is a costly mistake?",
|
|
335
|
+
"description": "The error the system must make hard.",
|
|
336
|
+
"options": [
|
|
337
|
+
{
|
|
338
|
+
"id": "wrong-record",
|
|
339
|
+
"label": "Acting on the wrong record"
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
"id": "lost-place",
|
|
343
|
+
"label": "Losing your place"
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"id": "failed-task",
|
|
347
|
+
"label": "A task that fails"
|
|
348
|
+
},
|
|
349
|
+
{
|
|
350
|
+
"id": "off-brand",
|
|
351
|
+
"label": "Looking off-brand"
|
|
352
|
+
}
|
|
353
|
+
]
|
|
354
|
+
}
|
|
355
|
+
]
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
"id": "brand",
|
|
359
|
+
"kind": "reason",
|
|
360
|
+
"title": "Brand",
|
|
361
|
+
"description": "How the brand should feel in the interface.",
|
|
362
|
+
"questions": [
|
|
363
|
+
{
|
|
364
|
+
"id": "brand.q1",
|
|
365
|
+
"text": "What should the brand feel like?",
|
|
366
|
+
"description": "The feeling the interface carries.",
|
|
367
|
+
"options": [
|
|
368
|
+
{
|
|
369
|
+
"id": "precise",
|
|
370
|
+
"label": "Precise"
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
"id": "warm",
|
|
374
|
+
"label": "Warm"
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
"id": "calm-clear",
|
|
378
|
+
"label": "Calm and clear"
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
"id": "neutral",
|
|
382
|
+
"label": "Neutral and adaptable"
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
"id": "bold",
|
|
386
|
+
"label": "Bold"
|
|
387
|
+
}
|
|
388
|
+
]
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
"id": "brand.q2",
|
|
392
|
+
"text": "How visible is the brand in the interface?",
|
|
393
|
+
"description": "How much brand expression the product carries.",
|
|
394
|
+
"options": [
|
|
395
|
+
{
|
|
396
|
+
"id": "quiet",
|
|
397
|
+
"label": "Quiet"
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"id": "present",
|
|
401
|
+
"label": "Present"
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
"id": "loud",
|
|
405
|
+
"label": "Loud"
|
|
406
|
+
}
|
|
407
|
+
]
|
|
408
|
+
}
|
|
409
|
+
]
|
|
410
|
+
},
|
|
411
|
+
{
|
|
412
|
+
"id": "scenarios",
|
|
413
|
+
"kind": "reason",
|
|
414
|
+
"title": "Use scenarios",
|
|
415
|
+
"description": "Where and for how long people use the product. Written scenarios follow from these answers.",
|
|
416
|
+
"questions": [
|
|
417
|
+
{
|
|
418
|
+
"id": "scenarios.q1",
|
|
419
|
+
"text": "Where do people use it?",
|
|
420
|
+
"description": "The place and device. A desk with a mouse, a phone on the move, or anything at all.",
|
|
421
|
+
"options": [
|
|
422
|
+
{
|
|
423
|
+
"id": "desk",
|
|
424
|
+
"label": "At a desk"
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"id": "on-the-move",
|
|
428
|
+
"label": "On the move"
|
|
429
|
+
},
|
|
430
|
+
{
|
|
431
|
+
"id": "anywhere",
|
|
432
|
+
"label": "Anywhere, on any device"
|
|
433
|
+
}
|
|
434
|
+
]
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
"id": "scenarios.q2",
|
|
438
|
+
"text": "How long is one visit?",
|
|
439
|
+
"description": "Session length. All-day use rewards learning; short visits must work at first sight.",
|
|
440
|
+
"options": [
|
|
441
|
+
{
|
|
442
|
+
"id": "all-day",
|
|
443
|
+
"label": "All day"
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
"id": "one-sitting",
|
|
447
|
+
"label": "One sitting"
|
|
448
|
+
},
|
|
449
|
+
{
|
|
450
|
+
"id": "short",
|
|
451
|
+
"label": "A few minutes"
|
|
452
|
+
}
|
|
453
|
+
]
|
|
454
|
+
}
|
|
455
|
+
]
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
"id": "team",
|
|
459
|
+
"kind": "reason",
|
|
460
|
+
"title": "Team and delivery",
|
|
461
|
+
"description": "Who keeps the system right, and how fast it changes.",
|
|
462
|
+
"questions": [
|
|
463
|
+
{
|
|
464
|
+
"id": "team.q1",
|
|
465
|
+
"text": "Who maintains the system?",
|
|
466
|
+
"description": "Team size limits how many tokens and variants can stay correct.",
|
|
467
|
+
"options": [
|
|
468
|
+
{
|
|
469
|
+
"id": "small",
|
|
470
|
+
"label": "A small team"
|
|
471
|
+
},
|
|
472
|
+
{
|
|
473
|
+
"id": "platform",
|
|
474
|
+
"label": "A platform team"
|
|
475
|
+
},
|
|
476
|
+
{
|
|
477
|
+
"id": "agency",
|
|
478
|
+
"label": "An agency"
|
|
479
|
+
}
|
|
480
|
+
]
|
|
481
|
+
},
|
|
482
|
+
{
|
|
483
|
+
"id": "team.q2",
|
|
484
|
+
"text": "How fast does it change?",
|
|
485
|
+
"description": "Change rate. Fast change needs a stable component API and a flexible theme.",
|
|
486
|
+
"options": [
|
|
487
|
+
{
|
|
488
|
+
"id": "stable",
|
|
489
|
+
"label": "Rarely"
|
|
490
|
+
},
|
|
491
|
+
{
|
|
492
|
+
"id": "monthly",
|
|
493
|
+
"label": "Every month"
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
"id": "campaign",
|
|
497
|
+
"label": "Every campaign"
|
|
498
|
+
}
|
|
499
|
+
]
|
|
500
|
+
}
|
|
501
|
+
]
|
|
502
|
+
}
|
|
503
|
+
],
|
|
504
|
+
"scopes": [
|
|
505
|
+
{
|
|
506
|
+
"id": "typography",
|
|
507
|
+
"kind": "scope",
|
|
508
|
+
"title": "Typography",
|
|
509
|
+
"description": "How text is set: roles, sizes and line height.",
|
|
510
|
+
"owns": [
|
|
511
|
+
"type"
|
|
512
|
+
],
|
|
513
|
+
"lands_in": [
|
|
514
|
+
"button",
|
|
515
|
+
"input",
|
|
516
|
+
"badge",
|
|
517
|
+
"table"
|
|
518
|
+
],
|
|
519
|
+
"situations": [
|
|
520
|
+
"page-title",
|
|
521
|
+
"number-in-table",
|
|
522
|
+
"paragraph",
|
|
523
|
+
"field-label"
|
|
524
|
+
],
|
|
525
|
+
"questions": [
|
|
526
|
+
{
|
|
527
|
+
"id": "typography.roles",
|
|
528
|
+
"method": "roles",
|
|
529
|
+
"text": "Which text roles does it need?",
|
|
530
|
+
"description": "The set of text roles. Each role becomes a type decision.",
|
|
531
|
+
"options": [
|
|
532
|
+
{
|
|
533
|
+
"id": "core",
|
|
534
|
+
"label": "Core: heading, body, label"
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
"id": "core-data",
|
|
538
|
+
"label": "Core and data"
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
"id": "core-editorial",
|
|
542
|
+
"label": "Core and editorial display"
|
|
543
|
+
},
|
|
544
|
+
{
|
|
545
|
+
"id": "core-expressive",
|
|
546
|
+
"label": "Core and expressive display"
|
|
547
|
+
}
|
|
548
|
+
]
|
|
549
|
+
},
|
|
550
|
+
{
|
|
551
|
+
"id": "typography.count",
|
|
552
|
+
"method": "count",
|
|
553
|
+
"text": "How many steps does the type scale take?",
|
|
554
|
+
"description": "Few sizes keep a dense screen calm. More sizes give long pages a clear hierarchy.",
|
|
555
|
+
"options": [
|
|
556
|
+
{
|
|
557
|
+
"id": "few",
|
|
558
|
+
"label": "Only the steps the screens need",
|
|
559
|
+
"description": "The scale keeps the few sizes the screens use, and nothing in between."
|
|
560
|
+
},
|
|
561
|
+
{
|
|
562
|
+
"id": "some",
|
|
563
|
+
"label": "One step per kind of text",
|
|
564
|
+
"description": "One size each for caption, body, heading, title and display."
|
|
565
|
+
},
|
|
566
|
+
{
|
|
567
|
+
"id": "many",
|
|
568
|
+
"label": "Fine steps, so pages can set their own rhythm",
|
|
569
|
+
"description": "Many close sizes, so a page can tune its hierarchy and pace."
|
|
570
|
+
}
|
|
571
|
+
]
|
|
572
|
+
},
|
|
573
|
+
{
|
|
574
|
+
"id": "typography.definition",
|
|
575
|
+
"method": "definition",
|
|
576
|
+
"text": "How are sizes and line heights defined?",
|
|
577
|
+
"description": "A ratio scale with line heights on the grid, a ratio scale with proportional line heights, or fixed steps.",
|
|
578
|
+
"options": [
|
|
579
|
+
{
|
|
580
|
+
"id": "ratio-grid",
|
|
581
|
+
"label": "A ratio, line heights on the grid"
|
|
582
|
+
},
|
|
583
|
+
{
|
|
584
|
+
"id": "ratio-proportional",
|
|
585
|
+
"label": "A ratio, line heights in proportion"
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
"id": "fixed",
|
|
589
|
+
"label": "Fixed steps"
|
|
590
|
+
}
|
|
591
|
+
]
|
|
592
|
+
},
|
|
593
|
+
{
|
|
594
|
+
"id": "typography.values",
|
|
595
|
+
"method": "values",
|
|
596
|
+
"text": "How large is body text?",
|
|
597
|
+
"description": "Body size relative to the usual default.",
|
|
598
|
+
"options": [
|
|
599
|
+
{
|
|
600
|
+
"id": "small",
|
|
601
|
+
"label": "Small"
|
|
602
|
+
},
|
|
603
|
+
{
|
|
604
|
+
"id": "regular",
|
|
605
|
+
"label": "Regular"
|
|
606
|
+
},
|
|
607
|
+
{
|
|
608
|
+
"id": "large",
|
|
609
|
+
"label": "Large"
|
|
610
|
+
}
|
|
611
|
+
]
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
"id": "typography.lands",
|
|
615
|
+
"method": "lands",
|
|
616
|
+
"text": "Where does type do the most work?",
|
|
617
|
+
"description": "The place where type decisions matter most.",
|
|
618
|
+
"options": [
|
|
619
|
+
{
|
|
620
|
+
"id": "tables-inputs",
|
|
621
|
+
"label": "Tables and inputs"
|
|
622
|
+
},
|
|
623
|
+
{
|
|
624
|
+
"id": "articles",
|
|
625
|
+
"label": "Articles and long text"
|
|
626
|
+
},
|
|
627
|
+
{
|
|
628
|
+
"id": "forms",
|
|
629
|
+
"label": "Forms and labels"
|
|
630
|
+
},
|
|
631
|
+
{
|
|
632
|
+
"id": "headlines",
|
|
633
|
+
"label": "Headlines and hero"
|
|
634
|
+
}
|
|
635
|
+
]
|
|
636
|
+
}
|
|
637
|
+
]
|
|
638
|
+
},
|
|
639
|
+
{
|
|
640
|
+
"id": "color",
|
|
641
|
+
"kind": "scope",
|
|
642
|
+
"title": "Color",
|
|
643
|
+
"description": "How color carries action, state and brand.",
|
|
644
|
+
"owns": [
|
|
645
|
+
"color"
|
|
646
|
+
],
|
|
647
|
+
"lands_in": [
|
|
648
|
+
"button",
|
|
649
|
+
"input",
|
|
650
|
+
"control",
|
|
651
|
+
"badge",
|
|
652
|
+
"card",
|
|
653
|
+
"table",
|
|
654
|
+
"tabs",
|
|
655
|
+
"overlay"
|
|
656
|
+
],
|
|
657
|
+
"situations": [
|
|
658
|
+
"selected-row",
|
|
659
|
+
"error-message",
|
|
660
|
+
"link",
|
|
661
|
+
"status-label",
|
|
662
|
+
"commit-action",
|
|
663
|
+
"alternative-action",
|
|
664
|
+
"destructive-action"
|
|
665
|
+
],
|
|
666
|
+
"questions": [
|
|
667
|
+
{
|
|
668
|
+
"id": "color.roles",
|
|
669
|
+
"method": "roles",
|
|
670
|
+
"text": "Which color roles does it need?",
|
|
671
|
+
"description": "The groups of color decisions.",
|
|
672
|
+
"options": [
|
|
673
|
+
{
|
|
674
|
+
"id": "core",
|
|
675
|
+
"label": "Surface, text, action and status"
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
"id": "core-brand",
|
|
679
|
+
"label": "Those and brand accents"
|
|
680
|
+
}
|
|
681
|
+
]
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
"id": "color.count",
|
|
685
|
+
"method": "count",
|
|
686
|
+
"text": "How many emphasis levels do actions need?",
|
|
687
|
+
"description": "The number of action styles, from primary to quiet.",
|
|
688
|
+
"options": [
|
|
689
|
+
{
|
|
690
|
+
"id": "two",
|
|
691
|
+
"label": "Two"
|
|
692
|
+
},
|
|
693
|
+
{
|
|
694
|
+
"id": "three",
|
|
695
|
+
"label": "Three"
|
|
696
|
+
},
|
|
697
|
+
{
|
|
698
|
+
"id": "four",
|
|
699
|
+
"label": "Four"
|
|
700
|
+
}
|
|
701
|
+
]
|
|
702
|
+
},
|
|
703
|
+
{
|
|
704
|
+
"id": "color.definition",
|
|
705
|
+
"method": "definition",
|
|
706
|
+
"text": "How is the palette defined?",
|
|
707
|
+
"description": "Neutrals and one brand ramp, or a shared base with a ramp per brand.",
|
|
708
|
+
"options": [
|
|
709
|
+
{
|
|
710
|
+
"id": "neutral-brand",
|
|
711
|
+
"label": "Neutrals and one brand ramp"
|
|
712
|
+
},
|
|
713
|
+
{
|
|
714
|
+
"id": "ramp-per-brand",
|
|
715
|
+
"label": "Shared neutrals, a ramp per brand"
|
|
716
|
+
}
|
|
717
|
+
]
|
|
718
|
+
},
|
|
719
|
+
{
|
|
720
|
+
"id": "color.values",
|
|
721
|
+
"method": "values",
|
|
722
|
+
"text": "How saturated is the palette?",
|
|
723
|
+
"description": "Overall color intensity.",
|
|
724
|
+
"options": [
|
|
725
|
+
{
|
|
726
|
+
"id": "muted",
|
|
727
|
+
"label": "Muted"
|
|
728
|
+
},
|
|
729
|
+
{
|
|
730
|
+
"id": "balanced",
|
|
731
|
+
"label": "Balanced"
|
|
732
|
+
},
|
|
733
|
+
{
|
|
734
|
+
"id": "vivid",
|
|
735
|
+
"label": "Vivid"
|
|
736
|
+
}
|
|
737
|
+
]
|
|
738
|
+
},
|
|
739
|
+
{
|
|
740
|
+
"id": "color.lands",
|
|
741
|
+
"method": "lands",
|
|
742
|
+
"text": "Where does color carry meaning first?",
|
|
743
|
+
"description": "The place where color does its most important job.",
|
|
744
|
+
"options": [
|
|
745
|
+
{
|
|
746
|
+
"id": "status",
|
|
747
|
+
"label": "Status in tables"
|
|
748
|
+
},
|
|
749
|
+
{
|
|
750
|
+
"id": "links-actions",
|
|
751
|
+
"label": "Links and actions"
|
|
752
|
+
},
|
|
753
|
+
{
|
|
754
|
+
"id": "brand-moments",
|
|
755
|
+
"label": "Brand moments"
|
|
756
|
+
}
|
|
757
|
+
]
|
|
758
|
+
}
|
|
759
|
+
]
|
|
760
|
+
},
|
|
761
|
+
{
|
|
762
|
+
"id": "spacing",
|
|
763
|
+
"kind": "scope",
|
|
764
|
+
"title": "Spacing",
|
|
765
|
+
"description": "How space shows what belongs together.",
|
|
766
|
+
"owns": [
|
|
767
|
+
"space",
|
|
768
|
+
"size.row"
|
|
769
|
+
],
|
|
770
|
+
"lands_in": [
|
|
771
|
+
"button",
|
|
772
|
+
"input",
|
|
773
|
+
"badge",
|
|
774
|
+
"card",
|
|
775
|
+
"table"
|
|
776
|
+
],
|
|
777
|
+
"situations": [
|
|
778
|
+
"related-items",
|
|
779
|
+
"between-sections",
|
|
780
|
+
"table-row"
|
|
781
|
+
],
|
|
782
|
+
"questions": [
|
|
783
|
+
{
|
|
784
|
+
"id": "spacing.roles",
|
|
785
|
+
"method": "roles",
|
|
786
|
+
"text": "Which spacing roles does it need?",
|
|
787
|
+
"description": "The groups of space decisions.",
|
|
788
|
+
"options": [
|
|
789
|
+
{
|
|
790
|
+
"id": "gap-inset",
|
|
791
|
+
"label": "Gaps and insets"
|
|
792
|
+
},
|
|
793
|
+
{
|
|
794
|
+
"id": "gap-inset-row",
|
|
795
|
+
"label": "Gaps, insets and row heights"
|
|
796
|
+
}
|
|
797
|
+
]
|
|
798
|
+
},
|
|
799
|
+
{
|
|
800
|
+
"id": "spacing.count",
|
|
801
|
+
"method": "count",
|
|
802
|
+
"text": "How many densities exist?",
|
|
803
|
+
"description": "One density for everything, or a second for dense views.",
|
|
804
|
+
"options": [
|
|
805
|
+
{
|
|
806
|
+
"id": "one",
|
|
807
|
+
"label": "One"
|
|
808
|
+
},
|
|
809
|
+
{
|
|
810
|
+
"id": "two",
|
|
811
|
+
"label": "Two"
|
|
812
|
+
}
|
|
813
|
+
]
|
|
814
|
+
},
|
|
815
|
+
{
|
|
816
|
+
"id": "spacing.definition",
|
|
817
|
+
"method": "definition",
|
|
818
|
+
"text": "How are spacing steps defined?",
|
|
819
|
+
"description": "A fine base unit gives small steps for dense screens; a coarse one gives big, even steps.",
|
|
820
|
+
"options": [
|
|
821
|
+
{
|
|
822
|
+
"id": "fine",
|
|
823
|
+
"label": "A fine base unit"
|
|
824
|
+
},
|
|
825
|
+
{
|
|
826
|
+
"id": "coarse",
|
|
827
|
+
"label": "A coarse base unit"
|
|
828
|
+
}
|
|
829
|
+
]
|
|
830
|
+
},
|
|
831
|
+
{
|
|
832
|
+
"id": "spacing.values",
|
|
833
|
+
"method": "values",
|
|
834
|
+
"text": "How dense is the layout?",
|
|
835
|
+
"description": "The base density.",
|
|
836
|
+
"options": [
|
|
837
|
+
{
|
|
838
|
+
"id": "compact",
|
|
839
|
+
"label": "Compact"
|
|
840
|
+
},
|
|
841
|
+
{
|
|
842
|
+
"id": "comfortable",
|
|
843
|
+
"label": "Comfortable"
|
|
844
|
+
},
|
|
845
|
+
{
|
|
846
|
+
"id": "spacious",
|
|
847
|
+
"label": "Spacious"
|
|
848
|
+
}
|
|
849
|
+
]
|
|
850
|
+
},
|
|
851
|
+
{
|
|
852
|
+
"id": "spacing.lands",
|
|
853
|
+
"method": "lands",
|
|
854
|
+
"text": "Where does spacing matter most?",
|
|
855
|
+
"description": "The place where space does its most visible work.",
|
|
856
|
+
"options": [
|
|
857
|
+
{
|
|
858
|
+
"id": "rows-cells",
|
|
859
|
+
"label": "Rows and cells"
|
|
860
|
+
},
|
|
861
|
+
{
|
|
862
|
+
"id": "reading",
|
|
863
|
+
"label": "Between paragraphs"
|
|
864
|
+
},
|
|
865
|
+
{
|
|
866
|
+
"id": "fields",
|
|
867
|
+
"label": "Between fields"
|
|
868
|
+
},
|
|
869
|
+
{
|
|
870
|
+
"id": "sections",
|
|
871
|
+
"label": "Between big sections"
|
|
872
|
+
}
|
|
873
|
+
]
|
|
874
|
+
}
|
|
875
|
+
]
|
|
876
|
+
},
|
|
877
|
+
{
|
|
878
|
+
"id": "shape",
|
|
879
|
+
"kind": "scope",
|
|
880
|
+
"title": "Shape",
|
|
881
|
+
"description": "Corners and borders.",
|
|
882
|
+
"owns": [
|
|
883
|
+
"radius",
|
|
884
|
+
"border-width"
|
|
885
|
+
],
|
|
886
|
+
"lands_in": [
|
|
887
|
+
"button",
|
|
888
|
+
"input",
|
|
889
|
+
"control",
|
|
890
|
+
"badge",
|
|
891
|
+
"card",
|
|
892
|
+
"overlay"
|
|
893
|
+
],
|
|
894
|
+
"situations": [
|
|
895
|
+
"control-corner",
|
|
896
|
+
"status-shape"
|
|
897
|
+
],
|
|
898
|
+
"questions": [
|
|
899
|
+
{
|
|
900
|
+
"id": "shape.roles",
|
|
901
|
+
"method": "roles",
|
|
902
|
+
"text": "Which shape roles does it need?",
|
|
903
|
+
"description": "The elements that get their own corner.",
|
|
904
|
+
"options": [
|
|
905
|
+
{
|
|
906
|
+
"id": "control-container",
|
|
907
|
+
"label": "Controls and containers"
|
|
908
|
+
},
|
|
909
|
+
{
|
|
910
|
+
"id": "control-badge-container",
|
|
911
|
+
"label": "Controls, badges and containers"
|
|
912
|
+
}
|
|
913
|
+
]
|
|
914
|
+
},
|
|
915
|
+
{
|
|
916
|
+
"id": "shape.count",
|
|
917
|
+
"method": "count",
|
|
918
|
+
"text": "How many corner sizes exist?",
|
|
919
|
+
"description": "How many different corners appear.",
|
|
920
|
+
"options": [
|
|
921
|
+
{
|
|
922
|
+
"id": "two",
|
|
923
|
+
"label": "Two"
|
|
924
|
+
},
|
|
925
|
+
{
|
|
926
|
+
"id": "three",
|
|
927
|
+
"label": "Three"
|
|
928
|
+
}
|
|
929
|
+
]
|
|
930
|
+
},
|
|
931
|
+
{
|
|
932
|
+
"id": "shape.definition",
|
|
933
|
+
"method": "definition",
|
|
934
|
+
"text": "How are corners set?",
|
|
935
|
+
"description": "One fixed set for the product, or a set per brand.",
|
|
936
|
+
"options": [
|
|
937
|
+
{
|
|
938
|
+
"id": "fixed",
|
|
939
|
+
"label": "Fixed for the product"
|
|
940
|
+
},
|
|
941
|
+
{
|
|
942
|
+
"id": "per-brand",
|
|
943
|
+
"label": "Set by each brand"
|
|
944
|
+
}
|
|
945
|
+
]
|
|
946
|
+
},
|
|
947
|
+
{
|
|
948
|
+
"id": "shape.values",
|
|
949
|
+
"method": "values",
|
|
950
|
+
"text": "What should control corners say?",
|
|
951
|
+
"description": "The corner of buttons and inputs.",
|
|
952
|
+
"options": [
|
|
953
|
+
{
|
|
954
|
+
"id": "sharp",
|
|
955
|
+
"label": "Sharp"
|
|
956
|
+
},
|
|
957
|
+
{
|
|
958
|
+
"id": "slightly-rounded",
|
|
959
|
+
"label": "Slightly rounded"
|
|
960
|
+
},
|
|
961
|
+
{
|
|
962
|
+
"id": "rounded",
|
|
963
|
+
"label": "Rounded"
|
|
964
|
+
},
|
|
965
|
+
{
|
|
966
|
+
"id": "pill",
|
|
967
|
+
"label": "Pill"
|
|
968
|
+
}
|
|
969
|
+
]
|
|
970
|
+
},
|
|
971
|
+
{
|
|
972
|
+
"id": "shape.lands",
|
|
973
|
+
"method": "lands",
|
|
974
|
+
"text": "Where does shape show most?",
|
|
975
|
+
"description": "The place where corners are seen most.",
|
|
976
|
+
"options": [
|
|
977
|
+
{
|
|
978
|
+
"id": "controls",
|
|
979
|
+
"label": "Controls in dense rows"
|
|
980
|
+
},
|
|
981
|
+
{
|
|
982
|
+
"id": "controls-cards",
|
|
983
|
+
"label": "Controls and cards"
|
|
984
|
+
},
|
|
985
|
+
{
|
|
986
|
+
"id": "buttons-badges",
|
|
987
|
+
"label": "Buttons and badges"
|
|
988
|
+
}
|
|
989
|
+
]
|
|
990
|
+
}
|
|
991
|
+
]
|
|
992
|
+
},
|
|
993
|
+
{
|
|
994
|
+
"id": "elevation",
|
|
995
|
+
"kind": "scope",
|
|
996
|
+
"title": "Elevation",
|
|
997
|
+
"description": "When something rises above the page, and what separates groups.",
|
|
998
|
+
"owns": [
|
|
999
|
+
"elevation"
|
|
1000
|
+
],
|
|
1001
|
+
"lands_in": [
|
|
1002
|
+
"card",
|
|
1003
|
+
"overlay"
|
|
1004
|
+
],
|
|
1005
|
+
"situations": [
|
|
1006
|
+
"card",
|
|
1007
|
+
"menu-or-dialog"
|
|
1008
|
+
],
|
|
1009
|
+
"questions": [
|
|
1010
|
+
{
|
|
1011
|
+
"id": "elevation.roles",
|
|
1012
|
+
"method": "roles",
|
|
1013
|
+
"text": "What rises above the page?",
|
|
1014
|
+
"description": "The layers that get a shadow.",
|
|
1015
|
+
"options": [
|
|
1016
|
+
{
|
|
1017
|
+
"id": "floating-only",
|
|
1018
|
+
"label": "Only what floats"
|
|
1019
|
+
},
|
|
1020
|
+
{
|
|
1021
|
+
"id": "cards-too",
|
|
1022
|
+
"label": "Cards too"
|
|
1023
|
+
},
|
|
1024
|
+
{
|
|
1025
|
+
"id": "nothing",
|
|
1026
|
+
"label": "Nothing"
|
|
1027
|
+
}
|
|
1028
|
+
]
|
|
1029
|
+
},
|
|
1030
|
+
{
|
|
1031
|
+
"id": "elevation.count",
|
|
1032
|
+
"method": "count",
|
|
1033
|
+
"text": "How many shadow levels exist?",
|
|
1034
|
+
"description": "The number of distinct shadows.",
|
|
1035
|
+
"options": [
|
|
1036
|
+
{
|
|
1037
|
+
"id": "none",
|
|
1038
|
+
"label": "None"
|
|
1039
|
+
},
|
|
1040
|
+
{
|
|
1041
|
+
"id": "one",
|
|
1042
|
+
"label": "One"
|
|
1043
|
+
},
|
|
1044
|
+
{
|
|
1045
|
+
"id": "two",
|
|
1046
|
+
"label": "Two"
|
|
1047
|
+
}
|
|
1048
|
+
]
|
|
1049
|
+
},
|
|
1050
|
+
{
|
|
1051
|
+
"id": "elevation.definition",
|
|
1052
|
+
"method": "definition",
|
|
1053
|
+
"text": "What separates groups on the page?",
|
|
1054
|
+
"description": "The device that tells the eye a new group starts.",
|
|
1055
|
+
"options": [
|
|
1056
|
+
{
|
|
1057
|
+
"id": "space",
|
|
1058
|
+
"label": "Space"
|
|
1059
|
+
},
|
|
1060
|
+
{
|
|
1061
|
+
"id": "lines",
|
|
1062
|
+
"label": "Lines"
|
|
1063
|
+
},
|
|
1064
|
+
{
|
|
1065
|
+
"id": "cards",
|
|
1066
|
+
"label": "Cards"
|
|
1067
|
+
}
|
|
1068
|
+
]
|
|
1069
|
+
},
|
|
1070
|
+
{
|
|
1071
|
+
"id": "elevation.values",
|
|
1072
|
+
"method": "values",
|
|
1073
|
+
"text": "How soft are shadows?",
|
|
1074
|
+
"description": "Shadow character.",
|
|
1075
|
+
"options": [
|
|
1076
|
+
{
|
|
1077
|
+
"id": "none",
|
|
1078
|
+
"label": "No shadows"
|
|
1079
|
+
},
|
|
1080
|
+
{
|
|
1081
|
+
"id": "subtle",
|
|
1082
|
+
"label": "Subtle"
|
|
1083
|
+
},
|
|
1084
|
+
{
|
|
1085
|
+
"id": "soft",
|
|
1086
|
+
"label": "Soft"
|
|
1087
|
+
},
|
|
1088
|
+
{
|
|
1089
|
+
"id": "pronounced",
|
|
1090
|
+
"label": "Pronounced"
|
|
1091
|
+
}
|
|
1092
|
+
]
|
|
1093
|
+
},
|
|
1094
|
+
{
|
|
1095
|
+
"id": "elevation.lands",
|
|
1096
|
+
"method": "lands",
|
|
1097
|
+
"text": "Where does elevation show?",
|
|
1098
|
+
"description": "The place where layering is seen.",
|
|
1099
|
+
"options": [
|
|
1100
|
+
{
|
|
1101
|
+
"id": "menus-dialogs",
|
|
1102
|
+
"label": "Menus and dialogs"
|
|
1103
|
+
},
|
|
1104
|
+
{
|
|
1105
|
+
"id": "cards-menus",
|
|
1106
|
+
"label": "Cards, menus and dialogs"
|
|
1107
|
+
},
|
|
1108
|
+
{
|
|
1109
|
+
"id": "dialogs-only",
|
|
1110
|
+
"label": "Dialogs only"
|
|
1111
|
+
}
|
|
1112
|
+
]
|
|
1113
|
+
}
|
|
1114
|
+
]
|
|
1115
|
+
},
|
|
1116
|
+
{
|
|
1117
|
+
"id": "motion",
|
|
1118
|
+
"kind": "scope",
|
|
1119
|
+
"title": "Motion",
|
|
1120
|
+
"description": "What moves, why and how fast.",
|
|
1121
|
+
"owns": [
|
|
1122
|
+
"motion"
|
|
1123
|
+
],
|
|
1124
|
+
"lands_in": [
|
|
1125
|
+
"transition"
|
|
1126
|
+
],
|
|
1127
|
+
"situations": [
|
|
1128
|
+
"hover-feedback",
|
|
1129
|
+
"reduced-motion"
|
|
1130
|
+
],
|
|
1131
|
+
"questions": [
|
|
1132
|
+
{
|
|
1133
|
+
"id": "motion.roles",
|
|
1134
|
+
"method": "roles",
|
|
1135
|
+
"text": "What is motion for?",
|
|
1136
|
+
"description": "The jobs motion does.",
|
|
1137
|
+
"options": [
|
|
1138
|
+
{
|
|
1139
|
+
"id": "feedback",
|
|
1140
|
+
"label": "Feedback only"
|
|
1141
|
+
},
|
|
1142
|
+
{
|
|
1143
|
+
"id": "feedback-guidance",
|
|
1144
|
+
"label": "Feedback and guidance"
|
|
1145
|
+
},
|
|
1146
|
+
{
|
|
1147
|
+
"id": "expression",
|
|
1148
|
+
"label": "Feedback and expression"
|
|
1149
|
+
}
|
|
1150
|
+
]
|
|
1151
|
+
},
|
|
1152
|
+
{
|
|
1153
|
+
"id": "motion.count",
|
|
1154
|
+
"method": "count",
|
|
1155
|
+
"text": "How many speeds exist?",
|
|
1156
|
+
"description": "The number of distinct durations.",
|
|
1157
|
+
"options": [
|
|
1158
|
+
{
|
|
1159
|
+
"id": "one",
|
|
1160
|
+
"label": "One"
|
|
1161
|
+
},
|
|
1162
|
+
{
|
|
1163
|
+
"id": "two",
|
|
1164
|
+
"label": "Two"
|
|
1165
|
+
},
|
|
1166
|
+
{
|
|
1167
|
+
"id": "three",
|
|
1168
|
+
"label": "Three"
|
|
1169
|
+
}
|
|
1170
|
+
]
|
|
1171
|
+
},
|
|
1172
|
+
{
|
|
1173
|
+
"id": "motion.definition",
|
|
1174
|
+
"method": "definition",
|
|
1175
|
+
"text": "How is easing defined?",
|
|
1176
|
+
"description": "A standard ease-out, or a spring that overshoots.",
|
|
1177
|
+
"options": [
|
|
1178
|
+
{
|
|
1179
|
+
"id": "standard",
|
|
1180
|
+
"label": "Standard ease-out"
|
|
1181
|
+
},
|
|
1182
|
+
{
|
|
1183
|
+
"id": "spring",
|
|
1184
|
+
"label": "A spring"
|
|
1185
|
+
}
|
|
1186
|
+
]
|
|
1187
|
+
},
|
|
1188
|
+
{
|
|
1189
|
+
"id": "motion.values",
|
|
1190
|
+
"method": "values",
|
|
1191
|
+
"text": "How fast does feedback feel?",
|
|
1192
|
+
"description": "Speed as a word. The convention behind each word is in the primitives.",
|
|
1193
|
+
"options": [
|
|
1194
|
+
{
|
|
1195
|
+
"id": "fast",
|
|
1196
|
+
"label": "Fast"
|
|
1197
|
+
},
|
|
1198
|
+
{
|
|
1199
|
+
"id": "moderate",
|
|
1200
|
+
"label": "Moderate"
|
|
1201
|
+
},
|
|
1202
|
+
{
|
|
1203
|
+
"id": "relaxed",
|
|
1204
|
+
"label": "Relaxed"
|
|
1205
|
+
}
|
|
1206
|
+
]
|
|
1207
|
+
},
|
|
1208
|
+
{
|
|
1209
|
+
"id": "motion.lands",
|
|
1210
|
+
"method": "lands",
|
|
1211
|
+
"text": "Where does motion show?",
|
|
1212
|
+
"description": "The place where motion is seen.",
|
|
1213
|
+
"options": [
|
|
1214
|
+
{
|
|
1215
|
+
"id": "state-only",
|
|
1216
|
+
"label": "State changes only"
|
|
1217
|
+
},
|
|
1218
|
+
{
|
|
1219
|
+
"id": "state-panels",
|
|
1220
|
+
"label": "State changes and panels"
|
|
1221
|
+
},
|
|
1222
|
+
{
|
|
1223
|
+
"id": "hero",
|
|
1224
|
+
"label": "Hero and launch moments"
|
|
1225
|
+
}
|
|
1226
|
+
]
|
|
1227
|
+
}
|
|
1228
|
+
]
|
|
1229
|
+
},
|
|
1230
|
+
{
|
|
1231
|
+
"id": "iconography",
|
|
1232
|
+
"kind": "scope",
|
|
1233
|
+
"title": "Iconography",
|
|
1234
|
+
"description": "When icons appear and how they look.",
|
|
1235
|
+
"owns": [
|
|
1236
|
+
"size.icon"
|
|
1237
|
+
],
|
|
1238
|
+
"lands_in": [
|
|
1239
|
+
"button"
|
|
1240
|
+
],
|
|
1241
|
+
"situations": [
|
|
1242
|
+
"icon-alone",
|
|
1243
|
+
"row-action"
|
|
1244
|
+
],
|
|
1245
|
+
"questions": [
|
|
1246
|
+
{
|
|
1247
|
+
"id": "iconography.roles",
|
|
1248
|
+
"method": "roles",
|
|
1249
|
+
"text": "What do icons do?",
|
|
1250
|
+
"description": "The jobs icons carry.",
|
|
1251
|
+
"options": [
|
|
1252
|
+
{
|
|
1253
|
+
"id": "actions-status",
|
|
1254
|
+
"label": "Actions and status"
|
|
1255
|
+
},
|
|
1256
|
+
{
|
|
1257
|
+
"id": "actions-status-nav",
|
|
1258
|
+
"label": "Actions, status and navigation"
|
|
1259
|
+
},
|
|
1260
|
+
{
|
|
1261
|
+
"id": "decoration-too",
|
|
1262
|
+
"label": "Those and decoration"
|
|
1263
|
+
}
|
|
1264
|
+
]
|
|
1265
|
+
},
|
|
1266
|
+
{
|
|
1267
|
+
"id": "iconography.count",
|
|
1268
|
+
"method": "count",
|
|
1269
|
+
"text": "How many icon sizes exist?",
|
|
1270
|
+
"description": "The number of icon sizes.",
|
|
1271
|
+
"options": [
|
|
1272
|
+
{
|
|
1273
|
+
"id": "one",
|
|
1274
|
+
"label": "One"
|
|
1275
|
+
},
|
|
1276
|
+
{
|
|
1277
|
+
"id": "two",
|
|
1278
|
+
"label": "Two"
|
|
1279
|
+
}
|
|
1280
|
+
]
|
|
1281
|
+
},
|
|
1282
|
+
{
|
|
1283
|
+
"id": "iconography.definition",
|
|
1284
|
+
"method": "definition",
|
|
1285
|
+
"text": "What icon style?",
|
|
1286
|
+
"description": "Stroke or fill.",
|
|
1287
|
+
"options": [
|
|
1288
|
+
{
|
|
1289
|
+
"id": "outline",
|
|
1290
|
+
"label": "Outline"
|
|
1291
|
+
},
|
|
1292
|
+
{
|
|
1293
|
+
"id": "filled",
|
|
1294
|
+
"label": "Filled"
|
|
1295
|
+
},
|
|
1296
|
+
{
|
|
1297
|
+
"id": "duotone",
|
|
1298
|
+
"label": "Two-tone"
|
|
1299
|
+
}
|
|
1300
|
+
]
|
|
1301
|
+
},
|
|
1302
|
+
{
|
|
1303
|
+
"id": "iconography.values",
|
|
1304
|
+
"method": "values",
|
|
1305
|
+
"text": "How big are icons next to text?",
|
|
1306
|
+
"description": "Icon size relative to text.",
|
|
1307
|
+
"options": [
|
|
1308
|
+
{
|
|
1309
|
+
"id": "match-text",
|
|
1310
|
+
"label": "Match the text"
|
|
1311
|
+
},
|
|
1312
|
+
{
|
|
1313
|
+
"id": "larger",
|
|
1314
|
+
"label": "Larger than the text"
|
|
1315
|
+
}
|
|
1316
|
+
]
|
|
1317
|
+
},
|
|
1318
|
+
{
|
|
1319
|
+
"id": "iconography.lands",
|
|
1320
|
+
"method": "lands",
|
|
1321
|
+
"text": "Where do icons work hardest?",
|
|
1322
|
+
"description": "The place where icons are seen most.",
|
|
1323
|
+
"options": [
|
|
1324
|
+
{
|
|
1325
|
+
"id": "toolbars-rows",
|
|
1326
|
+
"label": "Toolbars and rows"
|
|
1327
|
+
},
|
|
1328
|
+
{
|
|
1329
|
+
"id": "status",
|
|
1330
|
+
"label": "Status and messages"
|
|
1331
|
+
},
|
|
1332
|
+
{
|
|
1333
|
+
"id": "navigation",
|
|
1334
|
+
"label": "Navigation"
|
|
1335
|
+
},
|
|
1336
|
+
{
|
|
1337
|
+
"id": "buttons",
|
|
1338
|
+
"label": "Buttons and calls to action"
|
|
1339
|
+
}
|
|
1340
|
+
]
|
|
1341
|
+
}
|
|
1342
|
+
]
|
|
1343
|
+
},
|
|
1344
|
+
{
|
|
1345
|
+
"id": "theming",
|
|
1346
|
+
"kind": "scope",
|
|
1347
|
+
"title": "Theming",
|
|
1348
|
+
"description": "Modes and brands.",
|
|
1349
|
+
"owns": [
|
|
1350
|
+
"theme"
|
|
1351
|
+
],
|
|
1352
|
+
"lands_in": [
|
|
1353
|
+
"button",
|
|
1354
|
+
"card",
|
|
1355
|
+
"overlay"
|
|
1356
|
+
],
|
|
1357
|
+
"situations": [
|
|
1358
|
+
"dark-mode"
|
|
1359
|
+
],
|
|
1360
|
+
"questions": [
|
|
1361
|
+
{
|
|
1362
|
+
"id": "theming.roles",
|
|
1363
|
+
"method": "roles",
|
|
1364
|
+
"text": "What can a theme change?",
|
|
1365
|
+
"description": "The axes a theme varies along.",
|
|
1366
|
+
"options": [
|
|
1367
|
+
{
|
|
1368
|
+
"id": "mode",
|
|
1369
|
+
"label": "Mode only"
|
|
1370
|
+
},
|
|
1371
|
+
{
|
|
1372
|
+
"id": "mode-brand",
|
|
1373
|
+
"label": "Mode and brand"
|
|
1374
|
+
},
|
|
1375
|
+
{
|
|
1376
|
+
"id": "mode-contrast",
|
|
1377
|
+
"label": "Mode and contrast"
|
|
1378
|
+
}
|
|
1379
|
+
]
|
|
1380
|
+
},
|
|
1381
|
+
{
|
|
1382
|
+
"id": "theming.count",
|
|
1383
|
+
"method": "count",
|
|
1384
|
+
"text": "How many themes ship?",
|
|
1385
|
+
"description": "Brands times modes.",
|
|
1386
|
+
"options": [
|
|
1387
|
+
{
|
|
1388
|
+
"id": "two",
|
|
1389
|
+
"label": "Two"
|
|
1390
|
+
},
|
|
1391
|
+
{
|
|
1392
|
+
"id": "several",
|
|
1393
|
+
"label": "Several"
|
|
1394
|
+
}
|
|
1395
|
+
]
|
|
1396
|
+
},
|
|
1397
|
+
{
|
|
1398
|
+
"id": "theming.definition",
|
|
1399
|
+
"method": "definition",
|
|
1400
|
+
"text": "How are brands handled?",
|
|
1401
|
+
"description": "Single brand, or brands as theme modes over shared semantics.",
|
|
1402
|
+
"options": [
|
|
1403
|
+
{
|
|
1404
|
+
"id": "single",
|
|
1405
|
+
"label": "One brand"
|
|
1406
|
+
},
|
|
1407
|
+
{
|
|
1408
|
+
"id": "brand-modes",
|
|
1409
|
+
"label": "Brands as modes"
|
|
1410
|
+
}
|
|
1411
|
+
]
|
|
1412
|
+
},
|
|
1413
|
+
{
|
|
1414
|
+
"id": "theming.values",
|
|
1415
|
+
"method": "values",
|
|
1416
|
+
"text": "Which modes ship?",
|
|
1417
|
+
"description": "The modes the semantic layer carries. Light and dark are standard.",
|
|
1418
|
+
"options": [
|
|
1419
|
+
{
|
|
1420
|
+
"id": "light-dark",
|
|
1421
|
+
"label": "Light and dark"
|
|
1422
|
+
},
|
|
1423
|
+
{
|
|
1424
|
+
"id": "light-dark-contrast",
|
|
1425
|
+
"label": "Light, dark and high contrast"
|
|
1426
|
+
}
|
|
1427
|
+
]
|
|
1428
|
+
},
|
|
1429
|
+
{
|
|
1430
|
+
"id": "theming.lands",
|
|
1431
|
+
"method": "lands",
|
|
1432
|
+
"text": "What changes when the theme changes?",
|
|
1433
|
+
"description": "The decisions a theme switch touches.",
|
|
1434
|
+
"options": [
|
|
1435
|
+
{
|
|
1436
|
+
"id": "colors",
|
|
1437
|
+
"label": "Colors only"
|
|
1438
|
+
},
|
|
1439
|
+
{
|
|
1440
|
+
"id": "colors-type-shape",
|
|
1441
|
+
"label": "Colors, type and shape"
|
|
1442
|
+
}
|
|
1443
|
+
]
|
|
1444
|
+
}
|
|
1445
|
+
]
|
|
1446
|
+
},
|
|
1447
|
+
{
|
|
1448
|
+
"id": "accessibility",
|
|
1449
|
+
"kind": "scope",
|
|
1450
|
+
"title": "Accessibility",
|
|
1451
|
+
"description": "Floors the system must hold.",
|
|
1452
|
+
"owns": [
|
|
1453
|
+
"size.control",
|
|
1454
|
+
"opacity",
|
|
1455
|
+
"color.border.focus"
|
|
1456
|
+
],
|
|
1457
|
+
"lands_in": [
|
|
1458
|
+
"button",
|
|
1459
|
+
"input",
|
|
1460
|
+
"overlay"
|
|
1461
|
+
],
|
|
1462
|
+
"situations": [
|
|
1463
|
+
"keyboard-focus",
|
|
1464
|
+
"smallest-target"
|
|
1465
|
+
],
|
|
1466
|
+
"questions": [
|
|
1467
|
+
{
|
|
1468
|
+
"id": "accessibility.roles",
|
|
1469
|
+
"method": "roles",
|
|
1470
|
+
"text": "Which states get their own visible value?",
|
|
1471
|
+
"description": "States with a distinct look.",
|
|
1472
|
+
"options": [
|
|
1473
|
+
{
|
|
1474
|
+
"id": "hover-focus-disabled",
|
|
1475
|
+
"label": "Hover, focus, disabled"
|
|
1476
|
+
},
|
|
1477
|
+
{
|
|
1478
|
+
"id": "plus-pressed",
|
|
1479
|
+
"label": "Those and pressed"
|
|
1480
|
+
},
|
|
1481
|
+
{
|
|
1482
|
+
"id": "all",
|
|
1483
|
+
"label": "All, including loading"
|
|
1484
|
+
}
|
|
1485
|
+
]
|
|
1486
|
+
},
|
|
1487
|
+
{
|
|
1488
|
+
"id": "accessibility.count",
|
|
1489
|
+
"method": "count",
|
|
1490
|
+
"text": "How many signals carry each meaning?",
|
|
1491
|
+
"description": "Whether status relies on color alone or also on icons and words.",
|
|
1492
|
+
"options": [
|
|
1493
|
+
{
|
|
1494
|
+
"id": "color-word",
|
|
1495
|
+
"label": "Two: color and word"
|
|
1496
|
+
},
|
|
1497
|
+
{
|
|
1498
|
+
"id": "color-icon-word",
|
|
1499
|
+
"label": "Three: color, icon and word"
|
|
1500
|
+
}
|
|
1501
|
+
]
|
|
1502
|
+
},
|
|
1503
|
+
{
|
|
1504
|
+
"id": "accessibility.definition",
|
|
1505
|
+
"method": "definition",
|
|
1506
|
+
"text": "What contrast floor do we hold?",
|
|
1507
|
+
"description": "Contrast commitment for text.",
|
|
1508
|
+
"options": [
|
|
1509
|
+
{
|
|
1510
|
+
"id": "aa",
|
|
1511
|
+
"label": "AA"
|
|
1512
|
+
},
|
|
1513
|
+
{
|
|
1514
|
+
"id": "aaa-text",
|
|
1515
|
+
"label": "AAA for text"
|
|
1516
|
+
}
|
|
1517
|
+
]
|
|
1518
|
+
},
|
|
1519
|
+
{
|
|
1520
|
+
"id": "accessibility.values",
|
|
1521
|
+
"method": "values",
|
|
1522
|
+
"text": "What is the smallest target?",
|
|
1523
|
+
"description": "The smallest clickable size.",
|
|
1524
|
+
"options": [
|
|
1525
|
+
{
|
|
1526
|
+
"id": "pointer",
|
|
1527
|
+
"label": "Compact, for a pointer"
|
|
1528
|
+
},
|
|
1529
|
+
{
|
|
1530
|
+
"id": "touch",
|
|
1531
|
+
"label": "Touch size"
|
|
1532
|
+
},
|
|
1533
|
+
{
|
|
1534
|
+
"id": "large",
|
|
1535
|
+
"label": "Large"
|
|
1536
|
+
}
|
|
1537
|
+
]
|
|
1538
|
+
},
|
|
1539
|
+
{
|
|
1540
|
+
"id": "accessibility.lands",
|
|
1541
|
+
"method": "lands",
|
|
1542
|
+
"text": "Where are the floors hardest to hold?",
|
|
1543
|
+
"description": "The place where accessibility needs the most care.",
|
|
1544
|
+
"options": [
|
|
1545
|
+
{
|
|
1546
|
+
"id": "dense-tables",
|
|
1547
|
+
"label": "Dense tables"
|
|
1548
|
+
},
|
|
1549
|
+
{
|
|
1550
|
+
"id": "long-text",
|
|
1551
|
+
"label": "Long text"
|
|
1552
|
+
},
|
|
1553
|
+
{
|
|
1554
|
+
"id": "forms",
|
|
1555
|
+
"label": "Forms"
|
|
1556
|
+
},
|
|
1557
|
+
{
|
|
1558
|
+
"id": "brand-color",
|
|
1559
|
+
"label": "Brand color"
|
|
1560
|
+
}
|
|
1561
|
+
]
|
|
1562
|
+
}
|
|
1563
|
+
]
|
|
1564
|
+
},
|
|
1565
|
+
{
|
|
1566
|
+
"id": "naming",
|
|
1567
|
+
"kind": "scope",
|
|
1568
|
+
"title": "Naming",
|
|
1569
|
+
"description": "How tokens and keys are named.",
|
|
1570
|
+
"owns": [
|
|
1571
|
+
"component"
|
|
1572
|
+
],
|
|
1573
|
+
"lands_in": [
|
|
1574
|
+
"button",
|
|
1575
|
+
"input",
|
|
1576
|
+
"control",
|
|
1577
|
+
"badge",
|
|
1578
|
+
"card",
|
|
1579
|
+
"table",
|
|
1580
|
+
"tabs",
|
|
1581
|
+
"overlay",
|
|
1582
|
+
"transition"
|
|
1583
|
+
],
|
|
1584
|
+
"situations": [
|
|
1585
|
+
"missing-token"
|
|
1586
|
+
],
|
|
1587
|
+
"questions": [
|
|
1588
|
+
{
|
|
1589
|
+
"id": "naming.roles",
|
|
1590
|
+
"method": "roles",
|
|
1591
|
+
"text": "What gets a name?",
|
|
1592
|
+
"description": "Tokens only, or tokens and a component API.",
|
|
1593
|
+
"options": [
|
|
1594
|
+
{
|
|
1595
|
+
"id": "tokens",
|
|
1596
|
+
"label": "Tokens"
|
|
1597
|
+
},
|
|
1598
|
+
{
|
|
1599
|
+
"id": "tokens-keys",
|
|
1600
|
+
"label": "Tokens and component keys"
|
|
1601
|
+
}
|
|
1602
|
+
]
|
|
1603
|
+
},
|
|
1604
|
+
{
|
|
1605
|
+
"id": "naming.count",
|
|
1606
|
+
"method": "count",
|
|
1607
|
+
"text": "How many token tiers?",
|
|
1608
|
+
"description": "Primitives and semantics, or also component keys.",
|
|
1609
|
+
"options": [
|
|
1610
|
+
{
|
|
1611
|
+
"id": "two",
|
|
1612
|
+
"label": "Two"
|
|
1613
|
+
},
|
|
1614
|
+
{
|
|
1615
|
+
"id": "three",
|
|
1616
|
+
"label": "Three"
|
|
1617
|
+
}
|
|
1618
|
+
]
|
|
1619
|
+
},
|
|
1620
|
+
{
|
|
1621
|
+
"id": "naming.definition",
|
|
1622
|
+
"method": "definition",
|
|
1623
|
+
"text": "How are decisions named?",
|
|
1624
|
+
"description": "Role names survive change; component names are local.",
|
|
1625
|
+
"options": [
|
|
1626
|
+
{
|
|
1627
|
+
"id": "by-role",
|
|
1628
|
+
"label": "By role"
|
|
1629
|
+
},
|
|
1630
|
+
{
|
|
1631
|
+
"id": "by-component",
|
|
1632
|
+
"label": "By component"
|
|
1633
|
+
}
|
|
1634
|
+
]
|
|
1635
|
+
},
|
|
1636
|
+
{
|
|
1637
|
+
"id": "naming.values",
|
|
1638
|
+
"method": "values",
|
|
1639
|
+
"text": "How are names written?",
|
|
1640
|
+
"description": "The spelling of every name.",
|
|
1641
|
+
"options": [
|
|
1642
|
+
{
|
|
1643
|
+
"id": "kebab-paths",
|
|
1644
|
+
"label": "Lowercase words in paths"
|
|
1645
|
+
},
|
|
1646
|
+
{
|
|
1647
|
+
"id": "camel",
|
|
1648
|
+
"label": "camelCase"
|
|
1649
|
+
}
|
|
1650
|
+
]
|
|
1651
|
+
},
|
|
1652
|
+
{
|
|
1653
|
+
"id": "naming.lands",
|
|
1654
|
+
"method": "lands",
|
|
1655
|
+
"text": "What do components read?",
|
|
1656
|
+
"description": "A component API: one key per element, variant and state.",
|
|
1657
|
+
"options": [
|
|
1658
|
+
{
|
|
1659
|
+
"id": "keys",
|
|
1660
|
+
"label": "Component keys"
|
|
1661
|
+
},
|
|
1662
|
+
{
|
|
1663
|
+
"id": "semantic",
|
|
1664
|
+
"label": "Semantic tokens"
|
|
1665
|
+
}
|
|
1666
|
+
]
|
|
1667
|
+
}
|
|
1668
|
+
]
|
|
1669
|
+
},
|
|
1670
|
+
{
|
|
1671
|
+
"id": "voice",
|
|
1672
|
+
"kind": "scope",
|
|
1673
|
+
"title": "Voice and tone",
|
|
1674
|
+
"description": "How the product speaks: the words in every component.",
|
|
1675
|
+
"owns": [
|
|
1676
|
+
"content"
|
|
1677
|
+
],
|
|
1678
|
+
"lands_in": [
|
|
1679
|
+
"button",
|
|
1680
|
+
"input",
|
|
1681
|
+
"overlay",
|
|
1682
|
+
"table"
|
|
1683
|
+
],
|
|
1684
|
+
"situations": [
|
|
1685
|
+
"button-label",
|
|
1686
|
+
"error-words",
|
|
1687
|
+
"success-words",
|
|
1688
|
+
"empty-words",
|
|
1689
|
+
"confirm-words",
|
|
1690
|
+
"first-visit"
|
|
1691
|
+
],
|
|
1692
|
+
"questions": [
|
|
1693
|
+
{
|
|
1694
|
+
"id": "voice.roles",
|
|
1695
|
+
"method": "roles",
|
|
1696
|
+
"text": "Which kinds of copy does it need?",
|
|
1697
|
+
"description": "The groups of words the product writes.",
|
|
1698
|
+
"options": [
|
|
1699
|
+
{
|
|
1700
|
+
"id": "ui",
|
|
1701
|
+
"label": "Labels and messages"
|
|
1702
|
+
},
|
|
1703
|
+
{
|
|
1704
|
+
"id": "ui-help",
|
|
1705
|
+
"label": "Labels, messages and help"
|
|
1706
|
+
},
|
|
1707
|
+
{
|
|
1708
|
+
"id": "ui-editorial",
|
|
1709
|
+
"label": "Labels, messages and articles"
|
|
1710
|
+
},
|
|
1711
|
+
{
|
|
1712
|
+
"id": "ui-marketing",
|
|
1713
|
+
"label": "Labels, messages and headlines"
|
|
1714
|
+
}
|
|
1715
|
+
]
|
|
1716
|
+
},
|
|
1717
|
+
{
|
|
1718
|
+
"id": "voice.count",
|
|
1719
|
+
"method": "count",
|
|
1720
|
+
"text": "How many tones does it use?",
|
|
1721
|
+
"description": "One tone everywhere, a tone per moment, or a shared core with a tone per brand.",
|
|
1722
|
+
"options": [
|
|
1723
|
+
{
|
|
1724
|
+
"id": "one",
|
|
1725
|
+
"label": "One"
|
|
1726
|
+
},
|
|
1727
|
+
{
|
|
1728
|
+
"id": "per-moment",
|
|
1729
|
+
"label": "One per moment"
|
|
1730
|
+
},
|
|
1731
|
+
{
|
|
1732
|
+
"id": "per-brand",
|
|
1733
|
+
"label": "One per brand"
|
|
1734
|
+
}
|
|
1735
|
+
]
|
|
1736
|
+
},
|
|
1737
|
+
{
|
|
1738
|
+
"id": "voice.definition",
|
|
1739
|
+
"method": "definition",
|
|
1740
|
+
"text": "How is the voice defined?",
|
|
1741
|
+
"description": "The rule that keeps copy consistent.",
|
|
1742
|
+
"options": [
|
|
1743
|
+
{
|
|
1744
|
+
"id": "word-list",
|
|
1745
|
+
"label": "Rules and a word list"
|
|
1746
|
+
},
|
|
1747
|
+
{
|
|
1748
|
+
"id": "principles",
|
|
1749
|
+
"label": "Principles and examples"
|
|
1750
|
+
},
|
|
1751
|
+
{
|
|
1752
|
+
"id": "shared-core",
|
|
1753
|
+
"label": "A shared core, brand tone on top"
|
|
1754
|
+
}
|
|
1755
|
+
]
|
|
1756
|
+
},
|
|
1757
|
+
{
|
|
1758
|
+
"id": "voice.values",
|
|
1759
|
+
"method": "values",
|
|
1760
|
+
"text": "How does it sound?",
|
|
1761
|
+
"description": "The voice as a word.",
|
|
1762
|
+
"options": [
|
|
1763
|
+
{
|
|
1764
|
+
"id": "terse",
|
|
1765
|
+
"label": "Terse"
|
|
1766
|
+
},
|
|
1767
|
+
{
|
|
1768
|
+
"id": "plain",
|
|
1769
|
+
"label": "Plain and direct"
|
|
1770
|
+
},
|
|
1771
|
+
{
|
|
1772
|
+
"id": "conversational",
|
|
1773
|
+
"label": "Conversational"
|
|
1774
|
+
},
|
|
1775
|
+
{
|
|
1776
|
+
"id": "playful",
|
|
1777
|
+
"label": "Playful"
|
|
1778
|
+
}
|
|
1779
|
+
]
|
|
1780
|
+
},
|
|
1781
|
+
{
|
|
1782
|
+
"id": "voice.lands",
|
|
1783
|
+
"method": "lands",
|
|
1784
|
+
"text": "Where do the words matter most?",
|
|
1785
|
+
"description": "The place where copy does its most important job.",
|
|
1786
|
+
"options": [
|
|
1787
|
+
{
|
|
1788
|
+
"id": "errors-empty",
|
|
1789
|
+
"label": "Errors and empty states"
|
|
1790
|
+
},
|
|
1791
|
+
{
|
|
1792
|
+
"id": "articles",
|
|
1793
|
+
"label": "Articles and guides"
|
|
1794
|
+
},
|
|
1795
|
+
{
|
|
1796
|
+
"id": "forms",
|
|
1797
|
+
"label": "Form steps and errors"
|
|
1798
|
+
},
|
|
1799
|
+
{
|
|
1800
|
+
"id": "headlines",
|
|
1801
|
+
"label": "Headlines and buttons"
|
|
1802
|
+
}
|
|
1803
|
+
]
|
|
1804
|
+
}
|
|
1805
|
+
]
|
|
1806
|
+
},
|
|
1807
|
+
{
|
|
1808
|
+
"id": "components",
|
|
1809
|
+
"kind": "scope",
|
|
1810
|
+
"title": "Components",
|
|
1811
|
+
"description": "Which components the system carries: its inventory, picked from the catalogue.",
|
|
1812
|
+
"owns": [
|
|
1813
|
+
"component"
|
|
1814
|
+
],
|
|
1815
|
+
"lands_in": [
|
|
1816
|
+
"button",
|
|
1817
|
+
"input",
|
|
1818
|
+
"control",
|
|
1819
|
+
"badge",
|
|
1820
|
+
"card",
|
|
1821
|
+
"table",
|
|
1822
|
+
"tabs",
|
|
1823
|
+
"overlay"
|
|
1824
|
+
],
|
|
1825
|
+
"situations": [
|
|
1826
|
+
"missing-component"
|
|
1827
|
+
],
|
|
1828
|
+
"questions": [
|
|
1829
|
+
{
|
|
1830
|
+
"id": "components.roles",
|
|
1831
|
+
"method": "roles",
|
|
1832
|
+
"text": "Which component families does it need?",
|
|
1833
|
+
"description": "The families of the catalogue the inventory draws from. Core is action, form, feedback, overlay, layout and navigation.",
|
|
1834
|
+
"options": [
|
|
1835
|
+
{
|
|
1836
|
+
"id": "core",
|
|
1837
|
+
"label": "Actions, forms, feedback, overlays, layout and navigation"
|
|
1838
|
+
},
|
|
1839
|
+
{
|
|
1840
|
+
"id": "core-data",
|
|
1841
|
+
"label": "Core, plus data"
|
|
1842
|
+
},
|
|
1843
|
+
{
|
|
1844
|
+
"id": "core-content",
|
|
1845
|
+
"label": "Core, plus content and media"
|
|
1846
|
+
},
|
|
1847
|
+
{
|
|
1848
|
+
"id": "core-media",
|
|
1849
|
+
"label": "Core, plus media"
|
|
1850
|
+
}
|
|
1851
|
+
]
|
|
1852
|
+
},
|
|
1853
|
+
{
|
|
1854
|
+
"id": "components.count",
|
|
1855
|
+
"method": "count",
|
|
1856
|
+
"text": "How far does the inventory reach?",
|
|
1857
|
+
"description": "The size of the inventory, as a word. The inventory follows the needs; the word describes it and sets no limit.",
|
|
1858
|
+
"options": [
|
|
1859
|
+
{
|
|
1860
|
+
"id": "few",
|
|
1861
|
+
"label": "Only what today's screens use",
|
|
1862
|
+
"description": "A component joins when a screen in use needs it, not before."
|
|
1863
|
+
},
|
|
1864
|
+
{
|
|
1865
|
+
"id": "some",
|
|
1866
|
+
"label": "What today's screens use, plus what the next ones will likely need",
|
|
1867
|
+
"description": "Covers the screens in use and the ones the team can see coming, so they find the parts ready."
|
|
1868
|
+
},
|
|
1869
|
+
{
|
|
1870
|
+
"id": "many",
|
|
1871
|
+
"label": "Everything its families offer, ready before it's asked for",
|
|
1872
|
+
"description": "Every component the admitted families hold is there from the start, so teams never wait for one."
|
|
1873
|
+
}
|
|
1874
|
+
]
|
|
1875
|
+
},
|
|
1876
|
+
{
|
|
1877
|
+
"id": "components.definition",
|
|
1878
|
+
"method": "definition",
|
|
1879
|
+
"text": "How does a component earn its place?",
|
|
1880
|
+
"description": "The rule that admits a component into the inventory.",
|
|
1881
|
+
"options": [
|
|
1882
|
+
{
|
|
1883
|
+
"id": "scenario",
|
|
1884
|
+
"label": "A use scenario needs it"
|
|
1885
|
+
},
|
|
1886
|
+
{
|
|
1887
|
+
"id": "family",
|
|
1888
|
+
"label": "Its family is in the roles, so product teams find it ready"
|
|
1889
|
+
},
|
|
1890
|
+
{
|
|
1891
|
+
"id": "inclusive",
|
|
1892
|
+
"label": "It works for everyone, with any device and assistive technology"
|
|
1893
|
+
},
|
|
1894
|
+
{
|
|
1895
|
+
"id": "brand-moment",
|
|
1896
|
+
"label": "It gives the brand a moment"
|
|
1897
|
+
}
|
|
1898
|
+
]
|
|
1899
|
+
},
|
|
1900
|
+
{
|
|
1901
|
+
"id": "components.values",
|
|
1902
|
+
"method": "values",
|
|
1903
|
+
"text": "When does a component get another look?",
|
|
1904
|
+
"description": "Variants and sizes per component, as a word.",
|
|
1905
|
+
"options": [
|
|
1906
|
+
{
|
|
1907
|
+
"id": "few",
|
|
1908
|
+
"label": "Only when the meaning changes",
|
|
1909
|
+
"description": "A new variant only for a different meaning, such as the main action or a danger."
|
|
1910
|
+
},
|
|
1911
|
+
{
|
|
1912
|
+
"id": "some",
|
|
1913
|
+
"label": "Also for emphasis and size",
|
|
1914
|
+
"description": "Variants also set how loud a component is and how much room it takes."
|
|
1915
|
+
},
|
|
1916
|
+
{
|
|
1917
|
+
"id": "many",
|
|
1918
|
+
"label": "Also so each brand or page can look its own way",
|
|
1919
|
+
"description": "Variants also let a brand or a page carry its own look on the same component."
|
|
1920
|
+
}
|
|
1921
|
+
]
|
|
1922
|
+
},
|
|
1923
|
+
{
|
|
1924
|
+
"id": "components.lands",
|
|
1925
|
+
"method": "lands",
|
|
1926
|
+
"text": "Where do components do the most work?",
|
|
1927
|
+
"description": "The screens where the inventory is used most.",
|
|
1928
|
+
"options": [
|
|
1929
|
+
{
|
|
1930
|
+
"id": "tables-forms",
|
|
1931
|
+
"label": "Tables and forms"
|
|
1932
|
+
},
|
|
1933
|
+
{
|
|
1934
|
+
"id": "articles",
|
|
1935
|
+
"label": "Articles"
|
|
1936
|
+
},
|
|
1937
|
+
{
|
|
1938
|
+
"id": "forms",
|
|
1939
|
+
"label": "Forms and steps"
|
|
1940
|
+
},
|
|
1941
|
+
{
|
|
1942
|
+
"id": "sign-up-account",
|
|
1943
|
+
"label": "Sign-up and account pages"
|
|
1944
|
+
},
|
|
1945
|
+
{
|
|
1946
|
+
"id": "campaign-sections",
|
|
1947
|
+
"label": "Campaign sections"
|
|
1948
|
+
}
|
|
1949
|
+
]
|
|
1950
|
+
}
|
|
1951
|
+
]
|
|
1952
|
+
}
|
|
1953
|
+
],
|
|
1954
|
+
"situations": [
|
|
1955
|
+
{
|
|
1956
|
+
"id": "page-title",
|
|
1957
|
+
"scope": "typography",
|
|
1958
|
+
"title": "Page title",
|
|
1959
|
+
"description": "The title at the top of a page or view."
|
|
1960
|
+
},
|
|
1961
|
+
{
|
|
1962
|
+
"id": "number-in-table",
|
|
1963
|
+
"scope": "typography",
|
|
1964
|
+
"title": "A number in a table",
|
|
1965
|
+
"description": "A value people compare across rows."
|
|
1966
|
+
},
|
|
1967
|
+
{
|
|
1968
|
+
"id": "paragraph",
|
|
1969
|
+
"scope": "typography",
|
|
1970
|
+
"title": "Paragraph or help text",
|
|
1971
|
+
"description": "Running text: help, descriptions, articles."
|
|
1972
|
+
},
|
|
1973
|
+
{
|
|
1974
|
+
"id": "field-label",
|
|
1975
|
+
"scope": "typography",
|
|
1976
|
+
"title": "Field label or column header",
|
|
1977
|
+
"description": "The name of an input or a table column."
|
|
1978
|
+
},
|
|
1979
|
+
{
|
|
1980
|
+
"id": "selected-row",
|
|
1981
|
+
"scope": "color",
|
|
1982
|
+
"title": "A selected row or item",
|
|
1983
|
+
"description": "The item the user picked in a list or table."
|
|
1984
|
+
},
|
|
1985
|
+
{
|
|
1986
|
+
"id": "error-message",
|
|
1987
|
+
"scope": "color",
|
|
1988
|
+
"title": "An error message",
|
|
1989
|
+
"description": "Text that says something went wrong and how to fix it."
|
|
1990
|
+
},
|
|
1991
|
+
{
|
|
1992
|
+
"id": "link",
|
|
1993
|
+
"scope": "color",
|
|
1994
|
+
"title": "A link",
|
|
1995
|
+
"description": "Text that navigates."
|
|
1996
|
+
},
|
|
1997
|
+
{
|
|
1998
|
+
"id": "status-label",
|
|
1999
|
+
"scope": "color",
|
|
2000
|
+
"title": "A status",
|
|
2001
|
+
"description": "A short state such as paid, late or failed."
|
|
2002
|
+
},
|
|
2003
|
+
{
|
|
2004
|
+
"id": "related-items",
|
|
2005
|
+
"scope": "spacing",
|
|
2006
|
+
"title": "Items that belong together",
|
|
2007
|
+
"description": "A label and its value, or controls in one toolbar."
|
|
2008
|
+
},
|
|
2009
|
+
{
|
|
2010
|
+
"id": "between-sections",
|
|
2011
|
+
"scope": "spacing",
|
|
2012
|
+
"title": "Between page sections",
|
|
2013
|
+
"description": "The break between two sections of a page."
|
|
2014
|
+
},
|
|
2015
|
+
{
|
|
2016
|
+
"id": "table-row",
|
|
2017
|
+
"scope": "spacing",
|
|
2018
|
+
"title": "Table row height",
|
|
2019
|
+
"description": "The vertical size of one row of data."
|
|
2020
|
+
},
|
|
2021
|
+
{
|
|
2022
|
+
"id": "control-corner",
|
|
2023
|
+
"scope": "shape",
|
|
2024
|
+
"title": "Corners of buttons and inputs",
|
|
2025
|
+
"description": "The corner shape of interactive controls."
|
|
2026
|
+
},
|
|
2027
|
+
{
|
|
2028
|
+
"id": "status-shape",
|
|
2029
|
+
"scope": "shape",
|
|
2030
|
+
"title": "Shape of a status badge",
|
|
2031
|
+
"description": "The outline of a status label."
|
|
2032
|
+
},
|
|
2033
|
+
{
|
|
2034
|
+
"id": "card",
|
|
2035
|
+
"scope": "elevation",
|
|
2036
|
+
"title": "A card on the page",
|
|
2037
|
+
"description": "A container that groups content inside a page."
|
|
2038
|
+
},
|
|
2039
|
+
{
|
|
2040
|
+
"id": "menu-or-dialog",
|
|
2041
|
+
"scope": "elevation",
|
|
2042
|
+
"title": "A menu or dialog",
|
|
2043
|
+
"description": "Anything that floats above the page."
|
|
2044
|
+
},
|
|
2045
|
+
{
|
|
2046
|
+
"id": "hover-feedback",
|
|
2047
|
+
"scope": "motion",
|
|
2048
|
+
"title": "Hover and press feedback",
|
|
2049
|
+
"description": "The response when a pointer or finger touches a control."
|
|
2050
|
+
},
|
|
2051
|
+
{
|
|
2052
|
+
"id": "reduced-motion",
|
|
2053
|
+
"scope": "motion",
|
|
2054
|
+
"title": "Someone asked for less motion",
|
|
2055
|
+
"description": "The operating system setting for reduced motion is on."
|
|
2056
|
+
},
|
|
2057
|
+
{
|
|
2058
|
+
"id": "icon-alone",
|
|
2059
|
+
"scope": "iconography",
|
|
2060
|
+
"title": "An icon with no label",
|
|
2061
|
+
"description": "An action shown only as an icon."
|
|
2062
|
+
},
|
|
2063
|
+
{
|
|
2064
|
+
"id": "dark-mode",
|
|
2065
|
+
"scope": "theming",
|
|
2066
|
+
"title": "Someone switches to dark",
|
|
2067
|
+
"description": "The user or the system turns dark mode on."
|
|
2068
|
+
},
|
|
2069
|
+
{
|
|
2070
|
+
"id": "keyboard-focus",
|
|
2071
|
+
"scope": "accessibility",
|
|
2072
|
+
"title": "Keyboard focus",
|
|
2073
|
+
"description": "The control that keyboard input goes to."
|
|
2074
|
+
},
|
|
2075
|
+
{
|
|
2076
|
+
"id": "smallest-target",
|
|
2077
|
+
"scope": "accessibility",
|
|
2078
|
+
"title": "The smallest clickable thing",
|
|
2079
|
+
"description": "The minimum size of anything people can click or tap."
|
|
2080
|
+
},
|
|
2081
|
+
{
|
|
2082
|
+
"id": "commit-action",
|
|
2083
|
+
"scope": "color",
|
|
2084
|
+
"title": "The action that completes the task",
|
|
2085
|
+
"description": "Save, submit, pay: the step that finishes the job."
|
|
2086
|
+
},
|
|
2087
|
+
{
|
|
2088
|
+
"id": "alternative-action",
|
|
2089
|
+
"scope": "color",
|
|
2090
|
+
"title": "An alternative or cancel",
|
|
2091
|
+
"description": "The other way out next to the main action."
|
|
2092
|
+
},
|
|
2093
|
+
{
|
|
2094
|
+
"id": "destructive-action",
|
|
2095
|
+
"scope": "color",
|
|
2096
|
+
"title": "Delete or remove",
|
|
2097
|
+
"description": "An action that destroys data."
|
|
2098
|
+
},
|
|
2099
|
+
{
|
|
2100
|
+
"id": "row-action",
|
|
2101
|
+
"scope": "iconography",
|
|
2102
|
+
"title": "An action on one row or item",
|
|
2103
|
+
"description": "An action repeated on every row of a list."
|
|
2104
|
+
},
|
|
2105
|
+
{
|
|
2106
|
+
"id": "missing-token",
|
|
2107
|
+
"scope": "naming",
|
|
2108
|
+
"title": "A value with no token",
|
|
2109
|
+
"description": "You need a color, size or space that no token names."
|
|
2110
|
+
},
|
|
2111
|
+
{
|
|
2112
|
+
"id": "button-label",
|
|
2113
|
+
"scope": "voice",
|
|
2114
|
+
"title": "A button label",
|
|
2115
|
+
"description": "The words on a button."
|
|
2116
|
+
},
|
|
2117
|
+
{
|
|
2118
|
+
"id": "error-words",
|
|
2119
|
+
"scope": "voice",
|
|
2120
|
+
"title": "The words of an error",
|
|
2121
|
+
"description": "What an error message says, not how it looks."
|
|
2122
|
+
},
|
|
2123
|
+
{
|
|
2124
|
+
"id": "success-words",
|
|
2125
|
+
"scope": "voice",
|
|
2126
|
+
"title": "A success message",
|
|
2127
|
+
"description": "The confirmation after an action works."
|
|
2128
|
+
},
|
|
2129
|
+
{
|
|
2130
|
+
"id": "empty-words",
|
|
2131
|
+
"scope": "voice",
|
|
2132
|
+
"title": "An empty state",
|
|
2133
|
+
"description": "What a list or page says when it has nothing yet."
|
|
2134
|
+
},
|
|
2135
|
+
{
|
|
2136
|
+
"id": "confirm-words",
|
|
2137
|
+
"scope": "voice",
|
|
2138
|
+
"title": "A confirmation question",
|
|
2139
|
+
"description": "The question before something hard to undo."
|
|
2140
|
+
},
|
|
2141
|
+
{
|
|
2142
|
+
"id": "first-visit",
|
|
2143
|
+
"scope": "voice",
|
|
2144
|
+
"title": "A first visit",
|
|
2145
|
+
"description": "What the product says to someone new."
|
|
2146
|
+
},
|
|
2147
|
+
{
|
|
2148
|
+
"id": "missing-component",
|
|
2149
|
+
"scope": "components",
|
|
2150
|
+
"title": "No component in the inventory fits",
|
|
2151
|
+
"description": "You need a component this design system does not carry."
|
|
2152
|
+
}
|
|
2153
|
+
],
|
|
2154
|
+
"components": [
|
|
2155
|
+
{
|
|
2156
|
+
"id": "button",
|
|
2157
|
+
"description": "Triggers an action. Variants: primary, secondary, ghost.",
|
|
2158
|
+
"keys": [
|
|
2159
|
+
"button/primary/background/@",
|
|
2160
|
+
"button/primary/background/hover",
|
|
2161
|
+
"button/primary/label",
|
|
2162
|
+
"button/secondary/background/@",
|
|
2163
|
+
"button/secondary/background/hover",
|
|
2164
|
+
"button/secondary/label",
|
|
2165
|
+
"button/secondary/border",
|
|
2166
|
+
"button/ghost/background-hover",
|
|
2167
|
+
"button/ghost/label",
|
|
2168
|
+
"button/height",
|
|
2169
|
+
"button/padding-x",
|
|
2170
|
+
"button/radius",
|
|
2171
|
+
"button/font-size",
|
|
2172
|
+
"button/font-weight",
|
|
2173
|
+
"button/focus-ring",
|
|
2174
|
+
"button/icon-size",
|
|
2175
|
+
"button/disabled/background",
|
|
2176
|
+
"button/disabled/label",
|
|
2177
|
+
"button/disabled/border"
|
|
2178
|
+
]
|
|
2179
|
+
},
|
|
2180
|
+
{
|
|
2181
|
+
"id": "input",
|
|
2182
|
+
"description": "Single-line text entry, also used by select.",
|
|
2183
|
+
"keys": [
|
|
2184
|
+
"input/background",
|
|
2185
|
+
"input/border/@",
|
|
2186
|
+
"input/border/focus",
|
|
2187
|
+
"input/text",
|
|
2188
|
+
"input/placeholder",
|
|
2189
|
+
"input/height",
|
|
2190
|
+
"input/padding-x",
|
|
2191
|
+
"input/radius",
|
|
2192
|
+
"input/font-size",
|
|
2193
|
+
"input/disabled/background",
|
|
2194
|
+
"input/disabled/border",
|
|
2195
|
+
"input/disabled/text"
|
|
2196
|
+
]
|
|
2197
|
+
},
|
|
2198
|
+
{
|
|
2199
|
+
"id": "control",
|
|
2200
|
+
"description": "Shared keys for checkbox and switch.",
|
|
2201
|
+
"keys": [
|
|
2202
|
+
"control/checked",
|
|
2203
|
+
"control/track",
|
|
2204
|
+
"control/thumb",
|
|
2205
|
+
"control/radius"
|
|
2206
|
+
]
|
|
2207
|
+
},
|
|
2208
|
+
{
|
|
2209
|
+
"id": "badge",
|
|
2210
|
+
"description": "Short status label.",
|
|
2211
|
+
"keys": [
|
|
2212
|
+
"badge/radius",
|
|
2213
|
+
"badge/padding-x",
|
|
2214
|
+
"badge/font-size",
|
|
2215
|
+
"badge/neutral/background",
|
|
2216
|
+
"badge/neutral/label",
|
|
2217
|
+
"badge/info/background",
|
|
2218
|
+
"badge/info/label",
|
|
2219
|
+
"badge/success/background",
|
|
2220
|
+
"badge/success/label",
|
|
2221
|
+
"badge/warning/background",
|
|
2222
|
+
"badge/warning/label",
|
|
2223
|
+
"badge/danger/background",
|
|
2224
|
+
"badge/danger/label"
|
|
2225
|
+
]
|
|
2226
|
+
},
|
|
2227
|
+
{
|
|
2228
|
+
"id": "card",
|
|
2229
|
+
"description": "Groups content inside a page.",
|
|
2230
|
+
"keys": [
|
|
2231
|
+
"card/background",
|
|
2232
|
+
"card/border",
|
|
2233
|
+
"card/radius",
|
|
2234
|
+
"card/padding",
|
|
2235
|
+
"card/shadow"
|
|
2236
|
+
]
|
|
2237
|
+
},
|
|
2238
|
+
{
|
|
2239
|
+
"id": "table",
|
|
2240
|
+
"description": "Rows of data.",
|
|
2241
|
+
"keys": [
|
|
2242
|
+
"table/header-background",
|
|
2243
|
+
"table/row-height",
|
|
2244
|
+
"table/cell-padding-x",
|
|
2245
|
+
"table/row-border",
|
|
2246
|
+
"table/row-selected",
|
|
2247
|
+
"table/font-size"
|
|
2248
|
+
]
|
|
2249
|
+
},
|
|
2250
|
+
{
|
|
2251
|
+
"id": "tabs",
|
|
2252
|
+
"description": "Switches between views.",
|
|
2253
|
+
"keys": [
|
|
2254
|
+
"tabs/indicator",
|
|
2255
|
+
"tabs/label/@",
|
|
2256
|
+
"tabs/label/active"
|
|
2257
|
+
]
|
|
2258
|
+
},
|
|
2259
|
+
{
|
|
2260
|
+
"id": "overlay",
|
|
2261
|
+
"description": "Shared keys for dialog, menu, tooltip and toast.",
|
|
2262
|
+
"keys": [
|
|
2263
|
+
"overlay/background",
|
|
2264
|
+
"overlay/radius",
|
|
2265
|
+
"overlay/shadow",
|
|
2266
|
+
"overlay/scrim",
|
|
2267
|
+
"overlay/item-height",
|
|
2268
|
+
"tooltip/background",
|
|
2269
|
+
"tooltip/label"
|
|
2270
|
+
]
|
|
2271
|
+
},
|
|
2272
|
+
{
|
|
2273
|
+
"id": "transition",
|
|
2274
|
+
"description": "Shared transition keys for hover and press feedback.",
|
|
2275
|
+
"keys": [
|
|
2276
|
+
"transition/duration",
|
|
2277
|
+
"transition/easing"
|
|
2278
|
+
]
|
|
2279
|
+
}
|
|
2280
|
+
],
|
|
2281
|
+
"component_keys": [
|
|
2282
|
+
{
|
|
2283
|
+
"id": "button/primary/background/@",
|
|
2284
|
+
"component": "button",
|
|
2285
|
+
"description": "Primary button fill.",
|
|
2286
|
+
"default": "color.action.primary.@"
|
|
2287
|
+
},
|
|
2288
|
+
{
|
|
2289
|
+
"id": "button/primary/background/hover",
|
|
2290
|
+
"component": "button",
|
|
2291
|
+
"description": "Primary button fill on hover.",
|
|
2292
|
+
"default": "color.action.primary.hover"
|
|
2293
|
+
},
|
|
2294
|
+
{
|
|
2295
|
+
"id": "button/primary/label",
|
|
2296
|
+
"component": "button",
|
|
2297
|
+
"description": "Primary button label color.",
|
|
2298
|
+
"default": "color.text.on-action"
|
|
2299
|
+
},
|
|
2300
|
+
{
|
|
2301
|
+
"id": "button/secondary/background/@",
|
|
2302
|
+
"component": "button",
|
|
2303
|
+
"description": "Secondary button fill.",
|
|
2304
|
+
"default": "color.action.secondary.@"
|
|
2305
|
+
},
|
|
2306
|
+
{
|
|
2307
|
+
"id": "button/secondary/background/hover",
|
|
2308
|
+
"component": "button",
|
|
2309
|
+
"description": "Secondary button fill on hover.",
|
|
2310
|
+
"default": "color.action.secondary.hover"
|
|
2311
|
+
},
|
|
2312
|
+
{
|
|
2313
|
+
"id": "button/secondary/label",
|
|
2314
|
+
"component": "button",
|
|
2315
|
+
"description": "Secondary button label color.",
|
|
2316
|
+
"default": "color.text.primary"
|
|
2317
|
+
},
|
|
2318
|
+
{
|
|
2319
|
+
"id": "button/secondary/border",
|
|
2320
|
+
"component": "button",
|
|
2321
|
+
"description": "Secondary button border.",
|
|
2322
|
+
"default": "color.border.strong"
|
|
2323
|
+
},
|
|
2324
|
+
{
|
|
2325
|
+
"id": "button/ghost/background-hover",
|
|
2326
|
+
"component": "button",
|
|
2327
|
+
"description": "Ghost button fill on hover.",
|
|
2328
|
+
"default": "color.surface.sunken"
|
|
2329
|
+
},
|
|
2330
|
+
{
|
|
2331
|
+
"id": "button/ghost/label",
|
|
2332
|
+
"component": "button",
|
|
2333
|
+
"description": "Ghost button label color.",
|
|
2334
|
+
"default": "color.text.link"
|
|
2335
|
+
},
|
|
2336
|
+
{
|
|
2337
|
+
"id": "button/height",
|
|
2338
|
+
"component": "button",
|
|
2339
|
+
"description": "Button height.",
|
|
2340
|
+
"default": "size.control.default"
|
|
2341
|
+
},
|
|
2342
|
+
{
|
|
2343
|
+
"id": "button/padding-x",
|
|
2344
|
+
"component": "button",
|
|
2345
|
+
"description": "Horizontal padding inside a button.",
|
|
2346
|
+
"default": "space.inset.control-x"
|
|
2347
|
+
},
|
|
2348
|
+
{
|
|
2349
|
+
"id": "button/radius",
|
|
2350
|
+
"component": "button",
|
|
2351
|
+
"description": "Button corner radius.",
|
|
2352
|
+
"default": "radius.control"
|
|
2353
|
+
},
|
|
2354
|
+
{
|
|
2355
|
+
"id": "button/font-size",
|
|
2356
|
+
"component": "button",
|
|
2357
|
+
"description": "Button label size.",
|
|
2358
|
+
"default": "type.label.font-size"
|
|
2359
|
+
},
|
|
2360
|
+
{
|
|
2361
|
+
"id": "button/font-weight",
|
|
2362
|
+
"component": "button",
|
|
2363
|
+
"description": "Button label weight.",
|
|
2364
|
+
"default": "type.label.font-weight"
|
|
2365
|
+
},
|
|
2366
|
+
{
|
|
2367
|
+
"id": "button/focus-ring",
|
|
2368
|
+
"component": "button",
|
|
2369
|
+
"description": "Focus ring color on any button.",
|
|
2370
|
+
"default": "color.border.focus"
|
|
2371
|
+
},
|
|
2372
|
+
{
|
|
2373
|
+
"id": "button/icon-size",
|
|
2374
|
+
"component": "button",
|
|
2375
|
+
"description": "Size of an icon inside a button.",
|
|
2376
|
+
"default": "size.icon"
|
|
2377
|
+
},
|
|
2378
|
+
{
|
|
2379
|
+
"id": "button/disabled/background",
|
|
2380
|
+
"component": "button",
|
|
2381
|
+
"description": "Fill of a disabled button.",
|
|
2382
|
+
"default": "color.disabled.surface"
|
|
2383
|
+
},
|
|
2384
|
+
{
|
|
2385
|
+
"id": "button/disabled/label",
|
|
2386
|
+
"component": "button",
|
|
2387
|
+
"description": "Label of a disabled button.",
|
|
2388
|
+
"default": "color.disabled.text"
|
|
2389
|
+
},
|
|
2390
|
+
{
|
|
2391
|
+
"id": "button/disabled/border",
|
|
2392
|
+
"component": "button",
|
|
2393
|
+
"description": "Border of a disabled secondary button.",
|
|
2394
|
+
"default": "color.disabled.border"
|
|
2395
|
+
},
|
|
2396
|
+
{
|
|
2397
|
+
"id": "input/background",
|
|
2398
|
+
"component": "input",
|
|
2399
|
+
"description": "Input fill.",
|
|
2400
|
+
"default": "color.surface.default"
|
|
2401
|
+
},
|
|
2402
|
+
{
|
|
2403
|
+
"id": "input/border/@",
|
|
2404
|
+
"component": "input",
|
|
2405
|
+
"description": "Input border at rest.",
|
|
2406
|
+
"default": "color.border.strong"
|
|
2407
|
+
},
|
|
2408
|
+
{
|
|
2409
|
+
"id": "input/border/focus",
|
|
2410
|
+
"component": "input",
|
|
2411
|
+
"description": "Input border when focused.",
|
|
2412
|
+
"default": "color.border.focus"
|
|
2413
|
+
},
|
|
2414
|
+
{
|
|
2415
|
+
"id": "input/text",
|
|
2416
|
+
"component": "input",
|
|
2417
|
+
"description": "Typed text color.",
|
|
2418
|
+
"default": "color.text.primary"
|
|
2419
|
+
},
|
|
2420
|
+
{
|
|
2421
|
+
"id": "input/placeholder",
|
|
2422
|
+
"component": "input",
|
|
2423
|
+
"description": "Placeholder text color.",
|
|
2424
|
+
"default": "color.text.muted"
|
|
2425
|
+
},
|
|
2426
|
+
{
|
|
2427
|
+
"id": "input/height",
|
|
2428
|
+
"component": "input",
|
|
2429
|
+
"description": "Input height.",
|
|
2430
|
+
"default": "size.control.default"
|
|
2431
|
+
},
|
|
2432
|
+
{
|
|
2433
|
+
"id": "input/padding-x",
|
|
2434
|
+
"component": "input",
|
|
2435
|
+
"description": "Horizontal padding inside an input.",
|
|
2436
|
+
"default": "space.inset.control-x"
|
|
2437
|
+
},
|
|
2438
|
+
{
|
|
2439
|
+
"id": "input/radius",
|
|
2440
|
+
"component": "input",
|
|
2441
|
+
"description": "Input corner radius.",
|
|
2442
|
+
"default": "radius.control"
|
|
2443
|
+
},
|
|
2444
|
+
{
|
|
2445
|
+
"id": "input/font-size",
|
|
2446
|
+
"component": "input",
|
|
2447
|
+
"description": "Typed text size.",
|
|
2448
|
+
"default": "type.body.font-size"
|
|
2449
|
+
},
|
|
2450
|
+
{
|
|
2451
|
+
"id": "input/disabled/background",
|
|
2452
|
+
"component": "input",
|
|
2453
|
+
"description": "Fill of a disabled input.",
|
|
2454
|
+
"default": "color.disabled.surface"
|
|
2455
|
+
},
|
|
2456
|
+
{
|
|
2457
|
+
"id": "input/disabled/border",
|
|
2458
|
+
"component": "input",
|
|
2459
|
+
"description": "Border of a disabled input.",
|
|
2460
|
+
"default": "color.disabled.border"
|
|
2461
|
+
},
|
|
2462
|
+
{
|
|
2463
|
+
"id": "input/disabled/text",
|
|
2464
|
+
"component": "input",
|
|
2465
|
+
"description": "Text in a disabled input.",
|
|
2466
|
+
"default": "color.disabled.text"
|
|
2467
|
+
},
|
|
2468
|
+
{
|
|
2469
|
+
"id": "control/checked",
|
|
2470
|
+
"component": "control",
|
|
2471
|
+
"description": "Fill of a checked checkbox or an on switch.",
|
|
2472
|
+
"default": "color.action.primary.@"
|
|
2473
|
+
},
|
|
2474
|
+
{
|
|
2475
|
+
"id": "control/track",
|
|
2476
|
+
"component": "control",
|
|
2477
|
+
"description": "Track of an off switch.",
|
|
2478
|
+
"default": "color.border.strong"
|
|
2479
|
+
},
|
|
2480
|
+
{
|
|
2481
|
+
"id": "control/thumb",
|
|
2482
|
+
"component": "control",
|
|
2483
|
+
"description": "Switch thumb and checkmark color.",
|
|
2484
|
+
"default": "color.surface.default"
|
|
2485
|
+
},
|
|
2486
|
+
{
|
|
2487
|
+
"id": "control/radius",
|
|
2488
|
+
"component": "control",
|
|
2489
|
+
"description": "Checkbox corner radius.",
|
|
2490
|
+
"default": "radius.badge"
|
|
2491
|
+
},
|
|
2492
|
+
{
|
|
2493
|
+
"id": "badge/radius",
|
|
2494
|
+
"component": "badge",
|
|
2495
|
+
"description": "Badge corner radius.",
|
|
2496
|
+
"default": "radius.badge"
|
|
2497
|
+
},
|
|
2498
|
+
{
|
|
2499
|
+
"id": "badge/padding-x",
|
|
2500
|
+
"component": "badge",
|
|
2501
|
+
"description": "Horizontal padding inside a badge.",
|
|
2502
|
+
"default": "space.gap.tight"
|
|
2503
|
+
},
|
|
2504
|
+
{
|
|
2505
|
+
"id": "badge/font-size",
|
|
2506
|
+
"component": "badge",
|
|
2507
|
+
"description": "Badge label size.",
|
|
2508
|
+
"default": "type.caption.font-size"
|
|
2509
|
+
},
|
|
2510
|
+
{
|
|
2511
|
+
"id": "badge/neutral/background",
|
|
2512
|
+
"component": "badge",
|
|
2513
|
+
"description": "Neutral badge fill.",
|
|
2514
|
+
"default": "color.surface.sunken"
|
|
2515
|
+
},
|
|
2516
|
+
{
|
|
2517
|
+
"id": "badge/neutral/label",
|
|
2518
|
+
"component": "badge",
|
|
2519
|
+
"description": "Neutral badge label.",
|
|
2520
|
+
"default": "color.text.secondary"
|
|
2521
|
+
},
|
|
2522
|
+
{
|
|
2523
|
+
"id": "badge/info/background",
|
|
2524
|
+
"component": "badge",
|
|
2525
|
+
"description": "Info badge fill.",
|
|
2526
|
+
"default": "color.status.info.subtle"
|
|
2527
|
+
},
|
|
2528
|
+
{
|
|
2529
|
+
"id": "badge/info/label",
|
|
2530
|
+
"component": "badge",
|
|
2531
|
+
"description": "Info badge label.",
|
|
2532
|
+
"default": "color.status.info.@"
|
|
2533
|
+
},
|
|
2534
|
+
{
|
|
2535
|
+
"id": "badge/success/background",
|
|
2536
|
+
"component": "badge",
|
|
2537
|
+
"description": "Success badge fill.",
|
|
2538
|
+
"default": "color.status.success.subtle"
|
|
2539
|
+
},
|
|
2540
|
+
{
|
|
2541
|
+
"id": "badge/success/label",
|
|
2542
|
+
"component": "badge",
|
|
2543
|
+
"description": "Success badge label.",
|
|
2544
|
+
"default": "color.status.success.@"
|
|
2545
|
+
},
|
|
2546
|
+
{
|
|
2547
|
+
"id": "badge/warning/background",
|
|
2548
|
+
"component": "badge",
|
|
2549
|
+
"description": "Warning badge fill.",
|
|
2550
|
+
"default": "color.status.warning.subtle"
|
|
2551
|
+
},
|
|
2552
|
+
{
|
|
2553
|
+
"id": "badge/warning/label",
|
|
2554
|
+
"component": "badge",
|
|
2555
|
+
"description": "Warning badge label.",
|
|
2556
|
+
"default": "color.status.warning.@"
|
|
2557
|
+
},
|
|
2558
|
+
{
|
|
2559
|
+
"id": "badge/danger/background",
|
|
2560
|
+
"component": "badge",
|
|
2561
|
+
"description": "Danger badge fill.",
|
|
2562
|
+
"default": "color.status.danger.subtle"
|
|
2563
|
+
},
|
|
2564
|
+
{
|
|
2565
|
+
"id": "badge/danger/label",
|
|
2566
|
+
"component": "badge",
|
|
2567
|
+
"description": "Danger badge label.",
|
|
2568
|
+
"default": "color.status.danger.@"
|
|
2569
|
+
},
|
|
2570
|
+
{
|
|
2571
|
+
"id": "card/background",
|
|
2572
|
+
"component": "card",
|
|
2573
|
+
"description": "Card fill.",
|
|
2574
|
+
"default": "color.surface.default"
|
|
2575
|
+
},
|
|
2576
|
+
{
|
|
2577
|
+
"id": "card/border",
|
|
2578
|
+
"component": "card",
|
|
2579
|
+
"description": "Card border.",
|
|
2580
|
+
"default": "color.border.default"
|
|
2581
|
+
},
|
|
2582
|
+
{
|
|
2583
|
+
"id": "card/radius",
|
|
2584
|
+
"component": "card",
|
|
2585
|
+
"description": "Card corner radius.",
|
|
2586
|
+
"default": "radius.container"
|
|
2587
|
+
},
|
|
2588
|
+
{
|
|
2589
|
+
"id": "card/padding",
|
|
2590
|
+
"component": "card",
|
|
2591
|
+
"description": "Padding inside a card.",
|
|
2592
|
+
"default": "space.inset.container"
|
|
2593
|
+
},
|
|
2594
|
+
{
|
|
2595
|
+
"id": "card/shadow",
|
|
2596
|
+
"component": "card",
|
|
2597
|
+
"description": "Card shadow.",
|
|
2598
|
+
"default": "elevation.card"
|
|
2599
|
+
},
|
|
2600
|
+
{
|
|
2601
|
+
"id": "table/header-background",
|
|
2602
|
+
"component": "table",
|
|
2603
|
+
"description": "Header row fill.",
|
|
2604
|
+
"default": "color.surface.sunken"
|
|
2605
|
+
},
|
|
2606
|
+
{
|
|
2607
|
+
"id": "table/row-height",
|
|
2608
|
+
"component": "table",
|
|
2609
|
+
"description": "Height of one data row.",
|
|
2610
|
+
"default": "size.row"
|
|
2611
|
+
},
|
|
2612
|
+
{
|
|
2613
|
+
"id": "table/cell-padding-x",
|
|
2614
|
+
"component": "table",
|
|
2615
|
+
"description": "Horizontal padding inside a cell.",
|
|
2616
|
+
"default": "space.inset.cell-x"
|
|
2617
|
+
},
|
|
2618
|
+
{
|
|
2619
|
+
"id": "table/row-border",
|
|
2620
|
+
"component": "table",
|
|
2621
|
+
"description": "Line between rows.",
|
|
2622
|
+
"default": "color.border.default"
|
|
2623
|
+
},
|
|
2624
|
+
{
|
|
2625
|
+
"id": "table/row-selected",
|
|
2626
|
+
"component": "table",
|
|
2627
|
+
"description": "Fill of a selected row.",
|
|
2628
|
+
"default": "color.surface.selected"
|
|
2629
|
+
},
|
|
2630
|
+
{
|
|
2631
|
+
"id": "table/font-size",
|
|
2632
|
+
"component": "table",
|
|
2633
|
+
"description": "Cell text size.",
|
|
2634
|
+
"default": "type.data.font-size"
|
|
2635
|
+
},
|
|
2636
|
+
{
|
|
2637
|
+
"id": "tabs/indicator",
|
|
2638
|
+
"component": "tabs",
|
|
2639
|
+
"description": "Active tab indicator.",
|
|
2640
|
+
"default": "color.action.primary.@"
|
|
2641
|
+
},
|
|
2642
|
+
{
|
|
2643
|
+
"id": "tabs/label/@",
|
|
2644
|
+
"component": "tabs",
|
|
2645
|
+
"description": "Inactive tab label.",
|
|
2646
|
+
"default": "color.text.secondary"
|
|
2647
|
+
},
|
|
2648
|
+
{
|
|
2649
|
+
"id": "tabs/label/active",
|
|
2650
|
+
"component": "tabs",
|
|
2651
|
+
"description": "Active tab label.",
|
|
2652
|
+
"default": "color.text.primary"
|
|
2653
|
+
},
|
|
2654
|
+
{
|
|
2655
|
+
"id": "overlay/background",
|
|
2656
|
+
"component": "overlay",
|
|
2657
|
+
"description": "Fill of a dialog, menu or toast.",
|
|
2658
|
+
"default": "color.surface.raised"
|
|
2659
|
+
},
|
|
2660
|
+
{
|
|
2661
|
+
"id": "overlay/radius",
|
|
2662
|
+
"component": "overlay",
|
|
2663
|
+
"description": "Corner radius of overlays.",
|
|
2664
|
+
"default": "radius.container"
|
|
2665
|
+
},
|
|
2666
|
+
{
|
|
2667
|
+
"id": "overlay/shadow",
|
|
2668
|
+
"component": "overlay",
|
|
2669
|
+
"description": "Shadow of overlays.",
|
|
2670
|
+
"default": "elevation.overlay"
|
|
2671
|
+
},
|
|
2672
|
+
{
|
|
2673
|
+
"id": "overlay/scrim",
|
|
2674
|
+
"component": "overlay",
|
|
2675
|
+
"description": "Color that dims the page behind a dialog.",
|
|
2676
|
+
"default": "color.surface.scrim"
|
|
2677
|
+
},
|
|
2678
|
+
{
|
|
2679
|
+
"id": "overlay/item-height",
|
|
2680
|
+
"component": "overlay",
|
|
2681
|
+
"description": "Height of a menu item.",
|
|
2682
|
+
"default": "size.control.default"
|
|
2683
|
+
},
|
|
2684
|
+
{
|
|
2685
|
+
"id": "tooltip/background",
|
|
2686
|
+
"component": "overlay",
|
|
2687
|
+
"description": "Tooltip fill.",
|
|
2688
|
+
"default": "color.surface.inverse"
|
|
2689
|
+
},
|
|
2690
|
+
{
|
|
2691
|
+
"id": "tooltip/label",
|
|
2692
|
+
"component": "overlay",
|
|
2693
|
+
"description": "Tooltip text.",
|
|
2694
|
+
"default": "color.text.inverse"
|
|
2695
|
+
},
|
|
2696
|
+
{
|
|
2697
|
+
"id": "transition/duration",
|
|
2698
|
+
"component": "transition",
|
|
2699
|
+
"description": "Duration of feedback transitions.",
|
|
2700
|
+
"default": "motion.duration.feedback"
|
|
2701
|
+
},
|
|
2702
|
+
{
|
|
2703
|
+
"id": "transition/easing",
|
|
2704
|
+
"component": "transition",
|
|
2705
|
+
"description": "Easing of feedback transitions.",
|
|
2706
|
+
"default": "motion.easing.standard"
|
|
2707
|
+
}
|
|
2708
|
+
],
|
|
2709
|
+
"semantics": {
|
|
2710
|
+
"description": "What each semantic key is for, written once for every scheme. Each entry says its intent, what to use it for, what not to use it for (and what to use instead) and, where it matters, which fills it may sit on and the contrast it must keep there. Words only; values come from each scheme. The harness checks every rule.",
|
|
2711
|
+
"urgency": {
|
|
2712
|
+
"description": "Status colours go up in urgency: info, then warning, then danger. Pick the level that matches the real risk. Never go up a level to get attention. Success sits outside the order.",
|
|
2713
|
+
"order": [
|
|
2714
|
+
"color.status.info.@",
|
|
2715
|
+
"color.status.warning.@",
|
|
2716
|
+
"color.status.danger.@"
|
|
2717
|
+
]
|
|
2718
|
+
},
|
|
2719
|
+
"keys": [
|
|
2720
|
+
{
|
|
2721
|
+
"id": "color.surface.canvas",
|
|
2722
|
+
"intent": "The page background behind everything.",
|
|
2723
|
+
"use_for": [
|
|
2724
|
+
"Page and app background"
|
|
2725
|
+
],
|
|
2726
|
+
"not_for": [
|
|
2727
|
+
{
|
|
2728
|
+
"when": "Cards and panels on the page",
|
|
2729
|
+
"use": "color.surface.default"
|
|
2730
|
+
}
|
|
2731
|
+
]
|
|
2732
|
+
},
|
|
2733
|
+
{
|
|
2734
|
+
"id": "color.surface.default",
|
|
2735
|
+
"intent": "The base fill for content.",
|
|
2736
|
+
"use_for": [
|
|
2737
|
+
"Cards",
|
|
2738
|
+
"Panels",
|
|
2739
|
+
"Inputs",
|
|
2740
|
+
"Table body"
|
|
2741
|
+
],
|
|
2742
|
+
"not_for": [
|
|
2743
|
+
{
|
|
2744
|
+
"when": "The page behind content",
|
|
2745
|
+
"use": "color.surface.canvas"
|
|
2746
|
+
},
|
|
2747
|
+
{
|
|
2748
|
+
"when": "Menus and popovers above content",
|
|
2749
|
+
"use": "color.surface.raised"
|
|
2750
|
+
}
|
|
2751
|
+
]
|
|
2752
|
+
},
|
|
2753
|
+
{
|
|
2754
|
+
"id": "color.surface.raised",
|
|
2755
|
+
"intent": "Fills that float above content.",
|
|
2756
|
+
"use_for": [
|
|
2757
|
+
"Menus",
|
|
2758
|
+
"Popovers",
|
|
2759
|
+
"Dialogs"
|
|
2760
|
+
],
|
|
2761
|
+
"not_for": [
|
|
2762
|
+
{
|
|
2763
|
+
"when": "Cards in the page flow",
|
|
2764
|
+
"use": "color.surface.default"
|
|
2765
|
+
}
|
|
2766
|
+
]
|
|
2767
|
+
},
|
|
2768
|
+
{
|
|
2769
|
+
"id": "color.surface.sunken",
|
|
2770
|
+
"intent": "A recessed fill, a step below content.",
|
|
2771
|
+
"use_for": [
|
|
2772
|
+
"Table headers",
|
|
2773
|
+
"Wells",
|
|
2774
|
+
"Hover rows"
|
|
2775
|
+
],
|
|
2776
|
+
"not_for": [
|
|
2777
|
+
{
|
|
2778
|
+
"when": "A selected item",
|
|
2779
|
+
"use": "color.surface.selected"
|
|
2780
|
+
}
|
|
2781
|
+
]
|
|
2782
|
+
},
|
|
2783
|
+
{
|
|
2784
|
+
"id": "color.surface.selected",
|
|
2785
|
+
"intent": "The fill of a selected or current item.",
|
|
2786
|
+
"use_for": [
|
|
2787
|
+
"Selected rows",
|
|
2788
|
+
"Current menu item"
|
|
2789
|
+
],
|
|
2790
|
+
"not_for": [
|
|
2791
|
+
{
|
|
2792
|
+
"when": "Hover",
|
|
2793
|
+
"use": "color.surface.sunken"
|
|
2794
|
+
},
|
|
2795
|
+
{
|
|
2796
|
+
"when": "The main action",
|
|
2797
|
+
"use": "color.action.primary.@"
|
|
2798
|
+
}
|
|
2799
|
+
]
|
|
2800
|
+
},
|
|
2801
|
+
{
|
|
2802
|
+
"id": "color.surface.inverse",
|
|
2803
|
+
"intent": "A reversed fill for small, short-lived messages.",
|
|
2804
|
+
"use_for": [
|
|
2805
|
+
"Tooltips",
|
|
2806
|
+
"Toasts"
|
|
2807
|
+
],
|
|
2808
|
+
"not_for": [
|
|
2809
|
+
{
|
|
2810
|
+
"when": "Large areas",
|
|
2811
|
+
"use": "color.surface.default"
|
|
2812
|
+
}
|
|
2813
|
+
]
|
|
2814
|
+
},
|
|
2815
|
+
{
|
|
2816
|
+
"id": "color.surface.scrim",
|
|
2817
|
+
"intent": "The see-through layer behind a modal.",
|
|
2818
|
+
"use_for": [
|
|
2819
|
+
"Behind dialogs and sheets"
|
|
2820
|
+
],
|
|
2821
|
+
"not_for": [
|
|
2822
|
+
{
|
|
2823
|
+
"when": "A solid fill",
|
|
2824
|
+
"use": "color.surface.raised"
|
|
2825
|
+
}
|
|
2826
|
+
]
|
|
2827
|
+
},
|
|
2828
|
+
{
|
|
2829
|
+
"id": "color.text.primary",
|
|
2830
|
+
"intent": "Body text and headings.",
|
|
2831
|
+
"use_for": [
|
|
2832
|
+
"Body text",
|
|
2833
|
+
"Headings",
|
|
2834
|
+
"Tag labels"
|
|
2835
|
+
],
|
|
2836
|
+
"not_for": [
|
|
2837
|
+
{
|
|
2838
|
+
"when": "Text on the main action",
|
|
2839
|
+
"use": "color.text.on-action"
|
|
2840
|
+
},
|
|
2841
|
+
{
|
|
2842
|
+
"when": "Text on an inverse fill",
|
|
2843
|
+
"use": "color.text.inverse"
|
|
2844
|
+
}
|
|
2845
|
+
],
|
|
2846
|
+
"pairs": {
|
|
2847
|
+
"on": [
|
|
2848
|
+
"color.surface.canvas",
|
|
2849
|
+
"color.surface.default",
|
|
2850
|
+
"color.surface.raised",
|
|
2851
|
+
"color.surface.sunken",
|
|
2852
|
+
"color.surface.selected",
|
|
2853
|
+
"color.action.secondary.@",
|
|
2854
|
+
"color.action.secondary.hover",
|
|
2855
|
+
"color.category.1.subtle",
|
|
2856
|
+
"color.category.2.subtle",
|
|
2857
|
+
"color.category.3.subtle",
|
|
2858
|
+
"color.category.4.subtle",
|
|
2859
|
+
"color.category.5.subtle"
|
|
2860
|
+
],
|
|
2861
|
+
"contrast": 4.5
|
|
2862
|
+
}
|
|
2863
|
+
},
|
|
2864
|
+
{
|
|
2865
|
+
"id": "color.text.secondary",
|
|
2866
|
+
"intent": "Supporting text.",
|
|
2867
|
+
"use_for": [
|
|
2868
|
+
"Labels",
|
|
2869
|
+
"Descriptions",
|
|
2870
|
+
"Metadata"
|
|
2871
|
+
],
|
|
2872
|
+
"not_for": [
|
|
2873
|
+
{
|
|
2874
|
+
"when": "The main content",
|
|
2875
|
+
"use": "color.text.primary"
|
|
2876
|
+
}
|
|
2877
|
+
],
|
|
2878
|
+
"pairs": {
|
|
2879
|
+
"on": [
|
|
2880
|
+
"color.surface.canvas",
|
|
2881
|
+
"color.surface.default",
|
|
2882
|
+
"color.surface.raised",
|
|
2883
|
+
"color.surface.sunken"
|
|
2884
|
+
],
|
|
2885
|
+
"contrast": 4.5
|
|
2886
|
+
}
|
|
2887
|
+
},
|
|
2888
|
+
{
|
|
2889
|
+
"id": "color.text.muted",
|
|
2890
|
+
"intent": "The quietest text.",
|
|
2891
|
+
"use_for": [
|
|
2892
|
+
"Placeholders",
|
|
2893
|
+
"Hints",
|
|
2894
|
+
"Timestamps"
|
|
2895
|
+
],
|
|
2896
|
+
"not_for": [
|
|
2897
|
+
{
|
|
2898
|
+
"when": "Anything people must read to act",
|
|
2899
|
+
"use": "color.text.secondary"
|
|
2900
|
+
},
|
|
2901
|
+
{
|
|
2902
|
+
"when": "A disabled control",
|
|
2903
|
+
"use": "color.disabled.text"
|
|
2904
|
+
}
|
|
2905
|
+
],
|
|
2906
|
+
"pairs": {
|
|
2907
|
+
"on": [
|
|
2908
|
+
"color.surface.canvas",
|
|
2909
|
+
"color.surface.default",
|
|
2910
|
+
"color.surface.sunken"
|
|
2911
|
+
],
|
|
2912
|
+
"contrast": 4.5
|
|
2913
|
+
}
|
|
2914
|
+
},
|
|
2915
|
+
{
|
|
2916
|
+
"id": "color.text.inverse",
|
|
2917
|
+
"intent": "Text on an inverse fill.",
|
|
2918
|
+
"use_for": [
|
|
2919
|
+
"Tooltip and toast text"
|
|
2920
|
+
],
|
|
2921
|
+
"not_for": [
|
|
2922
|
+
{
|
|
2923
|
+
"when": "Text on the page",
|
|
2924
|
+
"use": "color.text.primary"
|
|
2925
|
+
}
|
|
2926
|
+
],
|
|
2927
|
+
"pairs": {
|
|
2928
|
+
"on": [
|
|
2929
|
+
"color.surface.inverse"
|
|
2930
|
+
],
|
|
2931
|
+
"contrast": 4.5
|
|
2932
|
+
}
|
|
2933
|
+
},
|
|
2934
|
+
{
|
|
2935
|
+
"id": "color.text.on-action",
|
|
2936
|
+
"intent": "Text and icons on the main action's fill.",
|
|
2937
|
+
"use_for": [
|
|
2938
|
+
"Primary button labels"
|
|
2939
|
+
],
|
|
2940
|
+
"not_for": [
|
|
2941
|
+
{
|
|
2942
|
+
"when": "Text on the page",
|
|
2943
|
+
"use": "color.text.primary"
|
|
2944
|
+
}
|
|
2945
|
+
],
|
|
2946
|
+
"pairs": {
|
|
2947
|
+
"on": [
|
|
2948
|
+
"color.action.primary.@",
|
|
2949
|
+
"color.action.primary.hover"
|
|
2950
|
+
],
|
|
2951
|
+
"contrast": 4.5
|
|
2952
|
+
}
|
|
2953
|
+
},
|
|
2954
|
+
{
|
|
2955
|
+
"id": "color.text.link",
|
|
2956
|
+
"intent": "Links in running text.",
|
|
2957
|
+
"use_for": [
|
|
2958
|
+
"Inline links"
|
|
2959
|
+
],
|
|
2960
|
+
"not_for": [
|
|
2961
|
+
{
|
|
2962
|
+
"when": "Buttons",
|
|
2963
|
+
"use": "color.action.primary.@"
|
|
2964
|
+
}
|
|
2965
|
+
],
|
|
2966
|
+
"pairs": {
|
|
2967
|
+
"on": [
|
|
2968
|
+
"color.surface.canvas",
|
|
2969
|
+
"color.surface.default"
|
|
2970
|
+
],
|
|
2971
|
+
"contrast": 4.5
|
|
2972
|
+
}
|
|
2973
|
+
},
|
|
2974
|
+
{
|
|
2975
|
+
"id": "color.border.default",
|
|
2976
|
+
"intent": "Quiet edges and dividers. Decorative, so it has no contrast minimum.",
|
|
2977
|
+
"use_for": [
|
|
2978
|
+
"Card edges",
|
|
2979
|
+
"Dividers",
|
|
2980
|
+
"Table rules"
|
|
2981
|
+
],
|
|
2982
|
+
"not_for": [
|
|
2983
|
+
{
|
|
2984
|
+
"when": "The edge of a control people must find",
|
|
2985
|
+
"use": "color.border.strong"
|
|
2986
|
+
}
|
|
2987
|
+
]
|
|
2988
|
+
},
|
|
2989
|
+
{
|
|
2990
|
+
"id": "color.border.strong",
|
|
2991
|
+
"intent": "The edge of a control people must find.",
|
|
2992
|
+
"use_for": [
|
|
2993
|
+
"Input borders",
|
|
2994
|
+
"Checkbox borders",
|
|
2995
|
+
"Secondary button borders"
|
|
2996
|
+
],
|
|
2997
|
+
"not_for": [
|
|
2998
|
+
{
|
|
2999
|
+
"when": "A divider",
|
|
3000
|
+
"use": "color.border.default"
|
|
3001
|
+
}
|
|
3002
|
+
],
|
|
3003
|
+
"pairs": {
|
|
3004
|
+
"on": [
|
|
3005
|
+
"color.surface.canvas",
|
|
3006
|
+
"color.surface.default"
|
|
3007
|
+
],
|
|
3008
|
+
"contrast": 3
|
|
3009
|
+
}
|
|
3010
|
+
},
|
|
3011
|
+
{
|
|
3012
|
+
"id": "color.border.focus",
|
|
3013
|
+
"intent": "The focus ring.",
|
|
3014
|
+
"use_for": [
|
|
3015
|
+
"Keyboard focus on any control"
|
|
3016
|
+
],
|
|
3017
|
+
"not_for": [
|
|
3018
|
+
{
|
|
3019
|
+
"when": "A selected item",
|
|
3020
|
+
"use": "color.surface.selected"
|
|
3021
|
+
}
|
|
3022
|
+
],
|
|
3023
|
+
"pairs": {
|
|
3024
|
+
"on": [
|
|
3025
|
+
"color.surface.canvas",
|
|
3026
|
+
"color.surface.default"
|
|
3027
|
+
],
|
|
3028
|
+
"contrast": 3
|
|
3029
|
+
}
|
|
3030
|
+
},
|
|
3031
|
+
{
|
|
3032
|
+
"id": "color.action.primary.@",
|
|
3033
|
+
"intent": "The one main action in a view.",
|
|
3034
|
+
"use_for": [
|
|
3035
|
+
"Primary button fill",
|
|
3036
|
+
"Checked controls",
|
|
3037
|
+
"Active tab indicator"
|
|
3038
|
+
],
|
|
3039
|
+
"not_for": [
|
|
3040
|
+
{
|
|
3041
|
+
"when": "A second action in the same view",
|
|
3042
|
+
"use": "color.action.secondary.@"
|
|
3043
|
+
},
|
|
3044
|
+
{
|
|
3045
|
+
"when": "Links in text",
|
|
3046
|
+
"use": "color.text.link"
|
|
3047
|
+
},
|
|
3048
|
+
{
|
|
3049
|
+
"when": "News or status",
|
|
3050
|
+
"use": "color.status.info.@"
|
|
3051
|
+
}
|
|
3052
|
+
],
|
|
3053
|
+
"pairs": {
|
|
3054
|
+
"on": [
|
|
3055
|
+
"color.surface.canvas",
|
|
3056
|
+
"color.surface.default"
|
|
3057
|
+
],
|
|
3058
|
+
"contrast": 3
|
|
3059
|
+
}
|
|
3060
|
+
},
|
|
3061
|
+
{
|
|
3062
|
+
"id": "color.action.primary.hover",
|
|
3063
|
+
"intent": "The main action under the pointer.",
|
|
3064
|
+
"use_for": [
|
|
3065
|
+
"Primary button hover"
|
|
3066
|
+
],
|
|
3067
|
+
"not_for": [
|
|
3068
|
+
{
|
|
3069
|
+
"when": "The resting state",
|
|
3070
|
+
"use": "color.action.primary.@"
|
|
3071
|
+
}
|
|
3072
|
+
]
|
|
3073
|
+
},
|
|
3074
|
+
{
|
|
3075
|
+
"id": "color.action.secondary.@",
|
|
3076
|
+
"intent": "The fill of other actions.",
|
|
3077
|
+
"use_for": [
|
|
3078
|
+
"Secondary buttons"
|
|
3079
|
+
],
|
|
3080
|
+
"not_for": [
|
|
3081
|
+
{
|
|
3082
|
+
"when": "The main action",
|
|
3083
|
+
"use": "color.action.primary.@"
|
|
3084
|
+
}
|
|
3085
|
+
]
|
|
3086
|
+
},
|
|
3087
|
+
{
|
|
3088
|
+
"id": "color.action.secondary.hover",
|
|
3089
|
+
"intent": "Other actions under the pointer.",
|
|
3090
|
+
"use_for": [
|
|
3091
|
+
"Secondary button hover"
|
|
3092
|
+
],
|
|
3093
|
+
"not_for": [
|
|
3094
|
+
{
|
|
3095
|
+
"when": "The resting state",
|
|
3096
|
+
"use": "color.action.secondary.@"
|
|
3097
|
+
}
|
|
3098
|
+
]
|
|
3099
|
+
},
|
|
3100
|
+
{
|
|
3101
|
+
"id": "color.status.info.@",
|
|
3102
|
+
"intent": "Neutral news: something changed and no action is needed. The lowest level of the urgency order.",
|
|
3103
|
+
"use_for": [
|
|
3104
|
+
"Status text and icons",
|
|
3105
|
+
"Badge labels"
|
|
3106
|
+
],
|
|
3107
|
+
"not_for": [
|
|
3108
|
+
{
|
|
3109
|
+
"when": "Something needs a check",
|
|
3110
|
+
"use": "color.status.warning.@"
|
|
3111
|
+
},
|
|
3112
|
+
{
|
|
3113
|
+
"when": "The main action",
|
|
3114
|
+
"use": "color.action.primary.@"
|
|
3115
|
+
}
|
|
3116
|
+
],
|
|
3117
|
+
"pairs": {
|
|
3118
|
+
"on": [
|
|
3119
|
+
"color.surface.canvas",
|
|
3120
|
+
"color.surface.default",
|
|
3121
|
+
"color.status.info.subtle"
|
|
3122
|
+
],
|
|
3123
|
+
"contrast": 4.5
|
|
3124
|
+
},
|
|
3125
|
+
"order": 1
|
|
3126
|
+
},
|
|
3127
|
+
{
|
|
3128
|
+
"id": "color.status.info.subtle",
|
|
3129
|
+
"intent": "The fill behind info status.",
|
|
3130
|
+
"use_for": [
|
|
3131
|
+
"Info badges",
|
|
3132
|
+
"Banners"
|
|
3133
|
+
],
|
|
3134
|
+
"not_for": [
|
|
3135
|
+
{
|
|
3136
|
+
"when": "Large page areas",
|
|
3137
|
+
"use": "color.surface.default"
|
|
3138
|
+
}
|
|
3139
|
+
]
|
|
3140
|
+
},
|
|
3141
|
+
{
|
|
3142
|
+
"id": "color.status.warning.@",
|
|
3143
|
+
"intent": "Caution: something may go wrong or needs a check, and it can be fixed.",
|
|
3144
|
+
"use_for": [
|
|
3145
|
+
"Status text and icons",
|
|
3146
|
+
"Badge labels"
|
|
3147
|
+
],
|
|
3148
|
+
"not_for": [
|
|
3149
|
+
{
|
|
3150
|
+
"when": "An error, or an action that cannot be undone",
|
|
3151
|
+
"use": "color.status.danger.@"
|
|
3152
|
+
},
|
|
3153
|
+
{
|
|
3154
|
+
"when": "News that needs no action",
|
|
3155
|
+
"use": "color.status.info.@"
|
|
3156
|
+
}
|
|
3157
|
+
],
|
|
3158
|
+
"pairs": {
|
|
3159
|
+
"on": [
|
|
3160
|
+
"color.surface.canvas",
|
|
3161
|
+
"color.surface.default",
|
|
3162
|
+
"color.status.warning.subtle"
|
|
3163
|
+
],
|
|
3164
|
+
"contrast": 4.5
|
|
3165
|
+
},
|
|
3166
|
+
"order": 2
|
|
3167
|
+
},
|
|
3168
|
+
{
|
|
3169
|
+
"id": "color.status.warning.subtle",
|
|
3170
|
+
"intent": "The fill behind warning status.",
|
|
3171
|
+
"use_for": [
|
|
3172
|
+
"Warning badges",
|
|
3173
|
+
"Banners"
|
|
3174
|
+
],
|
|
3175
|
+
"not_for": [
|
|
3176
|
+
{
|
|
3177
|
+
"when": "Large page areas",
|
|
3178
|
+
"use": "color.surface.default"
|
|
3179
|
+
}
|
|
3180
|
+
]
|
|
3181
|
+
},
|
|
3182
|
+
{
|
|
3183
|
+
"id": "color.status.danger.@",
|
|
3184
|
+
"intent": "Real risk: errors, failed checks, actions that cannot be undone. The top of the urgency order. Overuse wears it out.",
|
|
3185
|
+
"use_for": [
|
|
3186
|
+
"Status text and icons",
|
|
3187
|
+
"Badge labels"
|
|
3188
|
+
],
|
|
3189
|
+
"not_for": [
|
|
3190
|
+
{
|
|
3191
|
+
"when": "Caution or advice",
|
|
3192
|
+
"use": "color.status.warning.@"
|
|
3193
|
+
},
|
|
3194
|
+
{
|
|
3195
|
+
"when": "Getting attention",
|
|
3196
|
+
"use": "color.status.info.@"
|
|
3197
|
+
}
|
|
3198
|
+
],
|
|
3199
|
+
"pairs": {
|
|
3200
|
+
"on": [
|
|
3201
|
+
"color.surface.canvas",
|
|
3202
|
+
"color.surface.default",
|
|
3203
|
+
"color.status.danger.subtle"
|
|
3204
|
+
],
|
|
3205
|
+
"contrast": 4.5
|
|
3206
|
+
},
|
|
3207
|
+
"order": 3
|
|
3208
|
+
},
|
|
3209
|
+
{
|
|
3210
|
+
"id": "color.status.danger.subtle",
|
|
3211
|
+
"intent": "The fill behind danger status.",
|
|
3212
|
+
"use_for": [
|
|
3213
|
+
"Danger badges",
|
|
3214
|
+
"Banners"
|
|
3215
|
+
],
|
|
3216
|
+
"not_for": [
|
|
3217
|
+
{
|
|
3218
|
+
"when": "Large page areas",
|
|
3219
|
+
"use": "color.surface.default"
|
|
3220
|
+
}
|
|
3221
|
+
]
|
|
3222
|
+
},
|
|
3223
|
+
{
|
|
3224
|
+
"id": "color.status.success.@",
|
|
3225
|
+
"intent": "Confirmation that something worked. It sits outside the urgency order.",
|
|
3226
|
+
"use_for": [
|
|
3227
|
+
"Status text and icons",
|
|
3228
|
+
"Badge labels"
|
|
3229
|
+
],
|
|
3230
|
+
"not_for": [
|
|
3231
|
+
{
|
|
3232
|
+
"when": "The main action",
|
|
3233
|
+
"use": "color.action.primary.@"
|
|
3234
|
+
},
|
|
3235
|
+
{
|
|
3236
|
+
"when": "Brand colour",
|
|
3237
|
+
"use": "color.action.primary.@"
|
|
3238
|
+
}
|
|
3239
|
+
],
|
|
3240
|
+
"pairs": {
|
|
3241
|
+
"on": [
|
|
3242
|
+
"color.surface.canvas",
|
|
3243
|
+
"color.surface.default",
|
|
3244
|
+
"color.status.success.subtle"
|
|
3245
|
+
],
|
|
3246
|
+
"contrast": 4.5
|
|
3247
|
+
}
|
|
3248
|
+
},
|
|
3249
|
+
{
|
|
3250
|
+
"id": "color.status.success.subtle",
|
|
3251
|
+
"intent": "The fill behind success status.",
|
|
3252
|
+
"use_for": [
|
|
3253
|
+
"Success badges",
|
|
3254
|
+
"Banners"
|
|
3255
|
+
],
|
|
3256
|
+
"not_for": [
|
|
3257
|
+
{
|
|
3258
|
+
"when": "Large page areas",
|
|
3259
|
+
"use": "color.surface.default"
|
|
3260
|
+
}
|
|
3261
|
+
]
|
|
3262
|
+
},
|
|
3263
|
+
{
|
|
3264
|
+
"id": "color.category.1.@",
|
|
3265
|
+
"intent": "Category 1: tells one item or series from another. It carries no meaning.",
|
|
3266
|
+
"use_for": [
|
|
3267
|
+
"Chart series",
|
|
3268
|
+
"Tag dots and icons"
|
|
3269
|
+
],
|
|
3270
|
+
"not_for": [
|
|
3271
|
+
{
|
|
3272
|
+
"when": "Status or risk",
|
|
3273
|
+
"use": "color.status.warning.@"
|
|
3274
|
+
},
|
|
3275
|
+
{
|
|
3276
|
+
"when": "Tag text",
|
|
3277
|
+
"use": "color.text.primary"
|
|
3278
|
+
}
|
|
3279
|
+
],
|
|
3280
|
+
"pairs": {
|
|
3281
|
+
"on": [
|
|
3282
|
+
"color.surface.canvas",
|
|
3283
|
+
"color.surface.default"
|
|
3284
|
+
],
|
|
3285
|
+
"contrast": 3
|
|
3286
|
+
}
|
|
3287
|
+
},
|
|
3288
|
+
{
|
|
3289
|
+
"id": "color.category.1.subtle",
|
|
3290
|
+
"intent": "Category 1: the fill of a tag.",
|
|
3291
|
+
"use_for": [
|
|
3292
|
+
"Tag and label fills"
|
|
3293
|
+
],
|
|
3294
|
+
"not_for": [
|
|
3295
|
+
{
|
|
3296
|
+
"when": "A status badge",
|
|
3297
|
+
"use": "color.status.info.subtle"
|
|
3298
|
+
}
|
|
3299
|
+
]
|
|
3300
|
+
},
|
|
3301
|
+
{
|
|
3302
|
+
"id": "color.category.2.@",
|
|
3303
|
+
"intent": "Category 2: tells one item or series from another. It carries no meaning.",
|
|
3304
|
+
"use_for": [
|
|
3305
|
+
"Chart series",
|
|
3306
|
+
"Tag dots and icons"
|
|
3307
|
+
],
|
|
3308
|
+
"not_for": [
|
|
3309
|
+
{
|
|
3310
|
+
"when": "Status or risk",
|
|
3311
|
+
"use": "color.status.warning.@"
|
|
3312
|
+
},
|
|
3313
|
+
{
|
|
3314
|
+
"when": "Tag text",
|
|
3315
|
+
"use": "color.text.primary"
|
|
3316
|
+
}
|
|
3317
|
+
],
|
|
3318
|
+
"pairs": {
|
|
3319
|
+
"on": [
|
|
3320
|
+
"color.surface.canvas",
|
|
3321
|
+
"color.surface.default"
|
|
3322
|
+
],
|
|
3323
|
+
"contrast": 3
|
|
3324
|
+
}
|
|
3325
|
+
},
|
|
3326
|
+
{
|
|
3327
|
+
"id": "color.category.2.subtle",
|
|
3328
|
+
"intent": "Category 2: the fill of a tag.",
|
|
3329
|
+
"use_for": [
|
|
3330
|
+
"Tag and label fills"
|
|
3331
|
+
],
|
|
3332
|
+
"not_for": [
|
|
3333
|
+
{
|
|
3334
|
+
"when": "A status badge",
|
|
3335
|
+
"use": "color.status.info.subtle"
|
|
3336
|
+
}
|
|
3337
|
+
]
|
|
3338
|
+
},
|
|
3339
|
+
{
|
|
3340
|
+
"id": "color.category.3.@",
|
|
3341
|
+
"intent": "Category 3: tells one item or series from another. It carries no meaning.",
|
|
3342
|
+
"use_for": [
|
|
3343
|
+
"Chart series",
|
|
3344
|
+
"Tag dots and icons"
|
|
3345
|
+
],
|
|
3346
|
+
"not_for": [
|
|
3347
|
+
{
|
|
3348
|
+
"when": "Status or risk",
|
|
3349
|
+
"use": "color.status.warning.@"
|
|
3350
|
+
},
|
|
3351
|
+
{
|
|
3352
|
+
"when": "Tag text",
|
|
3353
|
+
"use": "color.text.primary"
|
|
3354
|
+
}
|
|
3355
|
+
],
|
|
3356
|
+
"pairs": {
|
|
3357
|
+
"on": [
|
|
3358
|
+
"color.surface.canvas",
|
|
3359
|
+
"color.surface.default"
|
|
3360
|
+
],
|
|
3361
|
+
"contrast": 3
|
|
3362
|
+
}
|
|
3363
|
+
},
|
|
3364
|
+
{
|
|
3365
|
+
"id": "color.category.3.subtle",
|
|
3366
|
+
"intent": "Category 3: the fill of a tag.",
|
|
3367
|
+
"use_for": [
|
|
3368
|
+
"Tag and label fills"
|
|
3369
|
+
],
|
|
3370
|
+
"not_for": [
|
|
3371
|
+
{
|
|
3372
|
+
"when": "A status badge",
|
|
3373
|
+
"use": "color.status.info.subtle"
|
|
3374
|
+
}
|
|
3375
|
+
]
|
|
3376
|
+
},
|
|
3377
|
+
{
|
|
3378
|
+
"id": "color.category.4.@",
|
|
3379
|
+
"intent": "Category 4: tells one item or series from another. It carries no meaning.",
|
|
3380
|
+
"use_for": [
|
|
3381
|
+
"Chart series",
|
|
3382
|
+
"Tag dots and icons"
|
|
3383
|
+
],
|
|
3384
|
+
"not_for": [
|
|
3385
|
+
{
|
|
3386
|
+
"when": "Status or risk",
|
|
3387
|
+
"use": "color.status.warning.@"
|
|
3388
|
+
},
|
|
3389
|
+
{
|
|
3390
|
+
"when": "Tag text",
|
|
3391
|
+
"use": "color.text.primary"
|
|
3392
|
+
}
|
|
3393
|
+
],
|
|
3394
|
+
"pairs": {
|
|
3395
|
+
"on": [
|
|
3396
|
+
"color.surface.canvas",
|
|
3397
|
+
"color.surface.default"
|
|
3398
|
+
],
|
|
3399
|
+
"contrast": 3
|
|
3400
|
+
}
|
|
3401
|
+
},
|
|
3402
|
+
{
|
|
3403
|
+
"id": "color.category.4.subtle",
|
|
3404
|
+
"intent": "Category 4: the fill of a tag.",
|
|
3405
|
+
"use_for": [
|
|
3406
|
+
"Tag and label fills"
|
|
3407
|
+
],
|
|
3408
|
+
"not_for": [
|
|
3409
|
+
{
|
|
3410
|
+
"when": "A status badge",
|
|
3411
|
+
"use": "color.status.info.subtle"
|
|
3412
|
+
}
|
|
3413
|
+
]
|
|
3414
|
+
},
|
|
3415
|
+
{
|
|
3416
|
+
"id": "color.category.5.@",
|
|
3417
|
+
"intent": "Category 5: tells one item or series from another. It carries no meaning.",
|
|
3418
|
+
"use_for": [
|
|
3419
|
+
"Chart series",
|
|
3420
|
+
"Tag dots and icons"
|
|
3421
|
+
],
|
|
3422
|
+
"not_for": [
|
|
3423
|
+
{
|
|
3424
|
+
"when": "Status or risk",
|
|
3425
|
+
"use": "color.status.warning.@"
|
|
3426
|
+
},
|
|
3427
|
+
{
|
|
3428
|
+
"when": "Tag text",
|
|
3429
|
+
"use": "color.text.primary"
|
|
3430
|
+
}
|
|
3431
|
+
],
|
|
3432
|
+
"pairs": {
|
|
3433
|
+
"on": [
|
|
3434
|
+
"color.surface.canvas",
|
|
3435
|
+
"color.surface.default"
|
|
3436
|
+
],
|
|
3437
|
+
"contrast": 3
|
|
3438
|
+
}
|
|
3439
|
+
},
|
|
3440
|
+
{
|
|
3441
|
+
"id": "color.category.5.subtle",
|
|
3442
|
+
"intent": "Category 5: the fill of a tag.",
|
|
3443
|
+
"use_for": [
|
|
3444
|
+
"Tag and label fills"
|
|
3445
|
+
],
|
|
3446
|
+
"not_for": [
|
|
3447
|
+
{
|
|
3448
|
+
"when": "A status badge",
|
|
3449
|
+
"use": "color.status.info.subtle"
|
|
3450
|
+
}
|
|
3451
|
+
]
|
|
3452
|
+
},
|
|
3453
|
+
{
|
|
3454
|
+
"id": "color.disabled.text",
|
|
3455
|
+
"intent": "Text and icons of a control that cannot be used right now.",
|
|
3456
|
+
"use_for": [
|
|
3457
|
+
"Disabled labels and icons"
|
|
3458
|
+
],
|
|
3459
|
+
"not_for": [
|
|
3460
|
+
{
|
|
3461
|
+
"when": "Quiet text that still works",
|
|
3462
|
+
"use": "color.text.muted"
|
|
3463
|
+
}
|
|
3464
|
+
],
|
|
3465
|
+
"pairs": {
|
|
3466
|
+
"on": [
|
|
3467
|
+
"color.disabled.surface"
|
|
3468
|
+
],
|
|
3469
|
+
"contrast": null
|
|
3470
|
+
},
|
|
3471
|
+
"exempt": "WCAG 1.4.3 does not ask for contrast on controls that cannot be used."
|
|
3472
|
+
},
|
|
3473
|
+
{
|
|
3474
|
+
"id": "color.disabled.surface",
|
|
3475
|
+
"intent": "The fill of a control that cannot be used right now.",
|
|
3476
|
+
"use_for": [
|
|
3477
|
+
"Disabled buttons and inputs"
|
|
3478
|
+
],
|
|
3479
|
+
"not_for": [
|
|
3480
|
+
{
|
|
3481
|
+
"when": "A quiet fill that still works",
|
|
3482
|
+
"use": "color.surface.sunken"
|
|
3483
|
+
}
|
|
3484
|
+
]
|
|
3485
|
+
},
|
|
3486
|
+
{
|
|
3487
|
+
"id": "color.disabled.border",
|
|
3488
|
+
"intent": "The edge of a control that cannot be used right now.",
|
|
3489
|
+
"use_for": [
|
|
3490
|
+
"Disabled inputs and checkboxes"
|
|
3491
|
+
],
|
|
3492
|
+
"not_for": [
|
|
3493
|
+
{
|
|
3494
|
+
"when": "An enabled control",
|
|
3495
|
+
"use": "color.border.strong"
|
|
3496
|
+
}
|
|
3497
|
+
]
|
|
3498
|
+
}
|
|
3499
|
+
]
|
|
3500
|
+
},
|
|
3501
|
+
"catalogue": {
|
|
3502
|
+
"description": "Every component a design system can carry: the UI components of the shadcn/ui registry (style new-york-v4, MIT), plus toast, which Open DS builds itself, data-table, which wraps TanStack Table after shadcn's Data Table guide, and date-picker, after shadcn's Date Picker. Each scheme picks its inventory from this list through the components scope. The component-api keys in components cover the ones built so far.",
|
|
3503
|
+
"source": "https://github.com/shadcn-ui/ui/tree/main/apps/v4/registry/new-york-v4/ui",
|
|
3504
|
+
"families": [
|
|
3505
|
+
{
|
|
3506
|
+
"id": "action",
|
|
3507
|
+
"description": "Buttons and toggles that start or switch something."
|
|
3508
|
+
},
|
|
3509
|
+
{
|
|
3510
|
+
"id": "form",
|
|
3511
|
+
"description": "Fields, choices and pickers that take input."
|
|
3512
|
+
},
|
|
3513
|
+
{
|
|
3514
|
+
"id": "data",
|
|
3515
|
+
"description": "Tables, charts and counts that show records."
|
|
3516
|
+
},
|
|
3517
|
+
{
|
|
3518
|
+
"id": "navigation",
|
|
3519
|
+
"description": "Menus, tabs, breadcrumbs and bars that move between places."
|
|
3520
|
+
},
|
|
3521
|
+
{
|
|
3522
|
+
"id": "feedback",
|
|
3523
|
+
"description": "Alerts, toasts, loading and empty states that report what happened."
|
|
3524
|
+
},
|
|
3525
|
+
{
|
|
3526
|
+
"id": "overlay",
|
|
3527
|
+
"description": "Dialogs, sheets, popovers and tooltips that sit above the page."
|
|
3528
|
+
},
|
|
3529
|
+
{
|
|
3530
|
+
"id": "layout",
|
|
3531
|
+
"description": "Cards, separators and containers that group and arrange content."
|
|
3532
|
+
},
|
|
3533
|
+
{
|
|
3534
|
+
"id": "content",
|
|
3535
|
+
"description": "Accordions and sections that organise long text."
|
|
3536
|
+
},
|
|
3537
|
+
{
|
|
3538
|
+
"id": "media",
|
|
3539
|
+
"description": "Images, avatars and carousels."
|
|
3540
|
+
},
|
|
3541
|
+
{
|
|
3542
|
+
"id": "conversation",
|
|
3543
|
+
"description": "Messages and attachments for chat interfaces."
|
|
3544
|
+
}
|
|
3545
|
+
],
|
|
3546
|
+
"roles": {
|
|
3547
|
+
"description": "The families each components.roles option admits. Core is the families every system needs.",
|
|
3548
|
+
"core": [
|
|
3549
|
+
"action",
|
|
3550
|
+
"form",
|
|
3551
|
+
"feedback",
|
|
3552
|
+
"overlay",
|
|
3553
|
+
"layout",
|
|
3554
|
+
"navigation"
|
|
3555
|
+
],
|
|
3556
|
+
"core-data": [
|
|
3557
|
+
"action",
|
|
3558
|
+
"form",
|
|
3559
|
+
"feedback",
|
|
3560
|
+
"overlay",
|
|
3561
|
+
"layout",
|
|
3562
|
+
"navigation",
|
|
3563
|
+
"data"
|
|
3564
|
+
],
|
|
3565
|
+
"core-content": [
|
|
3566
|
+
"action",
|
|
3567
|
+
"form",
|
|
3568
|
+
"feedback",
|
|
3569
|
+
"overlay",
|
|
3570
|
+
"layout",
|
|
3571
|
+
"navigation",
|
|
3572
|
+
"content",
|
|
3573
|
+
"media"
|
|
3574
|
+
],
|
|
3575
|
+
"core-media": [
|
|
3576
|
+
"action",
|
|
3577
|
+
"form",
|
|
3578
|
+
"feedback",
|
|
3579
|
+
"overlay",
|
|
3580
|
+
"layout",
|
|
3581
|
+
"navigation",
|
|
3582
|
+
"media"
|
|
3583
|
+
]
|
|
3584
|
+
},
|
|
3585
|
+
"items": [
|
|
3586
|
+
{
|
|
3587
|
+
"id": "accordion",
|
|
3588
|
+
"family": "content",
|
|
3589
|
+
"description": "Stacked sections that open one at a time."
|
|
3590
|
+
},
|
|
3591
|
+
{
|
|
3592
|
+
"id": "alert",
|
|
3593
|
+
"family": "feedback",
|
|
3594
|
+
"description": "A message that stays on the page."
|
|
3595
|
+
},
|
|
3596
|
+
{
|
|
3597
|
+
"id": "alert-dialog",
|
|
3598
|
+
"family": "overlay",
|
|
3599
|
+
"description": "A dialog that asks to confirm an action that cannot be undone."
|
|
3600
|
+
},
|
|
3601
|
+
{
|
|
3602
|
+
"id": "aspect-ratio",
|
|
3603
|
+
"family": "media",
|
|
3604
|
+
"description": "Keeps an image or video at a fixed shape."
|
|
3605
|
+
},
|
|
3606
|
+
{
|
|
3607
|
+
"id": "attachment",
|
|
3608
|
+
"family": "conversation",
|
|
3609
|
+
"description": "A file attached to a message."
|
|
3610
|
+
},
|
|
3611
|
+
{
|
|
3612
|
+
"id": "avatar",
|
|
3613
|
+
"family": "media",
|
|
3614
|
+
"description": "A small image or initials for a person."
|
|
3615
|
+
},
|
|
3616
|
+
{
|
|
3617
|
+
"id": "badge",
|
|
3618
|
+
"family": "feedback",
|
|
3619
|
+
"description": "A short label for a status or count."
|
|
3620
|
+
},
|
|
3621
|
+
{
|
|
3622
|
+
"id": "breadcrumb",
|
|
3623
|
+
"family": "navigation",
|
|
3624
|
+
"description": "The path to the current page."
|
|
3625
|
+
},
|
|
3626
|
+
{
|
|
3627
|
+
"id": "bubble",
|
|
3628
|
+
"family": "conversation",
|
|
3629
|
+
"description": "A chat message bubble."
|
|
3630
|
+
},
|
|
3631
|
+
{
|
|
3632
|
+
"id": "button",
|
|
3633
|
+
"family": "action",
|
|
3634
|
+
"description": "Triggers an action."
|
|
3635
|
+
},
|
|
3636
|
+
{
|
|
3637
|
+
"id": "button-group",
|
|
3638
|
+
"family": "action",
|
|
3639
|
+
"description": "Related buttons joined as one control."
|
|
3640
|
+
},
|
|
3641
|
+
{
|
|
3642
|
+
"id": "calendar",
|
|
3643
|
+
"family": "form",
|
|
3644
|
+
"description": "A month grid for picking dates."
|
|
3645
|
+
},
|
|
3646
|
+
{
|
|
3647
|
+
"id": "card",
|
|
3648
|
+
"family": "layout",
|
|
3649
|
+
"description": "A bordered container for one item or group."
|
|
3650
|
+
},
|
|
3651
|
+
{
|
|
3652
|
+
"id": "carousel",
|
|
3653
|
+
"family": "media",
|
|
3654
|
+
"description": "Slides that move left and right."
|
|
3655
|
+
},
|
|
3656
|
+
{
|
|
3657
|
+
"id": "chart",
|
|
3658
|
+
"family": "data",
|
|
3659
|
+
"description": "Bars, lines and areas built on Recharts."
|
|
3660
|
+
},
|
|
3661
|
+
{
|
|
3662
|
+
"id": "checkbox",
|
|
3663
|
+
"family": "form",
|
|
3664
|
+
"description": "An on-off choice in a list or form."
|
|
3665
|
+
},
|
|
3666
|
+
{
|
|
3667
|
+
"id": "collapsible",
|
|
3668
|
+
"family": "layout",
|
|
3669
|
+
"description": "One section that opens and closes."
|
|
3670
|
+
},
|
|
3671
|
+
{
|
|
3672
|
+
"id": "combobox",
|
|
3673
|
+
"family": "form",
|
|
3674
|
+
"description": "A text field with a filtered list of choices."
|
|
3675
|
+
},
|
|
3676
|
+
{
|
|
3677
|
+
"id": "command",
|
|
3678
|
+
"family": "navigation",
|
|
3679
|
+
"description": "A search-first menu of actions, opened from the keyboard."
|
|
3680
|
+
},
|
|
3681
|
+
{
|
|
3682
|
+
"id": "context-menu",
|
|
3683
|
+
"family": "navigation",
|
|
3684
|
+
"description": "A menu on right-click."
|
|
3685
|
+
},
|
|
3686
|
+
{
|
|
3687
|
+
"id": "data-table",
|
|
3688
|
+
"family": "data",
|
|
3689
|
+
"description": "Many records in one view: search, faceted filters, sorting, column choice, row selection with bulk actions, pagination and a density switch. Wraps TanStack Table, after shadcn's Data Table guide."
|
|
3690
|
+
},
|
|
3691
|
+
{
|
|
3692
|
+
"id": "date-picker",
|
|
3693
|
+
"family": "form",
|
|
3694
|
+
"description": "A button that opens a calendar, for one date or a range. Built on calendar and popover, after shadcn's Date Picker."
|
|
3695
|
+
},
|
|
3696
|
+
{
|
|
3697
|
+
"id": "dialog",
|
|
3698
|
+
"family": "overlay",
|
|
3699
|
+
"description": "A window over the page for a focused task."
|
|
3700
|
+
},
|
|
3701
|
+
{
|
|
3702
|
+
"id": "drawer",
|
|
3703
|
+
"family": "overlay",
|
|
3704
|
+
"description": "A panel that slides up from the bottom, for phones."
|
|
3705
|
+
},
|
|
3706
|
+
{
|
|
3707
|
+
"id": "dropdown-menu",
|
|
3708
|
+
"family": "navigation",
|
|
3709
|
+
"description": "A menu of actions opened from a button."
|
|
3710
|
+
},
|
|
3711
|
+
{
|
|
3712
|
+
"id": "empty",
|
|
3713
|
+
"family": "feedback",
|
|
3714
|
+
"description": "What to show when there is nothing yet."
|
|
3715
|
+
},
|
|
3716
|
+
{
|
|
3717
|
+
"id": "field",
|
|
3718
|
+
"family": "form",
|
|
3719
|
+
"description": "A label, control, hint and error laid out together."
|
|
3720
|
+
},
|
|
3721
|
+
{
|
|
3722
|
+
"id": "form",
|
|
3723
|
+
"family": "form",
|
|
3724
|
+
"description": "Form state and validation wired to fields."
|
|
3725
|
+
},
|
|
3726
|
+
{
|
|
3727
|
+
"id": "hover-card",
|
|
3728
|
+
"family": "overlay",
|
|
3729
|
+
"description": "A preview card on hover."
|
|
3730
|
+
},
|
|
3731
|
+
{
|
|
3732
|
+
"id": "input",
|
|
3733
|
+
"family": "form",
|
|
3734
|
+
"description": "Single-line text entry."
|
|
3735
|
+
},
|
|
3736
|
+
{
|
|
3737
|
+
"id": "input-group",
|
|
3738
|
+
"family": "form",
|
|
3739
|
+
"description": "An input with addons such as icons or buttons."
|
|
3740
|
+
},
|
|
3741
|
+
{
|
|
3742
|
+
"id": "input-otp",
|
|
3743
|
+
"family": "form",
|
|
3744
|
+
"description": "Separate boxes for a one-time code."
|
|
3745
|
+
},
|
|
3746
|
+
{
|
|
3747
|
+
"id": "item",
|
|
3748
|
+
"family": "layout",
|
|
3749
|
+
"description": "A row with media, title, description and actions."
|
|
3750
|
+
},
|
|
3751
|
+
{
|
|
3752
|
+
"id": "kbd",
|
|
3753
|
+
"family": "navigation",
|
|
3754
|
+
"description": "A keyboard key or shortcut."
|
|
3755
|
+
},
|
|
3756
|
+
{
|
|
3757
|
+
"id": "label",
|
|
3758
|
+
"family": "form",
|
|
3759
|
+
"description": "The name of a form control."
|
|
3760
|
+
},
|
|
3761
|
+
{
|
|
3762
|
+
"id": "marker",
|
|
3763
|
+
"family": "conversation",
|
|
3764
|
+
"description": "A divider or status line inside a conversation."
|
|
3765
|
+
},
|
|
3766
|
+
{
|
|
3767
|
+
"id": "menubar",
|
|
3768
|
+
"family": "navigation",
|
|
3769
|
+
"description": "A row of menus, as in desktop apps."
|
|
3770
|
+
},
|
|
3771
|
+
{
|
|
3772
|
+
"id": "message",
|
|
3773
|
+
"family": "conversation",
|
|
3774
|
+
"description": "One message with its author and time."
|
|
3775
|
+
},
|
|
3776
|
+
{
|
|
3777
|
+
"id": "message-scroller",
|
|
3778
|
+
"family": "conversation",
|
|
3779
|
+
"description": "A scrolling list of messages that keeps the newest in view."
|
|
3780
|
+
},
|
|
3781
|
+
{
|
|
3782
|
+
"id": "native-select",
|
|
3783
|
+
"family": "form",
|
|
3784
|
+
"description": "The browser select, styled."
|
|
3785
|
+
},
|
|
3786
|
+
{
|
|
3787
|
+
"id": "navigation-menu",
|
|
3788
|
+
"family": "navigation",
|
|
3789
|
+
"description": "Site navigation with links and panels."
|
|
3790
|
+
},
|
|
3791
|
+
{
|
|
3792
|
+
"id": "pagination",
|
|
3793
|
+
"family": "navigation",
|
|
3794
|
+
"description": "Moves between pages of results."
|
|
3795
|
+
},
|
|
3796
|
+
{
|
|
3797
|
+
"id": "popover",
|
|
3798
|
+
"family": "overlay",
|
|
3799
|
+
"description": "Rich content in a floating panel, opened by click."
|
|
3800
|
+
},
|
|
3801
|
+
{
|
|
3802
|
+
"id": "progress",
|
|
3803
|
+
"family": "feedback",
|
|
3804
|
+
"description": "How far a task has come."
|
|
3805
|
+
},
|
|
3806
|
+
{
|
|
3807
|
+
"id": "radio-group",
|
|
3808
|
+
"family": "form",
|
|
3809
|
+
"description": "One choice from a short list."
|
|
3810
|
+
},
|
|
3811
|
+
{
|
|
3812
|
+
"id": "resizable",
|
|
3813
|
+
"family": "layout",
|
|
3814
|
+
"description": "Panels the user can resize by dragging."
|
|
3815
|
+
},
|
|
3816
|
+
{
|
|
3817
|
+
"id": "scroll-area",
|
|
3818
|
+
"family": "layout",
|
|
3819
|
+
"description": "A region with styled scrollbars."
|
|
3820
|
+
},
|
|
3821
|
+
{
|
|
3822
|
+
"id": "select",
|
|
3823
|
+
"family": "form",
|
|
3824
|
+
"description": "One choice from a list, in a menu."
|
|
3825
|
+
},
|
|
3826
|
+
{
|
|
3827
|
+
"id": "separator",
|
|
3828
|
+
"family": "layout",
|
|
3829
|
+
"description": "A line between groups."
|
|
3830
|
+
},
|
|
3831
|
+
{
|
|
3832
|
+
"id": "sheet",
|
|
3833
|
+
"family": "overlay",
|
|
3834
|
+
"description": "A panel that slides in from an edge."
|
|
3835
|
+
},
|
|
3836
|
+
{
|
|
3837
|
+
"id": "sidebar",
|
|
3838
|
+
"family": "navigation",
|
|
3839
|
+
"description": "The side navigation of an app."
|
|
3840
|
+
},
|
|
3841
|
+
{
|
|
3842
|
+
"id": "skeleton",
|
|
3843
|
+
"family": "feedback",
|
|
3844
|
+
"description": "A placeholder while content loads."
|
|
3845
|
+
},
|
|
3846
|
+
{
|
|
3847
|
+
"id": "slider",
|
|
3848
|
+
"family": "form",
|
|
3849
|
+
"description": "A value picked by dragging along a track."
|
|
3850
|
+
},
|
|
3851
|
+
{
|
|
3852
|
+
"id": "sonner",
|
|
3853
|
+
"family": "feedback",
|
|
3854
|
+
"description": "Stacked toasts, from the Sonner library."
|
|
3855
|
+
},
|
|
3856
|
+
{
|
|
3857
|
+
"id": "spinner",
|
|
3858
|
+
"family": "feedback",
|
|
3859
|
+
"description": "A small loading indicator."
|
|
3860
|
+
},
|
|
3861
|
+
{
|
|
3862
|
+
"id": "switch",
|
|
3863
|
+
"family": "form",
|
|
3864
|
+
"description": "An on-off setting that applies at once."
|
|
3865
|
+
},
|
|
3866
|
+
{
|
|
3867
|
+
"id": "table",
|
|
3868
|
+
"family": "data",
|
|
3869
|
+
"description": "Rows and columns of records."
|
|
3870
|
+
},
|
|
3871
|
+
{
|
|
3872
|
+
"id": "tabs",
|
|
3873
|
+
"family": "navigation",
|
|
3874
|
+
"description": "Switches between views of the same thing."
|
|
3875
|
+
},
|
|
3876
|
+
{
|
|
3877
|
+
"id": "textarea",
|
|
3878
|
+
"family": "form",
|
|
3879
|
+
"description": "Multi-line text entry."
|
|
3880
|
+
},
|
|
3881
|
+
{
|
|
3882
|
+
"id": "toast",
|
|
3883
|
+
"family": "feedback",
|
|
3884
|
+
"description": "A short message that confirms an action and goes away. Open DS builds its own; shadcn now ships sonner for this."
|
|
3885
|
+
},
|
|
3886
|
+
{
|
|
3887
|
+
"id": "toggle",
|
|
3888
|
+
"family": "action",
|
|
3889
|
+
"description": "A button that stays pressed or not."
|
|
3890
|
+
},
|
|
3891
|
+
{
|
|
3892
|
+
"id": "toggle-group",
|
|
3893
|
+
"family": "action",
|
|
3894
|
+
"description": "A set of toggles where one or many stay pressed."
|
|
3895
|
+
},
|
|
3896
|
+
{
|
|
3897
|
+
"id": "tooltip",
|
|
3898
|
+
"family": "overlay",
|
|
3899
|
+
"description": "A short hint on hover or focus."
|
|
3900
|
+
}
|
|
3901
|
+
]
|
|
3902
|
+
}
|
|
3903
|
+
}
|