import * as React from 'react'; import { cn } from '@/lib/utils'; /** * ProgressProps - Propriétés du composant Progress * * @interface ProgressProps * @extends React.HTMLAttributes */ export interface ProgressProps extends React.HTMLAttributes { /** * Valeur actuelle de la progression (entre 0 et max) * * @example * ```tsx * * ``` */ value: number; /** * Valeur maximale (par défaut 100) * * @default 100 */ max?: number; /** * Variant du composant de progression * * - `default`: Barre de progression standard * - `gaming`: Style gaming avec bordure dorée et effet glow * - `segmented`: Non implémenté (réservé pour usage futur) * * @default 'default' */ variant?: 'default' | 'gaming' | 'segmented'; /** * Couleur de la barre de progression * * - `cyan`: Cyan (par défaut) * - `magenta`: Magenta * - `lime`: Lime * - `gold`: Or * * @default 'cyan' */ color?: 'cyan' | 'magenta' | 'lime' | 'gold'; /** * Label accessible pour la barre de progression * * @default 'Progress' */ 'aria-label'?: string; /** * Label à afficher à gauche de la barre * * @example * ```tsx * * ``` */ labelLeft?: string; /** * Label à afficher à droite de la barre * * @example * ```tsx * * ``` */ labelRight?: string; } /** * Progress - Composant de barre de progression avec design system Kodo * * Composant de barre de progression pour afficher l'avancement d'une tâche. * Supporte plusieurs variants et couleurs selon le design system Kodo. * * @example * ```tsx * // Barre de progression simple * * * // Barre avec labels * * * // Style gaming * * * // Avec couleur personnalisée * * ``` * * @component * @param {ProgressProps} props - Propriétés du composant * @returns {JSX.Element} Élément div contenant une barre de progression stylisée */ export const Progress = React.forwardRef( ( { value, max = 100, variant = 'default', color = 'cyan', 'aria-label': ariaLabel = 'Progress', labelLeft, labelRight, className, ...props }, ref, ) => { const percentage = Math.min(100, Math.max(0, (value / max) * 100)); const colorStyles = { cyan: 'bg-primary', magenta: 'bg-kodo-magenta', lime: 'bg-kodo-lime', gold: 'bg-warning', }; const gradientStyles = { cyan: 'from-kodo-cyan to-kodo-cyan', magenta: 'from-kodo-magenta to-purple-600', lime: 'from-kodo-lime to-green-600', gold: 'from-kodo-gold to-orange-500', }; if (variant === 'gaming') { return (
{(labelLeft || labelRight) && (
{labelLeft} {labelRight}
)}
); } return (
{(labelLeft || labelRight) && (
{labelLeft} {labelRight}
)}
); }, ); Progress.displayName = 'Progress'; // Alias for compatibility export const ProgressBar = Progress;