@neynar/ui 0.2.1 → 0.3.1

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 (547) hide show
  1. package/{llm-docs → .llm}/a.llm.md +2 -16
  2. package/{llm-docs → .llm}/badge.llm.md +16 -21
  3. package/{llm-docs → .llm}/blockquote.llm.md +1 -6
  4. package/.llm/button-group-separator.llm.md +53 -0
  5. package/.llm/button-group-text.llm.md +56 -0
  6. package/.llm/button-group.llm.md +81 -0
  7. package/{llm-docs → .llm}/button.llm.md +1 -1
  8. package/{llm-docs → .llm}/code.llm.md +1 -6
  9. package/.llm/empty-content.llm.md +103 -0
  10. package/.llm/empty-description.llm.md +70 -0
  11. package/.llm/empty-header.llm.md +64 -0
  12. package/.llm/empty-media.llm.md +81 -0
  13. package/.llm/empty-title.llm.md +54 -0
  14. package/.llm/empty.llm.md +158 -0
  15. package/.llm/field-content.llm.md +28 -0
  16. package/.llm/field-description.llm.md +28 -0
  17. package/.llm/field-error.llm.md +41 -0
  18. package/.llm/field-group.llm.md +84 -0
  19. package/.llm/field-label.llm.md +28 -0
  20. package/.llm/field-legend.llm.md +77 -0
  21. package/.llm/field-separator.llm.md +35 -0
  22. package/.llm/field-set.llm.md +80 -0
  23. package/.llm/field-title.llm.md +28 -0
  24. package/.llm/field.llm.md +35 -0
  25. package/{llm-docs → .llm}/h1.llm.md +2 -7
  26. package/{llm-docs → .llm}/h2.llm.md +2 -7
  27. package/{llm-docs → .llm}/h3.llm.md +2 -7
  28. package/{llm-docs → .llm}/h4.llm.md +2 -7
  29. package/{llm-docs → .llm}/h5.llm.md +2 -7
  30. package/{llm-docs → .llm}/h6.llm.md +1 -6
  31. package/.llm/input-group-addon.llm.md +91 -0
  32. package/.llm/input-group-button.llm.md +120 -0
  33. package/.llm/input-group-input.llm.md +145 -0
  34. package/.llm/input-group-text.llm.md +75 -0
  35. package/.llm/input-group-textarea.llm.md +157 -0
  36. package/.llm/input-group.llm.md +108 -0
  37. package/.llm/item-actions.llm.md +77 -0
  38. package/.llm/item-content.llm.md +73 -0
  39. package/.llm/item-description.llm.md +61 -0
  40. package/.llm/item-footer.llm.md +68 -0
  41. package/.llm/item-group.llm.md +73 -0
  42. package/.llm/item-header.llm.md +66 -0
  43. package/.llm/item-media.llm.md +75 -0
  44. package/.llm/item-separator.llm.md +80 -0
  45. package/.llm/item-title.llm.md +59 -0
  46. package/.llm/item.llm.md +115 -0
  47. package/.llm/kbd-group.llm.md +71 -0
  48. package/.llm/kbd.llm.md +71 -0
  49. package/{llm-docs → .llm}/lead.llm.md +1 -6
  50. package/{llm-docs → .llm}/p.llm.md +1 -6
  51. package/{llm-docs → .llm}/sdk-items-registry.json +390 -6
  52. package/{llm-docs → .llm}/small.llm.md +1 -6
  53. package/{llm-docs → .llm}/span.llm.md +2 -16
  54. package/.llm/spinner.llm.md +182 -0
  55. package/{llm-docs → .llm}/strong.llm.md +1 -6
  56. package/{llm-docs → .llm}/typography.llm.md +2 -16
  57. package/dist/components/ui/button-group.d.ts +448 -0
  58. package/dist/components/ui/button-group.d.ts.map +1 -0
  59. package/dist/components/ui/button.d.ts +1 -1
  60. package/dist/components/ui/button.d.ts.map +1 -1
  61. package/dist/components/ui/empty-state.d.ts +1 -0
  62. package/dist/components/ui/empty-state.d.ts.map +1 -1
  63. package/dist/components/ui/empty.d.ts +630 -0
  64. package/dist/components/ui/empty.d.ts.map +1 -0
  65. package/dist/components/ui/field.d.ts +238 -0
  66. package/dist/components/ui/field.d.ts.map +1 -0
  67. package/dist/components/ui/input-group.d.ts +636 -0
  68. package/dist/components/ui/input-group.d.ts.map +1 -0
  69. package/dist/components/ui/item.d.ts +766 -0
  70. package/dist/components/ui/item.d.ts.map +1 -0
  71. package/dist/components/ui/kbd.d.ts +149 -0
  72. package/dist/components/ui/kbd.d.ts.map +1 -0
  73. package/dist/components/ui/scroll-area.d.ts +5 -5
  74. package/dist/components/ui/scroll-area.d.ts.map +1 -1
  75. package/dist/components/ui/spinner.d.ts +194 -0
  76. package/dist/components/ui/spinner.d.ts.map +1 -0
  77. package/dist/components/ui/stack.d.ts.map +1 -1
  78. package/dist/components/ui/stories/accordion.stories.d.ts +0 -1
  79. package/dist/components/ui/stories/accordion.stories.d.ts.map +1 -1
  80. package/dist/components/ui/stories/alert-dialog.stories.d.ts +0 -1
  81. package/dist/components/ui/stories/alert-dialog.stories.d.ts.map +1 -1
  82. package/dist/components/ui/stories/alert.stories.d.ts +0 -1
  83. package/dist/components/ui/stories/alert.stories.d.ts.map +1 -1
  84. package/dist/components/ui/stories/aspect-ratio.stories.d.ts +0 -1
  85. package/dist/components/ui/stories/aspect-ratio.stories.d.ts.map +1 -1
  86. package/dist/components/ui/stories/avatar.stories.d.ts +0 -1
  87. package/dist/components/ui/stories/avatar.stories.d.ts.map +1 -1
  88. package/dist/components/ui/stories/badge.stories.d.ts +0 -1
  89. package/dist/components/ui/stories/badge.stories.d.ts.map +1 -1
  90. package/dist/components/ui/stories/breadcrumb.stories.d.ts +0 -1
  91. package/dist/components/ui/stories/breadcrumb.stories.d.ts.map +1 -1
  92. package/dist/components/ui/stories/button-group.stories.d.ts +48 -0
  93. package/dist/components/ui/stories/button-group.stories.d.ts.map +1 -0
  94. package/dist/components/ui/stories/button.stories.d.ts +0 -1
  95. package/dist/components/ui/stories/button.stories.d.ts.map +1 -1
  96. package/dist/components/ui/stories/calendar.stories.d.ts +0 -1
  97. package/dist/components/ui/stories/calendar.stories.d.ts.map +1 -1
  98. package/dist/components/ui/stories/card.stories.d.ts +0 -1
  99. package/dist/components/ui/stories/card.stories.d.ts.map +1 -1
  100. package/dist/components/ui/stories/carousel.stories.d.ts +0 -1
  101. package/dist/components/ui/stories/carousel.stories.d.ts.map +1 -1
  102. package/dist/components/ui/stories/chart.stories.d.ts +0 -1
  103. package/dist/components/ui/stories/chart.stories.d.ts.map +1 -1
  104. package/dist/components/ui/stories/checkbox.stories.d.ts +0 -1
  105. package/dist/components/ui/stories/checkbox.stories.d.ts.map +1 -1
  106. package/dist/components/ui/stories/cn.stories.d.ts.map +1 -1
  107. package/dist/components/ui/stories/collapsible.stories.d.ts +0 -1
  108. package/dist/components/ui/stories/collapsible.stories.d.ts.map +1 -1
  109. package/dist/components/ui/stories/colors.stories.d.ts +0 -1
  110. package/dist/components/ui/stories/colors.stories.d.ts.map +1 -1
  111. package/dist/components/ui/stories/combobox.stories.d.ts +0 -1
  112. package/dist/components/ui/stories/combobox.stories.d.ts.map +1 -1
  113. package/dist/components/ui/stories/command.stories.d.ts +0 -1
  114. package/dist/components/ui/stories/command.stories.d.ts.map +1 -1
  115. package/dist/components/ui/stories/container.stories.d.ts +0 -1
  116. package/dist/components/ui/stories/container.stories.d.ts.map +1 -1
  117. package/dist/components/ui/stories/context-menu.stories.d.ts +0 -1
  118. package/dist/components/ui/stories/context-menu.stories.d.ts.map +1 -1
  119. package/dist/components/ui/stories/date-picker.stories.d.ts +0 -1
  120. package/dist/components/ui/stories/date-picker.stories.d.ts.map +1 -1
  121. package/dist/components/ui/stories/dialog.stories.d.ts +0 -1
  122. package/dist/components/ui/stories/dialog.stories.d.ts.map +1 -1
  123. package/dist/components/ui/stories/drawer.stories.d.ts +0 -1
  124. package/dist/components/ui/stories/drawer.stories.d.ts.map +1 -1
  125. package/dist/components/ui/stories/dropdown-menu.stories.d.ts +0 -1
  126. package/dist/components/ui/stories/dropdown-menu.stories.d.ts.map +1 -1
  127. package/dist/components/ui/stories/empty-state.stories.d.ts +0 -1
  128. package/dist/components/ui/stories/empty-state.stories.d.ts.map +1 -1
  129. package/dist/components/ui/stories/empty.stories.d.ts +38 -0
  130. package/dist/components/ui/stories/empty.stories.d.ts.map +1 -0
  131. package/dist/components/ui/stories/field.stories.d.ts +48 -0
  132. package/dist/components/ui/stories/field.stories.d.ts.map +1 -0
  133. package/dist/components/ui/stories/hover-card.stories.d.ts +0 -1
  134. package/dist/components/ui/stories/hover-card.stories.d.ts.map +1 -1
  135. package/dist/components/ui/stories/input-group.stories.d.ts +37 -0
  136. package/dist/components/ui/stories/input-group.stories.d.ts.map +1 -0
  137. package/dist/components/ui/stories/input.stories.d.ts +0 -1
  138. package/dist/components/ui/stories/input.stories.d.ts.map +1 -1
  139. package/dist/components/ui/stories/item.stories.d.ts +61 -0
  140. package/dist/components/ui/stories/item.stories.d.ts.map +1 -0
  141. package/dist/components/ui/stories/kbd.stories.d.ts +37 -0
  142. package/dist/components/ui/stories/kbd.stories.d.ts.map +1 -0
  143. package/dist/components/ui/stories/label.stories.d.ts +0 -1
  144. package/dist/components/ui/stories/label.stories.d.ts.map +1 -1
  145. package/dist/components/ui/stories/menubar.stories.d.ts +0 -1
  146. package/dist/components/ui/stories/menubar.stories.d.ts.map +1 -1
  147. package/dist/components/ui/stories/navigation-menu.stories.d.ts +0 -1
  148. package/dist/components/ui/stories/navigation-menu.stories.d.ts.map +1 -1
  149. package/dist/components/ui/stories/pagination.stories.d.ts +0 -1
  150. package/dist/components/ui/stories/pagination.stories.d.ts.map +1 -1
  151. package/dist/components/ui/stories/popover.stories.d.ts +0 -1
  152. package/dist/components/ui/stories/popover.stories.d.ts.map +1 -1
  153. package/dist/components/ui/stories/progress.stories.d.ts +0 -1
  154. package/dist/components/ui/stories/progress.stories.d.ts.map +1 -1
  155. package/dist/components/ui/stories/radio-group.stories.d.ts +0 -1
  156. package/dist/components/ui/stories/radio-group.stories.d.ts.map +1 -1
  157. package/dist/components/ui/stories/resizable.stories.d.ts +0 -1
  158. package/dist/components/ui/stories/resizable.stories.d.ts.map +1 -1
  159. package/dist/components/ui/stories/scroll-area.stories.d.ts +1 -2
  160. package/dist/components/ui/stories/scroll-area.stories.d.ts.map +1 -1
  161. package/dist/components/ui/stories/select.stories.d.ts +0 -1
  162. package/dist/components/ui/stories/select.stories.d.ts.map +1 -1
  163. package/dist/components/ui/stories/separator.stories.d.ts +0 -1
  164. package/dist/components/ui/stories/separator.stories.d.ts.map +1 -1
  165. package/dist/components/ui/stories/sheet.stories.d.ts +0 -1
  166. package/dist/components/ui/stories/sheet.stories.d.ts.map +1 -1
  167. package/dist/components/ui/stories/sidebar.stories.d.ts +0 -1
  168. package/dist/components/ui/stories/sidebar.stories.d.ts.map +1 -1
  169. package/dist/components/ui/stories/skeleton.stories.d.ts +0 -1
  170. package/dist/components/ui/stories/skeleton.stories.d.ts.map +1 -1
  171. package/dist/components/ui/stories/slider.stories.d.ts +0 -1
  172. package/dist/components/ui/stories/slider.stories.d.ts.map +1 -1
  173. package/dist/components/ui/stories/sonner.stories.d.ts.map +1 -1
  174. package/dist/components/ui/stories/spinner.stories.d.ts +37 -0
  175. package/dist/components/ui/stories/spinner.stories.d.ts.map +1 -0
  176. package/dist/components/ui/stories/stack.stories.d.ts +0 -1
  177. package/dist/components/ui/stories/stack.stories.d.ts.map +1 -1
  178. package/dist/components/ui/stories/switch.stories.d.ts +0 -1
  179. package/dist/components/ui/stories/switch.stories.d.ts.map +1 -1
  180. package/dist/components/ui/stories/table.stories.d.ts +0 -1
  181. package/dist/components/ui/stories/table.stories.d.ts.map +1 -1
  182. package/dist/components/ui/stories/tabs.stories.d.ts +0 -1
  183. package/dist/components/ui/stories/tabs.stories.d.ts.map +1 -1
  184. package/dist/components/ui/stories/text-field.stories.d.ts +0 -1
  185. package/dist/components/ui/stories/text-field.stories.d.ts.map +1 -1
  186. package/dist/components/ui/stories/textarea.stories.d.ts +0 -1
  187. package/dist/components/ui/stories/textarea.stories.d.ts.map +1 -1
  188. package/dist/components/ui/stories/theme-toggle.stories.d.ts +0 -1
  189. package/dist/components/ui/stories/theme-toggle.stories.d.ts.map +1 -1
  190. package/dist/components/ui/stories/theme.stories.d.ts +0 -1
  191. package/dist/components/ui/stories/theme.stories.d.ts.map +1 -1
  192. package/dist/components/ui/stories/toggle-group.stories.d.ts +0 -1
  193. package/dist/components/ui/stories/toggle-group.stories.d.ts.map +1 -1
  194. package/dist/components/ui/stories/toggle.stories.d.ts +0 -1
  195. package/dist/components/ui/stories/toggle.stories.d.ts.map +1 -1
  196. package/dist/components/ui/stories/tooltip.stories.d.ts +0 -1
  197. package/dist/components/ui/stories/tooltip.stories.d.ts.map +1 -1
  198. package/dist/components/ui/stories/typography.stories.d.ts +0 -1
  199. package/dist/components/ui/stories/typography.stories.d.ts.map +1 -1
  200. package/dist/components/ui/stories/use-mobile.stories.d.ts.map +1 -1
  201. package/dist/components/ui/stories/use-theme.stories.d.ts.map +1 -1
  202. package/dist/components/ui/theme-toggle.d.ts +0 -3
  203. package/dist/components/ui/theme-toggle.d.ts.map +1 -1
  204. package/dist/components/ui/theme.d.ts.map +1 -1
  205. package/dist/components/ui/typography.d.ts +12 -11
  206. package/dist/components/ui/typography.d.ts.map +1 -1
  207. package/dist/index.d.ts +7 -0
  208. package/dist/index.d.ts.map +1 -1
  209. package/dist/index.js +4973 -2353
  210. package/dist/index.js.map +1 -1
  211. package/dist/tsconfig.tsbuildinfo +1 -1
  212. package/docs/llm/components/display.md +125 -0
  213. package/docs/llm/components/feedback.md +0 -14
  214. package/docs/llm/components/forms.md +94 -0
  215. package/docs/llm/components/layout.md +169 -0
  216. package/llms.txt +18 -12
  217. package/package.json +7 -6
  218. package/src/components/ui/button-group.tsx +525 -0
  219. package/src/components/ui/button.tsx +9 -12
  220. package/src/components/ui/empty-state.tsx +1 -0
  221. package/src/components/ui/empty.tsx +793 -0
  222. package/src/components/ui/field.tsx +494 -0
  223. package/src/components/ui/input-group.tsx +801 -0
  224. package/src/components/ui/item.tsx +955 -0
  225. package/src/components/ui/kbd.tsx +175 -0
  226. package/src/components/ui/skeleton.tsx +1 -1
  227. package/src/components/ui/spinner.tsx +211 -0
  228. package/src/components/ui/stack.tsx +3 -1
  229. package/src/components/ui/stories/accordion.stories.tsx +0 -1
  230. package/src/components/ui/stories/alert-dialog.stories.tsx +0 -1
  231. package/src/components/ui/stories/alert.stories.tsx +0 -1
  232. package/src/components/ui/stories/aspect-ratio.stories.tsx +0 -1
  233. package/src/components/ui/stories/avatar.stories.tsx +0 -1
  234. package/src/components/ui/stories/badge.stories.tsx +0 -1
  235. package/src/components/ui/stories/breadcrumb.stories.tsx +0 -1
  236. package/src/components/ui/stories/button-group.stories.tsx +300 -0
  237. package/src/components/ui/stories/button.stories.tsx +0 -1
  238. package/src/components/ui/stories/calendar.stories.tsx +0 -1
  239. package/src/components/ui/stories/card.stories.tsx +0 -1
  240. package/src/components/ui/stories/carousel.stories.tsx +0 -1
  241. package/src/components/ui/stories/chart.stories.tsx +0 -1
  242. package/src/components/ui/stories/checkbox.stories.tsx +0 -1
  243. package/src/components/ui/stories/cn.stories.tsx +0 -1
  244. package/src/components/ui/stories/collapsible.stories.tsx +0 -1
  245. package/src/components/ui/stories/colors.stories.tsx +0 -1
  246. package/src/components/ui/stories/combobox.stories.tsx +0 -1
  247. package/src/components/ui/stories/command.stories.tsx +0 -1
  248. package/src/components/ui/stories/container.stories.tsx +0 -1
  249. package/src/components/ui/stories/context-menu.stories.tsx +0 -1
  250. package/src/components/ui/stories/date-picker.stories.tsx +0 -1
  251. package/src/components/ui/stories/dialog.stories.tsx +0 -1
  252. package/src/components/ui/stories/drawer.stories.tsx +0 -1
  253. package/src/components/ui/stories/dropdown-menu.stories.tsx +0 -1
  254. package/src/components/ui/stories/empty-state.stories.tsx +0 -1
  255. package/src/components/ui/stories/empty.stories.tsx +293 -0
  256. package/src/components/ui/stories/field.stories.tsx +470 -0
  257. package/src/components/ui/stories/hover-card.stories.tsx +0 -1
  258. package/src/components/ui/stories/input-group.stories.tsx +444 -0
  259. package/src/components/ui/stories/input.stories.tsx +0 -1
  260. package/src/components/ui/stories/item.stories.tsx +601 -0
  261. package/src/components/ui/stories/kbd.stories.tsx +462 -0
  262. package/src/components/ui/stories/label.stories.tsx +0 -1
  263. package/src/components/ui/stories/menubar.stories.tsx +0 -1
  264. package/src/components/ui/stories/navigation-menu.stories.tsx +0 -1
  265. package/src/components/ui/stories/pagination.stories.tsx +0 -1
  266. package/src/components/ui/stories/popover.stories.tsx +0 -1
  267. package/src/components/ui/stories/progress.stories.tsx +0 -1
  268. package/src/components/ui/stories/radio-group.stories.tsx +0 -1
  269. package/src/components/ui/stories/resizable.stories.tsx +0 -1
  270. package/src/components/ui/stories/scroll-area.stories.tsx +0 -1
  271. package/src/components/ui/stories/select.stories.tsx +0 -1
  272. package/src/components/ui/stories/separator.stories.tsx +0 -1
  273. package/src/components/ui/stories/sheet.stories.tsx +0 -1
  274. package/src/components/ui/stories/sidebar.stories.tsx +0 -1
  275. package/src/components/ui/stories/skeleton.stories.tsx +0 -1
  276. package/src/components/ui/stories/slider.stories.tsx +0 -1
  277. package/src/components/ui/stories/sonner.stories.tsx +0 -1
  278. package/src/components/ui/stories/spinner.stories.tsx +356 -0
  279. package/src/components/ui/stories/stack.stories.tsx +0 -1
  280. package/src/components/ui/stories/switch.stories.tsx +0 -1
  281. package/src/components/ui/stories/table.stories.tsx +0 -1
  282. package/src/components/ui/stories/tabs.stories.tsx +0 -1
  283. package/src/components/ui/stories/text-field.stories.tsx +0 -1
  284. package/src/components/ui/stories/textarea.stories.tsx +0 -1
  285. package/src/components/ui/stories/theme-toggle.stories.tsx +0 -1
  286. package/src/components/ui/stories/theme.stories.tsx +0 -1
  287. package/src/components/ui/stories/toggle-group.stories.tsx +0 -1
  288. package/src/components/ui/stories/toggle.stories.tsx +0 -1
  289. package/src/components/ui/stories/tooltip.stories.tsx +0 -1
  290. package/src/components/ui/stories/typography.stories.tsx +5 -2
  291. package/src/components/ui/stories/use-mobile.stories.tsx +0 -1
  292. package/src/components/ui/stories/use-theme.stories.tsx +0 -1
  293. package/src/components/ui/tabs.tsx +1 -1
  294. package/src/components/ui/theme-toggle.tsx +1 -3
  295. package/src/components/ui/theme.tsx +6 -1
  296. package/src/components/ui/typography.tsx +29 -129
  297. package/src/index.ts +7 -0
  298. package/src/styles/globals.css +82 -94
  299. /package/{llm-docs → .llm}/accordion-content.llm.md +0 -0
  300. /package/{llm-docs → .llm}/accordion-item.llm.md +0 -0
  301. /package/{llm-docs → .llm}/accordion-trigger.llm.md +0 -0
  302. /package/{llm-docs → .llm}/accordion.llm.md +0 -0
  303. /package/{llm-docs → .llm}/alert-description.llm.md +0 -0
  304. /package/{llm-docs → .llm}/alert-dialog-action.llm.md +0 -0
  305. /package/{llm-docs → .llm}/alert-dialog-cancel.llm.md +0 -0
  306. /package/{llm-docs → .llm}/alert-dialog-content.llm.md +0 -0
  307. /package/{llm-docs → .llm}/alert-dialog-description.llm.md +0 -0
  308. /package/{llm-docs → .llm}/alert-dialog-footer.llm.md +0 -0
  309. /package/{llm-docs → .llm}/alert-dialog-header.llm.md +0 -0
  310. /package/{llm-docs → .llm}/alert-dialog-overlay.llm.md +0 -0
  311. /package/{llm-docs → .llm}/alert-dialog-portal.llm.md +0 -0
  312. /package/{llm-docs → .llm}/alert-dialog-title.llm.md +0 -0
  313. /package/{llm-docs → .llm}/alert-dialog-trigger.llm.md +0 -0
  314. /package/{llm-docs → .llm}/alert-dialog.llm.md +0 -0
  315. /package/{llm-docs → .llm}/alert-title.llm.md +0 -0
  316. /package/{llm-docs → .llm}/alert.llm.md +0 -0
  317. /package/{llm-docs → .llm}/aspect-ratio.llm.md +0 -0
  318. /package/{llm-docs → .llm}/avatar-fallback.llm.md +0 -0
  319. /package/{llm-docs → .llm}/avatar-image.llm.md +0 -0
  320. /package/{llm-docs → .llm}/avatar.llm.md +0 -0
  321. /package/{llm-docs → .llm}/breadcrumb-ellipsis.llm.md +0 -0
  322. /package/{llm-docs → .llm}/breadcrumb-item.llm.md +0 -0
  323. /package/{llm-docs → .llm}/breadcrumb-link.llm.md +0 -0
  324. /package/{llm-docs → .llm}/breadcrumb-list.llm.md +0 -0
  325. /package/{llm-docs → .llm}/breadcrumb-page.llm.md +0 -0
  326. /package/{llm-docs → .llm}/breadcrumb-separator.llm.md +0 -0
  327. /package/{llm-docs → .llm}/breadcrumb.llm.md +0 -0
  328. /package/{llm-docs → .llm}/calendar-day-button.llm.md +0 -0
  329. /package/{llm-docs → .llm}/calendar.llm.md +0 -0
  330. /package/{llm-docs → .llm}/card-action.llm.md +0 -0
  331. /package/{llm-docs → .llm}/card-content.llm.md +0 -0
  332. /package/{llm-docs → .llm}/card-description.llm.md +0 -0
  333. /package/{llm-docs → .llm}/card-footer.llm.md +0 -0
  334. /package/{llm-docs → .llm}/card-header.llm.md +0 -0
  335. /package/{llm-docs → .llm}/card-title.llm.md +0 -0
  336. /package/{llm-docs → .llm}/card.llm.md +0 -0
  337. /package/{llm-docs → .llm}/carousel-content.llm.md +0 -0
  338. /package/{llm-docs → .llm}/carousel-item.llm.md +0 -0
  339. /package/{llm-docs → .llm}/carousel-next.llm.md +0 -0
  340. /package/{llm-docs → .llm}/carousel-previous.llm.md +0 -0
  341. /package/{llm-docs → .llm}/carousel.llm.md +0 -0
  342. /package/{llm-docs → .llm}/chart-config.llm.md +0 -0
  343. /package/{llm-docs → .llm}/chart-container.llm.md +0 -0
  344. /package/{llm-docs → .llm}/chart-legend-content.llm.md +0 -0
  345. /package/{llm-docs → .llm}/chart-legend.llm.md +0 -0
  346. /package/{llm-docs → .llm}/chart-style.llm.md +0 -0
  347. /package/{llm-docs → .llm}/chart-tooltip-content.llm.md +0 -0
  348. /package/{llm-docs → .llm}/chart-tooltip.llm.md +0 -0
  349. /package/{llm-docs → .llm}/checkbox.llm.md +0 -0
  350. /package/{llm-docs → .llm}/cn.llm.md +0 -0
  351. /package/{llm-docs → .llm}/collapsible-content.llm.md +0 -0
  352. /package/{llm-docs → .llm}/collapsible-trigger.llm.md +0 -0
  353. /package/{llm-docs → .llm}/collapsible.llm.md +0 -0
  354. /package/{llm-docs → .llm}/combobox-option.llm.md +0 -0
  355. /package/{llm-docs → .llm}/combobox.llm.md +0 -0
  356. /package/{llm-docs → .llm}/command-dialog.llm.md +0 -0
  357. /package/{llm-docs → .llm}/command-empty.llm.md +0 -0
  358. /package/{llm-docs → .llm}/command-group.llm.md +0 -0
  359. /package/{llm-docs → .llm}/command-input.llm.md +0 -0
  360. /package/{llm-docs → .llm}/command-item.llm.md +0 -0
  361. /package/{llm-docs → .llm}/command-list.llm.md +0 -0
  362. /package/{llm-docs → .llm}/command-loading.llm.md +0 -0
  363. /package/{llm-docs → .llm}/command-separator.llm.md +0 -0
  364. /package/{llm-docs → .llm}/command-shortcut.llm.md +0 -0
  365. /package/{llm-docs → .llm}/command.llm.md +0 -0
  366. /package/{llm-docs → .llm}/container.llm.md +0 -0
  367. /package/{llm-docs → .llm}/context-menu-checkbox-item.llm.md +0 -0
  368. /package/{llm-docs → .llm}/context-menu-content.llm.md +0 -0
  369. /package/{llm-docs → .llm}/context-menu-group.llm.md +0 -0
  370. /package/{llm-docs → .llm}/context-menu-item.llm.md +0 -0
  371. /package/{llm-docs → .llm}/context-menu-label.llm.md +0 -0
  372. /package/{llm-docs → .llm}/context-menu-portal.llm.md +0 -0
  373. /package/{llm-docs → .llm}/context-menu-radio-group.llm.md +0 -0
  374. /package/{llm-docs → .llm}/context-menu-radio-item.llm.md +0 -0
  375. /package/{llm-docs → .llm}/context-menu-separator.llm.md +0 -0
  376. /package/{llm-docs → .llm}/context-menu-shortcut.llm.md +0 -0
  377. /package/{llm-docs → .llm}/context-menu-sub-content.llm.md +0 -0
  378. /package/{llm-docs → .llm}/context-menu-sub-trigger.llm.md +0 -0
  379. /package/{llm-docs → .llm}/context-menu-sub.llm.md +0 -0
  380. /package/{llm-docs → .llm}/context-menu-trigger.llm.md +0 -0
  381. /package/{llm-docs → .llm}/context-menu.llm.md +0 -0
  382. /package/{llm-docs → .llm}/date-picker.llm.md +0 -0
  383. /package/{llm-docs → .llm}/dialog-close.llm.md +0 -0
  384. /package/{llm-docs → .llm}/dialog-content.llm.md +0 -0
  385. /package/{llm-docs → .llm}/dialog-description.llm.md +0 -0
  386. /package/{llm-docs → .llm}/dialog-footer.llm.md +0 -0
  387. /package/{llm-docs → .llm}/dialog-header.llm.md +0 -0
  388. /package/{llm-docs → .llm}/dialog-overlay.llm.md +0 -0
  389. /package/{llm-docs → .llm}/dialog-portal.llm.md +0 -0
  390. /package/{llm-docs → .llm}/dialog-title.llm.md +0 -0
  391. /package/{llm-docs → .llm}/dialog-trigger.llm.md +0 -0
  392. /package/{llm-docs → .llm}/dialog.llm.md +0 -0
  393. /package/{llm-docs → .llm}/drawer-close.llm.md +0 -0
  394. /package/{llm-docs → .llm}/drawer-content.llm.md +0 -0
  395. /package/{llm-docs → .llm}/drawer-description.llm.md +0 -0
  396. /package/{llm-docs → .llm}/drawer-footer.llm.md +0 -0
  397. /package/{llm-docs → .llm}/drawer-header.llm.md +0 -0
  398. /package/{llm-docs → .llm}/drawer-overlay.llm.md +0 -0
  399. /package/{llm-docs → .llm}/drawer-portal.llm.md +0 -0
  400. /package/{llm-docs → .llm}/drawer-title.llm.md +0 -0
  401. /package/{llm-docs → .llm}/drawer-trigger.llm.md +0 -0
  402. /package/{llm-docs → .llm}/drawer.llm.md +0 -0
  403. /package/{llm-docs → .llm}/dropdown-menu-checkbox-item.llm.md +0 -0
  404. /package/{llm-docs → .llm}/dropdown-menu-content.llm.md +0 -0
  405. /package/{llm-docs → .llm}/dropdown-menu-group.llm.md +0 -0
  406. /package/{llm-docs → .llm}/dropdown-menu-item.llm.md +0 -0
  407. /package/{llm-docs → .llm}/dropdown-menu-label.llm.md +0 -0
  408. /package/{llm-docs → .llm}/dropdown-menu-portal.llm.md +0 -0
  409. /package/{llm-docs → .llm}/dropdown-menu-radio-group.llm.md +0 -0
  410. /package/{llm-docs → .llm}/dropdown-menu-radio-item.llm.md +0 -0
  411. /package/{llm-docs → .llm}/dropdown-menu-separator.llm.md +0 -0
  412. /package/{llm-docs → .llm}/dropdown-menu-shortcut.llm.md +0 -0
  413. /package/{llm-docs → .llm}/dropdown-menu-sub-content.llm.md +0 -0
  414. /package/{llm-docs → .llm}/dropdown-menu-sub-trigger.llm.md +0 -0
  415. /package/{llm-docs → .llm}/dropdown-menu-sub.llm.md +0 -0
  416. /package/{llm-docs → .llm}/dropdown-menu-trigger.llm.md +0 -0
  417. /package/{llm-docs → .llm}/dropdown-menu.llm.md +0 -0
  418. /package/{llm-docs → .llm}/empty-state.llm.md +0 -0
  419. /package/{llm-docs → .llm}/hover-card-content.llm.md +0 -0
  420. /package/{llm-docs → .llm}/hover-card-trigger.llm.md +0 -0
  421. /package/{llm-docs → .llm}/hover-card.llm.md +0 -0
  422. /package/{llm-docs → .llm}/input.llm.md +0 -0
  423. /package/{llm-docs → .llm}/label.llm.md +0 -0
  424. /package/{llm-docs → .llm}/menubar-checkbox-item.llm.md +0 -0
  425. /package/{llm-docs → .llm}/menubar-content.llm.md +0 -0
  426. /package/{llm-docs → .llm}/menubar-group.llm.md +0 -0
  427. /package/{llm-docs → .llm}/menubar-item.llm.md +0 -0
  428. /package/{llm-docs → .llm}/menubar-label.llm.md +0 -0
  429. /package/{llm-docs → .llm}/menubar-menu.llm.md +0 -0
  430. /package/{llm-docs → .llm}/menubar-portal.llm.md +0 -0
  431. /package/{llm-docs → .llm}/menubar-radio-group.llm.md +0 -0
  432. /package/{llm-docs → .llm}/menubar-radio-item.llm.md +0 -0
  433. /package/{llm-docs → .llm}/menubar-separator.llm.md +0 -0
  434. /package/{llm-docs → .llm}/menubar-shortcut.llm.md +0 -0
  435. /package/{llm-docs → .llm}/menubar-sub-content.llm.md +0 -0
  436. /package/{llm-docs → .llm}/menubar-sub-trigger.llm.md +0 -0
  437. /package/{llm-docs → .llm}/menubar-sub.llm.md +0 -0
  438. /package/{llm-docs → .llm}/menubar-trigger.llm.md +0 -0
  439. /package/{llm-docs → .llm}/menubar.llm.md +0 -0
  440. /package/{llm-docs → .llm}/navigation-menu-content.llm.md +0 -0
  441. /package/{llm-docs → .llm}/navigation-menu-indicator.llm.md +0 -0
  442. /package/{llm-docs → .llm}/navigation-menu-item.llm.md +0 -0
  443. /package/{llm-docs → .llm}/navigation-menu-link.llm.md +0 -0
  444. /package/{llm-docs → .llm}/navigation-menu-list.llm.md +0 -0
  445. /package/{llm-docs → .llm}/navigation-menu-trigger-style.llm.md +0 -0
  446. /package/{llm-docs → .llm}/navigation-menu-trigger.llm.md +0 -0
  447. /package/{llm-docs → .llm}/navigation-menu-viewport.llm.md +0 -0
  448. /package/{llm-docs → .llm}/navigation-menu.llm.md +0 -0
  449. /package/{llm-docs → .llm}/pagination-content.llm.md +0 -0
  450. /package/{llm-docs → .llm}/pagination-ellipsis.llm.md +0 -0
  451. /package/{llm-docs → .llm}/pagination-item.llm.md +0 -0
  452. /package/{llm-docs → .llm}/pagination-link.llm.md +0 -0
  453. /package/{llm-docs → .llm}/pagination-next.llm.md +0 -0
  454. /package/{llm-docs → .llm}/pagination-previous.llm.md +0 -0
  455. /package/{llm-docs → .llm}/pagination.llm.md +0 -0
  456. /package/{llm-docs → .llm}/popover-anchor.llm.md +0 -0
  457. /package/{llm-docs → .llm}/popover-content.llm.md +0 -0
  458. /package/{llm-docs → .llm}/popover-trigger.llm.md +0 -0
  459. /package/{llm-docs → .llm}/popover.llm.md +0 -0
  460. /package/{llm-docs → .llm}/progress.llm.md +0 -0
  461. /package/{llm-docs → .llm}/radio-group-indicator.llm.md +0 -0
  462. /package/{llm-docs → .llm}/radio-group-item.llm.md +0 -0
  463. /package/{llm-docs → .llm}/radio-group.llm.md +0 -0
  464. /package/{llm-docs → .llm}/resizable-handle.llm.md +0 -0
  465. /package/{llm-docs → .llm}/resizable-panel-group.llm.md +0 -0
  466. /package/{llm-docs → .llm}/resizable-panel.llm.md +0 -0
  467. /package/{llm-docs → .llm}/scroll-area-corner.llm.md +0 -0
  468. /package/{llm-docs → .llm}/scroll-area-thumb.llm.md +0 -0
  469. /package/{llm-docs → .llm}/scroll-area-viewport.llm.md +0 -0
  470. /package/{llm-docs → .llm}/scroll-area.llm.md +0 -0
  471. /package/{llm-docs → .llm}/scroll-bar.llm.md +0 -0
  472. /package/{llm-docs → .llm}/select-content.llm.md +0 -0
  473. /package/{llm-docs → .llm}/select-group.llm.md +0 -0
  474. /package/{llm-docs → .llm}/select-item.llm.md +0 -0
  475. /package/{llm-docs → .llm}/select-label.llm.md +0 -0
  476. /package/{llm-docs → .llm}/select-scroll-down-button.llm.md +0 -0
  477. /package/{llm-docs → .llm}/select-scroll-up-button.llm.md +0 -0
  478. /package/{llm-docs → .llm}/select-separator.llm.md +0 -0
  479. /package/{llm-docs → .llm}/select-trigger.llm.md +0 -0
  480. /package/{llm-docs → .llm}/select-value.llm.md +0 -0
  481. /package/{llm-docs → .llm}/select.llm.md +0 -0
  482. /package/{llm-docs → .llm}/separator.llm.md +0 -0
  483. /package/{llm-docs → .llm}/sheet-close.llm.md +0 -0
  484. /package/{llm-docs → .llm}/sheet-content.llm.md +0 -0
  485. /package/{llm-docs → .llm}/sheet-description.llm.md +0 -0
  486. /package/{llm-docs → .llm}/sheet-footer.llm.md +0 -0
  487. /package/{llm-docs → .llm}/sheet-header.llm.md +0 -0
  488. /package/{llm-docs → .llm}/sheet-title.llm.md +0 -0
  489. /package/{llm-docs → .llm}/sheet-trigger.llm.md +0 -0
  490. /package/{llm-docs → .llm}/sheet.llm.md +0 -0
  491. /package/{llm-docs → .llm}/sidebar-content.llm.md +0 -0
  492. /package/{llm-docs → .llm}/sidebar-footer.llm.md +0 -0
  493. /package/{llm-docs → .llm}/sidebar-group-action.llm.md +0 -0
  494. /package/{llm-docs → .llm}/sidebar-group-content.llm.md +0 -0
  495. /package/{llm-docs → .llm}/sidebar-group-label.llm.md +0 -0
  496. /package/{llm-docs → .llm}/sidebar-group.llm.md +0 -0
  497. /package/{llm-docs → .llm}/sidebar-header.llm.md +0 -0
  498. /package/{llm-docs → .llm}/sidebar-input.llm.md +0 -0
  499. /package/{llm-docs → .llm}/sidebar-inset.llm.md +0 -0
  500. /package/{llm-docs → .llm}/sidebar-menu-action.llm.md +0 -0
  501. /package/{llm-docs → .llm}/sidebar-menu-badge.llm.md +0 -0
  502. /package/{llm-docs → .llm}/sidebar-menu-button.llm.md +0 -0
  503. /package/{llm-docs → .llm}/sidebar-menu-item.llm.md +0 -0
  504. /package/{llm-docs → .llm}/sidebar-menu-skeleton.llm.md +0 -0
  505. /package/{llm-docs → .llm}/sidebar-menu-sub-button.llm.md +0 -0
  506. /package/{llm-docs → .llm}/sidebar-menu-sub-item.llm.md +0 -0
  507. /package/{llm-docs → .llm}/sidebar-menu-sub.llm.md +0 -0
  508. /package/{llm-docs → .llm}/sidebar-menu.llm.md +0 -0
  509. /package/{llm-docs → .llm}/sidebar-provider.llm.md +0 -0
  510. /package/{llm-docs → .llm}/sidebar-rail.llm.md +0 -0
  511. /package/{llm-docs → .llm}/sidebar-separator.llm.md +0 -0
  512. /package/{llm-docs → .llm}/sidebar-trigger.llm.md +0 -0
  513. /package/{llm-docs → .llm}/sidebar.llm.md +0 -0
  514. /package/{llm-docs → .llm}/skeleton.llm.md +0 -0
  515. /package/{llm-docs → .llm}/slider.llm.md +0 -0
  516. /package/{llm-docs → .llm}/stack.llm.md +0 -0
  517. /package/{llm-docs → .llm}/switch.llm.md +0 -0
  518. /package/{llm-docs → .llm}/table-body.llm.md +0 -0
  519. /package/{llm-docs → .llm}/table-caption.llm.md +0 -0
  520. /package/{llm-docs → .llm}/table-cell.llm.md +0 -0
  521. /package/{llm-docs → .llm}/table-footer.llm.md +0 -0
  522. /package/{llm-docs → .llm}/table-head.llm.md +0 -0
  523. /package/{llm-docs → .llm}/table-header.llm.md +0 -0
  524. /package/{llm-docs → .llm}/table-row.llm.md +0 -0
  525. /package/{llm-docs → .llm}/table.llm.md +0 -0
  526. /package/{llm-docs → .llm}/tabs-content.llm.md +0 -0
  527. /package/{llm-docs → .llm}/tabs-list.llm.md +0 -0
  528. /package/{llm-docs → .llm}/tabs-trigger.llm.md +0 -0
  529. /package/{llm-docs → .llm}/tabs.llm.md +0 -0
  530. /package/{llm-docs → .llm}/text-field.llm.md +0 -0
  531. /package/{llm-docs → .llm}/textarea.llm.md +0 -0
  532. /package/{llm-docs → .llm}/theme-preference.llm.md +0 -0
  533. /package/{llm-docs → .llm}/theme-toggle.llm.md +0 -0
  534. /package/{llm-docs → .llm}/theme.llm.md +0 -0
  535. /package/{llm-docs → .llm}/toast.llm.md +0 -0
  536. /package/{llm-docs → .llm}/toaster.llm.md +0 -0
  537. /package/{llm-docs → .llm}/toggle-group-item.llm.md +0 -0
  538. /package/{llm-docs → .llm}/toggle-group.llm.md +0 -0
  539. /package/{llm-docs → .llm}/toggle.llm.md +0 -0
  540. /package/{llm-docs → .llm}/tooltip-content.llm.md +0 -0
  541. /package/{llm-docs → .llm}/tooltip-provider.llm.md +0 -0
  542. /package/{llm-docs → .llm}/tooltip-trigger.llm.md +0 -0
  543. /package/{llm-docs → .llm}/tooltip.llm.md +0 -0
  544. /package/{llm-docs → .llm}/use-carousel.llm.md +0 -0
  545. /package/{llm-docs → .llm}/use-command-state.llm.md +0 -0
  546. /package/{llm-docs → .llm}/use-is-mobile.llm.md +0 -0
  547. /package/{llm-docs → .llm}/use-sidebar.llm.md +0 -0
@@ -0,0 +1,801 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cva, type VariantProps } from "class-variance-authority"
5
+
6
+ import { cn } from "@/lib/utils"
7
+ import { Button } from "@/components/ui/button"
8
+ import { Input } from "@/components/ui/input"
9
+ import { Textarea } from "@/components/ui/textarea"
10
+
11
+ /**
12
+ * Props for InputGroup component (Documentation only - NOT used in component implementation)
13
+ * These types are for documentation generation and should not replace inferred types
14
+ */
15
+ type InputGroupDocsProps = {
16
+ /** Additional CSS classes for custom styling */
17
+ className?: string;
18
+ /** Child components (InputGroupInput, InputGroupTextarea, InputGroupAddon) */
19
+ children?: React.ReactNode;
20
+ /** Mark the entire input group as disabled with data-disabled="true" */
21
+ "data-disabled"?: "true" | "false";
22
+ } & Omit<React.HTMLAttributes<HTMLDivElement>, "children">;
23
+
24
+ /**
25
+ * InputGroup - Container for inputs with integrated addons, buttons, and text
26
+ *
27
+ * A flexible container component that combines text inputs or textareas with decorative
28
+ * or functional elements like icons, buttons, labels, and keyboard shortcuts. Supports
29
+ * both inline (left/right) and block (top/bottom) addon positioning for diverse layout
30
+ * needs. Provides unified focus states, error handling, and disabled states across all
31
+ * child elements.
32
+ *
33
+ * @example
34
+ * ```tsx
35
+ * // Search input with icon and keyboard shortcut
36
+ * <InputGroup>
37
+ * <InputGroupAddon align="inline-start">
38
+ * <Search className="size-4" />
39
+ * </InputGroupAddon>
40
+ * <InputGroupInput placeholder="Search..." />
41
+ * <InputGroupAddon align="inline-end">
42
+ * <Kbd>⌘K</Kbd>
43
+ * </InputGroupAddon>
44
+ * </InputGroup>
45
+ * ```
46
+ *
47
+ * @example
48
+ * ```tsx
49
+ * // Email subscription form with submit button
50
+ * <InputGroup>
51
+ * <InputGroupAddon align="inline-start">
52
+ * <Mail className="size-4" />
53
+ * </InputGroupAddon>
54
+ * <InputGroupInput type="email" placeholder="Enter your email" />
55
+ * <InputGroupAddon align="inline-end">
56
+ * <InputGroupButton size="sm">Subscribe</InputGroupButton>
57
+ * </InputGroupAddon>
58
+ * </InputGroup>
59
+ * ```
60
+ *
61
+ * @example
62
+ * ```tsx
63
+ * // Price input with currency indicators
64
+ * <InputGroup>
65
+ * <InputGroupAddon align="inline-start">
66
+ * <DollarSign className="size-4" />
67
+ * </InputGroupAddon>
68
+ * <InputGroupInput type="number" placeholder="0.00" />
69
+ * <InputGroupAddon align="inline-end">
70
+ * <InputGroupText>USD</InputGroupText>
71
+ * </InputGroupAddon>
72
+ * </InputGroup>
73
+ * ```
74
+ *
75
+ * @example
76
+ * ```tsx
77
+ * // Comment textarea with block addons
78
+ * <InputGroup>
79
+ * <InputGroupAddon align="block-start">
80
+ * <InputGroupText>Your Comment</InputGroupText>
81
+ * </InputGroupAddon>
82
+ * <InputGroupTextarea placeholder="Write your comment..." rows={4} />
83
+ * <InputGroupAddon align="block-end">
84
+ * <InputGroupButton size="sm">
85
+ * <Send className="size-4" />
86
+ * Post
87
+ * </InputGroupButton>
88
+ * </InputGroupAddon>
89
+ * </InputGroup>
90
+ * ```
91
+ *
92
+ * @example
93
+ * ```tsx
94
+ * // Error state with aria-invalid
95
+ * <InputGroup>
96
+ * <InputGroupAddon align="inline-start">
97
+ * <Mail className="size-4" />
98
+ * </InputGroupAddon>
99
+ * <InputGroupInput
100
+ * type="email"
101
+ * placeholder="Email"
102
+ * aria-invalid="true"
103
+ * defaultValue="invalid-email"
104
+ * />
105
+ * </InputGroup>
106
+ * ```
107
+ *
108
+ * @accessibility
109
+ * - Container uses role="group" to associate related form elements
110
+ * - Focus states are unified across the input and all addons with visible ring
111
+ * - Error states automatically style container with destructive colors when aria-invalid="true"
112
+ * - Disabled state propagates to all children via data-disabled attribute
113
+ * - Click on addons automatically focuses the input for better UX
114
+ * - Keyboard navigation works naturally with native input focus behavior
115
+ *
116
+ * @see {@link InputGroupInput} Text input element within the group
117
+ * @see {@link InputGroupTextarea} Textarea element within the group
118
+ * @see {@link InputGroupAddon} Container for icons, text, buttons, or labels
119
+ * @see {@link InputGroupButton} Action button within an addon
120
+ * @see {@link InputGroupText} Static text or labels within an addon
121
+ * @since 1.0.0
122
+ */
123
+ function InputGroup({ className, ...props }: React.ComponentProps<"div">) {
124
+ return (
125
+ <div
126
+ data-slot="input-group"
127
+ role="group"
128
+ className={cn(
129
+ "group/input-group border-input dark:bg-input/30 relative flex w-full items-center rounded-md border shadow-xs transition-[color,box-shadow] outline-none",
130
+ "h-9 min-w-0 has-[>textarea]:h-auto",
131
+
132
+ // Variants based on alignment.
133
+ "has-[>[data-align=inline-start]]:[&>input]:pl-2",
134
+ "has-[>[data-align=inline-end]]:[&>input]:pr-2",
135
+ "has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>[data-align=block-start]]:[&>input]:pb-3",
136
+ "has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-end]]:[&>input]:pt-3",
137
+
138
+ // Focus state.
139
+ "has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot=input-group-control]:focus-visible]:ring-[3px]",
140
+
141
+ // Error state.
142
+ "has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[[data-slot][aria-invalid=true]]:border-destructive dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40",
143
+
144
+ className
145
+ )}
146
+ {...props}
147
+ />
148
+ )
149
+ }
150
+
151
+ /**
152
+ * InputGroupAddon variant configuration for positioning addons around inputs
153
+ * @variant inline-start - Position addon to the left of the input (default)
154
+ * @variant inline-end - Position addon to the right of the input
155
+ * @variant block-start - Position addon above the input (full width)
156
+ * @variant block-end - Position addon below the input (full width)
157
+ */
158
+ const inputGroupAddonVariants = cva(
159
+ "text-muted-foreground flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-sm font-medium select-none [&>svg:not([class*='size-'])]:size-4 [&>kbd]:rounded-[calc(var(--radius)-5px)] group-data-[disabled=true]/input-group:opacity-50",
160
+ {
161
+ variants: {
162
+ align: {
163
+ "inline-start":
164
+ "order-first pl-3 has-[>button]:ml-[-0.45rem] has-[>kbd]:ml-[-0.35rem]",
165
+ "inline-end":
166
+ "order-last pr-3 has-[>button]:mr-[-0.45rem] has-[>kbd]:mr-[-0.35rem]",
167
+ "block-start":
168
+ "order-first w-full justify-start px-3 pt-3 [.border-b]:pb-3 group-has-[>input]/input-group:pt-2.5",
169
+ "block-end":
170
+ "order-last w-full justify-start px-3 pb-3 [.border-t]:pt-3 group-has-[>input]/input-group:pb-2.5",
171
+ },
172
+ },
173
+ defaultVariants: {
174
+ align: "inline-start",
175
+ },
176
+ }
177
+ )
178
+
179
+ /**
180
+ * Props for InputGroupAddon component (Documentation only - NOT used in component implementation)
181
+ * These types are for documentation generation and should not replace CVA inferred types
182
+ */
183
+ type InputGroupAddonDocsProps = {
184
+ /** Position of the addon relative to the input element @default "inline-start" */
185
+ align?: "inline-start" | "inline-end" | "block-start" | "block-end";
186
+ /** Additional CSS classes for custom styling */
187
+ className?: string;
188
+ /** Child content (InputGroupText, InputGroupButton, icons, Kbd, etc.) */
189
+ children?: React.ReactNode;
190
+ } & Omit<React.HTMLAttributes<HTMLDivElement>, "children">;
191
+
192
+ /**
193
+ * InputGroupAddon - Container for icons, buttons, text, or labels within an InputGroup
194
+ *
195
+ * A flexible addon container that can be positioned at any edge of the input (left, right,
196
+ * top, or bottom). Automatically adjusts layout and spacing based on alignment. Clicking
197
+ * the addon area focuses the associated input for improved usability. Supports icons,
198
+ * static text, buttons, keyboard shortcuts (Kbd), and custom content.
199
+ *
200
+ * @example
201
+ * ```tsx
202
+ * // Icon addon on the left (inline-start)
203
+ * <InputGroup>
204
+ * <InputGroupAddon align="inline-start">
205
+ * <Search className="size-4" />
206
+ * </InputGroupAddon>
207
+ * <InputGroupInput placeholder="Search..." />
208
+ * </InputGroup>
209
+ * ```
210
+ *
211
+ * @example
212
+ * ```tsx
213
+ * // Text suffix on the right (inline-end)
214
+ * <InputGroup>
215
+ * <InputGroupInput placeholder="Enter amount" />
216
+ * <InputGroupAddon align="inline-end">
217
+ * <InputGroupText>USD</InputGroupText>
218
+ * </InputGroupAddon>
219
+ * </InputGroup>
220
+ * ```
221
+ *
222
+ * @example
223
+ * ```tsx
224
+ * // Button addon for action
225
+ * <InputGroup>
226
+ * <InputGroupInput placeholder="Enter coupon code" />
227
+ * <InputGroupAddon align="inline-end">
228
+ * <InputGroupButton size="sm">Apply</InputGroupButton>
229
+ * </InputGroupAddon>
230
+ * </InputGroup>
231
+ * ```
232
+ *
233
+ * @example
234
+ * ```tsx
235
+ * // Keyboard shortcut indicator
236
+ * <InputGroup>
237
+ * <InputGroupInput placeholder="Quick search" />
238
+ * <InputGroupAddon align="inline-end">
239
+ * <Kbd>⌘K</Kbd>
240
+ * </InputGroupAddon>
241
+ * </InputGroup>
242
+ * ```
243
+ *
244
+ * @example
245
+ * ```tsx
246
+ * // Block addon with multiple elements (top position)
247
+ * <InputGroup>
248
+ * <InputGroupAddon align="block-start">
249
+ * <InputGroupText>Message</InputGroupText>
250
+ * <InputGroupButton size="icon-xs">
251
+ * <X className="size-4" />
252
+ * </InputGroupButton>
253
+ * </InputGroupAddon>
254
+ * <InputGroupTextarea placeholder="Type your message..." />
255
+ * </InputGroup>
256
+ * ```
257
+ *
258
+ * @accessibility
259
+ * - Uses role="group" to semantically group addon content
260
+ * - Clicking addon focuses the input (unless clicking a button)
261
+ * - Icons automatically sized with [&>svg:not([class*='size-'])]:size-4
262
+ * - Respects disabled state from parent InputGroup
263
+ * - Keyboard shortcuts (Kbd) properly styled and positioned
264
+ *
265
+ * @see {@link InputGroupText} For static text within the addon
266
+ * @see {@link InputGroupButton} For action buttons within the addon
267
+ * @since 1.0.0
268
+ */
269
+ function InputGroupAddon({
270
+ className,
271
+ align = "inline-start",
272
+ ...props
273
+ }: React.ComponentProps<"div"> & VariantProps<typeof inputGroupAddonVariants>) {
274
+ return (
275
+ <div
276
+ role="group"
277
+ data-slot="input-group-addon"
278
+ data-align={align}
279
+ className={cn(inputGroupAddonVariants({ align }), className)}
280
+ onClick={(e) => {
281
+ if ((e.target as HTMLElement).closest("button")) {
282
+ return
283
+ }
284
+ e.currentTarget.parentElement?.querySelector("input")?.focus()
285
+ }}
286
+ {...props}
287
+ />
288
+ )
289
+ }
290
+
291
+ /**
292
+ * InputGroupButton variant configuration for sizing buttons within addons
293
+ * @variant xs - Extra small button height (24px) for compact inline addons (default)
294
+ * @variant sm - Small button height (32px) for standard inline or block addons
295
+ * @variant icon-xs - Extra small icon-only button (24x24px) for compact addons
296
+ * @variant icon-sm - Small icon-only button (32x32px) for standard addons
297
+ */
298
+ const inputGroupButtonVariants = cva(
299
+ "text-sm shadow-none flex gap-2 items-center",
300
+ {
301
+ variants: {
302
+ size: {
303
+ xs: "h-6 gap-1 px-2 rounded-[calc(var(--radius)-5px)] [&>svg:not([class*='size-'])]:size-3.5 has-[>svg]:px-2",
304
+ sm: "h-8 px-2.5 gap-1.5 rounded-md has-[>svg]:px-2.5",
305
+ "icon-xs":
306
+ "size-6 rounded-[calc(var(--radius)-5px)] p-0 has-[>svg]:p-0",
307
+ "icon-sm": "size-8 p-0 has-[>svg]:p-0",
308
+ },
309
+ },
310
+ defaultVariants: {
311
+ size: "xs",
312
+ },
313
+ }
314
+ )
315
+
316
+ /**
317
+ * Props for InputGroupButton component (Documentation only - NOT used in component implementation)
318
+ * These types are for documentation generation and should not replace CVA inferred types
319
+ */
320
+ type InputGroupButtonDocsProps = {
321
+ /** Button size variant optimized for input group layout @default "xs" */
322
+ size?: "xs" | "sm" | "icon-xs" | "icon-sm";
323
+ /** Button variant from Button component @default "ghost" */
324
+ variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link";
325
+ /** Button type attribute @default "button" */
326
+ type?: "button" | "submit" | "reset";
327
+ /** Additional CSS classes for custom styling */
328
+ className?: string;
329
+ /** Button content (text, icons, or both) */
330
+ children?: React.ReactNode;
331
+ /** Click handler for the button action */
332
+ onClick?: React.MouseEventHandler<HTMLButtonElement>;
333
+ /** Whether the button is disabled */
334
+ disabled?: boolean;
335
+ } & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type" | "size">;
336
+
337
+ /**
338
+ * InputGroupButton - Action button within an InputGroupAddon
339
+ *
340
+ * A specialized button component optimized for use within input group addons. Styled with
341
+ * reduced shadows and compact sizing to integrate seamlessly with the input group container.
342
+ * Supports text buttons, icon buttons, and combination buttons with various size options.
343
+ * Uses ghost variant by default for subtle integration with the input group.
344
+ *
345
+ * @example
346
+ * ```tsx
347
+ * // Text button for action
348
+ * <InputGroup>
349
+ * <InputGroupInput placeholder="Enter coupon code" />
350
+ * <InputGroupAddon align="inline-end">
351
+ * <InputGroupButton size="sm">Apply</InputGroupButton>
352
+ * </InputGroupAddon>
353
+ * </InputGroup>
354
+ * ```
355
+ *
356
+ * @example
357
+ * ```tsx
358
+ * // Icon-only button for compact actions
359
+ * <InputGroup>
360
+ * <InputGroupInput readOnly value="API Key: sk_live_123..." />
361
+ * <InputGroupAddon align="inline-end">
362
+ * <InputGroupButton size="icon-xs">
363
+ * <Copy className="size-4" />
364
+ * </InputGroupButton>
365
+ * </InputGroupAddon>
366
+ * </InputGroup>
367
+ * ```
368
+ *
369
+ * @example
370
+ * ```tsx
371
+ * // Button with icon and text
372
+ * <InputGroup>
373
+ * <InputGroupInput type="email" placeholder="Enter email" />
374
+ * <InputGroupAddon align="inline-end">
375
+ * <InputGroupButton size="sm">
376
+ * <Send className="size-4" />
377
+ * Subscribe
378
+ * </InputGroupButton>
379
+ * </InputGroupAddon>
380
+ * </InputGroup>
381
+ * ```
382
+ *
383
+ * @example
384
+ * ```tsx
385
+ * // Submit button in block addon
386
+ * <InputGroup>
387
+ * <InputGroupTextarea placeholder="Write your message..." />
388
+ * <InputGroupAddon align="block-end">
389
+ * <InputGroupButton size="sm" variant="default" type="submit">
390
+ * Post Comment
391
+ * </InputGroupButton>
392
+ * </InputGroupAddon>
393
+ * </InputGroup>
394
+ * ```
395
+ *
396
+ * @example
397
+ * ```tsx
398
+ * // Multiple buttons with different variants
399
+ * <InputGroup>
400
+ * <InputGroupTextarea placeholder="Compose..." />
401
+ * <InputGroupAddon align="block-end">
402
+ * <InputGroupButton size="sm" variant="outline">Cancel</InputGroupButton>
403
+ * <InputGroupButton size="sm" variant="default">Send</InputGroupButton>
404
+ * </InputGroupAddon>
405
+ * </InputGroup>
406
+ * ```
407
+ *
408
+ * @accessibility
409
+ * - Inherits all Button accessibility features
410
+ * - Default type="button" prevents accidental form submission
411
+ * - Keyboard accessible with Enter and Space activation
412
+ * - Focus visible with proper focus ring styling
413
+ * - Disabled state properly communicated to assistive technologies
414
+ *
415
+ * @see {@link Button} Base button component with full variant options
416
+ * @see {@link InputGroupAddon} Container for this button
417
+ * @since 1.0.0
418
+ */
419
+ function InputGroupButton({
420
+ className,
421
+ type = "button",
422
+ variant = "ghost",
423
+ size = "xs",
424
+ ...props
425
+ }: Omit<React.ComponentProps<typeof Button>, "size"> &
426
+ VariantProps<typeof inputGroupButtonVariants>) {
427
+ return (
428
+ <Button
429
+ type={type}
430
+ data-size={size}
431
+ variant={variant}
432
+ className={cn(inputGroupButtonVariants({ size }), className)}
433
+ {...props}
434
+ />
435
+ )
436
+ }
437
+
438
+ /**
439
+ * Props for InputGroupText component (Documentation only - NOT used in component implementation)
440
+ * These types are for documentation generation and should not replace inferred types
441
+ */
442
+ type InputGroupTextDocsProps = {
443
+ /** Additional CSS classes for custom styling */
444
+ className?: string;
445
+ /** Text content, icons, or other inline elements */
446
+ children?: React.ReactNode;
447
+ } & React.HTMLAttributes<HTMLSpanElement>;
448
+
449
+ /**
450
+ * InputGroupText - Static text or label content within an InputGroupAddon
451
+ *
452
+ * A span element for displaying non-interactive text, labels, prefixes, suffixes, or icons
453
+ * within an input group addon. Styled with muted foreground colors and optimized spacing.
454
+ * Commonly used for currency symbols, units of measurement, URL protocols, or descriptive labels.
455
+ *
456
+ * @example
457
+ * ```tsx
458
+ * // Currency symbol prefix
459
+ * <InputGroup>
460
+ * <InputGroupAddon align="inline-start">
461
+ * <DollarSign className="size-4" />
462
+ * </InputGroupAddon>
463
+ * <InputGroupInput type="number" placeholder="0.00" />
464
+ * <InputGroupAddon align="inline-end">
465
+ * <InputGroupText>USD</InputGroupText>
466
+ * </InputGroupAddon>
467
+ * </InputGroup>
468
+ * ```
469
+ *
470
+ * @example
471
+ * ```tsx
472
+ * // URL protocol prefix
473
+ * <InputGroup>
474
+ * <InputGroupAddon align="inline-start">
475
+ * <InputGroupText>https://</InputGroupText>
476
+ * </InputGroupAddon>
477
+ * <InputGroupInput placeholder="example.com" />
478
+ * </InputGroup>
479
+ * ```
480
+ *
481
+ * @example
482
+ * ```tsx
483
+ * // Label for textarea
484
+ * <InputGroup>
485
+ * <InputGroupAddon align="block-start">
486
+ * <InputGroupText>Message</InputGroupText>
487
+ * </InputGroupAddon>
488
+ * <InputGroupTextarea placeholder="Type your message..." />
489
+ * </InputGroup>
490
+ * ```
491
+ *
492
+ * @example
493
+ * ```tsx
494
+ * // Character counter
495
+ * <InputGroup>
496
+ * <InputGroupTextarea placeholder="Comment..." />
497
+ * <InputGroupAddon align="block-end">
498
+ * <InputGroupText className="text-xs">250 characters</InputGroupText>
499
+ * </InputGroupAddon>
500
+ * </InputGroup>
501
+ * ```
502
+ *
503
+ * @accessibility
504
+ * - Non-interactive element that provides context to the input
505
+ * - Icons within are marked as pointer-events-none
506
+ * - Muted color indicates non-interactive nature
507
+ * - Can be used with aria-label on parent input for better screen reader support
508
+ *
509
+ * @see {@link InputGroupAddon} Container for this text element
510
+ * @since 1.0.0
511
+ */
512
+ function InputGroupText({ className, ...props }: React.ComponentProps<"span">) {
513
+ return (
514
+ <span
515
+ className={cn(
516
+ "text-muted-foreground flex items-center gap-2 text-sm [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4",
517
+ className
518
+ )}
519
+ {...props}
520
+ />
521
+ )
522
+ }
523
+
524
+ /**
525
+ * Props for InputGroupInput component (Documentation only - NOT used in component implementation)
526
+ * These types are for documentation generation and should not replace inferred types
527
+ */
528
+ type InputGroupInputDocsProps = {
529
+ /** Additional CSS classes for custom styling */
530
+ className?: string;
531
+ /** Input placeholder text */
532
+ placeholder?: string;
533
+ /** Input type (text, email, number, password, etc.) @default "text" */
534
+ type?: React.HTMLInputTypeAttribute;
535
+ /** Input value (controlled component) */
536
+ value?: string | number;
537
+ /** Default value (uncontrolled component) */
538
+ defaultValue?: string | number;
539
+ /** Change handler for controlled inputs */
540
+ onChange?: React.ChangeEventHandler<HTMLInputElement>;
541
+ /** Whether the input is disabled */
542
+ disabled?: boolean;
543
+ /** Whether the input is read-only */
544
+ readOnly?: boolean;
545
+ /** Marks the input as invalid for error state styling */
546
+ "aria-invalid"?: boolean | "true" | "false";
547
+ /** Name attribute for form submission */
548
+ name?: string;
549
+ /** ID for label association */
550
+ id?: string;
551
+ /** Whether the field is required */
552
+ required?: boolean;
553
+ } & Omit<React.InputHTMLAttributes<HTMLInputElement>, "type">;
554
+
555
+ /**
556
+ * InputGroupInput - Text input element within an InputGroup
557
+ *
558
+ * A styled input component designed to work seamlessly within an InputGroup container.
559
+ * Inherits all standard HTML input props and removes default borders, shadows, and focus
560
+ * rings since the parent InputGroup handles visual states. Automatically flexes to fill
561
+ * available space between addons.
562
+ *
563
+ * @example
564
+ * ```tsx
565
+ * // Basic text input with icon
566
+ * <InputGroup>
567
+ * <InputGroupAddon align="inline-start">
568
+ * <Search className="size-4" />
569
+ * </InputGroupAddon>
570
+ * <InputGroupInput placeholder="Search..." />
571
+ * </InputGroup>
572
+ * ```
573
+ *
574
+ * @example
575
+ * ```tsx
576
+ * // Email input with validation
577
+ * <InputGroup>
578
+ * <InputGroupAddon align="inline-start">
579
+ * <Mail className="size-4" />
580
+ * </InputGroupAddon>
581
+ * <InputGroupInput
582
+ * type="email"
583
+ * placeholder="you@example.com"
584
+ * required
585
+ * aria-invalid={!isValid}
586
+ * />
587
+ * </InputGroup>
588
+ * ```
589
+ *
590
+ * @example
591
+ * ```tsx
592
+ * // Controlled number input
593
+ * const [amount, setAmount] = useState("");
594
+ * <InputGroup>
595
+ * <InputGroupAddon align="inline-start">
596
+ * <DollarSign className="size-4" />
597
+ * </InputGroupAddon>
598
+ * <InputGroupInput
599
+ * type="number"
600
+ * placeholder="0.00"
601
+ * value={amount}
602
+ * onChange={(e) => setAmount(e.target.value)}
603
+ * />
604
+ * <InputGroupAddon align="inline-end">
605
+ * <InputGroupText>USD</InputGroupText>
606
+ * </InputGroupAddon>
607
+ * </InputGroup>
608
+ * ```
609
+ *
610
+ * @example
611
+ * ```tsx
612
+ * // Read-only input for displaying values
613
+ * <InputGroup>
614
+ * <InputGroupInput
615
+ * readOnly
616
+ * value="API Key: sk_live_123456789"
617
+ * />
618
+ * <InputGroupAddon align="inline-end">
619
+ * <InputGroupButton size="icon-xs">
620
+ * <Copy className="size-4" />
621
+ * </InputGroupButton>
622
+ * </InputGroupAddon>
623
+ * </InputGroup>
624
+ * ```
625
+ *
626
+ * @accessibility
627
+ * - Inherits all native HTML input accessibility features
628
+ * - Focus management handled by parent InputGroup with visible focus ring
629
+ * - Error states indicated via aria-invalid attribute
630
+ * - Properly associates with labels using id and htmlFor
631
+ * - Keyboard accessible with standard input navigation
632
+ * - Supports all ARIA attributes for enhanced accessibility
633
+ *
634
+ * @see {@link Input} Base input component
635
+ * @see {@link InputGroup} Parent container component
636
+ * @since 1.0.0
637
+ */
638
+ function InputGroupInput({
639
+ className,
640
+ ...props
641
+ }: React.ComponentProps<"input">) {
642
+ return (
643
+ <Input
644
+ data-slot="input-group-control"
645
+ className={cn(
646
+ "flex-1 rounded-none border-0 bg-transparent shadow-none focus-visible:ring-0 dark:bg-transparent",
647
+ className
648
+ )}
649
+ {...props}
650
+ />
651
+ )
652
+ }
653
+
654
+ /**
655
+ * Props for InputGroupTextarea component (Documentation only - NOT used in component implementation)
656
+ * These types are for documentation generation and should not replace inferred types
657
+ */
658
+ type InputGroupTextareaDocsProps = {
659
+ /** Additional CSS classes for custom styling */
660
+ className?: string;
661
+ /** Textarea placeholder text */
662
+ placeholder?: string;
663
+ /** Number of visible text rows @default 3 */
664
+ rows?: number;
665
+ /** Textarea value (controlled component) */
666
+ value?: string;
667
+ /** Default value (uncontrolled component) */
668
+ defaultValue?: string;
669
+ /** Change handler for controlled textareas */
670
+ onChange?: React.ChangeEventHandler<HTMLTextAreaElement>;
671
+ /** Whether the textarea is disabled */
672
+ disabled?: boolean;
673
+ /** Whether the textarea is read-only */
674
+ readOnly?: boolean;
675
+ /** Marks the textarea as invalid for error state styling */
676
+ "aria-invalid"?: boolean | "true" | "false";
677
+ /** Name attribute for form submission */
678
+ name?: string;
679
+ /** ID for label association */
680
+ id?: string;
681
+ /** Whether the field is required */
682
+ required?: boolean;
683
+ /** Maximum character length */
684
+ maxLength?: number;
685
+ } & React.TextareaHTMLAttributes<HTMLTextAreaElement>;
686
+
687
+ /**
688
+ * InputGroupTextarea - Multi-line textarea element within an InputGroup
689
+ *
690
+ * A styled textarea component designed to work with InputGroup, especially with block-aligned
691
+ * addons (top/bottom positioning). Removes default borders and shadows as the parent InputGroup
692
+ * handles visual states. Resizing is disabled by default to maintain consistent layout with
693
+ * the container. Automatically flexes to fill available space.
694
+ *
695
+ * @example
696
+ * ```tsx
697
+ * // Basic textarea with label addon
698
+ * <InputGroup>
699
+ * <InputGroupAddon align="block-start">
700
+ * <InputGroupText>Message</InputGroupText>
701
+ * </InputGroupAddon>
702
+ * <InputGroupTextarea placeholder="Type your message here..." />
703
+ * </InputGroup>
704
+ * ```
705
+ *
706
+ * @example
707
+ * ```tsx
708
+ * // Textarea with submit button below
709
+ * <InputGroup>
710
+ * <InputGroupTextarea placeholder="Write your comment..." rows={4} />
711
+ * <InputGroupAddon align="block-end">
712
+ * <InputGroupButton size="sm">
713
+ * <Send className="size-4" />
714
+ * Post
715
+ * </InputGroupButton>
716
+ * </InputGroupAddon>
717
+ * </InputGroup>
718
+ * ```
719
+ *
720
+ * @example
721
+ * ```tsx
722
+ * // Complete comment form with top and bottom addons
723
+ * <InputGroup>
724
+ * <InputGroupAddon align="block-start">
725
+ * <InputGroupText>Your Comment</InputGroupText>
726
+ * <InputGroupButton size="icon-xs">
727
+ * <X className="size-4" />
728
+ * </InputGroupButton>
729
+ * </InputGroupAddon>
730
+ * <InputGroupTextarea placeholder="Add a comment..." rows={3} />
731
+ * <InputGroupAddon align="block-end">
732
+ * <InputGroupButton size="sm" variant="default">
733
+ * Post Comment
734
+ * </InputGroupButton>
735
+ * </InputGroupAddon>
736
+ * </InputGroup>
737
+ * ```
738
+ *
739
+ * @example
740
+ * ```tsx
741
+ * // Textarea with character counter
742
+ * const [message, setMessage] = useState("");
743
+ * <InputGroup>
744
+ * <InputGroupTextarea
745
+ * placeholder="Compose your message..."
746
+ * value={message}
747
+ * onChange={(e) => setMessage(e.target.value)}
748
+ * rows={5}
749
+ * />
750
+ * <InputGroupAddon align="block-end">
751
+ * <InputGroupText className="text-xs">
752
+ * {message.length} characters
753
+ * </InputGroupText>
754
+ * <InputGroupButton size="sm">Send</InputGroupButton>
755
+ * </InputGroupAddon>
756
+ * </InputGroup>
757
+ * ```
758
+ *
759
+ * @accessibility
760
+ * - Inherits all native HTML textarea accessibility features
761
+ * - Focus management handled by parent InputGroup with visible focus ring
762
+ * - Error states indicated via aria-invalid attribute
763
+ * - Properly associates with labels using id and htmlFor
764
+ * - Keyboard accessible with standard textarea navigation
765
+ * - Supports all ARIA attributes including aria-describedby for character limits
766
+ *
767
+ * @see {@link Textarea} Base textarea component
768
+ * @see {@link InputGroup} Parent container component
769
+ * @see {@link InputGroupAddon} Use with align="block-start" or "block-end" for best layout
770
+ * @since 1.0.0
771
+ */
772
+ function InputGroupTextarea({
773
+ className,
774
+ ...props
775
+ }: React.ComponentProps<"textarea">) {
776
+ return (
777
+ <Textarea
778
+ data-slot="input-group-control"
779
+ className={cn(
780
+ "flex-1 resize-none rounded-none border-0 bg-transparent py-3 shadow-none focus-visible:ring-0 dark:bg-transparent",
781
+ className
782
+ )}
783
+ {...props}
784
+ />
785
+ )
786
+ }
787
+
788
+ export {
789
+ InputGroup,
790
+ InputGroupAddon,
791
+ InputGroupButton,
792
+ InputGroupText,
793
+ InputGroupInput,
794
+ InputGroupTextarea,
795
+ type InputGroupDocsProps,
796
+ type InputGroupAddonDocsProps,
797
+ type InputGroupButtonDocsProps,
798
+ type InputGroupTextDocsProps,
799
+ type InputGroupInputDocsProps,
800
+ type InputGroupTextareaDocsProps,
801
+ }