@tempoxyz/ds 0.3.9 → 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.
Files changed (128) hide show
  1. package/dist/docs/AGENTS.md +9 -0
  2. package/dist/docs/components/accordion.md +489 -0
  3. package/dist/docs/components/address-card.md +147 -0
  4. package/dist/docs/components/agent-logo.md +194 -0
  5. package/dist/docs/components/alert-dialog.md +631 -0
  6. package/dist/docs/components/alert.md +448 -0
  7. package/dist/docs/components/amount-input.md +305 -0
  8. package/dist/docs/components/amount.md +794 -0
  9. package/dist/docs/components/app-shell.md +559 -0
  10. package/dist/docs/components/asset-chip.md +294 -0
  11. package/dist/docs/components/autocomplete.md +619 -0
  12. package/dist/docs/components/avatar.md +321 -0
  13. package/dist/docs/components/badge.md +339 -0
  14. package/dist/docs/components/badged-logo.md +116 -0
  15. package/dist/docs/components/banner.md +379 -0
  16. package/dist/docs/components/bar-chart.md +208 -0
  17. package/dist/docs/components/breadcrumbs.md +380 -0
  18. package/dist/docs/components/button-group.md +286 -0
  19. package/dist/docs/components/button.md +650 -0
  20. package/dist/docs/components/calendar.md +375 -0
  21. package/dist/docs/components/callout.md +96 -0
  22. package/dist/docs/components/checkbox-group.md +521 -0
  23. package/dist/docs/components/checkbox.md +467 -0
  24. package/dist/docs/components/choice-group.md +516 -0
  25. package/dist/docs/components/choicebox.md +641 -0
  26. package/dist/docs/components/code.md +100 -0
  27. package/dist/docs/components/combobox.md +939 -0
  28. package/dist/docs/components/container.md +257 -0
  29. package/dist/docs/components/copy-button.md +642 -0
  30. package/dist/docs/components/date-picker.md +514 -0
  31. package/dist/docs/components/dialog.md +1332 -0
  32. package/dist/docs/components/drawer.md +966 -0
  33. package/dist/docs/components/empty.md +340 -0
  34. package/dist/docs/components/field.md +570 -0
  35. package/dist/docs/components/fieldset.md +398 -0
  36. package/dist/docs/components/frame.md +434 -0
  37. package/dist/docs/components/gauge.md +299 -0
  38. package/dist/docs/components/get-started-visual.md +117 -0
  39. package/dist/docs/components/grid.md +288 -0
  40. package/dist/docs/components/hero-visual.md +155 -0
  41. package/dist/docs/components/hex.md +487 -0
  42. package/dist/docs/components/icon-tile.md +292 -0
  43. package/dist/docs/components/identicon.md +371 -0
  44. package/dist/docs/components/inline.md +233 -0
  45. package/dist/docs/components/inset.md +225 -0
  46. package/dist/docs/components/kbd.md +423 -0
  47. package/dist/docs/components/list-group.md +981 -0
  48. package/dist/docs/components/loading-dots.md +237 -0
  49. package/dist/docs/components/menu.md +934 -0
  50. package/dist/docs/components/native-select.md +204 -0
  51. package/dist/docs/components/network-logo.md +248 -0
  52. package/dist/docs/components/number-field.md +543 -0
  53. package/dist/docs/components/otp-field.md +616 -0
  54. package/dist/docs/components/pagination.md +516 -0
  55. package/dist/docs/components/popover.md +544 -0
  56. package/dist/docs/components/progress.md +388 -0
  57. package/dist/docs/components/qr.md +314 -0
  58. package/dist/docs/components/radio-group.md +528 -0
  59. package/dist/docs/components/secret-value.md +406 -0
  60. package/dist/docs/components/select.md +751 -0
  61. package/dist/docs/components/separator.md +379 -0
  62. package/dist/docs/components/sidebar-menu.md +922 -0
  63. package/dist/docs/components/skeleton.md +517 -0
  64. package/dist/docs/components/slider.md +539 -0
  65. package/dist/docs/components/snippet.md +424 -0
  66. package/dist/docs/components/spinner.md +216 -0
  67. package/dist/docs/components/split-bar.md +139 -0
  68. package/dist/docs/components/split-button.md +464 -0
  69. package/dist/docs/components/stack.md +299 -0
  70. package/dist/docs/components/status-chip.md +226 -0
  71. package/dist/docs/components/status-indicator.md +119 -0
  72. package/dist/docs/components/status-row.md +174 -0
  73. package/dist/docs/components/stepper.md +451 -0
  74. package/dist/docs/components/success-hero.md +157 -0
  75. package/dist/docs/components/surface.md +639 -0
  76. package/dist/docs/components/switch.md +472 -0
  77. package/dist/docs/components/table.md +967 -0
  78. package/dist/docs/components/tabs.md +627 -0
  79. package/dist/docs/components/tempo-logo.md +185 -0
  80. package/dist/docs/components/text-input.md +624 -0
  81. package/dist/docs/components/textarea.md +352 -0
  82. package/dist/docs/components/toast.md +535 -0
  83. package/dist/docs/components/token-logo.md +371 -0
  84. package/dist/docs/components/token.md +247 -0
  85. package/dist/docs/components/tooltip.md +490 -0
  86. package/dist/docs/components/verification-code.md +116 -0
  87. package/dist/docs/components/visual.md +249 -0
  88. package/dist/docs/components.md +203 -0
  89. package/dist/docs/foundations/accessibility.md +377 -0
  90. package/dist/docs/foundations/agents.md +150 -0
  91. package/dist/docs/foundations/color.md +522 -0
  92. package/dist/docs/foundations/content/tone.md +194 -0
  93. package/dist/docs/foundations/content/voice.md +194 -0
  94. package/dist/docs/foundations/content/writing-style.md +406 -0
  95. package/dist/docs/foundations/iconography.md +282 -0
  96. package/dist/docs/foundations/intent.md +360 -0
  97. package/dist/docs/foundations/layout.md +508 -0
  98. package/dist/docs/foundations/linter.md +296 -0
  99. package/dist/docs/foundations/motion.md +151 -0
  100. package/dist/docs/foundations/radius-and-padding.md +86 -0
  101. package/dist/docs/foundations/typography.md +266 -0
  102. package/dist/docs/index.md +137 -0
  103. package/dist/docs/introduction/faq.md +132 -0
  104. package/dist/docs/introduction/getting-started.md +377 -0
  105. package/dist/docs/patterns/blockchain-values.md +709 -0
  106. package/dist/docs/patterns/dashboards.md +638 -0
  107. package/dist/docs/patterns/destructive-actions.md +626 -0
  108. package/dist/docs/patterns/empty-states.md +612 -0
  109. package/dist/docs/patterns/errors-and-validation.md +808 -0
  110. package/dist/docs/patterns/feedback-and-status.md +518 -0
  111. package/dist/docs/patterns/forms.md +679 -0
  112. package/dist/docs/patterns/loading.md +630 -0
  113. package/dist/docs/patterns/navigation.md +397 -0
  114. package/dist/docs/patterns/payments.md +765 -0
  115. package/dist/docs/patterns/responsive-layout.md +997 -0
  116. package/dist/docs/patterns/tables-and-lists.md +964 -0
  117. package/dist/docs/products/tempo-console.md +671 -0
  118. package/dist/docs/products/tempo-performance.md +437 -0
  119. package/dist/docs/products/tempo-wallet.md +438 -0
  120. package/dist/web/components/OtpField.css +1 -1
  121. package/dist/web/components/OtpField.d.ts +1 -1
  122. package/dist/web/components/OtpField.d.ts.map +1 -1
  123. package/dist/web/components/OtpField.js +3 -4
  124. package/dist/web/components/OtpField.js.map +1 -1
  125. package/dist/web/components/OtpField.js.zyzz.json +1 -1
  126. package/dist/web/index.js.zyzz.json +1 -1
  127. package/package.json +1 -1
  128. package/src/web/components/OtpField.tsx +2 -24
@@ -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.