@tempoxyz/ds 0.3.10 → 0.3.13
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/README.md +7 -6
- package/dist/docs/AGENTS.md +12 -0
- package/dist/docs/index.md +145 -0
- package/dist/docs/marketing/introduction/getting-started.md +241 -0
- package/dist/docs/product/components/accordion.md +489 -0
- package/dist/docs/product/components/address-card.md +147 -0
- package/dist/docs/product/components/agent-logo.md +194 -0
- package/dist/docs/product/components/alert-dialog.md +631 -0
- package/dist/docs/product/components/alert.md +448 -0
- package/dist/docs/product/components/amount-input.md +305 -0
- package/dist/docs/product/components/amount.md +794 -0
- package/dist/docs/product/components/app-shell.md +559 -0
- package/dist/docs/product/components/asset-chip.md +294 -0
- package/dist/docs/product/components/autocomplete.md +620 -0
- package/dist/docs/product/components/avatar.md +321 -0
- package/dist/docs/product/components/badge.md +339 -0
- package/dist/docs/product/components/badged-logo.md +116 -0
- package/dist/docs/product/components/banner.md +379 -0
- package/dist/docs/product/components/bar-chart.md +208 -0
- package/dist/docs/product/components/breadcrumbs.md +380 -0
- package/dist/docs/product/components/button-group.md +286 -0
- package/dist/docs/product/components/button.md +650 -0
- package/dist/docs/product/components/calendar.md +375 -0
- package/dist/docs/product/components/callout.md +96 -0
- package/dist/docs/product/components/checkbox-group.md +521 -0
- package/dist/docs/product/components/checkbox.md +467 -0
- package/dist/docs/product/components/choice-group.md +516 -0
- package/dist/docs/product/components/choicebox.md +641 -0
- package/dist/docs/product/components/code.md +100 -0
- package/dist/docs/product/components/combobox.md +939 -0
- package/dist/docs/product/components/container.md +257 -0
- package/dist/docs/product/components/copy-button.md +642 -0
- package/dist/docs/product/components/date-picker.md +514 -0
- package/dist/docs/product/components/dialog.md +1332 -0
- package/dist/docs/product/components/drawer.md +966 -0
- package/dist/docs/product/components/empty.md +340 -0
- package/dist/docs/product/components/field.md +570 -0
- package/dist/docs/product/components/fieldset.md +398 -0
- package/dist/docs/product/components/frame.md +434 -0
- package/dist/docs/product/components/gauge.md +299 -0
- package/dist/docs/product/components/get-started-visual.md +117 -0
- package/dist/docs/product/components/grid.md +288 -0
- package/dist/docs/product/components/hero-visual.md +155 -0
- package/dist/docs/product/components/hex.md +487 -0
- package/dist/docs/product/components/icon-tile.md +292 -0
- package/dist/docs/product/components/identicon.md +371 -0
- package/dist/docs/product/components/inline.md +233 -0
- package/dist/docs/product/components/inset.md +225 -0
- package/dist/docs/product/components/kbd.md +423 -0
- package/dist/docs/product/components/list-group.md +981 -0
- package/dist/docs/product/components/loading-dots.md +237 -0
- package/dist/docs/product/components/menu.md +934 -0
- package/dist/docs/product/components/native-select.md +204 -0
- package/dist/docs/product/components/network-logo.md +248 -0
- package/dist/docs/product/components/number-field.md +543 -0
- package/dist/docs/product/components/otp-field.md +616 -0
- package/dist/docs/product/components/pagination.md +516 -0
- package/dist/docs/product/components/popover.md +544 -0
- package/dist/docs/product/components/progress.md +388 -0
- package/dist/docs/product/components/qr.md +314 -0
- package/dist/docs/product/components/radio-group.md +528 -0
- package/dist/docs/product/components/secret-value.md +406 -0
- package/dist/docs/product/components/select.md +751 -0
- package/dist/docs/product/components/separator.md +379 -0
- package/dist/docs/product/components/sidebar-menu.md +922 -0
- package/dist/docs/product/components/skeleton.md +517 -0
- package/dist/docs/product/components/slider.md +539 -0
- package/dist/docs/product/components/snippet.md +424 -0
- package/dist/docs/product/components/spinner.md +216 -0
- package/dist/docs/product/components/split-bar.md +139 -0
- package/dist/docs/product/components/split-button.md +464 -0
- package/dist/docs/product/components/stack.md +299 -0
- package/dist/docs/product/components/status-chip.md +226 -0
- package/dist/docs/product/components/status-indicator.md +119 -0
- package/dist/docs/product/components/status-row.md +174 -0
- package/dist/docs/product/components/stepper.md +451 -0
- package/dist/docs/product/components/success-hero.md +157 -0
- package/dist/docs/product/components/surface.md +639 -0
- package/dist/docs/product/components/switch.md +472 -0
- package/dist/docs/product/components/table.md +967 -0
- package/dist/docs/product/components/tabs.md +627 -0
- package/dist/docs/product/components/tempo-logo.md +185 -0
- package/dist/docs/product/components/text-input.md +624 -0
- package/dist/docs/product/components/textarea.md +352 -0
- package/dist/docs/product/components/toast.md +535 -0
- package/dist/docs/product/components/token-logo.md +371 -0
- package/dist/docs/product/components/token.md +247 -0
- package/dist/docs/product/components/tooltip.md +490 -0
- package/dist/docs/product/components/verification-code.md +116 -0
- package/dist/docs/product/components/visual.md +249 -0
- package/dist/docs/product/components.md +203 -0
- package/dist/docs/product/foundations/accessibility.md +377 -0
- package/dist/docs/product/foundations/agents.md +150 -0
- package/dist/docs/product/foundations/color.md +522 -0
- package/dist/docs/product/foundations/content/tone.md +194 -0
- package/dist/docs/product/foundations/content/voice.md +194 -0
- package/dist/docs/product/foundations/content/writing-style.md +406 -0
- package/dist/docs/product/foundations/iconography.md +282 -0
- package/dist/docs/product/foundations/intent.md +360 -0
- package/dist/docs/product/foundations/layout.md +508 -0
- package/dist/docs/product/foundations/linter.md +496 -0
- package/dist/docs/product/foundations/motion.md +151 -0
- package/dist/docs/product/foundations/radius-and-padding.md +86 -0
- package/dist/docs/product/foundations/typography.md +266 -0
- package/dist/docs/product/introduction/faq.md +133 -0
- package/dist/docs/product/introduction/getting-started.md +377 -0
- package/dist/docs/product/patterns/blockchain-values.md +709 -0
- package/dist/docs/product/patterns/dashboards.md +638 -0
- package/dist/docs/product/patterns/destructive-actions.md +626 -0
- package/dist/docs/product/patterns/empty-states.md +612 -0
- package/dist/docs/product/patterns/errors-and-validation.md +808 -0
- package/dist/docs/product/patterns/feedback-and-status.md +518 -0
- package/dist/docs/product/patterns/forms.md +679 -0
- package/dist/docs/product/patterns/loading.md +630 -0
- package/dist/docs/product/patterns/navigation.md +397 -0
- package/dist/docs/product/patterns/payments.md +765 -0
- package/dist/docs/product/patterns/responsive-layout.md +997 -0
- package/dist/docs/product/patterns/tables-and-lists.md +964 -0
- package/dist/docs/product/products/tempo-console.md +671 -0
- package/dist/docs/product/products/tempo-performance.md +437 -0
- package/dist/docs/product/products/tempo-wallet.md +438 -0
- package/dist/marketing/index.d.ts +4 -0
- package/dist/marketing/index.d.ts.map +1 -0
- package/dist/marketing/index.js +4 -0
- package/dist/marketing/index.js.map +1 -0
- package/dist/marketing/index.js.zyzz.json +1 -0
- package/dist/marketing/vars.d.ts +907 -0
- package/dist/marketing/vars.d.ts.map +1 -0
- package/dist/marketing/vars.js +15 -0
- package/dist/marketing/vars.js.map +1 -0
- package/dist/marketing/vars.js.zyzz.json +1 -0
- package/dist/marketing/zyzz.config.d.ts +4512 -0
- package/dist/marketing/zyzz.config.d.ts.map +1 -0
- package/dist/marketing/zyzz.config.js +63 -0
- package/dist/marketing/zyzz.config.js.map +1 -0
- package/dist/marketing/zyzz.config.js.zyzz.json +1 -0
- package/dist/oxlint/index.d.ts +12 -1
- package/dist/oxlint/index.d.ts.map +1 -1
- package/dist/oxlint/index.js +39 -1
- package/dist/oxlint/index.js.map +1 -1
- package/dist/oxlint/internal/Docs.d.ts +9 -0
- package/dist/oxlint/internal/Docs.d.ts.map +1 -0
- package/dist/oxlint/internal/Docs.js +15 -0
- package/dist/oxlint/internal/Docs.js.map +1 -0
- package/dist/oxlint/internal/Imports.d.ts +1 -1
- package/dist/oxlint/internal/Imports.d.ts.map +1 -1
- package/dist/oxlint/internal/Imports.js +2 -0
- package/dist/oxlint/internal/Imports.js.map +1 -1
- package/dist/oxlint/internal/Styles.d.ts +40 -0
- package/dist/oxlint/internal/Styles.d.ts.map +1 -0
- package/dist/oxlint/internal/Styles.js +194 -0
- package/dist/oxlint/internal/Styles.js.map +1 -0
- package/dist/oxlint/internal/Tokens.d.ts +16 -0
- package/dist/oxlint/internal/Tokens.d.ts.map +1 -0
- package/dist/oxlint/internal/Tokens.js +39 -0
- package/dist/oxlint/internal/Tokens.js.map +1 -0
- package/dist/oxlint/rules/NoCrossSurface.d.ts +2 -2
- package/dist/oxlint/rules/NoCrossSurface.js +3 -3
- package/dist/oxlint/rules/NoCrossSurface.js.map +1 -1
- package/dist/oxlint/rules/NoCustomValues.d.ts +11 -0
- package/dist/oxlint/rules/NoCustomValues.d.ts.map +1 -0
- package/dist/oxlint/rules/NoCustomValues.js +150 -0
- package/dist/oxlint/rules/NoCustomValues.js.map +1 -0
- package/dist/oxlint/rules/NoSingleKeyShortcuts.d.ts +11 -0
- package/dist/oxlint/rules/NoSingleKeyShortcuts.d.ts.map +1 -0
- package/dist/oxlint/rules/NoSingleKeyShortcuts.js +158 -0
- package/dist/oxlint/rules/NoSingleKeyShortcuts.js.map +1 -0
- package/dist/oxlint/rules/PreferComponent.d.ts +3 -2
- package/dist/oxlint/rules/PreferComponent.d.ts.map +1 -1
- package/dist/oxlint/rules/PreferComponent.js +11 -4
- package/dist/oxlint/rules/PreferComponent.js.map +1 -1
- package/dist/oxlint/rules/PreferLayout.d.ts +9 -0
- package/dist/oxlint/rules/PreferLayout.d.ts.map +1 -0
- package/dist/oxlint/rules/PreferLayout.js +90 -0
- package/dist/oxlint/rules/PreferLayout.js.map +1 -0
- package/dist/oxlint/rules/PreferProgress.d.ts +9 -0
- package/dist/oxlint/rules/PreferProgress.d.ts.map +1 -0
- package/dist/oxlint/rules/PreferProgress.js +43 -0
- package/dist/oxlint/rules/PreferProgress.js.map +1 -0
- package/dist/oxlint/rules/PreferSurface.d.ts +9 -0
- package/dist/oxlint/rules/PreferSurface.d.ts.map +1 -0
- package/dist/oxlint/rules/PreferSurface.js +55 -0
- package/dist/oxlint/rules/PreferSurface.js.map +1 -0
- package/dist/oxlint/rules/RequireAccessibleName.d.ts.map +1 -1
- package/dist/oxlint/rules/RequireAccessibleName.js +3 -1
- package/dist/oxlint/rules/RequireAccessibleName.js.map +1 -1
- package/dist/oxlint/rules/RequireScrollRegion.d.ts +11 -0
- package/dist/oxlint/rules/RequireScrollRegion.d.ts.map +1 -0
- package/dist/oxlint/rules/RequireScrollRegion.js +71 -0
- package/dist/oxlint/rules/RequireScrollRegion.js.map +1 -0
- package/dist/web/icons/index.js.zyzz.json +1 -0
- package/package.json +6 -1
- package/src/marketing/README.md +21 -0
- package/src/marketing/index.ts +3 -0
- package/src/marketing/vars.ts +751 -0
- package/src/marketing/zyzz.config.ts +376 -0
- package/src/oxlint/index.ts +40 -1
- package/src/oxlint/internal/Docs.ts +18 -0
- package/src/oxlint/internal/Imports.ts +2 -1
- package/src/oxlint/internal/Styles.ts +240 -0
- package/src/oxlint/internal/Tokens.ts +43 -0
- package/src/oxlint/rules/NoCrossSurface.ts +3 -3
- package/src/oxlint/rules/NoCustomValues.ts +170 -0
- package/src/oxlint/rules/NoSingleKeyShortcuts.ts +190 -0
- package/src/oxlint/rules/PreferComponent.ts +11 -4
- package/src/oxlint/rules/PreferLayout.ts +96 -0
- package/src/oxlint/rules/PreferProgress.ts +49 -0
- package/src/oxlint/rules/PreferSurface.ts +70 -0
- package/src/oxlint/rules/RequireAccessibleName.ts +3 -1
- package/src/oxlint/rules/RequireScrollRegion.ts +92 -0
|
@@ -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](banner.md) for a message about the whole product or page, such as an outage.
|
|
173
|
+
* Use [Toast](toast.md) to confirm that an action finished, such as Payment sent.
|
|
174
|
+
* If an action needs a decision before it continues, use [AlertDialog](alert-dialog.md).
|
|
175
|
+
* Use `Field.Error` from [Field](field.md) for a validation message on one input.
|
|
176
|
+
* Use [Badge](badge.md) 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](dialog.md), 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](banner.md)
|
|
431
|
+
|
|
432
|
+
Use for a message about the whole page.
|
|
433
|
+
|
|
434
|
+
[Toast](toast.md)
|
|
435
|
+
|
|
436
|
+
Use for confirming a finished action.
|
|
437
|
+
|
|
438
|
+
[Field](field.md)
|
|
439
|
+
|
|
440
|
+
Use for validation messages on an input.
|
|
441
|
+
|
|
442
|
+
[Errors and Validation](../patterns/errors-and-validation.md)
|
|
443
|
+
|
|
444
|
+
Covers reporting failures.
|
|
445
|
+
|
|
446
|
+
[Feedback and Status](../patterns/feedback-and-status.md)
|
|
447
|
+
|
|
448
|
+
Covers choosing a message component.
|