@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,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.