160 lines
4.6 KiB
TypeScript
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>
|
|
),
|
|
};
|