import { posteShort, posteTokens, type PosteCode } from '@/lib/design/postes'; import { cx } from '@/lib/cx'; /** * États d'un créneau, repris du design system. * * `alert` ajoute un liseré danger de 1,5 px : la couleur du poste occupe déjà * le fond, l'alerte doit donc passer par la forme, pas par une seconde teinte * qui entrerait en concurrence avec la palette catégorielle. */ export type ShiftState = | 'published' | 'validated' | 'draft' | 'unpublished' | 'alert' | 'unassigned'; export interface ShiftChipProps { poste: PosteCode; /** « 09:00–17:00 ». */ time: string; state?: ShiftState; /** Écart affiché en pastille, ex. « +2 h 55 ». */ delta?: string; /** Motif de l'alerte, ex. « Repos < 11 h ». */ alert?: string; /** Durée de pause, en minutes. */ breakMinutes?: number; className?: string; } export function ShiftChip({ poste, time, state = 'published', delta, alert, breakMinutes, className, }: ShiftChipProps) { const tokens = posteTokens(poste); const ghost = state === 'unassigned'; return (
{/* Le code du poste est le second canal : la couleur ne suffit pas. */} {posteShort(poste)} {state === 'validated' ? ( ✓ ) : null} {delta ? ( {delta} ) : null} {time} {breakMinutes ? ( ({breakMinutes} mn) ) : null} {alert ? ( // Le motif est tronqué dans une cellule étroite : le `title` garde le // texte complet accessible, sinon l'alerte dit qu'il y a un problème // sans jamais dire lequel. ▲ {alert} ) : null}
); }