@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.
- package/.llm/accordion-content.llm.md +67 -0
- package/.llm/accordion-item.llm.md +61 -0
- package/.llm/accordion-trigger.llm.md +69 -0
- package/.llm/accordion.llm.md +88 -0
- package/.llm/alert-description.llm.md +78 -0
- package/.llm/alert-dialog-action.llm.md +51 -0
- package/.llm/alert-dialog-cancel.llm.md +48 -0
- package/.llm/alert-dialog-content.llm.md +88 -0
- package/.llm/alert-dialog-description.llm.md +53 -0
- package/.llm/alert-dialog-footer.llm.md +41 -0
- package/.llm/alert-dialog-header.llm.md +39 -0
- package/.llm/alert-dialog-overlay.llm.md +44 -0
- package/.llm/alert-dialog-portal.llm.md +41 -0
- package/.llm/alert-dialog-title.llm.md +46 -0
- package/.llm/alert-dialog-trigger.llm.md +40 -0
- package/.llm/alert-dialog.llm.md +80 -0
- package/.llm/alert-title.llm.md +48 -0
- package/.llm/alert.llm.md +92 -0
- package/.llm/aspect-ratio.llm.md +41 -0
- package/.llm/avatar-fallback.llm.md +41 -0
- package/.llm/avatar-image.llm.md +48 -0
- package/.llm/avatar.llm.md +35 -0
- package/.llm/badge.llm.md +117 -0
- package/.llm/blockquote.llm.md +55 -0
- package/.llm/body-text-large.llm.md +49 -0
- package/.llm/body-text-small.llm.md +49 -0
- package/.llm/body-text.llm.md +52 -0
- package/.llm/breadcrumb-ellipsis.llm.md +73 -0
- package/.llm/breadcrumb-item.llm.md +53 -0
- package/.llm/breadcrumb-link.llm.md +84 -0
- package/.llm/breadcrumb-list.llm.md +54 -0
- package/.llm/breadcrumb-page.llm.md +52 -0
- package/.llm/breadcrumb-separator.llm.md +60 -0
- package/.llm/breadcrumb.llm.md +110 -0
- package/.llm/button-group-separator.llm.md +53 -0
- package/.llm/button-group-text.llm.md +56 -0
- package/.llm/button-group.llm.md +81 -0
- package/.llm/button.llm.md +281 -0
- package/.llm/calendar-day-button.llm.md +57 -0
- package/.llm/calendar.llm.md +340 -0
- package/.llm/caption.llm.md +48 -0
- package/.llm/card-action.llm.md +64 -0
- package/.llm/card-content.llm.md +48 -0
- package/.llm/card-description.llm.md +46 -0
- package/.llm/card-footer.llm.md +56 -0
- package/.llm/card-header.llm.md +53 -0
- package/.llm/card-title.llm.md +43 -0
- package/.llm/card.llm.md +100 -0
- package/.llm/carousel-content.llm.md +77 -0
- package/.llm/carousel-item.llm.md +96 -0
- package/.llm/carousel-next.llm.md +95 -0
- package/.llm/carousel-previous.llm.md +95 -0
- package/.llm/carousel.llm.md +211 -0
- package/.llm/chart-config.llm.md +71 -0
- package/.llm/chart-container.llm.md +148 -0
- package/.llm/chart-legend-content.llm.md +85 -0
- package/.llm/chart-legend.llm.md +144 -0
- package/.llm/chart-style.llm.md +28 -0
- package/.llm/chart-tooltip-content.llm.md +149 -0
- package/.llm/chart-tooltip.llm.md +184 -0
- package/.llm/checkbox.llm.md +100 -0
- package/.llm/cn.llm.md +46 -0
- package/.llm/code.llm.md +45 -0
- package/.llm/collapsible-content.llm.md +109 -0
- package/.llm/collapsible-trigger.llm.md +75 -0
- package/.llm/collapsible.llm.md +109 -0
- package/.llm/combobox-option.llm.md +53 -0
- package/.llm/combobox.llm.md +208 -0
- package/.llm/command-dialog.llm.md +112 -0
- package/.llm/command-empty.llm.md +63 -0
- package/.llm/command-group.llm.md +83 -0
- package/.llm/command-input.llm.md +82 -0
- package/.llm/command-item.llm.md +97 -0
- package/.llm/command-list.llm.md +53 -0
- package/.llm/command-loading.llm.md +48 -0
- package/.llm/command-separator.llm.md +44 -0
- package/.llm/command-shortcut.llm.md +63 -0
- package/.llm/command.llm.md +147 -0
- package/.llm/container.llm.md +236 -0
- package/.llm/context-menu-checkbox-item.llm.md +97 -0
- package/.llm/context-menu-content.llm.md +91 -0
- package/.llm/context-menu-group.llm.md +61 -0
- package/.llm/context-menu-item.llm.md +94 -0
- package/.llm/context-menu-label.llm.md +60 -0
- package/.llm/context-menu-portal.llm.md +49 -0
- package/.llm/context-menu-radio-group.llm.md +66 -0
- package/.llm/context-menu-radio-item.llm.md +76 -0
- package/.llm/context-menu-separator.llm.md +51 -0
- package/.llm/context-menu-shortcut.llm.md +57 -0
- package/.llm/context-menu-sub-content.llm.md +90 -0
- package/.llm/context-menu-sub-trigger.llm.md +73 -0
- package/.llm/context-menu-sub.llm.md +61 -0
- package/.llm/context-menu-trigger.llm.md +53 -0
- package/.llm/context-menu.llm.md +103 -0
- package/.llm/date-picker.llm.md +90 -0
- package/.llm/dialog-close.llm.md +61 -0
- package/.llm/dialog-content.llm.md +128 -0
- package/.llm/dialog-description.llm.md +44 -0
- package/.llm/dialog-footer.llm.md +38 -0
- package/.llm/dialog-header.llm.md +40 -0
- package/.llm/dialog-overlay.llm.md +57 -0
- package/.llm/dialog-portal.llm.md +47 -0
- package/.llm/dialog-title.llm.md +41 -0
- package/.llm/dialog-trigger.llm.md +51 -0
- package/.llm/dialog.llm.md +113 -0
- package/.llm/drawer-close.llm.md +53 -0
- package/.llm/drawer-content.llm.md +58 -0
- package/.llm/drawer-description.llm.md +54 -0
- package/.llm/drawer-footer.llm.md +67 -0
- package/.llm/drawer-header.llm.md +60 -0
- package/.llm/drawer-overlay.llm.md +40 -0
- package/.llm/drawer-portal.llm.md +42 -0
- package/.llm/drawer-title.llm.md +51 -0
- package/.llm/drawer-trigger.llm.md +44 -0
- package/.llm/drawer.llm.md +194 -0
- package/.llm/dropdown-menu-checkbox-item.llm.md +111 -0
- package/.llm/dropdown-menu-content.llm.md +109 -0
- package/.llm/dropdown-menu-group.llm.md +38 -0
- package/.llm/dropdown-menu-item.llm.md +94 -0
- package/.llm/dropdown-menu-label.llm.md +66 -0
- package/.llm/dropdown-menu-portal.llm.md +32 -0
- package/.llm/dropdown-menu-radio-group.llm.md +73 -0
- package/.llm/dropdown-menu-radio-item.llm.md +92 -0
- package/.llm/dropdown-menu-separator.llm.md +55 -0
- package/.llm/dropdown-menu-shortcut.llm.md +74 -0
- package/.llm/dropdown-menu-sub-content.llm.md +80 -0
- package/.llm/dropdown-menu-sub-trigger.llm.md +84 -0
- package/.llm/dropdown-menu-sub.llm.md +74 -0
- package/.llm/dropdown-menu-trigger.llm.md +48 -0
- package/.llm/dropdown-menu.llm.md +120 -0
- package/.llm/empty-content.llm.md +103 -0
- package/.llm/empty-description.llm.md +70 -0
- package/.llm/empty-header.llm.md +64 -0
- package/.llm/empty-media.llm.md +81 -0
- package/.llm/empty-state.llm.md +174 -0
- package/.llm/empty-title.llm.md +54 -0
- package/.llm/empty.llm.md +158 -0
- package/.llm/field-content.llm.md +28 -0
- package/.llm/field-description.llm.md +28 -0
- package/.llm/field-error.llm.md +41 -0
- package/.llm/field-group.llm.md +84 -0
- package/.llm/field-label.llm.md +28 -0
- package/.llm/field-legend.llm.md +77 -0
- package/.llm/field-separator.llm.md +35 -0
- package/.llm/field-set.llm.md +80 -0
- package/.llm/field-title.llm.md +28 -0
- package/.llm/field.llm.md +35 -0
- package/.llm/hover-card-content.llm.md +167 -0
- package/.llm/hover-card-trigger.llm.md +65 -0
- package/.llm/hover-card.llm.md +121 -0
- package/.llm/input-group-addon.llm.md +91 -0
- package/.llm/input-group-button.llm.md +120 -0
- package/.llm/input-group-input.llm.md +145 -0
- package/.llm/input-group-text.llm.md +75 -0
- package/.llm/input-group-textarea.llm.md +157 -0
- package/.llm/input-group.llm.md +108 -0
- package/.llm/input.llm.md +319 -0
- package/.llm/item-actions.llm.md +77 -0
- package/.llm/item-content.llm.md +73 -0
- package/.llm/item-description.llm.md +61 -0
- package/.llm/item-footer.llm.md +68 -0
- package/.llm/item-group.llm.md +73 -0
- package/.llm/item-header.llm.md +66 -0
- package/.llm/item-media.llm.md +75 -0
- package/.llm/item-separator.llm.md +80 -0
- package/.llm/item-title.llm.md +59 -0
- package/.llm/item.llm.md +115 -0
- package/.llm/kbd-group.llm.md +71 -0
- package/.llm/kbd.llm.md +71 -0
- package/.llm/label.llm.md +145 -0
- package/.llm/menubar-checkbox-item.llm.md +66 -0
- package/.llm/menubar-content.llm.md +128 -0
- package/.llm/menubar-group.llm.md +40 -0
- package/.llm/menubar-item.llm.md +62 -0
- package/.llm/menubar-label.llm.md +40 -0
- package/.llm/menubar-menu.llm.md +32 -0
- package/.llm/menubar-portal.llm.md +38 -0
- package/.llm/menubar-radio-group.llm.md +39 -0
- package/.llm/menubar-radio-item.llm.md +59 -0
- package/.llm/menubar-separator.llm.md +35 -0
- package/.llm/menubar-shortcut.llm.md +37 -0
- package/.llm/menubar-sub-content.llm.md +127 -0
- package/.llm/menubar-sub-trigger.llm.md +51 -0
- package/.llm/menubar-sub.llm.md +53 -0
- package/.llm/menubar-trigger.llm.md +37 -0
- package/.llm/menubar.llm.md +115 -0
- package/.llm/navigation-menu-content.llm.md +116 -0
- package/.llm/navigation-menu-indicator.llm.md +68 -0
- package/.llm/navigation-menu-item.llm.md +62 -0
- package/.llm/navigation-menu-link.llm.md +109 -0
- package/.llm/navigation-menu-list.llm.md +52 -0
- package/.llm/navigation-menu-trigger-style.llm.md +22 -0
- package/.llm/navigation-menu-trigger.llm.md +57 -0
- package/.llm/navigation-menu-viewport.llm.md +51 -0
- package/.llm/navigation-menu.llm.md +184 -0
- package/.llm/overline.llm.md +51 -0
- package/.llm/page-title.llm.md +52 -0
- package/.llm/pagination-content.llm.md +60 -0
- package/.llm/pagination-ellipsis.llm.md +107 -0
- package/.llm/pagination-item.llm.md +59 -0
- package/.llm/pagination-link.llm.md +150 -0
- package/.llm/pagination-next.llm.md +115 -0
- package/.llm/pagination-previous.llm.md +115 -0
- package/.llm/pagination.llm.md +190 -0
- package/.llm/popover-anchor.llm.md +53 -0
- package/.llm/popover-content.llm.md +109 -0
- package/.llm/popover-trigger.llm.md +54 -0
- package/.llm/popover.llm.md +116 -0
- package/.llm/progress.llm.md +76 -0
- package/.llm/radio-group-indicator.llm.md +28 -0
- package/.llm/radio-group-item.llm.md +40 -0
- package/.llm/radio-group.llm.md +76 -0
- package/.llm/resizable-handle.llm.md +156 -0
- package/.llm/resizable-panel-group.llm.md +149 -0
- package/.llm/resizable-panel.llm.md +157 -0
- package/.llm/scroll-area-corner.llm.md +41 -0
- package/.llm/scroll-area-thumb.llm.md +39 -0
- package/.llm/scroll-area-viewport.llm.md +60 -0
- package/.llm/scroll-area.llm.md +125 -0
- package/.llm/scroll-bar.llm.md +78 -0
- package/.llm/sdk-items-registry.json +2984 -0
- package/.llm/section-title.llm.md +48 -0
- package/.llm/select-content.llm.md +139 -0
- package/.llm/select-group.llm.md +60 -0
- package/.llm/select-item.llm.md +75 -0
- package/.llm/select-label.llm.md +62 -0
- package/.llm/select-scroll-down-button.llm.md +45 -0
- package/.llm/select-scroll-up-button.llm.md +45 -0
- package/.llm/select-separator.llm.md +59 -0
- package/.llm/select-trigger.llm.md +66 -0
- package/.llm/select-value.llm.md +67 -0
- package/.llm/select.llm.md +159 -0
- package/.llm/separator.llm.md +129 -0
- package/.llm/sheet-close.llm.md +49 -0
- package/.llm/sheet-content.llm.md +115 -0
- package/.llm/sheet-description.llm.md +62 -0
- package/.llm/sheet-footer.llm.md +64 -0
- package/.llm/sheet-header.llm.md +52 -0
- package/.llm/sheet-title.llm.md +53 -0
- package/.llm/sheet-trigger.llm.md +46 -0
- package/.llm/sheet.llm.md +126 -0
- package/.llm/sidebar-content.llm.md +63 -0
- package/.llm/sidebar-footer.llm.md +50 -0
- package/.llm/sidebar-group-action.llm.md +60 -0
- package/.llm/sidebar-group-content.llm.md +64 -0
- package/.llm/sidebar-group-label.llm.md +53 -0
- package/.llm/sidebar-group.llm.md +56 -0
- package/.llm/sidebar-header.llm.md +67 -0
- package/.llm/sidebar-input.llm.md +50 -0
- package/.llm/sidebar-inset.llm.md +52 -0
- package/.llm/sidebar-menu-action.llm.md +84 -0
- package/.llm/sidebar-menu-badge.llm.md +60 -0
- package/.llm/sidebar-menu-button.llm.md +103 -0
- package/.llm/sidebar-menu-item.llm.md +75 -0
- package/.llm/sidebar-menu-skeleton.llm.md +76 -0
- package/.llm/sidebar-menu-sub-button.llm.md +85 -0
- package/.llm/sidebar-menu-sub-item.llm.md +54 -0
- package/.llm/sidebar-menu-sub.llm.md +74 -0
- package/.llm/sidebar-menu.llm.md +65 -0
- package/.llm/sidebar-provider.llm.md +79 -0
- package/.llm/sidebar-rail.llm.md +34 -0
- package/.llm/sidebar-separator.llm.md +57 -0
- package/.llm/sidebar-trigger.llm.md +49 -0
- package/.llm/sidebar.llm.md +129 -0
- package/.llm/skeleton.llm.md +134 -0
- package/.llm/slider.llm.md +173 -0
- package/.llm/spinner.llm.md +182 -0
- package/.llm/stack.llm.md +28 -0
- package/.llm/subsection-title.llm.md +46 -0
- package/.llm/switch.llm.md +76 -0
- package/.llm/table-body.llm.md +36 -0
- package/.llm/table-caption.llm.md +48 -0
- package/.llm/table-cell.llm.md +53 -0
- package/.llm/table-footer.llm.md +41 -0
- package/.llm/table-head.llm.md +69 -0
- package/.llm/table-header.llm.md +41 -0
- package/.llm/table-row.llm.md +42 -0
- package/.llm/table.llm.md +123 -0
- package/.llm/tabs-content.llm.md +47 -0
- package/.llm/tabs-list.llm.md +41 -0
- package/.llm/tabs-trigger.llm.md +47 -0
- package/.llm/tabs.llm.md +71 -0
- package/.llm/text-field.llm.md +327 -0
- package/.llm/textarea.llm.md +311 -0
- package/.llm/theme-preference.llm.md +25 -0
- package/.llm/theme-toggle.llm.md +57 -0
- package/.llm/theme.llm.md +14 -0
- package/.llm/toaster.llm.md +193 -0
- package/.llm/toggle-group-item.llm.md +59 -0
- package/.llm/toggle-group.llm.md +101 -0
- package/.llm/toggle.llm.md +40 -0
- package/.llm/tooltip-content.llm.md +185 -0
- package/.llm/tooltip-provider.llm.md +68 -0
- package/.llm/tooltip-trigger.llm.md +70 -0
- package/.llm/tooltip.llm.md +129 -0
- package/.llm/use-carousel.llm.md +55 -0
- package/.llm/use-command-state.llm.md +32 -0
- package/.llm/use-is-mobile.llm.md +73 -0
- package/.llm/use-sidebar.llm.md +61 -0
- package/dist/components/ui/scroll-area.d.ts +5 -5
- package/dist/components/ui/scroll-area.d.ts.map +1 -1
- package/dist/components/ui/stack.d.ts.map +1 -1
- package/dist/components/ui/stories/scroll-area.stories.d.ts +1 -1
- package/dist/components/ui/stories/typography.stories.d.ts +8 -108
- package/dist/components/ui/stories/typography.stories.d.ts.map +1 -1
- package/dist/components/ui/theme-toggle.d.ts +0 -3
- package/dist/components/ui/theme-toggle.d.ts.map +1 -1
- package/dist/components/ui/theme.d.ts.map +1 -1
- package/dist/components/ui/typography.d.ts +211 -474
- package/dist/components/ui/typography.d.ts.map +1 -1
- package/dist/index.js +5160 -9875
- package/dist/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/components/ui/stack.tsx +3 -1
- package/src/components/ui/stories/typography.stories.tsx +261 -1512
- package/src/components/ui/theme-toggle.tsx +1 -3
- package/src/components/ui/theme.tsx +6 -1
- package/src/components/ui/typography.tsx +416 -1136
- 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
|
+
```
|