diff --git a/src/shared/SidebarNavItem/SidebarNavItem.stories.tsx b/src/shared/SidebarNavItem/SidebarNavItem.stories.tsx new file mode 100644 index 0000000..03649a2 --- /dev/null +++ b/src/shared/SidebarNavItem/SidebarNavItem.stories.tsx @@ -0,0 +1,66 @@ +import type { Meta, StoryObj } from '@storybook/react-vite' + +import { + QueueListIcon, + ExclamationTriangleIcon, + CheckCircleIcon, + // UsersIcon, + // PresentationChartLineIcon +} from '@heroicons/react/24/outline' + +import { SidebarNavItem } from './SidebarNavItem' + +const meta = { + title: 'Shared/Composites/SidebarNavItem', + + component: SidebarNavItem, + + tags: ['autodocs'], + + argTypes: {}, +} satisfies Meta + +export default meta + +type Story = StoryObj + +export const Default: Story = { + args: { + link: '/reports', + label: 'Reports', + icon: , + }, +} + +export const Active: Story = { + args: { + link: '/reports', + label: 'Reports', + icon: , + isActive: true, + }, +} + +export const WithDangerBadge: Story = { + args: { + link: '/escalated', + label: 'Escalated', + icon: , + + badge: 12, + + badgeVariant: 'danger', + }, +} + +export const WithInfoBadge: Story = { + args: { + link: '/resolved', + label: 'Resolved', + icon: , + + badge: 4, + + badgeVariant: 'info', + }, +} diff --git a/src/shared/SidebarNavItem/SidebarNavItem.tsx b/src/shared/SidebarNavItem/SidebarNavItem.tsx new file mode 100644 index 0000000..1527b78 --- /dev/null +++ b/src/shared/SidebarNavItem/SidebarNavItem.tsx @@ -0,0 +1,92 @@ +import React from 'react' +import { cva } from 'class-variance-authority' +import { Badge } from '../Badge' +// import { NavLink } from 'react-router-dom' + +const sidebarNavItem = cva( + [ + 'w-full', + 'flex items-center justify-between', + 'gap-3', + + 'rounded-lg', + + 'px-3 py-2', + + 'transition-colors duration-150', + + 'cursor-pointer', + 'select-none', + + 'focus-visible:outline-none', + 'focus-visible:ring-2', + 'focus-visible:ring-border-info', + + 'active:scale-[0.99]', + ], + { + variants: { + isActive: { + true: ['bg-bg-secondary', 'text-text-primary', 'font-medium'], + + false: ['text-text-tertiary', 'hover:bg-bg-secondary', 'hover:text-text-primary'], + }, + }, + + defaultVariants: { + isActive: false, + }, + } +) + +export interface SidebarNavItemProps { + link?: string + + label: string + + icon: React.ReactNode + + isActive?: boolean + + badge?: number | string + + badgeVariant?: 'danger' | 'info' + + className?: string +} + +export function SidebarNavItem({ + // link, + label, + icon, + isActive = false, + badge, + badgeVariant = 'info', + className, +}: SidebarNavItemProps) { + return ( +
+ {/* Left side */} +
+ {icon} + + {label} +
+ + {/* Badge */} + {badge !== undefined && ( + + {badge} + + )} +
+ ) +} + +export default SidebarNavItem diff --git a/src/shared/SidebarNavItem/index.ts b/src/shared/SidebarNavItem/index.ts new file mode 100644 index 0000000..cc9c9ce --- /dev/null +++ b/src/shared/SidebarNavItem/index.ts @@ -0,0 +1,2 @@ +export { SidebarNavItem } from './SidebarNavItem' +export type { SidebarNavItemProps } from './SidebarNavItem'