@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,448 @@
1
+ # Alert
2
+
3
+ Shows an inline message tied to nearby content.
4
+
5
+ [View source and API](https://github.com/tempoxyz/ds/blob/main/src/web/components/Alert.tsx)
6
+
7
+ Figma: [Alert](https://www.figma.com/design/yE96kcymnNR88PJp6G1sPs?node-id=3056-453)
8
+
9
+ ## Overview
10
+
11
+ An inline message on a tinted container, with a square indicator in the color of its `intent`. It is a live region, so screen readers announce it when it appears.
12
+
13
+ ## Examples
14
+
15
+ ### Basic
16
+
17
+ ```tsx
18
+ import { Alert } from '@tempoxyz/ds'
19
+
20
+ export function Demo() {
21
+ return (
22
+ <Alert>
23
+ <Alert.Icon />
24
+ <Alert.Content>Changes may take a few minutes to appear.</Alert.Content>
25
+ </Alert>
26
+ )
27
+ }
28
+ ```
29
+
30
+ [View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Alert/Basic.tsx)
31
+
32
+ ### Intent
33
+
34
+ Set `intent` to `neutral` (default), `positive`, `warning`, `negative`, `tip`, or `special`.
35
+
36
+ ```tsx
37
+ import { Alert, style } from '@tempoxyz/ds'
38
+
39
+ export const fill = true
40
+ export function Demo() {
41
+ return (
42
+ <div {...styles.stack()}>
43
+ {(['neutral', 'positive', 'warning', 'negative', 'tip', 'special'] as const).map((intent) => (
44
+ <Alert intent={intent} key={intent}>
45
+ <Alert.Icon />
46
+ <Alert.Content>You need to deposit $25.00 to continue.</Alert.Content>
47
+ </Alert>
48
+ ))}
49
+ </div>
50
+ )
51
+ }
52
+
53
+ namespace styles {
54
+ export const stack = style({
55
+ display: 'flex',
56
+ flexDirection: 'column',
57
+ gap: '12',
58
+ maxWidth: '36rem !custom',
59
+ })
60
+ }
61
+ ```
62
+
63
+ [View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Alert/Intent.tsx)
64
+
65
+ ### Title and Action
66
+
67
+ Add an `Alert.Title` above the message, and an `Alert.Action` after it, inside `Alert.Content`.
68
+
69
+ ```tsx
70
+ import { Alert, style } from '@tempoxyz/ds'
71
+
72
+ export const fill = true
73
+ export function Demo() {
74
+ return (
75
+ <Alert intent="warning" {...styles.note()}>
76
+ <Alert.Icon />
77
+ <Alert.Content>
78
+ <Alert.Title>New address</Alert.Title>
79
+ Check the first and last 4 characters.
80
+ <Alert.Action>View details</Alert.Action>
81
+ </Alert.Content>
82
+ </Alert>
83
+ )
84
+ }
85
+
86
+ namespace styles {
87
+ export const note = style({ maxWidth: '24rem !custom' })
88
+ }
89
+ ```
90
+
91
+ [View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Alert/Title.tsx)
92
+
93
+ ### Inline
94
+
95
+ The content flows as text, so inline elements such as `strong` stay on the lines of the message.
96
+
97
+ ```tsx
98
+ /** Renders a warning whose message holds inline `strong` text, for the Alert docs. @module */
99
+ import { Alert } from '@tempoxyz/ds'
100
+
101
+ export function Demo() {
102
+ return (
103
+ <Alert intent="warning" role="note">
104
+ <Alert.Icon />
105
+ <Alert.Content>
106
+ Only send <strong>supported stablecoins</strong> on <strong>Tempo</strong>. Sending other
107
+ tokens or using a different network may result in permanent loss.
108
+ </Alert.Content>
109
+ </Alert>
110
+ )
111
+ }
112
+ ```
113
+
114
+ [View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Alert/Inline.tsx)
115
+
116
+ ### Dismiss
117
+
118
+ Add an `Alert.Dismiss` after `Alert.Content`. Remove the alert in its `onClick`.
119
+
120
+ ```tsx
121
+ import { Alert, style } from '@tempoxyz/ds'
122
+
123
+ export const fill = true
124
+ export function Demo() {
125
+ return (
126
+ <Alert intent="tip" {...styles.note()}>
127
+ <Alert.Icon />
128
+ <Alert.Content>
129
+ <Alert.Title>Fee token</Alert.Title>
130
+ Fees are paid in USDC. Change it in Settings.
131
+ </Alert.Content>
132
+ <Alert.Dismiss />
133
+ </Alert>
134
+ )
135
+ }
136
+
137
+ namespace styles {
138
+ export const note = style({ maxWidth: '24rem !custom' })
139
+ }
140
+ ```
141
+
142
+ [View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Alert/Dismiss.tsx)
143
+
144
+ ## Anatomy
145
+
146
+ Import the component and assemble its parts.
147
+
148
+ ```tsx
149
+ import { Alert } from '@tempoxyz/ds'
150
+
151
+ <Alert>
152
+ <Alert.Icon />
153
+ <Alert.Content>
154
+ <Alert.Title />
155
+ <Alert.Action />
156
+ </Alert.Content>
157
+ <Alert.Dismiss />
158
+ </Alert>
159
+ ```
160
+
161
+ ## Guidelines
162
+
163
+ ### When to Use
164
+
165
+ * Explain a condition that affects nearby content, such as higher network fees above the Send payment form.
166
+ * Keep a result visible beside its section, such as a failed webhook delivery.
167
+ * Give guidance before a task, such as a note that testnet tokens have no value.
168
+ * Add optional context with `tip`, such as the token that pays network fees.
169
+
170
+ ### When Not to Use
171
+
172
+ * Use [Banner](/docs/components/banner) for a message about the whole product or page, such as an outage.
173
+ * Use [Toast](/docs/components/toast) to confirm that an action finished, such as Payment sent.
174
+ * If an action needs a decision before it continues, use [AlertDialog](/docs/components/alert-dialog).
175
+ * Use `Field.Error` from [Field](/docs/components/field) for a validation message on one input.
176
+ * Use [Badge](/docs/components/badge) for a one-word status on a table row or card, such as Pending.
177
+
178
+ ### Choose an Intent by Severity
179
+
180
+ * **Neutral (default):** Context that needs no action, such as when deposits confirm.
181
+ * **Positive (positive):** A result that stays in place, such as a verified webhook endpoint.
182
+ * **Warning (warning):** An avoidable risk, such as sending to an address new to Tempo.
183
+ * **Negative (negative):** A blocking failure, such as balances that couldn't load.
184
+ * **Tip (tip):** Optional context, such as the token that pays the network fee.
185
+ * **Special (special):** A new feature to announce, such as vaults for idle USDC balances.
186
+
187
+ Use `warning` before a risky step and `negative` before one that can't be undone. Never use `positive` as decoration.
188
+
189
+ ### Pair the Icon With Text That States the Outcome
190
+
191
+ Add `Alert.Icon` to every alert. It draws a square in the color of the intent.
192
+
193
+ **Do:** Combine `Alert.Icon` with a sentence that names the condition.
194
+
195
+ ```tsx
196
+ /**
197
+ * Do example for "Pair the Icon With Text That States the Outcome" on the Alert page.
198
+ * Combine `Alert.Icon` with a sentence that names the condition.
199
+ * @module
200
+ */
201
+ import { Alert } from '@tempoxyz/ds'
202
+
203
+ /** Renders the static preview, which the guideline card shows inert. */
204
+ export function Demo() {
205
+ return (
206
+ <Alert intent="warning">
207
+ <Alert.Icon />
208
+ <Alert.Content>
209
+ Network fees are higher than usual.
210
+ <Alert.Action>Review fees</Alert.Action>
211
+ </Alert.Content>
212
+ </Alert>
213
+ )
214
+ }
215
+ ```
216
+
217
+ **Don't:** Leave out the icon or let the tint carry the warning.
218
+
219
+ ```tsx
220
+ /**
221
+ * Don't example for "Pair the Icon With Text That States the Outcome" on the Alert page.
222
+ * Don't leave out the icon or let the tint carry the warning.
223
+ * @module
224
+ */
225
+ import { Alert } from '@tempoxyz/ds'
226
+
227
+ /** Renders the static preview, which the guideline card shows inert. */
228
+ export function Demo() {
229
+ return (
230
+ <Alert intent="warning">
231
+ <Alert.Content>
232
+ Network fees
233
+ <Alert.Action>Review</Alert.Action>
234
+ </Alert.Content>
235
+ </Alert>
236
+ )
237
+ }
238
+ ```
239
+
240
+ ### Place It Beside What It Describes
241
+
242
+ Remove the alert when its condition ends, such as when fees return to normal. In a [Dialog](/docs/components/dialog), show one alert at full width, below the input it describes.
243
+
244
+ **Do:** Put the alert directly above the form it describes, or directly below its control.
245
+
246
+ ```tsx
247
+ /**
248
+ * Do example for "Place It Beside What It Describes" on the Alert page.
249
+ * Put the callout directly above the form it describes, or directly below its control.
250
+ * @module
251
+ */
252
+ import { Alert, Button, Field, Stack, style, TextInput } from '@tempoxyz/ds'
253
+
254
+ /** Renders the static preview, which the guideline card shows inert. */
255
+ export function Demo() {
256
+ return (
257
+ <Stack gap="16" {...styles.fill()}>
258
+ <div {...styles.activity()}>
259
+ <div {...styles.heading()}>Recent activity</div>
260
+ <div>Sent 25.00 USDC to 0x8f3c…a21b</div>
261
+ <div>Received 120.00 USDC from 0x41d0…9c7e</div>
262
+ </div>
263
+ <Alert intent="warning">
264
+ <Alert.Icon />
265
+ <Alert.Content>Network fees are higher than usual.</Alert.Content>
266
+ </Alert>
267
+ <Field.Root>
268
+ <Field.Label>Amount</Field.Label>
269
+ <TextInput.Group>
270
+ <TextInput.Control defaultValue="50.00" />
271
+ </TextInput.Group>
272
+ </Field.Root>
273
+ <Button>Send payment</Button>
274
+ </Stack>
275
+ )
276
+ }
277
+
278
+ namespace styles {
279
+ export const activity = style({
280
+ color: 'content.secondary',
281
+ display: 'flex',
282
+ flexDirection: 'column',
283
+ gap: '4',
284
+ typography: 'body.b2',
285
+ })
286
+
287
+ export const fill = style({ width: '100% !custom' })
288
+
289
+ export const heading = style({ color: 'content.primary', typography: 'body.b2' })
290
+ }
291
+ ```
292
+
293
+ **Don't:** Place it at the top of a long page, away from its content.
294
+
295
+ ```tsx
296
+ /**
297
+ * Don't example for "Place It Beside What It Describes" on the Alert page.
298
+ * Don't place it at the top of a long page, away from its content.
299
+ * @module
300
+ */
301
+ import { Alert, Button, Field, Stack, style, TextInput } from '@tempoxyz/ds'
302
+
303
+ /** Renders the static preview, which the guideline card shows inert. */
304
+ export function Demo() {
305
+ return (
306
+ <Stack gap="16" {...styles.fill()}>
307
+ <Alert intent="warning">
308
+ <Alert.Icon />
309
+ <Alert.Content>Network fees are higher than usual.</Alert.Content>
310
+ </Alert>
311
+ <div {...styles.activity()}>
312
+ <div {...styles.heading()}>Recent activity</div>
313
+ <div>Sent 25.00 USDC to 0x8f3c…a21b</div>
314
+ <div>Received 120.00 USDC from 0x41d0…9c7e</div>
315
+ </div>
316
+ <Field.Root>
317
+ <Field.Label>Amount</Field.Label>
318
+ <TextInput.Group>
319
+ <TextInput.Control defaultValue="50.00" />
320
+ </TextInput.Group>
321
+ </Field.Root>
322
+ <Button>Send payment</Button>
323
+ </Stack>
324
+ )
325
+ }
326
+
327
+ namespace styles {
328
+ export const activity = style({
329
+ color: 'content.secondary',
330
+ display: 'flex',
331
+ flexDirection: 'column',
332
+ gap: '4',
333
+ typography: 'body.b2',
334
+ })
335
+
336
+ export const fill = style({ width: '100% !custom' })
337
+
338
+ export const heading = style({ color: 'content.primary', typography: 'body.b2' })
339
+ }
340
+ ```
341
+
342
+ ### Offer One Action
343
+
344
+ For more options than one action, link to a page that explains them.
345
+
346
+ **Do:** Offer the one action that resolves the message.
347
+
348
+ ```tsx
349
+ /** Do example for "Offer One Action" on the Alert page: offer the one action that resolves the message. @module */
350
+ import { Alert } from '@tempoxyz/ds'
351
+
352
+ /** Renders the static preview, which the guideline card shows inert. */
353
+ export function Demo() {
354
+ return (
355
+ <Alert intent="negative">
356
+ <Alert.Icon />
357
+ <Alert.Content>
358
+ <Alert.Title>Webhook delivery failed</Alert.Title>
359
+ Your endpoint returned 500.
360
+ <Alert.Action>Retry</Alert.Action>
361
+ </Alert.Content>
362
+ </Alert>
363
+ )
364
+ }
365
+ ```
366
+
367
+ **Don't:** Line up several actions inside one alert.
368
+
369
+ ```tsx
370
+ /**
371
+ * Don't example for "Offer One Action" on the Alert page.
372
+ * Don't line up several actions inside one callout.
373
+ * @module
374
+ */
375
+ import { Alert } from '@tempoxyz/ds'
376
+
377
+ /** Renders the static preview, which the guideline card shows inert. */
378
+ export function Demo() {
379
+ return (
380
+ <Alert intent="negative">
381
+ <Alert.Icon />
382
+ <Alert.Content>
383
+ Webhook delivery failed.
384
+ <Alert.Action>Retry</Alert.Action>
385
+ <Alert.Action>Logs</Alert.Action>
386
+ <Alert.Action>Docs</Alert.Action>
387
+ </Alert.Content>
388
+ </Alert>
389
+ )
390
+ }
391
+ ```
392
+
393
+ To link elsewhere, pass `Alert.Action` a `render` with an `a` element and `nativeButton={false}`.
394
+
395
+ ## Content
396
+
397
+ * Lead with the condition, then the consequence or next step: Network fees are higher than usual. Your payment may take longer to confirm.
398
+ * Keep it to one or two sentences. Add an `Alert.Title` of two or three words, such as New address, when the message needs a label.
399
+ * Describe the condition, not the intent. Write Webhook delivery failed, not Error.
400
+ * Use specific values, such as the amount needed: You need to deposit $25.00 to continue.
401
+ * Start the action label with a verb, such as Review fees or Add funds.
402
+
403
+ ## Accessibility
404
+
405
+ An alert is a live region whose role depends on `intent`. It does not move focus when it appears.
406
+
407
+ ### Semantics
408
+
409
+ * **Neutral, Positive, Tip, and Special (status):** Announced at the next pause.
410
+ * **Warning and Negative (alert):** Interrupts the screen reader.
411
+ * **Role Override (role):** Replaces either default, such as `role="note"` for static text.
412
+ * **Alert.Icon (aria-hidden):** Never announced. The text carries the meaning.
413
+ * **Alert.Action (button):** A native button. Enter and Space activate it.
414
+ * **Contrast (content.primary):** Text stays primary on every tint and scheme. Keep the background.
415
+
416
+ ### Keyboard
417
+
418
+ * **Move to the Action (Tab):** Moves focus to the alert's action, if any.
419
+ * **Activate the Action (Enter or Space):** Activates the action.
420
+
421
+ ### Your Responsibilities
422
+
423
+ * **Reserve Assertive Intents (warning or negative):** They interrupt the screen reader, so use them only for a message the reader must act on.
424
+ * **Insert It When the Condition Occurs:** An alert present on first render may not be announced. Insert it after the failed request.
425
+ * **Render the Region First:** If one alert shows several messages, render the live region before you change its content.
426
+ * **Remove It on Dismiss (onClick):** `Alert.Dismiss` only renders the button. Remove the alert and move focus in `onClick`.
427
+
428
+ ## Related
429
+
430
+ [Banner](/docs/components/banner)
431
+
432
+ Use for a message about the whole page.
433
+
434
+ [Toast](/docs/components/toast)
435
+
436
+ Use for confirming a finished action.
437
+
438
+ [Field](/docs/components/field)
439
+
440
+ Use for validation messages on an input.
441
+
442
+ [Errors and Validation](/docs/patterns/errors-and-validation)
443
+
444
+ Covers reporting failures.
445
+
446
+ [Feedback and Status](/docs/patterns/feedback-and-status)
447
+
448
+ Covers choosing a message component.