-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: default components & refactor ci (#11)
* feat: add context menu * feat: add dropdown * feat: tabs * feat: navigation menu * feat: add menubar * refactor: color ci * refactor: ci * refactor: color ci * refactor: color ci * refactor: remove colors * chore: show components
- Loading branch information
1 parent
0febe2a
commit ba0f17f
Showing
29 changed files
with
1,617 additions
and
127 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
import type { Meta, StoryObj } from '@storybook/react' | ||
|
||
import { | ||
ContextMenu, | ||
ContextMenuContent, | ||
ContextMenuItem, | ||
ContextMenuTrigger, | ||
} from '.' | ||
|
||
const meta: Meta<typeof ContextMenu> = { | ||
title: 'Components/ContextMenu', | ||
component: ContextMenu, | ||
parameters: { | ||
layout: 'centered', | ||
}, | ||
tags: ['autodocs'], | ||
} | ||
|
||
export default meta | ||
|
||
type Story = StoryObj<typeof meta> | ||
|
||
export const Default: Story = { | ||
args: {}, | ||
render: (args) => ( | ||
<ContextMenu {...args}> | ||
<ContextMenuTrigger className='rounded bg-gray-50 px-16 py-8'> | ||
Trigger | ||
</ContextMenuTrigger> | ||
<ContextMenuContent> | ||
<ContextMenuItem>Item 1</ContextMenuItem> | ||
<ContextMenuItem>Item 2</ContextMenuItem> | ||
<ContextMenuItem>Item 3</ContextMenuItem> | ||
</ContextMenuContent> | ||
</ContextMenu> | ||
), | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,198 @@ | ||
import * as ContextMenuPrimitive from '@radix-ui/react-context-menu' | ||
import { Check, ChevronRight, Circle } from 'lucide-react' | ||
import * as React from 'react' | ||
|
||
import { cn } from '@/utils' | ||
|
||
const ContextMenu = ContextMenuPrimitive.Root | ||
|
||
const ContextMenuTrigger = ContextMenuPrimitive.Trigger | ||
|
||
const ContextMenuGroup = ContextMenuPrimitive.Group | ||
|
||
const ContextMenuPortal = ContextMenuPrimitive.Portal | ||
|
||
const ContextMenuSub = ContextMenuPrimitive.Sub | ||
|
||
const ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup | ||
|
||
const ContextMenuSubTrigger = React.forwardRef< | ||
React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>, | ||
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & { | ||
inset?: boolean | ||
} | ||
>(({ className, inset, children, ...props }, ref) => ( | ||
<ContextMenuPrimitive.SubTrigger | ||
ref={ref} | ||
className={cn( | ||
'flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-neutral-100 focus:text-black data-[state=open]:bg-neutral-100 data-[state=open]:text-black', | ||
inset && 'pl-8', | ||
className | ||
)} | ||
{...props} | ||
> | ||
{children} | ||
<ChevronRight className='ml-auto size-4' /> | ||
</ContextMenuPrimitive.SubTrigger> | ||
)) | ||
ContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName | ||
|
||
const ContextMenuSubContent = React.forwardRef< | ||
React.ElementRef<typeof ContextMenuPrimitive.SubContent>, | ||
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent> | ||
>(({ className, ...props }, ref) => ( | ||
<ContextMenuPrimitive.SubContent | ||
ref={ref} | ||
className={cn( | ||
'animate-in slide-in-from-left-1 z-50 min-w-[8rem] overflow-hidden rounded-md border bg-white p-1 text-black shadow-md', | ||
className | ||
)} | ||
{...props} | ||
/> | ||
)) | ||
ContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName | ||
|
||
const ContextMenuContent = React.forwardRef< | ||
React.ElementRef<typeof ContextMenuPrimitive.Content>, | ||
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content> | ||
>(({ className, ...props }, ref) => ( | ||
<ContextMenuPrimitive.Portal> | ||
<ContextMenuPrimitive.Content | ||
ref={ref} | ||
className={cn( | ||
'animate-in fade-in-80 z-50 min-w-[8rem] overflow-hidden rounded-md border bg-white p-1 text-black shadow-md', | ||
className | ||
)} | ||
{...props} | ||
/> | ||
</ContextMenuPrimitive.Portal> | ||
)) | ||
ContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName | ||
|
||
const ContextMenuItem = React.forwardRef< | ||
React.ElementRef<typeof ContextMenuPrimitive.Item>, | ||
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & { | ||
inset?: boolean | ||
} | ||
>(({ className, inset, ...props }, ref) => ( | ||
<ContextMenuPrimitive.Item | ||
ref={ref} | ||
className={cn( | ||
'relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-neutral-100 focus:text-black data-[disabled]:pointer-events-none data-[disabled]:opacity-50', | ||
inset && 'pl-8', | ||
className | ||
)} | ||
{...props} | ||
/> | ||
)) | ||
ContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName | ||
|
||
const ContextMenuCheckboxItem = React.forwardRef< | ||
React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>, | ||
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem> | ||
>(({ className, children, checked, ...props }, ref) => ( | ||
<ContextMenuPrimitive.CheckboxItem | ||
ref={ref} | ||
className={cn( | ||
'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-neutral-100 focus:text-black data-[disabled]:pointer-events-none data-[disabled]:opacity-50', | ||
className | ||
)} | ||
checked={checked} | ||
{...props} | ||
> | ||
<span className='absolute left-2 flex size-3.5 items-center justify-center'> | ||
<ContextMenuPrimitive.ItemIndicator> | ||
<Check className='size-4' /> | ||
</ContextMenuPrimitive.ItemIndicator> | ||
</span> | ||
{children} | ||
</ContextMenuPrimitive.CheckboxItem> | ||
)) | ||
ContextMenuCheckboxItem.displayName = | ||
ContextMenuPrimitive.CheckboxItem.displayName | ||
|
||
const ContextMenuRadioItem = React.forwardRef< | ||
React.ElementRef<typeof ContextMenuPrimitive.RadioItem>, | ||
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem> | ||
>(({ className, children, ...props }, ref) => ( | ||
<ContextMenuPrimitive.RadioItem | ||
ref={ref} | ||
className={cn( | ||
'relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-neutral-100 focus:text-black data-[disabled]:pointer-events-none data-[disabled]:opacity-50', | ||
className | ||
)} | ||
{...props} | ||
> | ||
<span className='absolute left-2 flex size-3.5 items-center justify-center'> | ||
<ContextMenuPrimitive.ItemIndicator> | ||
<Circle className='size-2 fill-current' /> | ||
</ContextMenuPrimitive.ItemIndicator> | ||
</span> | ||
{children} | ||
</ContextMenuPrimitive.RadioItem> | ||
)) | ||
ContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName | ||
|
||
const ContextMenuLabel = React.forwardRef< | ||
React.ElementRef<typeof ContextMenuPrimitive.Label>, | ||
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & { | ||
inset?: boolean | ||
} | ||
>(({ className, inset, ...props }, ref) => ( | ||
<ContextMenuPrimitive.Label | ||
ref={ref} | ||
className={cn( | ||
'px-2 py-1.5 text-sm font-semibold text-foreground', | ||
inset && 'pl-8', | ||
className | ||
)} | ||
{...props} | ||
/> | ||
)) | ||
ContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName | ||
|
||
const ContextMenuSeparator = React.forwardRef< | ||
React.ElementRef<typeof ContextMenuPrimitive.Separator>, | ||
React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator> | ||
>(({ className, ...props }, ref) => ( | ||
<ContextMenuPrimitive.Separator | ||
ref={ref} | ||
className={cn('-mx-1 my-1 h-px bg-border', className)} | ||
{...props} | ||
/> | ||
)) | ||
ContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName | ||
|
||
const ContextMenuShortcut = ({ | ||
className, | ||
...props | ||
}: React.HTMLAttributes<HTMLSpanElement>) => { | ||
return ( | ||
<span | ||
className={cn( | ||
'ml-auto text-xs tracking-widest text-neutral-500', | ||
className | ||
)} | ||
{...props} | ||
/> | ||
) | ||
} | ||
ContextMenuShortcut.displayName = 'ContextMenuShortcut' | ||
|
||
export { | ||
ContextMenu, | ||
ContextMenuTrigger, | ||
ContextMenuContent, | ||
ContextMenuItem, | ||
ContextMenuCheckboxItem, | ||
ContextMenuRadioItem, | ||
ContextMenuLabel, | ||
ContextMenuSeparator, | ||
ContextMenuShortcut, | ||
ContextMenuGroup, | ||
ContextMenuPortal, | ||
ContextMenuSub, | ||
ContextMenuSubContent, | ||
ContextMenuSubTrigger, | ||
ContextMenuRadioGroup, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
import type { Meta, StoryObj } from '@storybook/react' | ||
|
||
import { | ||
DropdownMenu, | ||
DropdownMenuContent, | ||
DropdownMenuItem, | ||
DropdownMenuLabel, | ||
DropdownMenuSeparator, | ||
DropdownMenuTrigger, | ||
} from '.' | ||
import { Button } from '../Button' | ||
|
||
const meta: Meta<typeof DropdownMenu> = { | ||
title: 'Components/DropdownMenu', | ||
component: DropdownMenu, | ||
parameters: { | ||
layout: 'centered', | ||
}, | ||
tags: ['autodocs'], | ||
} | ||
|
||
export default meta | ||
|
||
type Story = StoryObj<typeof meta> | ||
|
||
export const Default: Story = { | ||
args: {}, | ||
render: (args) => ( | ||
<DropdownMenu {...args}> | ||
<DropdownMenuTrigger> | ||
<Button>Open Dropdown</Button> | ||
</DropdownMenuTrigger> | ||
<DropdownMenuContent> | ||
<DropdownMenuLabel>My Account</DropdownMenuLabel> | ||
<DropdownMenuSeparator /> | ||
<DropdownMenuItem>Profile</DropdownMenuItem> | ||
<DropdownMenuItem>Billing</DropdownMenuItem> | ||
<DropdownMenuItem>Team</DropdownMenuItem> | ||
<DropdownMenuItem>Subscription</DropdownMenuItem> | ||
</DropdownMenuContent> | ||
</DropdownMenu> | ||
), | ||
} |
Oops, something went wrong.