import type { Meta, StoryObj } from '@storybook/nextjs-vite' import { Chevron01DownIcon as ChevronDown, Ellipsis02Icon as MoreVertical, ExternalLinkIcon as ExternalLink, FloppyDiscIcon as Save, TrashIcon as Trash2, } from '../components/icons-v2-generated' import React from 'react' import { SplitButton } from '../components/ui/button' const meta = { title: 'UI/SplitButton', component: SplitButton, argTypes: { variant: { control: 'select', options: ['accent', 'outline', 'transparent', 'destructive', 'warning'], }, size: { control: 'select', options: ['default', 'small'], }, fullWidth: { control: 'boolean' }, disabled: { control: 'boolean' }, }, } satisfies Meta export default meta type Story = StoryObj const newTabAction = { icon: , 'aria-label': 'Open in new tab', href: 'https://example.com', openInNewTab: true, } const dropdownAction = { icon: , 'aria-label': 'More options', onClick: () => alert('Open menu'), } export const Accent: Story = { args: { children: 'Open', variant: 'accent', onClick: () => alert('Main click'), iconAction: newTabAction, }, } export const Outline: Story = { args: { children: 'Open', variant: 'outline', onClick: () => alert('Main click'), iconAction: newTabAction, }, } export const Transparent: Story = { args: { children: 'Open', variant: 'transparent', onClick: () => alert('Main click'), iconAction: newTabAction, }, } export const Destructive: Story = { args: { children: 'Delete', variant: 'destructive', leftIcon: , onClick: () => alert('Delete'), iconAction: { icon: , 'aria-label': 'More delete options', onClick: () => alert('Menu'), }, }, } export const Warning: Story = { args: { children: 'Force retry', variant: 'warning', onClick: () => alert('Force retry'), iconAction: { icon: , 'aria-label': 'More retry options', onClick: () => alert('Menu'), }, }, } export const SizeSmall: Story = { args: { children: 'Open', size: 'small', onClick: () => alert('Main click'), iconAction: newTabAction, }, } export const AsLink: Story = { args: { children: 'Documentation', variant: 'outline', href: '/docs', iconAction: newTabAction, }, } export const WithLeftIcon: Story = { args: { children: 'Save', leftIcon: , onClick: () => alert('Save'), iconAction: dropdownAction, }, } export const Disabled: Story = { args: { children: 'Open', disabled: true, onClick: () => alert('Main'), iconAction: newTabAction, }, } export const IconActionDisabled: Story = { args: { children: 'Save', onClick: () => alert('Main'), iconAction: { ...dropdownAction, disabled: true }, }, } export const AllVariants: Story = { args: { children: 'Button', iconAction: newTabAction }, render: () => { const variants = ['accent', 'outline', 'transparent', 'destructive', 'warning'] as const return (
{variants.map((variant) => ( {}} iconAction={newTabAction}> {variant} {}} iconAction={newTabAction}> {variant} {}} iconAction={newTabAction}> {variant} {}} iconAction={newTabAction}> {variant} ))}
) }, } export const TwoActions: Story = { args: { children: 'Two actions', iconAction: newTabAction }, render: () => (
, 'aria-label': 'Open docs in new tab', href: '/docs', openInNewTab: true, }} > View docs alert('Save')} leftIcon={} iconAction={{ icon: , 'aria-label': 'Save options', onClick: () => alert('Menu'), }} > Save
), }