gbs-add-block 2.0.4 → 2.3.0

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 (129) hide show
  1. package/.gbs/skills/gbs-components/SKILL.md +190 -134
  2. package/.gbs/skills/gbs-components/references/install.md +25 -3
  3. package/.gbs/skills/gbs-components/references/styling.md +246 -201
  4. package/CHANGELOG.md +74 -0
  5. package/README.md +157 -11
  6. package/index.cjs +212 -3
  7. package/package.json +41 -10
  8. package/schema/passport-v1.schema.json +204 -0
  9. package/source/beta-components/accordion/passport.json +259 -0
  10. package/source/beta-components/accordion/styles.css +207 -208
  11. package/source/beta-components/alert/passport.json +250 -0
  12. package/source/beta-components/alert/styles.css +154 -155
  13. package/source/beta-components/avatar/passport.json +294 -0
  14. package/source/beta-components/avatar/styles.css +201 -203
  15. package/source/beta-components/badge/passport.json +332 -0
  16. package/source/beta-components/badge/styles.css +203 -204
  17. package/source/beta-components/breadcrumb/passport.json +243 -0
  18. package/source/beta-components/breadcrumb/styles.css +138 -139
  19. package/source/beta-components/button/passport.json +402 -0
  20. package/source/beta-components/button/passport.manual.json +31 -0
  21. package/source/beta-components/button/styles.css +232 -233
  22. package/source/beta-components/card/passport.json +337 -0
  23. package/source/beta-components/card/styles.css +230 -231
  24. package/source/beta-components/checkbox/passport.json +456 -0
  25. package/source/beta-components/checkbox/styles.css +211 -212
  26. package/source/beta-components/combobox/passport.json +456 -0
  27. package/source/beta-components/combobox/styles.css +419 -417
  28. package/source/beta-components/data-grid/agent/coerce.ts +368 -0
  29. package/source/beta-components/data-grid/agent/contract.ts +410 -0
  30. package/source/beta-components/data-grid/agent/dataset.ts +92 -0
  31. package/source/beta-components/data-grid/agent/engine.ts +470 -0
  32. package/source/beta-components/data-grid/agent/executors.ts +155 -0
  33. package/source/beta-components/data-grid/agent/index.ts +79 -0
  34. package/source/beta-components/data-grid/agent/intent.ts +324 -0
  35. package/source/beta-components/data-grid/agent/operations.ts +335 -0
  36. package/source/beta-components/data-grid/agent/validate.ts +630 -0
  37. package/source/beta-components/data-grid/agent/webmcp.ts +107 -0
  38. package/source/beta-components/data-grid/index.ts +14 -7
  39. package/source/beta-components/data-grid/passport.json +1051 -0
  40. package/source/beta-components/data-grid/passport.manual.json +255 -0
  41. package/source/beta-components/data-grid/react/AskGrid.tsx +164 -0
  42. package/source/beta-components/data-grid/react/DataGrid.tsx +39 -0
  43. package/source/beta-components/data-grid/styles.css +874 -717
  44. package/source/beta-components/date-picker/passport.json +407 -0
  45. package/source/beta-components/date-picker/styles.css +445 -446
  46. package/source/beta-components/dialog/passport.json +344 -0
  47. package/source/beta-components/dialog/styles.css +280 -278
  48. package/source/beta-components/file-uploader/passport.json +518 -0
  49. package/source/beta-components/file-uploader/styles.css +394 -395
  50. package/source/beta-components/input/passport.json +536 -0
  51. package/source/beta-components/input/styles.css +295 -296
  52. package/source/beta-components/menu/passport.json +322 -0
  53. package/source/beta-components/menu/styles.css +224 -222
  54. package/source/beta-components/modal/passport.json +289 -0
  55. package/source/beta-components/modal/styles.css +241 -239
  56. package/source/beta-components/number-input/passport.json +541 -0
  57. package/source/beta-components/number-input/styles.css +230 -231
  58. package/source/beta-components/popover/passport.json +238 -0
  59. package/source/beta-components/popover/styles.css +148 -146
  60. package/source/beta-components/progress/passport.json +270 -0
  61. package/source/beta-components/progress/styles.css +200 -202
  62. package/source/beta-components/radio-group/passport.json +477 -0
  63. package/source/beta-components/radio-group/styles.css +241 -242
  64. package/source/beta-components/shared/core/agent/adapter.ts +65 -0
  65. package/source/beta-components/shared/core/agent/history.ts +120 -0
  66. package/source/beta-components/shared/core/agent/index.ts +46 -0
  67. package/source/beta-components/shared/core/agent/numbers.ts +217 -0
  68. package/source/beta-components/shared/core/agent/schema.ts +180 -0
  69. package/source/beta-components/shared/core/agent/types.ts +169 -0
  70. package/source/beta-components/shared/core/agent/webmcp.ts +328 -0
  71. package/source/beta-components/shared/index.ts +9 -0
  72. package/source/beta-components/shared/react/GramproAIProvider.tsx +50 -0
  73. package/source/beta-components/shared/react/useAskAgent.ts +217 -0
  74. package/source/beta-components/shared/styles.css +79 -0
  75. package/source/beta-components/shared/version.json +4 -4
  76. package/source/beta-components/shared/version.ts +6 -6
  77. package/source/beta-components/skeleton/passport.json +251 -0
  78. package/source/beta-components/skeleton/styles.css +185 -186
  79. package/source/beta-components/spinner/passport.json +245 -0
  80. package/source/beta-components/spinner/styles.css +145 -146
  81. package/source/beta-components/switch/passport.json +421 -0
  82. package/source/beta-components/switch/styles.css +194 -196
  83. package/source/beta-components/tabs/passport.json +315 -0
  84. package/source/beta-components/tabs/styles.css +234 -235
  85. package/source/beta-components/textarea/passport.json +382 -0
  86. package/source/beta-components/textarea/styles.css +158 -159
  87. package/source/beta-components/toaster/passport.json +221 -0
  88. package/source/beta-components/toaster/styles.css +282 -283
  89. package/source/beta-components/tooltip/passport.json +170 -0
  90. package/source/beta-components/tooltip/styles.css +71 -72
  91. package/tools/env.cjs +61 -0
  92. package/tools/passport/cli.cjs +79 -0
  93. package/tools/passport/extract.cjs +493 -0
  94. package/tools/passport/index.cjs +185 -0
  95. package/tools/passport/merge.cjs +131 -0
  96. package/tools/passport/policy.cjs +65 -0
  97. package/tools/passport/validate.cjs +277 -0
  98. package/tools/ts-require.cjs +79 -0
  99. package/source/beta-components/accordion/__tests__/core.test.ts +0 -58
  100. package/source/beta-components/alert/__tests__/core.test.ts +0 -17
  101. package/source/beta-components/avatar/__tests__/core.test.ts +0 -88
  102. package/source/beta-components/badge/__tests__/core.test.ts +0 -46
  103. package/source/beta-components/breadcrumb/__tests__/core.test.ts +0 -58
  104. package/source/beta-components/button/__tests__/core.test.ts +0 -31
  105. package/source/beta-components/card/__tests__/core.test.ts +0 -57
  106. package/source/beta-components/checkbox/__tests__/core.test.ts +0 -40
  107. package/source/beta-components/combobox/__tests__/core.test.ts +0 -134
  108. package/source/beta-components/data-grid/__tests__/core.test.ts +0 -356
  109. package/source/beta-components/data-grid/__tests__/export.test.ts +0 -70
  110. package/source/beta-components/data-grid/__tests__/pdf.test.ts +0 -209
  111. package/source/beta-components/date-picker/__tests__/core.test.ts +0 -273
  112. package/source/beta-components/dialog/__tests__/core.test.ts +0 -86
  113. package/source/beta-components/file-uploader/__tests__/core.test.ts +0 -395
  114. package/source/beta-components/input/__tests__/core.test.ts +0 -75
  115. package/source/beta-components/menu/__tests__/core.test.ts +0 -120
  116. package/source/beta-components/modal/__tests__/core.test.ts +0 -55
  117. package/source/beta-components/number-input/__tests__/core.test.ts +0 -151
  118. package/source/beta-components/progress/__tests__/core.test.ts +0 -56
  119. package/source/beta-components/radio-group/__tests__/core.test.ts +0 -64
  120. package/source/beta-components/shared/__tests__/boundaries.test.ts +0 -95
  121. package/source/beta-components/shared/__tests__/core.test.ts +0 -55
  122. package/source/beta-components/shared/__tests__/position.test.ts +0 -143
  123. package/source/beta-components/skeleton/__tests__/core.test.ts +0 -41
  124. package/source/beta-components/spinner/__tests__/core.test.ts +0 -48
  125. package/source/beta-components/switch/__tests__/core.test.ts +0 -64
  126. package/source/beta-components/tabs/__tests__/core.test.ts +0 -51
  127. package/source/beta-components/textarea/__tests__/core.test.ts +0 -38
  128. package/source/beta-components/toaster/__tests__/core.test.ts +0 -256
  129. package/source/beta-components/tooltip/__tests__/core.test.ts +0 -42
@@ -0,0 +1,382 @@
1
+ {
2
+ "passportVersion": "1.0.0",
3
+ "identity": {
4
+ "component": "Textarea",
5
+ "folder": "textarea",
6
+ "exports": [
7
+ "Textarea"
8
+ ]
9
+ },
10
+ "source": {
11
+ "libraryVersion": "2.3.0",
12
+ "files": [
13
+ "core/count.ts",
14
+ "core/index.ts",
15
+ "core/size.ts",
16
+ "core/types.ts",
17
+ "index.ts",
18
+ "react/Textarea.tsx",
19
+ "react/locale.ts",
20
+ "react/props.ts"
21
+ ],
22
+ "sourceHash": "sha256:b3e29db45b921e5ecadffedfea1d53e436780971331cf2eba5615bb45ad935d3"
23
+ },
24
+ "props": [
25
+ {
26
+ "name": "aria-describedby",
27
+ "type": "string",
28
+ "typeText": "string | undefined",
29
+ "required": false,
30
+ "origin": "inherited"
31
+ },
32
+ {
33
+ "name": "aria-label",
34
+ "type": "string",
35
+ "typeText": "string | undefined",
36
+ "required": false,
37
+ "origin": "inherited"
38
+ },
39
+ {
40
+ "name": "aria-labelledby",
41
+ "type": "string",
42
+ "typeText": "string | undefined",
43
+ "required": false,
44
+ "origin": "inherited"
45
+ },
46
+ {
47
+ "name": "autoFocus",
48
+ "type": "boolean",
49
+ "typeText": "boolean | undefined",
50
+ "required": false,
51
+ "origin": "inherited"
52
+ },
53
+ {
54
+ "name": "autoResize",
55
+ "type": "boolean",
56
+ "typeText": "boolean | undefined",
57
+ "required": false,
58
+ "default": false,
59
+ "origin": "derived",
60
+ "description": "Grow and shrink with the text, between `minRows` and `maxRows`. Default false.",
61
+ "descriptionOrigin": "jsdoc"
62
+ },
63
+ {
64
+ "name": "className",
65
+ "type": "string",
66
+ "typeText": "string | undefined",
67
+ "required": false,
68
+ "origin": "inherited"
69
+ },
70
+ {
71
+ "name": "classNames",
72
+ "type": "other",
73
+ "typeText": "Partial<Record<TextareaSlot, string>> | undefined",
74
+ "required": false,
75
+ "origin": "derived"
76
+ },
77
+ {
78
+ "name": "cols",
79
+ "type": "number",
80
+ "typeText": "number | undefined",
81
+ "required": false,
82
+ "origin": "inherited"
83
+ },
84
+ {
85
+ "name": "defaultValue",
86
+ "type": "string",
87
+ "typeText": "string | undefined",
88
+ "required": false,
89
+ "origin": "derived"
90
+ },
91
+ {
92
+ "name": "description",
93
+ "type": "other",
94
+ "typeText": "ReactNode",
95
+ "required": false,
96
+ "origin": "derived"
97
+ },
98
+ {
99
+ "name": "disabled",
100
+ "type": "boolean",
101
+ "typeText": "boolean | undefined",
102
+ "required": false,
103
+ "origin": "inherited"
104
+ },
105
+ {
106
+ "name": "error",
107
+ "type": "other",
108
+ "typeText": "ReactNode",
109
+ "required": false,
110
+ "origin": "derived",
111
+ "description": "Message below the field; also marks it invalid.",
112
+ "descriptionOrigin": "jsdoc"
113
+ },
114
+ {
115
+ "name": "form",
116
+ "type": "string",
117
+ "typeText": "string | undefined",
118
+ "required": false,
119
+ "origin": "inherited"
120
+ },
121
+ {
122
+ "name": "hidden",
123
+ "type": "boolean",
124
+ "typeText": "boolean | undefined",
125
+ "required": false,
126
+ "origin": "inherited"
127
+ },
128
+ {
129
+ "name": "id",
130
+ "type": "string",
131
+ "typeText": "string | undefined",
132
+ "required": false,
133
+ "origin": "inherited"
134
+ },
135
+ {
136
+ "name": "label",
137
+ "type": "other",
138
+ "typeText": "ReactNode",
139
+ "required": false,
140
+ "origin": "derived"
141
+ },
142
+ {
143
+ "name": "localeText",
144
+ "type": "other",
145
+ "typeText": "Partial<TextareaLocaleText> | undefined",
146
+ "required": false,
147
+ "origin": "derived"
148
+ },
149
+ {
150
+ "name": "maxLength",
151
+ "type": "number",
152
+ "typeText": "number | undefined",
153
+ "required": false,
154
+ "origin": "inherited"
155
+ },
156
+ {
157
+ "name": "maxRows",
158
+ "type": "number",
159
+ "typeText": "number | undefined",
160
+ "required": false,
161
+ "origin": "derived",
162
+ "description": "Largest height in rows before the text scrolls. No limit by default.",
163
+ "descriptionOrigin": "jsdoc"
164
+ },
165
+ {
166
+ "name": "minRows",
167
+ "type": "number",
168
+ "typeText": "number | undefined",
169
+ "required": false,
170
+ "origin": "derived",
171
+ "description": "Smallest height in rows. Default `rows`, or 3.",
172
+ "descriptionOrigin": "jsdoc"
173
+ },
174
+ {
175
+ "name": "name",
176
+ "type": "string",
177
+ "typeText": "string | undefined",
178
+ "required": false,
179
+ "origin": "inherited"
180
+ },
181
+ {
182
+ "name": "onValueChange",
183
+ "type": "function",
184
+ "signature": "((value: string) => void) | undefined",
185
+ "required": false,
186
+ "origin": "derived",
187
+ "description": "The new text on every change. The native `onChange` fires as well.",
188
+ "descriptionOrigin": "jsdoc"
189
+ },
190
+ {
191
+ "name": "placeholder",
192
+ "type": "string",
193
+ "typeText": "string | undefined",
194
+ "required": false,
195
+ "origin": "inherited"
196
+ },
197
+ {
198
+ "name": "readOnly",
199
+ "type": "boolean",
200
+ "typeText": "boolean | undefined",
201
+ "required": false,
202
+ "origin": "inherited"
203
+ },
204
+ {
205
+ "name": "ref",
206
+ "type": "other",
207
+ "typeText": "Ref<HTMLTextAreaElement> | undefined",
208
+ "required": false,
209
+ "origin": "derived",
210
+ "description": "The `<textarea>` element.",
211
+ "descriptionOrigin": "jsdoc"
212
+ },
213
+ {
214
+ "name": "required",
215
+ "type": "boolean",
216
+ "typeText": "boolean | undefined",
217
+ "required": false,
218
+ "origin": "inherited"
219
+ },
220
+ {
221
+ "name": "resize",
222
+ "type": "enum",
223
+ "values": [
224
+ "both",
225
+ "horizontal",
226
+ "none",
227
+ "vertical"
228
+ ],
229
+ "typeText": "TextareaResize | undefined",
230
+ "required": false,
231
+ "origin": "derived",
232
+ "description": "Which way people can drag to resize. Default `vertical`, or `none` with `autoResize`.",
233
+ "descriptionOrigin": "jsdoc"
234
+ },
235
+ {
236
+ "name": "role",
237
+ "type": "other",
238
+ "typeText": "AriaRole | undefined",
239
+ "required": false,
240
+ "origin": "inherited"
241
+ },
242
+ {
243
+ "name": "rows",
244
+ "type": "number",
245
+ "typeText": "number | undefined",
246
+ "required": false,
247
+ "origin": "inherited"
248
+ },
249
+ {
250
+ "name": "showCount",
251
+ "type": "boolean",
252
+ "typeText": "boolean | undefined",
253
+ "required": false,
254
+ "default": false,
255
+ "origin": "derived",
256
+ "description": "A character counter; shows `count / maxLength` when `maxLength` is set.",
257
+ "descriptionOrigin": "jsdoc"
258
+ },
259
+ {
260
+ "name": "size",
261
+ "type": "enum",
262
+ "values": [
263
+ "lg",
264
+ "md",
265
+ "sm"
266
+ ],
267
+ "typeText": "FieldSize | undefined",
268
+ "required": false,
269
+ "default": "md",
270
+ "origin": "derived"
271
+ },
272
+ {
273
+ "name": "style",
274
+ "type": "other",
275
+ "typeText": "CSSProperties | undefined",
276
+ "required": false,
277
+ "origin": "inherited"
278
+ },
279
+ {
280
+ "name": "tabIndex",
281
+ "type": "number",
282
+ "typeText": "number | undefined",
283
+ "required": false,
284
+ "origin": "inherited"
285
+ },
286
+ {
287
+ "name": "title",
288
+ "type": "string",
289
+ "typeText": "string | undefined",
290
+ "required": false,
291
+ "origin": "inherited"
292
+ },
293
+ {
294
+ "name": "value",
295
+ "type": "string",
296
+ "typeText": "string | undefined",
297
+ "required": false,
298
+ "origin": "derived"
299
+ }
300
+ ],
301
+ "inherits": [
302
+ {
303
+ "from": "TextareaHTMLAttributes<HTMLTextAreaElement>",
304
+ "omitted": [
305
+ "defaultValue",
306
+ "value"
307
+ ],
308
+ "passthrough": true
309
+ }
310
+ ],
311
+ "events": [
312
+ {
313
+ "name": "onValueChange",
314
+ "signature": "((value: string) => void) | undefined"
315
+ }
316
+ ],
317
+ "slots": [
318
+ "root",
319
+ "label",
320
+ "textarea",
321
+ "description",
322
+ "error",
323
+ "count"
324
+ ],
325
+ "states": [
326
+ {
327
+ "attr": "data-autoresize"
328
+ },
329
+ {
330
+ "attr": "data-disabled"
331
+ },
332
+ {
333
+ "attr": "data-invalid"
334
+ },
335
+ {
336
+ "attr": "data-over"
337
+ },
338
+ {
339
+ "attr": "data-required"
340
+ },
341
+ {
342
+ "attr": "data-resize",
343
+ "values": [
344
+ "both",
345
+ "horizontal",
346
+ "none",
347
+ "vertical"
348
+ ]
349
+ },
350
+ {
351
+ "attr": "data-size",
352
+ "values": [
353
+ "lg",
354
+ "sm"
355
+ ]
356
+ },
357
+ {
358
+ "attr": "data-theme",
359
+ "values": [
360
+ "dark",
361
+ "light"
362
+ ]
363
+ }
364
+ ],
365
+ "accessibility": {
366
+ "supplied": [],
367
+ "required": []
368
+ },
369
+ "composition": {},
370
+ "operations": {},
371
+ "intentDomains": [],
372
+ "safeMutations": {},
373
+ "examples": [],
374
+ "coverage": {
375
+ "propsTotal": 35,
376
+ "propsDescribed": 8,
377
+ "describedPct": 23,
378
+ "authoredSections": [
379
+ "accessibility"
380
+ ]
381
+ }
382
+ }
@@ -1,159 +1,158 @@
1
- /*
2
- * Textarea styles.
3
- *
4
- * Tokens read the shared --gbs-* variables when they are set on an ancestor
5
- * (set them on :root to theme every component at once) and fall back to the
6
- * same default palette otherwise. Rules live in the `components` layer, so utility classes passed
7
- * through `className` / `classNames` override them.
8
- */
9
- @layer theme, base, components, utilities;
10
-
11
- @layer components {
12
- .ta-root {
13
- --ta-fg: var(--gbs-fg, var(--dg-fg, light-dark(#18181b, #f4f4f5)));
14
- --ta-muted: var(--gbs-muted, var(--dg-muted, light-dark(#71717a, #a1a1aa)));
15
- --ta-border: var(--gbs-border, var(--dg-border, light-dark(#e4e4e7, #27272a)));
16
- --ta-input-bg: var(--gbs-input-bg, var(--dg-input-bg, light-dark(#ffffff, #121216)));
17
- --ta-readonly-bg: var(--gbs-readonly-bg, light-dark(#fafafa, #0e0e12));
18
- --ta-focus: var(--gbs-focus, var(--dg-focus, light-dark(#2563eb, #60a5fa)));
19
- --ta-danger: var(--gbs-danger, var(--dg-danger, light-dark(#dc2626, #f87171)));
20
- --ta-radius: var(--gbs-radius, var(--dg-radius, 8px));
21
- --ta-font-size: var(--gbs-font-size, var(--dg-font-size, 13px));
22
- --ta-px: 10px;
23
- --ta-py: 8px;
24
-
25
- color-scheme: inherit;
26
- display: flex;
27
- flex-direction: column;
28
- gap: 4px;
29
- width: 100%;
30
- min-width: 0;
31
- font-size: var(--ta-font-size);
32
- line-height: 1.4;
33
- color: var(--ta-fg);
34
- }
35
-
36
- :where(.dark, [data-theme="dark"]) .ta-root {
37
- color-scheme: dark;
38
- }
39
- :where(.light, [data-theme="light"]) .ta-root {
40
- color-scheme: light;
41
- }
42
-
43
- :where(.ta-root) *,
44
- :where(.ta-root) *::before,
45
- :where(.ta-root) *::after {
46
- box-sizing: border-box;
47
- }
48
-
49
- .ta-root[data-size="sm"] {
50
- --ta-font-size: 12px;
51
- --ta-px: 8px;
52
- --ta-py: 6px;
53
- }
54
- .ta-root[data-size="lg"] {
55
- --ta-font-size: 14px;
56
- --ta-px: 12px;
57
- --ta-py: 10px;
58
- }
59
-
60
- .ta-label {
61
- font-weight: 500;
62
- }
63
- .ta-label[data-required]::after {
64
- content: " *";
65
- color: var(--ta-danger);
66
- }
67
-
68
- .ta-input {
69
- display: block;
70
- width: 100%;
71
- min-height: calc(1lh + 2 * var(--ta-py) + 2px);
72
- margin: 0;
73
- padding: var(--ta-py) var(--ta-px);
74
- border: 1px solid var(--ta-border);
75
- border-radius: var(--ta-radius);
76
- background: var(--ta-input-bg);
77
- color: inherit;
78
- font: inherit;
79
- line-height: 1.5;
80
- }
81
- .ta-input::placeholder {
82
- color: var(--ta-muted);
83
- }
84
- .ta-input:hover:not(:disabled) {
85
- border-color: color-mix(in oklab, var(--ta-border), var(--ta-fg) 25%);
86
- }
87
- .ta-input:focus-visible {
88
- outline: 2px solid var(--ta-focus);
89
- outline-offset: -1px;
90
- }
91
- .ta-input[data-invalid] {
92
- border-color: var(--ta-danger);
93
- outline-color: var(--ta-danger);
94
- }
95
- .ta-input:read-only {
96
- background: var(--ta-readonly-bg);
97
- }
98
- .ta-input:disabled {
99
- opacity: 0.55;
100
- cursor: not-allowed;
101
- }
102
-
103
- .ta-input[data-resize="none"] {
104
- resize: none;
105
- }
106
- .ta-input[data-resize="vertical"] {
107
- resize: vertical;
108
- }
109
- .ta-input[data-resize="horizontal"] {
110
- resize: horizontal;
111
- }
112
- .ta-input[data-resize="both"] {
113
- resize: both;
114
- }
115
-
116
- /*
117
- * Auto-resize in CSS where supported. The row limits come from the
118
- * component; `--ta-max-rows: none` makes max-height invalid, which means no limit.
119
- */
120
- @supports (field-sizing: content) {
121
- .ta-input[data-autoresize] {
122
- field-sizing: content;
123
- min-height: calc(var(--ta-min-rows, 3) * 1lh + 2 * var(--ta-py) + 2px);
124
- max-height: calc(var(--ta-max-rows) * 1lh + 2 * var(--ta-py) + 2px);
125
- }
126
- }
127
-
128
- .ta-footer {
129
- display: flex;
130
- align-items: baseline;
131
- gap: 8px;
132
- }
133
- .ta-description {
134
- flex: 1 1 auto;
135
- min-width: 0;
136
- color: var(--ta-muted);
137
- font-size: 0.92em;
138
- }
139
- .ta-count {
140
- flex: none;
141
- margin-inline-start: auto;
142
- color: var(--ta-muted);
143
- font-size: 0.92em;
144
- font-variant-numeric: tabular-nums;
145
- }
146
- .ta-count[data-over] {
147
- color: var(--ta-danger);
148
- }
149
- .ta-error {
150
- color: var(--ta-danger);
151
- font-size: 0.92em;
152
- }
153
-
154
- @media (forced-colors: active) {
155
- .ta-input:focus-visible {
156
- outline-color: Highlight;
157
- }
158
- }
159
- }
1
+ /*
2
+ * Textarea styles.
3
+ *
4
+ * Tokens read the shared --gbs-* variables when they are set on an ancestor
5
+ * (set them on :root to theme every component at once) and fall back to the
6
+ * same default palette otherwise. Rules are unlayered: they beat a framework
7
+ * reset on specificity, and lose to anything you pass through `className`.
8
+ * With Tailwind v4, import this file after the framework and inside its
9
+ * components layer - see the README.
10
+ */
11
+
12
+ .ta-root {
13
+ --ta-fg: var(--gbs-fg, var(--dg-fg, light-dark(#18181b, #f4f4f5)));
14
+ --ta-muted: var(--gbs-muted, var(--dg-muted, light-dark(#71717a, #a1a1aa)));
15
+ --ta-border: var(--gbs-border, var(--dg-border, light-dark(#e4e4e7, #27272a)));
16
+ --ta-input-bg: var(--gbs-input-bg, var(--dg-input-bg, light-dark(#ffffff, #121216)));
17
+ --ta-readonly-bg: var(--gbs-readonly-bg, light-dark(#fafafa, #0e0e12));
18
+ --ta-focus: var(--gbs-focus, var(--dg-focus, light-dark(#2563eb, #60a5fa)));
19
+ --ta-danger: var(--gbs-danger, var(--dg-danger, light-dark(#dc2626, #f87171)));
20
+ --ta-radius: var(--gbs-radius, var(--dg-radius, 8px));
21
+ --ta-font-size: var(--gbs-font-size, var(--dg-font-size, 13px));
22
+ --ta-px: 10px;
23
+ --ta-py: 8px;
24
+
25
+ color-scheme: inherit;
26
+ display: flex;
27
+ flex-direction: column;
28
+ gap: 4px;
29
+ width: 100%;
30
+ min-width: 0;
31
+ font-size: var(--ta-font-size);
32
+ line-height: 1.4;
33
+ color: var(--ta-fg);
34
+ }
35
+
36
+ :where(.dark, [data-theme="dark"]) .ta-root {
37
+ color-scheme: dark;
38
+ }
39
+ :where(.light, [data-theme="light"]) .ta-root {
40
+ color-scheme: light;
41
+ }
42
+
43
+ :where(.ta-root) *,
44
+ :where(.ta-root) *::before,
45
+ :where(.ta-root) *::after {
46
+ box-sizing: border-box;
47
+ }
48
+
49
+ .ta-root[data-size="sm"] {
50
+ --ta-font-size: 12px;
51
+ --ta-px: 8px;
52
+ --ta-py: 6px;
53
+ }
54
+ .ta-root[data-size="lg"] {
55
+ --ta-font-size: 14px;
56
+ --ta-px: 12px;
57
+ --ta-py: 10px;
58
+ }
59
+
60
+ .ta-label {
61
+ font-weight: 500;
62
+ }
63
+ .ta-label[data-required]::after {
64
+ content: " *";
65
+ color: var(--ta-danger);
66
+ }
67
+
68
+ .ta-input {
69
+ display: block;
70
+ width: 100%;
71
+ min-height: calc(1lh + 2 * var(--ta-py) + 2px);
72
+ margin: 0;
73
+ padding: var(--ta-py) var(--ta-px);
74
+ border: 1px solid var(--ta-border);
75
+ border-radius: var(--ta-radius);
76
+ background: var(--ta-input-bg);
77
+ color: inherit;
78
+ font: inherit;
79
+ line-height: 1.5;
80
+ }
81
+ .ta-input::placeholder {
82
+ color: var(--ta-muted);
83
+ }
84
+ .ta-input:hover:not(:disabled) {
85
+ border-color: color-mix(in oklab, var(--ta-border), var(--ta-fg) 25%);
86
+ }
87
+ .ta-input:focus-visible {
88
+ outline: 2px solid var(--ta-focus);
89
+ outline-offset: -1px;
90
+ }
91
+ .ta-input[data-invalid] {
92
+ border-color: var(--ta-danger);
93
+ outline-color: var(--ta-danger);
94
+ }
95
+ .ta-input:read-only {
96
+ background: var(--ta-readonly-bg);
97
+ }
98
+ .ta-input:disabled {
99
+ opacity: 0.55;
100
+ cursor: not-allowed;
101
+ }
102
+
103
+ .ta-input[data-resize="none"] {
104
+ resize: none;
105
+ }
106
+ .ta-input[data-resize="vertical"] {
107
+ resize: vertical;
108
+ }
109
+ .ta-input[data-resize="horizontal"] {
110
+ resize: horizontal;
111
+ }
112
+ .ta-input[data-resize="both"] {
113
+ resize: both;
114
+ }
115
+
116
+ /*
117
+ * Auto-resize in CSS where supported. The row limits come from the
118
+ * component; `--ta-max-rows: none` makes max-height invalid, which means no limit.
119
+ */
120
+ @supports (field-sizing: content) {
121
+ .ta-input[data-autoresize] {
122
+ field-sizing: content;
123
+ min-height: calc(var(--ta-min-rows, 3) * 1lh + 2 * var(--ta-py) + 2px);
124
+ max-height: calc(var(--ta-max-rows) * 1lh + 2 * var(--ta-py) + 2px);
125
+ }
126
+ }
127
+
128
+ .ta-footer {
129
+ display: flex;
130
+ align-items: baseline;
131
+ gap: 8px;
132
+ }
133
+ .ta-description {
134
+ flex: 1 1 auto;
135
+ min-width: 0;
136
+ color: var(--ta-muted);
137
+ font-size: 0.92em;
138
+ }
139
+ .ta-count {
140
+ flex: none;
141
+ margin-inline-start: auto;
142
+ color: var(--ta-muted);
143
+ font-size: 0.92em;
144
+ font-variant-numeric: tabular-nums;
145
+ }
146
+ .ta-count[data-over] {
147
+ color: var(--ta-danger);
148
+ }
149
+ .ta-error {
150
+ color: var(--ta-danger);
151
+ font-size: 0.92em;
152
+ }
153
+
154
+ @media (forced-colors: active) {
155
+ .ta-input:focus-visible {
156
+ outline-color: Highlight;
157
+ }
158
+ }