@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,91 @@
|
|
|
1
|
+
# ContextMenuContent
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuContent - The container for context menu items Contains all menu items, separators, labels, and sub-menus. Automatically positioned relative to the trigger point with collision detection and smooth animations. Renders in a portal by default for proper layering.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuContent } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuContent
|
|
13
|
+
asChild={true}
|
|
14
|
+
loop={true}
|
|
15
|
+
onCloseAutoFocus={handleCloseAutoFocus}
|
|
16
|
+
onEscapeKeyDown={handleEscapeKeyDown}
|
|
17
|
+
avoidCollisions={true}
|
|
18
|
+
sideOffset={0}
|
|
19
|
+
className="value"
|
|
20
|
+
>
|
|
21
|
+
{/* Your content here */}
|
|
22
|
+
</ContextMenuContent>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Component Props
|
|
26
|
+
|
|
27
|
+
### asChild
|
|
28
|
+
- **Type**: `boolean`
|
|
29
|
+
- **Required**: No
|
|
30
|
+
- **Description**: Merges props with child element instead of rendering wrapper
|
|
31
|
+
|
|
32
|
+
### loop
|
|
33
|
+
- **Type**: `boolean`
|
|
34
|
+
- **Required**: No
|
|
35
|
+
- **Description**: Enable keyboard navigation looping from last to first item
|
|
36
|
+
|
|
37
|
+
### onCloseAutoFocus
|
|
38
|
+
- **Type**: `(event: Event) => void`
|
|
39
|
+
- **Required**: No
|
|
40
|
+
- **Description**: Handle focus return when menu closes
|
|
41
|
+
|
|
42
|
+
### onEscapeKeyDown
|
|
43
|
+
- **Type**: `(event: KeyboardEvent) => void`
|
|
44
|
+
- **Required**: No
|
|
45
|
+
- **Description**: Handle escape key presses
|
|
46
|
+
|
|
47
|
+
### avoidCollisions
|
|
48
|
+
- **Type**: `boolean`
|
|
49
|
+
- **Required**: No
|
|
50
|
+
- **Description**: Prevent collisions with viewport boundaries
|
|
51
|
+
|
|
52
|
+
### sideOffset
|
|
53
|
+
- **Type**: `number`
|
|
54
|
+
- **Required**: No
|
|
55
|
+
- **Description**: Distance in pixels from the cursor/trigger point
|
|
56
|
+
|
|
57
|
+
### className
|
|
58
|
+
- **Type**: `string`
|
|
59
|
+
- **Required**: No
|
|
60
|
+
- **Description**: Additional CSS classes for styling
|
|
61
|
+
|
|
62
|
+
### children
|
|
63
|
+
- **Type**: `React.ReactNode`
|
|
64
|
+
- **Required**: Yes
|
|
65
|
+
- **Description**: Menu items, labels, separators, and sub-menus to display
|
|
66
|
+
|
|
67
|
+
## Examples
|
|
68
|
+
|
|
69
|
+
### Example 1
|
|
70
|
+
```tsx
|
|
71
|
+
<ContextMenuContent className="w-56">
|
|
72
|
+
<ContextMenuLabel>Actions</ContextMenuLabel>
|
|
73
|
+
<ContextMenuSeparator />
|
|
74
|
+
<ContextMenuItem>Copy</ContextMenuItem>
|
|
75
|
+
<ContextMenuItem>Paste</ContextMenuItem>
|
|
76
|
+
</ContextMenuContent>
|
|
77
|
+
```
|
|
78
|
+
### Example 2
|
|
79
|
+
```tsx
|
|
80
|
+
// With event handlers and positioning
|
|
81
|
+
<ContextMenuContent
|
|
82
|
+
onCloseAutoFocus={(e) => e.preventDefault()}
|
|
83
|
+
onEscapeKeyDown={(e) => console.log('Escape pressed')}
|
|
84
|
+
avoidCollisions={true}
|
|
85
|
+
sideOffset={4}
|
|
86
|
+
loop={true}
|
|
87
|
+
>
|
|
88
|
+
<ContextMenuItem>Item 1</ContextMenuItem>
|
|
89
|
+
<ContextMenuItem>Item 2</ContextMenuItem>
|
|
90
|
+
</ContextMenuContent>
|
|
91
|
+
```
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# ContextMenuGroup
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuGroup - Logical grouping for menu items Groups related menu items together for better organization and accessibility. Provides semantic structure without visual changes but improves screen reader navigation by grouping related actions.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuGroup } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuGroup
|
|
13
|
+
asChild={true}
|
|
14
|
+
className="value"
|
|
15
|
+
>
|
|
16
|
+
{/* Your content here */}
|
|
17
|
+
</ContextMenuGroup>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Component Props
|
|
21
|
+
|
|
22
|
+
### asChild
|
|
23
|
+
- **Type**: `boolean`
|
|
24
|
+
- **Required**: No
|
|
25
|
+
- **Description**: Merges props with child element instead of rendering wrapper
|
|
26
|
+
|
|
27
|
+
### className
|
|
28
|
+
- **Type**: `string`
|
|
29
|
+
- **Required**: No
|
|
30
|
+
- **Description**: No description available
|
|
31
|
+
|
|
32
|
+
### children
|
|
33
|
+
- **Type**: `React.ReactNode`
|
|
34
|
+
- **Required**: Yes
|
|
35
|
+
- **Description**: The menu items to group together logically
|
|
36
|
+
|
|
37
|
+
## Examples
|
|
38
|
+
|
|
39
|
+
### Example 1
|
|
40
|
+
```tsx
|
|
41
|
+
<ContextMenuGroup>
|
|
42
|
+
<ContextMenuItem>Copy</ContextMenuItem>
|
|
43
|
+
<ContextMenuItem>Cut</ContextMenuItem>
|
|
44
|
+
<ContextMenuItem>Paste</ContextMenuItem>
|
|
45
|
+
</ContextMenuGroup>
|
|
46
|
+
```
|
|
47
|
+
### Example 2
|
|
48
|
+
```tsx
|
|
49
|
+
// Multiple groups with separators
|
|
50
|
+
<ContextMenuContent>
|
|
51
|
+
<ContextMenuGroup>
|
|
52
|
+
<ContextMenuItem>Undo</ContextMenuItem>
|
|
53
|
+
<ContextMenuItem>Redo</ContextMenuItem>
|
|
54
|
+
</ContextMenuGroup>
|
|
55
|
+
<ContextMenuSeparator />
|
|
56
|
+
<ContextMenuGroup>
|
|
57
|
+
<ContextMenuItem>Copy</ContextMenuItem>
|
|
58
|
+
<ContextMenuItem>Paste</ContextMenuItem>
|
|
59
|
+
</ContextMenuGroup>
|
|
60
|
+
</ContextMenuContent>
|
|
61
|
+
```
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# ContextMenuItem
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuItem - An actionable item within the context menu Individual menu items that users can interact with. Supports different variants for visual hierarchy and includes automatic icon styling. Items can be clicked, selected via keyboard, and support custom styling.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuItem } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuItem
|
|
13
|
+
asChild={true}
|
|
14
|
+
disabled={true}
|
|
15
|
+
onSelect={handleSelect}
|
|
16
|
+
textValue="value"
|
|
17
|
+
inset={true}
|
|
18
|
+
variant={value}
|
|
19
|
+
className="value"
|
|
20
|
+
>
|
|
21
|
+
{/* Your content here */}
|
|
22
|
+
</ContextMenuItem>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Component Props
|
|
26
|
+
|
|
27
|
+
### asChild
|
|
28
|
+
- **Type**: `boolean`
|
|
29
|
+
- **Required**: No
|
|
30
|
+
- **Description**: Merges props with child element instead of rendering wrapper
|
|
31
|
+
|
|
32
|
+
### disabled
|
|
33
|
+
- **Type**: `boolean`
|
|
34
|
+
- **Required**: No
|
|
35
|
+
- **Description**: Prevents interaction and dims the item visually
|
|
36
|
+
|
|
37
|
+
### onSelect
|
|
38
|
+
- **Type**: `(event: Event) => void`
|
|
39
|
+
- **Required**: No
|
|
40
|
+
- **Description**: Callback fired when item is selected (via mouse or keyboard)
|
|
41
|
+
|
|
42
|
+
### textValue
|
|
43
|
+
- **Type**: `string`
|
|
44
|
+
- **Required**: No
|
|
45
|
+
- **Description**: Custom text for typeahead navigation when content is complex
|
|
46
|
+
|
|
47
|
+
### inset
|
|
48
|
+
- **Type**: `boolean`
|
|
49
|
+
- **Required**: No
|
|
50
|
+
- **Description**: Whether to indent the item for alignment with icon-based items
|
|
51
|
+
|
|
52
|
+
### variant
|
|
53
|
+
- **Type**: `"default" | "destructive"`
|
|
54
|
+
- **Required**: No
|
|
55
|
+
- **Description**: Visual variant ("default" for normal actions, "destructive" for dangerous actions)
|
|
56
|
+
|
|
57
|
+
### className
|
|
58
|
+
- **Type**: `string`
|
|
59
|
+
- **Required**: No
|
|
60
|
+
- **Description**: Additional CSS classes for custom styling
|
|
61
|
+
|
|
62
|
+
### children
|
|
63
|
+
- **Type**: `React.ReactNode`
|
|
64
|
+
- **Required**: Yes
|
|
65
|
+
- **Description**: Content of the menu item (text, icons, shortcuts, etc.)
|
|
66
|
+
|
|
67
|
+
## Examples
|
|
68
|
+
|
|
69
|
+
### Example 1
|
|
70
|
+
```tsx
|
|
71
|
+
<ContextMenuItem onSelect={() => console.log('Edit selected')}>
|
|
72
|
+
<Edit className="mr-2 h-4 w-4" />
|
|
73
|
+
Edit
|
|
74
|
+
<ContextMenuShortcut>⌘E</ContextMenuShortcut>
|
|
75
|
+
</ContextMenuItem>
|
|
76
|
+
```
|
|
77
|
+
### Example 2
|
|
78
|
+
```tsx
|
|
79
|
+
<ContextMenuItem variant="destructive" onSelect={handleDelete}>
|
|
80
|
+
<Trash2 className="mr-2 h-4 w-4" />
|
|
81
|
+
Delete
|
|
82
|
+
</ContextMenuItem>
|
|
83
|
+
```
|
|
84
|
+
### Example 3
|
|
85
|
+
```tsx
|
|
86
|
+
// With custom text value for typeahead
|
|
87
|
+
<ContextMenuItem
|
|
88
|
+
textValue="Copy to clipboard"
|
|
89
|
+
onSelect={handleCopy}
|
|
90
|
+
>
|
|
91
|
+
<Copy className="mr-2 h-4 w-4" />
|
|
92
|
+
Copy <span className="text-muted-foreground">to clipboard</span>
|
|
93
|
+
</ContextMenuItem>
|
|
94
|
+
```
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# ContextMenuLabel
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuLabel - A non-interactive label for menu sections Used to group related menu items and provide context. Labels are not focusable and serve as visual section headers within the menu. Helps organize menu content and improve accessibility.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuLabel } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuLabel
|
|
13
|
+
asChild={true}
|
|
14
|
+
inset={true}
|
|
15
|
+
className="value"
|
|
16
|
+
>
|
|
17
|
+
{/* Your content here */}
|
|
18
|
+
</ContextMenuLabel>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Component Props
|
|
22
|
+
|
|
23
|
+
### asChild
|
|
24
|
+
- **Type**: `boolean`
|
|
25
|
+
- **Required**: No
|
|
26
|
+
- **Description**: Merges props with child element instead of rendering wrapper
|
|
27
|
+
|
|
28
|
+
### inset
|
|
29
|
+
- **Type**: `boolean`
|
|
30
|
+
- **Required**: No
|
|
31
|
+
- **Description**: Whether to indent the label to align with inset items
|
|
32
|
+
|
|
33
|
+
### className
|
|
34
|
+
- **Type**: `string`
|
|
35
|
+
- **Required**: No
|
|
36
|
+
- **Description**: Additional CSS classes for styling
|
|
37
|
+
|
|
38
|
+
### children
|
|
39
|
+
- **Type**: `React.ReactNode`
|
|
40
|
+
- **Required**: Yes
|
|
41
|
+
- **Description**: The text content of the label
|
|
42
|
+
|
|
43
|
+
## Examples
|
|
44
|
+
|
|
45
|
+
### Example 1
|
|
46
|
+
```tsx
|
|
47
|
+
<ContextMenuLabel>File Actions</ContextMenuLabel>
|
|
48
|
+
<ContextMenuSeparator />
|
|
49
|
+
<ContextMenuItem>Open</ContextMenuItem>
|
|
50
|
+
<ContextMenuItem>Save</ContextMenuItem>
|
|
51
|
+
```
|
|
52
|
+
### Example 2
|
|
53
|
+
```tsx
|
|
54
|
+
// With inset alignment for consistency
|
|
55
|
+
<ContextMenuContent>
|
|
56
|
+
<ContextMenuLabel inset>Edit Options</ContextMenuLabel>
|
|
57
|
+
<ContextMenuItem inset>Copy</ContextMenuItem>
|
|
58
|
+
<ContextMenuItem inset>Paste</ContextMenuItem>
|
|
59
|
+
</ContextMenuContent>
|
|
60
|
+
```
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# ContextMenuPortal
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuPortal - Portal container for menu content Renders menu content in a portal to ensure proper layering and positioning. Useful for controlling where menu content is rendered in the DOM tree, especially important for sub-menus and complex layouts.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuPortal } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuPortal
|
|
13
|
+
container={value}
|
|
14
|
+
>
|
|
15
|
+
{/* Your content here */}
|
|
16
|
+
</ContextMenuPortal>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Component Props
|
|
20
|
+
|
|
21
|
+
### container
|
|
22
|
+
- **Type**: `HTMLElement`
|
|
23
|
+
- **Required**: No
|
|
24
|
+
- **Description**: Custom container element to portal content into
|
|
25
|
+
|
|
26
|
+
### children
|
|
27
|
+
- **Type**: `React.ReactNode`
|
|
28
|
+
- **Required**: Yes
|
|
29
|
+
- **Description**: The menu content to render in the portal
|
|
30
|
+
|
|
31
|
+
## Examples
|
|
32
|
+
|
|
33
|
+
### Example 1
|
|
34
|
+
```tsx
|
|
35
|
+
<ContextMenuPortal>
|
|
36
|
+
<ContextMenuSubContent>
|
|
37
|
+
<ContextMenuItem>Portal Item</ContextMenuItem>
|
|
38
|
+
</ContextMenuSubContent>
|
|
39
|
+
</ContextMenuPortal>
|
|
40
|
+
```
|
|
41
|
+
### Example 2
|
|
42
|
+
```tsx
|
|
43
|
+
// Portal into specific container
|
|
44
|
+
<ContextMenuPortal container={document.getElementById('menu-container')}>
|
|
45
|
+
<ContextMenuContent>
|
|
46
|
+
<ContextMenuItem>Custom Portal Item</ContextMenuItem>
|
|
47
|
+
</ContextMenuContent>
|
|
48
|
+
</ContextMenuPortal>
|
|
49
|
+
```
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# ContextMenuRadioGroup
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuRadioGroup - Container for radio button items Groups radio items together to allow single selection from multiple options. Manages the selected state and ensures only one item can be selected at a time. Provides controlled state management for radio selections within menus.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuRadioGroup } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuRadioGroup
|
|
13
|
+
value="value"
|
|
14
|
+
onValueChange={handleValueChange}
|
|
15
|
+
className="value"
|
|
16
|
+
>
|
|
17
|
+
{/* Your content here */}
|
|
18
|
+
</ContextMenuRadioGroup>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Component Props
|
|
22
|
+
|
|
23
|
+
### value
|
|
24
|
+
- **Type**: `string`
|
|
25
|
+
- **Required**: No
|
|
26
|
+
- **Description**: The currently selected value that matches a RadioItem's value
|
|
27
|
+
|
|
28
|
+
### onValueChange
|
|
29
|
+
- **Type**: `(value: string) => void`
|
|
30
|
+
- **Required**: No
|
|
31
|
+
- **Description**: Callback fired when selection changes, receives new value
|
|
32
|
+
|
|
33
|
+
### className
|
|
34
|
+
- **Type**: `string`
|
|
35
|
+
- **Required**: No
|
|
36
|
+
- **Description**: No description available
|
|
37
|
+
|
|
38
|
+
### children
|
|
39
|
+
- **Type**: `React.ReactNode`
|
|
40
|
+
- **Required**: Yes
|
|
41
|
+
- **Description**: ContextMenuRadioItem components to group together
|
|
42
|
+
|
|
43
|
+
## Examples
|
|
44
|
+
|
|
45
|
+
### Example 1
|
|
46
|
+
```tsx
|
|
47
|
+
const [theme, setTheme] = useState("light")
|
|
48
|
+
<ContextMenuRadioGroup value={theme} onValueChange={setTheme}>
|
|
49
|
+
<ContextMenuRadioItem value="light">Light</ContextMenuRadioItem>
|
|
50
|
+
<ContextMenuRadioItem value="dark">Dark</ContextMenuRadioItem>
|
|
51
|
+
<ContextMenuRadioItem value="system">System</ContextMenuRadioItem>
|
|
52
|
+
</ContextMenuRadioGroup>
|
|
53
|
+
```
|
|
54
|
+
### Example 2
|
|
55
|
+
```tsx
|
|
56
|
+
// With label and separator
|
|
57
|
+
<ContextMenuContent>
|
|
58
|
+
<ContextMenuLabel>Theme Selection</ContextMenuLabel>
|
|
59
|
+
<ContextMenuSeparator />
|
|
60
|
+
<ContextMenuRadioGroup value={currentTheme} onValueChange={handleThemeChange}>
|
|
61
|
+
<ContextMenuRadioItem value="light">Light Mode</ContextMenuRadioItem>
|
|
62
|
+
<ContextMenuRadioItem value="dark">Dark Mode</ContextMenuRadioItem>
|
|
63
|
+
<ContextMenuRadioItem value="auto">Auto</ContextMenuRadioItem>
|
|
64
|
+
</ContextMenuRadioGroup>
|
|
65
|
+
</ContextMenuContent>
|
|
66
|
+
```
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# ContextMenuRadioItem
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuRadioItem - A radio button item within a radio group Menu items that allow single selection from a group of options. Must be used within a ContextMenuRadioGroup for proper functionality. Displays a filled circle indicator when selected.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuRadioItem } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuRadioItem
|
|
13
|
+
value="value"
|
|
14
|
+
disabled={true}
|
|
15
|
+
onSelect={handleSelect}
|
|
16
|
+
textValue="value"
|
|
17
|
+
className="value"
|
|
18
|
+
>
|
|
19
|
+
{/* Your content here */}
|
|
20
|
+
</ContextMenuRadioItem>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Component Props
|
|
24
|
+
|
|
25
|
+
### value
|
|
26
|
+
- **Type**: `string`
|
|
27
|
+
- **Required**: Yes
|
|
28
|
+
- **Description**: The unique value for this radio item (required)
|
|
29
|
+
|
|
30
|
+
### disabled
|
|
31
|
+
- **Type**: `boolean`
|
|
32
|
+
- **Required**: No
|
|
33
|
+
- **Description**: Whether the item is disabled and non-interactive
|
|
34
|
+
|
|
35
|
+
### onSelect
|
|
36
|
+
- **Type**: `(event: Event) => void`
|
|
37
|
+
- **Required**: No
|
|
38
|
+
- **Description**: Callback fired when the item is selected (before parent's onValueChange)
|
|
39
|
+
|
|
40
|
+
### textValue
|
|
41
|
+
- **Type**: `string`
|
|
42
|
+
- **Required**: No
|
|
43
|
+
- **Description**: Custom text for typeahead navigation
|
|
44
|
+
|
|
45
|
+
### className
|
|
46
|
+
- **Type**: `string`
|
|
47
|
+
- **Required**: No
|
|
48
|
+
- **Description**: Additional CSS classes for styling
|
|
49
|
+
|
|
50
|
+
### children
|
|
51
|
+
- **Type**: `React.ReactNode`
|
|
52
|
+
- **Required**: Yes
|
|
53
|
+
- **Description**: Content of the radio item (typically text)
|
|
54
|
+
|
|
55
|
+
## Examples
|
|
56
|
+
|
|
57
|
+
### Example 1
|
|
58
|
+
```tsx
|
|
59
|
+
<ContextMenuRadioGroup value={theme} onValueChange={setTheme}>
|
|
60
|
+
<ContextMenuRadioItem value="light">Light Theme</ContextMenuRadioItem>
|
|
61
|
+
<ContextMenuRadioItem value="dark">Dark Theme</ContextMenuRadioItem>
|
|
62
|
+
<ContextMenuRadioItem value="system">System Theme</ContextMenuRadioItem>
|
|
63
|
+
</ContextMenuRadioGroup>
|
|
64
|
+
```
|
|
65
|
+
### Example 2
|
|
66
|
+
```tsx
|
|
67
|
+
// With disabled state and custom text
|
|
68
|
+
<ContextMenuRadioGroup value={quality} onValueChange={setQuality}>
|
|
69
|
+
<ContextMenuRadioItem value="low">Low Quality</ContextMenuRadioItem>
|
|
70
|
+
<ContextMenuRadioItem value="medium">Medium Quality</ContextMenuRadioItem>
|
|
71
|
+
<ContextMenuRadioItem value="high">High Quality</ContextMenuRadioItem>
|
|
72
|
+
<ContextMenuRadioItem value="ultra" disabled>
|
|
73
|
+
Ultra Quality (Premium)
|
|
74
|
+
</ContextMenuRadioItem>
|
|
75
|
+
</ContextMenuRadioGroup>
|
|
76
|
+
```
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# ContextMenuSeparator
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuSeparator - A visual divider between menu items Creates visual separation between groups of related menu items. Typically used after labels or to separate different types of actions. Improves visual hierarchy and content organization in menus.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuSeparator } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuSeparator
|
|
13
|
+
asChild={true}
|
|
14
|
+
className="value"
|
|
15
|
+
/>
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Component Props
|
|
19
|
+
|
|
20
|
+
### asChild
|
|
21
|
+
- **Type**: `boolean`
|
|
22
|
+
- **Required**: No
|
|
23
|
+
- **Description**: Merges props with child element instead of rendering wrapper
|
|
24
|
+
|
|
25
|
+
### className
|
|
26
|
+
- **Type**: `string`
|
|
27
|
+
- **Required**: No
|
|
28
|
+
- **Description**: Additional CSS classes for styling
|
|
29
|
+
|
|
30
|
+
## Examples
|
|
31
|
+
|
|
32
|
+
### Example 1
|
|
33
|
+
```tsx
|
|
34
|
+
<ContextMenuItem>Copy</ContextMenuItem>
|
|
35
|
+
<ContextMenuItem>Paste</ContextMenuItem>
|
|
36
|
+
<ContextMenuSeparator />
|
|
37
|
+
<ContextMenuItem variant="destructive">Delete</ContextMenuItem>
|
|
38
|
+
```
|
|
39
|
+
### Example 2
|
|
40
|
+
```tsx
|
|
41
|
+
// Organizing menu sections
|
|
42
|
+
<ContextMenuContent>
|
|
43
|
+
<ContextMenuLabel>Edit</ContextMenuLabel>
|
|
44
|
+
<ContextMenuItem>Copy</ContextMenuItem>
|
|
45
|
+
<ContextMenuItem>Paste</ContextMenuItem>
|
|
46
|
+
<ContextMenuSeparator />
|
|
47
|
+
<ContextMenuLabel>View</ContextMenuLabel>
|
|
48
|
+
<ContextMenuItem>Zoom In</ContextMenuItem>
|
|
49
|
+
<ContextMenuItem>Zoom Out</ContextMenuItem>
|
|
50
|
+
</ContextMenuContent>
|
|
51
|
+
```
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# ContextMenuShortcut
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuShortcut - Displays keyboard shortcuts within menu items Shows keyboard shortcuts aligned to the right side of menu items. Provides visual indication of available keyboard shortcuts for actions. Improves discoverability of keyboard navigation options.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuShortcut } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuShortcut
|
|
13
|
+
className="value"
|
|
14
|
+
>
|
|
15
|
+
{/* Your content here */}
|
|
16
|
+
</ContextMenuShortcut>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Component Props
|
|
20
|
+
|
|
21
|
+
### className
|
|
22
|
+
- **Type**: `string`
|
|
23
|
+
- **Required**: No
|
|
24
|
+
- **Description**: Additional CSS classes for styling
|
|
25
|
+
|
|
26
|
+
### children
|
|
27
|
+
- **Type**: `React.ReactNode`
|
|
28
|
+
- **Required**: Yes
|
|
29
|
+
- **Description**: The keyboard shortcut text to display (e.g., "⌘C", "Ctrl+V")
|
|
30
|
+
|
|
31
|
+
## Examples
|
|
32
|
+
|
|
33
|
+
### Example 1
|
|
34
|
+
```tsx
|
|
35
|
+
<ContextMenuItem>
|
|
36
|
+
Copy
|
|
37
|
+
<ContextMenuShortcut>⌘C</ContextMenuShortcut>
|
|
38
|
+
</ContextMenuItem>
|
|
39
|
+
```
|
|
40
|
+
### Example 2
|
|
41
|
+
```tsx
|
|
42
|
+
// Multiple shortcuts for different platforms
|
|
43
|
+
<ContextMenuItem>
|
|
44
|
+
Save
|
|
45
|
+
<ContextMenuShortcut>
|
|
46
|
+
{isMac ? '⌘S' : 'Ctrl+S'}
|
|
47
|
+
</ContextMenuShortcut>
|
|
48
|
+
</ContextMenuItem>
|
|
49
|
+
```
|
|
50
|
+
### Example 3
|
|
51
|
+
```tsx
|
|
52
|
+
// Complex shortcuts
|
|
53
|
+
<ContextMenuItem>
|
|
54
|
+
Find and Replace
|
|
55
|
+
<ContextMenuShortcut>⌘⌥F</ContextMenuShortcut>
|
|
56
|
+
</ContextMenuItem>
|
|
57
|
+
```
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# ContextMenuSubContent
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuSubContent - Container for sub-menu items Contains the items within a sub-menu. Automatically positioned relative to its trigger with collision detection and smooth animations. Supports all the same features as main menu content including keyboard navigation.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuSubContent } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuSubContent
|
|
13
|
+
asChild={true}
|
|
14
|
+
loop={true}
|
|
15
|
+
onCloseAutoFocus={handleCloseAutoFocus}
|
|
16
|
+
onEscapeKeyDown={handleEscapeKeyDown}
|
|
17
|
+
avoidCollisions={true}
|
|
18
|
+
sideOffset={0}
|
|
19
|
+
className="value"
|
|
20
|
+
>
|
|
21
|
+
{/* Your content here */}
|
|
22
|
+
</ContextMenuSubContent>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Component Props
|
|
26
|
+
|
|
27
|
+
### asChild
|
|
28
|
+
- **Type**: `boolean`
|
|
29
|
+
- **Required**: No
|
|
30
|
+
- **Description**: Merges props with child element instead of rendering wrapper
|
|
31
|
+
|
|
32
|
+
### loop
|
|
33
|
+
- **Type**: `boolean`
|
|
34
|
+
- **Required**: No
|
|
35
|
+
- **Description**: Enable keyboard navigation looping from last to first item
|
|
36
|
+
|
|
37
|
+
### onCloseAutoFocus
|
|
38
|
+
- **Type**: `(event: Event) => void`
|
|
39
|
+
- **Required**: No
|
|
40
|
+
- **Description**: Handle focus return when sub-menu closes
|
|
41
|
+
|
|
42
|
+
### onEscapeKeyDown
|
|
43
|
+
- **Type**: `(event: KeyboardEvent) => void`
|
|
44
|
+
- **Required**: No
|
|
45
|
+
- **Description**: Handle escape key presses
|
|
46
|
+
|
|
47
|
+
### avoidCollisions
|
|
48
|
+
- **Type**: `boolean`
|
|
49
|
+
- **Required**: No
|
|
50
|
+
- **Description**: Prevent collisions with viewport boundaries
|
|
51
|
+
|
|
52
|
+
### sideOffset
|
|
53
|
+
- **Type**: `number`
|
|
54
|
+
- **Required**: No
|
|
55
|
+
- **Description**: Distance in pixels from the trigger anchor
|
|
56
|
+
|
|
57
|
+
### className
|
|
58
|
+
- **Type**: `string`
|
|
59
|
+
- **Required**: No
|
|
60
|
+
- **Description**: Additional CSS classes for styling
|
|
61
|
+
|
|
62
|
+
### children
|
|
63
|
+
- **Type**: `React.ReactNode`
|
|
64
|
+
- **Required**: Yes
|
|
65
|
+
- **Description**: Sub-menu items, separators, and labels
|
|
66
|
+
|
|
67
|
+
## Examples
|
|
68
|
+
|
|
69
|
+
### Example 1
|
|
70
|
+
```tsx
|
|
71
|
+
<ContextMenuSubContent>
|
|
72
|
+
<ContextMenuItem>Option 1</ContextMenuItem>
|
|
73
|
+
<ContextMenuItem>Option 2</ContextMenuItem>
|
|
74
|
+
<ContextMenuSeparator />
|
|
75
|
+
<ContextMenuItem>Option 3</ContextMenuItem>
|
|
76
|
+
</ContextMenuSubContent>
|
|
77
|
+
```
|
|
78
|
+
### Example 2
|
|
79
|
+
```tsx
|
|
80
|
+
// With portal and collision avoidance
|
|
81
|
+
<ContextMenuSubContent
|
|
82
|
+
avoidCollisions={true}
|
|
83
|
+
sideOffset={8}
|
|
84
|
+
className="min-w-[200px]"
|
|
85
|
+
>
|
|
86
|
+
<ContextMenuLabel>Sub Options</ContextMenuLabel>
|
|
87
|
+
<ContextMenuItem>Action A</ContextMenuItem>
|
|
88
|
+
<ContextMenuItem>Action B</ContextMenuItem>
|
|
89
|
+
</ContextMenuSubContent>
|
|
90
|
+
```
|