Skip to content

Commit

Permalink
feat: default components & refactor ci (#11)
Browse files Browse the repository at this point in the history
* 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
boomchanotai authored Oct 2, 2024
1 parent 0febe2a commit ba0f17f
Show file tree
Hide file tree
Showing 29 changed files with 1,617 additions and 127 deletions.
26 changes: 25 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,34 @@ UI Library built in purpose to be used internally by Engineering Student Committ

## Components

- [ ] Accordion
- [ ] Alet Dialog
- [ ] Aspect Ratio
- [x] Avatar
- [x] Button
- [x] Checkbox
- [x] Collapsible
- [ ] Command
- [x] Context Menu
- [ ] Dialog
- [x] Dropdown Menu
- [ ] Hover Card
- [x] Input
- [x] Typography
- [x] Label
- [x] Menubar
- [x] Navigation Menu
- [ ] Popover
- [x] Progress
- [x] Radio Group
- [x] Scroll Area
- [ ] Select
- [x] Seperator
- [ ] Slider
- [x] Switch
- [x] Tabs
- [x] Text Area
- [ ] Tooltip
- [x] Typography

Please check the [storybook](https://esc-chula.github.io/esc-ui/) for more information.

Expand Down
2 changes: 1 addition & 1 deletion lib/components/Avatar/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const Avatar = React.forwardRef<HTMLImageElement, AvatarProps>(
/>
<AvatarPrimitive.Fallback
className={cn(
'flex h-full w-full items-center justify-center rounded-full bg-muted text-carmine-500'
'flex h-full w-full items-center justify-center rounded-full bg-neutral-100 text-carmine-500'
)}
>
{fallback?.split(' ').map((word) => word[0])}
Expand Down
16 changes: 7 additions & 9 deletions lib/components/Button/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const buttonVariants = cva(
'rounded-md',
'text-sm',
'font-medium',
'ring-offset-background',
'ring-offset-white',
'transition-colors',
'focus-visible:outline-none',
'focus-visible:ring-2',
Expand All @@ -25,15 +25,13 @@ const buttonVariants = cva(
{
variants: {
variant: {
default: 'bg-primary text-primary-foreground hover:bg-primary/90',
secondary:
'bg-secondary text-secondary-foreground hover:bg-secondary/80',
destructive:
'bg-destructive text-destructive-foreground hover:bg-destructive/90',
default: 'bg-carmine-500 text-white hover:bg-carmine-400',
secondary: 'bg-neutral-100 text-black hover:bg-neutral-200',
destructive: 'bg-red-500 text-white hover:bg-red-600',
outline:
'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
ghost: 'hover:bg-accent hover:text-accent-foreground',
link: 'text-primary underline-offset-4 hover:underline',
'border border-neutral-200 bg-white hover:bg-neutral-100 hover:text-black',
ghost: 'hover:bg-neutral-100 hover:text-black',
link: 'text-black underline-offset-4 hover:underline',
},
size: {
default: 'h-10 px-4 py-2',
Expand Down
2 changes: 1 addition & 1 deletion lib/components/Checkbox/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const Checkbox = forwardRef<
<CheckboxPrimitive.Root
ref={ref}
className={cn(
'peer h-4 w-4 shrink-0 rounded-sm border border-neutral-300 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground',
'peer h-4 w-4 shrink-0 rounded-sm border border-neutral-300 ring-offset-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-carmine-500 data-[state=checked]:bg-carmine-500 data-[state=checked]:text-white',
className
)}
{...props}
Expand Down
4 changes: 3 additions & 1 deletion lib/components/Collapsible/index.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,13 @@ export default meta
type Story = StoryObj<typeof Collapsible>

export const Default: Story = {
render: () => {
args: {},
render: (args) => {
const [isOpen, setIsOpen] = React.useState(false)

return (
<Collapsible
{...args}
open={isOpen}
onOpenChange={setIsOpen}
className='w-[350px] space-y-2'
Expand Down
37 changes: 37 additions & 0 deletions lib/components/ContextMenu/index.stories.tsx
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>
),
}
198 changes: 198 additions & 0 deletions lib/components/ContextMenu/index.tsx
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,
}
43 changes: 43 additions & 0 deletions lib/components/DropdownMenu/index.stories.tsx
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>
),
}
Loading

0 comments on commit ba0f17f

Please sign in to comment.