@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,352 @@
|
|
|
1
|
+
# Textarea
|
|
2
|
+
|
|
3
|
+
A multi-line text field.
|
|
4
|
+
|
|
5
|
+
[View source and API](https://github.com/tempoxyz/ds/blob/main/src/web/components/Textarea.tsx)
|
|
6
|
+
|
|
7
|
+
## Overview
|
|
8
|
+
|
|
9
|
+
A textarea is a native `<textarea>` registered as the control of its enclosing field. Set `rows` to the expected length of the answer.
|
|
10
|
+
|
|
11
|
+
## Examples
|
|
12
|
+
|
|
13
|
+
### Basic
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import { Field, style, Textarea } from '@tempoxyz/ds'
|
|
17
|
+
|
|
18
|
+
export function Demo() {
|
|
19
|
+
return (
|
|
20
|
+
<div {...styles.grid()}>
|
|
21
|
+
<Field.Root>
|
|
22
|
+
<Field.Label>Notes</Field.Label>
|
|
23
|
+
<Textarea placeholder="Add a note" />
|
|
24
|
+
</Field.Root>
|
|
25
|
+
</div>
|
|
26
|
+
)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
namespace styles {
|
|
30
|
+
export const grid = style({
|
|
31
|
+
alignItems: 'start',
|
|
32
|
+
display: 'grid',
|
|
33
|
+
gap: '24',
|
|
34
|
+
gridTemplateColumns: 'repeat(auto-fill, minmax(min(280px, 100%), 1fr)) !custom',
|
|
35
|
+
})
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Textarea/Basic.tsx)
|
|
40
|
+
|
|
41
|
+
### Variant
|
|
42
|
+
|
|
43
|
+
Set `variant` to `default` (default) or `outlined`, which draws a 1px line instead of the fill.
|
|
44
|
+
|
|
45
|
+
```tsx
|
|
46
|
+
import { Field, style, Textarea } from '@tempoxyz/ds'
|
|
47
|
+
|
|
48
|
+
export function Demo() {
|
|
49
|
+
return (
|
|
50
|
+
<div {...styles.grid()}>
|
|
51
|
+
<Field.Root>
|
|
52
|
+
<Field.Label>Notes</Field.Label>
|
|
53
|
+
<Textarea defaultValue="Paid in full" />
|
|
54
|
+
</Field.Root>
|
|
55
|
+
<Field.Root>
|
|
56
|
+
<Field.Label>Memo</Field.Label>
|
|
57
|
+
<Textarea defaultValue="Rent for May" variant="outlined" />
|
|
58
|
+
</Field.Root>
|
|
59
|
+
</div>
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
namespace styles {
|
|
64
|
+
export const grid = style({
|
|
65
|
+
alignItems: 'start',
|
|
66
|
+
display: 'grid',
|
|
67
|
+
gap: '24',
|
|
68
|
+
gridTemplateColumns: 'repeat(auto-fill, minmax(min(280px, 100%), 1fr)) !custom',
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Textarea/Variant.tsx)
|
|
74
|
+
|
|
75
|
+
### Resize
|
|
76
|
+
|
|
77
|
+
Set `resize` to `vertical` (default), `none`, or `auto`, which grows with the content.
|
|
78
|
+
|
|
79
|
+
```tsx
|
|
80
|
+
import { Field, style, Textarea } from '@tempoxyz/ds'
|
|
81
|
+
|
|
82
|
+
export function Demo() {
|
|
83
|
+
return (
|
|
84
|
+
<div {...styles.grid()}>
|
|
85
|
+
<Field.Root>
|
|
86
|
+
<Field.Label>Grows with content</Field.Label>
|
|
87
|
+
<Textarea resize="auto" rows={1} />
|
|
88
|
+
</Field.Root>
|
|
89
|
+
<Field.Root>
|
|
90
|
+
<Field.Label>Fixed height</Field.Label>
|
|
91
|
+
<Textarea placeholder="Add a note" resize="none" />
|
|
92
|
+
</Field.Root>
|
|
93
|
+
</div>
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
namespace styles {
|
|
98
|
+
export const grid = style({
|
|
99
|
+
alignItems: 'start',
|
|
100
|
+
display: 'grid',
|
|
101
|
+
gap: '24',
|
|
102
|
+
gridTemplateColumns: 'repeat(auto-fill, minmax(min(280px, 100%), 1fr)) !custom',
|
|
103
|
+
})
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Textarea/Resize.tsx)
|
|
108
|
+
|
|
109
|
+
### Invalid
|
|
110
|
+
|
|
111
|
+
Set `invalid` on `Field.Root` and add a `Field.Error` to show a validation message.
|
|
112
|
+
|
|
113
|
+
```tsx
|
|
114
|
+
import { Field, style, Textarea } from '@tempoxyz/ds'
|
|
115
|
+
|
|
116
|
+
export function Demo() {
|
|
117
|
+
return (
|
|
118
|
+
<div {...styles.grid()}>
|
|
119
|
+
<Field.Root invalid>
|
|
120
|
+
<Field.Label>Notes</Field.Label>
|
|
121
|
+
<Textarea defaultValue="Too short" />
|
|
122
|
+
<Field.Error match>Write at least 20 characters.</Field.Error>
|
|
123
|
+
</Field.Root>
|
|
124
|
+
</div>
|
|
125
|
+
)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
namespace styles {
|
|
129
|
+
export const grid = style({
|
|
130
|
+
alignItems: 'start',
|
|
131
|
+
display: 'grid',
|
|
132
|
+
gap: '24',
|
|
133
|
+
gridTemplateColumns: 'repeat(auto-fill, minmax(min(280px, 100%), 1fr)) !custom',
|
|
134
|
+
})
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Textarea/Invalid.tsx)
|
|
139
|
+
|
|
140
|
+
### Disabled
|
|
141
|
+
|
|
142
|
+
Set `disabled` on `Field.Root` to disable the textarea.
|
|
143
|
+
|
|
144
|
+
```tsx
|
|
145
|
+
import { Field, style, Textarea } from '@tempoxyz/ds'
|
|
146
|
+
|
|
147
|
+
export function Demo() {
|
|
148
|
+
return (
|
|
149
|
+
<div {...styles.grid()}>
|
|
150
|
+
<Field.Root disabled>
|
|
151
|
+
<Field.Label>Disabled</Field.Label>
|
|
152
|
+
<Textarea defaultValue="Locked" />
|
|
153
|
+
</Field.Root>
|
|
154
|
+
</div>
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
namespace styles {
|
|
159
|
+
export const grid = style({
|
|
160
|
+
alignItems: 'start',
|
|
161
|
+
display: 'grid',
|
|
162
|
+
gap: '24',
|
|
163
|
+
gridTemplateColumns: 'repeat(auto-fill, minmax(min(280px, 100%), 1fr)) !custom',
|
|
164
|
+
})
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
[View example source](https://github.com/tempoxyz/ds/blob/main/docs/src/examples/demos/Textarea/Disabled.tsx)
|
|
169
|
+
|
|
170
|
+
## Anatomy
|
|
171
|
+
|
|
172
|
+
Import the component and assemble its parts.
|
|
173
|
+
|
|
174
|
+
```tsx
|
|
175
|
+
import { Textarea } from '@tempoxyz/ds'
|
|
176
|
+
|
|
177
|
+
<Textarea />
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Guidelines
|
|
181
|
+
|
|
182
|
+
### When to Use
|
|
183
|
+
|
|
184
|
+
* Collect free text that may run over one line, such as a support message, a refund reason, or notes on a contact.
|
|
185
|
+
* Describe a new webhook, API key, or other object when a name alone isn't enough.
|
|
186
|
+
|
|
187
|
+
### When Not to Use
|
|
188
|
+
|
|
189
|
+
* Use [TextInput](text-input.md) for single-line values, even long ones such as a 0x address or a webhook URL.
|
|
190
|
+
* Use [Snippet](snippet.md) for a command or JSON payload to copy, not edit.
|
|
191
|
+
* Use [Select](select.md), [RadioGroup](radio-group.md), or [Checkbox](checkbox.md) when the answer fits a known set of options.
|
|
192
|
+
|
|
193
|
+
### Set Rows to the Expected Length
|
|
194
|
+
|
|
195
|
+
`rows` sets the starting height and defaults to 3. Size it to a typical answer.
|
|
196
|
+
|
|
197
|
+
**Do:** Give a long answer a few rows to start.
|
|
198
|
+
|
|
199
|
+
```tsx
|
|
200
|
+
/**
|
|
201
|
+
* Do example for "Set Rows to the Expected Length" on the Textarea page.
|
|
202
|
+
* Give a long answer a few rows to start.
|
|
203
|
+
* @module
|
|
204
|
+
*/
|
|
205
|
+
import { Field, style, Textarea } from '@tempoxyz/ds'
|
|
206
|
+
|
|
207
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
208
|
+
export function Demo() {
|
|
209
|
+
return (
|
|
210
|
+
<Field.Root {...styles.field()}>
|
|
211
|
+
<Field.Label>Describe the issue</Field.Label>
|
|
212
|
+
<Textarea rows={4} />
|
|
213
|
+
<Field.Description>Include the transaction hash if you have one.</Field.Description>
|
|
214
|
+
</Field.Root>
|
|
215
|
+
)
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
namespace styles {
|
|
219
|
+
export const field = style({ maxWidth: '18rem !custom', width: '100% !custom' })
|
|
220
|
+
}
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Don't:** Use a one-row textarea for a long answer. It reads as a single-line input.
|
|
224
|
+
|
|
225
|
+
```tsx
|
|
226
|
+
/**
|
|
227
|
+
* Don't example for "Set Rows to the Expected Length" on the Textarea page.
|
|
228
|
+
* Don't use a one-row textarea for a long answer. It reads as a single-line input.
|
|
229
|
+
* @module
|
|
230
|
+
*/
|
|
231
|
+
import { Field, style, Textarea } from '@tempoxyz/ds'
|
|
232
|
+
|
|
233
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
234
|
+
export function Demo() {
|
|
235
|
+
return (
|
|
236
|
+
<Field.Root {...styles.field()}>
|
|
237
|
+
<Field.Label>Describe the issue</Field.Label>
|
|
238
|
+
<Textarea resize="none" rows={1} />
|
|
239
|
+
<Field.Description>Include the transaction hash if you have one.</Field.Description>
|
|
240
|
+
</Field.Root>
|
|
241
|
+
)
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
namespace styles {
|
|
245
|
+
export const field = style({ maxWidth: '18rem !custom', width: '100% !custom' })
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Let the Box Grow
|
|
250
|
+
|
|
251
|
+
* **Drag to Resize (vertical):** The default. People drag the corner of the box down to make it taller.
|
|
252
|
+
* **Grow With Content (auto):** Grows through `field-sizing`. Other browsers keep the `rows` height.
|
|
253
|
+
* **Fixed Height (none):** Only when the layout can't absorb a taller box, such as a fixed-height card.
|
|
254
|
+
|
|
255
|
+
### Put Requirements in the Description
|
|
256
|
+
|
|
257
|
+
State what to include and any length limit in `Field.Description`, such as Up to 500 characters. There is no built-in character count.
|
|
258
|
+
|
|
259
|
+
Native `maxLength` cuts off pasted text without a warning. To keep pasted text, check the length in `validate` on `Field.Root` and explain the limit in `Field.Error`.
|
|
260
|
+
|
|
261
|
+
**Do:** State the limit before people start to write.
|
|
262
|
+
|
|
263
|
+
```tsx
|
|
264
|
+
/**
|
|
265
|
+
* Do example for "Put Requirements in the Description" on the Textarea page.
|
|
266
|
+
* State the limit before people start to write.
|
|
267
|
+
* @module
|
|
268
|
+
*/
|
|
269
|
+
import { Field, style, Textarea } from '@tempoxyz/ds'
|
|
270
|
+
|
|
271
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
272
|
+
export function Demo() {
|
|
273
|
+
return (
|
|
274
|
+
<Field.Root {...styles.field()}>
|
|
275
|
+
<Field.Label>Reason for refund</Field.Label>
|
|
276
|
+
<Textarea defaultValue="Sent 250.00 USDC to the wrong address." rows={3} />
|
|
277
|
+
<Field.Description>Up to 500 characters.</Field.Description>
|
|
278
|
+
</Field.Root>
|
|
279
|
+
)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
namespace styles {
|
|
283
|
+
export const field = style({ maxWidth: '18rem !custom', width: '100% !custom' })
|
|
284
|
+
}
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
**Don't:** Reveal the limit only in an error.
|
|
288
|
+
|
|
289
|
+
```tsx
|
|
290
|
+
/**
|
|
291
|
+
* Don't example for "Put Requirements in the Description" on the Textarea page.
|
|
292
|
+
* Don't reveal the limit only in an error.
|
|
293
|
+
* @module
|
|
294
|
+
*/
|
|
295
|
+
import { Field, style, Textarea } from '@tempoxyz/ds'
|
|
296
|
+
|
|
297
|
+
/** Renders the static preview, which the guideline card shows inert. */
|
|
298
|
+
export function Demo() {
|
|
299
|
+
return (
|
|
300
|
+
<Field.Root invalid {...styles.field()}>
|
|
301
|
+
<Field.Label>Reason for refund</Field.Label>
|
|
302
|
+
<Textarea defaultValue="Sent 250.00 USDC to the wrong address." rows={3} />
|
|
303
|
+
<Field.Error match>Your message is too long.</Field.Error>
|
|
304
|
+
</Field.Root>
|
|
305
|
+
)
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
namespace styles {
|
|
309
|
+
export const field = style({ maxWidth: '18rem !custom', width: '100% !custom' })
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
## Accessibility
|
|
314
|
+
|
|
315
|
+
`Textarea` renders a native `<textarea>` registered as the control of its `Field.Root`.
|
|
316
|
+
|
|
317
|
+
### Semantics
|
|
318
|
+
|
|
319
|
+
* **Textarea (textbox):** A native textarea, announced by screen readers as a multi-line text box.
|
|
320
|
+
* **Wiring (aria-describedby):** In a field, the label names it, and the field description and any shown error describe it.
|
|
321
|
+
* **Invalid State (aria-invalid):** Marks the control invalid and draws a red border. Explain the problem in `Field.Error`.
|
|
322
|
+
* **Disabled State (disabled):** Disables the native textarea, removes it from the tab order, and dims its label.
|
|
323
|
+
|
|
324
|
+
### Keyboard
|
|
325
|
+
|
|
326
|
+
* **Move Focus In and Out (Tab):** Moves focus to the textarea, and out of it again.
|
|
327
|
+
* **Insert a New Line (Enter):** Inserts a new line. It does not submit the form.
|
|
328
|
+
|
|
329
|
+
All other keys follow the native textarea.
|
|
330
|
+
|
|
331
|
+
### Your Responsibilities
|
|
332
|
+
|
|
333
|
+
* **Label the Textarea (Field.Label):** Give it a visible label in a field, or set `aria-label`. A placeholder isn't a label.
|
|
334
|
+
* **Keep Resizing (resize):** Keep resizing enabled where the layout allows, so readers who zoom can view their whole answer.
|
|
335
|
+
|
|
336
|
+
## Related
|
|
337
|
+
|
|
338
|
+
[TextInput](text-input.md)
|
|
339
|
+
|
|
340
|
+
Use for single-line text.
|
|
341
|
+
|
|
342
|
+
[Field](field.md)
|
|
343
|
+
|
|
344
|
+
Use for labels, descriptions, and errors.
|
|
345
|
+
|
|
346
|
+
[Snippet](snippet.md)
|
|
347
|
+
|
|
348
|
+
Use for read-only code and values.
|
|
349
|
+
|
|
350
|
+
[Forms](../patterns/forms.md)
|
|
351
|
+
|
|
352
|
+
Covers laying out fields and actions.
|