@neynar/ui 0.3.0 → 0.4.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 (320) hide show
  1. package/.llm/accordion-content.llm.md +67 -0
  2. package/.llm/accordion-item.llm.md +61 -0
  3. package/.llm/accordion-trigger.llm.md +69 -0
  4. package/.llm/accordion.llm.md +88 -0
  5. package/.llm/alert-description.llm.md +78 -0
  6. package/.llm/alert-dialog-action.llm.md +51 -0
  7. package/.llm/alert-dialog-cancel.llm.md +48 -0
  8. package/.llm/alert-dialog-content.llm.md +88 -0
  9. package/.llm/alert-dialog-description.llm.md +53 -0
  10. package/.llm/alert-dialog-footer.llm.md +41 -0
  11. package/.llm/alert-dialog-header.llm.md +39 -0
  12. package/.llm/alert-dialog-overlay.llm.md +44 -0
  13. package/.llm/alert-dialog-portal.llm.md +41 -0
  14. package/.llm/alert-dialog-title.llm.md +46 -0
  15. package/.llm/alert-dialog-trigger.llm.md +40 -0
  16. package/.llm/alert-dialog.llm.md +80 -0
  17. package/.llm/alert-title.llm.md +48 -0
  18. package/.llm/alert.llm.md +92 -0
  19. package/.llm/aspect-ratio.llm.md +41 -0
  20. package/.llm/avatar-fallback.llm.md +41 -0
  21. package/.llm/avatar-image.llm.md +48 -0
  22. package/.llm/avatar.llm.md +35 -0
  23. package/.llm/badge.llm.md +117 -0
  24. package/.llm/blockquote.llm.md +55 -0
  25. package/.llm/body-text-large.llm.md +49 -0
  26. package/.llm/body-text-small.llm.md +49 -0
  27. package/.llm/body-text.llm.md +52 -0
  28. package/.llm/breadcrumb-ellipsis.llm.md +73 -0
  29. package/.llm/breadcrumb-item.llm.md +53 -0
  30. package/.llm/breadcrumb-link.llm.md +84 -0
  31. package/.llm/breadcrumb-list.llm.md +54 -0
  32. package/.llm/breadcrumb-page.llm.md +52 -0
  33. package/.llm/breadcrumb-separator.llm.md +60 -0
  34. package/.llm/breadcrumb.llm.md +110 -0
  35. package/.llm/button-group-separator.llm.md +53 -0
  36. package/.llm/button-group-text.llm.md +56 -0
  37. package/.llm/button-group.llm.md +81 -0
  38. package/.llm/button.llm.md +281 -0
  39. package/.llm/calendar-day-button.llm.md +57 -0
  40. package/.llm/calendar.llm.md +340 -0
  41. package/.llm/caption.llm.md +48 -0
  42. package/.llm/card-action.llm.md +64 -0
  43. package/.llm/card-content.llm.md +48 -0
  44. package/.llm/card-description.llm.md +46 -0
  45. package/.llm/card-footer.llm.md +56 -0
  46. package/.llm/card-header.llm.md +53 -0
  47. package/.llm/card-title.llm.md +43 -0
  48. package/.llm/card.llm.md +100 -0
  49. package/.llm/carousel-content.llm.md +77 -0
  50. package/.llm/carousel-item.llm.md +96 -0
  51. package/.llm/carousel-next.llm.md +95 -0
  52. package/.llm/carousel-previous.llm.md +95 -0
  53. package/.llm/carousel.llm.md +211 -0
  54. package/.llm/chart-config.llm.md +71 -0
  55. package/.llm/chart-container.llm.md +148 -0
  56. package/.llm/chart-legend-content.llm.md +85 -0
  57. package/.llm/chart-legend.llm.md +144 -0
  58. package/.llm/chart-style.llm.md +28 -0
  59. package/.llm/chart-tooltip-content.llm.md +149 -0
  60. package/.llm/chart-tooltip.llm.md +184 -0
  61. package/.llm/checkbox.llm.md +100 -0
  62. package/.llm/cn.llm.md +46 -0
  63. package/.llm/code.llm.md +45 -0
  64. package/.llm/collapsible-content.llm.md +109 -0
  65. package/.llm/collapsible-trigger.llm.md +75 -0
  66. package/.llm/collapsible.llm.md +109 -0
  67. package/.llm/combobox-option.llm.md +53 -0
  68. package/.llm/combobox.llm.md +208 -0
  69. package/.llm/command-dialog.llm.md +112 -0
  70. package/.llm/command-empty.llm.md +63 -0
  71. package/.llm/command-group.llm.md +83 -0
  72. package/.llm/command-input.llm.md +82 -0
  73. package/.llm/command-item.llm.md +97 -0
  74. package/.llm/command-list.llm.md +53 -0
  75. package/.llm/command-loading.llm.md +48 -0
  76. package/.llm/command-separator.llm.md +44 -0
  77. package/.llm/command-shortcut.llm.md +63 -0
  78. package/.llm/command.llm.md +147 -0
  79. package/.llm/container.llm.md +236 -0
  80. package/.llm/context-menu-checkbox-item.llm.md +97 -0
  81. package/.llm/context-menu-content.llm.md +91 -0
  82. package/.llm/context-menu-group.llm.md +61 -0
  83. package/.llm/context-menu-item.llm.md +94 -0
  84. package/.llm/context-menu-label.llm.md +60 -0
  85. package/.llm/context-menu-portal.llm.md +49 -0
  86. package/.llm/context-menu-radio-group.llm.md +66 -0
  87. package/.llm/context-menu-radio-item.llm.md +76 -0
  88. package/.llm/context-menu-separator.llm.md +51 -0
  89. package/.llm/context-menu-shortcut.llm.md +57 -0
  90. package/.llm/context-menu-sub-content.llm.md +90 -0
  91. package/.llm/context-menu-sub-trigger.llm.md +73 -0
  92. package/.llm/context-menu-sub.llm.md +61 -0
  93. package/.llm/context-menu-trigger.llm.md +53 -0
  94. package/.llm/context-menu.llm.md +103 -0
  95. package/.llm/date-picker.llm.md +90 -0
  96. package/.llm/dialog-close.llm.md +61 -0
  97. package/.llm/dialog-content.llm.md +128 -0
  98. package/.llm/dialog-description.llm.md +44 -0
  99. package/.llm/dialog-footer.llm.md +38 -0
  100. package/.llm/dialog-header.llm.md +40 -0
  101. package/.llm/dialog-overlay.llm.md +57 -0
  102. package/.llm/dialog-portal.llm.md +47 -0
  103. package/.llm/dialog-title.llm.md +41 -0
  104. package/.llm/dialog-trigger.llm.md +51 -0
  105. package/.llm/dialog.llm.md +113 -0
  106. package/.llm/drawer-close.llm.md +53 -0
  107. package/.llm/drawer-content.llm.md +58 -0
  108. package/.llm/drawer-description.llm.md +54 -0
  109. package/.llm/drawer-footer.llm.md +67 -0
  110. package/.llm/drawer-header.llm.md +60 -0
  111. package/.llm/drawer-overlay.llm.md +40 -0
  112. package/.llm/drawer-portal.llm.md +42 -0
  113. package/.llm/drawer-title.llm.md +51 -0
  114. package/.llm/drawer-trigger.llm.md +44 -0
  115. package/.llm/drawer.llm.md +194 -0
  116. package/.llm/dropdown-menu-checkbox-item.llm.md +111 -0
  117. package/.llm/dropdown-menu-content.llm.md +109 -0
  118. package/.llm/dropdown-menu-group.llm.md +38 -0
  119. package/.llm/dropdown-menu-item.llm.md +94 -0
  120. package/.llm/dropdown-menu-label.llm.md +66 -0
  121. package/.llm/dropdown-menu-portal.llm.md +32 -0
  122. package/.llm/dropdown-menu-radio-group.llm.md +73 -0
  123. package/.llm/dropdown-menu-radio-item.llm.md +92 -0
  124. package/.llm/dropdown-menu-separator.llm.md +55 -0
  125. package/.llm/dropdown-menu-shortcut.llm.md +74 -0
  126. package/.llm/dropdown-menu-sub-content.llm.md +80 -0
  127. package/.llm/dropdown-menu-sub-trigger.llm.md +84 -0
  128. package/.llm/dropdown-menu-sub.llm.md +74 -0
  129. package/.llm/dropdown-menu-trigger.llm.md +48 -0
  130. package/.llm/dropdown-menu.llm.md +120 -0
  131. package/.llm/empty-content.llm.md +103 -0
  132. package/.llm/empty-description.llm.md +70 -0
  133. package/.llm/empty-header.llm.md +64 -0
  134. package/.llm/empty-media.llm.md +81 -0
  135. package/.llm/empty-state.llm.md +174 -0
  136. package/.llm/empty-title.llm.md +54 -0
  137. package/.llm/empty.llm.md +158 -0
  138. package/.llm/field-content.llm.md +28 -0
  139. package/.llm/field-description.llm.md +28 -0
  140. package/.llm/field-error.llm.md +41 -0
  141. package/.llm/field-group.llm.md +84 -0
  142. package/.llm/field-label.llm.md +28 -0
  143. package/.llm/field-legend.llm.md +77 -0
  144. package/.llm/field-separator.llm.md +35 -0
  145. package/.llm/field-set.llm.md +80 -0
  146. package/.llm/field-title.llm.md +28 -0
  147. package/.llm/field.llm.md +35 -0
  148. package/.llm/hover-card-content.llm.md +167 -0
  149. package/.llm/hover-card-trigger.llm.md +65 -0
  150. package/.llm/hover-card.llm.md +121 -0
  151. package/.llm/input-group-addon.llm.md +91 -0
  152. package/.llm/input-group-button.llm.md +120 -0
  153. package/.llm/input-group-input.llm.md +145 -0
  154. package/.llm/input-group-text.llm.md +75 -0
  155. package/.llm/input-group-textarea.llm.md +157 -0
  156. package/.llm/input-group.llm.md +108 -0
  157. package/.llm/input.llm.md +319 -0
  158. package/.llm/item-actions.llm.md +77 -0
  159. package/.llm/item-content.llm.md +73 -0
  160. package/.llm/item-description.llm.md +61 -0
  161. package/.llm/item-footer.llm.md +68 -0
  162. package/.llm/item-group.llm.md +73 -0
  163. package/.llm/item-header.llm.md +66 -0
  164. package/.llm/item-media.llm.md +75 -0
  165. package/.llm/item-separator.llm.md +80 -0
  166. package/.llm/item-title.llm.md +59 -0
  167. package/.llm/item.llm.md +115 -0
  168. package/.llm/kbd-group.llm.md +71 -0
  169. package/.llm/kbd.llm.md +71 -0
  170. package/.llm/label.llm.md +145 -0
  171. package/.llm/menubar-checkbox-item.llm.md +66 -0
  172. package/.llm/menubar-content.llm.md +128 -0
  173. package/.llm/menubar-group.llm.md +40 -0
  174. package/.llm/menubar-item.llm.md +62 -0
  175. package/.llm/menubar-label.llm.md +40 -0
  176. package/.llm/menubar-menu.llm.md +32 -0
  177. package/.llm/menubar-portal.llm.md +38 -0
  178. package/.llm/menubar-radio-group.llm.md +39 -0
  179. package/.llm/menubar-radio-item.llm.md +59 -0
  180. package/.llm/menubar-separator.llm.md +35 -0
  181. package/.llm/menubar-shortcut.llm.md +37 -0
  182. package/.llm/menubar-sub-content.llm.md +127 -0
  183. package/.llm/menubar-sub-trigger.llm.md +51 -0
  184. package/.llm/menubar-sub.llm.md +53 -0
  185. package/.llm/menubar-trigger.llm.md +37 -0
  186. package/.llm/menubar.llm.md +115 -0
  187. package/.llm/navigation-menu-content.llm.md +116 -0
  188. package/.llm/navigation-menu-indicator.llm.md +68 -0
  189. package/.llm/navigation-menu-item.llm.md +62 -0
  190. package/.llm/navigation-menu-link.llm.md +109 -0
  191. package/.llm/navigation-menu-list.llm.md +52 -0
  192. package/.llm/navigation-menu-trigger-style.llm.md +22 -0
  193. package/.llm/navigation-menu-trigger.llm.md +57 -0
  194. package/.llm/navigation-menu-viewport.llm.md +51 -0
  195. package/.llm/navigation-menu.llm.md +184 -0
  196. package/.llm/overline.llm.md +51 -0
  197. package/.llm/page-title.llm.md +52 -0
  198. package/.llm/pagination-content.llm.md +60 -0
  199. package/.llm/pagination-ellipsis.llm.md +107 -0
  200. package/.llm/pagination-item.llm.md +59 -0
  201. package/.llm/pagination-link.llm.md +150 -0
  202. package/.llm/pagination-next.llm.md +115 -0
  203. package/.llm/pagination-previous.llm.md +115 -0
  204. package/.llm/pagination.llm.md +190 -0
  205. package/.llm/popover-anchor.llm.md +53 -0
  206. package/.llm/popover-content.llm.md +109 -0
  207. package/.llm/popover-trigger.llm.md +54 -0
  208. package/.llm/popover.llm.md +116 -0
  209. package/.llm/progress.llm.md +76 -0
  210. package/.llm/radio-group-indicator.llm.md +28 -0
  211. package/.llm/radio-group-item.llm.md +40 -0
  212. package/.llm/radio-group.llm.md +76 -0
  213. package/.llm/resizable-handle.llm.md +156 -0
  214. package/.llm/resizable-panel-group.llm.md +149 -0
  215. package/.llm/resizable-panel.llm.md +157 -0
  216. package/.llm/scroll-area-corner.llm.md +41 -0
  217. package/.llm/scroll-area-thumb.llm.md +39 -0
  218. package/.llm/scroll-area-viewport.llm.md +60 -0
  219. package/.llm/scroll-area.llm.md +125 -0
  220. package/.llm/scroll-bar.llm.md +78 -0
  221. package/.llm/sdk-items-registry.json +2984 -0
  222. package/.llm/section-title.llm.md +48 -0
  223. package/.llm/select-content.llm.md +139 -0
  224. package/.llm/select-group.llm.md +60 -0
  225. package/.llm/select-item.llm.md +75 -0
  226. package/.llm/select-label.llm.md +62 -0
  227. package/.llm/select-scroll-down-button.llm.md +45 -0
  228. package/.llm/select-scroll-up-button.llm.md +45 -0
  229. package/.llm/select-separator.llm.md +59 -0
  230. package/.llm/select-trigger.llm.md +66 -0
  231. package/.llm/select-value.llm.md +67 -0
  232. package/.llm/select.llm.md +159 -0
  233. package/.llm/separator.llm.md +129 -0
  234. package/.llm/sheet-close.llm.md +49 -0
  235. package/.llm/sheet-content.llm.md +115 -0
  236. package/.llm/sheet-description.llm.md +62 -0
  237. package/.llm/sheet-footer.llm.md +64 -0
  238. package/.llm/sheet-header.llm.md +52 -0
  239. package/.llm/sheet-title.llm.md +53 -0
  240. package/.llm/sheet-trigger.llm.md +46 -0
  241. package/.llm/sheet.llm.md +126 -0
  242. package/.llm/sidebar-content.llm.md +63 -0
  243. package/.llm/sidebar-footer.llm.md +50 -0
  244. package/.llm/sidebar-group-action.llm.md +60 -0
  245. package/.llm/sidebar-group-content.llm.md +64 -0
  246. package/.llm/sidebar-group-label.llm.md +53 -0
  247. package/.llm/sidebar-group.llm.md +56 -0
  248. package/.llm/sidebar-header.llm.md +67 -0
  249. package/.llm/sidebar-input.llm.md +50 -0
  250. package/.llm/sidebar-inset.llm.md +52 -0
  251. package/.llm/sidebar-menu-action.llm.md +84 -0
  252. package/.llm/sidebar-menu-badge.llm.md +60 -0
  253. package/.llm/sidebar-menu-button.llm.md +103 -0
  254. package/.llm/sidebar-menu-item.llm.md +75 -0
  255. package/.llm/sidebar-menu-skeleton.llm.md +76 -0
  256. package/.llm/sidebar-menu-sub-button.llm.md +85 -0
  257. package/.llm/sidebar-menu-sub-item.llm.md +54 -0
  258. package/.llm/sidebar-menu-sub.llm.md +74 -0
  259. package/.llm/sidebar-menu.llm.md +65 -0
  260. package/.llm/sidebar-provider.llm.md +79 -0
  261. package/.llm/sidebar-rail.llm.md +34 -0
  262. package/.llm/sidebar-separator.llm.md +57 -0
  263. package/.llm/sidebar-trigger.llm.md +49 -0
  264. package/.llm/sidebar.llm.md +129 -0
  265. package/.llm/skeleton.llm.md +134 -0
  266. package/.llm/slider.llm.md +173 -0
  267. package/.llm/spinner.llm.md +182 -0
  268. package/.llm/stack.llm.md +28 -0
  269. package/.llm/subsection-title.llm.md +46 -0
  270. package/.llm/switch.llm.md +76 -0
  271. package/.llm/table-body.llm.md +36 -0
  272. package/.llm/table-caption.llm.md +48 -0
  273. package/.llm/table-cell.llm.md +53 -0
  274. package/.llm/table-footer.llm.md +41 -0
  275. package/.llm/table-head.llm.md +69 -0
  276. package/.llm/table-header.llm.md +41 -0
  277. package/.llm/table-row.llm.md +42 -0
  278. package/.llm/table.llm.md +123 -0
  279. package/.llm/tabs-content.llm.md +47 -0
  280. package/.llm/tabs-list.llm.md +41 -0
  281. package/.llm/tabs-trigger.llm.md +47 -0
  282. package/.llm/tabs.llm.md +71 -0
  283. package/.llm/text-field.llm.md +327 -0
  284. package/.llm/textarea.llm.md +311 -0
  285. package/.llm/theme-preference.llm.md +25 -0
  286. package/.llm/theme-toggle.llm.md +57 -0
  287. package/.llm/theme.llm.md +14 -0
  288. package/.llm/toaster.llm.md +193 -0
  289. package/.llm/toggle-group-item.llm.md +59 -0
  290. package/.llm/toggle-group.llm.md +101 -0
  291. package/.llm/toggle.llm.md +40 -0
  292. package/.llm/tooltip-content.llm.md +185 -0
  293. package/.llm/tooltip-provider.llm.md +68 -0
  294. package/.llm/tooltip-trigger.llm.md +70 -0
  295. package/.llm/tooltip.llm.md +129 -0
  296. package/.llm/use-carousel.llm.md +55 -0
  297. package/.llm/use-command-state.llm.md +32 -0
  298. package/.llm/use-is-mobile.llm.md +73 -0
  299. package/.llm/use-sidebar.llm.md +61 -0
  300. package/dist/components/ui/scroll-area.d.ts +5 -5
  301. package/dist/components/ui/scroll-area.d.ts.map +1 -1
  302. package/dist/components/ui/stack.d.ts.map +1 -1
  303. package/dist/components/ui/stories/scroll-area.stories.d.ts +1 -1
  304. package/dist/components/ui/stories/typography.stories.d.ts +8 -108
  305. package/dist/components/ui/stories/typography.stories.d.ts.map +1 -1
  306. package/dist/components/ui/theme-toggle.d.ts +0 -3
  307. package/dist/components/ui/theme-toggle.d.ts.map +1 -1
  308. package/dist/components/ui/theme.d.ts.map +1 -1
  309. package/dist/components/ui/typography.d.ts +211 -474
  310. package/dist/components/ui/typography.d.ts.map +1 -1
  311. package/dist/index.js +5160 -9875
  312. package/dist/index.js.map +1 -1
  313. package/dist/tsconfig.tsbuildinfo +1 -1
  314. package/package.json +2 -2
  315. package/src/components/ui/stack.tsx +3 -1
  316. package/src/components/ui/stories/typography.stories.tsx +261 -1512
  317. package/src/components/ui/theme-toggle.tsx +1 -3
  318. package/src/components/ui/theme.tsx +6 -1
  319. package/src/components/ui/typography.tsx +416 -1136
  320. package/src/styles/globals.css +57 -106
@@ -0,0 +1,311 @@
1
+ # Textarea
2
+
3
+ **Type**: component
4
+
5
+ Textarea - Multi-line text input control for extended content entry A styled textarea component built on the native HTML textarea element for entering longer pieces of text that span multiple lines, such as comments, descriptions, messages, or any content that requires multiple lines of input. Features automatic content-based resizing using CSS field-sizing when supported by the browser. Built following shadcn/ui design patterns with consistent styling and behavior across form elements. Inherits all native HTML textarea functionality while providing enhanced visual design and better accessibility patterns.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { Textarea } from '@neynar/ui';
11
+
12
+ <Textarea
13
+ className="value"
14
+ placeholder="value"
15
+ disabled={true}
16
+ readOnly={true}
17
+ rows={0}
18
+ cols={0}
19
+ maxLength={0}
20
+ minLength={0}
21
+ required={true}
22
+ form="value"
23
+ name="value"
24
+ id="value"
25
+ value="value"
26
+ defaultValue="value"
27
+ wrap={value}
28
+ autoFocus={true}
29
+ autoComplete="value"
30
+ autoCapitalize={value}
31
+ spellCheck={true}
32
+ onChange={handleChange}
33
+ onFocus={handleFocus}
34
+ onBlur={handleBlur}
35
+ onKeyDown={handleKeyDown}
36
+ onKeyUp={handleKeyUp}
37
+ onKeyPress={handleKeyPress}
38
+ "aria-invalid"={value}
39
+ "aria-describedby"="value"
40
+ "aria-labelledby"="value"
41
+ "aria-label"="value"
42
+ tabIndex={0}
43
+ style={value}
44
+ />
45
+ ```
46
+
47
+ ## Component Props
48
+
49
+ ### className
50
+ - **Type**: `string`
51
+ - **Required**: No
52
+ - **Description**: No description available
53
+
54
+ ### placeholder
55
+ - **Type**: `string`
56
+ - **Required**: No
57
+ - **Description**: No description available
58
+
59
+ ### disabled
60
+ - **Type**: `boolean`
61
+ - **Required**: No
62
+ - **Description**: No description available
63
+
64
+ ### readOnly
65
+ - **Type**: `boolean`
66
+ - **Required**: No
67
+ - **Description**: No description available
68
+
69
+ ### rows
70
+ - **Type**: `number`
71
+ - **Required**: No
72
+ - **Description**: No description available
73
+
74
+ ### cols
75
+ - **Type**: `number`
76
+ - **Required**: No
77
+ - **Description**: No description available
78
+
79
+ ### maxLength
80
+ - **Type**: `number`
81
+ - **Required**: No
82
+ - **Description**: No description available
83
+
84
+ ### minLength
85
+ - **Type**: `number`
86
+ - **Required**: No
87
+ - **Description**: No description available
88
+
89
+ ### required
90
+ - **Type**: `boolean`
91
+ - **Required**: No
92
+ - **Description**: No description available
93
+
94
+ ### form
95
+ - **Type**: `string`
96
+ - **Required**: No
97
+ - **Description**: No description available
98
+
99
+ ### name
100
+ - **Type**: `string`
101
+ - **Required**: No
102
+ - **Description**: No description available
103
+
104
+ ### id
105
+ - **Type**: `string`
106
+ - **Required**: No
107
+ - **Description**: No description available
108
+
109
+ ### value
110
+ - **Type**: `string`
111
+ - **Required**: No
112
+ - **Description**: No description available
113
+
114
+ ### defaultValue
115
+ - **Type**: `string`
116
+ - **Required**: No
117
+ - **Description**: No description available
118
+
119
+ ### wrap
120
+ - **Type**: `"soft" | "hard" | "off"`
121
+ - **Required**: No
122
+ - **Description**: No description available
123
+
124
+ ### autoFocus
125
+ - **Type**: `boolean`
126
+ - **Required**: No
127
+ - **Description**: No description available
128
+
129
+ ### autoComplete
130
+ - **Type**: `string`
131
+ - **Required**: No
132
+ - **Description**: No description available
133
+
134
+ ### autoCapitalize
135
+ - **Type**: `"none" | "sentences" | "words" | "characters"`
136
+ - **Required**: No
137
+ - **Description**: No description available
138
+
139
+ ### spellCheck
140
+ - **Type**: `boolean`
141
+ - **Required**: No
142
+ - **Description**: No description available
143
+
144
+ ### onChange
145
+ - **Type**: `(event: React.ChangeEvent<HTMLTextAreaElement>) => void`
146
+ - **Required**: No
147
+ - **Description**: No description available
148
+
149
+ ### onFocus
150
+ - **Type**: `(event: React.FocusEvent<HTMLTextAreaElement>) => void`
151
+ - **Required**: No
152
+ - **Description**: No description available
153
+
154
+ ### onBlur
155
+ - **Type**: `(event: React.FocusEvent<HTMLTextAreaElement>) => void`
156
+ - **Required**: No
157
+ - **Description**: No description available
158
+
159
+ ### onKeyDown
160
+ - **Type**: `(event: React.KeyboardEvent<HTMLTextAreaElement>) => void`
161
+ - **Required**: No
162
+ - **Description**: No description available
163
+
164
+ ### onKeyUp
165
+ - **Type**: `(event: React.KeyboardEvent<HTMLTextAreaElement>) => void`
166
+ - **Required**: No
167
+ - **Description**: No description available
168
+
169
+ ### onKeyPress
170
+ - **Type**: `(event: React.KeyboardEvent<HTMLTextAreaElement>) => void`
171
+ - **Required**: No
172
+ - **Description**: No description available
173
+
174
+ ### "aria-invalid"
175
+ - **Type**: `boolean | "false" | "true" | "grammar" | "spelling"`
176
+ - **Required**: No
177
+ - **Description**: No description available
178
+
179
+ ### "aria-describedby"
180
+ - **Type**: `string`
181
+ - **Required**: No
182
+ - **Description**: No description available
183
+
184
+ ### "aria-labelledby"
185
+ - **Type**: `string`
186
+ - **Required**: No
187
+ - **Description**: No description available
188
+
189
+ ### "aria-label"
190
+ - **Type**: `string`
191
+ - **Required**: No
192
+ - **Description**: No description available
193
+
194
+ ### tabIndex
195
+ - **Type**: `number`
196
+ - **Required**: No
197
+ - **Description**: No description available
198
+
199
+ ### style
200
+ - **Type**: `React.CSSProperties & {
201
+ resize?: "none" | "both" | "horizontal" | "vertical";
202
+ }`
203
+ - **Required**: No
204
+ - **Description**: No description available
205
+
206
+ ## Examples
207
+
208
+ ### Example 1
209
+ ```tsx
210
+ // Basic usage
211
+ <Textarea placeholder="Type your message here..." />
212
+ ```
213
+ ### Example 2
214
+ ```tsx
215
+ // With label and validation
216
+ <div className="space-y-2">
217
+ <Label htmlFor="description">Description</Label>
218
+ <Textarea
219
+ id="description"
220
+ placeholder="Enter a description..."
221
+ rows={4}
222
+ required
223
+ />
224
+ </div>
225
+ ```
226
+ ### Example 3
227
+ ```tsx
228
+ // Controlled with character limit and validation
229
+ const [bio, setBio] = useState("");
230
+ const [error, setError] = useState("");
231
+ const maxLength = 160;
232
+ <div className="space-y-2">
233
+ <Label htmlFor="bio">Bio</Label>
234
+ <Textarea
235
+ id="bio"
236
+ value={bio}
237
+ onChange={(e) => {
238
+ setBio(e.target.value);
239
+ if (e.target.value.length > maxLength) {
240
+ setError("Bio is too long");
241
+ } else {
242
+ setError("");
243
+ }
244
+ }}
245
+ placeholder="Tell us about yourself..."
246
+ maxLength={maxLength}
247
+ aria-invalid={!!error}
248
+ aria-describedby={error ? "bio-error" : "bio-count"}
249
+ />
250
+ <div className="flex justify-between items-center">
251
+ <p id="bio-count" className="text-sm text-muted-foreground">
252
+ {bio.length}/{maxLength} characters
253
+ </p>
254
+ {error && (
255
+ <p id="bio-error" className="text-sm text-destructive">
256
+ {error}
257
+ </p>
258
+ )}
259
+ </div>
260
+ </div>
261
+ ```
262
+ ### Example 4
263
+ ```tsx
264
+ // Auto-resizing with minimum height
265
+ <Textarea
266
+ placeholder="This textarea grows with content"
267
+ className="min-h-[100px] max-h-[300px]"
268
+ style={{ resize: "vertical" }}
269
+ />
270
+ ```
271
+ ### Example 5
272
+ ```tsx
273
+ // Form integration with validation
274
+ <form onSubmit={handleSubmit}>
275
+ <div className="space-y-2">
276
+ <Label htmlFor="feedback">Feedback</Label>
277
+ <Textarea
278
+ id="feedback"
279
+ name="feedback"
280
+ placeholder="Share your thoughts..."
281
+ required
282
+ minLength={10}
283
+ maxLength={500}
284
+ rows={3}
285
+ />
286
+ </div>
287
+ <Button type="submit">Submit Feedback</Button>
288
+ </form>
289
+ ```
290
+ ### Example 6
291
+ ```tsx
292
+ // Different wrap behaviors for code/text
293
+ <div className="space-y-4">
294
+ <div>
295
+ <Label>Code (no wrapping)</Label>
296
+ <Textarea
297
+ wrap="off"
298
+ placeholder="Enter code here..."
299
+ className="font-mono text-sm"
300
+ style={{ resize: "both" }}
301
+ />
302
+ </div>
303
+ <div>
304
+ <Label>Text (soft wrapping)</Label>
305
+ <Textarea
306
+ wrap="soft"
307
+ placeholder="Enter text content..."
308
+ />
309
+ </div>
310
+ </div>
311
+ ```
@@ -0,0 +1,25 @@
1
+ # ThemePreference
2
+
3
+ **Type**: type
4
+
5
+ Theme preference options for the theme system Controls how the application determines the active theme: - `"system"` - Automatically follows the user's OS preference - `"light"` - Forces light theme regardless of system preference - `"dark"` - Forces dark theme regardless of system preference
6
+
7
+ ## Type Definition
8
+
9
+ ```typescript
10
+ import { ThemePreference } from '@neynar/ui';
11
+
12
+ type ThemePreference = "system" | "light" | "dark"
13
+ ```
14
+
15
+ ## Examples
16
+
17
+ ```tsx
18
+ const { preference, setPreference } = useTheme();
19
+
20
+ // Switch to dark mode
21
+ setPreference("dark");
22
+
23
+ // Follow system preference
24
+ setPreference("system");
25
+ ```
@@ -0,0 +1,57 @@
1
+ # ThemeToggle
2
+
3
+ **Type**: component
4
+
5
+ ThemeToggle - A zero-configuration theme switcher with system, light, and dark modes A completely self-contained theme toggle component that provides an intuitive dropdown interface for switching between system preference, light mode, and dark mode. Works immediately without any provider setup, context configuration, or additional dependencies. Built on top of shadcn/ui components (Button + DropdownMenu) with the Neynar useTheme hook for state management. Handles theme persistence via cookies, system preference detection, real-time system changes, and synchronization across multiple instances. **Zero Configuration Design:** Just import and use - no providers, no setup, no configuration required. The component handles all theme management internally and provides a complete solution out of the box. **Perfect for:** - Application headers and navigation bars - Settings panels and preference screens - Toolbars and floating action areas - Any location where users need quick theme access
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { ThemeToggle } from '@neynar/ui';
11
+
12
+ <ThemeToggle
13
+ variant={value}
14
+ size={value}
15
+ className="value"
16
+ showLabel={true}
17
+ align={value}
18
+ asChild={true}
19
+ />
20
+ ```
21
+
22
+ ## Component Props
23
+
24
+ ### variant
25
+ - **Type**: `| "default"
26
+ | "destructive"
27
+ | "outline"
28
+ | "secondary"
29
+ | "ghost"
30
+ | "link"`
31
+ - **Required**: No
32
+ - **Description**: Visual style variant inherited from Button component (default: "outline")
33
+
34
+ ### size
35
+ - **Type**: `"default" | "sm" | "lg" | "icon"`
36
+ - **Required**: No
37
+ - **Description**: Size variant inherited from Button component (default: "icon")
38
+
39
+ ### className
40
+ - **Type**: `string`
41
+ - **Required**: No
42
+ - **Description**: Additional CSS classes for custom styling
43
+
44
+ ### showLabel
45
+ - **Type**: `boolean`
46
+ - **Required**: No
47
+ - **Description**: Whether to show theme name text (auto-enabled for non-icon sizes)
48
+
49
+ ### align
50
+ - **Type**: `"start" | "center" | "end"`
51
+ - **Required**: No
52
+ - **Description**: Dropdown menu alignment relative to trigger button (default: "end")
53
+
54
+ ### asChild
55
+ - **Type**: `boolean`
56
+ - **Required**: No
57
+ - **Description**: No description available
@@ -0,0 +1,14 @@
1
+ # Theme
2
+
3
+ **Type**: component
4
+
5
+ Theme - Prevents flash of unstyled content (FOUC) during theme initialization A critical component that prevents the flash of incorrect theme styling by applying the user's preferred theme before the page renders. This component should be placed once at the root of your application, ideally in the document head or at the very beginning of the body. The component works by injecting a small inline script that: 1. Reads the stored theme preference from cookies 2. Detects system theme preference if set to "system" 3. Applies the appropriate theme class and color scheme immediately 4. Executes synchronously before first paint to prevent FOUC Built as a zero-configuration component that requires no props or setup. Simply drop it into your application's root layout and it will handle theme initialization automatically.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { Theme } from '@neynar/ui';
11
+
12
+ <Theme
13
+ />
14
+ ```
@@ -0,0 +1,193 @@
1
+ # Toaster
2
+
3
+ **Type**: component
4
+
5
+ Toast notification container component built on Sonner A feature-rich toast component that provides beautiful, accessible notifications with seamless theme integration and extensive customization options. Built on the popular Sonner library with enhanced theming that automatically synchronizes with the application's theme system using the useTheme hook. This component serves as the central toast container and should be placed once in your application root. It manages the display, positioning, and lifecycle of all toast notifications throughout your application. **Key Features:** - **Automatic theme synchronization** - Integrates with useTheme for consistent styling - **Flexible positioning** - Six different positions with smart stacking - **Rich accessibility** - Full keyboard navigation and screen reader support - **Promise integration** - Built-in loading/success/error states for async operations - **Gesture support** - Touch-friendly swipe-to-dismiss with configurable directions - **Performance optimized** - Efficient rendering with configurable limits - **Customizable styling** - Comprehensive theming and custom icon support
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { Toaster } from '@neynar/ui';
11
+
12
+ <Toaster
13
+ invert={true}
14
+ theme={value}
15
+ position={value}
16
+ hotkey={[]}
17
+ richColors={true}
18
+ expand={true}
19
+ duration={0}
20
+ gap={0}
21
+ visibleToasts={0}
22
+ closeButton={true}
23
+ toastOptions={value}
24
+ className="value"
25
+ style={value}
26
+ offset={value}
27
+ mobileOffset={value}
28
+ dir={value}
29
+ swipeDirections={[]}
30
+ icons={value}
31
+ containerAriaLabel="value"
32
+ />
33
+ ```
34
+
35
+ ## Component Props
36
+
37
+ ### invert
38
+ - **Type**: `boolean`
39
+ - **Required**: No
40
+ - **Description**: No description available
41
+
42
+ ### theme
43
+ - **Type**: `"light" | "dark" | "system"`
44
+ - **Required**: No
45
+ - **Description**: No description available
46
+
47
+ ### position
48
+ - **Type**: `| "top-left"
49
+ | "top-right"
50
+ | "bottom-left"
51
+ | "bottom-right"
52
+ | "top-center"
53
+ | "bottom-center"`
54
+ - **Required**: No
55
+ - **Description**: No description available
56
+
57
+ ### hotkey
58
+ - **Type**: `string[]`
59
+ - **Required**: No
60
+ - **Description**: No description available
61
+
62
+ ### richColors
63
+ - **Type**: `boolean`
64
+ - **Required**: No
65
+ - **Description**: No description available
66
+
67
+ ### expand
68
+ - **Type**: `boolean`
69
+ - **Required**: No
70
+ - **Description**: No description available
71
+
72
+ ### duration
73
+ - **Type**: `number`
74
+ - **Required**: No
75
+ - **Description**: No description available
76
+
77
+ ### gap
78
+ - **Type**: `number`
79
+ - **Required**: No
80
+ - **Description**: No description available
81
+
82
+ ### visibleToasts
83
+ - **Type**: `number`
84
+ - **Required**: No
85
+ - **Description**: No description available
86
+
87
+ ### closeButton
88
+ - **Type**: `boolean`
89
+ - **Required**: No
90
+ - **Description**: No description available
91
+
92
+ ### toastOptions
93
+ - **Type**: `{
94
+ /** Additional CSS classes for toast elements */
95
+ className?: string;
96
+ /** Show close button for individual toasts @default false */
97
+ closeButton?: boolean;
98
+ /** CSS classes for description text */
99
+ descriptionClassName?: string;
100
+ /** Inline styles for toast container */
101
+ style?: React.CSSProperties;
102
+ /** Styles for cancel button */
103
+ cancelButtonStyle?: React.CSSProperties;
104
+ /** Styles for action button */
105
+ actionButtonStyle?: React.CSSProperties;
106
+ /** Duration before auto-dismiss in milliseconds */
107
+ duration?: number;
108
+ /** Remove default styling to allow full custom styling @default false */
109
+ unstyled?: boolean;
110
+ /** CSS class overrides for specific toast elements */
111
+ classNames?: {
112
+ toast?: string;
113
+ title?: string;
114
+ description?: string;
115
+ loader?: string;
116
+ closeButton?: string;
117
+ cancelButton?: string;
118
+ actionButton?: string;
119
+ success?: string;
120
+ error?: string;
121
+ info?: string;
122
+ warning?: string;
123
+ loading?: string;
124
+ default?: string;
125
+ content?: string;
126
+ icon?: string;
127
+ };
128
+ /** Accessible label for close button */
129
+ closeButtonAriaLabel?: string;
130
+ }`
131
+ - **Required**: No
132
+ - **Description**: No description available
133
+
134
+ ### className
135
+ - **Type**: `string`
136
+ - **Required**: No
137
+ - **Description**: No description available
138
+
139
+ ### style
140
+ - **Type**: `React.CSSProperties`
141
+ - **Required**: No
142
+ - **Description**: No description available
143
+
144
+ ### offset
145
+ - **Type**: `| string
146
+ | number
147
+ | {
148
+ top?: string | number;
149
+ right?: string | number;
150
+ bottom?: string | number;
151
+ left?: string | number;
152
+ }`
153
+ - **Required**: No
154
+ - **Description**: No description available
155
+
156
+ ### mobileOffset
157
+ - **Type**: `| string
158
+ | number
159
+ | {
160
+ top?: string | number;
161
+ right?: string | number;
162
+ bottom?: string | number;
163
+ left?: string | number;
164
+ }`
165
+ - **Required**: No
166
+ - **Description**: No description available
167
+
168
+ ### dir
169
+ - **Type**: `"rtl" | "ltr" | "auto"`
170
+ - **Required**: No
171
+ - **Description**: No description available
172
+
173
+ ### swipeDirections
174
+ - **Type**: `("top" | "right" | "bottom" | "left")[]`
175
+ - **Required**: No
176
+ - **Description**: No description available
177
+
178
+ ### icons
179
+ - **Type**: `{
180
+ success?: React.ReactNode;
181
+ info?: React.ReactNode;
182
+ warning?: React.ReactNode;
183
+ error?: React.ReactNode;
184
+ loading?: React.ReactNode;
185
+ close?: React.ReactNode;
186
+ }`
187
+ - **Required**: No
188
+ - **Description**: No description available
189
+
190
+ ### containerAriaLabel
191
+ - **Type**: `string`
192
+ - **Required**: No
193
+ - **Description**: No description available
@@ -0,0 +1,59 @@
1
+ # ToggleGroupItem
2
+
3
+ **Type**: component
4
+
5
+ Toggle Group Item - Individual selectable item within a ToggleGroup Represents a single toggleable option within a ToggleGroup component. Each item automatically inherits variant and size styling from the parent ToggleGroup context through React Context, but these can be overridden for specific styling needs. Supports flexible content including icons, text, or mixed combinations. The component participates in the parent ToggleGroup's keyboard navigation and selection behavior, with proper ARIA attributes for accessibility. Focus management and selection state are handled automatically by the Radix UI primitive.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { ToggleGroupItem } from '@neynar/ui';
11
+
12
+ <ToggleGroupItem
13
+ className="value"
14
+ value="value"
15
+ disabled={true}
16
+ variant={value}
17
+ size={value}
18
+ asChild={true}
19
+ >
20
+ {/* Your content here */}
21
+ </ToggleGroupItem>
22
+ ```
23
+
24
+ ## Component Props
25
+
26
+ ### className
27
+ - **Type**: `string`
28
+ - **Required**: No
29
+ - **Description**: No description available
30
+
31
+ ### value
32
+ - **Type**: `string`
33
+ - **Required**: Yes
34
+ - **Description**: No description available
35
+
36
+ ### disabled
37
+ - **Type**: `boolean`
38
+ - **Required**: No
39
+ - **Description**: No description available
40
+
41
+ ### variant
42
+ - **Type**: `"default" | "outline"`
43
+ - **Required**: No
44
+ - **Description**: No description available
45
+
46
+ ### size
47
+ - **Type**: `"sm" | "default" | "lg"`
48
+ - **Required**: No
49
+ - **Description**: No description available
50
+
51
+ ### asChild
52
+ - **Type**: `boolean`
53
+ - **Required**: No
54
+ - **Description**: No description available
55
+
56
+ ### children
57
+ - **Type**: `React.ReactNode`
58
+ - **Required**: No
59
+ - **Description**: No description available