@tempoxyz/ds 0.3.10 → 0.3.11
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/dist/docs/AGENTS.md +9 -0
- package/dist/docs/components/accordion.md +489 -0
- package/dist/docs/components/address-card.md +147 -0
- package/dist/docs/components/agent-logo.md +194 -0
- package/dist/docs/components/alert-dialog.md +631 -0
- package/dist/docs/components/alert.md +448 -0
- package/dist/docs/components/amount-input.md +305 -0
- package/dist/docs/components/amount.md +794 -0
- package/dist/docs/components/app-shell.md +559 -0
- package/dist/docs/components/asset-chip.md +294 -0
- package/dist/docs/components/autocomplete.md +619 -0
- package/dist/docs/components/avatar.md +321 -0
- package/dist/docs/components/badge.md +339 -0
- package/dist/docs/components/badged-logo.md +116 -0
- package/dist/docs/components/banner.md +379 -0
- package/dist/docs/components/bar-chart.md +208 -0
- package/dist/docs/components/breadcrumbs.md +380 -0
- package/dist/docs/components/button-group.md +286 -0
- package/dist/docs/components/button.md +650 -0
- package/dist/docs/components/calendar.md +375 -0
- package/dist/docs/components/callout.md +96 -0
- package/dist/docs/components/checkbox-group.md +521 -0
- package/dist/docs/components/checkbox.md +467 -0
- package/dist/docs/components/choice-group.md +516 -0
- package/dist/docs/components/choicebox.md +641 -0
- package/dist/docs/components/code.md +100 -0
- package/dist/docs/components/combobox.md +939 -0
- package/dist/docs/components/container.md +257 -0
- package/dist/docs/components/copy-button.md +642 -0
- package/dist/docs/components/date-picker.md +514 -0
- package/dist/docs/components/dialog.md +1332 -0
- package/dist/docs/components/drawer.md +966 -0
- package/dist/docs/components/empty.md +340 -0
- package/dist/docs/components/field.md +570 -0
- package/dist/docs/components/fieldset.md +398 -0
- package/dist/docs/components/frame.md +434 -0
- package/dist/docs/components/gauge.md +299 -0
- package/dist/docs/components/get-started-visual.md +117 -0
- package/dist/docs/components/grid.md +288 -0
- package/dist/docs/components/hero-visual.md +155 -0
- package/dist/docs/components/hex.md +487 -0
- package/dist/docs/components/icon-tile.md +292 -0
- package/dist/docs/components/identicon.md +371 -0
- package/dist/docs/components/inline.md +233 -0
- package/dist/docs/components/inset.md +225 -0
- package/dist/docs/components/kbd.md +423 -0
- package/dist/docs/components/list-group.md +981 -0
- package/dist/docs/components/loading-dots.md +237 -0
- package/dist/docs/components/menu.md +934 -0
- package/dist/docs/components/native-select.md +204 -0
- package/dist/docs/components/network-logo.md +248 -0
- package/dist/docs/components/number-field.md +543 -0
- package/dist/docs/components/otp-field.md +616 -0
- package/dist/docs/components/pagination.md +516 -0
- package/dist/docs/components/popover.md +544 -0
- package/dist/docs/components/progress.md +388 -0
- package/dist/docs/components/qr.md +314 -0
- package/dist/docs/components/radio-group.md +528 -0
- package/dist/docs/components/secret-value.md +406 -0
- package/dist/docs/components/select.md +751 -0
- package/dist/docs/components/separator.md +379 -0
- package/dist/docs/components/sidebar-menu.md +922 -0
- package/dist/docs/components/skeleton.md +517 -0
- package/dist/docs/components/slider.md +539 -0
- package/dist/docs/components/snippet.md +424 -0
- package/dist/docs/components/spinner.md +216 -0
- package/dist/docs/components/split-bar.md +139 -0
- package/dist/docs/components/split-button.md +464 -0
- package/dist/docs/components/stack.md +299 -0
- package/dist/docs/components/status-chip.md +226 -0
- package/dist/docs/components/status-indicator.md +119 -0
- package/dist/docs/components/status-row.md +174 -0
- package/dist/docs/components/stepper.md +451 -0
- package/dist/docs/components/success-hero.md +157 -0
- package/dist/docs/components/surface.md +639 -0
- package/dist/docs/components/switch.md +472 -0
- package/dist/docs/components/table.md +967 -0
- package/dist/docs/components/tabs.md +627 -0
- package/dist/docs/components/tempo-logo.md +185 -0
- package/dist/docs/components/text-input.md +624 -0
- package/dist/docs/components/textarea.md +352 -0
- package/dist/docs/components/toast.md +535 -0
- package/dist/docs/components/token-logo.md +371 -0
- package/dist/docs/components/token.md +247 -0
- package/dist/docs/components/tooltip.md +490 -0
- package/dist/docs/components/verification-code.md +116 -0
- package/dist/docs/components/visual.md +249 -0
- package/dist/docs/components.md +203 -0
- package/dist/docs/foundations/accessibility.md +377 -0
- package/dist/docs/foundations/agents.md +150 -0
- package/dist/docs/foundations/color.md +522 -0
- package/dist/docs/foundations/content/tone.md +194 -0
- package/dist/docs/foundations/content/voice.md +194 -0
- package/dist/docs/foundations/content/writing-style.md +406 -0
- package/dist/docs/foundations/iconography.md +282 -0
- package/dist/docs/foundations/intent.md +360 -0
- package/dist/docs/foundations/layout.md +508 -0
- package/dist/docs/foundations/linter.md +296 -0
- package/dist/docs/foundations/motion.md +151 -0
- package/dist/docs/foundations/radius-and-padding.md +86 -0
- package/dist/docs/foundations/typography.md +266 -0
- package/dist/docs/index.md +137 -0
- package/dist/docs/introduction/faq.md +132 -0
- package/dist/docs/introduction/getting-started.md +377 -0
- package/dist/docs/patterns/blockchain-values.md +709 -0
- package/dist/docs/patterns/dashboards.md +638 -0
- package/dist/docs/patterns/destructive-actions.md +626 -0
- package/dist/docs/patterns/empty-states.md +612 -0
- package/dist/docs/patterns/errors-and-validation.md +808 -0
- package/dist/docs/patterns/feedback-and-status.md +518 -0
- package/dist/docs/patterns/forms.md +679 -0
- package/dist/docs/patterns/loading.md +630 -0
- package/dist/docs/patterns/navigation.md +397 -0
- package/dist/docs/patterns/payments.md +765 -0
- package/dist/docs/patterns/responsive-layout.md +997 -0
- package/dist/docs/patterns/tables-and-lists.md +964 -0
- package/dist/docs/products/tempo-console.md +671 -0
- package/dist/docs/products/tempo-performance.md +437 -0
- package/dist/docs/products/tempo-wallet.md +438 -0
- package/package.json +1 -1
|
@@ -0,0 +1,521 @@
|
|
|
1
|
+
# CheckboxGroup
|
|
2
|
+
|
|
3
|
+
Shares one value array across a group of checkboxes.
|
|
4
|
+
|
|
5
|
+
[View source and API](https://github.com/tempoxyz/ds/blob/main/src/web/components/CheckboxGroup.tsx)
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Each [Checkbox](/docs/components/checkbox) inside it joins the array under its `value`.
|
|
10
|
+
|
|
11
|
+
## Examples
|
|
12
|
+
|
|
13
|
+
### Basic
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import { Checkbox, CheckboxGroup, Field } from '@tempoxyz/ds'
|
|
17
|
+
|
|
18
|
+
export function Demo() {
|
|
19
|
+
return (
|
|
20
|
+
<CheckboxGroup aria-label="Currencies" defaultValue={['usdc']}>
|
|
21
|
+
{(['USDC', 'USDT', 'EURC'] as const).map((label) => (
|
|
22
|
+
<Field.Root key={label}>
|
|
23
|
+
<Field.Item>
|
|
24
|
+
<Checkbox value={label.toLowerCase()} />
|
|
25
|
+
<Field.Label>{label}</Field.Label>
|
|
26
|
+
</Field.Item>
|
|
27
|
+
</Field.Root>
|
|
28
|
+
))}
|
|
29
|
+
</CheckboxGroup>
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/CheckboxGroup/Basic.tsx)
|
|
35
|
+
|
|
36
|
+
### Parent
|
|
37
|
+
|
|
38
|
+
For a select-all box, pass every option to `allValues` and add a `Checkbox` with `parent`.
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
import { Checkbox, CheckboxGroup, Field } from '@tempoxyz/ds'
|
|
42
|
+
|
|
43
|
+
function Item(props: Checkbox.Props & { label: string }) {
|
|
44
|
+
const { label, ...checkbox } = props
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<Field.Root>
|
|
48
|
+
<Field.Item>
|
|
49
|
+
<Checkbox {...checkbox} />
|
|
50
|
+
<Field.Label>{label}</Field.Label>
|
|
51
|
+
</Field.Item>
|
|
52
|
+
</Field.Root>
|
|
53
|
+
)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function Demo() {
|
|
57
|
+
return (
|
|
58
|
+
<CheckboxGroup
|
|
59
|
+
allValues={['usdc', 'usdt', 'eurc']}
|
|
60
|
+
aria-label="Currencies"
|
|
61
|
+
defaultValue={['usdc']}
|
|
62
|
+
>
|
|
63
|
+
<Checkbox aria-label="All currencies" parent />
|
|
64
|
+
<Item label="USDC" name="usdc" value="usdc" />
|
|
65
|
+
<Item label="USDT" name="usdt" value="usdt" />
|
|
66
|
+
<Item label="EURC" name="eurc" value="eurc" />
|
|
67
|
+
</CheckboxGroup>
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/CheckboxGroup/Parent.tsx)
|
|
73
|
+
|
|
74
|
+
### Disabled
|
|
75
|
+
|
|
76
|
+
Set `disabled` to disable every checkbox in the group.
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
import { Checkbox, CheckboxGroup, Field } from '@tempoxyz/ds'
|
|
80
|
+
|
|
81
|
+
export function Demo() {
|
|
82
|
+
return (
|
|
83
|
+
<CheckboxGroup aria-label="Currencies" defaultValue={['usdc']} disabled>
|
|
84
|
+
{(['USDC', 'USDT', 'EURC'] as const).map((label) => (
|
|
85
|
+
<Field.Root key={label}>
|
|
86
|
+
<Field.Item>
|
|
87
|
+
<Checkbox value={label.toLowerCase()} />
|
|
88
|
+
<Field.Label>{label}</Field.Label>
|
|
89
|
+
</Field.Item>
|
|
90
|
+
</Field.Root>
|
|
91
|
+
))}
|
|
92
|
+
</CheckboxGroup>
|
|
93
|
+
)
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/CheckboxGroup/Disabled.tsx)
|
|
98
|
+
|
|
99
|
+
## Anatomy
|
|
100
|
+
|
|
101
|
+
Import the component and assemble its parts.
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
import { CheckboxGroup, Checkbox } from '@tempoxyz/ds'
|
|
105
|
+
|
|
106
|
+
<CheckboxGroup>
|
|
107
|
+
<Checkbox />
|
|
108
|
+
</CheckboxGroup>
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Guidelines
|
|
112
|
+
|
|
113
|
+
### When to Use
|
|
114
|
+
|
|
115
|
+
* Choose any number of related options from a short list, such as webhook events or accepted currencies.
|
|
116
|
+
* Add a select-all box over that list with a `parent` checkbox.
|
|
117
|
+
|
|
118
|
+
### When Not to Use
|
|
119
|
+
|
|
120
|
+
* If only one option can be chosen, use [RadioGroup](/docs/components/radio-group).
|
|
121
|
+
* Use [Combobox](/docs/components/combobox) with `multiple` for a long list filtered by typing, such as assets.
|
|
122
|
+
* If each option needs an icon or a description, use `Choicebox.CheckboxGroup` from [Choicebox](/docs/components/choicebox).
|
|
123
|
+
* Use a single [Checkbox](/docs/components/checkbox) for one independent choice.
|
|
124
|
+
* If choices apply immediately, as in a settings list, use a [Switch](/docs/components/switch) for each.
|
|
125
|
+
|
|
126
|
+
### Name the Group With Its Question
|
|
127
|
+
|
|
128
|
+
Give the group an `aria-label`, or a `Field.Label` inside a `Field.Root`.
|
|
129
|
+
|
|
130
|
+
**Do:** Phrase the name as the question the options answer.
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
/**
|
|
134
|
+
* Do example for "Name the Group With Its Question" on the CheckboxGroup page.
|
|
135
|
+
* Phrase the name as the question the options answer.
|
|
136
|
+
* @module
|
|
137
|
+
*/
|
|
138
|
+
import { Checkbox, CheckboxGroup, Field } from '@tempoxyz/ds'
|
|
139
|
+
|
|
140
|
+
const events = ['Payment confirmed', 'Payment failed', 'Refund issued']
|
|
141
|
+
|
|
142
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
143
|
+
export function Demo() {
|
|
144
|
+
return (
|
|
145
|
+
<Field.Root>
|
|
146
|
+
<Field.Label>Which events should this webhook send?</Field.Label>
|
|
147
|
+
<CheckboxGroup defaultValue={['Payment confirmed']}>
|
|
148
|
+
{events.map((event) => (
|
|
149
|
+
<Field.Root key={event}>
|
|
150
|
+
<Field.Item>
|
|
151
|
+
<Checkbox value={event} />
|
|
152
|
+
<Field.Label>{event}</Field.Label>
|
|
153
|
+
</Field.Item>
|
|
154
|
+
</Field.Root>
|
|
155
|
+
))}
|
|
156
|
+
</CheckboxGroup>
|
|
157
|
+
</Field.Root>
|
|
158
|
+
)
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**Don't:** Use a generic name, such as Options.
|
|
163
|
+
|
|
164
|
+
```tsx
|
|
165
|
+
/**
|
|
166
|
+
* Don't example for "Name the Group With Its Question" on the CheckboxGroup page.
|
|
167
|
+
* Don't use a generic name, such as Options.
|
|
168
|
+
* @module
|
|
169
|
+
*/
|
|
170
|
+
import { Checkbox, CheckboxGroup, Field } from '@tempoxyz/ds'
|
|
171
|
+
|
|
172
|
+
const events = ['Payment confirmed', 'Payment failed', 'Refund issued']
|
|
173
|
+
|
|
174
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
175
|
+
export function Demo() {
|
|
176
|
+
return (
|
|
177
|
+
<Field.Root>
|
|
178
|
+
<Field.Label>Options</Field.Label>
|
|
179
|
+
<CheckboxGroup defaultValue={['Payment confirmed']}>
|
|
180
|
+
{events.map((event) => (
|
|
181
|
+
<Field.Root key={event}>
|
|
182
|
+
<Field.Item>
|
|
183
|
+
<Checkbox value={event} />
|
|
184
|
+
<Field.Label>{event}</Field.Label>
|
|
185
|
+
</Field.Item>
|
|
186
|
+
</Field.Root>
|
|
187
|
+
))}
|
|
188
|
+
</CheckboxGroup>
|
|
189
|
+
</Field.Root>
|
|
190
|
+
)
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Stack Options in a Column
|
|
195
|
+
|
|
196
|
+
**Do:** Keep the default column, so each box lines up with its label.
|
|
197
|
+
|
|
198
|
+
```tsx
|
|
199
|
+
/**
|
|
200
|
+
* Do example for "Stack Options in a Column" on the CheckboxGroup page.
|
|
201
|
+
* Keep the default column, so each box lines up with its label.
|
|
202
|
+
* @module
|
|
203
|
+
*/
|
|
204
|
+
import { Checkbox, CheckboxGroup, Field } from '@tempoxyz/ds'
|
|
205
|
+
|
|
206
|
+
const events = ['Payment confirmed', 'Payment failed', 'Refund issued']
|
|
207
|
+
|
|
208
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
209
|
+
export function Demo() {
|
|
210
|
+
return (
|
|
211
|
+
<CheckboxGroup aria-label="Webhook events" defaultValue={['Payment confirmed']}>
|
|
212
|
+
{events.map((event) => (
|
|
213
|
+
<Field.Root key={event}>
|
|
214
|
+
<Field.Item>
|
|
215
|
+
<Checkbox value={event} />
|
|
216
|
+
<Field.Label>{event}</Field.Label>
|
|
217
|
+
</Field.Item>
|
|
218
|
+
</Field.Root>
|
|
219
|
+
))}
|
|
220
|
+
</CheckboxGroup>
|
|
221
|
+
)
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Don't:** Run options together in a wrapping row.
|
|
226
|
+
|
|
227
|
+
```tsx
|
|
228
|
+
/**
|
|
229
|
+
* Don't example for "Stack Options in a Column" on the CheckboxGroup page.
|
|
230
|
+
* Don't run options together in a wrapping row.
|
|
231
|
+
* @module
|
|
232
|
+
*/
|
|
233
|
+
import { Checkbox, CheckboxGroup, Field, style } from '@tempoxyz/ds'
|
|
234
|
+
|
|
235
|
+
const events = ['Payment confirmed', 'Payment failed', 'Refund issued']
|
|
236
|
+
|
|
237
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
238
|
+
export function Demo() {
|
|
239
|
+
return (
|
|
240
|
+
<CheckboxGroup aria-label="Webhook events" defaultValue={['Payment confirmed']}>
|
|
241
|
+
<div {...styles.row()}>
|
|
242
|
+
{events.map((event) => (
|
|
243
|
+
<Field.Root key={event}>
|
|
244
|
+
<Field.Item>
|
|
245
|
+
<Checkbox value={event} />
|
|
246
|
+
<Field.Label>{event}</Field.Label>
|
|
247
|
+
</Field.Item>
|
|
248
|
+
</Field.Root>
|
|
249
|
+
))}
|
|
250
|
+
</div>
|
|
251
|
+
</CheckboxGroup>
|
|
252
|
+
)
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
namespace styles {
|
|
256
|
+
export const row = style({ columnGap: '12', display: 'flex', flexWrap: 'wrap', rowGap: '8' })
|
|
257
|
+
}
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### Keep the List Short and Ordered
|
|
261
|
+
|
|
262
|
+
Sort long lists of names alphabetically. If the list no longer fits without scrolling, switch to a [Combobox](/docs/components/combobox) with `multiple`.
|
|
263
|
+
|
|
264
|
+
**Do:** Order options predictably, such as by payment lifecycle.
|
|
265
|
+
|
|
266
|
+
```tsx
|
|
267
|
+
/**
|
|
268
|
+
* Do example for "Keep the List Short and Ordered" on the CheckboxGroup page.
|
|
269
|
+
* Order options predictably, such as by payment lifecycle.
|
|
270
|
+
* @module
|
|
271
|
+
*/
|
|
272
|
+
import { Checkbox, CheckboxGroup, Field } from '@tempoxyz/ds'
|
|
273
|
+
|
|
274
|
+
const events = ['Payment created', 'Payment confirmed', 'Payment refunded']
|
|
275
|
+
|
|
276
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
277
|
+
export function Demo() {
|
|
278
|
+
return (
|
|
279
|
+
<CheckboxGroup aria-label="Webhook events" defaultValue={['Payment confirmed']}>
|
|
280
|
+
{events.map((event) => (
|
|
281
|
+
<Field.Root key={event}>
|
|
282
|
+
<Field.Item>
|
|
283
|
+
<Checkbox value={event} />
|
|
284
|
+
<Field.Label>{event}</Field.Label>
|
|
285
|
+
</Field.Item>
|
|
286
|
+
</Field.Root>
|
|
287
|
+
))}
|
|
288
|
+
</CheckboxGroup>
|
|
289
|
+
)
|
|
290
|
+
}
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**Don't:** List options in an arbitrary order.
|
|
294
|
+
|
|
295
|
+
```tsx
|
|
296
|
+
/**
|
|
297
|
+
* Don't example for "Keep the List Short and Ordered" on the CheckboxGroup page.
|
|
298
|
+
* Don't list options in an arbitrary order.
|
|
299
|
+
* @module
|
|
300
|
+
*/
|
|
301
|
+
import { Checkbox, CheckboxGroup, Field } from '@tempoxyz/ds'
|
|
302
|
+
|
|
303
|
+
const events = ['Payment refunded', 'Payment created', 'Payment confirmed']
|
|
304
|
+
|
|
305
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
306
|
+
export function Demo() {
|
|
307
|
+
return (
|
|
308
|
+
<CheckboxGroup aria-label="Webhook events" defaultValue={['Payment confirmed']}>
|
|
309
|
+
{events.map((event) => (
|
|
310
|
+
<Field.Root key={event}>
|
|
311
|
+
<Field.Item>
|
|
312
|
+
<Checkbox value={event} />
|
|
313
|
+
<Field.Label>{event}</Field.Label>
|
|
314
|
+
</Field.Item>
|
|
315
|
+
</Field.Root>
|
|
316
|
+
))}
|
|
317
|
+
</CheckboxGroup>
|
|
318
|
+
)
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### Put the Parent Box First
|
|
323
|
+
|
|
324
|
+
**Do:** Put the `parent` checkbox first, and label it after the set, such as All events.
|
|
325
|
+
|
|
326
|
+
```tsx
|
|
327
|
+
/**
|
|
328
|
+
* Do example for "Put the Parent Box First" on the CheckboxGroup page.
|
|
329
|
+
* Put the `parent` checkbox first, and label it after the set, such as All events.
|
|
330
|
+
* @module
|
|
331
|
+
*/
|
|
332
|
+
import { Checkbox, CheckboxGroup, Field } from '@tempoxyz/ds'
|
|
333
|
+
|
|
334
|
+
const events = ['Payment confirmed', 'Payment failed', 'Refund issued']
|
|
335
|
+
|
|
336
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
337
|
+
export function Demo() {
|
|
338
|
+
return (
|
|
339
|
+
<CheckboxGroup
|
|
340
|
+
allValues={events}
|
|
341
|
+
aria-label="Webhook events"
|
|
342
|
+
defaultValue={['Payment confirmed']}
|
|
343
|
+
>
|
|
344
|
+
<Field.Root>
|
|
345
|
+
<Field.Item>
|
|
346
|
+
<Checkbox parent />
|
|
347
|
+
<Field.Label>All events</Field.Label>
|
|
348
|
+
</Field.Item>
|
|
349
|
+
</Field.Root>
|
|
350
|
+
{events.map((event) => (
|
|
351
|
+
<Field.Root key={event}>
|
|
352
|
+
<Field.Item>
|
|
353
|
+
<Checkbox value={event} />
|
|
354
|
+
<Field.Label>{event}</Field.Label>
|
|
355
|
+
</Field.Item>
|
|
356
|
+
</Field.Root>
|
|
357
|
+
))}
|
|
358
|
+
</CheckboxGroup>
|
|
359
|
+
)
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
**Don't:** Put a generic Select all after the options.
|
|
364
|
+
|
|
365
|
+
```tsx
|
|
366
|
+
/**
|
|
367
|
+
* Don't example for "Put the Parent Box First" on the CheckboxGroup page.
|
|
368
|
+
* Don't put a generic Select all after the options.
|
|
369
|
+
* @module
|
|
370
|
+
*/
|
|
371
|
+
import { Checkbox, CheckboxGroup, Field } from '@tempoxyz/ds'
|
|
372
|
+
|
|
373
|
+
const events = ['Payment confirmed', 'Payment failed', 'Refund issued']
|
|
374
|
+
|
|
375
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
376
|
+
export function Demo() {
|
|
377
|
+
return (
|
|
378
|
+
<CheckboxGroup
|
|
379
|
+
allValues={events}
|
|
380
|
+
aria-label="Webhook events"
|
|
381
|
+
defaultValue={['Payment confirmed']}
|
|
382
|
+
>
|
|
383
|
+
{events.map((event) => (
|
|
384
|
+
<Field.Root key={event}>
|
|
385
|
+
<Field.Item>
|
|
386
|
+
<Checkbox value={event} />
|
|
387
|
+
<Field.Label>{event}</Field.Label>
|
|
388
|
+
</Field.Item>
|
|
389
|
+
</Field.Root>
|
|
390
|
+
))}
|
|
391
|
+
<Field.Root>
|
|
392
|
+
<Field.Item>
|
|
393
|
+
<Checkbox parent />
|
|
394
|
+
<Field.Label>Select all</Field.Label>
|
|
395
|
+
</Field.Item>
|
|
396
|
+
</Field.Root>
|
|
397
|
+
</CheckboxGroup>
|
|
398
|
+
)
|
|
399
|
+
}
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
### Validate the Group as a Whole
|
|
403
|
+
|
|
404
|
+
**Do:** If at least one option is required, show one `Field.Error` for the group.
|
|
405
|
+
|
|
406
|
+
```tsx
|
|
407
|
+
/**
|
|
408
|
+
* Do example for "Validate the Group as a Whole" on the CheckboxGroup page.
|
|
409
|
+
* If at least one option is required, show one `Field.Error` for the group.
|
|
410
|
+
* @module
|
|
411
|
+
*/
|
|
412
|
+
import { Checkbox, CheckboxGroup, Field } from '@tempoxyz/ds'
|
|
413
|
+
|
|
414
|
+
const events = ['Payment confirmed', 'Payment failed', 'Refund issued']
|
|
415
|
+
|
|
416
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
417
|
+
export function Demo() {
|
|
418
|
+
return (
|
|
419
|
+
<Field.Root invalid>
|
|
420
|
+
<Field.Label>Which events should this webhook send?</Field.Label>
|
|
421
|
+
<CheckboxGroup defaultValue={[]}>
|
|
422
|
+
{events.map((event) => (
|
|
423
|
+
<Field.Root key={event}>
|
|
424
|
+
<Field.Item>
|
|
425
|
+
<Checkbox value={event} />
|
|
426
|
+
<Field.Label>{event}</Field.Label>
|
|
427
|
+
</Field.Item>
|
|
428
|
+
</Field.Root>
|
|
429
|
+
))}
|
|
430
|
+
</CheckboxGroup>
|
|
431
|
+
<Field.Error match>Select at least one event</Field.Error>
|
|
432
|
+
</Field.Root>
|
|
433
|
+
)
|
|
434
|
+
}
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
**Don't:** Mark each checkbox invalid.
|
|
438
|
+
|
|
439
|
+
```tsx
|
|
440
|
+
/**
|
|
441
|
+
* Don't example for "Validate the Group as a Whole" on the CheckboxGroup page.
|
|
442
|
+
* Don't mark each checkbox invalid.
|
|
443
|
+
* @module
|
|
444
|
+
*/
|
|
445
|
+
import { Checkbox, CheckboxGroup, Field } from '@tempoxyz/ds'
|
|
446
|
+
|
|
447
|
+
const events = ['Payment confirmed', 'Payment failed', 'Refund issued']
|
|
448
|
+
|
|
449
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
450
|
+
export function Demo() {
|
|
451
|
+
return (
|
|
452
|
+
<Field.Root>
|
|
453
|
+
<Field.Label>Which events should this webhook send?</Field.Label>
|
|
454
|
+
<CheckboxGroup defaultValue={[]}>
|
|
455
|
+
{events.map((event) => (
|
|
456
|
+
<Field.Root invalid key={event}>
|
|
457
|
+
<Field.Item>
|
|
458
|
+
<Checkbox value={event} />
|
|
459
|
+
<Field.Label>{event}</Field.Label>
|
|
460
|
+
</Field.Item>
|
|
461
|
+
<Field.Error match>Select this event</Field.Error>
|
|
462
|
+
</Field.Root>
|
|
463
|
+
))}
|
|
464
|
+
</CheckboxGroup>
|
|
465
|
+
</Field.Root>
|
|
466
|
+
)
|
|
467
|
+
}
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
## Content
|
|
471
|
+
|
|
472
|
+
* **Labels:** Write parallel labels, such as Payment confirmed, Payment failed, and Refund issued.
|
|
473
|
+
* **Defaults:** Preselect only options that match a saved value or a safe default.
|
|
474
|
+
|
|
475
|
+
## Accessibility
|
|
476
|
+
|
|
477
|
+
Wraps related checkboxes in a named `group`. Each checkbox follows the [WAI-ARIA checkbox pattern](https://www.w3.org/WAI/ARIA/apg/patterns/checkbox/).
|
|
478
|
+
|
|
479
|
+
### Semantics
|
|
480
|
+
|
|
481
|
+
* **Group (group):** Name it with `aria-label` or a `Field.Label`, or screen readers announce an unnamed group.
|
|
482
|
+
* **Checkboxes (checkbox):** Each keeps its own role and state, and adds its `value` to the group. See [Checkbox](/docs/components/checkbox#accessibility).
|
|
483
|
+
* **Parent Checkbox (aria-controls):** Points at the checkboxes it controls. Reports a mixed state while only some are checked.
|
|
484
|
+
* **Disabled (aria-disabled):** Disables every checkbox and removes them from the tab order.
|
|
485
|
+
|
|
486
|
+
### Keyboard
|
|
487
|
+
|
|
488
|
+
* **Move Between Checkboxes (Tab and Shift+Tab):** Moves focus between checkboxes. Each checkbox is its own Tab stop.
|
|
489
|
+
* **Toggle a Checkbox (Space):** Toggles the focused checkbox.
|
|
490
|
+
* **Toggle the Parent Checkbox (Space):** Checks every option, then clears them. A third press restores the original selection.
|
|
491
|
+
|
|
492
|
+
### Focus
|
|
493
|
+
|
|
494
|
+
Focus stays on a parent checkbox when it changes the other options.
|
|
495
|
+
|
|
496
|
+
### Your Responsibilities
|
|
497
|
+
|
|
498
|
+
* **Label Every Checkbox:** Give each checkbox its own label.
|
|
499
|
+
* **Explain Disabled Options (disabled):** Disables every checkbox. Explain nearby why the options are locked.
|
|
500
|
+
|
|
501
|
+
## Related
|
|
502
|
+
|
|
503
|
+
[Checkbox](/docs/components/checkbox)
|
|
504
|
+
|
|
505
|
+
Use for a single choice.
|
|
506
|
+
|
|
507
|
+
[Choicebox](/docs/components/choicebox)
|
|
508
|
+
|
|
509
|
+
Use for options with descriptions.
|
|
510
|
+
|
|
511
|
+
[Combobox](/docs/components/combobox)
|
|
512
|
+
|
|
513
|
+
Use for choosing several items from a long list.
|
|
514
|
+
|
|
515
|
+
[Fieldset](/docs/components/fieldset)
|
|
516
|
+
|
|
517
|
+
Use for grouping fields under a legend.
|
|
518
|
+
|
|
519
|
+
[Field](/docs/components/field)
|
|
520
|
+
|
|
521
|
+
Use for naming the group and showing its error.
|