@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,53 @@
1
+ # ComboboxOption
2
+
3
+ **Type**: type
4
+
5
+ Option structure for combobox items Defines the shape of each option that can be displayed and selected in the combobox dropdown list.
6
+
7
+ ## Type Definition
8
+
9
+ ```typescript
10
+ import { ComboboxOption } from '@neynar/ui';
11
+
12
+ type ComboboxOption = {
13
+ /**
14
+ * Unique identifier for this option
15
+ *
16
+ * Used for selection tracking and should be unique within the options array.
17
+ */
18
+ value: string;
19
+
20
+ /**
21
+ * Display text shown to users in the dropdown
22
+ *
23
+ * Should be descriptive and help users understand what this option represents.
24
+ */
25
+ label: string;
26
+
27
+ /**
28
+ * Whether this option is disabled and cannot be selected
29
+ *
30
+ * Disabled options remain visible but are not selectable and appear dimmed.
31
+ *
32
+ * @default false
33
+ */
34
+ disabled?: boolean;
35
+ }
36
+ ```
37
+
38
+ ## Type Properties
39
+
40
+ ### value
41
+ - **Type**: `string`
42
+ - **Required**: Yes
43
+ - **Description**: No description available
44
+
45
+ ### label
46
+ - **Type**: `string`
47
+ - **Required**: Yes
48
+ - **Description**: No description available
49
+
50
+ ### disabled
51
+ - **Type**: `boolean`
52
+ - **Required**: No
53
+ - **Description**: No description available
@@ -0,0 +1,208 @@
1
+ # Combobox
2
+
3
+ **Type**: component
4
+
5
+ Searchable dropdown selection component with typeahead functionality A versatile combobox that combines a button trigger with a searchable dropdown list. Ideal for selecting from moderate to large lists of options where search functionality improves user experience. Built on Radix UI Popover primitives for accessibility and CMDK for powerful command menu functionality with real-time filtering. **Technical Architecture:** - **Popover Container**: Radix UI Popover.Root provides modal/non-modal behavior, focus management, and positioning - **Trigger Button**: Uses Button component with proper ARIA attributes and visual states - **Command Menu**: CMDK provides keyboard navigation, filtering, and accessibility features - **State Management**: Controlled/uncontrolled modes with proper React patterns **Use Cases:** - Selecting from 10+ options that benefit from real-time filtering - User interfaces requiring quick option discovery through search - Forms needing better UX than basic select dropdowns - Applications with dynamic or large option sets **When Not to Use:** - Simple selection from few options (use Select component instead) - Multi-select scenarios (use Checkbox group or specialized multi-select) - Tree or hierarchical data (use TreeSelect or nested menus)
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { Combobox } from '@neynar/ui';
11
+
12
+ <Combobox
13
+ options={[]}
14
+ value="value"
15
+ onValueChange={handleValueChange}
16
+ placeholder="value"
17
+ emptyText="value"
18
+ searchPlaceholder="value"
19
+ className="value"
20
+ disabled={true}
21
+ buttonClassName="value"
22
+ popoverClassName="value"
23
+ />
24
+ ```
25
+
26
+ ## Component Props
27
+
28
+ ### options
29
+ - **Type**: `ComboboxOption[]`
30
+ - **Required**: Yes
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
+ ### placeholder
44
+ - **Type**: `string`
45
+ - **Required**: No
46
+ - **Description**: No description available
47
+
48
+ ### emptyText
49
+ - **Type**: `string`
50
+ - **Required**: No
51
+ - **Description**: No description available
52
+
53
+ ### searchPlaceholder
54
+ - **Type**: `string`
55
+ - **Required**: No
56
+ - **Description**: No description available
57
+
58
+ ### className
59
+ - **Type**: `string`
60
+ - **Required**: No
61
+ - **Description**: No description available
62
+
63
+ ### disabled
64
+ - **Type**: `boolean`
65
+ - **Required**: No
66
+ - **Description**: No description available
67
+
68
+ ### buttonClassName
69
+ - **Type**: `string`
70
+ - **Required**: No
71
+ - **Description**: No description available
72
+
73
+ ### popoverClassName
74
+ - **Type**: `string`
75
+ - **Required**: No
76
+ - **Description**: No description available
77
+
78
+ ## Examples
79
+
80
+ ### Example 1
81
+ Basic controlled combobox with framework selection
82
+ ```tsx
83
+ const [framework, setFramework] = useState("")
84
+ const frameworks = [
85
+ { value: "nextjs", label: "Next.js" },
86
+ { value: "remix", label: "Remix" },
87
+ { value: "sveltekit", label: "SvelteKit" },
88
+ { value: "nuxt", label: "Nuxt.js" },
89
+ ]
90
+ <Combobox
91
+ options={frameworks}
92
+ value={framework}
93
+ onValueChange={setFramework}
94
+ placeholder="Select framework..."
95
+ searchPlaceholder="Search frameworks..."
96
+ buttonClassName="w-[300px]"
97
+ popoverClassName="w-[300px]"
98
+ />
99
+ ```
100
+ ### Example 2
101
+ Advanced combobox with disabled options and custom styling
102
+ ```tsx
103
+ const statusOptions = [
104
+ { value: "active", label: "Active" },
105
+ { value: "pending", label: "Pending" },
106
+ { value: "archived", label: "Archived (Read Only)", disabled: true },
107
+ { value: "deleted", label: "Deleted (Unavailable)", disabled: true },
108
+ ]
109
+ <Combobox
110
+ options={statusOptions}
111
+ value={status}
112
+ onValueChange={(value) => {
113
+ setStatus(value)
114
+ // Track selection analytics
115
+ analytics.track('status_selected', { value })
116
+ }}
117
+ placeholder="Select status..."
118
+ emptyText="No matching status found."
119
+ searchPlaceholder="Filter statuses..."
120
+ buttonClassName="w-[250px] border-primary/50"
121
+ popoverClassName="w-[250px]"
122
+ disabled={isLoading}
123
+ />
124
+ ```
125
+ ### Example 3
126
+ Form integration with validation and error handling
127
+ ```tsx
128
+ import { Label } from "@/components/ui/label"
129
+ import { useFormContext } from "react-hook-form"
130
+ function CountryField() {
131
+ const { register, setValue, watch, formState: { errors } } = useFormContext()
132
+ const selectedCountry = watch("country")
133
+ return (
134
+ <div className="space-y-2">
135
+ <Label htmlFor="country" className={errors.country ? "text-destructive" : ""}>
136
+ Country {errors.country && "*"}
137
+ </Label>
138
+ <Combobox
139
+ options={countries}
140
+ value={selectedCountry}
141
+ onValueChange={(value) => setValue("country", value, { shouldValidate: true })}
142
+ placeholder="Choose your country..."
143
+ searchPlaceholder="Type to search countries..."
144
+ emptyText="Country not found. Try a different search."
145
+ buttonClassName={cn(
146
+ "w-full",
147
+ errors.country && "border-destructive focus-visible:ring-destructive"
148
+ )}
149
+ popoverClassName="w-full"
150
+ disabled={isSubmitting}
151
+ />
152
+ {errors.country && (
153
+ <p className="text-sm text-destructive" role="alert">
154
+ {errors.country.message}
155
+ </p>
156
+ )}
157
+ </div>
158
+ )
159
+ }
160
+ ```
161
+ ### Example 4
162
+ Responsive design with mobile optimization
163
+ ```tsx
164
+ <Combobox
165
+ options={teamMembers}
166
+ value={assignedTo}
167
+ onValueChange={setAssignedTo}
168
+ placeholder="Assign to team member..."
169
+ searchPlaceholder="Search team members..."
170
+ emptyText="No team members found."
171
+ buttonClassName="w-full sm:w-[280px] md:w-[320px]"
172
+ popoverClassName="w-full sm:w-[280px] md:w-[320px]"
173
+ // Mobile: full width, Desktop: fixed width for consistent layout
174
+ />
175
+ ```
176
+ ### Example 5
177
+ Async data loading with loading states
178
+ ```tsx
179
+ function AsyncCombobox() {
180
+ const [options, setOptions] = useState([])
181
+ const [loading, setLoading] = useState(false)
182
+ const [searchTerm, setSearchTerm] = useState("")
183
+ // Debounced search effect
184
+ useEffect(() => {
185
+ if (!searchTerm) return
186
+ const timeoutId = setTimeout(async () => {
187
+ setLoading(true)
188
+ try {
189
+ const results = await searchAPI(searchTerm)
190
+ setOptions(results)
191
+ } finally {
192
+ setLoading(false)
193
+ }
194
+ }, 300)
195
+ return () => clearTimeout(timeoutId)
196
+ }, [searchTerm])
197
+ return (
198
+ <Combobox
199
+ options={options}
200
+ value={selectedValue}
201
+ onValueChange={setSelectedValue}
202
+ placeholder={loading ? "Searching..." : "Search items..."}
203
+ emptyText={loading ? "Loading..." : "No results found."}
204
+ disabled={loading}
205
+ />
206
+ )
207
+ }
208
+ ```
@@ -0,0 +1,112 @@
1
+ # CommandDialog
2
+
3
+ **Type**: component
4
+
5
+ CommandDialog - Modal dialog wrapper for command menu Presents the command menu in a modal dialog overlay, perfect for application-wide command palettes triggered by keyboard shortcuts like Cmd+K or Ctrl+K. Built on Radix UI Dialog with proper focus management, portal rendering, and accessibility. The dialog automatically handles focus trapping, scroll locking, and provides screen reader announcements. Use `container` prop to specify custom portal target.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { CommandDialog } from '@neynar/ui';
11
+
12
+ <CommandDialog
13
+ open={true}
14
+ onOpenChange={handleOpenChange}
15
+ title="value"
16
+ description="value"
17
+ showCloseButton={true}
18
+ container={value}
19
+ className="value"
20
+ >
21
+ {/* Your content here */}
22
+ </CommandDialog>
23
+ ```
24
+
25
+ ## Component Props
26
+
27
+ ### open
28
+ - **Type**: `boolean`
29
+ - **Required**: No
30
+ - **Description**: Controls dialog visibility state
31
+
32
+ ### onOpenChange
33
+ - **Type**: `(open: boolean) => void`
34
+ - **Required**: No
35
+ - **Description**: Callback when dialog open state changes
36
+
37
+ ### title
38
+ - **Type**: `string`
39
+ - **Required**: No
40
+ - **Description**: Screen reader accessible title
41
+
42
+ ### description
43
+ - **Type**: `string`
44
+ - **Required**: No
45
+ - **Description**: Screen reader description
46
+
47
+ ### showCloseButton
48
+ - **Type**: `boolean`
49
+ - **Required**: No
50
+ - **Description**: Whether to show the X close button
51
+
52
+ ### container
53
+ - **Type**: `HTMLElement | null`
54
+ - **Required**: No
55
+ - **Description**: Custom portal container element for rendering
56
+
57
+ ### className
58
+ - **Type**: `string`
59
+ - **Required**: No
60
+ - **Description**: Additional CSS classes for dialog content
61
+
62
+ ### children
63
+ - **Type**: `React.ReactNode`
64
+ - **Required**: No
65
+ - **Description**: No description available
66
+
67
+ ## Examples
68
+
69
+ ### Example 1
70
+ ```tsx
71
+ // Command palette dialog with keyboard shortcut
72
+ const [open, setOpen] = useState(false);
73
+ useEffect(() => {
74
+ const down = (e: KeyboardEvent) => {
75
+ if (e.key === "k" && (e.metaKey || e.ctrlKey)) {
76
+ e.preventDefault();
77
+ setOpen((open) => !open);
78
+ }
79
+ };
80
+ document.addEventListener("keydown", down);
81
+ return () => document.removeEventListener("keydown", down);
82
+ }, []);
83
+ <CommandDialog open={open} onOpenChange={setOpen}>
84
+ <CommandInput placeholder="Type a command..." />
85
+ <CommandList>
86
+ <CommandGroup heading="Actions">
87
+ <CommandItem>Create New File</CommandItem>
88
+ <CommandItem>Open Settings</CommandItem>
89
+ </CommandGroup>
90
+ </CommandList>
91
+ </CommandDialog>
92
+ ```
93
+ ### Example 2
94
+ ```tsx
95
+ // Custom portal container
96
+ const containerRef = useRef<HTMLDivElement>(null);
97
+ <>
98
+ <CommandDialog
99
+ open={open}
100
+ onOpenChange={setOpen}
101
+ container={containerRef.current}
102
+ title="Quick Actions"
103
+ description="Find and run commands quickly"
104
+ >
105
+ <CommandInput />
106
+ <CommandList>
107
+ <CommandItem>Action 1</CommandItem>
108
+ </CommandList>
109
+ </CommandDialog>
110
+ <div ref={containerRef} />
111
+ </>
112
+ ```
@@ -0,0 +1,63 @@
1
+ # CommandEmpty
2
+
3
+ **Type**: component
4
+
5
+ CommandEmpty - Empty state message for command menu Displays when no command items match the current search query. Can contain custom content beyond simple text messages. Automatically shows/hides based on filtered results and announces changes to screen readers. Supports dynamic content using the `useCommandState` hook to access current search term and create contextual empty messages.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { CommandEmpty } from '@neynar/ui';
11
+
12
+ <CommandEmpty
13
+ className="value"
14
+ >
15
+ {/* Your content here */}
16
+ </CommandEmpty>
17
+ ```
18
+
19
+ ## Component Props
20
+
21
+ ### className
22
+ - **Type**: `string`
23
+ - **Required**: No
24
+ - **Description**: Additional CSS classes
25
+
26
+ ### children
27
+ - **Type**: `React.ReactNode`
28
+ - **Required**: No
29
+ - **Description**: No description available
30
+
31
+ ## Examples
32
+
33
+ ### Example 1
34
+ ```tsx
35
+ <CommandList>
36
+ <CommandEmpty>No commands found.</CommandEmpty>
37
+ </CommandList>
38
+ ```
39
+ ### Example 2
40
+ ```tsx
41
+ // Custom empty state with icon and helpful text
42
+ <CommandEmpty>
43
+ <div className="py-6 text-center">
44
+ <SearchIcon className="mx-auto h-10 w-10 text-muted-foreground/50" />
45
+ <h3 className="mt-2 text-sm font-medium">No results found</h3>
46
+ <p className="mt-1 text-sm text-muted-foreground">
47
+ Try adjusting your search terms.
48
+ </p>
49
+ </div>
50
+ </CommandEmpty>
51
+ ```
52
+ ### Example 3
53
+ ```tsx
54
+ // Dynamic empty message with search term
55
+ function DynamicEmpty() {
56
+ const search = useCommandState((state) => state.search);
57
+ return (
58
+ <CommandEmpty>
59
+ {search ? `No results found for "${search}".` : 'Start typing to search...'}
60
+ </CommandEmpty>
61
+ );
62
+ }
63
+ ```
@@ -0,0 +1,83 @@
1
+ # CommandGroup
2
+
3
+ **Type**: component
4
+
5
+ CommandGroup - Groups related command items under a heading Organizes command items into labeled sections with optional headings for better organization and navigation. Groups provide semantic structure for screen readers and can be hidden/shown based on whether they contain matching items. Groups automatically manage their visibility - if all contained items are filtered out, the entire group is hidden. Use `forceMount` to override this behavior.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { CommandGroup } from '@neynar/ui';
11
+
12
+ <CommandGroup
13
+ heading={value}
14
+ value="value"
15
+ forceMount={true}
16
+ className="value"
17
+ >
18
+ {/* Your content here */}
19
+ </CommandGroup>
20
+ ```
21
+
22
+ ## Component Props
23
+
24
+ ### heading
25
+ - **Type**: `React.ReactNode`
26
+ - **Required**: No
27
+ - **Description**: The group heading text or component displayed above items
28
+
29
+ ### value
30
+ - **Type**: `string`
31
+ - **Required**: No
32
+ - **Description**: Group identifier for programmatic control
33
+
34
+ ### forceMount
35
+ - **Type**: `boolean`
36
+ - **Required**: No
37
+ - **Description**: Whether to always render the group even when hidden
38
+
39
+ ### className
40
+ - **Type**: `string`
41
+ - **Required**: No
42
+ - **Description**: Additional CSS classes
43
+
44
+ ### children
45
+ - **Type**: `React.ReactNode`
46
+ - **Required**: No
47
+ - **Description**: No description available
48
+
49
+ ## Examples
50
+
51
+ ### Example 1
52
+ ```tsx
53
+ <CommandGroup heading="Recent Files">
54
+ <CommandItem>document.pdf</CommandItem>
55
+ <CommandItem>presentation.pptx</CommandItem>
56
+ </CommandGroup>
57
+ <CommandGroup heading="Actions">
58
+ <CommandItem>New File</CommandItem>
59
+ <CommandItem>Open File</CommandItem>
60
+ </CommandGroup>
61
+ ```
62
+ ### Example 2
63
+ ```tsx
64
+ // Group with custom heading component
65
+ <CommandGroup
66
+ heading={
67
+ <div className="flex items-center gap-2">
68
+ <FolderIcon className="h-4 w-4" />
69
+ <span>Projects</span>
70
+ </div>
71
+ }
72
+ >
73
+ <CommandItem>Project A</CommandItem>
74
+ <CommandItem>Project B</CommandItem>
75
+ </CommandGroup>
76
+ ```
77
+ ### Example 3
78
+ ```tsx
79
+ // Group that always shows even when filtered
80
+ <CommandGroup heading="Important" forceMount>
81
+ <CommandItem>Critical Action</CommandItem>
82
+ </CommandGroup>
83
+ ```
@@ -0,0 +1,82 @@
1
+ # CommandInput
2
+
3
+ **Type**: component
4
+
5
+ CommandInput - Search input for command menu filtering Provides a search input with search icon for filtering command menu items. Automatically filters items as the user types and triggers live region announcements for screen readers. Supports both controlled and uncontrolled usage patterns. The input integrates with the Command context to provide real-time filtering, search highlighting, and result announcements. Includes built-in search icon and proper focus management.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { CommandInput } from '@neynar/ui';
11
+
12
+ <CommandInput
13
+ value="value"
14
+ onValueChange={handleValueChange}
15
+ placeholder="value"
16
+ disabled={true}
17
+ autoFocus={true}
18
+ className="value"
19
+ />
20
+ ```
21
+
22
+ ## Component Props
23
+
24
+ ### value
25
+ - **Type**: `string`
26
+ - **Required**: No
27
+ - **Description**: Controlled input value for managing search state externally
28
+
29
+ ### onValueChange
30
+ - **Type**: `(search: string) => void`
31
+ - **Required**: No
32
+ - **Description**: Callback fired when input value changes
33
+
34
+ ### placeholder
35
+ - **Type**: `string`
36
+ - **Required**: No
37
+ - **Description**: Placeholder text displayed when input is empty
38
+
39
+ ### disabled
40
+ - **Type**: `boolean`
41
+ - **Required**: No
42
+ - **Description**: Disables the input and prevents interaction
43
+
44
+ ### autoFocus
45
+ - **Type**: `boolean`
46
+ - **Required**: No
47
+ - **Description**: Auto-focus the input when rendered
48
+
49
+ ### className
50
+ - **Type**: `string`
51
+ - **Required**: No
52
+ - **Description**: Additional CSS classes
53
+
54
+ ## Examples
55
+
56
+ ### Example 1
57
+ ```tsx
58
+ // Basic uncontrolled input
59
+ <Command>
60
+ <CommandInput placeholder="Search commands..." />
61
+ <CommandList>...</CommandList>
62
+ </Command>
63
+ ```
64
+ ### Example 2
65
+ ```tsx
66
+ // Controlled input with external state
67
+ const [search, setSearch] = useState('');
68
+ <CommandInput
69
+ value={search}
70
+ onValueChange={setSearch}
71
+ placeholder="Type a command or search..."
72
+ autoFocus
73
+ />
74
+ ```
75
+ ### Example 3
76
+ ```tsx
77
+ // With disabled state
78
+ <CommandInput
79
+ placeholder="Loading..."
80
+ disabled={isLoading}
81
+ />
82
+ ```
@@ -0,0 +1,97 @@
1
+ # CommandItem
2
+
3
+ **Type**: component
4
+
5
+ CommandItem - Individual selectable command item Represents a single command or action that can be selected via keyboard or mouse interaction. Supports icons, text, shortcuts, and advanced filtering with keywords. Items can be disabled, have custom values for filtering, and trigger callbacks on selection. The item's value is used for filtering - if not provided, it defaults to the text content. Keywords can be added to improve search matching without affecting the display.
6
+
7
+ ## JSX Usage
8
+
9
+ ```jsx
10
+ import { CommandItem } from '@neynar/ui';
11
+
12
+ <CommandItem
13
+ value="value"
14
+ keywords={[]}
15
+ disabled={true}
16
+ onSelect={handleSelect}
17
+ forceMount={true}
18
+ className="value"
19
+ >
20
+ {/* Your content here */}
21
+ </CommandItem>
22
+ ```
23
+
24
+ ## Component Props
25
+
26
+ ### value
27
+ - **Type**: `string`
28
+ - **Required**: No
29
+ - **Description**: Unique identifier for filtering and selection (defaults to text content)
30
+
31
+ ### keywords
32
+ - **Type**: `string[]`
33
+ - **Required**: No
34
+ - **Description**: Additional search terms for improved filtering
35
+
36
+ ### disabled
37
+ - **Type**: `boolean`
38
+ - **Required**: No
39
+ - **Description**: Disables interaction and selection
40
+
41
+ ### onSelect
42
+ - **Type**: `(value: string) => void`
43
+ - **Required**: No
44
+ - **Description**: Callback fired when item is selected with Enter or click
45
+
46
+ ### forceMount
47
+ - **Type**: `boolean`
48
+ - **Required**: No
49
+ - **Description**: Always render even when filtered out
50
+
51
+ ### className
52
+ - **Type**: `string`
53
+ - **Required**: No
54
+ - **Description**: Additional CSS classes
55
+
56
+ ### children
57
+ - **Type**: `React.ReactNode`
58
+ - **Required**: No
59
+ - **Description**: No description available
60
+
61
+ ## Examples
62
+
63
+ ### Example 1
64
+ ```tsx
65
+ // Basic command item
66
+ <CommandItem onSelect={() => console.log("File opened")}>
67
+ Open File
68
+ </CommandItem>
69
+ ```
70
+ ### Example 2
71
+ ```tsx
72
+ // Command item with icon and shortcut
73
+ <CommandItem value="new-document" onSelect={handleCreateDocument}>
74
+ <FileIcon className="mr-2 h-4 w-4" />
75
+ New Document
76
+ <CommandShortcut>⌘N</CommandShortcut>
77
+ </CommandItem>
78
+ ```
79
+ ### Example 3
80
+ ```tsx
81
+ // Item with keywords for better search
82
+ <CommandItem
83
+ value="apple"
84
+ keywords={['fruit', 'red', 'healthy']}
85
+ onSelect={() => selectFruit('apple')}
86
+ >
87
+ 🍎 Apple
88
+ </CommandItem>
89
+ ```
90
+ ### Example 4
91
+ ```tsx
92
+ // Disabled item that shows but cannot be selected
93
+ <CommandItem disabled>
94
+ <LockIcon className="mr-2 h-4 w-4" />
95
+ Premium Feature
96
+ </CommandItem>
97
+ ```