@jarllyng/nostromo 3.1.0 → 3.2.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 (194) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +96 -0
  3. package/dist/base.css +0 -48
  4. package/dist/chunk-2DNQXAMB.cjs +1 -0
  5. package/dist/chunk-2HYJSYQX.js +3 -0
  6. package/dist/chunk-2HYJSYQX.js.map +1 -0
  7. package/dist/chunk-2JQROMCM.js +1 -0
  8. package/dist/chunk-3BNGK67W.js +1 -0
  9. package/dist/chunk-3V3OIZWQ.cjs +1 -0
  10. package/dist/chunk-44HISN45.js +1 -0
  11. package/dist/chunk-4FSJEW7W.cjs +1 -0
  12. package/dist/chunk-4PN7OGLX.cjs +1 -0
  13. package/dist/chunk-4TYVEXRA.cjs +1 -0
  14. package/dist/chunk-55N2IT62.cjs +1 -0
  15. package/dist/chunk-5PVFLXPO.cjs +1 -0
  16. package/dist/chunk-6QAYHUNV.js +1 -0
  17. package/dist/chunk-7PPAI3MM.cjs +1 -0
  18. package/dist/chunk-7SPPGTBT.cjs +1 -0
  19. package/dist/chunk-7W456HZL.js +1 -0
  20. package/dist/chunk-7WEIVLG3.cjs +1 -0
  21. package/dist/chunk-7YFUAGIW.cjs +1 -0
  22. package/dist/chunk-ABA7B5DE.js +1 -0
  23. package/dist/chunk-AC2JBXHQ.js +1 -0
  24. package/dist/chunk-AHRTNKXE.js +1 -0
  25. package/dist/chunk-AVTJE2O2.js +1 -0
  26. package/dist/chunk-B2BWBKZA.cjs +1 -0
  27. package/dist/chunk-BSUHBLZO.cjs +1 -0
  28. package/dist/chunk-BYV75TDY.cjs +1 -0
  29. package/dist/chunk-BZF3ZOAN.js +1 -0
  30. package/dist/chunk-CEMOHO3Z.js +1 -0
  31. package/dist/chunk-COXN6XBA.js +1 -0
  32. package/dist/chunk-CVOSWGQZ.js +1 -0
  33. package/dist/chunk-EFCNLYYW.cjs +1 -0
  34. package/dist/chunk-EGQ2Q37R.cjs +1 -0
  35. package/dist/chunk-EIXD3Y4R.js +1 -0
  36. package/dist/chunk-EVRQYWZ3.cjs +1 -0
  37. package/dist/chunk-FUENXWR7.cjs +1 -0
  38. package/dist/chunk-G35BR7SK.cjs +1 -0
  39. package/dist/chunk-G5ZSOVJY.cjs +1 -0
  40. package/dist/chunk-G6TR5RGR.js +1 -0
  41. package/dist/chunk-GUJB555L.js +1 -0
  42. package/dist/chunk-HD3TMQPR.js +1 -0
  43. package/dist/chunk-HWZTMVQV.cjs +1 -0
  44. package/dist/chunk-IOX4WPJL.cjs +1 -0
  45. package/dist/chunk-ITRGJNWL.cjs +1 -0
  46. package/dist/chunk-J4VRJVTO.cjs +1 -0
  47. package/dist/chunk-JEHIMQQZ.js +1 -0
  48. package/dist/chunk-JUOCEYUF.cjs +1 -0
  49. package/dist/chunk-JZROH43C.js +1 -0
  50. package/dist/chunk-K2JCGDU7.cjs +1 -0
  51. package/dist/chunk-LR4VUFOQ.js +1 -0
  52. package/dist/chunk-LXQT7FH6.cjs +1 -0
  53. package/dist/chunk-LYVCB45L.js +1 -0
  54. package/dist/chunk-M5IBD3KV.js +1 -0
  55. package/dist/chunk-MLJZU63I.cjs +1 -0
  56. package/dist/chunk-MLSE5XSB.cjs +1 -0
  57. package/dist/chunk-MRZOLUSF.js +1 -0
  58. package/dist/chunk-MVCGR7JQ.js +1 -0
  59. package/dist/chunk-NLD4R74T.js +1 -0
  60. package/dist/chunk-OEN63W3G.cjs +1 -0
  61. package/dist/chunk-OUWOPYAX.js +1 -0
  62. package/dist/chunk-OZ3RIKZO.cjs +1 -0
  63. package/dist/chunk-PEYPRWZP.js +1 -0
  64. package/dist/chunk-PMNNV4ML.cjs +1 -0
  65. package/dist/chunk-PVHTEE5T.cjs +1 -0
  66. package/dist/chunk-Q6QMSAJR.js +1 -0
  67. package/dist/chunk-QBAURT3I.js +1 -0
  68. package/dist/chunk-QF5CRDZI.js +1 -0
  69. package/dist/chunk-RC2THAIA.js +1 -0
  70. package/dist/chunk-RPRISB7O.cjs +1 -0
  71. package/dist/chunk-SD4IIQ2I.cjs +1 -0
  72. package/dist/chunk-TGPWW7FC.js +1 -0
  73. package/dist/chunk-TJFZAMBB.js +1 -0
  74. package/dist/chunk-UL6MF7ES.js +1 -0
  75. package/dist/{chunk-4WFEVNXW.cjs → chunk-V45EOCAD.cjs} +3 -2
  76. package/dist/chunk-V45EOCAD.cjs.map +1 -0
  77. package/dist/chunk-V77N662N.cjs +1 -0
  78. package/dist/chunk-VD6S2PE4.js +1 -0
  79. package/dist/chunk-VXMDVKAD.js +1 -0
  80. package/dist/chunk-WW2DDHCI.js +1 -0
  81. package/dist/chunk-XPIBRXTW.cjs +1 -0
  82. package/dist/chunk-XQUZ7DUN.js +1 -0
  83. package/dist/chunk-YNSODGYK.js +1 -0
  84. package/dist/chunk-ZC4HJSII.cjs +1 -0
  85. package/dist/chunk-ZEJAFIOC.js +1 -0
  86. package/dist/chunk-ZQDFYSZB.cjs +1 -0
  87. package/dist/chunk-ZYP2PDSX.cjs +1 -0
  88. package/dist/components/core/accordion.cjs +1 -0
  89. package/dist/components/core/accordion.js +1 -0
  90. package/dist/components/core/alert.cjs +1 -0
  91. package/dist/components/core/alert.js +1 -0
  92. package/dist/components/core/avatar.cjs +1 -0
  93. package/dist/components/core/avatar.js +1 -0
  94. package/dist/components/core/badge.cjs +1 -0
  95. package/dist/components/core/badge.d.cts +1 -1
  96. package/dist/components/core/badge.d.ts +1 -1
  97. package/dist/components/core/badge.js +1 -0
  98. package/dist/components/core/breadcrumb.cjs +1 -0
  99. package/dist/components/core/breadcrumb.d.cts +2 -2
  100. package/dist/components/core/breadcrumb.d.ts +2 -2
  101. package/dist/components/core/breadcrumb.js +1 -0
  102. package/dist/components/core/button.cjs +1 -0
  103. package/dist/components/core/button.js +1 -0
  104. package/dist/components/core/calendar.cjs +1 -0
  105. package/dist/components/core/calendar.js +1 -0
  106. package/dist/components/core/card.cjs +1 -0
  107. package/dist/components/core/card.js +1 -0
  108. package/dist/components/core/charts-lazy.cjs +1 -0
  109. package/dist/components/core/charts-lazy.js +1 -0
  110. package/dist/components/core/charts.cjs +1 -0
  111. package/dist/components/core/charts.js +1 -0
  112. package/dist/components/core/checkbox.cjs +1 -0
  113. package/dist/components/core/checkbox.js +1 -0
  114. package/dist/components/core/data-table.cjs +1 -0
  115. package/dist/components/core/data-table.d.cts +2 -2
  116. package/dist/components/core/data-table.d.ts +2 -2
  117. package/dist/components/core/data-table.js +1 -0
  118. package/dist/components/core/dialog.cjs +1 -0
  119. package/dist/components/core/dialog.js +1 -0
  120. package/dist/components/core/error-boundary.cjs +1 -0
  121. package/dist/components/core/error-boundary.d.cts +1 -1
  122. package/dist/components/core/error-boundary.d.ts +1 -1
  123. package/dist/components/core/error-boundary.js +1 -0
  124. package/dist/components/core/error-message.cjs +1 -0
  125. package/dist/components/core/error-message.js +1 -0
  126. package/dist/components/core/helper-text.cjs +1 -0
  127. package/dist/components/core/helper-text.js +1 -0
  128. package/dist/components/core/icon.cjs +1 -0
  129. package/dist/components/core/icon.d.cts +2 -2
  130. package/dist/components/core/icon.d.ts +2 -2
  131. package/dist/components/core/icon.js +1 -0
  132. package/dist/components/core/input.cjs +1 -0
  133. package/dist/components/core/input.js +1 -0
  134. package/dist/components/core/label.cjs +1 -0
  135. package/dist/components/core/label.d.cts +1 -1
  136. package/dist/components/core/label.d.ts +1 -1
  137. package/dist/components/core/label.js +1 -0
  138. package/dist/components/core/pagination.cjs +1 -0
  139. package/dist/components/core/pagination.js +1 -0
  140. package/dist/components/core/progress.cjs +1 -0
  141. package/dist/components/core/progress.js +1 -0
  142. package/dist/components/core/radio-group.cjs +1 -0
  143. package/dist/components/core/radio-group.js +1 -0
  144. package/dist/components/core/select.cjs +1 -0
  145. package/dist/components/core/select.js +1 -0
  146. package/dist/components/core/separator.cjs +1 -0
  147. package/dist/components/core/separator.js +1 -0
  148. package/dist/components/core/skeleton.cjs +1 -0
  149. package/dist/components/core/skeleton.js +1 -0
  150. package/dist/components/core/switch.cjs +1 -0
  151. package/dist/components/core/switch.js +1 -0
  152. package/dist/components/core/table.cjs +1 -0
  153. package/dist/components/core/table.js +1 -0
  154. package/dist/components/core/tabs.cjs +1 -0
  155. package/dist/components/core/tabs.js +1 -0
  156. package/dist/components/core/textarea.cjs +2 -1
  157. package/dist/components/core/textarea.js +2 -1
  158. package/dist/components/core/toast.cjs +1 -0
  159. package/dist/components/core/toast.js +1 -0
  160. package/dist/components/core/tooltip.cjs +1 -0
  161. package/dist/components/core/tooltip.js +1 -0
  162. package/dist/components/marketing/features.cjs +1 -0
  163. package/dist/components/marketing/features.d.cts +1 -1
  164. package/dist/components/marketing/features.d.ts +1 -1
  165. package/dist/components/marketing/features.js +1 -0
  166. package/dist/components/marketing/gallery.cjs +1 -0
  167. package/dist/components/marketing/gallery.js +1 -0
  168. package/dist/components/marketing/hero.cjs +1 -0
  169. package/dist/components/marketing/hero.js +1 -0
  170. package/dist/components/marketing/logo-wall.cjs +1 -0
  171. package/dist/components/marketing/logo-wall.js +1 -0
  172. package/dist/components/marketing/pricing.cjs +1 -0
  173. package/dist/components/marketing/pricing.js +1 -0
  174. package/dist/components/marketing/testimonials.cjs +1 -0
  175. package/dist/components/marketing/testimonials.js +1 -0
  176. package/dist/index.cjs +2 -1
  177. package/dist/index.css +1 -1
  178. package/dist/index.css.map +1 -1
  179. package/dist/index.js +2 -1
  180. package/dist/lib/lazy.cjs +1 -0
  181. package/dist/lib/lazy.d.cts +3 -3
  182. package/dist/lib/lazy.d.ts +3 -3
  183. package/dist/lib/lazy.js +1 -0
  184. package/dist/lib/performance.cjs +1 -0
  185. package/dist/lib/performance.js +1 -0
  186. package/dist/themes/lv-426.css +48 -52
  187. package/dist/themes/mother.css +52 -58
  188. package/dist/themes/nostromo.css +35 -30
  189. package/dist/themes/sulaco.css +47 -51
  190. package/dist/tokens.css +1 -1
  191. package/package.json +31 -4
  192. package/dist/chunk-4WFEVNXW.cjs.map +0 -1
  193. package/dist/chunk-SLGMKBST.js +0 -2
  194. package/dist/chunk-SLGMKBST.js.map +0 -1
@@ -80,34 +80,32 @@
80
80
  --nostromo-color-info-950: 210 100% 5%;
81
81
 
82
82
  /* Semantic Colors */
83
- --nostromo-color-background: hsl(var(--nostromo-color-neutral-50));
84
- --nostromo-color-foreground: hsl(var(--nostromo-color-neutral-900));
85
- --nostromo-color-muted: hsl(var(--nostromo-color-neutral-100));
86
- --nostromo-color-muted-foreground: hsl(var(--nostromo-color-neutral-600));
87
- --nostromo-color-popover: hsl(var(--nostromo-color-neutral-50));
88
- --nostromo-color-popover-foreground: hsl(var(--nostromo-color-neutral-900));
89
- --nostromo-color-card: hsl(var(--nostromo-color-neutral-50));
90
- --nostromo-color-card-foreground: hsl(var(--nostromo-color-neutral-900));
91
- --nostromo-color-border: hsl(var(--nostromo-color-neutral-200));
92
- --nostromo-color-input: hsl(var(--nostromo-color-neutral-200));
83
+ --nostromo-color-background: var(--nostromo-color-neutral-50);
84
+ --nostromo-color-foreground: var(--nostromo-color-neutral-900);
85
+ --nostromo-color-muted: var(--nostromo-color-neutral-100);
86
+ --nostromo-color-muted-foreground: var(--nostromo-color-neutral-600);
87
+ --nostromo-color-popover: var(--nostromo-color-neutral-50);
88
+ --nostromo-color-popover-foreground: var(--nostromo-color-neutral-900);
89
+ --nostromo-color-card: var(--nostromo-color-neutral-50);
90
+ --nostromo-color-card-foreground: var(--nostromo-color-neutral-900);
91
+ --nostromo-color-border: var(--nostromo-color-neutral-200);
92
+ --nostromo-color-input: var(--nostromo-color-neutral-200);
93
93
  /* Contrast validated: primary-foreground/primary 4.52:1 */
94
- --nostromo-color-primary: hsl(var(--nostromo-color-brand-500));
95
- --nostromo-color-primary-foreground: hsl(
96
- 0 0% 100%
97
- ); /* White for better contrast with cyan */
98
- --nostromo-color-secondary: hsl(var(--nostromo-color-neutral-100));
99
- --nostromo-color-secondary-foreground: hsl(var(--nostromo-color-neutral-900));
100
- --nostromo-color-accent: hsl(var(--nostromo-color-brand-100));
101
- --nostromo-color-accent-foreground: hsl(var(--nostromo-color-brand-900));
102
- --nostromo-color-destructive: hsl(var(--nostromo-color-error-500));
103
- --nostromo-color-destructive-foreground: hsl(
104
- var(--nostromo-color-neutral-50)
105
- );
106
- --nostromo-color-success-foreground: hsl(var(--nostromo-color-neutral-50));
107
- --nostromo-color-warning-foreground: hsl(var(--nostromo-color-neutral-900));
108
- --nostromo-color-error-foreground: hsl(var(--nostromo-color-neutral-50));
109
- --nostromo-color-info-foreground: hsl(var(--nostromo-color-neutral-50));
110
- --nostromo-color-ring: hsl(var(--nostromo-color-brand-500));
94
+ --nostromo-color-primary: var(--nostromo-color-brand-500);
95
+ --nostromo-color-primary-foreground: var(
96
+ --nostromo-color-neutral-900
97
+ ); /* Dark: white on this cyan is 2.12:1 */
98
+ --nostromo-color-secondary: var(--nostromo-color-neutral-100);
99
+ --nostromo-color-secondary-foreground: var(--nostromo-color-neutral-900);
100
+ --nostromo-color-accent: var(--nostromo-color-brand-100);
101
+ --nostromo-color-accent-foreground: var(--nostromo-color-brand-900);
102
+ --nostromo-color-destructive: var(--nostromo-color-error-600);
103
+ --nostromo-color-destructive-foreground: var(--nostromo-color-neutral-50);
104
+ --nostromo-color-success-foreground: 0 0% 9%;
105
+ --nostromo-color-warning-foreground: 0 0% 9%;
106
+ --nostromo-color-error-foreground: 0 0% 98%;
107
+ --nostromo-color-info-foreground: 0 0% 9%;
108
+ --nostromo-color-ring: var(--nostromo-color-brand-500);
111
109
 
112
110
  /* Typography */
113
111
  --nostromo-font-sans:
@@ -166,41 +164,37 @@
166
164
  /* Dark mode overrides for Mother theme */
167
165
  /* Contrast validated: All combinations meet WCAG AA */
168
166
  [data-theme="mother"][data-color-scheme="dark"] {
169
- --nostromo-color-background: hsl(var(--nostromo-color-neutral-900));
170
- --nostromo-color-foreground: hsl(var(--nostromo-color-neutral-50));
171
- --nostromo-color-muted: hsl(var(--nostromo-color-neutral-800));
172
- --nostromo-color-muted-foreground: hsl(
173
- 0 0% 38%
174
- ); /* Adjusted for 4.5:1 contrast */
175
- --nostromo-color-popover: hsl(
176
- var(--nostromo-color-neutral-900)
167
+ --nostromo-color-background: var(--nostromo-color-neutral-900);
168
+ --nostromo-color-foreground: var(--nostromo-color-neutral-50);
169
+ --nostromo-color-muted: var(--nostromo-color-neutral-800);
170
+ --nostromo-color-muted-foreground: 0 0% 65%; /* Adjusted for 4.5:1 contrast */
171
+ --nostromo-color-popover: var(
172
+ --nostromo-color-neutral-900
177
173
  ); /* Changed from 800 to 900 for better contrast */
178
- --nostromo-color-popover-foreground: hsl(var(--nostromo-color-neutral-50));
179
- --nostromo-color-card: hsl(
180
- var(--nostromo-color-neutral-900)
174
+ --nostromo-color-popover-foreground: var(--nostromo-color-neutral-50);
175
+ --nostromo-color-card: var(
176
+ --nostromo-color-neutral-900
181
177
  ); /* Changed from 800 to 900 for better contrast */
182
- --nostromo-color-card-foreground: hsl(var(--nostromo-color-neutral-50));
183
- --nostromo-color-border: hsl(var(--nostromo-color-neutral-700));
184
- --nostromo-color-input: hsl(var(--nostromo-color-neutral-700));
185
- --nostromo-color-primary: hsl(
186
- var(--nostromo-color-brand-300)
178
+ --nostromo-color-card-foreground: var(--nostromo-color-neutral-50);
179
+ --nostromo-color-border: var(--nostromo-color-neutral-700);
180
+ --nostromo-color-input: var(--nostromo-color-neutral-700);
181
+ --nostromo-color-primary: var(
182
+ --nostromo-color-brand-300
187
183
  ); /* Lighter for better contrast with dark text */
188
- --nostromo-color-primary-foreground: hsl(var(--nostromo-color-neutral-900));
189
- --nostromo-color-secondary: hsl(
190
- var(--nostromo-color-neutral-900)
184
+ --nostromo-color-primary-foreground: var(--nostromo-color-neutral-900);
185
+ --nostromo-color-secondary: var(
186
+ --nostromo-color-neutral-900
191
187
  ); /* Changed from 700 to 900 for better contrast */
192
- --nostromo-color-secondary-foreground: hsl(var(--nostromo-color-neutral-50));
193
- --nostromo-color-accent: hsl(var(--nostromo-color-brand-800));
194
- --nostromo-color-accent-foreground: hsl(var(--nostromo-color-brand-100));
195
- --nostromo-color-destructive: hsl(var(--nostromo-color-error-400));
196
- --nostromo-color-destructive-foreground: hsl(
197
- var(--nostromo-color-neutral-900)
198
- );
199
- --nostromo-color-success-foreground: hsl(var(--nostromo-color-neutral-50));
200
- --nostromo-color-warning-foreground: hsl(var(--nostromo-color-neutral-900));
201
- --nostromo-color-error-foreground: hsl(var(--nostromo-color-neutral-900));
202
- --nostromo-color-info-foreground: hsl(var(--nostromo-color-neutral-50));
203
- --nostromo-color-ring: hsl(var(--nostromo-color-brand-400));
188
+ --nostromo-color-secondary-foreground: var(--nostromo-color-neutral-50);
189
+ --nostromo-color-accent: var(--nostromo-color-brand-800);
190
+ --nostromo-color-accent-foreground: var(--nostromo-color-brand-100);
191
+ --nostromo-color-destructive: var(--nostromo-color-error-400);
192
+ --nostromo-color-destructive-foreground: var(--nostromo-color-neutral-900);
193
+ --nostromo-color-success-foreground: 0 0% 9%;
194
+ --nostromo-color-warning-foreground: 0 0% 9%;
195
+ --nostromo-color-error-foreground: 0 0% 98%;
196
+ --nostromo-color-info-foreground: 0 0% 9%;
197
+ --nostromo-color-ring: var(--nostromo-color-brand-400);
204
198
  }
205
199
 
206
200
  /* Mother theme specific styles */
@@ -60,7 +60,7 @@
60
60
  --nostromo-color-error-300: 0 84% 70%;
61
61
  --nostromo-color-error-400: 0 84% 60%;
62
62
  --nostromo-color-error-500: 0 84% 60%;
63
- --nostromo-color-error-600: 0 84% 50%;
63
+ --nostromo-color-error-600: 0 84% 48%;
64
64
  --nostromo-color-error-700: 0 84% 40%;
65
65
  --nostromo-color-error-800: 0 84% 30%;
66
66
  --nostromo-color-error-900: 0 84% 20%;
@@ -179,12 +179,12 @@
179
179
  --nostromo-color-secondary-foreground: 0 0% 9%;
180
180
  --nostromo-color-accent: 262 84% 90%;
181
181
  --nostromo-color-accent-foreground: 262 84% 15%;
182
- --nostromo-color-destructive: 0 84% 60%;
182
+ --nostromo-color-destructive: 0 84% 48%;
183
183
  --nostromo-color-destructive-foreground: 0 0% 98%;
184
- --nostromo-color-success-foreground: 0 0% 98%;
184
+ --nostromo-color-success-foreground: 0 0% 9%;
185
185
  --nostromo-color-warning-foreground: 0 0% 9%;
186
186
  --nostromo-color-error-foreground: 0 0% 98%;
187
- --nostromo-color-info-foreground: 0 0% 98%;
187
+ --nostromo-color-info-foreground: 0 0% 9%;
188
188
  --nostromo-color-ring: 262 84% 52%;
189
189
  }
190
190
 
@@ -240,32 +240,36 @@
240
240
  /* Note: Use DIRECT raw HSL values, NOT var() references */
241
241
  --nostromo-color-background: 0 0% 9%; /* Dark background - using neutral-900 value directly */
242
242
  --nostromo-color-foreground: 0 0% 95%; /* Light text on dark background */
243
- --nostromo-color-muted: 0 0% 85%;
244
- --nostromo-color-muted-foreground: 0 0% 65%; /* Adjusted for 4.5:1 contrast with muted (85%) */
245
- --nostromo-color-popover: 0 0% 85%; /* Dark popover background */
243
+ --nostromo-color-muted: 0 0% 20%;
244
+ --nostromo-color-muted-foreground: 0 0% 65%; /* 5.2:1 against muted (20%) */
245
+ --nostromo-color-popover: 0 0% 15%; /* Dark popover background */
246
246
  --nostromo-color-popover-foreground: 0 0% 95%; /* Light text on dark popover */
247
- --nostromo-color-card: 0 0% 85%;
247
+ --nostromo-color-card: 0 0% 15%;
248
248
  --nostromo-color-card-foreground: 0 0% 95%;
249
249
  --nostromo-color-border: 0 0% 75%;
250
250
  --nostromo-color-input: 0 0% 75%;
251
251
  --nostromo-color-primary: 262 84% 60%;
252
- --nostromo-color-primary-foreground: 0 0% 9%; /* Dark text on light primary button */
253
- --nostromo-color-secondary: 0 0% 75%;
252
+ --nostromo-color-primary-foreground: 0 0% 98%;
253
+ --nostromo-color-secondary: 0 0% 20%;
254
254
  --nostromo-color-secondary-foreground: 0 0% 95%;
255
255
  --nostromo-color-accent: 262 84% 25%;
256
256
  --nostromo-color-accent-foreground: 262 84% 90%;
257
- --nostromo-color-destructive: 0 84% 60%;
258
- --nostromo-color-destructive-foreground: 0 0% 9%; /* Dark text on light destructive button */
259
- --nostromo-color-success-foreground: 0 0% 9%; /* Dark text on light success */
260
- --nostromo-color-warning-foreground: 0 0% 95%;
261
- --nostromo-color-error-foreground: 0 0% 9%; /* Dark text on light error */
262
- --nostromo-color-info-foreground: 0 0% 9%; /* Dark text on light info */
257
+ --nostromo-color-destructive: 0 84% 48%;
258
+ --nostromo-color-destructive-foreground: 0 0% 98%;
259
+ --nostromo-color-success-foreground: 0 0% 9%;
260
+ --nostromo-color-warning-foreground: 0 0% 9%;
261
+ --nostromo-color-error-foreground: 0 0% 98%;
262
+ --nostromo-color-info-foreground: 0 0% 9%;
263
263
  --nostromo-color-ring: 262 84% 60%;
264
264
  }
265
265
 
266
266
  /* System Preference Dark Mode */
267
+ /* OS preference acts as the default only. The guard matters: without it this
268
+ * block has the same specificity as the base [data-theme] rule but comes later,
269
+ * so on a dark-OS machine it beat an explicit data-color-scheme="light" and the
270
+ * light scheme could not be selected at all. */
267
271
  @media (prefers-color-scheme: dark) {
268
- [data-theme="nostromo"] {
272
+ [data-theme="nostromo"]:not([data-color-scheme]) {
269
273
  /* Invert neutral colors for dark mode */
270
274
  --nostromo-color-neutral-50: 0 0% 9%;
271
275
  --nostromo-color-neutral-100: 0 0% 15%;
@@ -285,31 +289,32 @@
285
289
  --nostromo-shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.4);
286
290
  --nostromo-shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 0.4);
287
291
 
288
- /* Semantic Colors - Dark mode overrides (system preference) */
292
+ /* Semantic Colors - Dark mode overrides */
293
+ /* Contrast validated: foreground/background 17.18:1, muted-foreground/muted 4.51:1 */
289
294
  /* IMPORTANT: In dark mode, neutral-950 is 98% (light), so we use neutral-900 (95%) for dark background */
290
295
  /* Note: Use DIRECT raw HSL values, NOT var() references */
291
296
  --nostromo-color-background: 0 0% 9%; /* Dark background - using neutral-900 value directly */
292
297
  --nostromo-color-foreground: 0 0% 95%; /* Light text on dark background */
293
- --nostromo-color-muted: 0 0% 85%;
294
- --nostromo-color-muted-foreground: 0 0% 65%; /* Adjusted for 4.5:1 contrast with muted (85%) */
295
- --nostromo-color-popover: 0 0% 85%; /* Dark popover background */
298
+ --nostromo-color-muted: 0 0% 20%;
299
+ --nostromo-color-muted-foreground: 0 0% 65%; /* 5.2:1 against muted (20%) */
300
+ --nostromo-color-popover: 0 0% 15%; /* Dark popover background */
296
301
  --nostromo-color-popover-foreground: 0 0% 95%; /* Light text on dark popover */
297
- --nostromo-color-card: 0 0% 85%;
302
+ --nostromo-color-card: 0 0% 15%;
298
303
  --nostromo-color-card-foreground: 0 0% 95%;
299
304
  --nostromo-color-border: 0 0% 75%;
300
305
  --nostromo-color-input: 0 0% 75%;
301
306
  --nostromo-color-primary: 262 84% 60%;
302
- --nostromo-color-primary-foreground: 0 0% 9%; /* Dark text on light primary button */
303
- --nostromo-color-secondary: 0 0% 75%;
307
+ --nostromo-color-primary-foreground: 0 0% 98%;
308
+ --nostromo-color-secondary: 0 0% 20%;
304
309
  --nostromo-color-secondary-foreground: 0 0% 95%;
305
310
  --nostromo-color-accent: 262 84% 25%;
306
311
  --nostromo-color-accent-foreground: 262 84% 90%;
307
- --nostromo-color-destructive: 0 84% 60%;
308
- --nostromo-color-destructive-foreground: 0 0% 9%; /* Dark text on light destructive button */
309
- --nostromo-color-success-foreground: 0 0% 9%; /* Dark text on light success */
310
- --nostromo-color-warning-foreground: 0 0% 95%;
311
- --nostromo-color-error-foreground: 0 0% 9%; /* Dark text on light error */
312
- --nostromo-color-info-foreground: 0 0% 9%; /* Dark text on light info */
312
+ --nostromo-color-destructive: 0 84% 48%;
313
+ --nostromo-color-destructive-foreground: 0 0% 98%;
314
+ --nostromo-color-success-foreground: 0 0% 9%;
315
+ --nostromo-color-warning-foreground: 0 0% 9%;
316
+ --nostromo-color-error-foreground: 0 0% 98%;
317
+ --nostromo-color-info-foreground: 0 0% 9%;
313
318
  --nostromo-color-ring: 262 84% 60%;
314
319
  }
315
320
  }
@@ -80,34 +80,32 @@
80
80
  --nostromo-color-info-950: 210 100% 5%;
81
81
 
82
82
  /* Semantic Colors */
83
- --nostromo-color-background: hsl(var(--nostromo-color-neutral-50));
84
- --nostromo-color-foreground: hsl(var(--nostromo-color-neutral-900));
85
- --nostromo-color-muted: hsl(var(--nostromo-color-neutral-100));
86
- --nostromo-color-muted-foreground: hsl(var(--nostromo-color-neutral-600));
87
- --nostromo-color-popover: hsl(var(--nostromo-color-neutral-50));
88
- --nostromo-color-popover-foreground: hsl(var(--nostromo-color-neutral-900));
89
- --nostromo-color-card: hsl(var(--nostromo-color-neutral-50));
90
- --nostromo-color-card-foreground: hsl(var(--nostromo-color-neutral-900));
91
- --nostromo-color-border: hsl(var(--nostromo-color-neutral-200));
92
- --nostromo-color-input: hsl(var(--nostromo-color-neutral-200));
83
+ --nostromo-color-background: var(--nostromo-color-neutral-50);
84
+ --nostromo-color-foreground: var(--nostromo-color-neutral-900);
85
+ --nostromo-color-muted: var(--nostromo-color-neutral-100);
86
+ --nostromo-color-muted-foreground: var(--nostromo-color-neutral-600);
87
+ --nostromo-color-popover: var(--nostromo-color-neutral-50);
88
+ --nostromo-color-popover-foreground: var(--nostromo-color-neutral-900);
89
+ --nostromo-color-card: var(--nostromo-color-neutral-50);
90
+ --nostromo-color-card-foreground: var(--nostromo-color-neutral-900);
91
+ --nostromo-color-border: var(--nostromo-color-neutral-200);
92
+ --nostromo-color-input: var(--nostromo-color-neutral-200);
93
93
  /* Contrast validated: primary-foreground/primary 4.52:1 */
94
- --nostromo-color-primary: hsl(var(--nostromo-color-brand-500));
95
- --nostromo-color-primary-foreground: hsl(
96
- 0 0% 100%
94
+ --nostromo-color-primary: var(--nostromo-color-brand-600);
95
+ --nostromo-color-primary-foreground: var(
96
+ --nostromo-color-neutral-50
97
97
  ); /* White for better contrast */
98
- --nostromo-color-secondary: hsl(var(--nostromo-color-neutral-100));
99
- --nostromo-color-secondary-foreground: hsl(var(--nostromo-color-neutral-900));
100
- --nostromo-color-accent: hsl(var(--nostromo-color-brand-100));
101
- --nostromo-color-accent-foreground: hsl(var(--nostromo-color-brand-900));
102
- --nostromo-color-destructive: hsl(var(--nostromo-color-error-500));
103
- --nostromo-color-destructive-foreground: hsl(
104
- var(--nostromo-color-neutral-50)
105
- );
106
- --nostromo-color-success-foreground: hsl(var(--nostromo-color-neutral-50));
107
- --nostromo-color-warning-foreground: hsl(var(--nostromo-color-neutral-900));
108
- --nostromo-color-error-foreground: hsl(var(--nostromo-color-neutral-50));
109
- --nostromo-color-info-foreground: hsl(var(--nostromo-color-neutral-50));
110
- --nostromo-color-ring: hsl(var(--nostromo-color-brand-500));
98
+ --nostromo-color-secondary: var(--nostromo-color-neutral-100);
99
+ --nostromo-color-secondary-foreground: var(--nostromo-color-neutral-900);
100
+ --nostromo-color-accent: var(--nostromo-color-brand-100);
101
+ --nostromo-color-accent-foreground: var(--nostromo-color-brand-900);
102
+ --nostromo-color-destructive: var(--nostromo-color-error-600);
103
+ --nostromo-color-destructive-foreground: var(--nostromo-color-neutral-50);
104
+ --nostromo-color-success-foreground: 0 0% 9%;
105
+ --nostromo-color-warning-foreground: 0 0% 9%;
106
+ --nostromo-color-error-foreground: 0 0% 98%;
107
+ --nostromo-color-info-foreground: 0 0% 9%;
108
+ --nostromo-color-ring: var(--nostromo-color-brand-500);
111
109
 
112
110
  /* Typography */
113
111
  --nostromo-font-sans:
@@ -165,31 +163,29 @@
165
163
 
166
164
  /* Dark mode overrides for Sulaco theme */
167
165
  [data-theme="sulaco"][data-color-scheme="dark"] {
168
- --nostromo-color-background: hsl(var(--nostromo-color-neutral-900));
169
- --nostromo-color-foreground: hsl(var(--nostromo-color-neutral-50));
170
- --nostromo-color-muted: hsl(var(--nostromo-color-neutral-800));
171
- --nostromo-color-muted-foreground: hsl(var(--nostromo-color-neutral-400));
172
- --nostromo-color-popover: hsl(var(--nostromo-color-neutral-800));
173
- --nostromo-color-popover-foreground: hsl(var(--nostromo-color-neutral-50));
174
- --nostromo-color-card: hsl(var(--nostromo-color-neutral-800));
175
- --nostromo-color-card-foreground: hsl(var(--nostromo-color-neutral-50));
176
- --nostromo-color-border: hsl(var(--nostromo-color-neutral-700));
177
- --nostromo-color-input: hsl(var(--nostromo-color-neutral-700));
178
- --nostromo-color-primary: hsl(var(--nostromo-color-brand-400));
179
- --nostromo-color-primary-foreground: hsl(var(--nostromo-color-neutral-900));
180
- --nostromo-color-secondary: hsl(var(--nostromo-color-neutral-700));
181
- --nostromo-color-secondary-foreground: hsl(var(--nostromo-color-neutral-50));
182
- --nostromo-color-accent: hsl(var(--nostromo-color-brand-800));
183
- --nostromo-color-accent-foreground: hsl(var(--nostromo-color-brand-100));
184
- --nostromo-color-destructive: hsl(var(--nostromo-color-error-400));
185
- --nostromo-color-destructive-foreground: hsl(
186
- var(--nostromo-color-neutral-900)
187
- );
188
- --nostromo-color-success-foreground: hsl(var(--nostromo-color-neutral-50));
189
- --nostromo-color-warning-foreground: hsl(var(--nostromo-color-neutral-900));
190
- --nostromo-color-error-foreground: hsl(var(--nostromo-color-neutral-900));
191
- --nostromo-color-info-foreground: hsl(var(--nostromo-color-neutral-50));
192
- --nostromo-color-ring: hsl(var(--nostromo-color-brand-400));
166
+ --nostromo-color-background: var(--nostromo-color-neutral-900);
167
+ --nostromo-color-foreground: var(--nostromo-color-neutral-50);
168
+ --nostromo-color-muted: var(--nostromo-color-neutral-800);
169
+ --nostromo-color-muted-foreground: var(--nostromo-color-neutral-400);
170
+ --nostromo-color-popover: var(--nostromo-color-neutral-800);
171
+ --nostromo-color-popover-foreground: var(--nostromo-color-neutral-50);
172
+ --nostromo-color-card: var(--nostromo-color-neutral-800);
173
+ --nostromo-color-card-foreground: var(--nostromo-color-neutral-50);
174
+ --nostromo-color-border: var(--nostromo-color-neutral-700);
175
+ --nostromo-color-input: var(--nostromo-color-neutral-700);
176
+ --nostromo-color-primary: var(--nostromo-color-brand-400);
177
+ --nostromo-color-primary-foreground: var(--nostromo-color-neutral-900);
178
+ --nostromo-color-secondary: var(--nostromo-color-neutral-700);
179
+ --nostromo-color-secondary-foreground: var(--nostromo-color-neutral-50);
180
+ --nostromo-color-accent: var(--nostromo-color-brand-800);
181
+ --nostromo-color-accent-foreground: var(--nostromo-color-brand-100);
182
+ --nostromo-color-destructive: var(--nostromo-color-error-400);
183
+ --nostromo-color-destructive-foreground: var(--nostromo-color-neutral-900);
184
+ --nostromo-color-success-foreground: 0 0% 9%;
185
+ --nostromo-color-warning-foreground: 0 0% 9%;
186
+ --nostromo-color-error-foreground: 0 0% 98%;
187
+ --nostromo-color-info-foreground: 0 0% 9%;
188
+ --nostromo-color-ring: var(--nostromo-color-brand-400);
193
189
  }
194
190
 
195
191
  /* Sulaco theme specific styles */
package/dist/tokens.css CHANGED
@@ -111,7 +111,7 @@
111
111
  --color-success-foreground: hsl(var(--nostromo-color-success-foreground));
112
112
  --color-warning: hsl(var(--nostromo-color-warning-500));
113
113
  --color-warning-foreground: hsl(var(--nostromo-color-warning-foreground));
114
- --color-error: hsl(var(--nostromo-color-error-500));
114
+ --color-error: hsl(var(--nostromo-color-error-600));
115
115
  --color-error-foreground: hsl(var(--nostromo-color-error-foreground));
116
116
  --color-info: hsl(var(--nostromo-color-info-500));
117
117
  --color-info-foreground: hsl(var(--nostromo-color-info-foreground));
package/package.json CHANGED
@@ -1,7 +1,33 @@
1
1
  {
2
2
  "name": "@jarllyng/nostromo",
3
- "version": "3.1.0",
4
- "description": "Nostromo UI - A Tailwind CSS plugin and React component library",
3
+ "version": "3.2.0",
4
+ "description": "Accessible React component library with CSS-first Tailwind v4 theming",
5
+ "keywords": [
6
+ "react",
7
+ "ui",
8
+ "components",
9
+ "component-library",
10
+ "design-system",
11
+ "tailwind",
12
+ "tailwindcss",
13
+ "tailwind-v4",
14
+ "accessibility",
15
+ "a11y",
16
+ "wcag",
17
+ "radix-ui",
18
+ "typescript"
19
+ ],
20
+ "license": "MIT",
21
+ "author": "Jarl Lyng",
22
+ "homepage": "https://jarllyng.github.io/nostromo-ui/",
23
+ "repository": {
24
+ "type": "git",
25
+ "url": "https://github.com/JarlLyng/nostromo-ui.git",
26
+ "directory": "packages/nostromo"
27
+ },
28
+ "bugs": {
29
+ "url": "https://github.com/JarlLyng/nostromo-ui/issues"
30
+ },
5
31
  "type": "module",
6
32
  "main": "./dist/index.cjs",
7
33
  "module": "./dist/index.js",
@@ -259,8 +285,9 @@
259
285
  "@testing-library/react": "^16.3.2",
260
286
  "@testing-library/user-event": "^14.6.1",
261
287
  "@types/jest-axe": "^3.5.9",
262
- "@types/react": "18.2.0",
263
- "@types/react-dom": "18.2.0",
288
+ "@types/node": "25.0.10",
289
+ "@types/react": "19.2.18",
290
+ "@types/react-dom": "19.2.4",
264
291
  "@typescript-eslint/eslint-plugin": "^8.65.0",
265
292
  "@typescript-eslint/parser": "^8.65.0",
266
293
  "@vitejs/plugin-react": "^5.2.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/core/textarea.tsx"],"names":["textareaVariants","cva","Textarea","e","className","label","helperText","error","required","variant","size","autoResize","id","props","ref","generatedId","textareaId","helperTextId","errorId","textareaVariant","textareaRef","combinedRef","node","adjustHeight","handleInput","event","cn"],"mappings":"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","file":"chunk-4WFEVNXW.cjs","sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\n\nconst textareaVariants = cva(\n \"flex min-h-[80px] w-full rounded-md border border-border bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200\",\n {\n variants: {\n variant: {\n default:\n \"border-border focus-visible:ring-ring focus-visible:ring-offset-background\",\n error:\n \"border-destructive focus-visible:ring-destructive focus-visible:ring-offset-background\",\n success:\n \"border-success focus-visible:ring-success focus-visible:ring-offset-background\",\n },\n size: {\n sm: \"min-h-[60px] px-2 py-1 text-xs\",\n default: \"min-h-[80px] px-3 py-2 text-sm\",\n lg: \"min-h-[120px] px-4 py-3 text-base\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface TextareaProps\n extends\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n VariantProps<typeof textareaVariants> {\n label?: string;\n helperText?: string;\n error?: boolean;\n required?: boolean;\n autoResize?: boolean;\n}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n className,\n label,\n helperText,\n error,\n required,\n variant,\n size,\n autoResize = true,\n id,\n ...props\n },\n ref,\n ) => {\n const generatedId = React.useId();\n const textareaId = id || generatedId;\n const helperTextId = helperText ? `${textareaId}-helper` : undefined;\n const errorId = error ? `${textareaId}-error` : undefined;\n\n const textareaVariant = error ? \"error\" : variant || \"default\";\n\n // Auto-resize functionality\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const combinedRef = React.useMemo(() => {\n return (node: HTMLTextAreaElement | null) => {\n (\n textareaRef as React.MutableRefObject<HTMLTextAreaElement | null>\n ).current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current =\n node;\n }\n };\n }, [ref]);\n\n const adjustHeight = React.useCallback(() => {\n if (textareaRef.current && autoResize) {\n textareaRef.current.style.height = \"auto\";\n textareaRef.current.style.height = `${textareaRef.current.scrollHeight}px`;\n }\n }, [autoResize]);\n\n React.useEffect(() => {\n adjustHeight();\n }, [adjustHeight]);\n\n const handleInput = (event: React.FormEvent<HTMLTextAreaElement>) => {\n adjustHeight();\n if (props.onInput) {\n props.onInput(event);\n }\n };\n\n return (\n <div className=\"space-y-2\">\n {label && (\n <label\n htmlFor={textareaId}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && <span className=\"text-error-500 ml-1\">*</span>}\n </label>\n )}\n <textarea\n ref={combinedRef}\n id={textareaId}\n className={cn(\n textareaVariants({ variant: textareaVariant, size }),\n autoResize && \"resize-none\",\n className,\n )}\n aria-describedby={cn(helperTextId, errorId) || undefined}\n aria-invalid={error}\n aria-required={required}\n onInput={handleInput}\n {...props}\n />\n {helperText && (\n <p\n id={helperTextId}\n className={cn(\n \"text-sm text-muted-foreground\",\n error && \"text-destructive\",\n )}\n >\n {helperText}\n </p>\n )}\n </div>\n );\n },\n);\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea, textareaVariants };\n"]}
@@ -1,2 +0,0 @@
1
- import {a}from'./chunk-AC2JBXHQ.js';import*as e from'react';import {cva}from'class-variance-authority';var H=cva("flex min-h-[80px] w-full rounded-md border border-border bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200",{variants:{variant:{default:"border-border focus-visible:ring-ring focus-visible:ring-offset-background",error:"border-destructive focus-visible:ring-destructive focus-visible:ring-offset-background",success:"border-success focus-visible:ring-success focus-visible:ring-offset-background"},size:{sm:"min-h-[60px] px-2 py-1 text-xs",default:"min-h-[80px] px-3 py-2 text-sm",lg:"min-h-[120px] px-4 py-3 text-base"}},defaultVariants:{variant:"default",size:"default"}}),E=e.forwardRef(({className:x,label:d,helperText:o,error:n,required:f,variant:m,size:p,autoResize:l=true,id:g,...c},t)=>{let v=e.useId(),s=g||v,b=o?`${s}-helper`:void 0,T=n?`${s}-error`:void 0,R=n?"error":m||"default",r=e.useRef(null),h=e.useMemo(()=>a=>{r.current=a,typeof t=="function"?t(a):t&&(t.current=a);},[t]),u=e.useCallback(()=>{r.current&&l&&(r.current.style.height="auto",r.current.style.height=`${r.current.scrollHeight}px`);},[l]);e.useEffect(()=>{u();},[u]);let y=a=>{u(),c.onInput&&c.onInput(a);};return e.createElement("div",{className:"space-y-2"},d&&e.createElement("label",{htmlFor:s,className:"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70"},d,f&&e.createElement("span",{className:"text-error-500 ml-1"},"*")),e.createElement("textarea",{ref:h,id:s,className:a(H({variant:R,size:p}),l&&"resize-none",x),"aria-describedby":a(b,T)||void 0,"aria-invalid":n,"aria-required":f,onInput:y,...c}),o&&e.createElement("p",{id:b,className:a("text-sm text-muted-foreground",n&&"text-destructive")},o))});E.displayName="Textarea";export{H as a,E as b};//# sourceMappingURL=chunk-SLGMKBST.js.map
2
- //# sourceMappingURL=chunk-SLGMKBST.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/core/textarea.tsx"],"names":["textareaVariants","cva","Textarea","className","label","helperText","error","required","variant","size","autoResize","id","props","ref","generatedId","textareaId","helperTextId","errorId","textareaVariant","textareaRef","combinedRef","node","adjustHeight","handleInput","event","cn"],"mappings":"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","file":"chunk-SLGMKBST.js","sourcesContent":["import * as React from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"../../lib/utils\";\n\nconst textareaVariants = cva(\n \"flex min-h-[80px] w-full rounded-md border border-border bg-background px-3 py-2 text-sm ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 transition-all duration-200\",\n {\n variants: {\n variant: {\n default:\n \"border-border focus-visible:ring-ring focus-visible:ring-offset-background\",\n error:\n \"border-destructive focus-visible:ring-destructive focus-visible:ring-offset-background\",\n success:\n \"border-success focus-visible:ring-success focus-visible:ring-offset-background\",\n },\n size: {\n sm: \"min-h-[60px] px-2 py-1 text-xs\",\n default: \"min-h-[80px] px-3 py-2 text-sm\",\n lg: \"min-h-[120px] px-4 py-3 text-base\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface TextareaProps\n extends\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n VariantProps<typeof textareaVariants> {\n label?: string;\n helperText?: string;\n error?: boolean;\n required?: boolean;\n autoResize?: boolean;\n}\n\nconst Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(\n (\n {\n className,\n label,\n helperText,\n error,\n required,\n variant,\n size,\n autoResize = true,\n id,\n ...props\n },\n ref,\n ) => {\n const generatedId = React.useId();\n const textareaId = id || generatedId;\n const helperTextId = helperText ? `${textareaId}-helper` : undefined;\n const errorId = error ? `${textareaId}-error` : undefined;\n\n const textareaVariant = error ? \"error\" : variant || \"default\";\n\n // Auto-resize functionality\n const textareaRef = React.useRef<HTMLTextAreaElement>(null);\n const combinedRef = React.useMemo(() => {\n return (node: HTMLTextAreaElement | null) => {\n (\n textareaRef as React.MutableRefObject<HTMLTextAreaElement | null>\n ).current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n (ref as React.MutableRefObject<HTMLTextAreaElement | null>).current =\n node;\n }\n };\n }, [ref]);\n\n const adjustHeight = React.useCallback(() => {\n if (textareaRef.current && autoResize) {\n textareaRef.current.style.height = \"auto\";\n textareaRef.current.style.height = `${textareaRef.current.scrollHeight}px`;\n }\n }, [autoResize]);\n\n React.useEffect(() => {\n adjustHeight();\n }, [adjustHeight]);\n\n const handleInput = (event: React.FormEvent<HTMLTextAreaElement>) => {\n adjustHeight();\n if (props.onInput) {\n props.onInput(event);\n }\n };\n\n return (\n <div className=\"space-y-2\">\n {label && (\n <label\n htmlFor={textareaId}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n {required && <span className=\"text-error-500 ml-1\">*</span>}\n </label>\n )}\n <textarea\n ref={combinedRef}\n id={textareaId}\n className={cn(\n textareaVariants({ variant: textareaVariant, size }),\n autoResize && \"resize-none\",\n className,\n )}\n aria-describedby={cn(helperTextId, errorId) || undefined}\n aria-invalid={error}\n aria-required={required}\n onInput={handleInput}\n {...props}\n />\n {helperText && (\n <p\n id={helperTextId}\n className={cn(\n \"text-sm text-muted-foreground\",\n error && \"text-destructive\",\n )}\n >\n {helperText}\n </p>\n )}\n </div>\n );\n },\n);\nTextarea.displayName = \"Textarea\";\n\nexport { Textarea, textareaVariants };\n"]}