import type { Meta, StoryObj } from '@storybook/nextjs-vite'
import { useState } from 'react'
import {
DropdownMenu,
DropdownMenuCheckboxItem,
DropdownMenuCheckboxItemIndicator,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuGroupLabel,
DropdownMenuItem,
DropdownMenuLinkItem,
DropdownMenuRadioGroup,
DropdownMenuRadioItem,
DropdownMenuRadioItemIndicator,
DropdownMenuSeparator,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuTrigger,
} from '.'
const TriggerButton = ({ label = 'Open Menu' }: { label?: string }) => (
}
>
{label}
)
const meta = {
title: 'Base/Navigation/DropdownMenu',
component: DropdownMenu,
parameters: {
layout: 'centered',
docs: {
description: {
component: 'Compound dropdown menu built on Base UI Menu. Supports items, separators, group labels, submenus, radio groups, checkbox items, destructive items, and disabled states.',
},
},
},
tags: ['autodocs'],
} satisfies Meta
export default meta
type Story = StoryObj
export const Default: Story = {
render: () => (
Edit
Duplicate
Archive
),
}
export const WithSeparator: Story = {
render: () => (
Cut
Copy
Paste
Select All
Find and Replace
),
}
export const WithGroupLabel: Story = {
render: () => (
Actions
Edit
Duplicate
Export
Export as PDF
Export as CSV
),
}
export const WithDestructiveItem: Story = {
render: () => (
Edit
Duplicate
Delete
),
}
export const WithSubmenu: Story = {
render: () => (
New File
Open
Share
Email
Slack
Copy Link
Download
),
}
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 WithDisabledItems: Story = {
render: () => (
Edit
Duplicate
Archive
Restore
Delete
),
}
export const WithIcons: Story = {
render: () => (
Edit
Duplicate
Archive
Delete
),
}
export const WithLinkItems: Story = {
render: () => (
Dify Docs
Product Roadmap
),
}
const ComplexDemo = () => {
const [sortOrder, setSortOrder] = useState('newest')
const [showArchived, setShowArchived] = useState(false)
return (
Edit
Rename
Duplicate
Move to Workspace
Share
Email
Slack
Copy Link
Sort by
Newest first
Oldest first
Name
Show Archived
Delete
)
}
export const Complex: Story = {
render: () => ,
}