@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,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
|
+
```
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# ContextMenuSubTrigger
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuSubTrigger - Trigger element for opening sub-menus Menu item that opens a sub-menu on hover or focus. Automatically includes a chevron icon to indicate the presence of a sub-menu. Supports the same interaction patterns as regular menu items with additional sub-menu behavior.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuSubTrigger } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuSubTrigger
|
|
13
|
+
asChild={true}
|
|
14
|
+
disabled={true}
|
|
15
|
+
textValue="value"
|
|
16
|
+
inset={true}
|
|
17
|
+
className="value"
|
|
18
|
+
>
|
|
19
|
+
{/* Your content here */}
|
|
20
|
+
</ContextMenuSubTrigger>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Component Props
|
|
24
|
+
|
|
25
|
+
### asChild
|
|
26
|
+
- **Type**: `boolean`
|
|
27
|
+
- **Required**: No
|
|
28
|
+
- **Description**: Merges props with child element instead of rendering wrapper
|
|
29
|
+
|
|
30
|
+
### disabled
|
|
31
|
+
- **Type**: `boolean`
|
|
32
|
+
- **Required**: No
|
|
33
|
+
- **Description**: Prevents interaction and sub-menu opening
|
|
34
|
+
|
|
35
|
+
### textValue
|
|
36
|
+
- **Type**: `string`
|
|
37
|
+
- **Required**: No
|
|
38
|
+
- **Description**: Custom text for typeahead navigation
|
|
39
|
+
|
|
40
|
+
### inset
|
|
41
|
+
- **Type**: `boolean`
|
|
42
|
+
- **Required**: No
|
|
43
|
+
- **Description**: Whether to indent the trigger for proper visual alignment
|
|
44
|
+
|
|
45
|
+
### className
|
|
46
|
+
- **Type**: `string`
|
|
47
|
+
- **Required**: No
|
|
48
|
+
- **Description**: No description available
|
|
49
|
+
|
|
50
|
+
### children
|
|
51
|
+
- **Type**: `React.ReactNode`
|
|
52
|
+
- **Required**: Yes
|
|
53
|
+
- **Description**: Content of the trigger (text, icons, etc.)
|
|
54
|
+
|
|
55
|
+
## Examples
|
|
56
|
+
|
|
57
|
+
### Example 1
|
|
58
|
+
```tsx
|
|
59
|
+
<ContextMenuSubTrigger>
|
|
60
|
+
<Share className="mr-2 h-4 w-4" />
|
|
61
|
+
Share Options
|
|
62
|
+
</ContextMenuSubTrigger>
|
|
63
|
+
```
|
|
64
|
+
### Example 2
|
|
65
|
+
```tsx
|
|
66
|
+
// With inset alignment for icon consistency
|
|
67
|
+
<ContextMenuContent>
|
|
68
|
+
<ContextMenuItem inset>Regular Item</ContextMenuItem>
|
|
69
|
+
<ContextMenuSubTrigger inset>
|
|
70
|
+
More Actions
|
|
71
|
+
</ContextMenuSubTrigger>
|
|
72
|
+
</ContextMenuContent>
|
|
73
|
+
```
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# ContextMenuSub
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuSub - Container for sub-menu functionality Wraps a sub-menu trigger and its content to create nested menu structures. Enables hierarchical organization of menu items with proper state management for opening and closing sub-menus.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuSub } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuSub
|
|
13
|
+
open={true}
|
|
14
|
+
onOpenChange={handleOpenChange}
|
|
15
|
+
>
|
|
16
|
+
{/* Your content here */}
|
|
17
|
+
</ContextMenuSub>
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Component Props
|
|
21
|
+
|
|
22
|
+
### open
|
|
23
|
+
- **Type**: `boolean`
|
|
24
|
+
- **Required**: No
|
|
25
|
+
- **Description**: Controlled open state of the sub-menu
|
|
26
|
+
|
|
27
|
+
### onOpenChange
|
|
28
|
+
- **Type**: `(open: boolean) => void`
|
|
29
|
+
- **Required**: No
|
|
30
|
+
- **Description**: Callback fired when sub-menu open state changes
|
|
31
|
+
|
|
32
|
+
### children
|
|
33
|
+
- **Type**: `React.ReactNode`
|
|
34
|
+
- **Required**: Yes
|
|
35
|
+
- **Description**: Sub-menu trigger and content components
|
|
36
|
+
|
|
37
|
+
## Examples
|
|
38
|
+
|
|
39
|
+
### Example 1
|
|
40
|
+
```tsx
|
|
41
|
+
<ContextMenuSub>
|
|
42
|
+
<ContextMenuSubTrigger>Share</ContextMenuSubTrigger>
|
|
43
|
+
<ContextMenuSubContent>
|
|
44
|
+
<ContextMenuItem>Email</ContextMenuItem>
|
|
45
|
+
<ContextMenuItem>Copy Link</ContextMenuItem>
|
|
46
|
+
</ContextMenuSubContent>
|
|
47
|
+
</ContextMenuSub>
|
|
48
|
+
```
|
|
49
|
+
### Example 2
|
|
50
|
+
```tsx
|
|
51
|
+
// Controlled sub-menu
|
|
52
|
+
const [subOpen, setSubOpen] = useState(false)
|
|
53
|
+
<ContextMenuSub open={subOpen} onOpenChange={setSubOpen}>
|
|
54
|
+
<ContextMenuSubTrigger>More Actions</ContextMenuSubTrigger>
|
|
55
|
+
<ContextMenuSubContent>
|
|
56
|
+
<ContextMenuItem onClick={() => setSubOpen(false)}>
|
|
57
|
+
Archive
|
|
58
|
+
</ContextMenuItem>
|
|
59
|
+
</ContextMenuSubContent>
|
|
60
|
+
</ContextMenuSub>
|
|
61
|
+
```
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# ContextMenuTrigger
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenuTrigger - The element that triggers the context menu Wraps any element to make it respond to right-click or long-press events. The trigger element should provide visual feedback about its interactive nature. Uses the `asChild` pattern to merge props with child elements for composition.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenuTrigger } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenuTrigger
|
|
13
|
+
asChild={true}
|
|
14
|
+
disabled={true}
|
|
15
|
+
>
|
|
16
|
+
{/* Your content here */}
|
|
17
|
+
</ContextMenuTrigger>
|
|
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
|
+
### disabled
|
|
28
|
+
- **Type**: `boolean`
|
|
29
|
+
- **Required**: No
|
|
30
|
+
- **Description**: Prevents context menu from opening when trigger is activated
|
|
31
|
+
|
|
32
|
+
### children
|
|
33
|
+
- **Type**: `React.ReactNode`
|
|
34
|
+
- **Required**: Yes
|
|
35
|
+
- **Description**: The element that should respond to right-click events
|
|
36
|
+
|
|
37
|
+
## Examples
|
|
38
|
+
|
|
39
|
+
### Example 1
|
|
40
|
+
```tsx
|
|
41
|
+
<ContextMenuTrigger>
|
|
42
|
+
<Button variant="outline">Right-click me</Button>
|
|
43
|
+
</ContextMenuTrigger>
|
|
44
|
+
```
|
|
45
|
+
### Example 2
|
|
46
|
+
```tsx
|
|
47
|
+
// With asChild for direct prop merging
|
|
48
|
+
<ContextMenuTrigger asChild>
|
|
49
|
+
<div className="p-4 border rounded cursor-pointer">
|
|
50
|
+
Right-click target area
|
|
51
|
+
</div>
|
|
52
|
+
</ContextMenuTrigger>
|
|
53
|
+
```
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
# ContextMenu
|
|
2
|
+
|
|
3
|
+
**Type**: component
|
|
4
|
+
|
|
5
|
+
ContextMenu - A contextual menu that appears on right-click or long-press Context menus provide contextual actions for specific elements or areas. Built on Radix UI primitives, they appear when users right-click (or long-press on touch devices) and offer actions relevant to the clicked item or region.
|
|
6
|
+
|
|
7
|
+
## JSX Usage
|
|
8
|
+
|
|
9
|
+
```jsx
|
|
10
|
+
import { ContextMenu } from '@neynar/ui';
|
|
11
|
+
|
|
12
|
+
<ContextMenu
|
|
13
|
+
dir={value}
|
|
14
|
+
onOpenChange={handleOpenChange}
|
|
15
|
+
modal={true}
|
|
16
|
+
>
|
|
17
|
+
{/* Your content here */}
|
|
18
|
+
</ContextMenu>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Component Props
|
|
22
|
+
|
|
23
|
+
### dir
|
|
24
|
+
- **Type**: `"ltr" | "rtl"`
|
|
25
|
+
- **Required**: No
|
|
26
|
+
- **Description**: No description available
|
|
27
|
+
|
|
28
|
+
### onOpenChange
|
|
29
|
+
- **Type**: `(open: boolean) => void`
|
|
30
|
+
- **Required**: No
|
|
31
|
+
- **Description**: No description available
|
|
32
|
+
|
|
33
|
+
### modal
|
|
34
|
+
- **Type**: `boolean`
|
|
35
|
+
- **Required**: No
|
|
36
|
+
- **Description**: No description available
|
|
37
|
+
|
|
38
|
+
### children
|
|
39
|
+
- **Type**: `React.ReactNode`
|
|
40
|
+
- **Required**: No
|
|
41
|
+
- **Description**: No description available
|
|
42
|
+
|
|
43
|
+
## Examples
|
|
44
|
+
|
|
45
|
+
### Example 1
|
|
46
|
+
```tsx
|
|
47
|
+
// Basic context menu with items
|
|
48
|
+
<ContextMenu>
|
|
49
|
+
<ContextMenuTrigger>
|
|
50
|
+
<div className="border rounded p-4">
|
|
51
|
+
Right-click here
|
|
52
|
+
</div>
|
|
53
|
+
</ContextMenuTrigger>
|
|
54
|
+
<ContextMenuContent>
|
|
55
|
+
<ContextMenuItem>Copy</ContextMenuItem>
|
|
56
|
+
<ContextMenuItem>Paste</ContextMenuItem>
|
|
57
|
+
<ContextMenuSeparator />
|
|
58
|
+
<ContextMenuItem variant="destructive">Delete</ContextMenuItem>
|
|
59
|
+
</ContextMenuContent>
|
|
60
|
+
</ContextMenu>
|
|
61
|
+
```
|
|
62
|
+
### Example 2
|
|
63
|
+
```tsx
|
|
64
|
+
// With sub-menus and shortcuts
|
|
65
|
+
<ContextMenu>
|
|
66
|
+
<ContextMenuTrigger>Right-click me</ContextMenuTrigger>
|
|
67
|
+
<ContextMenuContent>
|
|
68
|
+
<ContextMenuItem>
|
|
69
|
+
Edit <ContextMenuShortcut>⌘E</ContextMenuShortcut>
|
|
70
|
+
</ContextMenuItem>
|
|
71
|
+
<ContextMenuSub>
|
|
72
|
+
<ContextMenuSubTrigger>Share</ContextMenuSubTrigger>
|
|
73
|
+
<ContextMenuSubContent>
|
|
74
|
+
<ContextMenuItem>Email</ContextMenuItem>
|
|
75
|
+
<ContextMenuItem>Copy Link</ContextMenuItem>
|
|
76
|
+
</ContextMenuSubContent>
|
|
77
|
+
</ContextMenuSub>
|
|
78
|
+
</ContextMenuContent>
|
|
79
|
+
</ContextMenu>
|
|
80
|
+
```
|
|
81
|
+
### Example 3
|
|
82
|
+
```tsx
|
|
83
|
+
// With checkboxes and radio groups
|
|
84
|
+
<ContextMenu>
|
|
85
|
+
<ContextMenuTrigger>Settings Menu</ContextMenuTrigger>
|
|
86
|
+
<ContextMenuContent>
|
|
87
|
+
<ContextMenuLabel>Preferences</ContextMenuLabel>
|
|
88
|
+
<ContextMenuSeparator />
|
|
89
|
+
<ContextMenuCheckboxItem checked={showToolbar} onCheckedChange={setShowToolbar}>
|
|
90
|
+
Show Toolbar
|
|
91
|
+
</ContextMenuCheckboxItem>
|
|
92
|
+
<ContextMenuCheckboxItem checked={showSidebar} onCheckedChange={setShowSidebar}>
|
|
93
|
+
Show Sidebar
|
|
94
|
+
</ContextMenuCheckboxItem>
|
|
95
|
+
<ContextMenuSeparator />
|
|
96
|
+
<ContextMenuRadioGroup value={theme} onValueChange={setTheme}>
|
|
97
|
+
<ContextMenuRadioItem value="light">Light Theme</ContextMenuRadioItem>
|
|
98
|
+
<ContextMenuRadioItem value="dark">Dark Theme</ContextMenuRadioItem>
|
|
99
|
+
<ContextMenuRadioItem value="system">System Theme</ContextMenuRadioItem>
|
|
100
|
+
</ContextMenuRadioGroup>
|
|
101
|
+
</ContextMenuContent>
|
|
102
|
+
</ContextMenu>
|
|
103
|
+
```
|