@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,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](field.md) 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](stepper.md) 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](field.md)
|
|
385
|
+
|
|
386
|
+
Use for labelling a single control.
|
|
387
|
+
|
|
388
|
+
[RadioGroup](radio-group.md)
|
|
389
|
+
|
|
390
|
+
Use for one choice from a group.
|
|
391
|
+
|
|
392
|
+
[CheckboxGroup](checkbox-group.md)
|
|
393
|
+
|
|
394
|
+
Use for several choices from a group.
|
|
395
|
+
|
|
396
|
+
[Forms](../patterns/forms.md)
|
|
397
|
+
|
|
398
|
+
Covers laying out groups of fields.
|