/* La Taverne · la table, le gobelet et les dés (lot C, contrat SPEC §4.4).
 *
 * Ce que porte cette feuille, et pourquoi :
 *   - le BOIS est une photo de planches (img/bois.webp), posée en planches
 *     horizontales et répétée à l'échelle des dés ; la flaque de lumière de
 *     la chandelle et un vignettage doux passent par-dessus ;
 *   - le GOBELET est un objet photographié (trois vues du même cuir, à la même
 *     échelle : debout, incliné, couché) ; au repos seule la vue debout se
 *     voit, le geste de lancer les fait passer de l'une à l'autre (table.js) ;
 *   - la scène est TOUJOURS sombre (une table à la chandelle), quel que soit
 *     le thème des menus ;
 *   - les dés sont des cubes CSS : chaque cube est son propre contexte 3D
 *     (sa matrice, posée par table.js, contient déjà la caméra). Aucun
 *     ancêtre du cube ne doit porter filter, opacity < 1 ou overflow:hidden
 *     DANS la chaîne 3D : seul le cube est en preserve-3d, et la table rogne
 *     au-dessus de lui, hors de cette chaîne (piège Safari) ;
 *   - transform et opacity seulement en mouvement ; will-change n'est posé
 *     que pendant le mouvement (.is-anime).
 *
 * Les jetons --tv-* de la spécification sont déclarés par style.css ; ils
 * sont lus ici AVEC un repli, pour que la table se dessine seule (accueil,
 * banc d'essai). Les jetons propres à la table sont déclarés ci-dessous.
 */

.tv-table {
  --tv-t-bois-1: var(--tv-bois-1, #3d2717);
  --tv-t-bois-2: var(--tv-bois-2, #2b1a0f);
  --tv-t-bois-3: var(--tv-bois-3, #4c301c);
  --tv-t-chandelle: var(--tv-chandelle, rgba(255, 176, 82, .20));
  --tv-t-selection: var(--tv-selection, #e8b75c);
  --tv-t-ink: var(--tv-scene-ink, #f3e6cf);
  --tv-t-ink-2: var(--tv-scene-ink-2, #cdb995);
  --tv-t-fond: var(--tv-scene-bg, #120d09);
  --tv-t-ui: var(--tv-ui, 'Inter Tight', system-ui, -apple-system, sans-serif);
  /* posés par table.js à chaque mesure ; valeurs de départ pour le premier rendu */
  --de-s: 46px;
  --de-h: 23px;
  --de-cible: 60px;
  --de-ombre: 69px;
  --de-anneau: 75px;
  --tv-tuile: 26px;
  --tv-gobelet: 86px;
  --tv-planche: 175px;
  --tv-bois-x: 0px;
  --tv-bois-y: 0px;

  position: relative;
  width: 100%;
  height: 100%;
  min-height: 160px;
  overflow: hidden;
  isolation: isolate;
  contain: layout paint;
  background: var(--tv-t-bois-2);
  color: var(--tv-t-ink);
  touch-action: manipulation;
  -webkit-tap-highlight-color: transparent;
  -webkit-user-select: none;
  user-select: none;
  -webkit-touch-callout: none;
}

.tv-monde {
  position: absolute;
  inset: 0;
}

/* ---------------------------------------------------------------- le bois */

.tv-plateau {
  position: absolute;
  left: 0;
  top: 0;
  transform-origin: 0 0;
  pointer-events: none;
  background-color: var(--tv-t-bois-2);
  /* Le bois est une PHOTO de planches (img/bois.webp, quatre planches,
     raccordable dans les deux sens), posée en planches horizontales,
     parallèles au bord du joueur. Une planche fait environ trois côtés et
     demi de dé : --tv-planche est posé par table.js à chaque mesure, et la
     tuile en porte quatre. Par-dessus, dans le plan de la table (donc vue en
     perspective comme le bois) : la flaque de lumière de la chandelle et
     l'usure du milieu. Le voile de la pièce (.tv-voile) passe ensuite. */
  background-image:
    radial-gradient(ellipse 52% 44% at 30% 26%, rgba(255, 190, 110, .2), rgba(255, 160, 70, .06) 48%, rgba(255, 150, 60, 0) 72%),
    radial-gradient(ellipse 30% 26% at 52% 54%, rgba(214, 160, 104, .08), rgba(214, 160, 104, 0) 70%),
    url("img/bois.webp");
  background-size:
    100% 100%, 100% 100%,
    calc(var(--tv-planche) * 4 * 1254 / 926) calc(var(--tv-planche) * 4);
  background-position: 0 0, 0 0, var(--tv-bois-x) var(--tv-bois-y);
  background-repeat: no-repeat, no-repeat, repeat;
}

/* La lumière et l'ombre de la pièce, à plat sur l'écran : la chandelle tombe
   d'en haut à gauche, les coins s'enfoncent dans la nuit. */
.tv-voile {
  position: absolute;
  inset: 0;
  z-index: 3;
  pointer-events: none;
  background:
    radial-gradient(ellipse 85% 70% at 22% 10%, var(--tv-t-chandelle), rgba(255, 176, 82, 0) 62%),
    radial-gradient(ellipse 120% 95% at 46% 42%, rgba(10, 6, 3, 0) 48%, rgba(10, 6, 3, .34) 78%, rgba(6, 3, 1, .62) 100%);
}

/* ---------------------------------------------------------------- le sol : ombres et anneaux */

.tv-sol,
.tv-des {
  position: absolute;
  inset: 0;
  pointer-events: none;
}

.tv-ombre {
  position: absolute;
  left: 0;
  top: 0;
  width: var(--de-ombre);
  height: var(--de-ombre);
  transform-origin: 0 0;
  border-radius: 50%;
  background: radial-gradient(closest-side, rgba(6, 3, 1, .82), rgba(6, 3, 1, .55) 42%, rgba(6, 3, 1, .18) 74%, rgba(6, 3, 1, 0));
}

.tv-anneau {
  position: absolute;
  left: 0;
  top: 0;
  width: var(--de-anneau);
  height: var(--de-anneau);
  transform-origin: 0 0;
}
.tv-anneau-trait {
  position: absolute;
  inset: 0;
  border-radius: 50%;
  opacity: 0;
  transform: scale(.82);
  transition: opacity var(--tv-dur-s, 240ms) var(--tv-ease-out, cubic-bezier(.2, .7, .2, 1)),
              transform var(--tv-dur-s, 240ms) var(--tv-ease-out, cubic-bezier(.2, .7, .2, 1));
}
/* l'aide : un liseré discret sous les dés qui peuvent marquer */
.tv-anneau.is-aide .tv-anneau-trait {
  opacity: .55;
  transform: scale(.9);
  border: 1.5px dashed rgba(232, 183, 92, .7);
}
/* la sélection : l'anneau doré posé sur la table, comme une pièce de lumière */
.tv-anneau.is-choisi .tv-anneau-trait {
  opacity: 1;
  transform: scale(1);
  border: 2.5px solid var(--tv-t-selection);
  box-shadow: 0 0 14px rgba(232, 183, 92, .55), inset 0 0 12px rgba(232, 183, 92, .38);
  background: radial-gradient(closest-side, rgba(232, 183, 92, .16), rgba(232, 183, 92, 0) 80%);
}
/* le focus clavier : un second cercle, clair, qui ne se confond pas avec la sélection */
.tv-anneau.is-focus::after {
  content: "";
  position: absolute;
  inset: -7%;
  border-radius: 50%;
  border: 2px solid var(--tv-t-ink);
  opacity: .9;
}

/* ---------------------------------------------------------------- les dés */

.de {
  position: absolute;
  left: 0;
  top: 0;
  width: var(--de-cible);
  height: var(--de-cible);
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 50%;
  background: transparent;
  color: inherit;
  font: inherit;
  -webkit-appearance: none;
  appearance: none;
  pointer-events: none;
  -webkit-tap-highlight-color: transparent;
}
button.de {
  pointer-events: auto;
  cursor: pointer;
  outline: none;
}
.tv-table.is-verrou button.de { cursor: default; }
.de[hidden],
.tv-ombre[hidden],
.tv-anneau[hidden],
.tv-rangee[hidden] { display: none; }

.de-cube {
  position: absolute;
  left: 0;
  top: 0;
  width: var(--de-s);
  height: var(--de-s);
  transform-origin: 0 0;
  -webkit-transform-style: preserve-3d;
  transform-style: preserve-3d;
  pointer-events: none;
}
.tv-table.is-anime .de-cube,
.tv-table.is-anime .tv-ombre { will-change: transform; }

/* le cœur : trois plans intérieurs couleur d'arête, qu'on aperçoit aux coins
   arrondis des faces. C'est ce qui donne au cube ses arêtes douces. */
.de-coeur {
  position: absolute;
  left: .5%;
  top: .5%;
  width: 99%;
  height: 99%;
  background: var(--de-arete, #b99a66);
  box-shadow: inset 0 0 calc(var(--de-s) * .2) rgba(0, 0, 0, .35);
}
.de-coeur-x { transform: rotateY(90deg); }
.de-coeur-y { transform: rotateX(90deg); }

.de-face {
  position: absolute;
  inset: 0;
  overflow: hidden;
  border-radius: 17%;
  background-color: var(--de-face, #e7d3aa);
  background-image:
    linear-gradient(135deg, rgba(255, 255, 255, .20), rgba(255, 255, 255, 0) 42%, rgba(0, 0, 0, 0) 62%, rgba(0, 0, 0, .10));
  box-shadow:
    inset 0 0 0 calc(var(--de-s) * .012) rgba(0, 0, 0, .10),
    inset 0 0 calc(var(--de-s) * .13) var(--de-arete, #b99a66);
  -webkit-backface-visibility: hidden;
  backface-visibility: hidden;
}
.de-cube .de-face[data-f="1"] { transform: translateZ(var(--de-h)); }
.de-cube .de-face[data-f="6"] { transform: rotateX(180deg) translateZ(var(--de-h)); }
.de-cube .de-face[data-f="2"] { transform: rotateX(90deg) translateZ(var(--de-h)); }
.de-cube .de-face[data-f="5"] { transform: rotateX(-90deg) translateZ(var(--de-h)); }
.de-cube .de-face[data-f="3"] { transform: rotateY(90deg) translateZ(var(--de-h)); }
.de-cube .de-face[data-f="4"] { transform: rotateY(-90deg) translateZ(var(--de-h)); }

/* l'ombrage dynamique : table.js règle son opacité selon l'orientation de la
   face vers la chandelle */
.de-lum {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: #140b04;
  opacity: .2;
  pointer-events: none;
}
/* l'éclat : la chandelle qui se reflète sur la face tournée vers elle */
.de-reflet {
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: radial-gradient(ellipse 70% 60% at 34% 30%, rgba(255, 236, 205, .95), rgba(255, 220, 170, .35) 38%, rgba(255, 220, 170, 0) 70%);
  opacity: 0;
  pointer-events: none;
}
/* les dés ternis d'un jet sans combinaison (couvre aussi les points) */
.de-face::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: inherit;
  background: linear-gradient(160deg, rgba(58, 48, 40, .62), rgba(30, 24, 20, .7));
  opacity: 0;
  transition: opacity 420ms var(--tv-ease-out, cubic-bezier(.2, .7, .2, 1));
}
.de.is-terni .de-face::after { opacity: 1; }
/* l'aide : un liseré chaud sur les dés qui peuvent marquer */
.de.is-marquant .de-face {
  box-shadow:
    inset 0 0 0 calc(var(--de-s) * .04) rgba(232, 183, 92, .62),
    inset 0 0 calc(var(--de-s) * .13) var(--de-arete, #b99a66);
}

/* les points : de petits creux gravés. Tout est en dégradé (le flanc
   haut-gauche du creux dans l'ombre, le fond éclairé en bas à droite) : une
   ombre portée en box-shadow, rastérisée dans le calque 3D du dé, crénelait
   le bord des points clairs. */
.pip {
  position: absolute;
  width: 20%;
  height: 20%;
  border-radius: 50%;
  background:
    radial-gradient(circle at 60% 64%, rgba(0, 0, 0, 0) 0 46%, rgba(0, 0, 0, .34) 60%, rgba(0, 0, 0, .62) 78%),
    radial-gradient(circle at 64% 70%, rgba(255, 255, 255, .14), rgba(255, 255, 255, 0) 40%),
    var(--de-pip, #2a1c10);
}
.pip.p-hg { left: 17%; top: 17%; }
.pip.p-hd { left: 63%; top: 17%; }
.pip.p-mg { left: 17%; top: 40%; }
.pip.p-md { left: 63%; top: 40%; }
.pip.p-c  { left: 40%; top: 40%; }
.pip.p-bg { left: 17%; top: 63%; }
.pip.p-bd { left: 63%; top: 63%; }
.de-face[data-f="1"] .pip { width: 25%; height: 25%; left: 37.5%; top: 37.5%; }

.de-diable {
  position: absolute;
  left: 9%;
  top: 8%;
  width: 82%;
  height: 82%;
  filter: none;
}

/* ---- les matières (une par sorte de dé, d'après des.json) ---- */

/* buis : un fil de bois pâle, très fin */
[data-matiere="ordinaire"] .de-face {
  background-image:
    repeating-linear-gradient(97deg, rgba(120, 78, 30, 0) 0 5px, rgba(120, 78, 30, .07) 5px 6px, rgba(120, 78, 30, 0) 6px 11px),
    linear-gradient(135deg, rgba(255, 255, 255, .22), rgba(255, 255, 255, 0) 42%, rgba(0, 0, 0, 0) 62%, rgba(0, 0, 0, .10));
}
/* os poli : une nacre laiteuse, quelques taches */
[data-matiere="porte-bonheur"] .de-face {
  background-image:
    radial-gradient(circle at 28% 22%, rgba(255, 255, 255, .5), rgba(255, 255, 255, 0) 38%),
    radial-gradient(ellipse 30% 18% at 72% 78%, rgba(150, 120, 80, .13), rgba(150, 120, 80, 0) 70%),
    linear-gradient(135deg, rgba(255, 255, 255, .14), rgba(0, 0, 0, .08));
}
/* cuivre martelé : des facettes qui attrapent la lumière, un éclat métallique */
[data-matiere="cuivre"] .de-face {
  background-image:
    radial-gradient(circle at 22% 28%, rgba(255, 214, 170, .42) 0 7%, rgba(255, 214, 170, 0) 13%),
    radial-gradient(circle at 58% 18%, rgba(255, 214, 170, .30) 0 6%, rgba(255, 214, 170, 0) 12%),
    radial-gradient(circle at 80% 56%, rgba(255, 214, 170, .26) 0 7%, rgba(255, 214, 170, 0) 13%),
    radial-gradient(circle at 34% 74%, rgba(255, 214, 170, .30) 0 6%, rgba(255, 214, 170, 0) 12%),
    radial-gradient(circle at 62% 86%, rgba(70, 25, 5, .30) 0 6%, rgba(70, 25, 5, 0) 12%),
    linear-gradient(140deg, rgba(255, 226, 190, .38), rgba(255, 226, 190, 0) 38%, rgba(60, 20, 0, 0) 55%, rgba(60, 20, 0, .32));
}
/* merisier : un fil rouge sombre */
[data-matiere="pelerin"] .de-face {
  background-image:
    repeating-linear-gradient(94deg, rgba(40, 8, 2, 0) 0 4px, rgba(40, 8, 2, .14) 4px 5px, rgba(40, 8, 2, 0) 5px 9px),
    linear-gradient(135deg, rgba(255, 220, 200, .18), rgba(255, 255, 255, 0) 45%, rgba(0, 0, 0, .16));
}
/* ambre : une lueur prise au cœur de la matière */
[data-matiere="ambre"] .de-face {
  background-image:
    radial-gradient(circle at 42% 38%, rgba(255, 236, 170, .62), rgba(255, 200, 90, .18) 42%, rgba(120, 58, 0, .32) 100%);
}
/* plomb : un métal mat et froid */
[data-matiere="leste"] .de-face {
  background-image:
    linear-gradient(160deg, rgba(255, 255, 255, .24), rgba(255, 255, 255, 0) 44%, rgba(0, 0, 0, .22)),
    repeating-linear-gradient(35deg, rgba(255, 255, 255, 0) 0 3px, rgba(255, 255, 255, .03) 3px 4px);
}
/* ébène : un noir veiné */
[data-matiere="diable"] .de-face {
  background-image:
    repeating-linear-gradient(86deg, rgba(255, 236, 210, 0) 0 4px, rgba(255, 236, 210, .045) 4px 5px, rgba(255, 236, 210, 0) 5px 10px),
    linear-gradient(135deg, rgba(255, 240, 220, .14), rgba(255, 255, 255, 0) 40%, rgba(0, 0, 0, .3));
}

/* la face du diable : une lueur braise au creux de la face, qui la distingue
   d'un 1 ordinaire même quand le dé est vu de biais */
.de-face.is-joker { box-shadow: inset 0 0 calc(var(--de-h) * .7) rgba(170, 52, 24, .38); }

/* ---------------------------------------------------------------- le gobelet de cuir

   Trois photos du même gobelet, à la même échelle (une seule unité,
   --gob-px : un pixel de la photo) : debout (vu en plongée), incliné et
   couché (l'ouverture vers la droite et un peu vers nous). La boîte
   .tv-gobelet reste celle de la géométrie (dc × 0,9 dc, centrée sur le
   gobelet de la physique) ; la vue debout y est posée sur la table, son pied
   au bas de la boîte. Les vues inclinée et couchée ne paraissent que pendant
   le geste de lancer : table.js les amène alors sur la trajectoire (WAAPI,
   sans rien laisser derrière lui) et règle leur point de pivot. Côté « moi »
   (le coin bas-droit, les dés partent vers le haut-gauche), elles sont
   retournées pour que l'ouverture regarde la table. */

.tv-gobelet {
  --gob-echelle: 1;
  --gob-px: calc(var(--tv-gobelet) * .96 * var(--gob-echelle) / 368);
  --gob-sol: .86;
  position: absolute;
  left: 0;
  top: 0;
  z-index: 1;
  width: var(--tv-gobelet);
  height: calc(var(--tv-gobelet) * .9);
  pointer-events: none;
}
/* le gobelet d'en face, au bord du haut : un peu plus petit (il est plus
   loin), et posé plus bas dans sa boîte, sans quoi sa lèvre passerait
   au-dessus du bord de la table */
.tv-gobelet[data-qui="lui"] { --gob-echelle: .88; --gob-sol: 1.09; }
.tv-gobelet-anim {
  position: absolute;
  inset: 0;
  transform-origin: 50% 70%;
}
/* l'ombre de contact sous le pied ; la chandelle est en haut à gauche,
   l'ombre déborde donc un peu vers le bas et la droite */
.tv-gobelet-ombre {
  position: absolute;
  left: calc(50% - var(--gob-px) * 168);
  top: calc(var(--tv-gobelet) * var(--gob-sol) - var(--gob-px) * 52);
  width: calc(var(--gob-px) * 340);
  height: calc(var(--gob-px) * 104);
  border-radius: 50%;
  background: radial-gradient(closest-side, rgba(6, 3, 1, .78), rgba(6, 3, 1, .44) 50%, rgba(6, 3, 1, .12) 78%, rgba(6, 3, 1, 0));
  transform: translate(4%, 6%);
  transform-origin: 50% 50%;
}
.tv-gobelet-img {
  position: absolute;
  display: block;
  max-width: none;
  height: auto;
  margin: 0;
  pointer-events: none;
  -webkit-user-select: none;
  user-select: none;
  -webkit-user-drag: none;
}
.tv-gobelet-debout {
  width: calc(var(--gob-px) * 368);
  aspect-ratio: 368 / 470;
  left: calc(50% - var(--gob-px) * 186);
  top: calc(var(--tv-gobelet) * var(--gob-sol) - var(--gob-px) * 462);
}
.tv-gobelet-incline,
.tv-gobelet-couche {
  left: calc(50% - var(--gob-px) * 240);
  top: calc(var(--tv-gobelet) * .45 - var(--gob-px) * 210);
  opacity: 0;
}
.tv-gobelet-incline { width: calc(var(--gob-px) * 489); aspect-ratio: 489 / 434; }
.tv-gobelet-couche { width: calc(var(--gob-px) * 478); aspect-ratio: 478 / 351; }
.tv-gobelet[data-qui="moi"] .tv-gobelet-incline,
.tv-gobelet[data-qui="moi"] .tv-gobelet-couche { transform: scaleX(-1); }
/* l'éclat des six dés : un anneau d'or qui s'ouvre au-dessus de l'ouverture */
.tv-gobelet-eclat {
  position: absolute;
  left: calc(50% - var(--gob-px) * 202);
  top: calc(var(--tv-gobelet) * var(--gob-sol) - var(--gob-px) * 477);
  width: calc(var(--gob-px) * 404);
  height: calc(var(--gob-px) * 290);
  border-radius: 50%;
  opacity: 0;
  border: 2px solid var(--tv-t-selection);
  box-shadow: 0 0 22px rgba(232, 183, 92, .6), inset 0 0 18px rgba(232, 183, 92, .45);
}

/* ---------------------------------------------------------------- les rangées de dés mis de côté */

.tv-rangee {
  position: absolute;
  z-index: 2;
  display: flex;
  align-items: flex-end;
  gap: calc(var(--tv-tuile) * .42);
  min-height: calc(var(--tv-tuile) + 18px);
  overflow: hidden;
  pointer-events: none;
}
.tv-rangee[data-qui="lui"] { justify-content: flex-end; }
.tv-groupe {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  min-width: 0;
}
.tv-groupe-des {
  display: flex;
  gap: calc(var(--tv-tuile) * .12);
}
.tv-groupe-lib {
  max-width: 100%;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-family: var(--tv-t-ui);
  font-weight: 600;
  font-synthesis: none;
  font-size: 12px;
  line-height: 1.1;
  letter-spacing: 0;
  color: var(--tv-t-ink-2);
  text-shadow: 0 1px 2px rgba(0, 0, 0, .7);
  font-variant-numeric: tabular-nums;
}
.tv-tuile {
  --de-s: var(--tv-tuile);
  position: relative;
  width: var(--tv-tuile);
  height: var(--tv-tuile);
  border-radius: 17%;
  /* l'épaisseur du dé, vue du dessus et un peu de face */
  box-shadow: 0 calc(var(--tv-tuile) * .1) 0 var(--de-arete, #b99a66),
              0 calc(var(--tv-tuile) * .16) calc(var(--tv-tuile) * .18) rgba(0, 0, 0, .55);
  transition: opacity 90ms linear;
}
.tv-tuile .de-face { box-shadow: inset 0 0 calc(var(--tv-tuile) * .1) var(--de-arete, #b99a66); }

/* ---------------------------------------------------------------- la miniature et l'aperçu */

.tv-mini {
  display: inline-block;
  flex: none;
  vertical-align: middle;
}

.tv-apercu {
  --de-s: 96px;
  --de-h: 48px;
  position: relative;
  width: 100%;
  height: 100%;
  min-height: 180px;
}
.tv-apercu-de {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: var(--tv-rayon-l, 14px);
  background: transparent;
  color: inherit;
  cursor: grab;
  touch-action: none;
  -webkit-tap-highlight-color: transparent;
  -webkit-appearance: none;
  appearance: none;
}
.tv-apercu-de:active { cursor: grabbing; }
.tv-apercu-de:focus-visible {
  outline: 2px solid var(--tv-accent, #b4652a);
  outline-offset: 2px;
}
.tv-apercu-de .de-cube { left: 0; top: 0; }
.tv-apercu.is-anime .de-cube { will-change: transform; }
.tv-apercu-ombre {
  position: absolute;
  left: 50%;
  top: calc(50% + var(--de-s) * .62);
  width: calc(var(--de-s) * 1.3);
  height: calc(var(--de-s) * .32);
  border-radius: 50%;
  transform: translate(-50%, 0);
  background: radial-gradient(closest-side, rgba(10, 6, 2, .5), rgba(10, 6, 2, 0));
  pointer-events: none;
}
.tv-apercu-annonce {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

/* ---------------------------------------------------------------- confort tactile et mouvement */

@media (prefers-reduced-motion: reduce) {
  .tv-anneau-trait,
  .de-face::after,
  .tv-tuile { transition-duration: .01ms; }
}

@media (hover: hover) and (pointer: fine) {
  .tv-anneau.is-survol .tv-anneau-trait {
    opacity: .5;
    transform: scale(.94);
    border: 1.5px solid rgba(243, 230, 207, .55);
  }
  .tv-anneau.is-survol.is-choisi .tv-anneau-trait {
    opacity: 1;
    transform: scale(1);
    border: 2.5px solid var(--tv-t-selection);
  }
}

@media (hover: none) {
  .tv-apercu-de:active { cursor: default; }
}
