@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.
Files changed (210) hide show
  1. package/README.md +7 -6
  2. package/dist/docs/AGENTS.md +12 -0
  3. package/dist/docs/index.md +145 -0
  4. package/dist/docs/marketing/introduction/getting-started.md +241 -0
  5. package/dist/docs/product/components/accordion.md +489 -0
  6. package/dist/docs/product/components/address-card.md +147 -0
  7. package/dist/docs/product/components/agent-logo.md +194 -0
  8. package/dist/docs/product/components/alert-dialog.md +631 -0
  9. package/dist/docs/product/components/alert.md +448 -0
  10. package/dist/docs/product/components/amount-input.md +305 -0
  11. package/dist/docs/product/components/amount.md +794 -0
  12. package/dist/docs/product/components/app-shell.md +559 -0
  13. package/dist/docs/product/components/asset-chip.md +294 -0
  14. package/dist/docs/product/components/autocomplete.md +620 -0
  15. package/dist/docs/product/components/avatar.md +321 -0
  16. package/dist/docs/product/components/badge.md +339 -0
  17. package/dist/docs/product/components/badged-logo.md +116 -0
  18. package/dist/docs/product/components/banner.md +379 -0
  19. package/dist/docs/product/components/bar-chart.md +208 -0
  20. package/dist/docs/product/components/breadcrumbs.md +380 -0
  21. package/dist/docs/product/components/button-group.md +286 -0
  22. package/dist/docs/product/components/button.md +650 -0
  23. package/dist/docs/product/components/calendar.md +375 -0
  24. package/dist/docs/product/components/callout.md +96 -0
  25. package/dist/docs/product/components/checkbox-group.md +521 -0
  26. package/dist/docs/product/components/checkbox.md +467 -0
  27. package/dist/docs/product/components/choice-group.md +516 -0
  28. package/dist/docs/product/components/choicebox.md +641 -0
  29. package/dist/docs/product/components/code.md +100 -0
  30. package/dist/docs/product/components/combobox.md +939 -0
  31. package/dist/docs/product/components/container.md +257 -0
  32. package/dist/docs/product/components/copy-button.md +642 -0
  33. package/dist/docs/product/components/date-picker.md +514 -0
  34. package/dist/docs/product/components/dialog.md +1332 -0
  35. package/dist/docs/product/components/drawer.md +966 -0
  36. package/dist/docs/product/components/empty.md +340 -0
  37. package/dist/docs/product/components/field.md +570 -0
  38. package/dist/docs/product/components/fieldset.md +398 -0
  39. package/dist/docs/product/components/frame.md +434 -0
  40. package/dist/docs/product/components/gauge.md +299 -0
  41. package/dist/docs/product/components/get-started-visual.md +117 -0
  42. package/dist/docs/product/components/grid.md +288 -0
  43. package/dist/docs/product/components/hero-visual.md +155 -0
  44. package/dist/docs/product/components/hex.md +487 -0
  45. package/dist/docs/product/components/icon-tile.md +292 -0
  46. package/dist/docs/product/components/identicon.md +371 -0
  47. package/dist/docs/product/components/inline.md +233 -0
  48. package/dist/docs/product/components/inset.md +225 -0
  49. package/dist/docs/product/components/kbd.md +423 -0
  50. package/dist/docs/product/components/list-group.md +981 -0
  51. package/dist/docs/product/components/loading-dots.md +237 -0
  52. package/dist/docs/product/components/menu.md +934 -0
  53. package/dist/docs/product/components/native-select.md +204 -0
  54. package/dist/docs/product/components/network-logo.md +248 -0
  55. package/dist/docs/product/components/number-field.md +543 -0
  56. package/dist/docs/product/components/otp-field.md +616 -0
  57. package/dist/docs/product/components/pagination.md +516 -0
  58. package/dist/docs/product/components/popover.md +544 -0
  59. package/dist/docs/product/components/progress.md +388 -0
  60. package/dist/docs/product/components/qr.md +314 -0
  61. package/dist/docs/product/components/radio-group.md +528 -0
  62. package/dist/docs/product/components/secret-value.md +406 -0
  63. package/dist/docs/product/components/select.md +751 -0
  64. package/dist/docs/product/components/separator.md +379 -0
  65. package/dist/docs/product/components/sidebar-menu.md +922 -0
  66. package/dist/docs/product/components/skeleton.md +517 -0
  67. package/dist/docs/product/components/slider.md +539 -0
  68. package/dist/docs/product/components/snippet.md +424 -0
  69. package/dist/docs/product/components/spinner.md +216 -0
  70. package/dist/docs/product/components/split-bar.md +139 -0
  71. package/dist/docs/product/components/split-button.md +464 -0
  72. package/dist/docs/product/components/stack.md +299 -0
  73. package/dist/docs/product/components/status-chip.md +226 -0
  74. package/dist/docs/product/components/status-indicator.md +119 -0
  75. package/dist/docs/product/components/status-row.md +174 -0
  76. package/dist/docs/product/components/stepper.md +451 -0
  77. package/dist/docs/product/components/success-hero.md +157 -0
  78. package/dist/docs/product/components/surface.md +639 -0
  79. package/dist/docs/product/components/switch.md +472 -0
  80. package/dist/docs/product/components/table.md +967 -0
  81. package/dist/docs/product/components/tabs.md +627 -0
  82. package/dist/docs/product/components/tempo-logo.md +185 -0
  83. package/dist/docs/product/components/text-input.md +624 -0
  84. package/dist/docs/product/components/textarea.md +352 -0
  85. package/dist/docs/product/components/toast.md +535 -0
  86. package/dist/docs/product/components/token-logo.md +371 -0
  87. package/dist/docs/product/components/token.md +247 -0
  88. package/dist/docs/product/components/tooltip.md +490 -0
  89. package/dist/docs/product/components/verification-code.md +116 -0
  90. package/dist/docs/product/components/visual.md +249 -0
  91. package/dist/docs/product/components.md +203 -0
  92. package/dist/docs/product/foundations/accessibility.md +377 -0
  93. package/dist/docs/product/foundations/agents.md +150 -0
  94. package/dist/docs/product/foundations/color.md +522 -0
  95. package/dist/docs/product/foundations/content/tone.md +194 -0
  96. package/dist/docs/product/foundations/content/voice.md +194 -0
  97. package/dist/docs/product/foundations/content/writing-style.md +406 -0
  98. package/dist/docs/product/foundations/iconography.md +282 -0
  99. package/dist/docs/product/foundations/intent.md +360 -0
  100. package/dist/docs/product/foundations/layout.md +508 -0
  101. package/dist/docs/product/foundations/linter.md +496 -0
  102. package/dist/docs/product/foundations/motion.md +151 -0
  103. package/dist/docs/product/foundations/radius-and-padding.md +86 -0
  104. package/dist/docs/product/foundations/typography.md +266 -0
  105. package/dist/docs/product/introduction/faq.md +133 -0
  106. package/dist/docs/product/introduction/getting-started.md +377 -0
  107. package/dist/docs/product/patterns/blockchain-values.md +709 -0
  108. package/dist/docs/product/patterns/dashboards.md +638 -0
  109. package/dist/docs/product/patterns/destructive-actions.md +626 -0
  110. package/dist/docs/product/patterns/empty-states.md +612 -0
  111. package/dist/docs/product/patterns/errors-and-validation.md +808 -0
  112. package/dist/docs/product/patterns/feedback-and-status.md +518 -0
  113. package/dist/docs/product/patterns/forms.md +679 -0
  114. package/dist/docs/product/patterns/loading.md +630 -0
  115. package/dist/docs/product/patterns/navigation.md +397 -0
  116. package/dist/docs/product/patterns/payments.md +765 -0
  117. package/dist/docs/product/patterns/responsive-layout.md +997 -0
  118. package/dist/docs/product/patterns/tables-and-lists.md +964 -0
  119. package/dist/docs/product/products/tempo-console.md +671 -0
  120. package/dist/docs/product/products/tempo-performance.md +437 -0
  121. package/dist/docs/product/products/tempo-wallet.md +438 -0
  122. package/dist/marketing/index.d.ts +4 -0
  123. package/dist/marketing/index.d.ts.map +1 -0
  124. package/dist/marketing/index.js +4 -0
  125. package/dist/marketing/index.js.map +1 -0
  126. package/dist/marketing/index.js.zyzz.json +1 -0
  127. package/dist/marketing/vars.d.ts +907 -0
  128. package/dist/marketing/vars.d.ts.map +1 -0
  129. package/dist/marketing/vars.js +15 -0
  130. package/dist/marketing/vars.js.map +1 -0
  131. package/dist/marketing/vars.js.zyzz.json +1 -0
  132. package/dist/marketing/zyzz.config.d.ts +4512 -0
  133. package/dist/marketing/zyzz.config.d.ts.map +1 -0
  134. package/dist/marketing/zyzz.config.js +63 -0
  135. package/dist/marketing/zyzz.config.js.map +1 -0
  136. package/dist/marketing/zyzz.config.js.zyzz.json +1 -0
  137. package/dist/oxlint/index.d.ts +12 -1
  138. package/dist/oxlint/index.d.ts.map +1 -1
  139. package/dist/oxlint/index.js +39 -1
  140. package/dist/oxlint/index.js.map +1 -1
  141. package/dist/oxlint/internal/Docs.d.ts +9 -0
  142. package/dist/oxlint/internal/Docs.d.ts.map +1 -0
  143. package/dist/oxlint/internal/Docs.js +15 -0
  144. package/dist/oxlint/internal/Docs.js.map +1 -0
  145. package/dist/oxlint/internal/Imports.d.ts +1 -1
  146. package/dist/oxlint/internal/Imports.d.ts.map +1 -1
  147. package/dist/oxlint/internal/Imports.js +2 -0
  148. package/dist/oxlint/internal/Imports.js.map +1 -1
  149. package/dist/oxlint/internal/Styles.d.ts +40 -0
  150. package/dist/oxlint/internal/Styles.d.ts.map +1 -0
  151. package/dist/oxlint/internal/Styles.js +194 -0
  152. package/dist/oxlint/internal/Styles.js.map +1 -0
  153. package/dist/oxlint/internal/Tokens.d.ts +16 -0
  154. package/dist/oxlint/internal/Tokens.d.ts.map +1 -0
  155. package/dist/oxlint/internal/Tokens.js +39 -0
  156. package/dist/oxlint/internal/Tokens.js.map +1 -0
  157. package/dist/oxlint/rules/NoCrossSurface.d.ts +2 -2
  158. package/dist/oxlint/rules/NoCrossSurface.js +3 -3
  159. package/dist/oxlint/rules/NoCrossSurface.js.map +1 -1
  160. package/dist/oxlint/rules/NoCustomValues.d.ts +11 -0
  161. package/dist/oxlint/rules/NoCustomValues.d.ts.map +1 -0
  162. package/dist/oxlint/rules/NoCustomValues.js +150 -0
  163. package/dist/oxlint/rules/NoCustomValues.js.map +1 -0
  164. package/dist/oxlint/rules/NoSingleKeyShortcuts.d.ts +11 -0
  165. package/dist/oxlint/rules/NoSingleKeyShortcuts.d.ts.map +1 -0
  166. package/dist/oxlint/rules/NoSingleKeyShortcuts.js +158 -0
  167. package/dist/oxlint/rules/NoSingleKeyShortcuts.js.map +1 -0
  168. package/dist/oxlint/rules/PreferComponent.d.ts +3 -2
  169. package/dist/oxlint/rules/PreferComponent.d.ts.map +1 -1
  170. package/dist/oxlint/rules/PreferComponent.js +11 -4
  171. package/dist/oxlint/rules/PreferComponent.js.map +1 -1
  172. package/dist/oxlint/rules/PreferLayout.d.ts +9 -0
  173. package/dist/oxlint/rules/PreferLayout.d.ts.map +1 -0
  174. package/dist/oxlint/rules/PreferLayout.js +90 -0
  175. package/dist/oxlint/rules/PreferLayout.js.map +1 -0
  176. package/dist/oxlint/rules/PreferProgress.d.ts +9 -0
  177. package/dist/oxlint/rules/PreferProgress.d.ts.map +1 -0
  178. package/dist/oxlint/rules/PreferProgress.js +43 -0
  179. package/dist/oxlint/rules/PreferProgress.js.map +1 -0
  180. package/dist/oxlint/rules/PreferSurface.d.ts +9 -0
  181. package/dist/oxlint/rules/PreferSurface.d.ts.map +1 -0
  182. package/dist/oxlint/rules/PreferSurface.js +55 -0
  183. package/dist/oxlint/rules/PreferSurface.js.map +1 -0
  184. package/dist/oxlint/rules/RequireAccessibleName.d.ts.map +1 -1
  185. package/dist/oxlint/rules/RequireAccessibleName.js +3 -1
  186. package/dist/oxlint/rules/RequireAccessibleName.js.map +1 -1
  187. package/dist/oxlint/rules/RequireScrollRegion.d.ts +11 -0
  188. package/dist/oxlint/rules/RequireScrollRegion.d.ts.map +1 -0
  189. package/dist/oxlint/rules/RequireScrollRegion.js +71 -0
  190. package/dist/oxlint/rules/RequireScrollRegion.js.map +1 -0
  191. package/dist/web/icons/index.js.zyzz.json +1 -0
  192. package/package.json +6 -1
  193. package/src/marketing/README.md +21 -0
  194. package/src/marketing/index.ts +3 -0
  195. package/src/marketing/vars.ts +751 -0
  196. package/src/marketing/zyzz.config.ts +376 -0
  197. package/src/oxlint/index.ts +40 -1
  198. package/src/oxlint/internal/Docs.ts +18 -0
  199. package/src/oxlint/internal/Imports.ts +2 -1
  200. package/src/oxlint/internal/Styles.ts +240 -0
  201. package/src/oxlint/internal/Tokens.ts +43 -0
  202. package/src/oxlint/rules/NoCrossSurface.ts +3 -3
  203. package/src/oxlint/rules/NoCustomValues.ts +170 -0
  204. package/src/oxlint/rules/NoSingleKeyShortcuts.ts +190 -0
  205. package/src/oxlint/rules/PreferComponent.ts +11 -4
  206. package/src/oxlint/rules/PreferLayout.ts +96 -0
  207. package/src/oxlint/rules/PreferProgress.ts +49 -0
  208. package/src/oxlint/rules/PreferSurface.ts +70 -0
  209. package/src/oxlint/rules/RequireAccessibleName.ts +3 -1
  210. 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.