@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,388 @@
|
|
|
1
|
+
# Progress
|
|
2
|
+
|
|
3
|
+
Shows how far a task has advanced.
|
|
4
|
+
|
|
5
|
+
[View source and API](https://github.com/tempoxyz/ds/blob/main/src/web/components/Progress.tsx)
|
|
6
|
+
|
|
7
|
+
Figma: [Progress](https://www.figma.com/design/yE96kcymnNR88PJp6G1sPs?node-id=3048-372) (`Progress.Root`)
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
A bar that fills in the `intent` color as a task advances, with an optional label and printed value.
|
|
12
|
+
|
|
13
|
+
## Examples
|
|
14
|
+
|
|
15
|
+
### Basic
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import { Progress, style } from '@tempoxyz/ds'
|
|
19
|
+
|
|
20
|
+
export const fill = true
|
|
21
|
+
export function Demo() {
|
|
22
|
+
return (
|
|
23
|
+
<Progress.Root value={60} {...styles.progress()}>
|
|
24
|
+
<Progress.Label>Uploading</Progress.Label>
|
|
25
|
+
<Progress.Value />
|
|
26
|
+
<Progress.Track>
|
|
27
|
+
<Progress.Indicator />
|
|
28
|
+
</Progress.Track>
|
|
29
|
+
</Progress.Root>
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
namespace styles {
|
|
34
|
+
export const progress = style({ maxWidth: '24rem !custom' })
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Progress/Basic.tsx)
|
|
39
|
+
|
|
40
|
+
### Intent
|
|
41
|
+
|
|
42
|
+
Set `intent` to `neutral` (default) or `positive`.
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
import { Progress, style } from '@tempoxyz/ds'
|
|
46
|
+
|
|
47
|
+
export const fill = true
|
|
48
|
+
export function Demo() {
|
|
49
|
+
return (
|
|
50
|
+
<div {...styles.stack()}>
|
|
51
|
+
{(['neutral', 'positive'] as const).map((intent, index) => (
|
|
52
|
+
<Progress.Root intent={intent} key={intent} value={20 + index * 20}>
|
|
53
|
+
<Progress.Label>{intent}</Progress.Label>
|
|
54
|
+
<Progress.Value />
|
|
55
|
+
<Progress.Track>
|
|
56
|
+
<Progress.Indicator />
|
|
57
|
+
</Progress.Track>
|
|
58
|
+
</Progress.Root>
|
|
59
|
+
))}
|
|
60
|
+
</div>
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
namespace styles {
|
|
65
|
+
export const stack = style({
|
|
66
|
+
display: 'flex',
|
|
67
|
+
flexDirection: 'column',
|
|
68
|
+
gap: '16',
|
|
69
|
+
maxWidth: '24rem !custom',
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Progress/Intent.tsx)
|
|
75
|
+
|
|
76
|
+
### Value
|
|
77
|
+
|
|
78
|
+
If the remaining work is unknown, pass `value={null}` for an indeterminate bar.
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
import { Progress, style } from '@tempoxyz/ds'
|
|
82
|
+
|
|
83
|
+
export const fill = true
|
|
84
|
+
export function Demo() {
|
|
85
|
+
return (
|
|
86
|
+
<Progress.Root value={null} {...styles.progress()}>
|
|
87
|
+
<Progress.Label>Indeterminate</Progress.Label>
|
|
88
|
+
<Progress.Track>
|
|
89
|
+
<Progress.Indicator />
|
|
90
|
+
</Progress.Track>
|
|
91
|
+
</Progress.Root>
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
namespace styles {
|
|
96
|
+
export const progress = style({ maxWidth: '24rem !custom' })
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Progress/Value.tsx)
|
|
101
|
+
|
|
102
|
+
## Anatomy
|
|
103
|
+
|
|
104
|
+
Import the component and assemble its parts.
|
|
105
|
+
|
|
106
|
+
```tsx
|
|
107
|
+
import { Progress } from '@tempoxyz/ds'
|
|
108
|
+
|
|
109
|
+
<Progress.Root>
|
|
110
|
+
<Progress.Label />
|
|
111
|
+
<Progress.Value />
|
|
112
|
+
<Progress.Track>
|
|
113
|
+
<Progress.Indicator />
|
|
114
|
+
</Progress.Track>
|
|
115
|
+
</Progress.Root>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Guidelines
|
|
119
|
+
|
|
120
|
+
### When to Use
|
|
121
|
+
|
|
122
|
+
* Report measurable work, such as an upload of a payouts CSV or an export of 1,240 transactions.
|
|
123
|
+
* Count through a batch, such as 3 of 5 payments in a payout run.
|
|
124
|
+
* Track a long sync with a known end, such as block indexing up to the current height.
|
|
125
|
+
* Show an indeterminate bar for a named task of unknown length, such as a bridge deposit confirmation.
|
|
126
|
+
|
|
127
|
+
### When Not to Use
|
|
128
|
+
|
|
129
|
+
* Use [Gauge](gauge.md) for a measurement that does not advance, such as storage used.
|
|
130
|
+
* Use [Spinner](spinner.md) for a short wait in a region or control.
|
|
131
|
+
* Use [Skeleton](skeleton.md) for content with a known shape.
|
|
132
|
+
* Use `loading` on a [Button](button.md) while its action runs.
|
|
133
|
+
* Use [Stepper](stepper.md) for a fixed sequence of steps, such as account setup.
|
|
134
|
+
|
|
135
|
+
### Show Determinate Progress When You Can Measure It
|
|
136
|
+
|
|
137
|
+
A rough count of steps is enough. Keep `value={null}` for work with no measurable end.
|
|
138
|
+
|
|
139
|
+
**Do:** Pass a `value` for an upload whose size you know.
|
|
140
|
+
|
|
141
|
+
```tsx
|
|
142
|
+
/**
|
|
143
|
+
* Do example for "Show Determinate Progress When You Can Measure It" on the Progress page.
|
|
144
|
+
* Pass a `value` for an upload whose size you know.
|
|
145
|
+
* @module
|
|
146
|
+
*/
|
|
147
|
+
import { Progress, style } from '@tempoxyz/ds'
|
|
148
|
+
|
|
149
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
150
|
+
export function Demo() {
|
|
151
|
+
return (
|
|
152
|
+
<Progress.Root value={60} {...styles.progress()}>
|
|
153
|
+
<Progress.Label>Uploading payouts.csv</Progress.Label>
|
|
154
|
+
<Progress.Value />
|
|
155
|
+
<Progress.Track>
|
|
156
|
+
<Progress.Indicator />
|
|
157
|
+
</Progress.Track>
|
|
158
|
+
</Progress.Root>
|
|
159
|
+
)
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
namespace styles {
|
|
163
|
+
export const progress = style({ maxWidth: '20rem !custom' })
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
**Don't:** Show an indeterminate bar for work you can measure.
|
|
168
|
+
|
|
169
|
+
```tsx
|
|
170
|
+
/**
|
|
171
|
+
* Don't example for "Show Determinate Progress When You Can Measure It" on the Progress page.
|
|
172
|
+
* Don't show an indeterminate bar for work you can measure.
|
|
173
|
+
* @module
|
|
174
|
+
*/
|
|
175
|
+
import { Progress, style } from '@tempoxyz/ds'
|
|
176
|
+
|
|
177
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
178
|
+
export function Demo() {
|
|
179
|
+
return (
|
|
180
|
+
<Progress.Root value={null} {...styles.progress()}>
|
|
181
|
+
<Progress.Label>Uploading payouts.csv</Progress.Label>
|
|
182
|
+
<Progress.Track>
|
|
183
|
+
<Progress.Indicator />
|
|
184
|
+
</Progress.Track>
|
|
185
|
+
</Progress.Root>
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
namespace styles {
|
|
190
|
+
export const progress = style({ maxWidth: '20rem !custom' })
|
|
191
|
+
}
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Name the Task
|
|
195
|
+
|
|
196
|
+
Add `Progress.Value` to print the percentage, or pass it a function child for units, such as 3 of 5 files. Without a visible label, pass `aria-label`.
|
|
197
|
+
|
|
198
|
+
**Do:** Put a `Progress.Label` in every bar.
|
|
199
|
+
|
|
200
|
+
```tsx
|
|
201
|
+
/** Do example for "Name the Task" on the Progress page: put a `Progress.Label` in every bar. @module */
|
|
202
|
+
import { Progress, style } from '@tempoxyz/ds'
|
|
203
|
+
|
|
204
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
205
|
+
export function Demo() {
|
|
206
|
+
return (
|
|
207
|
+
<Progress.Root value={60} {...styles.progress()}>
|
|
208
|
+
<Progress.Label>Exporting 1,240 transactions</Progress.Label>
|
|
209
|
+
<Progress.Value />
|
|
210
|
+
<Progress.Track>
|
|
211
|
+
<Progress.Indicator />
|
|
212
|
+
</Progress.Track>
|
|
213
|
+
</Progress.Root>
|
|
214
|
+
)
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
namespace styles {
|
|
218
|
+
export const progress = style({ maxWidth: '20rem !custom' })
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
**Don't:** Show a bar without a name for its task.
|
|
223
|
+
|
|
224
|
+
```tsx
|
|
225
|
+
/** Don't example for "Name the Task" on the Progress page. Don't show a bar without a name for its task. @module */
|
|
226
|
+
import { Progress, style } from '@tempoxyz/ds'
|
|
227
|
+
|
|
228
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
229
|
+
export function Demo() {
|
|
230
|
+
return (
|
|
231
|
+
<Progress.Root value={60} {...styles.progress()}>
|
|
232
|
+
<Progress.Value />
|
|
233
|
+
<Progress.Track>
|
|
234
|
+
<Progress.Indicator />
|
|
235
|
+
</Progress.Track>
|
|
236
|
+
</Progress.Root>
|
|
237
|
+
)
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
namespace styles {
|
|
241
|
+
export const progress = style({ maxWidth: '20rem !custom' })
|
|
242
|
+
}
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Move Forward Only
|
|
246
|
+
|
|
247
|
+
Use an indeterminate bar for a phase you cannot measure.
|
|
248
|
+
|
|
249
|
+
**Do:** If a task has phases, such as upload then verification, change the label for each.
|
|
250
|
+
|
|
251
|
+
```tsx
|
|
252
|
+
/**
|
|
253
|
+
* Do example for "Move Forward Only" on the Progress page.
|
|
254
|
+
* If a task has phases, such as upload then verification, change the label for each.
|
|
255
|
+
* @module
|
|
256
|
+
*/
|
|
257
|
+
import { Progress, style } from '@tempoxyz/ds'
|
|
258
|
+
|
|
259
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
260
|
+
export function Demo() {
|
|
261
|
+
return (
|
|
262
|
+
<div {...styles.steps()}>
|
|
263
|
+
<Progress.Root value={90} {...styles.progress()}>
|
|
264
|
+
<Progress.Label>Uploading payouts.csv</Progress.Label>
|
|
265
|
+
<Progress.Value />
|
|
266
|
+
<Progress.Track>
|
|
267
|
+
<Progress.Indicator />
|
|
268
|
+
</Progress.Track>
|
|
269
|
+
</Progress.Root>
|
|
270
|
+
<div {...styles.step()}>Then</div>
|
|
271
|
+
<Progress.Root value={10} {...styles.progress()}>
|
|
272
|
+
<Progress.Label>Verifying payments</Progress.Label>
|
|
273
|
+
<Progress.Value />
|
|
274
|
+
<Progress.Track>
|
|
275
|
+
<Progress.Indicator />
|
|
276
|
+
</Progress.Track>
|
|
277
|
+
</Progress.Root>
|
|
278
|
+
</div>
|
|
279
|
+
)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
namespace styles {
|
|
283
|
+
export const progress = style({ maxWidth: '20rem !custom' })
|
|
284
|
+
|
|
285
|
+
export const step = style({ color: 'content.secondary', typography: 'body.b3' })
|
|
286
|
+
|
|
287
|
+
export const steps = style({
|
|
288
|
+
display: 'flex',
|
|
289
|
+
flexDirection: 'column',
|
|
290
|
+
gap: '12',
|
|
291
|
+
width: '100% !custom',
|
|
292
|
+
})
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
**Don't:** Let the value decrease or restart at 0 under the same label.
|
|
297
|
+
|
|
298
|
+
```tsx
|
|
299
|
+
/**
|
|
300
|
+
* Don't example for "Move Forward Only" on the Progress page.
|
|
301
|
+
* Don't let the value decrease or restart at 0 under the same label.
|
|
302
|
+
* @module
|
|
303
|
+
*/
|
|
304
|
+
import { Progress, style } from '@tempoxyz/ds'
|
|
305
|
+
|
|
306
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
307
|
+
export function Demo() {
|
|
308
|
+
return (
|
|
309
|
+
<div {...styles.steps()}>
|
|
310
|
+
<Progress.Root value={90} {...styles.progress()}>
|
|
311
|
+
<Progress.Label>Uploading payouts.csv</Progress.Label>
|
|
312
|
+
<Progress.Value />
|
|
313
|
+
<Progress.Track>
|
|
314
|
+
<Progress.Indicator />
|
|
315
|
+
</Progress.Track>
|
|
316
|
+
</Progress.Root>
|
|
317
|
+
<div {...styles.step()}>Then</div>
|
|
318
|
+
<Progress.Root value={10} {...styles.progress()}>
|
|
319
|
+
<Progress.Label>Uploading payouts.csv</Progress.Label>
|
|
320
|
+
<Progress.Value />
|
|
321
|
+
<Progress.Track>
|
|
322
|
+
<Progress.Indicator />
|
|
323
|
+
</Progress.Track>
|
|
324
|
+
</Progress.Root>
|
|
325
|
+
</div>
|
|
326
|
+
)
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
namespace styles {
|
|
330
|
+
export const progress = style({ maxWidth: '20rem !custom' })
|
|
331
|
+
|
|
332
|
+
export const step = style({ color: 'content.secondary', typography: 'body.b3' })
|
|
333
|
+
|
|
334
|
+
export const steps = style({
|
|
335
|
+
display: 'flex',
|
|
336
|
+
flexDirection: 'column',
|
|
337
|
+
gap: '12',
|
|
338
|
+
width: '100% !custom',
|
|
339
|
+
})
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Report the Outcome
|
|
344
|
+
|
|
345
|
+
* **Success (positive):** Set `intent` to `positive` and change the label. Then replace the bar with the result, such as a link to the file.
|
|
346
|
+
* **Failure (Alert):** Progress has no `negative` intent. Replace the bar with a `negative` [Alert](alert.md) that offers Retry.
|
|
347
|
+
|
|
348
|
+
## Content
|
|
349
|
+
|
|
350
|
+
* **Label:** A verb ending in -ing and its object, such as Uploading payouts.csv.
|
|
351
|
+
* **Units:** If a percentage hides the size of the job, count files, payments, or blocks.
|
|
352
|
+
* **Time estimate:** Add one only when it is reliable, and round it, such as About 2 minutes left.
|
|
353
|
+
|
|
354
|
+
## Accessibility
|
|
355
|
+
|
|
356
|
+
The bar is not a live region. A changed value is read only when the reader returns to it.
|
|
357
|
+
|
|
358
|
+
### Semantics
|
|
359
|
+
|
|
360
|
+
* **Progress.Root (progressbar):** Reports its range and value to assistive technology.
|
|
361
|
+
* **Value Text (aria-valuetext):** Defaults to a locale percentage, such as "60%". `format` and `getAriaValueText` change it.
|
|
362
|
+
* **Progress.Label (aria-labelledby):** Names the bar.
|
|
363
|
+
* **Progress.Value (aria-hidden):** Screen readers skip it and read the value text once.
|
|
364
|
+
* **Indeterminate Bars (value={null}):** Reports no current value. Under reduced motion, the sliding segment becomes a dimmed full bar.
|
|
365
|
+
|
|
366
|
+
### Your Responsibilities
|
|
367
|
+
|
|
368
|
+
* **Describe Units (getAriaValueText):** Use it for a value with units, such as "3 of 5 files".
|
|
369
|
+
* **Announce Completion (SC 4.1.3):** Announce the result, such as "Upload complete", in a status message or toast.
|
|
370
|
+
* **Keep Label and Value Visible (4px):** The track is thin. The label and value carry the information for anyone who cannot see the fill.
|
|
371
|
+
|
|
372
|
+
## Related
|
|
373
|
+
|
|
374
|
+
[Gauge](gauge.md)
|
|
375
|
+
|
|
376
|
+
Use for a measurement within a range.
|
|
377
|
+
|
|
378
|
+
[Spinner](spinner.md)
|
|
379
|
+
|
|
380
|
+
Use for a short wait of unknown length.
|
|
381
|
+
|
|
382
|
+
[Skeleton](skeleton.md)
|
|
383
|
+
|
|
384
|
+
Use for content with a known shape.
|
|
385
|
+
|
|
386
|
+
[Loading](../patterns/loading.md)
|
|
387
|
+
|
|
388
|
+
Covers choosing a loading indicator.
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
# Qr
|
|
2
|
+
|
|
3
|
+
Renders a value as a QR code.
|
|
4
|
+
|
|
5
|
+
[View source and API](https://github.com/tempoxyz/ds/blob/main/src/web/components/Qr.tsx)
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
Qr renders a value as a QR code in the foreground color on a transparent ground.
|
|
10
|
+
|
|
11
|
+
## Examples
|
|
12
|
+
|
|
13
|
+
### Basic
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import { Qr } from '@tempoxyz/ds'
|
|
17
|
+
|
|
18
|
+
export function Demo() {
|
|
19
|
+
return <Qr value="tempo:0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" />
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Qr/Basic.tsx)
|
|
24
|
+
|
|
25
|
+
### Size
|
|
26
|
+
|
|
27
|
+
Set `size` to `small`, `medium` (default), or `large`.
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
import { Qr, style } from '@tempoxyz/ds'
|
|
31
|
+
|
|
32
|
+
export function Demo() {
|
|
33
|
+
return (
|
|
34
|
+
<div {...styles.row()}>
|
|
35
|
+
{(['small', 'medium', 'large'] as const).map((size) => (
|
|
36
|
+
<Qr key={size} size={size} value="tempo:0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" />
|
|
37
|
+
))}
|
|
38
|
+
</div>
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
namespace styles {
|
|
43
|
+
export const row = style({ alignItems: 'start', display: 'flex', flexWrap: 'wrap', gap: '16' })
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Qr/Size.tsx)
|
|
48
|
+
|
|
49
|
+
### Arena
|
|
50
|
+
|
|
51
|
+
Pass an image URL to `arena` to draw a logo in the center.
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
import { Qr } from '@tempoxyz/ds'
|
|
55
|
+
import pathUsd from '../../coins/PathUSD.svg'
|
|
56
|
+
|
|
57
|
+
export function Demo() {
|
|
58
|
+
return <Qr arena={pathUsd} value="https://example.org" />
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Qr/Arena.tsx)
|
|
63
|
+
|
|
64
|
+
## Anatomy
|
|
65
|
+
|
|
66
|
+
Import the component and assemble its parts.
|
|
67
|
+
|
|
68
|
+
```tsx
|
|
69
|
+
import { Qr } from '@tempoxyz/ds'
|
|
70
|
+
|
|
71
|
+
<Qr />
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Guidelines
|
|
75
|
+
|
|
76
|
+
### When to Use
|
|
77
|
+
|
|
78
|
+
* Show a deposit address in a receive flow, for a scan from another wallet.
|
|
79
|
+
* Move a link from a computer to a phone, such as a payment request.
|
|
80
|
+
|
|
81
|
+
### When Not to Use
|
|
82
|
+
|
|
83
|
+
* Use a link or `Button.Link` ([Button](button.md)) for a URL opened on the same device.
|
|
84
|
+
* Use [Hex](hex.md) with `copy` alone when the reader needs the value on the same device. A phone cannot scan its own screen.
|
|
85
|
+
|
|
86
|
+
### Show the Address as Text Too
|
|
87
|
+
|
|
88
|
+
Many people cannot scan: someone on the same phone, a screen reader user, or someone without a camera.
|
|
89
|
+
|
|
90
|
+
* **Copy:** Put the address beside the code with [Hex](hex.md) and `copy`.
|
|
91
|
+
* **Match:** The text must match what the code encodes. If the code holds a URI, such as `tempo:` and the address, show the same address. Never encode a different value, such as a tracking link.
|
|
92
|
+
* **Network:** A code does not show its network. State what the address accepts, such as Send USDC on Tempo to this address.
|
|
93
|
+
|
|
94
|
+
**Do:** Show the address with a copy button, and the network it accepts, beside the code.
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
/**
|
|
98
|
+
* Do example for "Show the Address as Text Too" on the Qr page.
|
|
99
|
+
* Show the address with a copy button, and the network it accepts, beside the code.
|
|
100
|
+
* @module
|
|
101
|
+
*/
|
|
102
|
+
import { Hex, Qr, style } from '@tempoxyz/ds'
|
|
103
|
+
|
|
104
|
+
const address = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'
|
|
105
|
+
|
|
106
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
107
|
+
export function Demo() {
|
|
108
|
+
return (
|
|
109
|
+
<div {...styles.stack()}>
|
|
110
|
+
<Qr aria-label="Deposit address QR code" size="small" value={address} />
|
|
111
|
+
<span {...styles.note()}>Send USDC on Tempo to this address</span>
|
|
112
|
+
<Hex copy size="small" value={address} variant="filled" {...styles.hex()} />
|
|
113
|
+
</div>
|
|
114
|
+
)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
namespace styles {
|
|
118
|
+
export const hex = style({ width: '100% !custom' })
|
|
119
|
+
|
|
120
|
+
export const note = style({
|
|
121
|
+
color: 'content.secondary',
|
|
122
|
+
textAlign: 'center',
|
|
123
|
+
typography: 'body.b3',
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
export const stack = style({
|
|
127
|
+
display: 'grid',
|
|
128
|
+
gap: '12',
|
|
129
|
+
justifyItems: 'center',
|
|
130
|
+
width: '100% !custom',
|
|
131
|
+
})
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Don't:** Show a code without the value it encodes.
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
/**
|
|
139
|
+
* Don't example for "Show the Address as Text Too" on the Qr page.
|
|
140
|
+
* Don't show a code without the value it encodes.
|
|
141
|
+
* @module
|
|
142
|
+
*/
|
|
143
|
+
import { Qr } from '@tempoxyz/ds'
|
|
144
|
+
|
|
145
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
146
|
+
export function Demo() {
|
|
147
|
+
return <Qr size="small" value="0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045" />
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Keep Contrast and Clear Space
|
|
152
|
+
|
|
153
|
+
* **Dark mode:** The modules turn light on a dark ground, and some scanners cannot read inverted codes. If older scanners matter, use a light panel and set `color` to a dark value with 3:1 contrast in both schemes.
|
|
154
|
+
* **Clear space:** Keep borders, text, and controls off the edges of the code.
|
|
155
|
+
|
|
156
|
+
**Do:** Place the code on a plain background with space around it.
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
/**
|
|
160
|
+
* Do example for "Keep Contrast and Clear Space" on the Qr page.
|
|
161
|
+
* Place the code on a plain background with space around it.
|
|
162
|
+
* @module
|
|
163
|
+
*/
|
|
164
|
+
import { Qr, style } from '@tempoxyz/ds'
|
|
165
|
+
|
|
166
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
167
|
+
export function Demo() {
|
|
168
|
+
return (
|
|
169
|
+
<div {...styles.panel()}>
|
|
170
|
+
<Qr
|
|
171
|
+
aria-label="Deposit address QR code"
|
|
172
|
+
size="small"
|
|
173
|
+
value="0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
|
|
174
|
+
/>
|
|
175
|
+
</div>
|
|
176
|
+
)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
namespace styles {
|
|
180
|
+
export const panel = style({
|
|
181
|
+
backgroundColor: 'background.primary',
|
|
182
|
+
borderRadius: 'sm',
|
|
183
|
+
padding: '24',
|
|
184
|
+
})
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
**Don't:** Place the code over an image or gradient.
|
|
189
|
+
|
|
190
|
+
```tsx
|
|
191
|
+
/**
|
|
192
|
+
* Don't example for "Keep Contrast and Clear Space" on the Qr page.
|
|
193
|
+
* Don't place the code over an image or gradient.
|
|
194
|
+
* @module
|
|
195
|
+
*/
|
|
196
|
+
import { Qr, style } from '@tempoxyz/ds'
|
|
197
|
+
|
|
198
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
199
|
+
export function Demo() {
|
|
200
|
+
return (
|
|
201
|
+
<div {...styles.panel()}>
|
|
202
|
+
<Qr
|
|
203
|
+
aria-label="Deposit address QR code"
|
|
204
|
+
size="small"
|
|
205
|
+
value="0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
|
|
206
|
+
/>
|
|
207
|
+
</div>
|
|
208
|
+
)
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
namespace styles {
|
|
212
|
+
export const panel = style({
|
|
213
|
+
backgroundImage: 'linear-gradient(135deg, #3b82f6, #a855f7 50%, #f97316) !custom',
|
|
214
|
+
borderRadius: 'sm',
|
|
215
|
+
padding: '4',
|
|
216
|
+
})
|
|
217
|
+
}
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Use a Logo Only at Larger Sizes
|
|
221
|
+
|
|
222
|
+
`arena` draws a logo in the center and raises error correction to medium, so scanners recover the covered modules. Use the token's logo or Tempo's.
|
|
223
|
+
|
|
224
|
+
**Do:** Add a logo only to a `medium` or `large` code.
|
|
225
|
+
|
|
226
|
+
```tsx
|
|
227
|
+
/**
|
|
228
|
+
* Do example for "Use a Logo Only at Larger Sizes" on the Qr page.
|
|
229
|
+
* Add a logo only to a `medium` or `large` code.
|
|
230
|
+
* @module
|
|
231
|
+
*/
|
|
232
|
+
import { Qr } from '@tempoxyz/ds'
|
|
233
|
+
import pathUsd from '../../coins/PathUSD.svg'
|
|
234
|
+
|
|
235
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
236
|
+
export function Demo() {
|
|
237
|
+
return (
|
|
238
|
+
<Qr
|
|
239
|
+
arena={pathUsd}
|
|
240
|
+
aria-label="Deposit address QR code"
|
|
241
|
+
size="medium"
|
|
242
|
+
value="0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
|
|
243
|
+
/>
|
|
244
|
+
)
|
|
245
|
+
}
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
**Don't:** Add a logo to a `small` code.
|
|
249
|
+
|
|
250
|
+
```tsx
|
|
251
|
+
/**
|
|
252
|
+
* Don't example for "Use a Logo Only at Larger Sizes" on the Qr page.
|
|
253
|
+
* Don't add a logo to a `small` code.
|
|
254
|
+
* @module
|
|
255
|
+
*/
|
|
256
|
+
import { Qr } from '@tempoxyz/ds'
|
|
257
|
+
import pathUsd from '../../coins/PathUSD.svg'
|
|
258
|
+
|
|
259
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
260
|
+
export function Demo() {
|
|
261
|
+
return (
|
|
262
|
+
<Qr
|
|
263
|
+
arena={pathUsd}
|
|
264
|
+
aria-label="Deposit address QR code"
|
|
265
|
+
size="small"
|
|
266
|
+
value="0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"
|
|
267
|
+
/>
|
|
268
|
+
)
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Size for the Screen
|
|
273
|
+
|
|
274
|
+
* **Small (160px):** In a panel beside other content.
|
|
275
|
+
* **Medium (240px):** The default, for a receive dialog.
|
|
276
|
+
* **Large (320px):** The roomiest size, for a code with a logo.
|
|
277
|
+
|
|
278
|
+
## Accessibility
|
|
279
|
+
|
|
280
|
+
Qr renders an `<svg>` with the `img` role. It is not interactive and takes no focus.
|
|
281
|
+
|
|
282
|
+
### Semantics
|
|
283
|
+
|
|
284
|
+
* **Root (img):** An image that screen readers announce by its name.
|
|
285
|
+
* **Name (aria-label):** Defaults to "QR code for" and the full value.
|
|
286
|
+
* **Arena (Arena):** Set `arena` to an image URL to add a logo, announced as a nested image.
|
|
287
|
+
* **Modules (foreground):** On a transparent ground, so the code follows the light or dark scheme.
|
|
288
|
+
|
|
289
|
+
### Your Responsibilities
|
|
290
|
+
|
|
291
|
+
* **Name It by Purpose (aria-label):** Describe what it encodes, such as "Deposit address QR code".
|
|
292
|
+
* **Name the Logo (arena):** Pass a node with its own accessible name, or make sure the logo's name adds no noise.
|
|
293
|
+
|
|
294
|
+
## Related
|
|
295
|
+
|
|
296
|
+
[Hex](hex.md)
|
|
297
|
+
|
|
298
|
+
Use for showing and copying the address.
|
|
299
|
+
|
|
300
|
+
[CopyButton](copy-button.md)
|
|
301
|
+
|
|
302
|
+
Use for copying a value.
|
|
303
|
+
|
|
304
|
+
[Snippet](snippet.md)
|
|
305
|
+
|
|
306
|
+
Use for links and other values.
|
|
307
|
+
|
|
308
|
+
[Payments](../patterns/payments.md)
|
|
309
|
+
|
|
310
|
+
Covers send and receive flows.
|
|
311
|
+
|
|
312
|
+
[Tempo Wallet](../products/tempo-wallet.md)
|
|
313
|
+
|
|
314
|
+
Covers the receive screen.
|