/* ═══════════════════════════════════════════════════════════════════
 *  pieces.css — Polish visuel des pièces (Phase B)
 *
 *  Ce fichier cohabite avec le dessin canvas (js/board.js) :
 *    - L'ombre portée est rendue CÔTÉ CANVAS (shadowBlur / shadowColor),
 *      en lisant `--piece-shadow-*` via getComputedStyle. Rien ici ne
 *      dessine une ombre — cette CSS sert de SOURCE DE VÉRITÉ pour les
 *      tokens et d'emplacement dédié aux futurs polish purement DOM.
 *    - L'idle-float de la pièce sélectionnée est également JS-side
 *      (sin() sur le décalage Y d'une seule pièce) parce qu'un canvas
 *      ne peut pas animer UNE pièce via CSS — l'animation CSS sur le
 *      <canvas> bougerait le plateau entier.
 *
 *  Keyframe `fx-idle-float` : réservé pour un futur usage DOM (ex :
 *  prévisualisation des pièces dans les modales de draft / placement).
 *  Amplitude : ±2 px, période 6 s, easing "respirant". Le keyframe ne
 *  s'active sur AUCUN élément tant qu'une classe `.fx-idle-float` n'y
 *  est pas appliquée, donc le coût CPU est nul en Phase B.
 *
 *  `prefers-reduced-motion` : la règle globale de `_base.css` remet les
 *  animations à ~0 ms → ce keyframe est implicitement désactivé sans
 *  code supplémentaire ici. Côté JS, gameScreen lit aussi la media query
 *  pour geler le décalage canvas à 0 px.
 * ═══════════════════════════════════════════════════════════════════ */

@keyframes fx-idle-float {
    0%   { transform: translateY(0); }
    50%  { transform: translateY(-2px); }
    100% { transform: translateY(0); }
}

/* Classe d'opt-in pour les futurs usages DOM (modales, picker, etc.).
 * Inutilisée en Phase B côté jeu, exposée pour rester cohérent avec le
 * token `fx-*` du système d'effets procéduraux. */
.fx-idle-float {
    animation: fx-idle-float 6s var(--ease-out, ease-in-out) infinite;
    will-change: transform;
}
