/* All effects are local to a card and run once per reveal. */
.bounty-card [hidden] { display: none !important; }
.card-tilt {
  transform: rotateX(var(--tilt-x, 0deg)) rotateY(var(--tilt-y, 0deg));
  transition: transform 250ms cubic-bezier(.2,.75,.25,1);
  transform-style: preserve-3d;
}
.burst-layer {
  position: absolute;
  inset: 0;
  pointer-events: none;
  z-index: 8;
}
.reveal-spark {
  position: absolute;
  top: 49%;
  left: 50%;
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: #ffead5;
  box-shadow: 0 0 9px 2px rgb(255 208 184 / 45%);
}
.reveal-spark--star {
  width: 10px;
  height: 10px;
  border-radius: 0;
  background: #fff2de;
  clip-path: polygon(50% 0, 60% 40%, 100% 50%, 60% 60%, 50% 100%, 40% 60%, 0 50%, 40% 40%);
}
.bounty-card[data-state="charging"] .card-halo {
  animation: bounty-charge 600ms cubic-bezier(.4,0,.8,1) both;
}
.bounty-card[data-state="charging"] .card-tilt {
  transform: translateY(-8px) scale(1.025) rotateZ(-.6deg) rotateX(2deg) rotateY(-1deg);
  transition: transform 600ms cubic-bezier(.2,.75,.25,1);
}
.bounty-card[data-state="charging"] .card-back::after {
  animation: bounty-foil 600ms cubic-bezier(.25,.6,.4,1) both;
}
.bounty-card[data-state="revealing"] .card-tilt {
  animation: bounty-settle 780ms cubic-bezier(.15,.7,.25,1) backwards;
}
.bounty-card[data-state="revealing"] .card-halo {
  animation: bounty-bloom 850ms cubic-bezier(.15,.6,.25,1) both;
}
.bounty-card[data-state="revealed"] .reward-slip {
  animation: reward-arrive 460ms cubic-bezier(.2,.7,.2,1) backwards;
}
.bounty-card[data-state="charging"] .reveal-label {
  animation: reveal-label-fade 220ms ease both;
}
[data-revealed-heading]:focus-visible,
.reward-slip h2:focus-visible,
.reward-slip h3:focus-visible {
  outline: 2px solid #ff8cbd;
  outline-offset: 7px;
  border-radius: 4px;
}
@keyframes bounty-charge {
  from { opacity: .12; transform: scale(.88); }
  to { opacity: .72; transform: scale(1.08); }
}
@keyframes bounty-foil {
  from { transform: translateX(-110%); }
  to { transform: translateX(110%); }
}
@keyframes bounty-settle {
  from { transform: translateY(-8px) scale(1.025) rotateZ(-.6deg) rotateX(2deg) rotateY(-1deg); }
  to { transform: translateY(0) scale(1) rotateZ(0) rotateX(0) rotateY(0); }
}
@keyframes bounty-bloom {
  0% { opacity: .72; transform: scale(1.08); }
  42% { opacity: .5; transform: scale(1.18); }
  100% { opacity: .18; transform: scale(1); }
}
@keyframes reward-arrive {
  from { opacity: 0; transform: translateY(12px); }
  to { opacity: 1; transform: translateY(0); }
}
@keyframes reveal-label-fade {
  from { opacity: 1; }
  to { opacity: .65; }
}
@media (prefers-reduced-motion: reduce) {
  .card-tilt,
  .bounty-card .card-back::after,
  .bounty-card .card-rotor,
  .bounty-card .card-halo,
  .bounty-card .reward-slip,
  .bounty-card .reveal-label {
    animation: none !important;
    transition: none !important;
  }
  .card-tilt { transform: none; }
  .burst-layer { display: none; }
}
