@tempoxyz/ds 0.3.10 → 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 (120) 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/package.json +1 -1
@@ -0,0 +1,398 @@
1
+ # Fieldset
2
+
3
+ Groups related fields under a shared legend.
4
+
5
+ [View source and API](https://github.com/tempoxyz/ds/blob/main/src/web/components/Fieldset.tsx)
6
+
7
+ ## Overview
8
+
9
+ A fieldset groups related fields under a legend in a native `<fieldset>`.
10
+
11
+ ## Examples
12
+
13
+ ### Basic
14
+
15
+ ```tsx
16
+ import { Field, Fieldset, style, TextInput } from '@tempoxyz/ds'
17
+
18
+ export function Demo() {
19
+ return (
20
+ <Fieldset.Root {...styles.group()}>
21
+ <Fieldset.Legend>Legal name</Fieldset.Legend>
22
+ <Name label="First name" />
23
+ <Name label="Last name" />
24
+ </Fieldset.Root>
25
+ )
26
+ }
27
+
28
+ function Name(props: { label: string }) {
29
+ return (
30
+ <Field.Root>
31
+ <Field.Label>{props.label}</Field.Label>
32
+ <TextInput.Group>
33
+ <TextInput.Control />
34
+ </TextInput.Group>
35
+ </Field.Root>
36
+ )
37
+ }
38
+
39
+ namespace styles {
40
+ export const group = style({ maxWidth: '100% !custom', width: '320px !custom' })
41
+ }
42
+ ```
43
+
44
+ [View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Fieldset/Basic.tsx)
45
+
46
+ ### Disabled
47
+
48
+ Set `disabled` to disable every control in the group.
49
+
50
+ ```tsx
51
+ import { Field, Fieldset, style, TextInput } from '@tempoxyz/ds'
52
+
53
+ export function Demo() {
54
+ return (
55
+ <Fieldset.Root disabled {...styles.group()}>
56
+ <Fieldset.Legend>Legal name</Fieldset.Legend>
57
+ <Field.Root>
58
+ <Field.Label>First name</Field.Label>
59
+ <TextInput.Group>
60
+ <TextInput.Control />
61
+ </TextInput.Group>
62
+ </Field.Root>
63
+ <Field.Root>
64
+ <Field.Label>Last name</Field.Label>
65
+ <TextInput.Group>
66
+ <TextInput.Control />
67
+ </TextInput.Group>
68
+ </Field.Root>
69
+ </Fieldset.Root>
70
+ )
71
+ }
72
+
73
+ namespace styles {
74
+ export const group = style({ maxWidth: '100% !custom', width: '320px !custom' })
75
+ }
76
+ ```
77
+
78
+ [View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Fieldset/Disabled.tsx)
79
+
80
+ ## Anatomy
81
+
82
+ Import the component and assemble its parts.
83
+
84
+ ```tsx
85
+ import { Field, Fieldset } from '@tempoxyz/ds'
86
+
87
+ <Fieldset.Root>
88
+ <Fieldset.Legend />
89
+ <Field.Root />
90
+ </Fieldset.Root>
91
+ ```
92
+
93
+ ## Guidelines
94
+
95
+ ### When to Use
96
+
97
+ * Group fields that describe one thing, such as an address.
98
+ * Name a set of radios or checkboxes with one question.
99
+
100
+ ### When Not to Use
101
+
102
+ * Use [Field](/docs/components/field) alone for a single control. A fieldset around one field repeats its label.
103
+ * Use a heading for a page section with no form controls.
104
+ * Use [Stepper](/docs/components/stepper) to split a long form into steps, not many fieldsets on one screen.
105
+
106
+ ### Write the Legend as the Group's Topic
107
+
108
+ * **Radio group:** Write a question that ends with a question mark, such as How often should we pay you?
109
+ * **Set of fields:** Write a noun without a colon, such as Billing address.
110
+
111
+ Keep each field's own `Field.Label`, and don't repeat the legend in it.
112
+
113
+ **Do:** Name the group in the legend and each value in its label.
114
+
115
+ ```tsx
116
+ /**
117
+ * Do example for "Write the Legend as the Group's Topic" on the Fieldset page.
118
+ * Name the group in the legend and each value in its label.
119
+ * @module
120
+ */
121
+ import { Field, Fieldset, style, TextInput } from '@tempoxyz/ds'
122
+
123
+ /** Renders the static preview, which the guideline card shows inert. */
124
+ export function Demo() {
125
+ return (
126
+ <Fieldset.Root {...styles.group()}>
127
+ <Fieldset.Legend>Billing address</Fieldset.Legend>
128
+ <Field.Root>
129
+ <Field.Label>Street</Field.Label>
130
+ <TextInput.Group>
131
+ <TextInput.Control defaultValue="350 Mission St" />
132
+ </TextInput.Group>
133
+ </Field.Root>
134
+ <Field.Root>
135
+ <Field.Label>City</Field.Label>
136
+ <TextInput.Group>
137
+ <TextInput.Control defaultValue="San Francisco" />
138
+ </TextInput.Group>
139
+ </Field.Root>
140
+ </Fieldset.Root>
141
+ )
142
+ }
143
+
144
+ namespace styles {
145
+ export const group = style({ maxWidth: '320px !custom', rowGap: '12', width: '100% !custom' })
146
+ }
147
+ ```
148
+
149
+ **Don't:** Repeat the legend in every field label.
150
+
151
+ ```tsx
152
+ /**
153
+ * Don't example for "Write the Legend as the Group's Topic" on the Fieldset page.
154
+ * Don't repeat the legend in every field label.
155
+ * @module
156
+ */
157
+ import { Field, Fieldset, style, TextInput } from '@tempoxyz/ds'
158
+
159
+ /** Renders the static preview, which the guideline card shows inert. */
160
+ export function Demo() {
161
+ return (
162
+ <Fieldset.Root {...styles.group()}>
163
+ <Fieldset.Legend>Billing address</Fieldset.Legend>
164
+ <Field.Root>
165
+ <Field.Label>Billing address street</Field.Label>
166
+ <TextInput.Group>
167
+ <TextInput.Control defaultValue="350 Mission St" />
168
+ </TextInput.Group>
169
+ </Field.Root>
170
+ <Field.Root>
171
+ <Field.Label>Billing address city</Field.Label>
172
+ <TextInput.Group>
173
+ <TextInput.Control defaultValue="San Francisco" />
174
+ </TextInput.Group>
175
+ </Field.Root>
176
+ </Fieldset.Root>
177
+ )
178
+ }
179
+
180
+ namespace styles {
181
+ export const group = style({ maxWidth: '320px !custom', rowGap: '12', width: '100% !custom' })
182
+ }
183
+ ```
184
+
185
+ ### Disable the Group, Not Each Field
186
+
187
+ Set `disabled` on `Fieldset.Root` to disable every control inside. State the reason above the group, such as Billing details are locked while a payment is pending.
188
+
189
+ **Do:** Disable the fieldset and say why above it.
190
+
191
+ ```tsx
192
+ /**
193
+ * Do example for "Disable the Group, Not Each Field" on the Fieldset page.
194
+ * Disable the fieldset and say why above it.
195
+ * @module
196
+ */
197
+ import { Field, Fieldset, style, TextInput } from '@tempoxyz/ds'
198
+
199
+ /** Renders the static preview, which the guideline card shows inert. */
200
+ export function Demo() {
201
+ return (
202
+ <div {...styles.stack()}>
203
+ <p {...styles.reason()}>Billing details are locked while a payment is pending.</p>
204
+ <Fieldset.Root disabled {...styles.group()}>
205
+ <Fieldset.Legend>Billing address</Fieldset.Legend>
206
+ <Field.Root>
207
+ <Field.Label>Street</Field.Label>
208
+ <TextInput.Group>
209
+ <TextInput.Control defaultValue="350 Mission St" />
210
+ </TextInput.Group>
211
+ </Field.Root>
212
+ <Field.Root>
213
+ <Field.Label>City</Field.Label>
214
+ <TextInput.Group>
215
+ <TextInput.Control defaultValue="San Francisco" />
216
+ </TextInput.Group>
217
+ </Field.Root>
218
+ </Fieldset.Root>
219
+ </div>
220
+ )
221
+ }
222
+
223
+ namespace styles {
224
+ export const group = style({ rowGap: '12', width: '100% !custom' })
225
+
226
+ export const reason = style({ color: 'content.secondary', margin: '0', typography: 'body.b2' })
227
+
228
+ export const stack = style({
229
+ display: 'grid',
230
+ gap: '16',
231
+ maxWidth: '320px !custom',
232
+ width: '100% !custom',
233
+ })
234
+ }
235
+ ```
236
+
237
+ **Don't:** Disable a group without a reason.
238
+
239
+ ```tsx
240
+ /**
241
+ * Don't example for "Disable the Group, Not Each Field" on the Fieldset page.
242
+ * Don't disable a group without a reason.
243
+ * @module
244
+ */
245
+ import { Field, Fieldset, style, TextInput } from '@tempoxyz/ds'
246
+
247
+ /** Renders the static preview, which the guideline card shows inert. */
248
+ export function Demo() {
249
+ return (
250
+ <Fieldset.Root disabled {...styles.group()}>
251
+ <Fieldset.Legend>Billing address</Fieldset.Legend>
252
+ <Field.Root>
253
+ <Field.Label>Street</Field.Label>
254
+ <TextInput.Group>
255
+ <TextInput.Control defaultValue="350 Mission St" />
256
+ </TextInput.Group>
257
+ </Field.Root>
258
+ <Field.Root>
259
+ <Field.Label>City</Field.Label>
260
+ <TextInput.Group>
261
+ <TextInput.Control defaultValue="San Francisco" />
262
+ </TextInput.Group>
263
+ </Field.Root>
264
+ </Fieldset.Root>
265
+ )
266
+ }
267
+
268
+ namespace styles {
269
+ export const group = style({ maxWidth: '320px !custom', rowGap: '12', width: '100% !custom' })
270
+ }
271
+ ```
272
+
273
+ ### Keep Groups Flat and Short
274
+
275
+ Screen readers announce every legend of nested fieldsets as focus moves in. Put groups one after another, each with its own legend. If a group grows past five or six fields, split it under a second legend.
276
+
277
+ **Do:** Place short groups one after another.
278
+
279
+ ```tsx
280
+ /**
281
+ * Do example for "Keep Groups Flat and Short" on the Fieldset page.
282
+ * Place short groups one after another.
283
+ * @module
284
+ */
285
+ import { Field, Fieldset, style, TextInput } from '@tempoxyz/ds'
286
+
287
+ /** Renders the static preview, which the guideline card shows inert. */
288
+ export function Demo() {
289
+ return (
290
+ <div {...styles.form()}>
291
+ <Fieldset.Root {...styles.group()}>
292
+ <Fieldset.Legend>Destination</Fieldset.Legend>
293
+ <Field.Root>
294
+ <Field.Label>Address</Field.Label>
295
+ <TextInput.Group>
296
+ <TextInput.Control defaultValue="0x8f3a…12c4" />
297
+ </TextInput.Group>
298
+ </Field.Root>
299
+ </Fieldset.Root>
300
+ <Fieldset.Root {...styles.group()}>
301
+ <Fieldset.Legend>Payment</Fieldset.Legend>
302
+ <Field.Root>
303
+ <Field.Label>Memo</Field.Label>
304
+ <TextInput.Group>
305
+ <TextInput.Control defaultValue="Rent for May" />
306
+ </TextInput.Group>
307
+ </Field.Root>
308
+ </Fieldset.Root>
309
+ </div>
310
+ )
311
+ }
312
+
313
+ namespace styles {
314
+ export const form = style({
315
+ display: 'grid',
316
+ gap: '24',
317
+ maxWidth: '320px !custom',
318
+ width: '100% !custom',
319
+ })
320
+
321
+ export const group = style({ rowGap: '12' })
322
+ }
323
+ ```
324
+
325
+ **Don't:** Nest one fieldset inside another.
326
+
327
+ ```tsx
328
+ /**
329
+ * Don't example for "Keep Groups Flat and Short" on the Fieldset page.
330
+ * Don't nest one fieldset inside another.
331
+ * @module
332
+ */
333
+ import { Field, Fieldset, style, TextInput } from '@tempoxyz/ds'
334
+
335
+ /** Renders the static preview, which the guideline card shows inert. */
336
+ export function Demo() {
337
+ return (
338
+ <Fieldset.Root {...styles.outer()}>
339
+ <Fieldset.Legend>Destination</Fieldset.Legend>
340
+ <Field.Root>
341
+ <Field.Label>Address</Field.Label>
342
+ <TextInput.Group>
343
+ <TextInput.Control defaultValue="0x8f3a…12c4" />
344
+ </TextInput.Group>
345
+ </Field.Root>
346
+ <Fieldset.Root {...styles.group()}>
347
+ <Fieldset.Legend>Payment</Fieldset.Legend>
348
+ <Field.Root>
349
+ <Field.Label>Memo</Field.Label>
350
+ <TextInput.Group>
351
+ <TextInput.Control defaultValue="Rent for May" />
352
+ </TextInput.Group>
353
+ </Field.Root>
354
+ </Fieldset.Root>
355
+ </Fieldset.Root>
356
+ )
357
+ }
358
+
359
+ namespace styles {
360
+ export const group = style({ rowGap: '12' })
361
+
362
+ export const outer = style({ maxWidth: '320px !custom', rowGap: '12', width: '100% !custom' })
363
+ }
364
+ ```
365
+
366
+ ## Accessibility
367
+
368
+ A fieldset renders a native `<fieldset>` named by its legend. Screen readers read the legend before the controls.
369
+
370
+ ### Semantics
371
+
372
+ * **Fieldset.Root (group):** A native fieldset with one name for related controls.
373
+ * **Fieldset.Legend (aria-labelledby):** Names the fieldset, as a div, not a native legend.
374
+ * **Disabled (disabled):** Disables every control inside and dims the labels.
375
+
376
+ ### Your Responsibilities
377
+
378
+ * **Include a Legend (Fieldset.Legend):** Include a legend. Without one, the group has no accessible name.
379
+ * **Group Related Controls:** Group only related controls, such as radios or an address.
380
+ * **Render a Heading When Needed (render):** The legend is not a heading. If the group starts a section, render an `h2`.
381
+
382
+ ## Related
383
+
384
+ [Field](/docs/components/field)
385
+
386
+ Use for labelling a single control.
387
+
388
+ [RadioGroup](/docs/components/radio-group)
389
+
390
+ Use for one choice from a group.
391
+
392
+ [CheckboxGroup](/docs/components/checkbox-group)
393
+
394
+ Use for several choices from a group.
395
+
396
+ [Forms](/docs/patterns/forms)
397
+
398
+ Covers laying out groups of fields.