import * as React from 'react';
import { cn } from '@/lib/utils';
import { ChevronUp, ChevronDown, ChevronsUpDown } from 'lucide-react';
/**
* Table - Composant de tableau avec design system Kodo
*
* Composant de tableau pour afficher des données structurées.
* Utilise le design system Kodo avec des styles cohérents et support pour le scroll.
*
* @example
* ```tsx
*
*
*
* Nom
* Email
*
*
*
*
* John Doe
* john@example.com
*
*
*
* ```
*
* @component
* @param {React.HTMLAttributes} props - Propriétés HTML standard de table
* @returns {JSX.Element} Élément div contenant un tableau stylisé avec scroll
*/
// CRITIQUE FIX #40: Interface étendue pour supporter aria-label et caption
export interface TableProps extends React.HTMLAttributes {
/**
* Label accessible pour le tableau (aria-label)
* Si non fourni, aria-label sera undefined et il faudra utiliser TableCaption
*/
'aria-label'?: string;
/**
* ID d'un élément qui décrit le tableau (aria-labelledby)
*/
'aria-labelledby'?: string;
}
const Table = React.forwardRef(
(
{
className,
'aria-label': ariaLabel,
'aria-labelledby': ariaLabelledBy,
...props
},
ref,
) => (
),
);
Table.displayName = 'Table';
/**
* TableHeader - En-tête du tableau
*
* Conteneur pour les lignes d'en-tête du tableau.
*
* @component
*/
const TableHeader = React.forwardRef<
HTMLTableSectionElement,
React.HTMLAttributes
>(({ className, ...props }, ref) => (
));
TableHeader.displayName = 'TableHeader';
/**
* TableBody - Corps du tableau
*
* Conteneur pour les lignes de données du tableau.
*
* @component
*/
const TableBody = React.forwardRef<
HTMLTableSectionElement,
React.HTMLAttributes
>(({ className, ...props }, ref) => (
));
TableBody.displayName = 'TableBody';
/**
* TableFooter - Pied du tableau
*
* Conteneur pour les lignes de pied du tableau (totaux, etc.).
*
* @component
*/
const TableFooter = React.forwardRef<
HTMLTableSectionElement,
React.HTMLAttributes
>(({ className, ...props }, ref) => (
tr]:last:border-b-0',
className,
)}
{...props}
/>
));
TableFooter.displayName = 'TableFooter';
/**
* TableRow - Ligne du tableau
*
* Ligne individuelle du tableau avec effet hover et support pour l'état sélectionné.
*
* @component
*/
const TableRow = React.forwardRef<
HTMLTableRowElement,
React.HTMLAttributes
>(({ className, ...props }, ref) => (
));
TableRow.displayName = 'TableRow';
/**
* TableHead - Cellule d'en-tête
*
* Cellule d'en-tête du tableau avec style en gras et uppercase.
*
* @component
*/
const TableHead = React.forwardRef<
HTMLTableCellElement,
React.ThHTMLAttributes
>(({ className, ...props }, ref) => (
|
));
TableHead.displayName = 'TableHead';
/**
* TableCell - Cellule de données
*
* Cellule de données du tableau avec padding et alignement.
*
* @component
*/
const TableCell = React.forwardRef<
HTMLTableCellElement,
React.TdHTMLAttributes
>(({ className, ...props }, ref) => (
|
));
TableCell.displayName = 'TableCell';
/**
* TableCaption - Légende du tableau
*
* Légende optionnelle affichée sous le tableau.
*
* @component
*/
const TableCaption = React.forwardRef<
HTMLTableCaptionElement,
React.HTMLAttributes
>(({ className, ...props }, ref) => (
));
TableCaption.displayName = 'TableCaption';
/**
* SortIndicator - Indicateur visuel de tri pour les colonnes
*
* Affiche une icône de tri correspondant à la direction actuelle.
* Utilisable dans les cellules d'en-tête pour indiquer l'état de tri.
*
* @component
* @param {Object} props
* @param {'asc' | 'desc' | null | undefined} props.direction - Direction de tri actuelle
*/
function SortIndicator({
direction,
}: {
direction?: 'asc' | 'desc' | null;
}) {
if (!direction)
return (
);
return direction === 'asc' ? (
) : (
);
}
/**
* SortableTableHead - Cellule d'en-tête triable
*
* Cellule d'en-tête enrichie avec indicateur de tri et interaction.
*
* @component
* @param {Object} props
* @param {boolean} props.sortable - Si la colonne est triable
* @param {'asc' | 'desc' | null} props.sortDirection - Direction de tri actuelle
* @param {() => void} props.onSort - Callback lors du clic de tri
*/
interface SortableTableHeadProps
extends React.ThHTMLAttributes {
sortable?: boolean;
sortDirection?: 'asc' | 'desc' | null;
onSort?: () => void;
}
const SortableTableHead = React.forwardRef<
HTMLTableCellElement,
SortableTableHeadProps
>(
(
{ className, children, sortable, sortDirection, onSort, ...props },
ref,
) => (
{children}
{sortable && }
|
),
);
SortableTableHead.displayName = 'SortableTableHead';
export {
Table,
TableHeader,
TableBody,
TableFooter,
TableHead,
TableRow,
TableCell,
TableCaption,
SortIndicator,
SortableTableHead,
};