@neynar/ui 0.3.0 → 0.3.1
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/a.llm.md +131 -0
- 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 +117 -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/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 +103 -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/h1.llm.md +108 -0
- package/.llm/h2.llm.md +108 -0
- package/.llm/h3.llm.md +106 -0
- package/.llm/h4.llm.md +104 -0
- package/.llm/h5.llm.md +105 -0
- package/.llm/h6.llm.md +105 -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/lead.llm.md +114 -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/p.llm.md +110 -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 +3022 -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/small.llm.md +110 -0
- package/.llm/span.llm.md +118 -0
- package/.llm/spinner.llm.md +182 -0
- package/.llm/stack.llm.md +28 -0
- package/.llm/strong.llm.md +110 -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/toast.llm.md +32 -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/typography.llm.md +161 -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/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/index.js +4972 -9636
- 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/theme-toggle.tsx +1 -3
- package/src/components/ui/theme.tsx +6 -1
- package/src/styles/globals.css +57 -85
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# Container
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
Container - A responsive layout wrapper with flexible width constraints and consistent padding A fundamental layout component built with class-variance-authority (CVA) that provides consistent horizontal centering, responsive padding, and flexible max-width constraints. Designed to be the primary content wrapper for pages, sections, and layout regions throughout the application. The component automatically applies responsive horizontal padding (px-4 on mobile, px-6 on small screens, px-8 on large screens) and centers content using mx-auto. Five size variants accommodate different content types from optimal reading widths to full-width layouts. Built following shadcn/ui and Tailwind UI patterns for maximum compatibility and consistency with modern React applications and design systems.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { Container } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<Container
|
|
13
|
+
size={value}
|
|
14
|
+
className="value"
|
|
15
|
+
id="value"
|
|
16
|
+
role="value"
|
|
17
|
+
"aria-label"="value"
|
|
18
|
+
"aria-labelledby"="value"
|
|
19
|
+
"aria-describedby"="value"
|
|
20
|
+
"aria-live"={value}
|
|
21
|
+
tabIndex={0}
|
|
22
|
+
onClick={handleClick}
|
|
23
|
+
onFocus={handleFocus}
|
|
24
|
+
onBlur={handleBlur}
|
|
25
|
+
onKeyDown={handleKeyDown}
|
|
26
|
+
onMouseEnter={handleMouseEnter}
|
|
27
|
+
onMouseLeave={handleMouseLeave}
|
|
28
|
+
>
|
|
29
|
+
{/* Your content here */}
|
|
30
|
+
</Container>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Component Props
|
|
34
|
+
|
|
35
|
+
### size
|
|
36
|
+
- **Type**: `"sm" | "md" | "lg" | "xl" | "full"`
|
|
37
|
+
- **Required**: No
|
|
38
|
+
- **Description**: No description available
|
|
39
|
+
|
|
40
|
+
### children
|
|
41
|
+
- **Type**: `React.ReactNode`
|
|
42
|
+
- **Required**: No
|
|
43
|
+
- **Description**: No description available
|
|
44
|
+
|
|
45
|
+
### className
|
|
46
|
+
- **Type**: `string`
|
|
47
|
+
- **Required**: No
|
|
48
|
+
- **Description**: No description available
|
|
49
|
+
|
|
50
|
+
### id
|
|
51
|
+
- **Type**: `string`
|
|
52
|
+
- **Required**: No
|
|
53
|
+
- **Description**: No description available
|
|
54
|
+
|
|
55
|
+
### role
|
|
56
|
+
- **Type**: `string`
|
|
57
|
+
- **Required**: No
|
|
58
|
+
- **Description**: No description available
|
|
59
|
+
|
|
60
|
+
### "aria-label"
|
|
61
|
+
- **Type**: `string`
|
|
62
|
+
- **Required**: No
|
|
63
|
+
- **Description**: No description available
|
|
64
|
+
|
|
65
|
+
### "aria-labelledby"
|
|
66
|
+
- **Type**: `string`
|
|
67
|
+
- **Required**: No
|
|
68
|
+
- **Description**: No description available
|
|
69
|
+
|
|
70
|
+
### "aria-describedby"
|
|
71
|
+
- **Type**: `string`
|
|
72
|
+
- **Required**: No
|
|
73
|
+
- **Description**: No description available
|
|
74
|
+
|
|
75
|
+
### "aria-live"
|
|
76
|
+
- **Type**: `"off" | "polite" | "assertive"`
|
|
77
|
+
- **Required**: No
|
|
78
|
+
- **Description**: No description available
|
|
79
|
+
|
|
80
|
+
### tabIndex
|
|
81
|
+
- **Type**: `number`
|
|
82
|
+
- **Required**: No
|
|
83
|
+
- **Description**: No description available
|
|
84
|
+
|
|
85
|
+
### onClick
|
|
86
|
+
- **Type**: `React.MouseEventHandler<HTMLDivElement>`
|
|
87
|
+
- **Required**: No
|
|
88
|
+
- **Description**: No description available
|
|
89
|
+
|
|
90
|
+
### onFocus
|
|
91
|
+
- **Type**: `React.FocusEventHandler<HTMLDivElement>`
|
|
92
|
+
- **Required**: No
|
|
93
|
+
- **Description**: No description available
|
|
94
|
+
|
|
95
|
+
### onBlur
|
|
96
|
+
- **Type**: `React.FocusEventHandler<HTMLDivElement>`
|
|
97
|
+
- **Required**: No
|
|
98
|
+
- **Description**: No description available
|
|
99
|
+
|
|
100
|
+
### onKeyDown
|
|
101
|
+
- **Type**: `React.KeyboardEventHandler<HTMLDivElement>`
|
|
102
|
+
- **Required**: No
|
|
103
|
+
- **Description**: No description available
|
|
104
|
+
|
|
105
|
+
### onMouseEnter
|
|
106
|
+
- **Type**: `React.MouseEventHandler<HTMLDivElement>`
|
|
107
|
+
- **Required**: No
|
|
108
|
+
- **Description**: No description available
|
|
109
|
+
|
|
110
|
+
### onMouseLeave
|
|
111
|
+
- **Type**: `React.MouseEventHandler<HTMLDivElement>`
|
|
112
|
+
- **Required**: No
|
|
113
|
+
- **Description**: No description available
|
|
114
|
+
|
|
115
|
+
## Examples
|
|
116
|
+
|
|
117
|
+
### Example 1
|
|
118
|
+
```tsx
|
|
119
|
+
// Basic usage with default large size (80rem max-width)
|
|
120
|
+
<Container>
|
|
121
|
+
<h1>Dashboard Overview</h1>
|
|
122
|
+
<p>Main application content with balanced width constraints</p>
|
|
123
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
|
|
124
|
+
<Card>Dashboard Widget</Card>
|
|
125
|
+
<Card>Analytics Panel</Card>
|
|
126
|
+
<Card>Recent Activity</Card>
|
|
127
|
+
</div>
|
|
128
|
+
</Container>
|
|
129
|
+
```
|
|
130
|
+
### Example 2
|
|
131
|
+
```tsx
|
|
132
|
+
// Reading-optimized container for articles and blog posts
|
|
133
|
+
<Container size="sm">
|
|
134
|
+
<article className="prose prose-lg max-w-none">
|
|
135
|
+
<h1>The Future of Web Development</h1>
|
|
136
|
+
<p>
|
|
137
|
+
Long-form content with line lengths optimized for readability
|
|
138
|
+
and comfortable reading experience across all device sizes.
|
|
139
|
+
</p>
|
|
140
|
+
<p>
|
|
141
|
+
The small container (48rem) provides the ideal measure for
|
|
142
|
+
typography-focused content and sustained reading.
|
|
143
|
+
</p>
|
|
144
|
+
</article>
|
|
145
|
+
</Container>
|
|
146
|
+
```
|
|
147
|
+
### Example 3
|
|
148
|
+
```tsx
|
|
149
|
+
// Medium container for forms and structured layouts
|
|
150
|
+
<Container size="md">
|
|
151
|
+
<div className="space-y-8">
|
|
152
|
+
<div className="text-center">
|
|
153
|
+
<h2>Account Settings</h2>
|
|
154
|
+
<p>Manage your account preferences and profile information</p>
|
|
155
|
+
</div>
|
|
156
|
+
<form className="space-y-6">
|
|
157
|
+
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
|
|
158
|
+
<Input label="First Name" />
|
|
159
|
+
<Input label="Last Name" />
|
|
160
|
+
</div>
|
|
161
|
+
<Input label="Email Address" type="email" />
|
|
162
|
+
<Button type="submit" className="w-full">Update Profile</Button>
|
|
163
|
+
</form>
|
|
164
|
+
</div>
|
|
165
|
+
</Container>
|
|
166
|
+
```
|
|
167
|
+
### Example 4
|
|
168
|
+
```tsx
|
|
169
|
+
// Full-width container for complex layouts and hero sections
|
|
170
|
+
<Container size="full">
|
|
171
|
+
<div className="bg-gradient-to-r from-blue-600 to-purple-600 text-white py-20">
|
|
172
|
+
<div className="text-center space-y-6">
|
|
173
|
+
<h1 className="text-4xl md:text-6xl font-bold">
|
|
174
|
+
Welcome to Our Platform
|
|
175
|
+
</h1>
|
|
176
|
+
<p className="text-xl md:text-2xl opacity-90 max-w-3xl mx-auto">
|
|
177
|
+
Edge-to-edge hero section with full viewport width
|
|
178
|
+
</p>
|
|
179
|
+
<Button size="lg" variant="secondary">
|
|
180
|
+
Get Started
|
|
181
|
+
</Button>
|
|
182
|
+
</div>
|
|
183
|
+
</div>
|
|
184
|
+
</Container>
|
|
185
|
+
```
|
|
186
|
+
### Example 5
|
|
187
|
+
```tsx
|
|
188
|
+
// Extra-large container for data-heavy interfaces
|
|
189
|
+
<Container size="xl" className="py-8">
|
|
190
|
+
<div className="space-y-6">
|
|
191
|
+
<div className="flex justify-between items-center">
|
|
192
|
+
<h1 className="text-3xl font-bold">Analytics Dashboard</h1>
|
|
193
|
+
<Button variant="outline">Export Data</Button>
|
|
194
|
+
</div>
|
|
195
|
+
// Wide data table that needs maximum available width
|
|
196
|
+
<DataTable
|
|
197
|
+
columns={analyticsColumns}
|
|
198
|
+
data={analyticsData}
|
|
199
|
+
className="min-w-[1200px]"
|
|
200
|
+
/>
|
|
201
|
+
<div className="grid grid-cols-1 lg:grid-cols-4 gap-6">
|
|
202
|
+
<MetricCard />
|
|
203
|
+
<MetricCard />
|
|
204
|
+
<MetricCard />
|
|
205
|
+
<MetricCard />
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
</Container>
|
|
209
|
+
```
|
|
210
|
+
### Example 6
|
|
211
|
+
```tsx
|
|
212
|
+
// Advanced usage with custom styling and ARIA landmarks
|
|
213
|
+
<Container
|
|
214
|
+
size="lg"
|
|
215
|
+
className="min-h-screen py-12 bg-gray-50 dark:bg-gray-900"
|
|
216
|
+
role="main"
|
|
217
|
+
aria-label="Application content"
|
|
218
|
+
>
|
|
219
|
+
<div className="space-y-10">
|
|
220
|
+
<header className="text-center space-y-4">
|
|
221
|
+
<Badge variant="secondary">New Feature</Badge>
|
|
222
|
+
<h1 className="text-4xl font-bold tracking-tight">
|
|
223
|
+
Product Announcement
|
|
224
|
+
</h1>
|
|
225
|
+
<p className="text-lg text-muted-foreground max-w-2xl mx-auto">
|
|
226
|
+
Discover the latest improvements to our platform
|
|
227
|
+
</p>
|
|
228
|
+
</header>
|
|
229
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
|
|
230
|
+
<FeatureCard />
|
|
231
|
+
<FeatureCard />
|
|
232
|
+
<FeatureCard />
|
|
233
|
+
</div>
|
|
234
|
+
</div>
|
|
235
|
+
</Container>
|
|
236
|
+
```
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# ContextMenuCheckboxItem
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuCheckboxItem - A menu item with checkbox functionality Menu items that can be toggled on/off, useful for binary settings or options. Displays a check mark when selected and supports controlled state management with indeterminate state for partially selected collections.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuCheckboxItem } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuCheckboxItem
|
|
13
|
+
asChild={true}
|
|
14
|
+
checked={value}
|
|
15
|
+
onCheckedChange={handleCheckedChange}
|
|
16
|
+
disabled={true}
|
|
17
|
+
onSelect={handleSelect}
|
|
18
|
+
textValue="value"
|
|
19
|
+
className="value"
|
|
20
|
+
>
|
|
21
|
+
{/* Your content here */}
|
|
22
|
+
</ContextMenuCheckboxItem>
|
|
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
|
+
### checked
|
|
33
|
+
- **Type**: `boolean | "indeterminate"`
|
|
34
|
+
- **Required**: No
|
|
35
|
+
- **Description**: The checked state (true, false, or "indeterminate")
|
|
36
|
+
|
|
37
|
+
### onCheckedChange
|
|
38
|
+
- **Type**: `(checked: boolean) => void`
|
|
39
|
+
- **Required**: No
|
|
40
|
+
- **Description**: Callback fired when the checked state changes
|
|
41
|
+
|
|
42
|
+
### disabled
|
|
43
|
+
- **Type**: `boolean`
|
|
44
|
+
- **Required**: No
|
|
45
|
+
- **Description**: Whether the item is disabled and non-interactive
|
|
46
|
+
|
|
47
|
+
### onSelect
|
|
48
|
+
- **Type**: `(event: Event) => void`
|
|
49
|
+
- **Required**: No
|
|
50
|
+
- **Description**: Callback fired when the item is selected (before onCheckedChange)
|
|
51
|
+
|
|
52
|
+
### textValue
|
|
53
|
+
- **Type**: `string`
|
|
54
|
+
- **Required**: No
|
|
55
|
+
- **Description**: Custom text for typeahead navigation
|
|
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**: Content of the checkbox item (typically text)
|
|
66
|
+
|
|
67
|
+
## Examples
|
|
68
|
+
|
|
69
|
+
### Example 1
|
|
70
|
+
```tsx
|
|
71
|
+
const [showGrid, setShowGrid] = useState(true)
|
|
72
|
+
<ContextMenuCheckboxItem
|
|
73
|
+
checked={showGrid}
|
|
74
|
+
onCheckedChange={setShowGrid}
|
|
75
|
+
>
|
|
76
|
+
Show Grid
|
|
77
|
+
</ContextMenuCheckboxItem>
|
|
78
|
+
```
|
|
79
|
+
### Example 2
|
|
80
|
+
```tsx
|
|
81
|
+
// With indeterminate state
|
|
82
|
+
const [selectedItems, setSelectedItems] = useState(['item1'])
|
|
83
|
+
const allItems = ['item1', 'item2', 'item3']
|
|
84
|
+
const checkedState = selectedItems.length === 0
|
|
85
|
+
? false
|
|
86
|
+
: selectedItems.length === allItems.length
|
|
87
|
+
? true
|
|
88
|
+
: "indeterminate"
|
|
89
|
+
<ContextMenuCheckboxItem
|
|
90
|
+
checked={checkedState}
|
|
91
|
+
onCheckedChange={(checked) =>
|
|
92
|
+
setSelectedItems(checked ? allItems : [])
|
|
93
|
+
}
|
|
94
|
+
>
|
|
95
|
+
Select All
|
|
96
|
+
</ContextMenuCheckboxItem>
|
|
97
|
+
```
|
|
@@ -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
|
+
```
|