konobangu/apps/storybook/stories/dropdown-menu.stories.tsx

160 lines
4.6 KiB
TypeScript

import type { Meta, StoryObj } from '@storybook/react';
import { Mail, Plus, PlusCircle, Search, UserPlus } from 'lucide-react';
import {
DropdownMenu,
DropdownMenuCheckboxItem,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuLabel,
DropdownMenuPortal,
DropdownMenuRadioGroup,
DropdownMenuRadioItem,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuSub,
DropdownMenuSubContent,
DropdownMenuSubTrigger,
DropdownMenuTrigger,
} from '@konobangu/design-system/components/ui/dropdown-menu';
/**
* Displays a menu to the user — such as a set of actions or functions —
* triggered by a button.
*/
const meta = {
title: 'ui/DropdownMenu',
component: DropdownMenu,
tags: ['autodocs'],
argTypes: {},
render: (args) => (
<DropdownMenu {...args}>
<DropdownMenuTrigger>Open</DropdownMenuTrigger>
<DropdownMenuContent className="w-44">
<DropdownMenuLabel>My Account</DropdownMenuLabel>
<DropdownMenuSeparator />
<DropdownMenuItem>Profile</DropdownMenuItem>
<DropdownMenuItem>Billing</DropdownMenuItem>
<DropdownMenuItem>Team</DropdownMenuItem>
<DropdownMenuItem>Subscription</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
),
parameters: {
layout: 'centered',
},
} satisfies Meta<typeof DropdownMenu>;
export default meta;
type Story = StoryObj<typeof meta>;
/**
* The default form of the dropdown menu.
*/
export const Default: Story = {};
/**
* A dropdown menu with shortcuts.
*/
export const WithShortcuts: Story = {
render: (args) => (
<DropdownMenu {...args}>
<DropdownMenuTrigger>Open</DropdownMenuTrigger>
<DropdownMenuContent className="w-44">
<DropdownMenuLabel>Controls</DropdownMenuLabel>
<DropdownMenuItem>
Back
<DropdownMenuShortcut>[</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuItem disabled>
Forward
<DropdownMenuShortcut>]</DropdownMenuShortcut>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
),
};
/**
* A dropdown menu with submenus.
*/
export const WithSubmenus: Story = {
render: (args) => (
<DropdownMenu {...args}>
<DropdownMenuTrigger>Open</DropdownMenuTrigger>
<DropdownMenuContent className="w-44">
<DropdownMenuItem>
<Search className="mr-2 size-4" />
<span>Search</span>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<DropdownMenuItem>
<Plus className="mr-2 size-4" />
<span>New Team</span>
<DropdownMenuShortcut>+T</DropdownMenuShortcut>
</DropdownMenuItem>
<DropdownMenuSub>
<DropdownMenuSubTrigger>
<UserPlus className="mr-2 size-4" />
<span>Invite users</span>
</DropdownMenuSubTrigger>
<DropdownMenuPortal>
<DropdownMenuSubContent>
<DropdownMenuItem>
<Mail className="mr-2 size-4" />
<span>Email</span>
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem>
<PlusCircle className="mr-2 size-4" />
<span>More...</span>
</DropdownMenuItem>
</DropdownMenuSubContent>
</DropdownMenuPortal>
</DropdownMenuSub>
</DropdownMenuGroup>
</DropdownMenuContent>
</DropdownMenu>
),
};
/**
* A dropdown menu with radio items.
*/
export const WithRadioItems: Story = {
render: (args) => (
<DropdownMenu {...args}>
<DropdownMenuTrigger>Open</DropdownMenuTrigger>
<DropdownMenuContent className="w-44">
<DropdownMenuLabel inset>Status</DropdownMenuLabel>
<DropdownMenuRadioGroup value="warning">
<DropdownMenuRadioItem value="info">Info</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="warning">Warning</DropdownMenuRadioItem>
<DropdownMenuRadioItem value="error">Error</DropdownMenuRadioItem>
</DropdownMenuRadioGroup>
</DropdownMenuContent>
</DropdownMenu>
),
};
/**
* A dropdown menu with checkboxes.
*/
export const WithCheckboxes: Story = {
render: (args) => (
<DropdownMenu {...args}>
<DropdownMenuTrigger>Open</DropdownMenuTrigger>
<DropdownMenuContent className="w-44">
<DropdownMenuCheckboxItem checked>
Autosave
<DropdownMenuShortcut>S</DropdownMenuShortcut>
</DropdownMenuCheckboxItem>
<DropdownMenuCheckboxItem>Show Comments</DropdownMenuCheckboxItem>
</DropdownMenuContent>
</DropdownMenu>
),
};