import React from 'react'; import { cn } from '@/lib/utils'; interface DataListProps { items: T[]; renderItem: (item: T, index: number) => React.ReactNode; keyExtractor: (item: T) => string; emptyMessage?: string; loading?: boolean; error?: string; className?: string; itemClassName?: string; } export function DataList({ items, renderItem, keyExtractor, emptyMessage = 'No items found', loading = false, error, className, itemClassName, }: DataListProps) { if (loading) { return (
{Array.from({ length: 3 }).map((_, index) => (
))}
); } if (error) { return (

{error}

); } if (items.length === 0) { return (

{emptyMessage}

); } return (
{items.map((item, index) => (
{renderItem(item, index)}
))}
); } interface ModalProps { isOpen: boolean; onClose: () => void; title?: string; children: React.ReactNode; size?: 'sm' | 'md' | 'lg' | 'xl'; showCloseButton?: boolean; } export const Modal: React.FC = ({ isOpen, onClose, title, children, size = 'md', showCloseButton = true, }) => { if (!isOpen) return null; const sizeClasses = { sm: 'max-w-md', md: 'max-w-lg', lg: 'max-w-2xl', xl: 'max-w-4xl', }; return (
{/* Backdrop */}
{/* Modal */}
{/* Header */} {(title || showCloseButton) && (
{title && (

{title}

)} {showCloseButton && ( )}
)} {/* Content */}
{children}
); }; interface DropdownProps { trigger: React.ReactNode; children: React.ReactNode; isOpen: boolean; onToggle: () => void; align?: 'left' | 'right'; className?: string; } export const Dropdown: React.FC = ({ trigger, children, isOpen, onToggle, align = 'left', className, }) => { return (
{trigger}
{isOpen && ( <> {/* Backdrop */}
{/* Dropdown */}
{children}
)}
); };