@neynar/ui 0.3.0 → 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 (320) hide show
  1. package/.llm/a.llm.md +131 -0
  2. package/.llm/accordion-content.llm.md +67 -0
  3. package/.llm/accordion-item.llm.md +61 -0
  4. package/.llm/accordion-trigger.llm.md +69 -0
  5. package/.llm/accordion.llm.md +88 -0
  6. package/.llm/alert-description.llm.md +78 -0
  7. package/.llm/alert-dialog-action.llm.md +51 -0
  8. package/.llm/alert-dialog-cancel.llm.md +48 -0
  9. package/.llm/alert-dialog-content.llm.md +88 -0
  10. package/.llm/alert-dialog-description.llm.md +53 -0
  11. package/.llm/alert-dialog-footer.llm.md +41 -0
  12. package/.llm/alert-dialog-header.llm.md +39 -0
  13. package/.llm/alert-dialog-overlay.llm.md +44 -0
  14. package/.llm/alert-dialog-portal.llm.md +41 -0
  15. package/.llm/alert-dialog-title.llm.md +46 -0
  16. package/.llm/alert-dialog-trigger.llm.md +40 -0
  17. package/.llm/alert-dialog.llm.md +80 -0
  18. package/.llm/alert-title.llm.md +48 -0
  19. package/.llm/alert.llm.md +92 -0
  20. package/.llm/aspect-ratio.llm.md +41 -0
  21. package/.llm/avatar-fallback.llm.md +41 -0
  22. package/.llm/avatar-image.llm.md +48 -0
  23. package/.llm/avatar.llm.md +35 -0
  24. package/.llm/badge.llm.md +117 -0
  25. package/.llm/blockquote.llm.md +117 -0
  26. package/.llm/breadcrumb-ellipsis.llm.md +73 -0
  27. package/.llm/breadcrumb-item.llm.md +53 -0
  28. package/.llm/breadcrumb-link.llm.md +84 -0
  29. package/.llm/breadcrumb-list.llm.md +54 -0
  30. package/.llm/breadcrumb-page.llm.md +52 -0
  31. package/.llm/breadcrumb-separator.llm.md +60 -0
  32. package/.llm/breadcrumb.llm.md +110 -0
  33. package/.llm/button-group-separator.llm.md +53 -0
  34. package/.llm/button-group-text.llm.md +56 -0
  35. package/.llm/button-group.llm.md +81 -0
  36. package/.llm/button.llm.md +281 -0
  37. package/.llm/calendar-day-button.llm.md +57 -0
  38. package/.llm/calendar.llm.md +340 -0
  39. package/.llm/card-action.llm.md +64 -0
  40. package/.llm/card-content.llm.md +48 -0
  41. package/.llm/card-description.llm.md +46 -0
  42. package/.llm/card-footer.llm.md +56 -0
  43. package/.llm/card-header.llm.md +53 -0
  44. package/.llm/card-title.llm.md +43 -0
  45. package/.llm/card.llm.md +100 -0
  46. package/.llm/carousel-content.llm.md +77 -0
  47. package/.llm/carousel-item.llm.md +96 -0
  48. package/.llm/carousel-next.llm.md +95 -0
  49. package/.llm/carousel-previous.llm.md +95 -0
  50. package/.llm/carousel.llm.md +211 -0
  51. package/.llm/chart-config.llm.md +71 -0
  52. package/.llm/chart-container.llm.md +148 -0
  53. package/.llm/chart-legend-content.llm.md +85 -0
  54. package/.llm/chart-legend.llm.md +144 -0
  55. package/.llm/chart-style.llm.md +28 -0
  56. package/.llm/chart-tooltip-content.llm.md +149 -0
  57. package/.llm/chart-tooltip.llm.md +184 -0
  58. package/.llm/checkbox.llm.md +100 -0
  59. package/.llm/cn.llm.md +46 -0
  60. package/.llm/code.llm.md +103 -0
  61. package/.llm/collapsible-content.llm.md +109 -0
  62. package/.llm/collapsible-trigger.llm.md +75 -0
  63. package/.llm/collapsible.llm.md +109 -0
  64. package/.llm/combobox-option.llm.md +53 -0
  65. package/.llm/combobox.llm.md +208 -0
  66. package/.llm/command-dialog.llm.md +112 -0
  67. package/.llm/command-empty.llm.md +63 -0
  68. package/.llm/command-group.llm.md +83 -0
  69. package/.llm/command-input.llm.md +82 -0
  70. package/.llm/command-item.llm.md +97 -0
  71. package/.llm/command-list.llm.md +53 -0
  72. package/.llm/command-loading.llm.md +48 -0
  73. package/.llm/command-separator.llm.md +44 -0
  74. package/.llm/command-shortcut.llm.md +63 -0
  75. package/.llm/command.llm.md +147 -0
  76. package/.llm/container.llm.md +236 -0
  77. package/.llm/context-menu-checkbox-item.llm.md +97 -0
  78. package/.llm/context-menu-content.llm.md +91 -0
  79. package/.llm/context-menu-group.llm.md +61 -0
  80. package/.llm/context-menu-item.llm.md +94 -0
  81. package/.llm/context-menu-label.llm.md +60 -0
  82. package/.llm/context-menu-portal.llm.md +49 -0
  83. package/.llm/context-menu-radio-group.llm.md +66 -0
  84. package/.llm/context-menu-radio-item.llm.md +76 -0
  85. package/.llm/context-menu-separator.llm.md +51 -0
  86. package/.llm/context-menu-shortcut.llm.md +57 -0
  87. package/.llm/context-menu-sub-content.llm.md +90 -0
  88. package/.llm/context-menu-sub-trigger.llm.md +73 -0
  89. package/.llm/context-menu-sub.llm.md +61 -0
  90. package/.llm/context-menu-trigger.llm.md +53 -0
  91. package/.llm/context-menu.llm.md +103 -0
  92. package/.llm/date-picker.llm.md +90 -0
  93. package/.llm/dialog-close.llm.md +61 -0
  94. package/.llm/dialog-content.llm.md +128 -0
  95. package/.llm/dialog-description.llm.md +44 -0
  96. package/.llm/dialog-footer.llm.md +38 -0
  97. package/.llm/dialog-header.llm.md +40 -0
  98. package/.llm/dialog-overlay.llm.md +57 -0
  99. package/.llm/dialog-portal.llm.md +47 -0
  100. package/.llm/dialog-title.llm.md +41 -0
  101. package/.llm/dialog-trigger.llm.md +51 -0
  102. package/.llm/dialog.llm.md +113 -0
  103. package/.llm/drawer-close.llm.md +53 -0
  104. package/.llm/drawer-content.llm.md +58 -0
  105. package/.llm/drawer-description.llm.md +54 -0
  106. package/.llm/drawer-footer.llm.md +67 -0
  107. package/.llm/drawer-header.llm.md +60 -0
  108. package/.llm/drawer-overlay.llm.md +40 -0
  109. package/.llm/drawer-portal.llm.md +42 -0
  110. package/.llm/drawer-title.llm.md +51 -0
  111. package/.llm/drawer-trigger.llm.md +44 -0
  112. package/.llm/drawer.llm.md +194 -0
  113. package/.llm/dropdown-menu-checkbox-item.llm.md +111 -0
  114. package/.llm/dropdown-menu-content.llm.md +109 -0
  115. package/.llm/dropdown-menu-group.llm.md +38 -0
  116. package/.llm/dropdown-menu-item.llm.md +94 -0
  117. package/.llm/dropdown-menu-label.llm.md +66 -0
  118. package/.llm/dropdown-menu-portal.llm.md +32 -0
  119. package/.llm/dropdown-menu-radio-group.llm.md +73 -0
  120. package/.llm/dropdown-menu-radio-item.llm.md +92 -0
  121. package/.llm/dropdown-menu-separator.llm.md +55 -0
  122. package/.llm/dropdown-menu-shortcut.llm.md +74 -0
  123. package/.llm/dropdown-menu-sub-content.llm.md +80 -0
  124. package/.llm/dropdown-menu-sub-trigger.llm.md +84 -0
  125. package/.llm/dropdown-menu-sub.llm.md +74 -0
  126. package/.llm/dropdown-menu-trigger.llm.md +48 -0
  127. package/.llm/dropdown-menu.llm.md +120 -0
  128. package/.llm/empty-content.llm.md +103 -0
  129. package/.llm/empty-description.llm.md +70 -0
  130. package/.llm/empty-header.llm.md +64 -0
  131. package/.llm/empty-media.llm.md +81 -0
  132. package/.llm/empty-state.llm.md +174 -0
  133. package/.llm/empty-title.llm.md +54 -0
  134. package/.llm/empty.llm.md +158 -0
  135. package/.llm/field-content.llm.md +28 -0
  136. package/.llm/field-description.llm.md +28 -0
  137. package/.llm/field-error.llm.md +41 -0
  138. package/.llm/field-group.llm.md +84 -0
  139. package/.llm/field-label.llm.md +28 -0
  140. package/.llm/field-legend.llm.md +77 -0
  141. package/.llm/field-separator.llm.md +35 -0
  142. package/.llm/field-set.llm.md +80 -0
  143. package/.llm/field-title.llm.md +28 -0
  144. package/.llm/field.llm.md +35 -0
  145. package/.llm/h1.llm.md +108 -0
  146. package/.llm/h2.llm.md +108 -0
  147. package/.llm/h3.llm.md +106 -0
  148. package/.llm/h4.llm.md +104 -0
  149. package/.llm/h5.llm.md +105 -0
  150. package/.llm/h6.llm.md +105 -0
  151. package/.llm/hover-card-content.llm.md +167 -0
  152. package/.llm/hover-card-trigger.llm.md +65 -0
  153. package/.llm/hover-card.llm.md +121 -0
  154. package/.llm/input-group-addon.llm.md +91 -0
  155. package/.llm/input-group-button.llm.md +120 -0
  156. package/.llm/input-group-input.llm.md +145 -0
  157. package/.llm/input-group-text.llm.md +75 -0
  158. package/.llm/input-group-textarea.llm.md +157 -0
  159. package/.llm/input-group.llm.md +108 -0
  160. package/.llm/input.llm.md +319 -0
  161. package/.llm/item-actions.llm.md +77 -0
  162. package/.llm/item-content.llm.md +73 -0
  163. package/.llm/item-description.llm.md +61 -0
  164. package/.llm/item-footer.llm.md +68 -0
  165. package/.llm/item-group.llm.md +73 -0
  166. package/.llm/item-header.llm.md +66 -0
  167. package/.llm/item-media.llm.md +75 -0
  168. package/.llm/item-separator.llm.md +80 -0
  169. package/.llm/item-title.llm.md +59 -0
  170. package/.llm/item.llm.md +115 -0
  171. package/.llm/kbd-group.llm.md +71 -0
  172. package/.llm/kbd.llm.md +71 -0
  173. package/.llm/label.llm.md +145 -0
  174. package/.llm/lead.llm.md +114 -0
  175. package/.llm/menubar-checkbox-item.llm.md +66 -0
  176. package/.llm/menubar-content.llm.md +128 -0
  177. package/.llm/menubar-group.llm.md +40 -0
  178. package/.llm/menubar-item.llm.md +62 -0
  179. package/.llm/menubar-label.llm.md +40 -0
  180. package/.llm/menubar-menu.llm.md +32 -0
  181. package/.llm/menubar-portal.llm.md +38 -0
  182. package/.llm/menubar-radio-group.llm.md +39 -0
  183. package/.llm/menubar-radio-item.llm.md +59 -0
  184. package/.llm/menubar-separator.llm.md +35 -0
  185. package/.llm/menubar-shortcut.llm.md +37 -0
  186. package/.llm/menubar-sub-content.llm.md +127 -0
  187. package/.llm/menubar-sub-trigger.llm.md +51 -0
  188. package/.llm/menubar-sub.llm.md +53 -0
  189. package/.llm/menubar-trigger.llm.md +37 -0
  190. package/.llm/menubar.llm.md +115 -0
  191. package/.llm/navigation-menu-content.llm.md +116 -0
  192. package/.llm/navigation-menu-indicator.llm.md +68 -0
  193. package/.llm/navigation-menu-item.llm.md +62 -0
  194. package/.llm/navigation-menu-link.llm.md +109 -0
  195. package/.llm/navigation-menu-list.llm.md +52 -0
  196. package/.llm/navigation-menu-trigger-style.llm.md +22 -0
  197. package/.llm/navigation-menu-trigger.llm.md +57 -0
  198. package/.llm/navigation-menu-viewport.llm.md +51 -0
  199. package/.llm/navigation-menu.llm.md +184 -0
  200. package/.llm/p.llm.md +110 -0
  201. package/.llm/pagination-content.llm.md +60 -0
  202. package/.llm/pagination-ellipsis.llm.md +107 -0
  203. package/.llm/pagination-item.llm.md +59 -0
  204. package/.llm/pagination-link.llm.md +150 -0
  205. package/.llm/pagination-next.llm.md +115 -0
  206. package/.llm/pagination-previous.llm.md +115 -0
  207. package/.llm/pagination.llm.md +190 -0
  208. package/.llm/popover-anchor.llm.md +53 -0
  209. package/.llm/popover-content.llm.md +109 -0
  210. package/.llm/popover-trigger.llm.md +54 -0
  211. package/.llm/popover.llm.md +116 -0
  212. package/.llm/progress.llm.md +76 -0
  213. package/.llm/radio-group-indicator.llm.md +28 -0
  214. package/.llm/radio-group-item.llm.md +40 -0
  215. package/.llm/radio-group.llm.md +76 -0
  216. package/.llm/resizable-handle.llm.md +156 -0
  217. package/.llm/resizable-panel-group.llm.md +149 -0
  218. package/.llm/resizable-panel.llm.md +157 -0
  219. package/.llm/scroll-area-corner.llm.md +41 -0
  220. package/.llm/scroll-area-thumb.llm.md +39 -0
  221. package/.llm/scroll-area-viewport.llm.md +60 -0
  222. package/.llm/scroll-area.llm.md +125 -0
  223. package/.llm/scroll-bar.llm.md +78 -0
  224. package/.llm/sdk-items-registry.json +3022 -0
  225. package/.llm/select-content.llm.md +139 -0
  226. package/.llm/select-group.llm.md +60 -0
  227. package/.llm/select-item.llm.md +75 -0
  228. package/.llm/select-label.llm.md +62 -0
  229. package/.llm/select-scroll-down-button.llm.md +45 -0
  230. package/.llm/select-scroll-up-button.llm.md +45 -0
  231. package/.llm/select-separator.llm.md +59 -0
  232. package/.llm/select-trigger.llm.md +66 -0
  233. package/.llm/select-value.llm.md +67 -0
  234. package/.llm/select.llm.md +159 -0
  235. package/.llm/separator.llm.md +129 -0
  236. package/.llm/sheet-close.llm.md +49 -0
  237. package/.llm/sheet-content.llm.md +115 -0
  238. package/.llm/sheet-description.llm.md +62 -0
  239. package/.llm/sheet-footer.llm.md +64 -0
  240. package/.llm/sheet-header.llm.md +52 -0
  241. package/.llm/sheet-title.llm.md +53 -0
  242. package/.llm/sheet-trigger.llm.md +46 -0
  243. package/.llm/sheet.llm.md +126 -0
  244. package/.llm/sidebar-content.llm.md +63 -0
  245. package/.llm/sidebar-footer.llm.md +50 -0
  246. package/.llm/sidebar-group-action.llm.md +60 -0
  247. package/.llm/sidebar-group-content.llm.md +64 -0
  248. package/.llm/sidebar-group-label.llm.md +53 -0
  249. package/.llm/sidebar-group.llm.md +56 -0
  250. package/.llm/sidebar-header.llm.md +67 -0
  251. package/.llm/sidebar-input.llm.md +50 -0
  252. package/.llm/sidebar-inset.llm.md +52 -0
  253. package/.llm/sidebar-menu-action.llm.md +84 -0
  254. package/.llm/sidebar-menu-badge.llm.md +60 -0
  255. package/.llm/sidebar-menu-button.llm.md +103 -0
  256. package/.llm/sidebar-menu-item.llm.md +75 -0
  257. package/.llm/sidebar-menu-skeleton.llm.md +76 -0
  258. package/.llm/sidebar-menu-sub-button.llm.md +85 -0
  259. package/.llm/sidebar-menu-sub-item.llm.md +54 -0
  260. package/.llm/sidebar-menu-sub.llm.md +74 -0
  261. package/.llm/sidebar-menu.llm.md +65 -0
  262. package/.llm/sidebar-provider.llm.md +79 -0
  263. package/.llm/sidebar-rail.llm.md +34 -0
  264. package/.llm/sidebar-separator.llm.md +57 -0
  265. package/.llm/sidebar-trigger.llm.md +49 -0
  266. package/.llm/sidebar.llm.md +129 -0
  267. package/.llm/skeleton.llm.md +134 -0
  268. package/.llm/slider.llm.md +173 -0
  269. package/.llm/small.llm.md +110 -0
  270. package/.llm/span.llm.md +118 -0
  271. package/.llm/spinner.llm.md +182 -0
  272. package/.llm/stack.llm.md +28 -0
  273. package/.llm/strong.llm.md +110 -0
  274. package/.llm/switch.llm.md +76 -0
  275. package/.llm/table-body.llm.md +36 -0
  276. package/.llm/table-caption.llm.md +48 -0
  277. package/.llm/table-cell.llm.md +53 -0
  278. package/.llm/table-footer.llm.md +41 -0
  279. package/.llm/table-head.llm.md +69 -0
  280. package/.llm/table-header.llm.md +41 -0
  281. package/.llm/table-row.llm.md +42 -0
  282. package/.llm/table.llm.md +123 -0
  283. package/.llm/tabs-content.llm.md +47 -0
  284. package/.llm/tabs-list.llm.md +41 -0
  285. package/.llm/tabs-trigger.llm.md +47 -0
  286. package/.llm/tabs.llm.md +71 -0
  287. package/.llm/text-field.llm.md +327 -0
  288. package/.llm/textarea.llm.md +311 -0
  289. package/.llm/theme-preference.llm.md +25 -0
  290. package/.llm/theme-toggle.llm.md +57 -0
  291. package/.llm/theme.llm.md +14 -0
  292. package/.llm/toast.llm.md +32 -0
  293. package/.llm/toaster.llm.md +193 -0
  294. package/.llm/toggle-group-item.llm.md +59 -0
  295. package/.llm/toggle-group.llm.md +101 -0
  296. package/.llm/toggle.llm.md +40 -0
  297. package/.llm/tooltip-content.llm.md +185 -0
  298. package/.llm/tooltip-provider.llm.md +68 -0
  299. package/.llm/tooltip-trigger.llm.md +70 -0
  300. package/.llm/tooltip.llm.md +129 -0
  301. package/.llm/typography.llm.md +161 -0
  302. package/.llm/use-carousel.llm.md +55 -0
  303. package/.llm/use-command-state.llm.md +32 -0
  304. package/.llm/use-is-mobile.llm.md +73 -0
  305. package/.llm/use-sidebar.llm.md +61 -0
  306. package/dist/components/ui/scroll-area.d.ts +5 -5
  307. package/dist/components/ui/scroll-area.d.ts.map +1 -1
  308. package/dist/components/ui/stack.d.ts.map +1 -1
  309. package/dist/components/ui/stories/scroll-area.stories.d.ts +1 -1
  310. package/dist/components/ui/theme-toggle.d.ts +0 -3
  311. package/dist/components/ui/theme-toggle.d.ts.map +1 -1
  312. package/dist/components/ui/theme.d.ts.map +1 -1
  313. package/dist/index.js +4972 -9636
  314. package/dist/index.js.map +1 -1
  315. package/dist/tsconfig.tsbuildinfo +1 -1
  316. package/package.json +2 -2
  317. package/src/components/ui/stack.tsx +3 -1
  318. package/src/components/ui/theme-toggle.tsx +1 -3
  319. package/src/components/ui/theme.tsx +6 -1
  320. package/src/styles/globals.css +57 -85
@@ -0,0 +1,327 @@
1
+ # TextField
2
+
3
+ **Type**: component
4
+
5
+ TextField - Complete form field with label, input, and descriptive text A comprehensive form field component that combines Input and Label components with additional helper text and error handling capabilities. Automatically manages accessibility attributes, ID generation, and ARIA relationships to ensure forms are usable by all users including those using assistive technologies. Built on top of the Input and Label primitives, TextField provides a complete form field solution with consistent styling, proper semantic markup, and enhanced UX features. Supports all HTML input types while adding form validation states, descriptive text, and automatic accessibility compliance.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { TextField } from '@neynar/ui';
11
+
12
+ <TextField
13
+ label="value"
14
+ helperText="value"
15
+ error="value"
16
+ required={true}
17
+ id="value"
18
+ type={value}
19
+ placeholder="value"
20
+ value={value}
21
+ defaultValue={value}
22
+ disabled={true}
23
+ readOnly={true}
24
+ name="value"
25
+ autoComplete="value"
26
+ autoFocus={true}
27
+ maxLength={0}
28
+ minLength={0}
29
+ pattern="value"
30
+ min={value}
31
+ max={value}
32
+ step={value}
33
+ onChange={handleChange}
34
+ onFocus={handleFocus}
35
+ onBlur={handleBlur}
36
+ onKeyDown={handleKeyDown}
37
+ onKeyUp={handleKeyUp}
38
+ className="value"
39
+ />
40
+ ```
41
+
42
+ ## Component Props
43
+
44
+ ### label
45
+ - **Type**: `string`
46
+ - **Required**: No
47
+ - **Description**: No description available
48
+
49
+ ### helperText
50
+ - **Type**: `string`
51
+ - **Required**: No
52
+ - **Description**: No description available
53
+
54
+ ### error
55
+ - **Type**: `string`
56
+ - **Required**: No
57
+ - **Description**: No description available
58
+
59
+ ### required
60
+ - **Type**: `boolean`
61
+ - **Required**: No
62
+ - **Description**: No description available
63
+
64
+ ### id
65
+ - **Type**: `string`
66
+ - **Required**: No
67
+ - **Description**: No description available
68
+
69
+ ### type
70
+ - **Type**: `React.HTMLInputTypeAttribute`
71
+ - **Required**: No
72
+ - **Description**: No description available
73
+
74
+ ### placeholder
75
+ - **Type**: `string`
76
+ - **Required**: No
77
+ - **Description**: No description available
78
+
79
+ ### value
80
+ - **Type**: `string | ReadonlyArray<string> | number`
81
+ - **Required**: No
82
+ - **Description**: No description available
83
+
84
+ ### defaultValue
85
+ - **Type**: `string | ReadonlyArray<string> | number`
86
+ - **Required**: No
87
+ - **Description**: No description available
88
+
89
+ ### disabled
90
+ - **Type**: `boolean`
91
+ - **Required**: No
92
+ - **Description**: No description available
93
+
94
+ ### readOnly
95
+ - **Type**: `boolean`
96
+ - **Required**: No
97
+ - **Description**: No description available
98
+
99
+ ### name
100
+ - **Type**: `string`
101
+ - **Required**: No
102
+ - **Description**: No description available
103
+
104
+ ### autoComplete
105
+ - **Type**: `string`
106
+ - **Required**: No
107
+ - **Description**: No description available
108
+
109
+ ### autoFocus
110
+ - **Type**: `boolean`
111
+ - **Required**: No
112
+ - **Description**: No description available
113
+
114
+ ### maxLength
115
+ - **Type**: `number`
116
+ - **Required**: No
117
+ - **Description**: No description available
118
+
119
+ ### minLength
120
+ - **Type**: `number`
121
+ - **Required**: No
122
+ - **Description**: No description available
123
+
124
+ ### pattern
125
+ - **Type**: `string`
126
+ - **Required**: No
127
+ - **Description**: No description available
128
+
129
+ ### min
130
+ - **Type**: `string | number`
131
+ - **Required**: No
132
+ - **Description**: No description available
133
+
134
+ ### max
135
+ - **Type**: `string | number`
136
+ - **Required**: No
137
+ - **Description**: No description available
138
+
139
+ ### step
140
+ - **Type**: `string | number`
141
+ - **Required**: No
142
+ - **Description**: No description available
143
+
144
+ ### onChange
145
+ - **Type**: `(event: React.ChangeEvent<HTMLInputElement>) => void`
146
+ - **Required**: No
147
+ - **Description**: No description available
148
+
149
+ ### onFocus
150
+ - **Type**: `(event: React.FocusEvent<HTMLInputElement>) => void`
151
+ - **Required**: No
152
+ - **Description**: No description available
153
+
154
+ ### onBlur
155
+ - **Type**: `(event: React.FocusEvent<HTMLInputElement>) => void`
156
+ - **Required**: No
157
+ - **Description**: No description available
158
+
159
+ ### onKeyDown
160
+ - **Type**: `(event: React.KeyboardEvent<HTMLInputElement>) => void`
161
+ - **Required**: No
162
+ - **Description**: No description available
163
+
164
+ ### onKeyUp
165
+ - **Type**: `(event: React.KeyboardEvent<HTMLInputElement>) => void`
166
+ - **Required**: No
167
+ - **Description**: No description available
168
+
169
+ ### className
170
+ - **Type**: `string`
171
+ - **Required**: No
172
+ - **Description**: No description available
173
+
174
+ ## Examples
175
+
176
+ ### Example 1
177
+ ```tsx
178
+ // Basic text input with label
179
+ <TextField
180
+ label="Email Address"
181
+ type="email"
182
+ placeholder="Enter your email"
183
+ name="email"
184
+ />
185
+ ```
186
+ ### Example 2
187
+ ```tsx
188
+ // Required field with helper text
189
+ <TextField
190
+ label="Username"
191
+ placeholder="
192
+ ### Example 3
193
+ ```tsx
194
+ // Password field with validation error
195
+ <TextField
196
+ label="Password"
197
+ type="password"
198
+ required
199
+ error="Password must be at least 8 characters long"
200
+ value={password}
201
+ onChange={(e) => setPassword(e.target.value)}
202
+ minLength={8}
203
+ autoComplete="new-password"
204
+ />
205
+ ```
206
+ ### Example 4
207
+ ```tsx
208
+ // Controlled component with real-time validation
209
+ const [email, setEmail] = useState("");
210
+ const [error, setError] = useState("");
211
+ const validateEmail = (value: string) => {
212
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
213
+ if (!emailRegex.test(value)) {
214
+ setError("Please enter a valid email address");
215
+ } else {
216
+ setError("");
217
+ }
218
+ };
219
+ <TextField
220
+ label="Email"
221
+ type="email"
222
+ value={email}
223
+ onChange={(e) => {
224
+ setEmail(e.target.value);
225
+ validateEmail(e.target.value);
226
+ }}
227
+ onBlur={(e) => validateEmail(e.target.value)}
228
+ error={error}
229
+ required
230
+ autoComplete="email"
231
+ />
232
+ ```
233
+ ### Example 5
234
+ ```tsx
235
+ // Number input with constraints
236
+ <TextField
237
+ label="Age"
238
+ type="number"
239
+ min={0}
240
+ max={120}
241
+ step={1}
242
+ helperText="Enter your age in years"
243
+ placeholder="25"
244
+ />
245
+ ```
246
+ ### Example 6
247
+ ```tsx
248
+ // Search input with custom styling
249
+ <TextField
250
+ label="Search"
251
+ type="search"
252
+ placeholder="Search products..."
253
+ className="max-w-md"
254
+ onKeyDown={(e) => {
255
+ if (e.key === 'Enter') {
256
+ handleSearch(e.currentTarget.value);
257
+ }
258
+ }}
259
+ />
260
+ ```
261
+ ### Example 7
262
+ ```tsx
263
+ // Form integration with React Hook Form
264
+ const { register, formState: { errors } } = useForm();
265
+ <form onSubmit={handleSubmit(onSubmit)}>
266
+ <TextField
267
+ label="Full Name"
268
+ {...register("fullName", { required: "Full name is required" })}
269
+ error={errors.fullName?.message}
270
+ helperText="Enter your first and last name"
271
+ />
272
+ <TextField
273
+ label="Phone Number"
274
+ type="tel"
275
+ {...register("phone", {
276
+ pattern: {
277
+ value: /^[\+]?[1-9][\d]{0,15}$/,
278
+ message: "Please enter a valid phone number"
279
+ }
280
+ })}
281
+ error={errors.phone?.message}
282
+ autoComplete="tel"
283
+ />
284
+ </form>
285
+ ```
286
+ ### Example 8
287
+ ```tsx
288
+ // File input with custom validation
289
+ <TextField
290
+ label="Profile Picture"
291
+ type="file"
292
+ accept="image/*"
293
+ helperText="Upload a PNG, JPG or GIF (max 5MB)"
294
+ onChange={(e) => {
295
+ const file = e.target.files?.[0];
296
+ if (file && file.size > 5 * 1024 * 1024) {
297
+ setError("File size must be less than 5MB");
298
+ } else {
299
+ setError("");
300
+ handleFileUpload(file);
301
+ }
302
+ }}
303
+ error={fileError}
304
+ />
305
+ ```
306
+ ### Example 9
307
+ ```tsx
308
+ // Date input with range constraints
309
+ <TextField
310
+ label="Birth Date"
311
+ type="date"
312
+ min="1900-01-01"
313
+ max={new Date().toISOString().split('T')[0]}
314
+ helperText="You must be 18 or older to register"
315
+ required
316
+ />
317
+ ```
318
+ ### Example 10
319
+ ```tsx
320
+ // Disabled field with explanation
321
+ <TextField
322
+ label="Account ID"
323
+ value="ACC-12345"
324
+ disabled
325
+ helperText="This value is automatically generated and cannot be changed"
326
+ />
327
+ ```
@@ -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