@neynar/ui 0.1.2 → 0.2.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 (282) hide show
  1. package/dist/components/ui/stack.d.ts +2 -1
  2. package/dist/components/ui/stack.d.ts.map +1 -1
  3. package/dist/components/ui/stories/stack.stories.d.ts +1 -1
  4. package/dist/components/ui/stories/typography.stories.d.ts.map +1 -1
  5. package/dist/components/ui/typography.d.ts +41 -40
  6. package/dist/components/ui/typography.d.ts.map +1 -1
  7. package/dist/index.js +26807 -18714
  8. package/dist/index.js.map +1 -1
  9. package/dist/tsconfig.tsbuildinfo +1 -1
  10. package/docs/llm/components/typography.md +92 -88
  11. package/llm-docs/a.llm.md +145 -0
  12. package/llm-docs/accordion-content.llm.md +67 -0
  13. package/llm-docs/accordion-item.llm.md +61 -0
  14. package/llm-docs/accordion-trigger.llm.md +69 -0
  15. package/llm-docs/accordion.llm.md +88 -0
  16. package/llm-docs/alert-description.llm.md +78 -0
  17. package/llm-docs/alert-dialog-action.llm.md +51 -0
  18. package/llm-docs/alert-dialog-cancel.llm.md +48 -0
  19. package/llm-docs/alert-dialog-content.llm.md +88 -0
  20. package/llm-docs/alert-dialog-description.llm.md +53 -0
  21. package/llm-docs/alert-dialog-footer.llm.md +41 -0
  22. package/llm-docs/alert-dialog-header.llm.md +39 -0
  23. package/llm-docs/alert-dialog-overlay.llm.md +44 -0
  24. package/llm-docs/alert-dialog-portal.llm.md +41 -0
  25. package/llm-docs/alert-dialog-title.llm.md +46 -0
  26. package/llm-docs/alert-dialog-trigger.llm.md +40 -0
  27. package/llm-docs/alert-dialog.llm.md +80 -0
  28. package/llm-docs/alert-title.llm.md +48 -0
  29. package/llm-docs/alert.llm.md +92 -0
  30. package/llm-docs/aspect-ratio.llm.md +41 -0
  31. package/llm-docs/avatar-fallback.llm.md +41 -0
  32. package/llm-docs/avatar-image.llm.md +48 -0
  33. package/llm-docs/avatar.llm.md +35 -0
  34. package/llm-docs/badge.llm.md +108 -0
  35. package/llm-docs/blockquote.llm.md +122 -0
  36. package/llm-docs/breadcrumb-ellipsis.llm.md +73 -0
  37. package/llm-docs/breadcrumb-item.llm.md +53 -0
  38. package/llm-docs/breadcrumb-link.llm.md +84 -0
  39. package/llm-docs/breadcrumb-list.llm.md +54 -0
  40. package/llm-docs/breadcrumb-page.llm.md +52 -0
  41. package/llm-docs/breadcrumb-separator.llm.md +60 -0
  42. package/llm-docs/breadcrumb.llm.md +110 -0
  43. package/llm-docs/button.llm.md +281 -0
  44. package/llm-docs/calendar-day-button.llm.md +57 -0
  45. package/llm-docs/calendar.llm.md +340 -0
  46. package/llm-docs/card-action.llm.md +64 -0
  47. package/llm-docs/card-content.llm.md +48 -0
  48. package/llm-docs/card-description.llm.md +46 -0
  49. package/llm-docs/card-footer.llm.md +56 -0
  50. package/llm-docs/card-header.llm.md +53 -0
  51. package/llm-docs/card-title.llm.md +43 -0
  52. package/llm-docs/card.llm.md +100 -0
  53. package/llm-docs/carousel-content.llm.md +77 -0
  54. package/llm-docs/carousel-item.llm.md +96 -0
  55. package/llm-docs/carousel-next.llm.md +95 -0
  56. package/llm-docs/carousel-previous.llm.md +95 -0
  57. package/llm-docs/carousel.llm.md +211 -0
  58. package/llm-docs/chart-config.llm.md +71 -0
  59. package/llm-docs/chart-container.llm.md +148 -0
  60. package/llm-docs/chart-legend-content.llm.md +85 -0
  61. package/llm-docs/chart-legend.llm.md +144 -0
  62. package/llm-docs/chart-style.llm.md +28 -0
  63. package/llm-docs/chart-tooltip-content.llm.md +149 -0
  64. package/llm-docs/chart-tooltip.llm.md +184 -0
  65. package/llm-docs/checkbox.llm.md +100 -0
  66. package/llm-docs/cn.llm.md +46 -0
  67. package/llm-docs/code.llm.md +108 -0
  68. package/llm-docs/collapsible-content.llm.md +109 -0
  69. package/llm-docs/collapsible-trigger.llm.md +75 -0
  70. package/llm-docs/collapsible.llm.md +109 -0
  71. package/llm-docs/combobox-option.llm.md +53 -0
  72. package/llm-docs/combobox.llm.md +208 -0
  73. package/llm-docs/command-dialog.llm.md +112 -0
  74. package/llm-docs/command-empty.llm.md +63 -0
  75. package/llm-docs/command-group.llm.md +83 -0
  76. package/llm-docs/command-input.llm.md +82 -0
  77. package/llm-docs/command-item.llm.md +97 -0
  78. package/llm-docs/command-list.llm.md +53 -0
  79. package/llm-docs/command-loading.llm.md +48 -0
  80. package/llm-docs/command-separator.llm.md +44 -0
  81. package/llm-docs/command-shortcut.llm.md +63 -0
  82. package/llm-docs/command.llm.md +147 -0
  83. package/llm-docs/container.llm.md +236 -0
  84. package/llm-docs/context-menu-checkbox-item.llm.md +97 -0
  85. package/llm-docs/context-menu-content.llm.md +91 -0
  86. package/llm-docs/context-menu-group.llm.md +61 -0
  87. package/llm-docs/context-menu-item.llm.md +94 -0
  88. package/llm-docs/context-menu-label.llm.md +60 -0
  89. package/llm-docs/context-menu-portal.llm.md +49 -0
  90. package/llm-docs/context-menu-radio-group.llm.md +66 -0
  91. package/llm-docs/context-menu-radio-item.llm.md +76 -0
  92. package/llm-docs/context-menu-separator.llm.md +51 -0
  93. package/llm-docs/context-menu-shortcut.llm.md +57 -0
  94. package/llm-docs/context-menu-sub-content.llm.md +90 -0
  95. package/llm-docs/context-menu-sub-trigger.llm.md +73 -0
  96. package/llm-docs/context-menu-sub.llm.md +61 -0
  97. package/llm-docs/context-menu-trigger.llm.md +53 -0
  98. package/llm-docs/context-menu.llm.md +103 -0
  99. package/llm-docs/date-picker.llm.md +90 -0
  100. package/llm-docs/dialog-close.llm.md +61 -0
  101. package/llm-docs/dialog-content.llm.md +128 -0
  102. package/llm-docs/dialog-description.llm.md +44 -0
  103. package/llm-docs/dialog-footer.llm.md +38 -0
  104. package/llm-docs/dialog-header.llm.md +40 -0
  105. package/llm-docs/dialog-overlay.llm.md +57 -0
  106. package/llm-docs/dialog-portal.llm.md +47 -0
  107. package/llm-docs/dialog-title.llm.md +41 -0
  108. package/llm-docs/dialog-trigger.llm.md +51 -0
  109. package/llm-docs/dialog.llm.md +113 -0
  110. package/llm-docs/drawer-close.llm.md +53 -0
  111. package/llm-docs/drawer-content.llm.md +58 -0
  112. package/llm-docs/drawer-description.llm.md +54 -0
  113. package/llm-docs/drawer-footer.llm.md +67 -0
  114. package/llm-docs/drawer-header.llm.md +60 -0
  115. package/llm-docs/drawer-overlay.llm.md +40 -0
  116. package/llm-docs/drawer-portal.llm.md +42 -0
  117. package/llm-docs/drawer-title.llm.md +51 -0
  118. package/llm-docs/drawer-trigger.llm.md +44 -0
  119. package/llm-docs/drawer.llm.md +194 -0
  120. package/llm-docs/dropdown-menu-checkbox-item.llm.md +111 -0
  121. package/llm-docs/dropdown-menu-content.llm.md +109 -0
  122. package/llm-docs/dropdown-menu-group.llm.md +38 -0
  123. package/llm-docs/dropdown-menu-item.llm.md +94 -0
  124. package/llm-docs/dropdown-menu-label.llm.md +66 -0
  125. package/llm-docs/dropdown-menu-portal.llm.md +32 -0
  126. package/llm-docs/dropdown-menu-radio-group.llm.md +73 -0
  127. package/llm-docs/dropdown-menu-radio-item.llm.md +92 -0
  128. package/llm-docs/dropdown-menu-separator.llm.md +55 -0
  129. package/llm-docs/dropdown-menu-shortcut.llm.md +74 -0
  130. package/llm-docs/dropdown-menu-sub-content.llm.md +80 -0
  131. package/llm-docs/dropdown-menu-sub-trigger.llm.md +84 -0
  132. package/llm-docs/dropdown-menu-sub.llm.md +74 -0
  133. package/llm-docs/dropdown-menu-trigger.llm.md +48 -0
  134. package/llm-docs/dropdown-menu.llm.md +120 -0
  135. package/llm-docs/empty-state.llm.md +174 -0
  136. package/llm-docs/h1.llm.md +113 -0
  137. package/llm-docs/h2.llm.md +113 -0
  138. package/llm-docs/h3.llm.md +111 -0
  139. package/llm-docs/h4.llm.md +109 -0
  140. package/llm-docs/h5.llm.md +110 -0
  141. package/llm-docs/h6.llm.md +110 -0
  142. package/llm-docs/hover-card-content.llm.md +167 -0
  143. package/llm-docs/hover-card-trigger.llm.md +65 -0
  144. package/llm-docs/hover-card.llm.md +121 -0
  145. package/llm-docs/input.llm.md +319 -0
  146. package/llm-docs/label.llm.md +145 -0
  147. package/llm-docs/lead.llm.md +119 -0
  148. package/llm-docs/menubar-checkbox-item.llm.md +66 -0
  149. package/llm-docs/menubar-content.llm.md +128 -0
  150. package/llm-docs/menubar-group.llm.md +40 -0
  151. package/llm-docs/menubar-item.llm.md +62 -0
  152. package/llm-docs/menubar-label.llm.md +40 -0
  153. package/llm-docs/menubar-menu.llm.md +32 -0
  154. package/llm-docs/menubar-portal.llm.md +38 -0
  155. package/llm-docs/menubar-radio-group.llm.md +39 -0
  156. package/llm-docs/menubar-radio-item.llm.md +59 -0
  157. package/llm-docs/menubar-separator.llm.md +35 -0
  158. package/llm-docs/menubar-shortcut.llm.md +37 -0
  159. package/llm-docs/menubar-sub-content.llm.md +127 -0
  160. package/llm-docs/menubar-sub-trigger.llm.md +51 -0
  161. package/llm-docs/menubar-sub.llm.md +53 -0
  162. package/llm-docs/menubar-trigger.llm.md +37 -0
  163. package/llm-docs/menubar.llm.md +115 -0
  164. package/llm-docs/navigation-menu-content.llm.md +116 -0
  165. package/llm-docs/navigation-menu-indicator.llm.md +68 -0
  166. package/llm-docs/navigation-menu-item.llm.md +62 -0
  167. package/llm-docs/navigation-menu-link.llm.md +109 -0
  168. package/llm-docs/navigation-menu-list.llm.md +52 -0
  169. package/llm-docs/navigation-menu-trigger-style.llm.md +22 -0
  170. package/llm-docs/navigation-menu-trigger.llm.md +57 -0
  171. package/llm-docs/navigation-menu-viewport.llm.md +51 -0
  172. package/llm-docs/navigation-menu.llm.md +184 -0
  173. package/llm-docs/p.llm.md +115 -0
  174. package/llm-docs/pagination-content.llm.md +60 -0
  175. package/llm-docs/pagination-ellipsis.llm.md +107 -0
  176. package/llm-docs/pagination-item.llm.md +59 -0
  177. package/llm-docs/pagination-link.llm.md +150 -0
  178. package/llm-docs/pagination-next.llm.md +115 -0
  179. package/llm-docs/pagination-previous.llm.md +115 -0
  180. package/llm-docs/pagination.llm.md +190 -0
  181. package/llm-docs/popover-anchor.llm.md +53 -0
  182. package/llm-docs/popover-content.llm.md +109 -0
  183. package/llm-docs/popover-trigger.llm.md +54 -0
  184. package/llm-docs/popover.llm.md +116 -0
  185. package/llm-docs/progress.llm.md +76 -0
  186. package/llm-docs/radio-group-indicator.llm.md +28 -0
  187. package/llm-docs/radio-group-item.llm.md +40 -0
  188. package/llm-docs/radio-group.llm.md +76 -0
  189. package/llm-docs/resizable-handle.llm.md +156 -0
  190. package/llm-docs/resizable-panel-group.llm.md +149 -0
  191. package/llm-docs/resizable-panel.llm.md +157 -0
  192. package/llm-docs/scroll-area-corner.llm.md +41 -0
  193. package/llm-docs/scroll-area-thumb.llm.md +39 -0
  194. package/llm-docs/scroll-area-viewport.llm.md +60 -0
  195. package/llm-docs/scroll-area.llm.md +125 -0
  196. package/llm-docs/scroll-bar.llm.md +78 -0
  197. package/llm-docs/sdk-items-registry.json +2638 -0
  198. package/llm-docs/select-content.llm.md +139 -0
  199. package/llm-docs/select-group.llm.md +60 -0
  200. package/llm-docs/select-item.llm.md +75 -0
  201. package/llm-docs/select-label.llm.md +62 -0
  202. package/llm-docs/select-scroll-down-button.llm.md +45 -0
  203. package/llm-docs/select-scroll-up-button.llm.md +45 -0
  204. package/llm-docs/select-separator.llm.md +59 -0
  205. package/llm-docs/select-trigger.llm.md +66 -0
  206. package/llm-docs/select-value.llm.md +67 -0
  207. package/llm-docs/select.llm.md +159 -0
  208. package/llm-docs/separator.llm.md +129 -0
  209. package/llm-docs/sheet-close.llm.md +49 -0
  210. package/llm-docs/sheet-content.llm.md +115 -0
  211. package/llm-docs/sheet-description.llm.md +62 -0
  212. package/llm-docs/sheet-footer.llm.md +64 -0
  213. package/llm-docs/sheet-header.llm.md +52 -0
  214. package/llm-docs/sheet-title.llm.md +53 -0
  215. package/llm-docs/sheet-trigger.llm.md +46 -0
  216. package/llm-docs/sheet.llm.md +126 -0
  217. package/llm-docs/sidebar-content.llm.md +63 -0
  218. package/llm-docs/sidebar-footer.llm.md +50 -0
  219. package/llm-docs/sidebar-group-action.llm.md +60 -0
  220. package/llm-docs/sidebar-group-content.llm.md +64 -0
  221. package/llm-docs/sidebar-group-label.llm.md +53 -0
  222. package/llm-docs/sidebar-group.llm.md +56 -0
  223. package/llm-docs/sidebar-header.llm.md +67 -0
  224. package/llm-docs/sidebar-input.llm.md +50 -0
  225. package/llm-docs/sidebar-inset.llm.md +52 -0
  226. package/llm-docs/sidebar-menu-action.llm.md +84 -0
  227. package/llm-docs/sidebar-menu-badge.llm.md +60 -0
  228. package/llm-docs/sidebar-menu-button.llm.md +103 -0
  229. package/llm-docs/sidebar-menu-item.llm.md +75 -0
  230. package/llm-docs/sidebar-menu-skeleton.llm.md +76 -0
  231. package/llm-docs/sidebar-menu-sub-button.llm.md +85 -0
  232. package/llm-docs/sidebar-menu-sub-item.llm.md +54 -0
  233. package/llm-docs/sidebar-menu-sub.llm.md +74 -0
  234. package/llm-docs/sidebar-menu.llm.md +65 -0
  235. package/llm-docs/sidebar-provider.llm.md +79 -0
  236. package/llm-docs/sidebar-rail.llm.md +34 -0
  237. package/llm-docs/sidebar-separator.llm.md +57 -0
  238. package/llm-docs/sidebar-trigger.llm.md +49 -0
  239. package/llm-docs/sidebar.llm.md +129 -0
  240. package/llm-docs/skeleton.llm.md +134 -0
  241. package/llm-docs/slider.llm.md +173 -0
  242. package/llm-docs/small.llm.md +115 -0
  243. package/llm-docs/span.llm.md +132 -0
  244. package/llm-docs/stack.llm.md +28 -0
  245. package/llm-docs/strong.llm.md +115 -0
  246. package/llm-docs/switch.llm.md +76 -0
  247. package/llm-docs/table-body.llm.md +36 -0
  248. package/llm-docs/table-caption.llm.md +48 -0
  249. package/llm-docs/table-cell.llm.md +53 -0
  250. package/llm-docs/table-footer.llm.md +41 -0
  251. package/llm-docs/table-head.llm.md +69 -0
  252. package/llm-docs/table-header.llm.md +41 -0
  253. package/llm-docs/table-row.llm.md +42 -0
  254. package/llm-docs/table.llm.md +123 -0
  255. package/llm-docs/tabs-content.llm.md +47 -0
  256. package/llm-docs/tabs-list.llm.md +41 -0
  257. package/llm-docs/tabs-trigger.llm.md +47 -0
  258. package/llm-docs/tabs.llm.md +71 -0
  259. package/llm-docs/text-field.llm.md +327 -0
  260. package/llm-docs/textarea.llm.md +311 -0
  261. package/llm-docs/theme-preference.llm.md +25 -0
  262. package/llm-docs/theme-toggle.llm.md +57 -0
  263. package/llm-docs/theme.llm.md +14 -0
  264. package/llm-docs/toast.llm.md +32 -0
  265. package/llm-docs/toaster.llm.md +193 -0
  266. package/llm-docs/toggle-group-item.llm.md +59 -0
  267. package/llm-docs/toggle-group.llm.md +101 -0
  268. package/llm-docs/toggle.llm.md +40 -0
  269. package/llm-docs/tooltip-content.llm.md +185 -0
  270. package/llm-docs/tooltip-provider.llm.md +68 -0
  271. package/llm-docs/tooltip-trigger.llm.md +70 -0
  272. package/llm-docs/tooltip.llm.md +129 -0
  273. package/llm-docs/typography.llm.md +175 -0
  274. package/llm-docs/use-carousel.llm.md +55 -0
  275. package/llm-docs/use-command-state.llm.md +32 -0
  276. package/llm-docs/use-is-mobile.llm.md +73 -0
  277. package/llm-docs/use-sidebar.llm.md +61 -0
  278. package/package.json +3 -2
  279. package/src/components/ui/stack.tsx +5 -1
  280. package/src/components/ui/stories/typography.stories.tsx +248 -205
  281. package/src/components/ui/typography.tsx +90 -79
  282. package/src/styles/globals.css +33 -10
@@ -0,0 +1,48 @@
1
+ # AlertTitle
2
+
3
+ **Type**: component
4
+
5
+ AlertTitle - The title/heading component for alerts Provides a prominent title or heading for the alert message. Automatically styled with medium font weight, line clamping, and proper grid positioning. Used to give context and immediate recognition of the alert's purpose. ## Features - Medium font weight for visual hierarchy - Single line with overflow handling (line-clamp-1) - Consistent minimum height for layout stability - Proper grid positioning (col-start-2) for icon layout - Tight character spacing (tracking-tight) for readability
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { AlertTitle } from '@neynar/ui';
11
+
12
+ <AlertTitle
13
+ className="value"
14
+ >
15
+ {/* Your content here */}
16
+ </AlertTitle>
17
+ ```
18
+
19
+ ## Component Props
20
+
21
+ ### className
22
+ - **Type**: `string`
23
+ - **Required**: No
24
+ - **Description**: Additional CSS classes to apply
25
+
26
+ ### children
27
+ - **Type**: `React.ReactNode`
28
+ - **Required**: No
29
+ - **Description**: Title text content
30
+
31
+ ## Examples
32
+
33
+ ### Example 1
34
+ ```tsx
35
+ <Alert>
36
+ <Info className="size-4" />
37
+ <AlertTitle>Payment Successful</AlertTitle>
38
+ <AlertDescription>Your payment has been processed.</AlertDescription>
39
+ </Alert>
40
+ ```
41
+ ### Example 2
42
+ ```tsx
43
+ // Title-only alert (no description)
44
+ <Alert variant="destructive">
45
+ <AlertCircle className="size-4" />
46
+ <AlertTitle>Connection Failed</AlertTitle>
47
+ </Alert>
48
+ ```
@@ -0,0 +1,92 @@
1
+ # Alert
2
+
3
+ **Type**: component
4
+
5
+ Alert - Display important messages and notifications to users A flexible alert component for displaying important messages, notifications, and status updates. Built with shadcn/ui design patterns and Tailwind CSS. Alerts are used to communicate critical information that requires user attention and potentially action. ## When to use - System-wide notifications and announcements - Form validation errors and success messages - Important warnings that need persistent visibility - Status updates that don't require immediate action - Progress indicators and completion messages ## Features - Two built-in variants: `default` and `destructive` - Automatic icon grid layout with proper spacing using CSS Grid - Semantic HTML with proper ARIA attributes (`role="alert"`) - Responsive design with consistent spacing - Dark mode support via CSS custom properties - Composition pattern with AlertTitle and AlertDescription - Support for custom styling through className prop - Icon-aware layout that adapts to presence of SVG icons ## Design Philosophy Follows the shadcn/ui principle of providing unstyled, accessible components that can be easily customized. The alert uses CSS Grid for intelligent layout that automatically adjusts based on whether an icon is present.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { Alert } from '@neynar/ui';
11
+
12
+ <Alert
13
+ variant={value}
14
+ className="value"
15
+ >
16
+ {/* Your content here */}
17
+ </Alert>
18
+ ```
19
+
20
+ ## Component Props
21
+
22
+ ### variant
23
+ - **Type**: `"default" | "destructive"`
24
+ - **Required**: No
25
+ - **Description**: Visual style variant determining colors and emphasis
26
+
27
+ ### className
28
+ - **Type**: `string`
29
+ - **Required**: No
30
+ - **Description**: Additional CSS classes to merge with default styles
31
+
32
+ ### children
33
+ - **Type**: `React.ReactNode`
34
+ - **Required**: No
35
+ - **Description**: Alert content including optional icon, title, and description
36
+
37
+ ## Examples
38
+
39
+ ### Example 1
40
+ ```tsx
41
+ // Basic informational alert
42
+ <Alert>
43
+ <Info className="size-4" />
44
+ <AlertTitle>Heads up!</AlertTitle>
45
+ <AlertDescription>
46
+ You can add components to your app using the cli.
47
+ </AlertDescription>
48
+ </Alert>
49
+ ```
50
+ ### Example 2
51
+ ```tsx
52
+ // Destructive error alert
53
+ import { AlertCircle } from "lucide-react";
54
+ <Alert variant="destructive">
55
+ <AlertCircle className="size-4" />
56
+ <AlertTitle>Error</AlertTitle>
57
+ <AlertDescription>
58
+ Your session has expired. Please log in again.
59
+ </AlertDescription>
60
+ </Alert>
61
+ ```
62
+ ### Example 3
63
+ ```tsx
64
+ // Custom styled success alert
65
+ <Alert className="border-green-200 bg-green-50 text-green-800 dark:border-green-800 dark:bg-green-950 dark:text-green-200">
66
+ <CheckCircle className="size-4" />
67
+ <AlertTitle>Success</AlertTitle>
68
+ <AlertDescription>
69
+ Your changes have been saved successfully.
70
+ </AlertDescription>
71
+ </Alert>
72
+ ```
73
+ ### Example 4
74
+ ```tsx
75
+ // Alert without icon
76
+ <Alert>
77
+ <AlertTitle>Simple Notice</AlertTitle>
78
+ <AlertDescription>
79
+ This alert doesn't use an icon.
80
+ </AlertDescription>
81
+ </Alert>
82
+ ```
83
+ ### Example 5
84
+ ```tsx
85
+ // Alert with only description
86
+ <Alert variant="destructive">
87
+ <AlertCircle className="size-4" />
88
+ <AlertDescription>
89
+ Something went wrong. Please try again.
90
+ </AlertDescription>
91
+ </Alert>
92
+ ```
@@ -0,0 +1,41 @@
1
+ # AspectRatio
2
+
3
+ **Type**: component
4
+
5
+ AspectRatio - Maintains consistent width-to-height ratios for content A foundational layout component that preserves specific aspect ratios regardless of container size. Essential for responsive images, videos, and media content that needs consistent proportions across different screen sizes. Built on Radix UI primitives with zero JavaScript runtime overhead. This component creates a CSS-based aspect ratio container using the modern `aspect-ratio` property, ensuring content maintains its intended proportions without layout shifts or JavaScript calculations. The component acts as a constraint wrapper that forces its children to maintain the specified ratio.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { AspectRatio } from '@neynar/ui';
11
+
12
+ <AspectRatio
13
+ ratio={0}
14
+ className="value"
15
+ asChild={true}
16
+ >
17
+ {/* Your content here */}
18
+ </AspectRatio>
19
+ ```
20
+
21
+ ## Component Props
22
+
23
+ ### ratio
24
+ - **Type**: `number`
25
+ - **Required**: No
26
+ - **Description**: The desired aspect ratio as width/height (e.g., 16/9, 4/3, 1)
27
+
28
+ ### children
29
+ - **Type**: `React.ReactNode`
30
+ - **Required**: No
31
+ - **Description**: Content to be constrained within the aspect ratio
32
+
33
+ ### className
34
+ - **Type**: `string`
35
+ - **Required**: No
36
+ - **Description**: Additional CSS classes for styling
37
+
38
+ ### asChild
39
+ - **Type**: `boolean`
40
+ - **Required**: No
41
+ - **Description**: Merge props with child element instead of wrapping
@@ -0,0 +1,41 @@
1
+ # AvatarFallback
2
+
3
+ **Type**: component
4
+
5
+ AvatarFallback - Fallback content displayed when the avatar image is unavailable This component renders alternative content when the AvatarImage is loading, fails to load, or is not provided. It's built on Radix UI's Avatar.Fallback primitive and provides a visually appealing placeholder that maintains the avatar's design consistency. ## When AvatarFallback is Shown The fallback is automatically displayed in these scenarios: - **Image loading**: While the AvatarImage is being loaded - **Image error**: When the AvatarImage fails to load (broken URL, network error) - **No image**: When no AvatarImage component is provided - **Empty src**: When AvatarImage has no src prop or empty src ## Common Use Cases - **User initials**: Most common pattern (2-3 characters) - **Generic icons**: User, person, or company icons - **Brand initials**: For organization avatars - **Loading states**: With animations or loading indicators - **Placeholder content**: For new or anonymous users - **Custom graphics**: SVG icons or other visual elements ## Design Considerations - Uses muted background color for subtle appearance - Automatically centers content both horizontally and vertically - Inherits size and border radius from parent Avatar - Should complement the overall design system - Supports delay to prevent flash during fast image loads
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { AvatarFallback } from '@neynar/ui';
11
+
12
+ <AvatarFallback
13
+ className="value"
14
+ delayMs={0}
15
+ asChild={true}
16
+ >
17
+ {/* Your content here */}
18
+ </AvatarFallback>
19
+ ```
20
+
21
+ ## Component Props
22
+
23
+ ### children
24
+ - **Type**: `React.ReactNode`
25
+ - **Required**: No
26
+ - **Description**: The fallback content to display. Common patterns include user initials (2-3 characters), icons, or loading indicators
27
+
28
+ ### className
29
+ - **Type**: `string`
30
+ - **Required**: No
31
+ - **Description**: Additional CSS classes. Use for custom background colors, text styling, or animations
32
+
33
+ ### delayMs
34
+ - **Type**: `number`
35
+ - **Required**: No
36
+ - **Description**: Optional delay in milliseconds before showing the fallback. Useful for delaying rendering so it only appears for those with slower connections
37
+
38
+ ### asChild
39
+ - **Type**: `boolean`
40
+ - **Required**: No
41
+ - **Description**: Change the default rendered element for the one passed as a child, merging their props and behavior
@@ -0,0 +1,48 @@
1
+ # AvatarImage
2
+
3
+ **Type**: component
4
+
5
+ AvatarImage - The image element component for displaying avatar pictures This component renders the actual avatar image and automatically handles loading states. It's built on Radix UI's Avatar.Image primitive which provides robust image loading behavior - when the image fails to load or is still loading, it remains hidden and the AvatarFallback will be displayed instead. ## Key Features - **Automatic loading state management**: Handles "idle", "loading", "loaded", and "error" states - **Graceful error handling**: Automatically falls back when images fail to load - **Proper aspect ratio maintenance**: Square aspect ratio maintained by default - **Flexible rendering**: Supports asChild for custom element composition - **Loading status callbacks**: Provides onLoadingStatusChange for custom loading logic - **Accessible implementation**: Proper alt text handling and ARIA support ## Loading States The component automatically manages these states: - **idle**: Initial state before loading begins - **loading**: Image is currently being loaded - **loaded**: Image has loaded successfully and is displayed - **error**: Image failed to load, fallback will be shown
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { AvatarImage } from '@neynar/ui';
11
+
12
+ <AvatarImage
13
+ src="value"
14
+ alt="value"
15
+ className="value"
16
+ onLoadingStatusChange={handleLoadingStatusChange}
17
+ asChild={true}
18
+ />
19
+ ```
20
+
21
+ ## Component Props
22
+
23
+ ### src
24
+ - **Type**: `string`
25
+ - **Required**: No
26
+ - **Description**: The URL of the image to display. Can be relative or absolute URL. When src changes, loading will restart
27
+
28
+ ### alt
29
+ - **Type**: `string`
30
+ - **Required**: No
31
+ - **Description**: Descriptive alternative text for the image. Should describe the person or entity, not just "avatar" or "profile picture"
32
+
33
+ ### className
34
+ - **Type**: `string`
35
+ - **Required**: No
36
+ - **Description**: Additional CSS classes to apply to the image element. Applied to the img element or asChild component
37
+
38
+ ### onLoadingStatusChange
39
+ - **Type**: `(
40
+ status: "idle" | "loading" | "loaded" | "error",
41
+ ) => void`
42
+ - **Required**: No
43
+ - **Description**: Optional callback fired when the loading status changes. Receives status: "idle" | "loading" | "loaded" | "error"
44
+
45
+ ### asChild
46
+ - **Type**: `boolean`
47
+ - **Required**: No
48
+ - **Description**: Change the default rendered element for the one passed as a child, merging their props and behavior
@@ -0,0 +1,35 @@
1
+ # Avatar
2
+
3
+ **Type**: component
4
+
5
+ Avatar - A flexible container for displaying user profile images with graceful fallback support The Avatar component is built on Radix UI's Avatar primitive and provides a robust solution for displaying user profile pictures throughout your application. It automatically handles image loading states and displays fallback content when images fail to load or are unavailable. This component follows the shadcn/ui design system principles and provides a consistent approach to user representation across all applications. ## Features - **Automatic loading states**: Seamlessly handles image loading and error states - **Graceful fallbacks**: Shows fallback content when images are unavailable - **Flexible sizing**: Easy customization through Tailwind CSS size utilities - **Shape variants**: Circular by default with support for rounded corners - **Accessibility first**: Built-in ARIA attributes and keyboard navigation - **Composable design**: Works with AvatarImage and AvatarFallback sub-components - **Polymorphic rendering**: Supports asChild prop for custom element rendering ## Common Use Cases - User profile displays in headers and navigation - Comment sections and author attribution - Team member listings and directories - Avatar groups with overlapping layouts - Organization logos and brand representation - Loading states and placeholder content ## Size Variants - `size-6` (24px) - Small avatars for dense layouts - `size-8` (32px) - Default size for most use cases - `size-10` (40px) - Medium avatars for lists - `size-12` (48px) - Large avatars for profiles - `size-16` (64px) - Extra large for main profile displays
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { Avatar } from '@neynar/ui';
11
+
12
+ <Avatar
13
+ className="value"
14
+ asChild={true}
15
+ >
16
+ {/* Your content here */}
17
+ </Avatar>
18
+ ```
19
+
20
+ ## Component Props
21
+
22
+ ### className
23
+ - **Type**: `string`
24
+ - **Required**: No
25
+ - **Description**: Additional CSS classes for styling. Common patterns include size utilities (size-6, size-8, size-10, size-12, size-16) and border radius overrides (rounded-lg, rounded-md, rounded-none)
26
+
27
+ ### children
28
+ - **Type**: `React.ReactNode`
29
+ - **Required**: No
30
+ - **Description**: Should contain AvatarImage and AvatarFallback components for proper functionality
31
+
32
+ ### asChild
33
+ - **Type**: `boolean`
34
+ - **Required**: No
35
+ - **Description**: Change the default rendered element for the one passed as a child, merging their props and behavior
@@ -0,0 +1,108 @@
1
+ # Badge
2
+
3
+ **Type**: component
4
+
5
+ Badge - Versatile status indicator component for labels, counts, and notifications A small status descriptor component that provides visual feedback about state, category, or importance of content. Built on Radix UI Slot primitives with accessibility-first design and support for multiple semantic variants and interactive states.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { Badge } from '@neynar/ui';
11
+
12
+ <Badge
13
+ variant={value}
14
+ className="value"
15
+ asChild={true}
16
+ >
17
+ {/* Your content here */}
18
+ </Badge>
19
+ ```
20
+
21
+ ## Component Props
22
+
23
+ ### variant
24
+ - **Type**: `"default" | "secondary" | "destructive" | "outline"`
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
42
+
43
+ ## Examples
44
+
45
+ ### Example 1
46
+ ```tsx
47
+ // Basic status badges
48
+ <Badge>New</Badge>
49
+ <Badge variant="secondary">Draft</Badge>
50
+ <Badge variant="destructive">Error</Badge>
51
+ <Badge variant="outline">Pending</Badge>
52
+ ```
53
+ ### Example 2
54
+ ```tsx
55
+ // Badge with icon content
56
+ import { Check, AlertTriangle } from "lucide-react";
57
+ <Badge>
58
+ <Check className="mr-1" />
59
+ Completed
60
+ </Badge>
61
+ <Badge variant="destructive">
62
+ <AlertTriangle className="mr-1" />
63
+ Failed
64
+ </Badge>
65
+ ```
66
+ ### Example 3
67
+ ```tsx
68
+ // Notification count badge
69
+ <div className="relative inline-block">
70
+ <Bell className="h-6 w-6" />
71
+ <Badge className="absolute -top-2 -right-2 h-5 w-5 p-0 text-xs flex items-center justify-center">
72
+ 3
73
+ </Badge>
74
+ </div>
75
+ ```
76
+ ### Example 4
77
+ ```tsx
78
+ // Interactive badge as link using asChild
79
+ import Link from "next/link";
80
+ <Badge asChild>
81
+ <Link href="/notifications" className="cursor-pointer">
82
+ 3 new messages
83
+ </Link>
84
+ </Badge>
85
+ ```
86
+ ### Example 5
87
+ ```tsx
88
+ // Interactive badge as button
89
+ <Badge asChild>
90
+ <button onClick={handleDismiss} className="cursor-pointer">
91
+ Dismiss Alert
92
+ </button>
93
+ </Badge>
94
+ ```
95
+ ### Example 6
96
+ ```tsx
97
+ // Removable tag badge with close button
98
+ <Badge className="pr-1 gap-1">
99
+ React
100
+ <button
101
+ onClick={handleRemove}
102
+ className="ml-1 hover:bg-primary-foreground/20 rounded-full p-0.5"
103
+ aria-label="Remove React tag"
104
+ >
105
+ <X className="h-3 w-3" />
106
+ </button>
107
+ </Badge>
108
+ ```
@@ -0,0 +1,122 @@
1
+ # Blockquote
2
+
3
+ **Type**: component
4
+
5
+ Blockquote - Quoted text component for citations and excerpts Semantic blockquote element for extended quotations, testimonials, and excerpts. Features italic styling and left border for visual distinction.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { Blockquote } from '@neynar/ui';
11
+
12
+ <Blockquote
13
+ color={value}
14
+ align={value}
15
+ transform={value}
16
+ weight={value}
17
+ htmlFor="value"
18
+ asChild={true}
19
+ italic={true}
20
+ underline={true}
21
+ strikethrough={true}
22
+ truncate={true}
23
+ srOnly={true}
24
+ className="value"
25
+ >
26
+ {/* Your content here */}
27
+ </Blockquote>
28
+ ```
29
+
30
+ ## Component Props
31
+
32
+ ### color
33
+ - **Type**: `| "default"
34
+ | "muted"
35
+ | "accent"
36
+ | "destructive"
37
+ | "success"
38
+ | "warning"`
39
+ - **Required**: No
40
+ - **Description**: No description available
41
+
42
+ ### align
43
+ - **Type**: `"left" | "center" | "right" | "justify"`
44
+ - **Required**: No
45
+ - **Description**: No description available
46
+
47
+ ### transform
48
+ - **Type**: `"uppercase" | "lowercase" | "capitalize"`
49
+ - **Required**: No
50
+ - **Description**: No description available
51
+
52
+ ### weight
53
+ - **Type**: `"normal" | "medium" | "semibold" | "bold"`
54
+ - **Required**: No
55
+ - **Description**: No description available
56
+
57
+ ### htmlFor
58
+ - **Type**: `string`
59
+ - **Required**: No
60
+ - **Description**: No description available
61
+
62
+ ### asChild
63
+ - **Type**: `boolean`
64
+ - **Required**: No
65
+ - **Description**: No description available
66
+
67
+ ### italic
68
+ - **Type**: `boolean`
69
+ - **Required**: No
70
+ - **Description**: No description available
71
+
72
+ ### underline
73
+ - **Type**: `boolean`
74
+ - **Required**: No
75
+ - **Description**: No description available
76
+
77
+ ### strikethrough
78
+ - **Type**: `boolean`
79
+ - **Required**: No
80
+ - **Description**: No description available
81
+
82
+ ### truncate
83
+ - **Type**: `boolean`
84
+ - **Required**: No
85
+ - **Description**: No description available
86
+
87
+ ### srOnly
88
+ - **Type**: `boolean`
89
+ - **Required**: No
90
+ - **Description**: No description available
91
+
92
+ ### className
93
+ - **Type**: `string`
94
+ - **Required**: No
95
+ - **Description**: No description available
96
+
97
+ ### children
98
+ - **Type**: `React.ReactNode`
99
+ - **Required**: No
100
+ - **Description**: No description available
101
+
102
+ ## Examples
103
+
104
+ ```tsx
105
+ // Simple quote
106
+ <Blockquote>
107
+ "The best way to predict the future is to invent it."
108
+ </Blockquote>
109
+ // With attribution
110
+ <div>
111
+ <Blockquote className="mb-2">
112
+ "Building great products requires deep understanding of user needs
113
+ and technical excellence in equal measure."
114
+ </Blockquote>
115
+ <Small>— Product Engineering Team</Small>
116
+ </div>
117
+ // Customer testimonial
118
+ <Blockquote color="muted" className="bg-muted/50 p-4 rounded-lg">
119
+ "Neynar's APIs have transformed how we build social features.
120
+ The developer experience is exceptional."
121
+ </Blockquote>
122
+ ```
@@ -0,0 +1,73 @@
1
+ # BreadcrumbEllipsis
2
+
3
+ **Type**: component
4
+
5
+ Ellipsis indicator for collapsed breadcrumb items Shows a horizontal ellipsis icon (MoreHorizontal) to indicate hidden or collapsed middle items in a long breadcrumb trail. Essential for deep navigation hierarchies where space is limited or mobile responsive design. Commonly used in combination with dropdown menus, popovers, or expandable sections to reveal the collapsed breadcrumb items on user interaction. The component provides a consistent 36px (9 × 4px) clickable area for better touch interaction when used as a trigger for dropdown menus. Includes hidden screen reader text to provide context about the collapsed content.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { BreadcrumbEllipsis } from '@neynar/ui';
11
+
12
+ <BreadcrumbEllipsis
13
+ className="value"
14
+ >
15
+ {/* Your content here */}
16
+ </BreadcrumbEllipsis>
17
+ ```
18
+
19
+ ## Component Props
20
+
21
+ ### className
22
+ - **Type**: `string`
23
+ - **Required**: No
24
+ - **Description**: Additional CSS classes to apply to the ellipsis container
25
+
26
+ ### children
27
+ - **Type**: `React.ReactNode`
28
+ - **Required**: No
29
+ - **Description**: Custom content to display instead of the default MoreHorizontal icon (rarely needed)
30
+
31
+ ## Examples
32
+
33
+ ### Example 1
34
+ ```tsx
35
+ // Simple static ellipsis
36
+ <BreadcrumbEllipsis />
37
+ ```
38
+ ### Example 2
39
+ ```tsx
40
+ // Interactive ellipsis with dropdown menu
41
+ <BreadcrumbItem>
42
+ <DropdownMenu>
43
+ <DropdownMenuTrigger asChild>
44
+ <BreadcrumbEllipsis className="hover:bg-muted cursor-pointer" />
45
+ </DropdownMenuTrigger>
46
+ <DropdownMenuContent>
47
+ <DropdownMenuItem>
48
+ <BreadcrumbLink href="/level1">Level 1</BreadcrumbLink>
49
+ </DropdownMenuItem>
50
+ <DropdownMenuItem>
51
+ <BreadcrumbLink href="/level1/level2">Level 2</BreadcrumbLink>
52
+ </DropdownMenuItem>
53
+ </DropdownMenuContent>
54
+ </DropdownMenu>
55
+ </BreadcrumbItem>
56
+ ```
57
+ ### Example 3
58
+ ```tsx
59
+ // With popover for collapsed items
60
+ <BreadcrumbItem>
61
+ <Popover>
62
+ <PopoverTrigger asChild>
63
+ <BreadcrumbEllipsis className="hover:bg-accent" />
64
+ </PopoverTrigger>
65
+ <PopoverContent>
66
+ <div className="space-y-2">
67
+ <BreadcrumbLink href="/hidden1">Hidden Item 1</BreadcrumbLink>
68
+ <BreadcrumbLink href="/hidden2">Hidden Item 2</BreadcrumbLink>
69
+ </div>
70
+ </PopoverContent>
71
+ </Popover>
72
+ </BreadcrumbItem>
73
+ ```
@@ -0,0 +1,53 @@
1
+ # BreadcrumbItem
2
+
3
+ **Type**: component
4
+
5
+ Individual breadcrumb list item container Wraps breadcrumb content (links, pages, separators) in a semantic list item. Provides consistent alignment and spacing for breadcrumb elements with inline flex layout for proper icon and text alignment.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { BreadcrumbItem } from '@neynar/ui';
11
+
12
+ <BreadcrumbItem
13
+ className="value"
14
+ >
15
+ {/* Your content here */}
16
+ </BreadcrumbItem>
17
+ ```
18
+
19
+ ## Component Props
20
+
21
+ ### className
22
+ - **Type**: `string`
23
+ - **Required**: No
24
+ - **Description**: Additional CSS classes to apply to the list item element
25
+
26
+ ### children
27
+ - **Type**: `React.ReactNode`
28
+ - **Required**: No
29
+ - **Description**: Content to display within the item (links, pages, separators, ellipsis)
30
+
31
+ ## Examples
32
+
33
+ ### Example 1
34
+ ```tsx
35
+ // With link
36
+ <BreadcrumbItem>
37
+ <BreadcrumbLink href="/products">Products</BreadcrumbLink>
38
+ </BreadcrumbItem>
39
+ ```
40
+ ### Example 2
41
+ ```tsx
42
+ // With current page
43
+ <BreadcrumbItem>
44
+ <BreadcrumbPage>Current Page</BreadcrumbPage>
45
+ </BreadcrumbItem>
46
+ ```
47
+ ### Example 3
48
+ ```tsx
49
+ // With separator
50
+ <BreadcrumbItem>
51
+ <BreadcrumbSeparator />
52
+ </BreadcrumbItem>
53
+ ```