@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,472 @@
1
+ # Switch
2
+
3
+ Toggles a setting that applies immediately.
4
+
5
+ [View source and API](https://github.com/tempoxyz/ds/blob/main/src/web/components/Switch.tsx)
6
+
7
+ Figma: [Switch · Existing candidate](https://www.figma.com/design/yE96kcymnNR88PJp6G1sPs?node-id=1401-11548)
8
+
9
+ ## Overview
10
+
11
+ A pill toggle whose thumb and track color both show the state.
12
+
13
+ ## Examples
14
+
15
+ ### Basic
16
+
17
+ ```tsx
18
+ import { Switch } from '@tempoxyz/ds'
19
+
20
+ export function Demo() {
21
+ return <Switch aria-label="Notifications" />
22
+ }
23
+ ```
24
+
25
+ [View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Switch/Basic.tsx)
26
+
27
+ ### Size
28
+
29
+ Set `size` to `small`, `medium`, or `large`. It defaults to `medium`, or `small` inside [ListGroup](/docs/components/list-group).
30
+
31
+ ```tsx
32
+ import { style, Switch } from '@tempoxyz/ds'
33
+
34
+ export function Demo() {
35
+ return (
36
+ <div {...styles.row()}>
37
+ {(['small', 'medium', 'large'] as const).map((size) => (
38
+ <Switch aria-label={size} key={size} size={size} />
39
+ ))}
40
+ </div>
41
+ )
42
+ }
43
+
44
+ namespace styles {
45
+ export const row = style({ alignItems: 'center', display: 'flex', flexWrap: 'wrap', gap: '24' })
46
+ }
47
+ ```
48
+
49
+ [View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Switch/Size.tsx)
50
+
51
+ ### Checked
52
+
53
+ Set `defaultChecked`, or control the state with `checked` and `onCheckedChange`.
54
+
55
+ ```tsx
56
+ import { style, Switch } from '@tempoxyz/ds'
57
+
58
+ export function Demo() {
59
+ return (
60
+ <div {...styles.row()}>
61
+ {(['small', 'medium', 'large'] as const).map((size) => (
62
+ <Switch aria-label={`${size} on`} defaultChecked key={size} size={size} />
63
+ ))}
64
+ </div>
65
+ )
66
+ }
67
+
68
+ namespace styles {
69
+ export const row = style({ alignItems: 'center', display: 'flex', flexWrap: 'wrap', gap: '24' })
70
+ }
71
+ ```
72
+
73
+ [View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Switch/Checked.tsx)
74
+
75
+ ### Disabled
76
+
77
+ Set `disabled` to block toggling.
78
+
79
+ ```tsx
80
+ import { style, Switch } from '@tempoxyz/ds'
81
+
82
+ export function Demo() {
83
+ return (
84
+ <div {...styles.row()}>
85
+ {(['small', 'medium', 'large'] as const).map((size) => (
86
+ <Switch aria-label={`${size} disabled`} disabled key={size} size={size} />
87
+ ))}
88
+ </div>
89
+ )
90
+ }
91
+
92
+ namespace styles {
93
+ export const row = style({ alignItems: 'center', display: 'flex', flexWrap: 'wrap', gap: '24' })
94
+ }
95
+ ```
96
+
97
+ [View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Switch/Disabled.tsx)
98
+
99
+ ### Field
100
+
101
+ Place the switch in a `Field.Root` below its `Field.Label`, with the `Field.Description` under it.
102
+
103
+ ```tsx
104
+ import { Field, style, Switch } from '@tempoxyz/ds'
105
+
106
+ export const fill = true
107
+ export function Demo() {
108
+ return (
109
+ <div {...styles.settings()}>
110
+ <Field.Root>
111
+ <Field.Label>Auto-convert</Field.Label>
112
+ <Switch defaultChecked />
113
+ <Field.Description>Swap incoming funds to USDC.</Field.Description>
114
+ </Field.Root>
115
+ <Field.Root>
116
+ <Field.Label>Notifications</Field.Label>
117
+ <Switch />
118
+ <Field.Description>Email me when a payment settles.</Field.Description>
119
+ </Field.Root>
120
+ </div>
121
+ )
122
+ }
123
+
124
+ namespace styles {
125
+ export const settings = style({ display: 'grid', gap: '24', maxWidth: '480px !custom' })
126
+ }
127
+ ```
128
+
129
+ [View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Switch/Field.tsx)
130
+
131
+ ## Anatomy
132
+
133
+ Import the component and assemble its parts.
134
+
135
+ ```tsx
136
+ import { Switch } from '@tempoxyz/ds'
137
+
138
+ <Switch />
139
+ ```
140
+
141
+ ## Guidelines
142
+
143
+ ### When to Use
144
+
145
+ * Turn a setting on or off at once, such as payment emails, hiding small balances, or pausing a webhook.
146
+ * List independent settings on a settings page, one per row.
147
+
148
+ ### When Not to Use
149
+
150
+ * Use a [Checkbox](/docs/components/checkbox) for a choice that applies on form submit, or for agreeing to terms.
151
+ * Use a [RadioGroup](/docs/components/radio-group) or [ChoiceGroup](/docs/components/choice-group) when the two states aren't on and off, such as Daily and Weekly.
152
+ * Use a [Button](/docs/components/button) for a one-time action, such as Revoke key.
153
+
154
+ ### Apply the Change Immediately
155
+
156
+ Save the new state in `onCheckedChange`, not on a Save button.
157
+
158
+ **Do:** Save each setting the moment its switch flips.
159
+
160
+ ```tsx
161
+ /**
162
+ * Do example for "Apply the Change Immediately" on the Switch page.
163
+ * Save each setting the moment its switch flips.
164
+ * @module
165
+ */
166
+ import { Field, Fieldset, style, Switch } from '@tempoxyz/ds'
167
+
168
+ /** Renders the static preview, which the guideline card shows inert. */
169
+ export function Demo() {
170
+ return (
171
+ <Fieldset.Root {...styles.settings()}>
172
+ <Field.Root>
173
+ <Field.Label>Payment emails</Field.Label>
174
+ <Switch defaultChecked />
175
+ <Field.Description>Email me when a payment settles.</Field.Description>
176
+ </Field.Root>
177
+ <Field.Root>
178
+ <Field.Label>Hide small balances</Field.Label>
179
+ <Switch />
180
+ <Field.Description>Hide tokens worth under $1.</Field.Description>
181
+ </Field.Root>
182
+ </Fieldset.Root>
183
+ )
184
+ }
185
+
186
+ namespace styles {
187
+ export const settings = style({ maxWidth: '20rem !custom', rowGap: '0', width: '100% !custom' })
188
+ }
189
+ ```
190
+
191
+ **Don't:** Add a Save button to a group of switches. Use a [Checkbox](/docs/components/checkbox) in a
192
+ form instead.
193
+
194
+ ```tsx
195
+ /**
196
+ * Don't example for "Apply the Change Immediately" on the Switch page.
197
+ * Don't add a Save button to a group of switches. Use a Checkbox in a form instead.
198
+ * @module
199
+ */
200
+ import { Button, Field, Fieldset, style, Switch } from '@tempoxyz/ds'
201
+
202
+ /** Renders the static preview, which the guideline card shows inert. */
203
+ export function Demo() {
204
+ return (
205
+ <div {...styles.column()}>
206
+ <Fieldset.Root {...styles.settings()}>
207
+ <Field.Root>
208
+ <Field.Label>Payment emails</Field.Label>
209
+ <Switch defaultChecked />
210
+ <Field.Description>Email me when a payment settles.</Field.Description>
211
+ </Field.Root>
212
+ <Field.Root>
213
+ <Field.Label>Hide small balances</Field.Label>
214
+ <Switch />
215
+ <Field.Description>Hide tokens worth under $1.</Field.Description>
216
+ </Field.Root>
217
+ </Fieldset.Root>
218
+ <Button size="small">Save changes</Button>
219
+ </div>
220
+ )
221
+ }
222
+
223
+ namespace styles {
224
+ export const column = style({
225
+ alignItems: 'flex-end',
226
+ display: 'flex',
227
+ flexDirection: 'column',
228
+ gap: '8',
229
+ maxWidth: '20rem !custom',
230
+ width: '100% !custom',
231
+ })
232
+
233
+ export const settings = style({ rowGap: '0', width: '100% !custom' })
234
+ }
235
+ ```
236
+
237
+ * **Failed saves:** Update `checked` optimistically. If the save fails, flip it back and explain why in a [Toast](/docs/components/toast).
238
+ * **Risky changes:** If a change needs confirmation, costs money, or can't be undone, use a [Button](/docs/components/button) and an [AlertDialog](/docs/components/alert-dialog).
239
+ * **Delayed changes:** If a change takes a few seconds to apply, state it in the description, such as Applies to new payments.
240
+
241
+ ### Name the Setting, Not the State
242
+
243
+ Don't write Enabled or Turn on, and don't change the label with the state.
244
+
245
+ **Do:** Label the setting the switch controls, such as Payment emails.
246
+
247
+ ```tsx
248
+ /**
249
+ * Do example for "Name the Setting, Not the State" on the Switch page.
250
+ * Label the setting the switch controls, such as Payment emails.
251
+ * @module
252
+ */
253
+ import { Field, style, Switch } from '@tempoxyz/ds'
254
+
255
+ /** Renders the static preview, which the guideline card shows inert. */
256
+ export function Demo() {
257
+ return (
258
+ <Field.Root {...styles.setting()}>
259
+ <Field.Label>Payment emails</Field.Label>
260
+ <Switch defaultChecked />
261
+ <Field.Description>Email me when a payment settles.</Field.Description>
262
+ </Field.Root>
263
+ )
264
+ }
265
+
266
+ namespace styles {
267
+ export const setting = style({ maxWidth: '20rem !custom', width: '100% !custom' })
268
+ }
269
+ ```
270
+
271
+ **Don't:** Label the switch with its state.
272
+
273
+ ```tsx
274
+ /**
275
+ * Don't example for "Name the Setting, Not the State" on the Switch page.
276
+ * Don't label the switch with its state.
277
+ * @module
278
+ */
279
+ import { Field, style, Switch } from '@tempoxyz/ds'
280
+
281
+ /** Renders the static preview, which the guideline card shows inert. */
282
+ export function Demo() {
283
+ return (
284
+ <Field.Root {...styles.setting()}>
285
+ <Field.Label>Enabled</Field.Label>
286
+ <Switch defaultChecked />
287
+ <Field.Description>Email me when a payment settles.</Field.Description>
288
+ </Field.Root>
289
+ )
290
+ }
291
+
292
+ namespace styles {
293
+ export const setting = style({ maxWidth: '20rem !custom', width: '100% !custom' })
294
+ }
295
+ ```
296
+
297
+ ### Put the Label Above the Switch
298
+
299
+ Place each switch in a `Field.Root` below its `Field.Label`, as a text field sits, with the description under it.
300
+
301
+ **Do:** Place each switch below its `Field.Label`, with the description under it.
302
+
303
+ ```tsx
304
+ /**
305
+ * Do example for "Apply the Change Immediately" on the Switch page.
306
+ * Save each setting the moment its switch flips.
307
+ * @module
308
+ */
309
+ import { Field, Fieldset, style, Switch } from '@tempoxyz/ds'
310
+
311
+ /** Renders the static preview, which the guideline card shows inert. */
312
+ export function Demo() {
313
+ return (
314
+ <Fieldset.Root {...styles.settings()}>
315
+ <Field.Root>
316
+ <Field.Label>Payment emails</Field.Label>
317
+ <Switch defaultChecked />
318
+ <Field.Description>Email me when a payment settles.</Field.Description>
319
+ </Field.Root>
320
+ <Field.Root>
321
+ <Field.Label>Hide small balances</Field.Label>
322
+ <Switch />
323
+ <Field.Description>Hide tokens worth under $1.</Field.Description>
324
+ </Field.Root>
325
+ </Fieldset.Root>
326
+ )
327
+ }
328
+
329
+ namespace styles {
330
+ export const settings = style({ maxWidth: '20rem !custom', rowGap: '0', width: '100% !custom' })
331
+ }
332
+ ```
333
+
334
+ **Don't:** Put the switch before its label, as a checkbox sits.
335
+
336
+ ```tsx
337
+ /**
338
+ * Don't example for "Put the Label Above the Switch" on the Switch page.
339
+ * Don't put the switch before its label, as a checkbox sits.
340
+ * @module
341
+ */
342
+ import { Field, style, Switch } from '@tempoxyz/ds'
343
+
344
+ /** Renders the static preview, which the guideline card shows inert. */
345
+ export function Demo() {
346
+ return (
347
+ <div {...styles.column()}>
348
+ <Field.Root>
349
+ <Field.Item>
350
+ <Switch defaultChecked />
351
+ <Field.Label>Payment emails</Field.Label>
352
+ </Field.Item>
353
+ </Field.Root>
354
+ <Field.Root>
355
+ <Field.Item>
356
+ <Switch />
357
+ <Field.Label>Hide small balances</Field.Label>
358
+ </Field.Item>
359
+ </Field.Root>
360
+ </div>
361
+ )
362
+ }
363
+
364
+ namespace styles {
365
+ export const column = style({
366
+ display: 'flex',
367
+ flexDirection: 'column',
368
+ gap: '12',
369
+ maxWidth: '20rem !custom',
370
+ width: '100% !custom',
371
+ })
372
+ }
373
+ ```
374
+
375
+ ### Explain Unavailable Settings
376
+
377
+ **Do:** Set `disabled` and state why in `Field.Description`.
378
+
379
+ ```tsx
380
+ /**
381
+ * Do example for "Explain Unavailable Settings" on the Switch page.
382
+ * Set `disabled` and state why in `Field.Description`.
383
+ * @module
384
+ */
385
+ import { Field, style, Switch } from '@tempoxyz/ds'
386
+
387
+ /** Renders the static preview, which the guideline card shows inert. */
388
+ export function Demo() {
389
+ return (
390
+ <Field.Root {...styles.setting()}>
391
+ <Field.Label>Payment emails</Field.Label>
392
+ <Switch disabled />
393
+ <Field.Description>Verify your email to turn this on.</Field.Description>
394
+ </Field.Root>
395
+ )
396
+ }
397
+
398
+ namespace styles {
399
+ export const setting = style({ maxWidth: '20rem !custom', width: '100% !custom' })
400
+ }
401
+ ```
402
+
403
+ **Don't:** Dim a switch without a reason. It looks broken.
404
+
405
+ ```tsx
406
+ /**
407
+ * Don't example for "Explain Unavailable Settings" on the Switch page.
408
+ * Don't dim a switch without a reason. It looks broken.
409
+ * @module
410
+ */
411
+ import { Field, style, Switch } from '@tempoxyz/ds'
412
+
413
+ /** Renders the static preview, which the guideline card shows inert. */
414
+ export function Demo() {
415
+ return (
416
+ <Field.Root {...styles.setting()}>
417
+ <Field.Label>Payment emails</Field.Label>
418
+ <Switch disabled />
419
+ <Field.Description>Email me when a payment settles.</Field.Description>
420
+ </Field.Root>
421
+ )
422
+ }
423
+
424
+ namespace styles {
425
+ export const setting = style({ maxWidth: '20rem !custom', width: '100% !custom' })
426
+ }
427
+ ```
428
+
429
+ ## Content
430
+
431
+ * Describe what happens when the switch is on, such as Email me when a payment settles.
432
+ * Don't phrase labels as questions. Don't use negative labels, such as Don't show testnet tokens, which make on mean off.
433
+
434
+ ## Accessibility
435
+
436
+ A switch follows the [WAI-ARIA switch pattern](https://www.w3.org/WAI/ARIA/apg/patterns/switch/).
437
+
438
+ ### Semantics
439
+
440
+ * **Control (switch):** Announced with its on or off state.
441
+ * **Native TextInput (checkbox):** A hidden native input submits the value under `name`. It is outside the Tab order and the accessibility tree.
442
+ * **Label and Description (aria-labelledby):** In a field, the label names the switch and the field description describes it.
443
+ * **Disabled (aria-disabled):** Removes the switch from the Tab order.
444
+ * **Target Size (8px hit area):** The hit area reaches past the track on every side.
445
+ * **Reduced Motion (prefers-reduced-motion):** The thumb jumps instead of sliding, and only colors transition.
446
+
447
+ ### Keyboard
448
+
449
+ * **Move Focus to the Switch (Tab):** Moves focus to the switch.
450
+ * **Toggle the Switch (Space or Enter):** Toggles the switch. A click toggles it too.
451
+
452
+ ### Your Responsibilities
453
+
454
+ * **Keep the Thumb Visible:** The thumb position and the track color both show the state. Keep custom styles from hiding the thumb.
455
+
456
+ ## Related
457
+
458
+ [Checkbox](/docs/components/checkbox)
459
+
460
+ Use for choices submitted with a form.
461
+
462
+ [Field](/docs/components/field)
463
+
464
+ Use for the label and description.
465
+
466
+ [Fieldset](/docs/components/fieldset)
467
+
468
+ Use for grouping settings rows.
469
+
470
+ [Toast](/docs/components/toast)
471
+
472
+ Use for reporting a failed save.