|
| 1 | +import { memo } from 'react'; |
| 2 | +import { Link } from 'react-router-dom'; |
| 3 | +import type { GalleryCharacter } from '../../types'; |
| 4 | +import { MiniPreview } from './MiniPreview'; |
| 5 | +import { CLASS_ICONS } from '../ui/icons'; |
| 6 | +import { formatRelativeDate } from '../../utils/formatRelativeDate'; |
| 7 | + |
| 8 | +interface GalleryCardProps { |
| 9 | + character: GalleryCharacter; |
| 10 | +} |
| 11 | + |
| 12 | +export const GalleryCard = memo(function GalleryCard({ character }: GalleryCardProps) { |
| 13 | + return ( |
| 14 | + <Link |
| 15 | + to={`/characters/${character.id}`} |
| 16 | + className="group block bg-dark-800 border border-dark-700 rounded-xl p-4 transition-all duration-200 hover:border-gold-500/50 hover:-translate-y-1 hover:shadow-[0_8px_24px_rgba(0,0,0,0.4)]" |
| 17 | + aria-label={`Voir ${character.name} par ${character.authorPseudo}`} |
| 18 | + > |
| 19 | + <div className="flex items-start gap-4"> |
| 20 | + <div className="flex-shrink-0"> |
| 21 | + <MiniPreview |
| 22 | + skinColor={character.skinColor} |
| 23 | + hairColor={character.hairColor} |
| 24 | + eyeColor={character.eyeColor} |
| 25 | + faceShape={character.faceShape} |
| 26 | + hairStyle={character.hairStyle} |
| 27 | + /> |
| 28 | + </div> |
| 29 | + |
| 30 | + <div className="flex-1 min-w-0"> |
| 31 | + <p className="text-cream-100 font-semibold truncate group-hover:text-gold-300 transition-colors"> |
| 32 | + {character.name} |
| 33 | + </p> |
| 34 | + |
| 35 | + <div className="flex items-center gap-1.5 mt-1"> |
| 36 | + {CLASS_ICONS[character.className] && ( |
| 37 | + <span className="w-4 h-4 text-gold-400 flex-shrink-0" aria-hidden="true"> |
| 38 | + {CLASS_ICONS[character.className]} |
| 39 | + </span> |
| 40 | + )} |
| 41 | + <span className="text-sm text-cream-400">{character.className}</span> |
| 42 | + </div> |
| 43 | + |
| 44 | + <p className="text-xs text-cream-500 mt-2 truncate"> |
| 45 | + par <span className="text-cream-300">{character.authorPseudo}</span> |
| 46 | + </p> |
| 47 | + |
| 48 | + <time |
| 49 | + dateTime={character.createdAt} |
| 50 | + className="text-xs text-cream-600 mt-1 block" |
| 51 | + > |
| 52 | + {formatRelativeDate(character.createdAt)} |
| 53 | + </time> |
| 54 | + </div> |
| 55 | + </div> |
| 56 | + </Link> |
| 57 | + ); |
| 58 | +}); |
0 commit comments