import * as React from 'react'; import { cn } from '@/lib/utils'; // Basic button component using design tokens export interface ButtonProps extends React.ButtonHTMLAttributes { variant?: 'primary' | 'secondary' | 'ghost' | 'link'; size?: 'sm' | 'md' | 'lg'; asChild?: boolean; } export const Button = React.forwardRef( ({ variant = 'primary', size = 'md', asChild = false, className, children, ...props }, ref) => { const baseStyles = 'inline-flex items-center justify-center rounded-md font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50'; const variantStyles = { primary: 'bg-[var(--bl-accent)] text-[var(--bl-accent-foreground)] hover:opacity-90 focus-visible:ring-[var(--bl-focus-ring)]', secondary: 'bg-[var(--bl-surface-muted)] text-[var(--bl-text-primary)] hover:bg-[var(--bl-surface-highlight)] focus-visible:ring-[var(--bl-focus-ring)]', ghost: 'text-[var(--bl-text-primary)] hover:bg-[var(--bl-surface-muted)] focus-visible:ring-[var(--bl-focus-ring)]', link: 'text-[var(--bl-accent)] hover:underline focus-visible:ring-[var(--bl-focus-ring)]', }; const sizeStyles = { sm: 'h-9 px-3 text-sm', md: 'h-10 px-4 text-sm', lg: 'h-11 px-8 text-base', }; const classes = cn(baseStyles, variantStyles[variant], sizeStyles[size], className); if (asChild && React.isValidElement(children)) { const typedChild = children as React.ReactElement<{ className?: string }>; return React.cloneElement(typedChild, { className: cn(typedChild.props.className, classes), }); } return ( ); }, ); Button.displayName = 'Button'; // Basic badge component using design tokens export interface BadgeProps extends React.HTMLAttributes { variant?: 'neutral' | 'success' | 'warning' | 'error' | 'info'; dot?: boolean; } export function Badge({ variant = 'neutral', dot = false, className, children, ...props }: BadgeProps) { const variantStyles = { neutral: 'bg-[var(--bl-surface-muted)] text-[var(--bl-fg-muted)]', success: 'bg-[var(--bl-success-bg)] text-[var(--bl-success-fg)]', warning: 'bg-[var(--bl-warning-bg)] text-[var(--bl-warning-fg)]', error: 'bg-[var(--bl-danger-bg)] text-[var(--bl-danger-fg)]', info: 'bg-[var(--bl-info-bg)] text-[var(--bl-info-fg)]', }; return (
{dot && } {children}
); } // Input component using design tokens export interface InputProps extends React.InputHTMLAttributes { variant?: 'surface' | 'muted'; } export const Input = React.forwardRef( ({ variant = 'surface', className, ...props }, ref) => { const variantStyles = { surface: 'bg-[var(--bl-input)] border-[var(--bl-border)]', muted: 'bg-[var(--bl-surface-muted)] border-[var(--bl-border)]', }; return ( ); }, ); Input.displayName = 'Input';