'use client'; import { forwardRef, HTMLAttributes } from 'react'; import styles from './tension-meter.module.css'; export interface TensionMeterProps extends HTMLAttributes { /** Current tension level (0-100) */ tension: number; /** Maximum tension */ max?: number; /** Show numeric value */ showValue?: boolean; /** Meter variant */ variant?: 'critical' | 'warning' | 'normal' | 'auto'; /** Bar style */ barStyle?: 'solid' | 'segmented' | 'pulsing' | 'glitch'; /** Orientation */ orientation?: 'horizontal' | 'vertical'; /** Label text */ label?: string; /** Custom color for critical level */ criticalColor?: string; /** Custom color for warning level */ warningColor?: string; /** Custom color for normal level */ normalColor?: string; } export const TensionMeter = forwardRef( ( { tension, max = 100, showValue = true, variant = 'auto', barStyle = 'solid', orientation = 'horizontal', label, criticalColor = '#ff0000', warningColor = '#ffaa00', normalColor = '#00ff00', className, ...props }, ref ) => { const percentage = Math.min(100, Math.max(0, (tension / max) * 100)); // Auto-determine variant based on percentage const finalVariant = variant === 'auto' ? percentage >= 80 ? 'critical' : percentage >= 50 ? 'warning' : 'normal' : variant; const getColor = () => { switch (finalVariant) { case 'critical': return criticalColor; case 'warning': return warningColor; case 'normal': return normalColor; } }; return (
{label && }
{barStyle === 'segmented' && ( <>
)}
{showValue && (
{Math.round(tension)} %
)} {finalVariant === 'critical' && (
)}
); } ); TensionMeter.displayName = 'TensionMeter'; export default TensionMeter;