@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,116 @@
1
+ # Popover
2
+
3
+ **Type**: component
4
+
5
+ Popover displays rich content in a portal, triggered by a button A versatile floating panel component built on Radix UI primitives that displays interactive content without navigating away from the current context. Unlike tooltips, popovers support complex layouts, forms, and user interactions while maintaining proper focus management and accessibility standards.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { Popover } from '@neynar/ui';
11
+
12
+ <Popover
13
+ open={true}
14
+ onOpenChange={handleOpenChange}
15
+ defaultOpen={true}
16
+ modal={true}
17
+ dir={value}
18
+ >
19
+ {/* Your content here */}
20
+ </Popover>
21
+ ```
22
+
23
+ ## Component Props
24
+
25
+ ### open
26
+ - **Type**: `boolean`
27
+ - **Required**: No
28
+ - **Description**: No description available
29
+
30
+ ### onOpenChange
31
+ - **Type**: `(open: boolean) => void`
32
+ - **Required**: No
33
+ - **Description**: No description available
34
+
35
+ ### defaultOpen
36
+ - **Type**: `boolean`
37
+ - **Required**: No
38
+ - **Description**: No description available
39
+
40
+ ### modal
41
+ - **Type**: `boolean`
42
+ - **Required**: No
43
+ - **Description**: No description available
44
+
45
+ ### dir
46
+ - **Type**: `"ltr" | "rtl"`
47
+ - **Required**: No
48
+ - **Description**: No description available
49
+
50
+ ### children
51
+ - **Type**: `React.ReactNode`
52
+ - **Required**: No
53
+ - **Description**: No description available
54
+
55
+ ## Examples
56
+
57
+ ### Example 1
58
+ ```tsx
59
+ // Basic popover with information
60
+ <Popover>
61
+ <PopoverTrigger asChild>
62
+ <Button variant="outline">Open popover</Button>
63
+ </PopoverTrigger>
64
+ <PopoverContent>
65
+ <div className="grid gap-4">
66
+ <h4 className="font-medium leading-none">Dimensions</h4>
67
+ <p className="text-sm text-muted-foreground">
68
+ Set the dimensions for the layer.
69
+ </p>
70
+ </div>
71
+ </PopoverContent>
72
+ </Popover>
73
+ ```
74
+ ### Example 2
75
+ ```tsx
76
+ // Controlled popover with form interactions
77
+ const [open, setOpen] = useState(false);
78
+ <Popover open={open} onOpenChange={setOpen}>
79
+ <PopoverTrigger asChild>
80
+ <Button>Settings</Button>
81
+ </PopoverTrigger>
82
+ <PopoverContent className="w-80">
83
+ <div className="grid gap-4">
84
+ <div className="space-y-2">
85
+ <h4 className="font-medium leading-none">Settings</h4>
86
+ <p className="text-sm text-muted-foreground">
87
+ Configure your preferences
88
+ </p>
89
+ </div>
90
+ <div className="grid gap-2">
91
+ <Label htmlFor="width">Width</Label>
92
+ <Input id="width" defaultValue="100%" />
93
+ </div>
94
+ </div>
95
+ </PopoverContent>
96
+ </Popover>
97
+ ```
98
+ ### Example 3
99
+ ```tsx
100
+ // Positioned popover with custom alignment
101
+ <Popover>
102
+ <PopoverTrigger asChild>
103
+ <Button variant="ghost" size="icon">
104
+ <HelpCircle className="h-4 w-4" />
105
+ </Button>
106
+ </PopoverTrigger>
107
+ <PopoverContent side="top" align="start" className="w-80">
108
+ <div className="space-y-2">
109
+ <h4 className="font-medium">Help Information</h4>
110
+ <p className="text-sm text-muted-foreground">
111
+ Additional context and helpful tips for this feature.
112
+ </p>
113
+ </div>
114
+ </PopoverContent>
115
+ </Popover>
116
+ ```
@@ -0,0 +1,76 @@
1
+ # Progress
2
+
3
+ **Type**: component
4
+
5
+ Progress - Visual progress indicator for tasks and operations A customizable progress bar component built on Radix UI Progress primitive that displays the completion status of tasks, file uploads, multi-step processes, and other operations requiring user feedback. Features smooth animations, accessibility support, and flexible styling options.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { Progress } from '@neynar/ui';
11
+
12
+ <Progress
13
+ value={value}
14
+ max={0}
15
+ getValueLabel={() => {}}
16
+ className="value"
17
+ asChild={true}
18
+ "aria-label"="value"
19
+ "aria-valuetext"="value"
20
+ "aria-describedby"="value"
21
+ "aria-labelledby"="value"
22
+ id="value"
23
+ />
24
+ ```
25
+
26
+ ## Component Props
27
+
28
+ ### value
29
+ - **Type**: `number | null`
30
+ - **Required**: No
31
+ - **Description**: No description available
32
+
33
+ ### max
34
+ - **Type**: `number`
35
+ - **Required**: No
36
+ - **Description**: No description available
37
+
38
+ ### getValueLabel
39
+ - **Type**: `(value: number, max: number) => string`
40
+ - **Required**: No
41
+ - **Description**: No description available
42
+
43
+ ### className
44
+ - **Type**: `string`
45
+ - **Required**: No
46
+ - **Description**: No description available
47
+
48
+ ### asChild
49
+ - **Type**: `boolean`
50
+ - **Required**: No
51
+ - **Description**: No description available
52
+
53
+ ### "aria-label"
54
+ - **Type**: `string`
55
+ - **Required**: No
56
+ - **Description**: No description available
57
+
58
+ ### "aria-valuetext"
59
+ - **Type**: `string`
60
+ - **Required**: No
61
+ - **Description**: No description available
62
+
63
+ ### "aria-describedby"
64
+ - **Type**: `string`
65
+ - **Required**: No
66
+ - **Description**: No description available
67
+
68
+ ### "aria-labelledby"
69
+ - **Type**: `string`
70
+ - **Required**: No
71
+ - **Description**: No description available
72
+
73
+ ### id
74
+ - **Type**: `string`
75
+ - **Required**: No
76
+ - **Description**: No description available
@@ -0,0 +1,28 @@
1
+ # RadioGroupIndicator
2
+
3
+ **Type**: component
4
+
5
+ Visual indicator shown when a RadioGroupItem is in the checked state RadioGroupIndicator automatically appears inside RadioGroupItem when that item is selected. It provides the visual feedback for the checked state using a filled circle icon. The indicator is automatically managed by the RadioGroupItem and only renders when checked. This component is typically not used directly but is included in RadioGroupItem. It can be customized or replaced using the asChild pattern if needed.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { RadioGroupIndicator } from '@neynar/ui';
11
+
12
+ <RadioGroupIndicator
13
+ forceMount={true}
14
+ asChild={true}
15
+ />
16
+ ```
17
+
18
+ ## Component Props
19
+
20
+ ### forceMount
21
+ - **Type**: `boolean`
22
+ - **Required**: No
23
+ - **Description**: Used to force mounting when more control is needed. Useful when controlling animation with React animation libraries
24
+
25
+ ### asChild
26
+ - **Type**: `boolean`
27
+ - **Required**: No
28
+ - **Description**: Change the default rendered element for the one passed as a child
@@ -0,0 +1,40 @@
1
+ # RadioGroupItem
2
+
3
+ **Type**: component
4
+
5
+ Individual radio button item for use within RadioGroup RadioGroupItem represents a single selectable option in a radio group. Must be used within a RadioGroup component and should be paired with a Label for proper accessibility. The component automatically handles visual states including checked, unchecked, focused, and disabled. It includes a built-in indicator that displays when the item is selected. Each radio item requires a unique value prop that identifies it within the group. The component forwards all standard button attributes and supports custom styling via className.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { RadioGroupItem } from '@neynar/ui';
11
+
12
+ <RadioGroupItem
13
+ value="value"
14
+ disabled={true}
15
+ required={true}
16
+ asChild={true}
17
+ />
18
+ ```
19
+
20
+ ## Component Props
21
+
22
+ ### value
23
+ - **Type**: `string`
24
+ - **Required**: Yes
25
+ - **Description**: The value given as data when submitted with a name (required)
26
+
27
+ ### disabled
28
+ - **Type**: `boolean`
29
+ - **Required**: No
30
+ - **Description**: When true, prevents the user from interacting with the item
31
+
32
+ ### required
33
+ - **Type**: `boolean`
34
+ - **Required**: No
35
+ - **Description**: When true, indicates that the user must check the item before the owning form can be submitted
36
+
37
+ ### asChild
38
+ - **Type**: `boolean`
39
+ - **Required**: No
40
+ - **Description**: Change the default rendered element for the one passed as a child
@@ -0,0 +1,76 @@
1
+ # RadioGroup
2
+
3
+ **Type**: component
4
+
5
+ A radio group component for single selection from multiple options RadioGroup allows users to select exactly one option from a set of mutually exclusive choices. Built on Radix UI RadioGroup primitives with enhanced accessibility and keyboard navigation. Each radio group should contain RadioGroupItem components paired with Labels for proper accessibility. The component follows the WAI-ARIA Radio Group design pattern and uses roving tabindex to manage focus movement among radio items. It provides comprehensive keyboard navigation with arrow keys and supports both controlled and uncontrolled usage patterns.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { RadioGroup } from '@neynar/ui';
11
+
12
+ <RadioGroup
13
+ defaultValue="value"
14
+ value="value"
15
+ onValueChange={handleValueChange}
16
+ disabled={true}
17
+ name="value"
18
+ required={true}
19
+ orientation={value}
20
+ dir={value}
21
+ loop={true}
22
+ asChild={true}
23
+ />
24
+ ```
25
+
26
+ ## Component Props
27
+
28
+ ### defaultValue
29
+ - **Type**: `string`
30
+ - **Required**: No
31
+ - **Description**: The value of the radio item that should be checked when initially rendered. Use when you do not need to control the checked state
32
+
33
+ ### value
34
+ - **Type**: `string`
35
+ - **Required**: No
36
+ - **Description**: The controlled value of the radio item to check. Should be used in conjunction with onValueChange
37
+
38
+ ### onValueChange
39
+ - **Type**: `(value: string) => void`
40
+ - **Required**: No
41
+ - **Description**: Event handler called when the value changes
42
+
43
+ ### disabled
44
+ - **Type**: `boolean`
45
+ - **Required**: No
46
+ - **Description**: When true, prevents the user from interacting with the radio group
47
+
48
+ ### name
49
+ - **Type**: `string`
50
+ - **Required**: No
51
+ - **Description**: The name of the group. Submitted with its owning form as part of a name/value pair
52
+
53
+ ### required
54
+ - **Type**: `boolean`
55
+ - **Required**: No
56
+ - **Description**: When true, indicates that the user must check a radio item before the owning form can be submitted
57
+
58
+ ### orientation
59
+ - **Type**: `"horizontal" | "vertical"`
60
+ - **Required**: No
61
+ - **Description**: The orientation of the component, which determines how focus moves
62
+
63
+ ### dir
64
+ - **Type**: `"ltr" | "rtl"`
65
+ - **Required**: No
66
+ - **Description**: The reading direction of the radio group. If omitted, assumes LTR reading mode
67
+
68
+ ### loop
69
+ - **Type**: `boolean`
70
+ - **Required**: No
71
+ - **Description**: When true, keyboard navigation will loop from last item to first, and vice versa
72
+
73
+ ### asChild
74
+ - **Type**: `boolean`
75
+ - **Required**: No
76
+ - **Description**: Change the default rendered element for the one passed as a child
@@ -0,0 +1,156 @@
1
+ # ResizableHandle
2
+
3
+ **Type**: component
4
+
5
+ Interactive handle for resizing panels with full keyboard and pointer support ResizableHandle provides the draggable area between panels that allows users to resize them via mouse, touch, or keyboard interaction. Supports optional visual grip indicators, custom hit areas, and comprehensive event callbacks for advanced interaction patterns. Automatically adapts styling based on panel group direction.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { ResizableHandle } from '@neynar/ui';
11
+
12
+ <ResizableHandle
13
+ withHandle={true}
14
+ id={value}
15
+ disabled={true}
16
+ hitAreaMargins={value}
17
+ onDragging={handleDragging}
18
+ onBlur={handleBlur}
19
+ onClick={handleClick}
20
+ onFocus={handleFocus}
21
+ onPointerDown={handlePointerDown}
22
+ onPointerUp={handlePointerUp}
23
+ tabIndex={0}
24
+ tagName={value}
25
+ className="value"
26
+ style={value}
27
+ >
28
+ {/* Your content here */}
29
+ </ResizableHandle>
30
+ ```
31
+
32
+ ## Component Props
33
+
34
+ ### withHandle
35
+ - **Type**: `boolean`
36
+ - **Required**: No
37
+ - **Description**: Whether to display built-in visual grip indicator
38
+
39
+ ### id
40
+ - **Type**: `string | null`
41
+ - **Required**: No
42
+ - **Description**: Unique identifier for the resize handle
43
+
44
+ ### disabled
45
+ - **Type**: `boolean`
46
+ - **Required**: No
47
+ - **Description**: Whether handle is disabled and non-interactive
48
+
49
+ ### hitAreaMargins
50
+ - **Type**: `{
51
+ coarse: number;
52
+ fine: number;
53
+ }`
54
+ - **Required**: No
55
+ - **Description**: Custom hit area margins for easier grabbing (coarse: touch devices, fine: mouse)
56
+
57
+ ### onDragging
58
+ - **Type**: `(isDragging: boolean) => void`
59
+ - **Required**: No
60
+ - **Description**: Callback fired when drag state changes with boolean indicating if currently dragging
61
+
62
+ ### onBlur
63
+ - **Type**: `() => void`
64
+ - **Required**: No
65
+ - **Description**: Callback fired when handle loses keyboard focus
66
+
67
+ ### onClick
68
+ - **Type**: `() => void`
69
+ - **Required**: No
70
+ - **Description**: Callback fired when handle is clicked
71
+
72
+ ### onFocus
73
+ - **Type**: `() => void`
74
+ - **Required**: No
75
+ - **Description**: Callback fired when handle receives keyboard focus
76
+
77
+ ### onPointerDown
78
+ - **Type**: `() => void`
79
+ - **Required**: No
80
+ - **Description**: Callback fired when pointer/touch starts on handle
81
+
82
+ ### onPointerUp
83
+ - **Type**: `() => void`
84
+ - **Required**: No
85
+ - **Description**: Callback fired when pointer/touch ends on handle
86
+
87
+ ### tabIndex
88
+ - **Type**: `number`
89
+ - **Required**: No
90
+ - **Description**: Tab order for keyboard navigation (0 makes it focusable)
91
+
92
+ ### tagName
93
+ - **Type**: `keyof React.JSX.IntrinsicElements`
94
+ - **Required**: No
95
+ - **Description**: No description available
96
+
97
+ ### className
98
+ - **Type**: `string`
99
+ - **Required**: No
100
+ - **Description**: Additional CSS classes for custom styling
101
+
102
+ ### style
103
+ - **Type**: `React.CSSProperties`
104
+ - **Required**: No
105
+ - **Description**: No description available
106
+
107
+ ### children
108
+ - **Type**: `React.ReactNode`
109
+ - **Required**: No
110
+ - **Description**: Custom handle content (overrides withHandle prop)
111
+
112
+ ## Examples
113
+
114
+ ### Example 1
115
+ ```tsx
116
+ // Basic invisible handle (common for clean designs)
117
+ <ResizableHandle />
118
+ ```
119
+ ### Example 2
120
+ ```tsx
121
+ // Handle with visual grip indicator
122
+ <ResizableHandle withHandle />
123
+ ```
124
+ ### Example 3
125
+ ```tsx
126
+ // Custom styled handle with interaction callbacks
127
+ <ResizableHandle
128
+ withHandle
129
+ className="bg-blue-200 hover:bg-blue-300 transition-colors"
130
+ onDragging={(isDragging) => {
131
+ console.log(isDragging ? 'Started dragging' : 'Stopped dragging');
132
+ }}
133
+ hitAreaMargins={{ coarse: 20, fine: 10 }}
134
+ />
135
+ ```
136
+ ### Example 4
137
+ ```tsx
138
+ // Disabled handle for non-interactive layouts
139
+ <ResizableHandle
140
+ disabled
141
+ className="opacity-50 cursor-not-allowed"
142
+ />
143
+ ```
144
+ ### Example 5
145
+ ```tsx
146
+ // Custom handle with event handling
147
+ <ResizableHandle
148
+ id="main-handle"
149
+ onFocus={() => console.log('Handle focused')}
150
+ onBlur={() => console.log('Handle blurred')}
151
+ onClick={() => console.log('Handle clicked')}
152
+ tabIndex={0}
153
+ >
154
+ <CustomGripIcon />
155
+ </ResizableHandle>
156
+ ```
@@ -0,0 +1,149 @@
1
+ # ResizablePanelGroup
2
+
3
+ **Type**: component
4
+
5
+ Container for creating resizable panel groups with full keyboard accessibility ResizablePanelGroup provides a flexible container for organizing multiple resizable panels that can be resized by dragging handles between them or using keyboard navigation. Built on react-resizable-panels with enhanced styling, accessibility, and persistence features. Supports both horizontal and vertical layouts with automatic layout saving and restoration.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { ResizablePanelGroup } from '@neynar/ui';
11
+
12
+ <ResizablePanelGroup
13
+ direction={value}
14
+ autoSaveId={value}
15
+ id={value}
16
+ keyboardResizeBy={value}
17
+ onLayout={handleLayout}
18
+ storage={value}
19
+ dir={value}
20
+ tagName={value}
21
+ className="value"
22
+ style={value}
23
+ >
24
+ {/* Your content here */}
25
+ </ResizablePanelGroup>
26
+ ```
27
+
28
+ ## Component Props
29
+
30
+ ### direction
31
+ - **Type**: `"horizontal" | "vertical"`
32
+ - **Required**: Yes
33
+ - **Description**: Layout direction: "horizontal" for side-by-side, "vertical" for top-to-bottom
34
+
35
+ ### autoSaveId
36
+ - **Type**: `string | null`
37
+ - **Required**: No
38
+ - **Description**: Unique identifier for automatically saving/restoring panel layouts
39
+
40
+ ### id
41
+ - **Type**: `string | null`
42
+ - **Required**: No
43
+ - **Description**: No description available
44
+
45
+ ### keyboardResizeBy
46
+ - **Type**: `number | null`
47
+ - **Required**: No
48
+ - **Description**: Increment in percentage points for keyboard-based resizing
49
+
50
+ ### onLayout
51
+ - **Type**: `(layout: number[]) => void`
52
+ - **Required**: No
53
+ - **Description**: Callback fired when panel sizes change, receives array of percentages
54
+
55
+ ### storage
56
+ - **Type**: `{
57
+ getItem(name: string): string | null;
58
+ setItem(name: string, value: string): void;
59
+ }`
60
+ - **Required**: No
61
+ - **Description**: Custom storage implementation for layout persistence (defaults to localStorage)
62
+
63
+ ### dir
64
+ - **Type**: `"auto" | "ltr" | "rtl"`
65
+ - **Required**: No
66
+ - **Description**: Text direction for RTL/LTR layout support
67
+
68
+ ### tagName
69
+ - **Type**: `keyof React.JSX.IntrinsicElements`
70
+ - **Required**: No
71
+ - **Description**: No description available
72
+
73
+ ### className
74
+ - **Type**: `string`
75
+ - **Required**: No
76
+ - **Description**: Additional CSS classes for custom styling
77
+
78
+ ### style
79
+ - **Type**: `React.CSSProperties`
80
+ - **Required**: No
81
+ - **Description**: No description available
82
+
83
+ ### children
84
+ - **Type**: `React.ReactNode`
85
+ - **Required**: No
86
+ - **Description**: ResizablePanel and ResizableHandle components
87
+
88
+ ## Examples
89
+
90
+ ### Example 1
91
+ ```tsx
92
+ // Basic horizontal layout
93
+ <ResizablePanelGroup direction="horizontal" className="h-full">
94
+ <ResizablePanel defaultSize={50}>
95
+ <div className="p-4">Left panel content</div>
96
+ </ResizablePanel>
97
+ <ResizableHandle />
98
+ <ResizablePanel defaultSize={50}>
99
+ <div className="p-4">Right panel content</div>
100
+ </ResizablePanel>
101
+ </ResizablePanelGroup>
102
+ ```
103
+ ### Example 2
104
+ ```tsx
105
+ // Vertical layout with visual handles
106
+ <ResizablePanelGroup direction="vertical" className="min-h-[400px]">
107
+ <ResizablePanel defaultSize={30}>
108
+ <header className="p-4">Header content</header>
109
+ </ResizablePanel>
110
+ <ResizableHandle withHandle />
111
+ <ResizablePanel defaultSize={70}>
112
+ <main className="p-4">Main content area</main>
113
+ </ResizablePanel>
114
+ </ResizablePanelGroup>
115
+ ```
116
+ ### Example 3
117
+ ```tsx
118
+ // Persistent layout with auto-save
119
+ <ResizablePanelGroup
120
+ direction="horizontal"
121
+ autoSaveId="main-layout"
122
+ onLayout={(sizes) => console.log('Layout changed:', sizes)}
123
+ >
124
+ <ResizablePanel defaultSize={25} minSize={20} maxSize={40}>
125
+ <nav>Sidebar (20-40%)</nav>
126
+ </ResizablePanel>
127
+ <ResizableHandle withHandle />
128
+ <ResizablePanel defaultSize={75} minSize={60}>
129
+ <main>Content area (min 60%)</main>
130
+ </ResizablePanel>
131
+ </ResizablePanelGroup>
132
+ ```
133
+ ### Example 4
134
+ ```tsx
135
+ // Custom keyboard resize increment
136
+ <ResizablePanelGroup
137
+ direction="horizontal"
138
+ keyboardResizeBy={5}
139
+ dir="ltr"
140
+ >
141
+ <ResizablePanel defaultSize={50} id="left-panel">
142
+ <div>Panel content</div>
143
+ </ResizablePanel>
144
+ <ResizableHandle />
145
+ <ResizablePanel defaultSize={50} id="right-panel">
146
+ <div>Panel content</div>
147
+ </ResizablePanel>
148
+ </ResizablePanelGroup>
149
+ ```