Skip to content

Commit 8727672

Browse files
john-b-yangclaude
andcommitted
Add Elo distribution charts and stats to ladder arena pages
- Simplify each CC:Ladder intro to a blockquote linking the announcement post (drop the repeated "X has a CC:Ladder — ..." sentence). - Add a summary-stat tile row (bots, Elo range, median, spread) and an arena-specific sentence describing the distribution. - Add a theme-aware inline SVG histogram of the Elo spread per arena (accent-colored rounded bars, recessive grid, dashed median marker, hover tooltips), driven off the same ranking data. - CSS for .ladder-stats / .ladder-figure in layout.css. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 260fd47 commit 8727672

4 files changed

Lines changed: 184 additions & 3 deletions

File tree

pages/arenas/battlesnake.md

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,48 @@ Success requires balancing multiple objectives: finding food to avoid starvation
2424

2525
<h2 id="cc-ladder">🪜 CC:Ladder</h2>
2626

27-
BattleSnake has a **CC:Ladder** — a ranked ladder of open-source human snakes that turns the arena into a hill-climbable evaluation. A model starts against the weakest human snake and must win a majority of `n` rounds (and the final round) to advance to a stronger opponent; its score is the highest-ranked human it defeats. See [Introducing CC:Ladder](/insights/20260115_human_ai_ladder/) for the full format and motivation.
27+
> See [Introducing CC:Ladder](/insights/20260115_human_ai_ladder/) for the full format and motivation.
2828
2929
The ladder is built from **50 open-source human BattleSnakes** (hosted as `human/*` branches on [CodeClash-ai/BattleSnake](https://github.com/CodeClash-ai/BattleSnake)). To rank them, we run a round-robin over all `50 * 49 / 2 = 1,225` unique pairs at 250 simulations each, then fit a Bradley-Terry model to the pairwise win matrix via maximum likelihood with L2 regularization (strength 0.01, base Elo 1200, slope 400).
3030

31+
<div class="ladder-stats"><div class="ladder-stat"><span class="ladder-stat-num">50</span><span class="ladder-stat-label">human bots</span></div><div class="ladder-stat"><span class="ladder-stat-num">379&#8211;1,883</span><span class="ladder-stat-label">Elo range</span></div><div class="ladder-stat"><span class="ladder-stat-num">1,269</span><span class="ladder-stat-label">median Elo</span></div><div class="ladder-stat"><span class="ladder-stat-num">1,504</span><span class="ladder-stat-label">spread</span></div></div>
32+
33+
The 50 snakes span **379&ndash;1,883 Elo** &mdash; a 1,504-point spread &mdash; but the climb is gradual: the top snake (`robosnake`) leads the runner-up by just 68 Elo, and half the field sits between 968 and 1,433. With no runaway favorite, every rung is a meaningful step up.
34+
35+
<figure class="ladder-figure">
36+
<svg viewBox="0 0 680 250" role="img" aria-label="Histogram of snakes Elo ratings" preserveAspectRatio="xMidYMid meet">
37+
<line class="grid" x1="46" y1="210.0" x2="664" y2="210.0"/>
38+
<text class="tick" x="38" y="214.0" text-anchor="end">0</text>
39+
<line class="grid" x1="46" y1="146.0" x2="664" y2="146.0"/>
40+
<text class="tick" x="38" y="150.0" text-anchor="end">5</text>
41+
<line class="grid" x1="46" y1="82.0" x2="664" y2="82.0"/>
42+
<text class="tick" x="38" y="86.0" text-anchor="end">10</text>
43+
<line class="grid" x1="46" y1="18.0" x2="664" y2="18.0"/>
44+
<text class="tick" x="38" y="22.0" text-anchor="end">15</text>
45+
<path class="bar" d="M47.5,210.0 L47.5,201.2 Q47.5,197.2 51.5,197.2 L92.0,197.2 Q96.0,197.2 96.0,201.2 L96.0,210.0 Z"><title>379 to 504 Elo: 1 bot</title></path>
46+
<path class="bar" d="M99.0,210.0 L99.0,201.2 Q99.0,197.2 103.0,197.2 L143.5,197.2 Q147.5,197.2 147.5,201.2 L147.5,210.0 Z"><title>504 to 630 Elo: 1 bot</title></path>
47+
<path class="bar" d="M150.5,210.0 L150.5,150.0 Q150.5,146.0 154.5,146.0 L195.0,146.0 Q199.0,146.0 199.0,150.0 L199.0,210.0 Z"><title>630 to 755 Elo: 5 bots</title></path>
48+
<path class="bar" d="M202.0,210.0 L202.0,188.4 Q202.0,184.4 206.0,184.4 L246.5,184.4 Q250.5,184.4 250.5,188.4 L250.5,210.0 Z"><title>755 to 880 Elo: 2 bots</title></path>
49+
<path class="bar" d="M253.5,210.0 L253.5,137.2 Q253.5,133.2 257.5,133.2 L298.0,133.2 Q302.0,133.2 302.0,137.2 L302.0,210.0 Z"><title>880 to 1,006 Elo: 6 bots</title></path>
50+
<path class="bar" d="M305.0,210.0 L305.0,162.8 Q305.0,158.8 309.0,158.8 L349.5,158.8 Q353.5,158.8 353.5,162.8 L353.5,210.0 Z"><title>1,006 to 1,131 Elo: 4 bots</title></path>
51+
<path class="bar" d="M356.5,210.0 L356.5,162.8 Q356.5,158.8 360.5,158.8 L401.0,158.8 Q405.0,158.8 405.0,162.8 L405.0,210.0 Z"><title>1,131 to 1,256 Elo: 4 bots</title></path>
52+
<path class="bar" d="M408.0,210.0 L408.0,73.2 Q408.0,69.2 412.0,69.2 L452.5,69.2 Q456.5,69.2 456.5,73.2 L456.5,210.0 Z"><title>1,256 to 1,382 Elo: 11 bots</title></path>
53+
<path class="bar" d="M459.5,210.0 L459.5,98.8 Q459.5,94.8 463.5,94.8 L504.0,94.8 Q508.0,94.8 508.0,98.8 L508.0,210.0 Z"><title>1,382 to 1,507 Elo: 9 bots</title></path>
54+
<path class="bar" d="M511.0,210.0 L511.0,150.0 Q511.0,146.0 515.0,146.0 L555.5,146.0 Q559.5,146.0 559.5,150.0 L559.5,210.0 Z"><title>1,507 to 1,632 Elo: 5 bots</title></path>
55+
<path class="bar" d="M614.0,210.0 L614.0,188.4 Q614.0,184.4 618.0,184.4 L658.5,184.4 Q662.5,184.4 662.5,188.4 L662.5,210.0 Z"><title>1,758 to 1,883 Elo: 2 bots</title></path>
56+
<line class="axis" x1="46" y1="210" x2="664" y2="210" stroke-width="1.5"/>
57+
<text class="tick" x="46.0" y="228.0" text-anchor="middle">379</text>
58+
<text class="tick" x="200.5" y="228.0" text-anchor="middle">755</text>
59+
<text class="tick" x="355.0" y="228.0" text-anchor="middle">1,131</text>
60+
<text class="tick" x="509.5" y="228.0" text-anchor="middle">1,507</text>
61+
<text class="tick" x="664.0" y="228.0" text-anchor="middle">1,883</text>
62+
<line class="median" x1="411.5" y1="18" x2="411.5" y2="210"/>
63+
<text class="median-label" x="417.5" y="28.0" text-anchor="start">median 1,269</text>
64+
<text class="tick" x="355.0" y="246" text-anchor="middle">Elo rating &#8594;</text>
65+
</svg>
66+
<figcaption>Distribution of Elo across the 50 human BattleSnakes. The field climbs fairly evenly, with no single runaway leader.</figcaption>
67+
</figure>
68+
3169
The top ten:
3270

3371
1. human/smallsco/robosnake: **1882.8**

pages/arenas/corewar.md

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,49 @@ Success demands clever tactics—crafting replicators that spawn copies, scanner
2525

2626
<h2 id="cc-ladder">🪜 CC:Ladder</h2>
2727

28-
Core War has a **CC:Ladder** — a ranked ladder of open-source human warriors that turns the arena into a hill-climbable evaluation. A model starts against the weakest human warrior and must win a majority of `n` rounds (and the final round) to advance to a stronger opponent; its score is the highest-ranked human it defeats. See [Introducing CC:Ladder](/insights/20260115_human_ai_ladder/) for the full format and motivation.
28+
> See [Introducing CC:Ladder](/insights/20260115_human_ai_ladder/) for the full format and motivation.
2929
3030
The ladder is built from **264 open-source human warriors**, collected by crawling the Core War online [directory](http://www.koth.org/planar/by-name/complete.htm) and hosted as `human/*` branches on [CodeClash-ai/CoreWar](https://github.com/CodeClash-ai/CoreWar/branches). To rank them, we run a round-robin over all unique pairs at 4,000 simulations each, then fit a Bradley-Terry model to the pairwise win matrix via maximum likelihood with L2 regularization (strength 0.01, base Elo 1200, slope 400).
3131

32+
<div class="ladder-stats"><div class="ladder-stat"><span class="ladder-stat-num">264</span><span class="ladder-stat-label">human bots</span></div><div class="ladder-stat"><span class="ladder-stat-num">-890&#8211;1,409</span><span class="ladder-stat-label">Elo range</span></div><div class="ladder-stat"><span class="ladder-stat-num">1,213</span><span class="ladder-stat-label">median Elo</span></div><div class="ladder-stat"><span class="ladder-stat-num">2,298</span><span class="ladder-stat-label">spread</span></div></div>
33+
34+
Core War's 264 warriors form the tightest field of any ladder: the strongest warrior edges the runner-up by under **7 Elo**, and 91% of the field falls within one standard deviation (&plusmn;168) of the 1200 mean. Beneath that dense competitive pack sits a long tail of broken or trivial warriors trailing down to -889 &mdash; so the early rungs fall quickly before the real wall near the top.
35+
36+
<figure class="ladder-figure">
37+
<svg viewBox="0 0 680 250" role="img" aria-label="Histogram of warriors Elo ratings" preserveAspectRatio="xMidYMid meet">
38+
<line class="grid" x1="46" y1="210.0" x2="664" y2="210.0"/>
39+
<text class="tick" x="38" y="214.0" text-anchor="end">0</text>
40+
<line class="grid" x1="46" y1="171.6" x2="664" y2="171.6"/>
41+
<text class="tick" x="38" y="175.6" text-anchor="end">25</text>
42+
<line class="grid" x1="46" y1="133.2" x2="664" y2="133.2"/>
43+
<text class="tick" x="38" y="137.2" text-anchor="end">50</text>
44+
<line class="grid" x1="46" y1="94.8" x2="664" y2="94.8"/>
45+
<text class="tick" x="38" y="98.8" text-anchor="end">75</text>
46+
<line class="grid" x1="46" y1="56.4" x2="664" y2="56.4"/>
47+
<text class="tick" x="38" y="60.4" text-anchor="end">100</text>
48+
<line class="grid" x1="46" y1="18.0" x2="664" y2="18.0"/>
49+
<text class="tick" x="38" y="22.0" text-anchor="end">125</text>
50+
<path class="bar" d="M47.5,210.0 L47.5,210.0 Q47.5,208.5 49.0,208.5 L71.1,208.5 Q72.6,208.5 72.6,210.0 L72.6,210.0 Z"><title>-890 to -785 Elo: 1 bot</title></path>
51+
<path class="bar" d="M356.5,210.0 L356.5,210.0 Q356.5,208.5 358.0,208.5 L380.1,208.5 Q381.6,208.5 381.6,210.0 L381.6,210.0 Z"><title>260 to 364 Elo: 1 bot</title></path>
52+
<path class="bar" d="M497.0,210.0 L497.0,210.0 Q497.0,208.5 498.5,208.5 L520.5,208.5 Q522.0,208.5 522.0,210.0 L522.0,210.0 Z"><title>782 to 886 Elo: 1 bot</title></path>
53+
<path class="bar" d="M525.0,210.0 L525.0,207.9 Q525.0,203.9 529.0,203.9 L546.1,203.9 Q550.1,203.9 550.1,207.9 L550.1,210.0 Z"><title>886 to 991 Elo: 4 bots</title></path>
54+
<path class="bar" d="M553.1,210.0 L553.1,180.2 Q553.1,176.2 557.1,176.2 L574.2,176.2 Q578.2,176.2 578.2,180.2 L578.2,210.0 Z"><title>991 to 1,095 Elo: 22 bots</title></path>
55+
<path class="bar" d="M581.2,210.0 L581.2,83.4 Q581.2,79.4 585.2,79.4 L602.3,79.4 Q606.3,79.4 606.3,83.4 L606.3,210.0 Z"><title>1,095 to 1,200 Elo: 85 bots</title></path>
56+
<path class="bar" d="M609.3,210.0 L609.3,45.0 Q609.3,41.0 613.3,41.0 L630.4,41.0 Q634.4,41.0 634.4,45.0 L634.4,210.0 Z"><title>1,200 to 1,304 Elo: 110 bots</title></path>
57+
<path class="bar" d="M637.4,210.0 L637.4,152.6 Q637.4,148.6 641.4,148.6 L658.5,148.6 Q662.5,148.6 662.5,152.6 L662.5,210.0 Z"><title>1,304 to 1,409 Elo: 40 bots</title></path>
58+
<line class="axis" x1="46" y1="210" x2="664" y2="210" stroke-width="1.5"/>
59+
<text class="tick" x="46.0" y="228.0" text-anchor="middle">-890</text>
60+
<text class="tick" x="214.5" y="228.0" text-anchor="middle">-263</text>
61+
<text class="tick" x="355.0" y="228.0" text-anchor="middle">260</text>
62+
<text class="tick" x="495.5" y="228.0" text-anchor="middle">782</text>
63+
<text class="tick" x="664.0" y="228.0" text-anchor="middle">1,409</text>
64+
<line class="median" x1="611.3" y1="18" x2="611.3" y2="210"/>
65+
<text class="median-label" x="605.3" y="28.0" text-anchor="end">median 1,213</text>
66+
<text class="tick" x="355.0" y="246" text-anchor="middle">Elo rating &#8594;</text>
67+
</svg>
68+
<figcaption>Distribution of Elo across the 264 human Core War warriors. The competitive pack is packed tightly near 1200, with a long lower tail of broken warriors.</figcaption>
69+
</figure>
70+
3271
The top ten:
3372

3473
1. human/toxic: **1408.7**

pages/arenas/robotrumble.md

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,53 @@ Success requires crafting logic that positions robots smartly, times attacks eff
2424

2525
<h2 id="cc-ladder">🪜 CC:Ladder</h2>
2626

27-
RobotRumble has a **CC:Ladder** — a ranked ladder of open-source human robots that turns the arena into a hill-climbable evaluation. A model starts against the weakest human robot and must win a majority of `n` rounds (and the final round) to advance to a stronger opponent; its score is the highest-ranked human it defeats. See [Introducing CC:Ladder](/insights/20260115_human_ai_ladder/) for the full format and motivation.
27+
> See [Introducing CC:Ladder](/insights/20260115_human_ai_ladder/) for the full format and motivation.
2828
2929
The ladder is built from **58 open-source human robots**, collected from the public [leaderboard](https://robotrumble.org/boards/2/robots) and hosted as `human/*` branches on [CodeClash-ai/RobotRumble](https://github.com/CodeClash-ai/RobotRumble/branches). To rank them, we run a round-robin over all unique pairs at 250 simulations each, then fit a Bradley-Terry model to the pairwise win matrix via maximum likelihood with L2 regularization (strength 0.01, base Elo 1200, slope 400).
3030

31+
<div class="ladder-stats"><div class="ladder-stat"><span class="ladder-stat-num">58</span><span class="ladder-stat-label">human bots</span></div><div class="ladder-stat"><span class="ladder-stat-num">-1,737&#8211;3,219</span><span class="ladder-stat-label">Elo range</span></div><div class="ladder-stat"><span class="ladder-stat-num">1,547</span><span class="ladder-stat-label">median Elo</span></div><div class="ladder-stat"><span class="ladder-stat-num">4,956</span><span class="ladder-stat-label">spread</span></div></div>
32+
33+
RobotRumble has by far the widest spread &mdash; nearly **5,000 Elo** end to end &mdash; and one dominant outlier: `gigachad` sits **592 Elo** clear of every other robot. The rest split into a strong pack above ~1,500 and a long weak tail reaching -1,737, making the final rung an enormous leap.
34+
35+
<figure class="ladder-figure">
36+
<svg viewBox="0 0 680 250" role="img" aria-label="Histogram of robots Elo ratings" preserveAspectRatio="xMidYMid meet">
37+
<line class="grid" x1="46" y1="210.0" x2="664" y2="210.0"/>
38+
<text class="tick" x="38" y="214.0" text-anchor="end">0</text>
39+
<line class="grid" x1="46" y1="162.0" x2="664" y2="162.0"/>
40+
<text class="tick" x="38" y="166.0" text-anchor="end">5</text>
41+
<line class="grid" x1="46" y1="114.0" x2="664" y2="114.0"/>
42+
<text class="tick" x="38" y="118.0" text-anchor="end">10</text>
43+
<line class="grid" x1="46" y1="66.0" x2="664" y2="66.0"/>
44+
<text class="tick" x="38" y="70.0" text-anchor="end">15</text>
45+
<line class="grid" x1="46" y1="18.0" x2="664" y2="18.0"/>
46+
<text class="tick" x="38" y="22.0" text-anchor="end">20</text>
47+
<path class="bar" d="M47.5,210.0 L47.5,194.8 Q47.5,190.8 51.5,190.8 L74.8,190.8 Q78.8,190.8 78.8,194.8 L78.8,210.0 Z"><title>-1,737 to -1,461 Elo: 2 bots</title></path>
48+
<path class="bar" d="M116.2,210.0 L116.2,204.4 Q116.2,200.4 120.2,200.4 L143.5,200.4 Q147.5,200.4 147.5,204.4 L147.5,210.0 Z"><title>-1,186 to -911 Elo: 1 bot</title></path>
49+
<path class="bar" d="M184.8,210.0 L184.8,185.2 Q184.8,181.2 188.8,181.2 L212.2,181.2 Q216.2,181.2 216.2,185.2 L216.2,210.0 Z"><title>-635 to -360 Elo: 3 bots</title></path>
50+
<path class="bar" d="M253.5,210.0 L253.5,185.2 Q253.5,181.2 257.5,181.2 L280.8,181.2 Q284.8,181.2 284.8,185.2 L284.8,210.0 Z"><title>-85 to 191 Elo: 3 bots</title></path>
51+
<path class="bar" d="M287.8,210.0 L287.8,166.0 Q287.8,162.0 291.8,162.0 L315.2,162.0 Q319.2,162.0 319.2,166.0 L319.2,210.0 Z"><title>191 to 466 Elo: 5 bots</title></path>
52+
<path class="bar" d="M322.2,210.0 L322.2,204.4 Q322.2,200.4 326.2,200.4 L349.5,200.4 Q353.5,200.4 353.5,204.4 L353.5,210.0 Z"><title>466 to 741 Elo: 1 bot</title></path>
53+
<path class="bar" d="M356.5,210.0 L356.5,185.2 Q356.5,181.2 360.5,181.2 L383.8,181.2 Q387.8,181.2 387.8,185.2 L387.8,210.0 Z"><title>741 to 1,016 Elo: 3 bots</title></path>
54+
<path class="bar" d="M390.8,210.0 L390.8,175.6 Q390.8,171.6 394.8,171.6 L418.2,171.6 Q422.2,171.6 422.2,175.6 L422.2,210.0 Z"><title>1,016 to 1,292 Elo: 4 bots</title></path>
55+
<path class="bar" d="M425.2,210.0 L425.2,137.2 Q425.2,133.2 429.2,133.2 L452.5,133.2 Q456.5,133.2 456.5,137.2 L456.5,210.0 Z"><title>1,292 to 1,567 Elo: 8 bots</title></path>
56+
<path class="bar" d="M459.5,210.0 L459.5,60.4 Q459.5,56.4 463.5,56.4 L486.8,56.4 Q490.8,56.4 490.8,60.4 L490.8,210.0 Z"><title>1,567 to 1,842 Elo: 16 bots</title></path>
57+
<path class="bar" d="M493.8,210.0 L493.8,156.4 Q493.8,152.4 497.8,152.4 L521.2,152.4 Q525.2,152.4 525.2,156.4 L525.2,210.0 Z"><title>1,842 to 2,118 Elo: 6 bots</title></path>
58+
<path class="bar" d="M528.2,210.0 L528.2,194.8 Q528.2,190.8 532.2,190.8 L555.5,190.8 Q559.5,190.8 559.5,194.8 L559.5,210.0 Z"><title>2,118 to 2,393 Elo: 2 bots</title></path>
59+
<path class="bar" d="M562.5,210.0 L562.5,185.2 Q562.5,181.2 566.5,181.2 L589.8,181.2 Q593.8,181.2 593.8,185.2 L593.8,210.0 Z"><title>2,393 to 2,668 Elo: 3 bots</title></path>
60+
<path class="bar" d="M631.2,210.0 L631.2,204.4 Q631.2,200.4 635.2,200.4 L658.5,200.4 Q662.5,200.4 662.5,204.4 L662.5,210.0 Z"><title>2,944 to 3,219 Elo: 1 bot</title></path>
61+
<line class="axis" x1="46" y1="210" x2="664" y2="210" stroke-width="1.5"/>
62+
<text class="tick" x="46.0" y="228.0" text-anchor="middle">-1,737</text>
63+
<text class="tick" x="183.3" y="228.0" text-anchor="middle">-635</text>
64+
<text class="tick" x="355.0" y="228.0" text-anchor="middle">741</text>
65+
<text class="tick" x="526.7" y="228.0" text-anchor="middle">2,118</text>
66+
<text class="tick" x="664.0" y="228.0" text-anchor="middle">3,219</text>
67+
<line class="median" x1="455.5" y1="18" x2="455.5" y2="210"/>
68+
<text class="median-label" x="461.5" y="28.0" text-anchor="start">median 1,547</text>
69+
<text class="tick" x="355.0" y="246" text-anchor="middle">Elo rating &#8594;</text>
70+
</svg>
71+
<figcaption>Distribution of Elo across the 58 human RobotRumble robots. Note the lone outlier far to the right (gigachad) and the wide tails on both ends.</figcaption>
72+
</figure>
73+
3174
The top ten:
3275

3376
1. human/entropicdrifter/gigachad: **3219.0**

static/css/layout.css

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,67 @@ nav {
552552
vertical-align: baseline;
553553
}
554554

555+
/* Ladder Elo distribution: stat tiles + histogram */
556+
.ladder-stats {
557+
display: flex;
558+
flex-wrap: wrap;
559+
gap: 0.75rem;
560+
margin: 1.25rem 0;
561+
}
562+
563+
.ladder-stat {
564+
flex: 1 1 0;
565+
min-width: 6.5rem;
566+
padding: 0.7rem 0.9rem;
567+
border: 1px solid var(--border);
568+
border-radius: 8px;
569+
text-align: center;
570+
}
571+
572+
.ladder-stat-num {
573+
display: block;
574+
font-weight: var(--weight-bold);
575+
font-size: var(--text-md);
576+
letter-spacing: -0.02em;
577+
color: var(--fg);
578+
}
579+
580+
.ladder-stat-label {
581+
display: block;
582+
margin-top: 0.15em;
583+
font-size: var(--text-sm);
584+
color: var(--muted);
585+
}
586+
587+
.ladder-figure {
588+
margin: 1.25rem 0;
589+
}
590+
591+
.ladder-figure svg {
592+
display: block;
593+
width: 100%;
594+
height: auto;
595+
overflow: visible;
596+
}
597+
598+
.ladder-figure .bar {
599+
fill: var(--accent);
600+
transition: opacity 0.15s;
601+
}
602+
603+
.ladder-figure .bar:hover { opacity: 0.7; }
604+
.ladder-figure .axis { stroke: var(--border); }
605+
.ladder-figure .grid { stroke: var(--border); stroke-dasharray: 2 3; opacity: 0.6; }
606+
.ladder-figure .tick { fill: var(--muted); font-size: 12px; }
607+
.ladder-figure .median { stroke: var(--fg); stroke-dasharray: 4 3; opacity: 0.55; }
608+
.ladder-figure .median-label { fill: var(--fg); font-size: 11px; opacity: 0.7; }
609+
.ladder-figure figcaption {
610+
margin-top: 0.5em;
611+
font-size: var(--text-sm);
612+
color: var(--muted);
613+
text-align: center;
614+
}
615+
555616
@media (max-width: 900px) {
556617
.arenas-grid { grid-template-columns: repeat(2, 1fr); }
557618
}

0 commit comments

Comments
 (0)