@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.
- package/dist/docs/AGENTS.md +9 -0
- package/dist/docs/components/accordion.md +489 -0
- package/dist/docs/components/address-card.md +147 -0
- package/dist/docs/components/agent-logo.md +194 -0
- package/dist/docs/components/alert-dialog.md +631 -0
- package/dist/docs/components/alert.md +448 -0
- package/dist/docs/components/amount-input.md +305 -0
- package/dist/docs/components/amount.md +794 -0
- package/dist/docs/components/app-shell.md +559 -0
- package/dist/docs/components/asset-chip.md +294 -0
- package/dist/docs/components/autocomplete.md +619 -0
- package/dist/docs/components/avatar.md +321 -0
- package/dist/docs/components/badge.md +339 -0
- package/dist/docs/components/badged-logo.md +116 -0
- package/dist/docs/components/banner.md +379 -0
- package/dist/docs/components/bar-chart.md +208 -0
- package/dist/docs/components/breadcrumbs.md +380 -0
- package/dist/docs/components/button-group.md +286 -0
- package/dist/docs/components/button.md +650 -0
- package/dist/docs/components/calendar.md +375 -0
- package/dist/docs/components/callout.md +96 -0
- package/dist/docs/components/checkbox-group.md +521 -0
- package/dist/docs/components/checkbox.md +467 -0
- package/dist/docs/components/choice-group.md +516 -0
- package/dist/docs/components/choicebox.md +641 -0
- package/dist/docs/components/code.md +100 -0
- package/dist/docs/components/combobox.md +939 -0
- package/dist/docs/components/container.md +257 -0
- package/dist/docs/components/copy-button.md +642 -0
- package/dist/docs/components/date-picker.md +514 -0
- package/dist/docs/components/dialog.md +1332 -0
- package/dist/docs/components/drawer.md +966 -0
- package/dist/docs/components/empty.md +340 -0
- package/dist/docs/components/field.md +570 -0
- package/dist/docs/components/fieldset.md +398 -0
- package/dist/docs/components/frame.md +434 -0
- package/dist/docs/components/gauge.md +299 -0
- package/dist/docs/components/get-started-visual.md +117 -0
- package/dist/docs/components/grid.md +288 -0
- package/dist/docs/components/hero-visual.md +155 -0
- package/dist/docs/components/hex.md +487 -0
- package/dist/docs/components/icon-tile.md +292 -0
- package/dist/docs/components/identicon.md +371 -0
- package/dist/docs/components/inline.md +233 -0
- package/dist/docs/components/inset.md +225 -0
- package/dist/docs/components/kbd.md +423 -0
- package/dist/docs/components/list-group.md +981 -0
- package/dist/docs/components/loading-dots.md +237 -0
- package/dist/docs/components/menu.md +934 -0
- package/dist/docs/components/native-select.md +204 -0
- package/dist/docs/components/network-logo.md +248 -0
- package/dist/docs/components/number-field.md +543 -0
- package/dist/docs/components/otp-field.md +616 -0
- package/dist/docs/components/pagination.md +516 -0
- package/dist/docs/components/popover.md +544 -0
- package/dist/docs/components/progress.md +388 -0
- package/dist/docs/components/qr.md +314 -0
- package/dist/docs/components/radio-group.md +528 -0
- package/dist/docs/components/secret-value.md +406 -0
- package/dist/docs/components/select.md +751 -0
- package/dist/docs/components/separator.md +379 -0
- package/dist/docs/components/sidebar-menu.md +922 -0
- package/dist/docs/components/skeleton.md +517 -0
- package/dist/docs/components/slider.md +539 -0
- package/dist/docs/components/snippet.md +424 -0
- package/dist/docs/components/spinner.md +216 -0
- package/dist/docs/components/split-bar.md +139 -0
- package/dist/docs/components/split-button.md +464 -0
- package/dist/docs/components/stack.md +299 -0
- package/dist/docs/components/status-chip.md +226 -0
- package/dist/docs/components/status-indicator.md +119 -0
- package/dist/docs/components/status-row.md +174 -0
- package/dist/docs/components/stepper.md +451 -0
- package/dist/docs/components/success-hero.md +157 -0
- package/dist/docs/components/surface.md +639 -0
- package/dist/docs/components/switch.md +472 -0
- package/dist/docs/components/table.md +967 -0
- package/dist/docs/components/tabs.md +627 -0
- package/dist/docs/components/tempo-logo.md +185 -0
- package/dist/docs/components/text-input.md +624 -0
- package/dist/docs/components/textarea.md +352 -0
- package/dist/docs/components/toast.md +535 -0
- package/dist/docs/components/token-logo.md +371 -0
- package/dist/docs/components/token.md +247 -0
- package/dist/docs/components/tooltip.md +490 -0
- package/dist/docs/components/verification-code.md +116 -0
- package/dist/docs/components/visual.md +249 -0
- package/dist/docs/components.md +203 -0
- package/dist/docs/foundations/accessibility.md +377 -0
- package/dist/docs/foundations/agents.md +150 -0
- package/dist/docs/foundations/color.md +522 -0
- package/dist/docs/foundations/content/tone.md +194 -0
- package/dist/docs/foundations/content/voice.md +194 -0
- package/dist/docs/foundations/content/writing-style.md +406 -0
- package/dist/docs/foundations/iconography.md +282 -0
- package/dist/docs/foundations/intent.md +360 -0
- package/dist/docs/foundations/layout.md +508 -0
- package/dist/docs/foundations/linter.md +296 -0
- package/dist/docs/foundations/motion.md +151 -0
- package/dist/docs/foundations/radius-and-padding.md +86 -0
- package/dist/docs/foundations/typography.md +266 -0
- package/dist/docs/index.md +137 -0
- package/dist/docs/introduction/faq.md +132 -0
- package/dist/docs/introduction/getting-started.md +377 -0
- package/dist/docs/patterns/blockchain-values.md +709 -0
- package/dist/docs/patterns/dashboards.md +638 -0
- package/dist/docs/patterns/destructive-actions.md +626 -0
- package/dist/docs/patterns/empty-states.md +612 -0
- package/dist/docs/patterns/errors-and-validation.md +808 -0
- package/dist/docs/patterns/feedback-and-status.md +518 -0
- package/dist/docs/patterns/forms.md +679 -0
- package/dist/docs/patterns/loading.md +630 -0
- package/dist/docs/patterns/navigation.md +397 -0
- package/dist/docs/patterns/payments.md +765 -0
- package/dist/docs/patterns/responsive-layout.md +997 -0
- package/dist/docs/patterns/tables-and-lists.md +964 -0
- package/dist/docs/products/tempo-console.md +671 -0
- package/dist/docs/products/tempo-performance.md +437 -0
- package/dist/docs/products/tempo-wallet.md +438 -0
- package/dist/web/components/OtpField.css +1 -1
- package/dist/web/components/OtpField.d.ts +1 -1
- package/dist/web/components/OtpField.d.ts.map +1 -1
- package/dist/web/components/OtpField.js +3 -4
- package/dist/web/components/OtpField.js.map +1 -1
- package/dist/web/components/OtpField.js.zyzz.json +1 -1
- package/dist/web/index.js.zyzz.json +1 -1
- package/package.json +1 -1
- package/src/web/components/OtpField.tsx +2 -24
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
# Stack
|
|
2
|
+
|
|
3
|
+
Lays out children in a vertical column.
|
|
4
|
+
|
|
5
|
+
[View source and API](https://github.com/tempoxyz/ds/blob/main/src/web/components/Stack.tsx)
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Stack applies a spacing token `gap` between its children and stretches them to its width by default.
|
|
10
|
+
|
|
11
|
+
## Examples
|
|
12
|
+
|
|
13
|
+
### Basic
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import { Stack } from '@tempoxyz/ds'
|
|
17
|
+
|
|
18
|
+
export function Demo() {
|
|
19
|
+
return (
|
|
20
|
+
<Stack gap="12">
|
|
21
|
+
<span>Card content</span>
|
|
22
|
+
<span>Second line</span>
|
|
23
|
+
</Stack>
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Stack/Basic.tsx)
|
|
29
|
+
|
|
30
|
+
### Gap
|
|
31
|
+
|
|
32
|
+
Set `gap` to a spacing token. It defaults to `16`.
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
import { Inline, Stack, style } from '@tempoxyz/ds'
|
|
36
|
+
|
|
37
|
+
export function Demo() {
|
|
38
|
+
return (
|
|
39
|
+
<Inline align="start" gap="32" wrap>
|
|
40
|
+
{(['4', '12', '24'] as const).map((gap) => (
|
|
41
|
+
<Stack gap={gap} key={gap}>
|
|
42
|
+
{[1, 2, 3].map((n) => (
|
|
43
|
+
<span key={n} {...styles.chip()}>
|
|
44
|
+
gap {gap}
|
|
45
|
+
</span>
|
|
46
|
+
))}
|
|
47
|
+
</Stack>
|
|
48
|
+
))}
|
|
49
|
+
</Inline>
|
|
50
|
+
)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
namespace styles {
|
|
54
|
+
export const chip = style({
|
|
55
|
+
backgroundColor: 'container.regular',
|
|
56
|
+
borderRadius: 'full',
|
|
57
|
+
cornerShape: 'round',
|
|
58
|
+
paddingBlock: '4',
|
|
59
|
+
paddingInline: '12',
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Stack/Gap.tsx)
|
|
65
|
+
|
|
66
|
+
### Align
|
|
67
|
+
|
|
68
|
+
Set `align` to `start`, `center`, `end`, or `stretch` (default).
|
|
69
|
+
|
|
70
|
+
```tsx
|
|
71
|
+
import { Inline, Stack, style } from '@tempoxyz/ds'
|
|
72
|
+
|
|
73
|
+
export function Demo() {
|
|
74
|
+
return (
|
|
75
|
+
<Inline align="start" gap="32" wrap>
|
|
76
|
+
{(['start', 'center', 'end', 'stretch'] as const).map((align) => (
|
|
77
|
+
<Stack align={align} gap="8" key={align} {...styles.column()}>
|
|
78
|
+
<span {...styles.chip()}>{align}</span>
|
|
79
|
+
<span {...styles.chip()}>Second line</span>
|
|
80
|
+
</Stack>
|
|
81
|
+
))}
|
|
82
|
+
</Inline>
|
|
83
|
+
)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
namespace styles {
|
|
87
|
+
export const chip = style({
|
|
88
|
+
backgroundColor: 'container.regular',
|
|
89
|
+
borderRadius: 'full',
|
|
90
|
+
cornerShape: 'round',
|
|
91
|
+
paddingBlock: '4',
|
|
92
|
+
paddingInline: '12',
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
export const column = style({ width: '10rem !custom' })
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Stack/Align.tsx)
|
|
100
|
+
|
|
101
|
+
## Anatomy
|
|
102
|
+
|
|
103
|
+
Import the component and assemble its parts.
|
|
104
|
+
|
|
105
|
+
```tsx
|
|
106
|
+
import { Stack } from '@tempoxyz/ds'
|
|
107
|
+
|
|
108
|
+
<Stack />
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## Guidelines
|
|
112
|
+
|
|
113
|
+
### When to Use
|
|
114
|
+
|
|
115
|
+
* Space siblings vertically, such as form fields, settings sections, or cards in a column.
|
|
116
|
+
* Place a label above its value, such as Recipient over a 0x address.
|
|
117
|
+
|
|
118
|
+
### When Not to Use
|
|
119
|
+
|
|
120
|
+
* Use [Inline](/docs/components/inline) for a horizontal row.
|
|
121
|
+
* Use [Grid](/docs/components/grid) for collections in columns.
|
|
122
|
+
* Use [ListGroup](/docs/components/list-group) for a divided list of settings or details.
|
|
123
|
+
|
|
124
|
+
### Use Gap Instead of Margins
|
|
125
|
+
|
|
126
|
+
Space siblings with `gap`, not child margins. See [Layout](/docs/foundations/layout).
|
|
127
|
+
|
|
128
|
+
**Do:** Set one `gap` on the Stack.
|
|
129
|
+
|
|
130
|
+
```tsx
|
|
131
|
+
/** Do example for "Use Gap Instead of Margins" on the Stack page: set one `gap` on the Stack. @module */
|
|
132
|
+
import { Stack, style, Surface } from '@tempoxyz/ds'
|
|
133
|
+
|
|
134
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
135
|
+
export function Demo() {
|
|
136
|
+
return (
|
|
137
|
+
<Stack gap="12" {...styles.canvas()}>
|
|
138
|
+
<Surface size="small">Balance</Surface>
|
|
139
|
+
<Surface size="small">Activity</Surface>
|
|
140
|
+
<Surface size="small">Access keys</Surface>
|
|
141
|
+
</Stack>
|
|
142
|
+
)
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
namespace styles {
|
|
146
|
+
export const canvas = style({
|
|
147
|
+
backgroundColor: 'background.primary',
|
|
148
|
+
borderRadius: 'sm',
|
|
149
|
+
boxSizing: 'border-box',
|
|
150
|
+
padding: '12',
|
|
151
|
+
width: '100% !custom',
|
|
152
|
+
})
|
|
153
|
+
}
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**Don't:** Set margins on each child, which drift apart and leave space after the last one.
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
/**
|
|
160
|
+
* Don't example for "Use Gap Instead of Margins" on the Stack page.
|
|
161
|
+
* Don't set margins on each child, which drift apart and leave space after the last one.
|
|
162
|
+
* @module
|
|
163
|
+
*/
|
|
164
|
+
import { style, Surface } from '@tempoxyz/ds'
|
|
165
|
+
|
|
166
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
167
|
+
export function Demo() {
|
|
168
|
+
return (
|
|
169
|
+
<div {...styles.canvas()}>
|
|
170
|
+
<Surface size="small" {...styles.first()}>
|
|
171
|
+
Balance
|
|
172
|
+
</Surface>
|
|
173
|
+
<Surface size="small" {...styles.second()}>
|
|
174
|
+
Activity
|
|
175
|
+
</Surface>
|
|
176
|
+
<Surface size="small" {...styles.third()}>
|
|
177
|
+
Access keys
|
|
178
|
+
</Surface>
|
|
179
|
+
</div>
|
|
180
|
+
)
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
namespace styles {
|
|
184
|
+
export const canvas = style({
|
|
185
|
+
backgroundColor: 'background.primary',
|
|
186
|
+
borderRadius: 'sm',
|
|
187
|
+
boxSizing: 'border-box',
|
|
188
|
+
padding: '12',
|
|
189
|
+
width: '100% !custom',
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
export const first = style({ marginBlockEnd: '4' })
|
|
193
|
+
|
|
194
|
+
export const second = style({ marginBlockEnd: '24' })
|
|
195
|
+
|
|
196
|
+
export const third = style({ marginBlockEnd: '16' })
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Choose Gap by Relationship
|
|
201
|
+
|
|
202
|
+
Nest stacks so the space inside a group is smaller than the space between groups, such as `4` between a label and its value and `24` between pairs.
|
|
203
|
+
|
|
204
|
+
**Do:** Nest stacks so each label sits closer to its own value.
|
|
205
|
+
|
|
206
|
+
```tsx
|
|
207
|
+
/**
|
|
208
|
+
* Do example for "Choose Gap by Relationship" on the Stack page.
|
|
209
|
+
* Nest stacks so each label sits closer to its own value.
|
|
210
|
+
* @module
|
|
211
|
+
*/
|
|
212
|
+
import { Stack, style } from '@tempoxyz/ds'
|
|
213
|
+
|
|
214
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
215
|
+
export function Demo() {
|
|
216
|
+
return (
|
|
217
|
+
<Stack gap="24" {...styles.column()}>
|
|
218
|
+
<Stack gap="4">
|
|
219
|
+
<span {...styles.label()}>Recipient</span>
|
|
220
|
+
<span {...styles.value()}>0x71C7…976F</span>
|
|
221
|
+
</Stack>
|
|
222
|
+
<Stack gap="4">
|
|
223
|
+
<span {...styles.label()}>Amount</span>
|
|
224
|
+
<span {...styles.value()}>250.00 USDC</span>
|
|
225
|
+
</Stack>
|
|
226
|
+
</Stack>
|
|
227
|
+
)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
namespace styles {
|
|
231
|
+
export const column = style({ width: '100% !custom' })
|
|
232
|
+
|
|
233
|
+
export const label = style({ color: 'content.secondary', typography: 'body.b3' })
|
|
234
|
+
|
|
235
|
+
export const value = style({ color: 'content.primary', typography: 'body.b1Strong' })
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
**Don't:** Space every item the same, which hides the groups.
|
|
240
|
+
|
|
241
|
+
```tsx
|
|
242
|
+
/**
|
|
243
|
+
* Don't example for "Choose Gap by Relationship" on the Stack page.
|
|
244
|
+
* Don't space every item the same, which hides the groups.
|
|
245
|
+
* @module
|
|
246
|
+
*/
|
|
247
|
+
import { Stack, style } from '@tempoxyz/ds'
|
|
248
|
+
|
|
249
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
250
|
+
export function Demo() {
|
|
251
|
+
return (
|
|
252
|
+
<Stack gap="16" {...styles.column()}>
|
|
253
|
+
<span {...styles.label()}>Recipient</span>
|
|
254
|
+
<span {...styles.value()}>0x71C7…976F</span>
|
|
255
|
+
<span {...styles.label()}>Amount</span>
|
|
256
|
+
<span {...styles.value()}>250.00 USDC</span>
|
|
257
|
+
</Stack>
|
|
258
|
+
)
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
namespace styles {
|
|
262
|
+
export const column = style({ width: '100% !custom' })
|
|
263
|
+
|
|
264
|
+
export const label = style({ color: 'content.secondary', typography: 'body.b3' })
|
|
265
|
+
|
|
266
|
+
export const value = style({ color: 'content.primary', typography: 'body.b1Strong' })
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
## Accessibility
|
|
271
|
+
|
|
272
|
+
Stack adds no role, name, or keyboard behavior.
|
|
273
|
+
|
|
274
|
+
### Semantics
|
|
275
|
+
|
|
276
|
+
* **Element (div):** Carries no role by default.
|
|
277
|
+
* **Render (render):** Swaps in a semantic element, such as a nav for links, or a list so screen readers announce the count.
|
|
278
|
+
|
|
279
|
+
### Your Responsibilities
|
|
280
|
+
|
|
281
|
+
* **Match DOM and Visual Order (SC 1.3.2, SC 2.4.3):** Don't reorder children with CSS. [Reading](https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html) and [focus](https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html) order follow the DOM.
|
|
282
|
+
|
|
283
|
+
## Related
|
|
284
|
+
|
|
285
|
+
[Inline](/docs/components/inline)
|
|
286
|
+
|
|
287
|
+
Use for horizontal rows.
|
|
288
|
+
|
|
289
|
+
[Grid](/docs/components/grid)
|
|
290
|
+
|
|
291
|
+
Use for columns of items.
|
|
292
|
+
|
|
293
|
+
[Separator](/docs/components/separator)
|
|
294
|
+
|
|
295
|
+
Use for a rule between groups.
|
|
296
|
+
|
|
297
|
+
[Layout](/docs/foundations/layout)
|
|
298
|
+
|
|
299
|
+
Covers the spacing scale.
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# StatusChip
|
|
2
|
+
|
|
3
|
+
Names the status of a payment, an authorization, or a network.
|
|
4
|
+
|
|
5
|
+
[View source and API](https://github.com/tempoxyz/ds/blob/main/src/web/components/StatusChip.tsx)
|
|
6
|
+
|
|
7
|
+
Figma: [Elements/Network Chip](https://www.figma.com/design/yE96kcymnNR88PJp6G1sPs?node-id=5227-3090), [Messaging/Status Chip](https://www.figma.com/design/yE96kcymnNR88PJp6G1sPs?node-id=5227-3776)
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
A status chip renders a short label in a tinted pill, led by a dot in the color of its `intent`. A loading chip replaces the dot with a spinner, for a status that is still in progress. A network chip names a network at a fixed minimum width.
|
|
12
|
+
|
|
13
|
+
## Examples
|
|
14
|
+
|
|
15
|
+
### Basic
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import { StatusChip } from '@tempoxyz/ds'
|
|
19
|
+
|
|
20
|
+
export function Demo() {
|
|
21
|
+
return <StatusChip intent="warning">Pending</StatusChip>
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/StatusChip/Basic.tsx)
|
|
26
|
+
|
|
27
|
+
### Intent
|
|
28
|
+
|
|
29
|
+
Set `intent` to `neutral` (default), `positive`, `warning`, or `negative`.
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
import { StatusChip, style } from '@tempoxyz/ds'
|
|
33
|
+
|
|
34
|
+
export function Demo() {
|
|
35
|
+
return (
|
|
36
|
+
<div {...styles.row()}>
|
|
37
|
+
<StatusChip intent="positive">Authorized</StatusChip>
|
|
38
|
+
<StatusChip intent="warning">Needs approval</StatusChip>
|
|
39
|
+
<StatusChip intent="negative">Failed</StatusChip>
|
|
40
|
+
<StatusChip intent="neutral">Expired</StatusChip>
|
|
41
|
+
</div>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
namespace styles {
|
|
46
|
+
export const row = style({ alignItems: 'center', display: 'flex', flexWrap: 'wrap', gap: '8' })
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/StatusChip/Intent.tsx)
|
|
51
|
+
|
|
52
|
+
### Size
|
|
53
|
+
|
|
54
|
+
Set `size` to `medium` (28px, default) or `small` (24px).
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
import { StatusChip, style } from '@tempoxyz/ds'
|
|
58
|
+
|
|
59
|
+
export function Demo() {
|
|
60
|
+
return (
|
|
61
|
+
<div {...styles.row()}>
|
|
62
|
+
<StatusChip intent="positive">Live</StatusChip>
|
|
63
|
+
<StatusChip intent="positive" size="small">
|
|
64
|
+
Live
|
|
65
|
+
</StatusChip>
|
|
66
|
+
</div>
|
|
67
|
+
)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
namespace styles {
|
|
71
|
+
export const row = style({ alignItems: 'center', display: 'flex', gap: '8' })
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/StatusChip/Size.tsx)
|
|
76
|
+
|
|
77
|
+
### Loading
|
|
78
|
+
|
|
79
|
+
Set `loading` for a status in progress, such as Processing.
|
|
80
|
+
|
|
81
|
+
```tsx
|
|
82
|
+
import { StatusChip } from '@tempoxyz/ds'
|
|
83
|
+
|
|
84
|
+
export function Demo() {
|
|
85
|
+
return <StatusChip loading>Processing</StatusChip>
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/StatusChip/Loading.tsx)
|
|
90
|
+
|
|
91
|
+
### Network
|
|
92
|
+
|
|
93
|
+
Set `network` for a chip that names a network, such as Mainnet or Testnet. It keeps an 80px minimum width, with the dot closer to the label.
|
|
94
|
+
|
|
95
|
+
```tsx
|
|
96
|
+
import { StatusChip, style } from '@tempoxyz/ds'
|
|
97
|
+
|
|
98
|
+
export function Demo() {
|
|
99
|
+
return (
|
|
100
|
+
<div {...styles.row()}>
|
|
101
|
+
<StatusChip intent="positive" network>
|
|
102
|
+
Mainnet
|
|
103
|
+
</StatusChip>
|
|
104
|
+
<StatusChip intent="warning" network>
|
|
105
|
+
Testnet
|
|
106
|
+
</StatusChip>
|
|
107
|
+
</div>
|
|
108
|
+
)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
namespace styles {
|
|
112
|
+
export const row = style({ alignItems: 'center', display: 'flex', gap: '8' })
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/StatusChip/Network.tsx)
|
|
117
|
+
|
|
118
|
+
## Anatomy
|
|
119
|
+
|
|
120
|
+
Import the component and assemble its parts.
|
|
121
|
+
|
|
122
|
+
```tsx
|
|
123
|
+
import { StatusChip } from '@tempoxyz/ds'
|
|
124
|
+
|
|
125
|
+
<StatusChip />
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Guidelines
|
|
129
|
+
|
|
130
|
+
### When to Use
|
|
131
|
+
|
|
132
|
+
* Show where a payment, a deposit, or an authorization stands, such as Pending or Authorized.
|
|
133
|
+
* Show whether a network is live or a testnet, with `network`.
|
|
134
|
+
|
|
135
|
+
### When Not to Use
|
|
136
|
+
|
|
137
|
+
* Use [Badge](/docs/components/badge) for a category or an attribute that is not a status.
|
|
138
|
+
* Use [Alert](/docs/components/alert) to explain a status and what to do next.
|
|
139
|
+
* Use [AssetChip](/docs/components/asset-chip) for the assets a row supports.
|
|
140
|
+
|
|
141
|
+
### Pick the Intent From the Outcome
|
|
142
|
+
|
|
143
|
+
* **Positive:** The action is done, or the item is live.
|
|
144
|
+
* **Warning:** The item waits on a person or a later step.
|
|
145
|
+
* **Negative:** The action failed and needs attention.
|
|
146
|
+
* **Neutral:** The item ended without an outcome.
|
|
147
|
+
|
|
148
|
+
### Name Only Statuses
|
|
149
|
+
|
|
150
|
+
**Do:** Place the chip at the end of the row whose status it names.
|
|
151
|
+
|
|
152
|
+
```tsx
|
|
153
|
+
import { ListGroup, StatusChip } from '@tempoxyz/ds'
|
|
154
|
+
|
|
155
|
+
export function Demo() {
|
|
156
|
+
return (
|
|
157
|
+
<ListGroup variant="boxed">
|
|
158
|
+
<ListGroup.Row>
|
|
159
|
+
<ListGroup.Info>
|
|
160
|
+
<ListGroup.Title>Claude</ListGroup.Title>
|
|
161
|
+
<ListGroup.Description>$10.00 a month</ListGroup.Description>
|
|
162
|
+
</ListGroup.Info>
|
|
163
|
+
<StatusChip intent="positive" size="small">
|
|
164
|
+
Authorized
|
|
165
|
+
</StatusChip>
|
|
166
|
+
</ListGroup.Row>
|
|
167
|
+
</ListGroup>
|
|
168
|
+
)
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
**Don't:** Use a status chip for a category. Use a [Badge](/docs/components/badge).
|
|
173
|
+
|
|
174
|
+
```tsx
|
|
175
|
+
import { ListGroup, StatusChip } from '@tempoxyz/ds'
|
|
176
|
+
|
|
177
|
+
export function Demo() {
|
|
178
|
+
return (
|
|
179
|
+
<ListGroup variant="boxed">
|
|
180
|
+
<ListGroup.Row>
|
|
181
|
+
<ListGroup.Info>
|
|
182
|
+
<ListGroup.Title>Claude</ListGroup.Title>
|
|
183
|
+
<ListGroup.Description>$10.00 a month</ListGroup.Description>
|
|
184
|
+
</ListGroup.Info>
|
|
185
|
+
<StatusChip intent="positive" size="small">
|
|
186
|
+
Agent
|
|
187
|
+
</StatusChip>
|
|
188
|
+
</ListGroup.Row>
|
|
189
|
+
</ListGroup>
|
|
190
|
+
)
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
## Content
|
|
195
|
+
|
|
196
|
+
### Write the Status
|
|
197
|
+
|
|
198
|
+
Write one or two words that name the state, such as Pending, Live, or Needs approval. Use sentence case, and leave out words such as Status.
|
|
199
|
+
|
|
200
|
+
## Accessibility
|
|
201
|
+
|
|
202
|
+
A status chip renders a `<span>` that screen readers read as text in place. The dot and the spinner are hidden, so the label alone carries the status.
|
|
203
|
+
|
|
204
|
+
### Semantics
|
|
205
|
+
|
|
206
|
+
* **Root (span):** Screen readers read the label in place, without the dot.
|
|
207
|
+
* **Loading (aria-hidden):** The spinner is hidden, so screen readers read the label once.
|
|
208
|
+
|
|
209
|
+
### Your Responsibilities
|
|
210
|
+
|
|
211
|
+
* **Name the Status in Text (SC 1.4.1):** The intent color is decorative, so the label must name the status.
|
|
212
|
+
* **Announce a Change (aria-live):** Wrap a chip that changes in place in a polite live region.
|
|
213
|
+
|
|
214
|
+
## Related
|
|
215
|
+
|
|
216
|
+
[Badge](/docs/components/badge)
|
|
217
|
+
|
|
218
|
+
Use for categories and attributes.
|
|
219
|
+
|
|
220
|
+
[Alert](/docs/components/alert)
|
|
221
|
+
|
|
222
|
+
Use for a status that needs an explanation.
|
|
223
|
+
|
|
224
|
+
[StatusRow](/docs/components/status-row)
|
|
225
|
+
|
|
226
|
+
Use for a status that follows a payment in a row.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# StatusIndicator
|
|
2
|
+
|
|
3
|
+
Names the status of a system or a service with a dot and a label.
|
|
4
|
+
|
|
5
|
+
[View source and API](https://github.com/tempoxyz/ds/blob/main/src/web/components/StatusIndicator.tsx)
|
|
6
|
+
|
|
7
|
+
Figma: [Status indicator](https://www.figma.com/design/yE96kcymnNR88PJp6G1sPs?node-id=3065-474)
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
A status indicator renders a short secondary label, led by an 8px dot in the color of its `intent`. It has no fill, so it sits quietly beside a title or in a list of services.
|
|
12
|
+
|
|
13
|
+
## Examples
|
|
14
|
+
|
|
15
|
+
### Basic
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import { StatusIndicator } from '@tempoxyz/ds'
|
|
19
|
+
|
|
20
|
+
export function Demo() {
|
|
21
|
+
return <StatusIndicator intent="positive">Operational</StatusIndicator>
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/StatusIndicator/Basic.tsx)
|
|
26
|
+
|
|
27
|
+
### Intent
|
|
28
|
+
|
|
29
|
+
Set `intent` to `neutral` (default), `positive`, `warning`, or `negative`. Each colors the dot.
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
import { StatusIndicator, style } from '@tempoxyz/ds'
|
|
33
|
+
|
|
34
|
+
export function Demo() {
|
|
35
|
+
return (
|
|
36
|
+
<div {...styles.row()}>
|
|
37
|
+
<StatusIndicator intent="neutral">Idle</StatusIndicator>
|
|
38
|
+
<StatusIndicator intent="positive">Operational</StatusIndicator>
|
|
39
|
+
<StatusIndicator intent="warning">Degraded</StatusIndicator>
|
|
40
|
+
<StatusIndicator intent="negative">Down</StatusIndicator>
|
|
41
|
+
</div>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
namespace styles {
|
|
46
|
+
export const row = style({ alignItems: 'center', display: 'flex', flexWrap: 'wrap', gap: '16' })
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/StatusIndicator/Intent.tsx)
|
|
51
|
+
|
|
52
|
+
## Anatomy
|
|
53
|
+
|
|
54
|
+
Import the component and assemble its parts.
|
|
55
|
+
|
|
56
|
+
```tsx
|
|
57
|
+
import { StatusIndicator } from '@tempoxyz/ds'
|
|
58
|
+
|
|
59
|
+
<StatusIndicator />
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Guidelines
|
|
63
|
+
|
|
64
|
+
### When to Use
|
|
65
|
+
|
|
66
|
+
* Show the live status of a system, a service, or a connection, such as Operational or Degraded.
|
|
67
|
+
|
|
68
|
+
### When Not to Use
|
|
69
|
+
|
|
70
|
+
* Use a [StatusChip](/docs/components/status-chip) for the status of a payment or an authorization.
|
|
71
|
+
* Use a [Badge](/docs/components/badge) for a category or an attribute.
|
|
72
|
+
* Use an [Alert](/docs/components/alert) for a status that needs an explanation.
|
|
73
|
+
|
|
74
|
+
### Match the Intent to the Status
|
|
75
|
+
|
|
76
|
+
* **Healthy (positive):** A service that works as expected, such as an online validator.
|
|
77
|
+
* **Degraded (warning):** A service that works with delays or reduced capacity right now.
|
|
78
|
+
* **Down (negative):** A service that fails or can't be reached, such as an offline node.
|
|
79
|
+
* **Idle (neutral):** A service that is paused, idle, or in a state that isn't known yet.
|
|
80
|
+
|
|
81
|
+
### Name the Status in the Label
|
|
82
|
+
|
|
83
|
+
**Do:** Name the status in a word, so it doesn't depend on the dot color.
|
|
84
|
+
|
|
85
|
+
```tsx
|
|
86
|
+
<StatusIndicator intent="negative">Down</StatusIndicator>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
**Don't:** Label the dot with the name of the service alone.
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
<StatusIndicator intent="negative">API</StatusIndicator>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Content
|
|
96
|
+
|
|
97
|
+
* Keep the label to one or two words in sentence case, such as Operational or Partial outage.
|
|
98
|
+
* Use one word for one status across a product.
|
|
99
|
+
|
|
100
|
+
## Accessibility
|
|
101
|
+
|
|
102
|
+
A status indicator renders a `<span>` with no role. The dot is hidden, so screen readers read the label alone.
|
|
103
|
+
|
|
104
|
+
* **Dot (aria-hidden):** Hides the dot from screen readers, so the label carries the status.
|
|
105
|
+
* **Live Updates (role):** If the status changes in place, set `role="status"` so the change is announced.
|
|
106
|
+
|
|
107
|
+
## Related
|
|
108
|
+
|
|
109
|
+
[StatusChip](/docs/components/status-chip)
|
|
110
|
+
|
|
111
|
+
Use for the status of a payment or an authorization.
|
|
112
|
+
|
|
113
|
+
[Badge](/docs/components/badge)
|
|
114
|
+
|
|
115
|
+
Use for categories and attributes.
|
|
116
|
+
|
|
117
|
+
[Alert](/docs/components/alert)
|
|
118
|
+
|
|
119
|
+
Use for a status that needs an explanation.
|