import type { Meta, StoryObj } from '@storybook/nextjs-vite'
import { useState } from 'react'
import {
ContextMenu,
ContextMenuCheckboxItem,
ContextMenuCheckboxItemIndicator,
ContextMenuContent,
ContextMenuGroup,
ContextMenuGroupLabel,
ContextMenuItem,
ContextMenuLinkItem,
ContextMenuRadioGroup,
ContextMenuRadioItem,
ContextMenuRadioItemIndicator,
ContextMenuSeparator,
ContextMenuSub,
ContextMenuSubContent,
ContextMenuSubTrigger,
ContextMenuTrigger,
} from '.'
const TriggerArea = ({ label = 'Right-click inside this area' }: { label?: string }) => (
}
>
{label}
)
const meta = {
title: 'Base/Navigation/ContextMenu',
component: ContextMenu,
parameters: {
layout: 'centered',
docs: {
description: {
component: 'Compound context menu built on Base UI ContextMenu. Open by right-clicking the trigger area.',
},
},
},
tags: ['autodocs'],
} satisfies Meta
export default meta
type Story = StoryObj
export const Default: Story = {
render: () => (
Edit
Duplicate
Archive
),
}
export const WithSubmenu: Story = {
render: () => (
Copy
Paste
Share
Email
Slack
Copy link
),
}
export const WithGroupLabel: Story = {
render: () => (
Actions
Rename
Duplicate
Danger Zone
Delete
),
}
const WithRadioItemsDemo = () => {
const [value, setValue] = useState('comfortable')
return (
Compact
Comfortable
Spacious
)
}
export const WithRadioItems: Story = {
render: () => ,
}
const WithCheckboxItemsDemo = () => {
const [showToolbar, setShowToolbar] = useState(true)
const [showSidebar, setShowSidebar] = useState(false)
const [showStatusBar, setShowStatusBar] = useState(true)
return (
Toolbar
Sidebar
Status bar
)
}
export const WithCheckboxItems: Story = {
render: () => ,
}
export const WithLinkItems: Story = {
render: () => (
Dify Docs
Product Roadmap
Dangerous External Action
),
}
export const Complex: Story = {
render: () => (
Rename
Duplicate
Share
Email
Slack
Copy Link
Delete
),
}