@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,123 @@
1
+ # Table
2
+
3
+ **Type**: component
4
+
5
+ Table - A responsive data table component for displaying structured information Built on semantic HTML table elements with responsive scrolling and proper accessibility. Follows shadcn/ui patterns for data presentation and can be enhanced with TanStack Table for sorting, filtering, and pagination. Perfect for dashboards, data management, and structured content display.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { Table } from '@neynar/ui';
11
+
12
+ <Table
13
+ className="value"
14
+ summary="value"
15
+ "aria-label"="value"
16
+ "aria-describedby"="value"
17
+ role="value"
18
+ >
19
+ {/* Your content here */}
20
+ </Table>
21
+ ```
22
+
23
+ ## Component Props
24
+
25
+ ### className
26
+ - **Type**: `string`
27
+ - **Required**: No
28
+ - **Description**: No description available
29
+
30
+ ### children
31
+ - **Type**: `React.ReactNode`
32
+ - **Required**: No
33
+ - **Description**: No description available
34
+
35
+ ### summary
36
+ - **Type**: `string`
37
+ - **Required**: No
38
+ - **Description**: No description available
39
+
40
+ ### "aria-label"
41
+ - **Type**: `string`
42
+ - **Required**: No
43
+ - **Description**: No description available
44
+
45
+ ### "aria-describedby"
46
+ - **Type**: `string`
47
+ - **Required**: No
48
+ - **Description**: No description available
49
+
50
+ ### role
51
+ - **Type**: `string`
52
+ - **Required**: No
53
+ - **Description**: No description available
54
+
55
+ ## Examples
56
+
57
+ ### Example 1
58
+ ```tsx
59
+ // Basic table with Farcaster user data
60
+ <Table>
61
+ <TableCaption>Recent casts from your network</TableCaption>
62
+ <TableHeader>
63
+ <TableRow>
64
+ <TableHead>User</TableHead>
65
+ <TableHead>Channel</TableHead>
66
+ <TableHead>Content</TableHead>
67
+ <TableHead className="text-right">Reactions</TableHead>
68
+ </TableRow>
69
+ </TableHeader>
70
+ <TableBody>
71
+ <TableRow>
72
+ <TableCell className="font-medium">
73
+ ### Example 2
74
+ ```tsx
75
+ // Table with selection and actions
76
+ <Table>
77
+ <TableHeader>
78
+ <TableRow>
79
+ <TableHead className="w-[50px]">
80
+ <Checkbox />
81
+ </TableHead>
82
+ <TableHead>User</TableHead>
83
+ <TableHead>FID</TableHead>
84
+ <TableHead className="text-right">Actions</TableHead>
85
+ </TableRow>
86
+ </TableHeader>
87
+ <TableBody>
88
+ <TableRow data-state="selected">
89
+ <TableCell><Checkbox checked /></TableCell>
90
+ <TableCell>
91
+ ### Example 3
92
+ ```tsx
93
+ // Table with footer totals
94
+ <Table>
95
+ <TableBody>
96
+ <TableRow>
97
+ <TableCell>/farcaster</TableCell>
98
+ <TableCell className="text-right">5,234</TableCell>
99
+ </TableRow>
100
+ </TableBody>
101
+ <TableFooter>
102
+ <TableRow>
103
+ <TableCell>Total</TableCell>
104
+ <TableCell className="text-right">15,767</TableCell>
105
+ </TableRow>
106
+ </TableFooter>
107
+ </Table>
108
+ ```
109
+ ### Example 4
110
+ ```tsx
111
+ // Table with custom attributes for data integration
112
+ <Table role="table" aria-label="User analytics dashboard">
113
+ <TableCaption>Showing 1-10 of 50 users</TableCaption>
114
+ <TableHeader>
115
+ <TableRow>
116
+ <TableHead scope="col">User</TableHead>
117
+ <TableHead scope="col">FID</TableHead>
118
+ <TableHead scope="col" className="text-right">Casts</TableHead>
119
+ </TableRow>
120
+ </TableHeader>
121
+ <TableBody>
122
+ <TableRow data-user-id="3">
123
+ <TableCell>
@@ -0,0 +1,47 @@
1
+ # TabsContent
2
+
3
+ **Type**: component
4
+
5
+ Content panel that displays when its associated tab trigger is active. Each content panel is linked to a specific trigger via the `value` prop. Only one content panel is visible at a time, creating a clean tabbed interface. The component handles enter/exit animations and proper focus management when tabs change.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { TabsContent } from '@neynar/ui';
11
+
12
+ <TabsContent
13
+ value="value"
14
+ forceMount={true}
15
+ className="value"
16
+ asChild={true}
17
+ >
18
+ {/* Your content here */}
19
+ </TabsContent>
20
+ ```
21
+
22
+ ## Component Props
23
+
24
+ ### value
25
+ - **Type**: `string`
26
+ - **Required**: Yes
27
+ - **Description**: No description available
28
+
29
+ ### forceMount
30
+ - **Type**: `boolean`
31
+ - **Required**: No
32
+ - **Description**: No description available
33
+
34
+ ### className
35
+ - **Type**: `string`
36
+ - **Required**: No
37
+ - **Description**: No description available
38
+
39
+ ### children
40
+ - **Type**: `React.ReactNode`
41
+ - **Required**: No
42
+ - **Description**: No description available
43
+
44
+ ### asChild
45
+ - **Type**: `boolean`
46
+ - **Required**: No
47
+ - **Description**: No description available
@@ -0,0 +1,41 @@
1
+ # TabsList
2
+
3
+ **Type**: component
4
+
5
+ Container component that groups all tab trigger buttons together. Provides consistent styling and layout for tab triggers with a unified background and proper spacing. The list maintains the tab order and handles focus management within the tabbed interface.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { TabsList } from '@neynar/ui';
11
+
12
+ <TabsList
13
+ loop={true}
14
+ className="value"
15
+ asChild={true}
16
+ >
17
+ {/* Your content here */}
18
+ </TabsList>
19
+ ```
20
+
21
+ ## Component Props
22
+
23
+ ### loop
24
+ - **Type**: `boolean`
25
+ - **Required**: No
26
+ - **Description**: No description available
27
+
28
+ ### className
29
+ - **Type**: `string`
30
+ - **Required**: No
31
+ - **Description**: No description available
32
+
33
+ ### children
34
+ - **Type**: `React.ReactNode`
35
+ - **Required**: No
36
+ - **Description**: No description available
37
+
38
+ ### asChild
39
+ - **Type**: `boolean`
40
+ - **Required**: No
41
+ - **Description**: No description available
@@ -0,0 +1,47 @@
1
+ # TabsTrigger
2
+
3
+ **Type**: component
4
+
5
+ Individual clickable button that activates its associated tab content. Each trigger is associated with a specific tab panel via the `value` prop. The component automatically handles active states, focus management, and accessibility attributes. Supports icons, text, and custom content.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { TabsTrigger } from '@neynar/ui';
11
+
12
+ <TabsTrigger
13
+ value="value"
14
+ disabled={true}
15
+ className="value"
16
+ asChild={true}
17
+ >
18
+ {/* Your content here */}
19
+ </TabsTrigger>
20
+ ```
21
+
22
+ ## Component Props
23
+
24
+ ### value
25
+ - **Type**: `string`
26
+ - **Required**: Yes
27
+ - **Description**: No description available
28
+
29
+ ### disabled
30
+ - **Type**: `boolean`
31
+ - **Required**: No
32
+ - **Description**: No description available
33
+
34
+ ### className
35
+ - **Type**: `string`
36
+ - **Required**: No
37
+ - **Description**: No description available
38
+
39
+ ### children
40
+ - **Type**: `React.ReactNode`
41
+ - **Required**: No
42
+ - **Description**: No description available
43
+
44
+ ### asChild
45
+ - **Type**: `boolean`
46
+ - **Required**: No
47
+ - **Description**: No description available
@@ -0,0 +1,71 @@
1
+ # Tabs
2
+
3
+ **Type**: component
4
+
5
+ A tabbed interface component for organizing content into multiple sections. Tabs provide an intuitive way to organize and display content in separate panels, with only one panel visible at a time. Built on Radix UI's robust accessibility foundation with full keyboard navigation, focus management, and screen reader support. The component supports both controlled and uncontrolled usage patterns, allowing for flexible integration in various application contexts. Each tab consists of a trigger (button) that activates its corresponding content panel.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { Tabs } from '@neynar/ui';
11
+
12
+ <Tabs
13
+ defaultValue="value"
14
+ value="value"
15
+ onValueChange={handleValueChange}
16
+ orientation={value}
17
+ dir={value}
18
+ activationMode={value}
19
+ className="value"
20
+ asChild={true}
21
+ >
22
+ {/* Your content here */}
23
+ </Tabs>
24
+ ```
25
+
26
+ ## Component Props
27
+
28
+ ### defaultValue
29
+ - **Type**: `string`
30
+ - **Required**: No
31
+ - **Description**: No description available
32
+
33
+ ### value
34
+ - **Type**: `string`
35
+ - **Required**: No
36
+ - **Description**: No description available
37
+
38
+ ### onValueChange
39
+ - **Type**: `(value: string) => void`
40
+ - **Required**: No
41
+ - **Description**: No description available
42
+
43
+ ### orientation
44
+ - **Type**: `"horizontal" | "vertical"`
45
+ - **Required**: No
46
+ - **Description**: No description available
47
+
48
+ ### dir
49
+ - **Type**: `"ltr" | "rtl"`
50
+ - **Required**: No
51
+ - **Description**: No description available
52
+
53
+ ### activationMode
54
+ - **Type**: `"automatic" | "manual"`
55
+ - **Required**: No
56
+ - **Description**: No description available
57
+
58
+ ### className
59
+ - **Type**: `string`
60
+ - **Required**: No
61
+ - **Description**: No description available
62
+
63
+ ### children
64
+ - **Type**: `React.ReactNode`
65
+ - **Required**: No
66
+ - **Description**: No description available
67
+
68
+ ### asChild
69
+ - **Type**: `boolean`
70
+ - **Required**: No
71
+ - **Description**: No description available
@@ -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
+ ```