@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,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](/docs/components/gauge) for a measurement that does not advance, such as storage used.
130
+ * Use [Spinner](/docs/components/spinner) for a short wait in a region or control.
131
+ * Use [Skeleton](/docs/components/skeleton) for content with a known shape.
132
+ * Use `loading` on a [Button](/docs/components/button) while its action runs.
133
+ * Use [Stepper](/docs/components/stepper) 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](/docs/components/alert) 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](/docs/components/gauge)
375
+
376
+ Use for a measurement within a range.
377
+
378
+ [Spinner](/docs/components/spinner)
379
+
380
+ Use for a short wait of unknown length.
381
+
382
+ [Skeleton](/docs/components/skeleton)
383
+
384
+ Use for content with a known shape.
385
+
386
+ [Loading](/docs/patterns/loading)
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](/docs/components/button)) for a URL opened on the same device.
84
+ * Use [Hex](/docs/components/hex) 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](/docs/components/hex) 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](/docs/components/hex)
297
+
298
+ Use for showing and copying the address.
299
+
300
+ [CopyButton](/docs/components/copy-button)
301
+
302
+ Use for copying a value.
303
+
304
+ [Snippet](/docs/components/snippet)
305
+
306
+ Use for links and other values.
307
+
308
+ [Payments](/docs/patterns/payments)
309
+
310
+ Covers send and receive flows.
311
+
312
+ [Tempo Wallet](/docs/products/tempo-wallet)
313
+
314
+ Covers the receive screen.