/* GENERATED by tool/hero_rally.mjs (via tool/gen_legal_web.mjs) — do not edit.
   The hero rally's motion: ball, tracking box, shadow, comet tail, impacts,
   bounce rings and hit flashes, sampled from ballistic arcs over a regulation
   table and net. Colours and strokes live in styles.css. The base rules are
   the resting frame (ball on the far bounce, everything marked); the
   animations only run when motion is welcome. */

.rally .rl-ball,
.rally .rl-box { transform: translate(258.8px, 70.1px) scale(4.846); }
.rally .rl-shadow { transform: translate(258.8px, 70.1px) scale(5.331, 2.239); opacity: 0.85; }
.rally .rl-tail { stroke-dasharray: 46 1009.7; stroke-dashoffset: -640.5; }
.rally .rl-ring-near,
.rally .rl-hit { opacity: 0; }

@media (prefers-reduced-motion: no-preference) {
  .rally .rl-ball,
  .rally .rl-box { animation: rl-ball 3.245s linear infinite; }
  .rally .rl-shadow { animation: rl-shadow 3.245s linear infinite; }
  .rally .rl-tail { animation: rl-tail 3.245s linear infinite; }
  .rally .rl-dot-far { animation: rl-dot-far 3.245s linear infinite; }
  .rally .rl-dot-near { animation: rl-dot-near 3.245s linear infinite; }
  .rally .rl-ring-far { animation: rl-ring-far 3.245s linear infinite; }
  .rally .rl-ring-near { animation: rl-ring-near 3.245s linear infinite; }
  .rally .rl-hit-near { animation: rl-hit-near 3.245s linear infinite; }
  .rally .rl-hit-far { animation: rl-hit-far 3.245s linear infinite; }
}

@keyframes rl-ball {
  0% { transform: translate(150px, 190.7px) scale(11.671); }
  1.412% { transform: translate(159.8px, 166.3px) scale(11.123); }
  2.825% { transform: translate(168.7px, 145.2px) scale(10.616); }
  4.237% { transform: translate(176.9px, 127px) scale(10.147); }
  5.65% { transform: translate(184.4px, 111.3px) scale(9.71); }
  7.062% { transform: translate(191.3px, 98px) scale(9.303); }
  8.475% { transform: translate(197.7px, 86.7px) scale(8.924); }
  9.887% { transform: translate(203.6px, 77.2px) scale(8.569); }
  11.299% { transform: translate(209px, 69.3px) scale(8.236); }
  12.712% { transform: translate(214.1px, 62.9px) scale(7.924); }
  14.124% { transform: translate(218.7px, 57.8px) scale(7.631); }
  15.537% { transform: translate(223.1px, 53.9px) scale(7.355); }
  16.949% { transform: translate(227.1px, 51px) scale(7.094); }
  18.362% { transform: translate(230.8px, 49.1px) scale(6.848); }
  19.774% { transform: translate(234.3px, 48px) scale(6.616); }
  21.186% { transform: translate(237.6px, 47.8px) scale(6.396); }
  22.599% { transform: translate(240.6px, 48.2px) scale(6.187); }
  24.011% { transform: translate(243.5px, 49.2px) scale(5.989); }
  25.424% { transform: translate(246.1px, 50.9px) scale(5.801); }
  26.836% { transform: translate(248.6px, 53px) scale(5.622); }
  28.249% { transform: translate(250.9px, 55.7px) scale(5.452); }
  29.661% { transform: translate(253.1px, 58.7px) scale(5.29); }
  31.073% { transform: translate(255.1px, 62.2px) scale(5.135); }
  32.486% { transform: translate(257px, 65.9px) scale(4.987); }
  33.898% { transform: translate(258.8px, 70.1px) scale(4.846); }
  35.311% { transform: translate(257px, 62.2px) scale(4.779); }
  36.723% { transform: translate(255.3px, 55px) scale(4.712); }
  38.136% { transform: translate(253.7px, 48.5px) scale(4.645); }
  39.548% { transform: translate(252px, 42.8px) scale(4.578); }
  40.96% { transform: translate(250.5px, 37.7px) scale(4.512); }
  42.373% { transform: translate(248.9px, 33.2px) scale(4.447); }
  43.785% { transform: translate(247.4px, 29.4px) scale(4.382); }
  45.198% { transform: translate(245.9px, 26.2px) scale(4.317); }
  46.61% { transform: translate(244.5px, 23.5px) scale(4.254); }
  48.023% { transform: translate(243px, 21.4px) scale(4.19); }
  49.435% { transform: translate(241.7px, 19.8px) scale(4.128); }
  50.847% { transform: translate(240.3px, 18.7px) scale(4.066); }
  52.26% { transform: translate(239px, 16.2px) scale(4.162); }
  53.672% { transform: translate(237.6px, 14.1px) scale(4.261); }
  55.085% { transform: translate(236.1px, 12.4px) scale(4.364); }
  56.497% { transform: translate(234.5px, 11.2px) scale(4.471); }
  57.91% { transform: translate(232.9px, 10.3px) scale(4.581); }
  59.322% { transform: translate(231.2px, 10px) scale(4.696); }
  60.734% { transform: translate(229.3px, 10.2px) scale(4.814); }
  62.147% { transform: translate(227.4px, 11px) scale(4.938); }
  63.559% { transform: translate(225.4px, 12.3px) scale(5.065); }
  64.972% { transform: translate(223.2px, 14.4px) scale(5.198); }
  66.384% { transform: translate(221px, 17.1px) scale(5.336); }
  67.797% { transform: translate(218.6px, 20.6px) scale(5.479); }
  69.209% { transform: translate(216.1px, 25px) scale(5.628); }
  70.621% { transform: translate(213.5px, 30.2px) scale(5.783); }
  72.034% { transform: translate(210.7px, 36.4px) scale(5.945); }
  73.446% { transform: translate(207.8px, 43.6px) scale(6.113); }
  74.859% { transform: translate(204.7px, 52px) scale(6.287); }
  76.271% { transform: translate(201.4px, 61.5px) scale(6.47); }
  77.684% { transform: translate(197.9px, 72.3px) scale(6.66); }
  79.096% { transform: translate(194.3px, 84.6px) scale(6.858); }
  80.508% { transform: translate(190.4px, 98.3px) scale(7.065); }
  81.921% { transform: translate(186.3px, 113.7px) scale(7.281); }
  83.333% { transform: translate(182px, 130.8px) scale(7.506); }
  84.746% { transform: translate(177.4px, 149.8px) scale(7.742); }
  86.133% { transform: translate(175.6px, 148.4px) scale(8.008); }
  87.519% { transform: translate(173.7px, 147.7px) scale(8.289); }
  88.906% { transform: translate(171.6px, 147.7px) scale(8.584); }
  90.293% { transform: translate(169.5px, 148.7px) scale(8.897); }
  91.68% { transform: translate(167.2px, 150.7px) scale(9.227); }
  93.066% { transform: translate(164.7px, 153.8px) scale(9.576); }
  94.453% { transform: translate(162.1px, 158.1px) scale(9.946); }
  95.84% { transform: translate(159.4px, 163.8px) scale(10.338); }
  97.227% { transform: translate(156.4px, 171px) scale(10.755); }
  98.613% { transform: translate(153.3px, 179.9px) scale(11.198); }
  100% { transform: translate(150px, 190.7px) scale(11.671); }
}

@keyframes rl-shadow {
  0% { transform: translate(152.7px, 245.7px) scale(16.148, 6.782); opacity: 0; }
  1.412% { transform: translate(162.4px, 229.6px) scale(16.009, 6.724); opacity: 0; }
  2.825% { transform: translate(171.1px, 215.2px) scale(15.813, 6.642); opacity: 0; }
  4.237% { transform: translate(179px, 202px) scale(15.569, 6.539); opacity: 0.191; }
  5.65% { transform: translate(186.3px, 190.1px) scale(15.283, 6.419); opacity: 0.341; }
  7.062% { transform: translate(192.8px, 179.2px) scale(14.96, 6.283); opacity: 0.306; }
  8.475% { transform: translate(198.9px, 169.2px) scale(14.606, 6.134); opacity: 0.278; }
  9.887% { transform: translate(204.5px, 160px) scale(14.222, 5.973); opacity: 0.256; }
  11.299% { transform: translate(209.6px, 151.5px) scale(13.814, 5.802); opacity: 0.24; }
  12.712% { transform: translate(214.4px, 143.6px) scale(13.384, 5.621); opacity: 0.231; }
  14.124% { transform: translate(218.8px, 136.2px) scale(12.934, 5.432); opacity: 0.228; }
  15.537% { transform: translate(222.9px, 129.4px) scale(12.466, 5.236); opacity: 0.231; }
  16.949% { transform: translate(226.8px, 123px) scale(11.981, 5.032); opacity: 0.241; }
  18.362% { transform: translate(230.4px, 117.1px) scale(11.483, 4.823); opacity: 0.257; }
  19.774% { transform: translate(233.8px, 111.5px) scale(10.971, 4.608); opacity: 0.279; }
  21.186% { transform: translate(236.9px, 106.2px) scale(10.447, 4.388); opacity: 0.308; }
  22.599% { transform: translate(239.9px, 101.2px) scale(9.912, 4.163); opacity: 0.343; }
  24.011% { transform: translate(242.8px, 96.6px) scale(9.367, 3.934); opacity: 0.384; }
  25.424% { transform: translate(245.4px, 92.2px) scale(8.812, 3.701); opacity: 0.432; }
  26.836% { transform: translate(247.9px, 88px) scale(8.25, 3.465); opacity: 0.486; }
  28.249% { transform: translate(250.3px, 84px) scale(7.679, 3.225); opacity: 0.546; }
  29.661% { transform: translate(252.6px, 80.3px) scale(7.102, 2.983); opacity: 0.612; }
  31.073% { transform: translate(254.8px, 76.7px) scale(6.518, 2.737); opacity: 0.685; }
  32.486% { transform: translate(256.8px, 73.3px) scale(5.927, 2.489); opacity: 0.764; }
  33.898% { transform: translate(258.8px, 70.1px) scale(5.331, 2.239); opacity: 0.85; }
  35.311% { transform: translate(256.9px, 67.7px) scale(5.591, 2.348); opacity: 0.783; }
  36.723% { transform: translate(255.1px, 65.5px) scale(5.81, 2.44); opacity: 0.721; }
  38.136% { transform: translate(253.4px, 63.3px) scale(5.989, 2.515); opacity: 0.667; }
  39.548% { transform: translate(251.7px, 61.2px) scale(6.131, 2.575); opacity: 0.618; }
  40.96% { transform: translate(250px, 59.2px) scale(6.238, 2.62); opacity: 0.576; }
  42.373% { transform: translate(248.5px, 57.2px) scale(6.31, 2.65); opacity: 0.54; }
  43.785% { transform: translate(246.9px, 55.3px) scale(6.35, 2.667); opacity: 0.479; }
  45.198% { transform: translate(245.5px, 53.4px) scale(6.36, 2.671); opacity: 0; }
  46.61% { transform: translate(244px, 51.7px) scale(6.34, 2.663); opacity: 0; }
  48.023% { transform: translate(242.6px, 49.9px) scale(6.292, 2.643); opacity: 0; }
  49.435% { transform: translate(241.3px, 48.2px) scale(6.218, 2.611); opacity: 0; }
  50.847% { transform: translate(240px, 46.6px) scale(6.117, 2.569); opacity: 0; }
  52.26% { transform: translate(238.6px, 48.9px) scale(6.496, 2.728); opacity: 0; }
  53.672% { transform: translate(237.2px, 51.2px) scale(6.862, 2.882); opacity: 0; }
  55.085% { transform: translate(235.7px, 53.7px) scale(7.213, 3.03); opacity: 0.038; }
  56.497% { transform: translate(234.1px, 56.3px) scale(7.55, 3.171); opacity: 0.271; }
  57.91% { transform: translate(232.5px, 58.9px) scale(7.871, 3.306); opacity: 0.239; }
  59.322% { transform: translate(230.8px, 61.8px) scale(8.176, 3.434); opacity: 0.215; }
  60.734% { transform: translate(229px, 64.7px) scale(8.462, 3.554); opacity: 0.196; }
  62.147% { transform: translate(227.1px, 67.8px) scale(8.729, 3.666); opacity: 0.184; }
  63.559% { transform: translate(225.2px, 71px) scale(8.975, 3.769); opacity: 0.178; }
  64.972% { transform: translate(223.1px, 74.4px) scale(9.199, 3.863); opacity: 0.179; }
  66.384% { transform: translate(221px, 78px) scale(9.398, 3.947); opacity: 0.186; }
  67.797% { transform: translate(218.7px, 81.7px) scale(9.572, 4.02); opacity: 0.199; }
  69.209% { transform: translate(216.3px, 85.7px) scale(9.718, 4.081); opacity: 0.218; }
  70.621% { transform: translate(213.7px, 89.9px) scale(9.833, 4.13); opacity: 0.244; }
  72.034% { transform: translate(211.1px, 94.3px) scale(9.914, 4.164); opacity: 0.276; }
  73.446% { transform: translate(208.2px, 99px) scale(9.96, 4.183); opacity: 0.315; }
  74.859% { transform: translate(205.2px, 104px) scale(9.966, 4.186); opacity: 0.36; }
  76.271% { transform: translate(202px, 109.3px) scale(9.929, 4.17); opacity: 0.411; }
  77.684% { transform: translate(198.5px, 115px) scale(9.845, 4.135); opacity: 0.468; }
  79.096% { transform: translate(194.9px, 121px) scale(9.708, 4.077); opacity: 0.532; }
  80.508% { transform: translate(191px, 127.4px) scale(9.514, 3.996); opacity: 0.602; }
  81.921% { transform: translate(186.8px, 134.4px) scale(9.255, 3.887); opacity: 0.678; }
  83.333% { transform: translate(182.3px, 141.8px) scale(8.926, 3.749); opacity: 0.761; }
  84.746% { transform: translate(177.4px, 149.8px) scale(8.517, 3.577); opacity: 0.85; }
  86.133% { transform: translate(175.8px, 156px) scale(9.276, 3.896); opacity: 0.792; }
  87.519% { transform: translate(174.1px, 162.6px) scale(10.026, 4.211); opacity: 0.739; }
  88.906% { transform: translate(172.3px, 169.5px) scale(10.765, 4.521); opacity: 0.693; }
  90.293% { transform: translate(170.4px, 176.9px) scale(11.493, 4.827); opacity: 0.653; }
  91.68% { transform: translate(168.4px, 184.8px) scale(12.208, 5.127); opacity: 0.619; }
  93.066% { transform: translate(166.2px, 193.2px) scale(12.909, 5.422); opacity: 0.591; }
  94.453% { transform: translate(163.9px, 202.3px) scale(13.595, 5.71); opacity: 0.271; }
  95.84% { transform: translate(161.4px, 211.9px) scale(14.264, 5.991); opacity: 0; }
  97.227% { transform: translate(158.7px, 222.3px) scale(14.914, 6.264); opacity: 0; }
  98.613% { transform: translate(155.8px, 233.6px) scale(15.543, 6.528); opacity: 0; }
  100% { transform: translate(152.7px, 245.7px) scale(16.148, 6.782); opacity: 0; }
}

@keyframes rl-tail {
  0% { stroke-dashoffset: -435.8; }
  1.412% { stroke-dashoffset: -462.1; }
  2.825% { stroke-dashoffset: -485.1; }
  4.237% { stroke-dashoffset: -505; }
  5.65% { stroke-dashoffset: -522.4; }
  7.062% { stroke-dashoffset: -537.4; }
  8.475% { stroke-dashoffset: -550.4; }
  9.887% { stroke-dashoffset: -561.6; }
  11.299% { stroke-dashoffset: -571.1; }
  12.712% { stroke-dashoffset: -579.3; }
  14.124% { stroke-dashoffset: -586.2; }
  15.537% { stroke-dashoffset: -592; }
  16.949% { stroke-dashoffset: -597; }
  18.362% { stroke-dashoffset: -601.2; }
  19.774% { stroke-dashoffset: -604.8; }
  21.186% { stroke-dashoffset: -608.1; }
  22.599% { stroke-dashoffset: -611.2; }
  24.011% { stroke-dashoffset: -614.2; }
  25.424% { stroke-dashoffset: -617.3; }
  26.836% { stroke-dashoffset: -620.6; }
  28.249% { stroke-dashoffset: -624.1; }
  29.661% { stroke-dashoffset: -627.8; }
  31.073% { stroke-dashoffset: -631.8; }
  32.486% { stroke-dashoffset: -636.1; }
  33.898% { stroke-dashoffset: -640.5; }
  35.311% { stroke-dashoffset: -648.6; }
  36.723% { stroke-dashoffset: -656; }
  38.136% { stroke-dashoffset: -662.7; }
  39.548% { stroke-dashoffset: -668.6; }
  40.96% { stroke-dashoffset: -674; }
  42.373% { stroke-dashoffset: -678.7; }
  43.785% { stroke-dashoffset: -682.8; }
  45.198% { stroke-dashoffset: -686.4; }
  46.61% { stroke-dashoffset: -689.4; }
  48.023% { stroke-dashoffset: -692; }
  49.435% { stroke-dashoffset: -694.1; }
  50.847% { stroke-dashoffset: -695.8; }
  52.26% { stroke-dashoffset: -698.6; }
  53.672% { stroke-dashoffset: -701.1; }
  55.085% { stroke-dashoffset: -703.4; }
  56.497% { stroke-dashoffset: -705.4; }
  57.91% { stroke-dashoffset: -707.2; }
  59.322% { stroke-dashoffset: -709; }
  60.734% { stroke-dashoffset: -710.8; }
  62.147% { stroke-dashoffset: -712.9; }
  63.559% { stroke-dashoffset: -715.4; }
  64.972% { stroke-dashoffset: -718.3; }
  66.384% { stroke-dashoffset: -721.9; }
  67.797% { stroke-dashoffset: -726.1; }
  69.209% { stroke-dashoffset: -731.1; }
  70.621% { stroke-dashoffset: -737; }
  72.034% { stroke-dashoffset: -743.8; }
  73.446% { stroke-dashoffset: -751.6; }
  74.859% { stroke-dashoffset: -760.4; }
  76.271% { stroke-dashoffset: -770.5; }
  77.684% { stroke-dashoffset: -781.9; }
  79.096% { stroke-dashoffset: -794.7; }
  80.508% { stroke-dashoffset: -808.9; }
  81.921% { stroke-dashoffset: -824.8; }
  83.333% { stroke-dashoffset: -842.5; }
  84.746% { stroke-dashoffset: -862.1; }
  86.133% { stroke-dashoffset: -864.4; }
  87.519% { stroke-dashoffset: -866.5; }
  88.906% { stroke-dashoffset: -868.5; }
  90.293% { stroke-dashoffset: -870.9; }
  91.68% { stroke-dashoffset: -873.9; }
  93.066% { stroke-dashoffset: -877.8; }
  94.453% { stroke-dashoffset: -882.9; }
  95.84% { stroke-dashoffset: -889.2; }
  97.227% { stroke-dashoffset: -897; }
  98.613% { stroke-dashoffset: -906.4; }
  100% { stroke-dashoffset: -917.7; }
}

@keyframes rl-dot-far {
  0% { opacity: 0.458; transform: scale(1); }
  33.864% { opacity: 0.18; transform: scale(1); }
  33.898% { opacity: 1; transform: scale(1.8); }
  40% { opacity: 0.95; transform: scale(1); }
  100% { opacity: 0.458; transform: scale(1); }
}

@keyframes rl-dot-near {
  0% { opacity: 0.875; transform: scale(1); }
  84.712% { opacity: 0.18; transform: scale(1); }
  84.746% { opacity: 1; transform: scale(1.8); }
  90.847% { opacity: 0.95; transform: scale(1); }
  100% { opacity: 0.875; transform: scale(1); }
}

@keyframes rl-ring-far {
  0% { transform: scale(0.4); opacity: 0; }
  33.864% { transform: scale(0.4); opacity: 0; }
  33.898% { transform: scale(0.4); opacity: 0.95; }
  47.458% { transform: scale(1.6); opacity: 0; }
  100% { transform: scale(1.6); opacity: 0; }
}

@keyframes rl-ring-near {
  0% { transform: scale(0.4); opacity: 0; }
  84.712% { transform: scale(0.4); opacity: 0; }
  84.746% { transform: scale(0.4); opacity: 0.95; }
  98.305% { transform: scale(1.6); opacity: 0; }
  100% { transform: scale(1.6); opacity: 0; }
}

@keyframes rl-hit-near {
  0% { transform: scale(0.5); opacity: 0.8; }
  10.169% { transform: scale(1.5); opacity: 0; }
  100% { transform: scale(1.5); opacity: 0; }
}

@keyframes rl-hit-far {
  0% { transform: scale(0.5); opacity: 0; }
  50.814% { transform: scale(0.5); opacity: 0; }
  50.847% { transform: scale(0.5); opacity: 0.8; }
  61.017% { transform: scale(1.5); opacity: 0; }
  100% { transform: scale(1.5); opacity: 0; }
}
