feat(engine): switch card fronts to 4-colour deck

Hearts pink (`#fb9fb1`), Diamonds gold (`#ddb26f`), Clubs lime
(`#acc267`), Spades gray (`#d0d0d0`) — each suit picks up its
own base16-eighties accent so a player scanning the table can
distinguish the suit by hue alone (faster recognition than the
2-colour traditional red/black scheme; common in poker decks).
All four colours already exist in the palette as semantic
state-token accents, so this is a pure remapping at the suit-
glyph site, not a palette extension.

The outlined-glyph differentiation (♦ ♣ outlined, ♥ ♠ filled)
is preserved on top of the colour split — it stays the always-
on colour-blind fallback per `design-system.md` §Accessibility,
and matters more than ever now that CBM hearts (lime) and
default clubs (lime) share a hue.

### Changes

- `card_face_svg.rs`: split `SUIT_RED` / `SUIT_DARK` into four
  per-suit constants (`SUIT_HEART` / `SUIT_DIAMOND` / `SUIT_CLUB`
  / `SUIT_SPADE`). `suit_paint()` returns each suit's own
  colour. Card border picks up the suit colour automatically
  via the existing `(colour, paint)` destructure.
- `card_plugin.rs`: new `DIAMOND_SUIT_COLOUR` + `CLUB_SUIT_COLOUR`
  constants; `text_colour()` rewritten as a per-suit match (was
  red/black bifurcation). Both rendering paths (PNG production +
  constant fallback under MinimalPlugins) stay in lockstep.
- CBM behaviour clarified: only hearts swap to lime now;
  diamonds + clubs + spades are already hue-distinct from
  the heart pink and stay unchanged. Under CBM the heart
  (lime) and club (lime) share a hue but stay distinguishable
  via the always-on filled-vs-outlined glyph differentiation.
- HC behaviour: only hearts (→ HC red) and spades (→ HC white)
  have defined boosts. Diamonds (gold) and clubs (lime) are
  already mid-luminance accents and stay at their default.
  New test `text_colour_diamonds_and_clubs_are_immune_to_accessibility_flags`
  pins all four flag combinations as no-ops for the gold +
  lime suits.
- `design-system.md` §Suit Colors retitled "Four-color deck"
  with the 4-colour table; CBM section text updated to
  describe the hearts-only swap and the hearts/clubs hue
  collision under CBM.
- `card_face_svg_pin.rs` rebaselined: 26 hashes drift
  (13 clubs + 13 diamonds — the two suits whose colours
  changed). Hearts, spades, and the 5 backs all keep their
  prior hashes. Surgical scope, exactly what the pin test
  was designed to surface.

### Tests

1191 passing / 0 failing — net 0 from the prior baseline:
two old 2-colour tests removed
(`text_colour_is_red_for_hearts_and_diamonds`,
`text_colour_is_black_for_clubs_and_spades`), one consolidated
4-colour test added
(`text_colour_4_colour_deck_assigns_each_suit_its_own_hue`)
plus a pairwise-distinct invariant guard, and one new test
covering the gold/lime suits' immunity to CBM/HC flags. Six
existing CBM/HC tests rewritten to use only the suits each flag
actually affects under the new scheme (hearts for CBM, hearts +
spades for HC).

Workspace clippy clean.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
funman300
2026-05-08 12:00:55 -07:00
parent 31139ae455
commit 62b61cc786
56 changed files with 306 additions and 225 deletions
@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#d0d0d0" stroke-width="2"/>
fill="#1a1a1a" stroke="#acc267" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#d0d0d0">10</text>
fill="#acc267">10</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#d0d0d0" stroke-width="2"/>
fill="#1a1a1a" stroke="#acc267" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#d0d0d0">2</text>
fill="#acc267">2</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#d0d0d0" stroke-width="2"/>
fill="#1a1a1a" stroke="#acc267" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#d0d0d0">3</text>
fill="#acc267">3</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#d0d0d0" stroke-width="2"/>
fill="#1a1a1a" stroke="#acc267" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#d0d0d0">4</text>
fill="#acc267">4</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#d0d0d0" stroke-width="2"/>
fill="#1a1a1a" stroke="#acc267" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#d0d0d0">5</text>
fill="#acc267">5</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#d0d0d0" stroke-width="2"/>
fill="#1a1a1a" stroke="#acc267" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#d0d0d0">6</text>
fill="#acc267">6</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#d0d0d0" stroke-width="2"/>
fill="#1a1a1a" stroke="#acc267" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#d0d0d0">7</text>
fill="#acc267">7</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#d0d0d0" stroke-width="2"/>
fill="#1a1a1a" stroke="#acc267" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#d0d0d0">8</text>
fill="#acc267">8</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#d0d0d0" stroke-width="2"/>
fill="#1a1a1a" stroke="#acc267" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#d0d0d0">9</text>
fill="#acc267">9</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#d0d0d0" stroke-width="2"/>
fill="#1a1a1a" stroke="#acc267" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#d0d0d0">A</text>
fill="#acc267">A</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#d0d0d0" stroke-width="2"/>
fill="#1a1a1a" stroke="#acc267" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#d0d0d0">J</text>
fill="#acc267">J</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#d0d0d0" stroke-width="2"/>
fill="#1a1a1a" stroke="#acc267" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#d0d0d0">K</text>
fill="#acc267">K</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#d0d0d0" stroke-width="2"/>
fill="#1a1a1a" stroke="#acc267" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#d0d0d0">Q</text>
fill="#acc267">Q</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#d0d0d0" stroke-width="3"/>
<path d="M16,4 C 13,4 10,7 10,10 C 10,12 11,13 12,14 C 9,14 4,17 4,21 C 4,24 7,27 10,27 C 12,27 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 20,27 22,27 C 25,27 28,24 28,21 C 28,17 23,14 20,14 C 21,13 22,12 22,10 C 22,7 19,4 16,4 Z" fill="none" stroke="#acc267" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#fb9fb1" stroke-width="2"/>
fill="#1a1a1a" stroke="#ddb26f" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#fb9fb1">10</text>
fill="#ddb26f">10</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#fb9fb1" stroke-width="2"/>
fill="#1a1a1a" stroke="#ddb26f" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#fb9fb1">2</text>
fill="#ddb26f">2</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#fb9fb1" stroke-width="2"/>
fill="#1a1a1a" stroke="#ddb26f" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#fb9fb1">3</text>
fill="#ddb26f">3</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#fb9fb1" stroke-width="2"/>
fill="#1a1a1a" stroke="#ddb26f" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#fb9fb1">4</text>
fill="#ddb26f">4</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#fb9fb1" stroke-width="2"/>
fill="#1a1a1a" stroke="#ddb26f" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#fb9fb1">5</text>
fill="#ddb26f">5</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#fb9fb1" stroke-width="2"/>
fill="#1a1a1a" stroke="#ddb26f" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#fb9fb1">6</text>
fill="#ddb26f">6</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#fb9fb1" stroke-width="2"/>
fill="#1a1a1a" stroke="#ddb26f" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#fb9fb1">7</text>
fill="#ddb26f">7</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#fb9fb1" stroke-width="2"/>
fill="#1a1a1a" stroke="#ddb26f" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#fb9fb1">8</text>
fill="#ddb26f">8</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#fb9fb1" stroke-width="2"/>
fill="#1a1a1a" stroke="#ddb26f" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#fb9fb1">9</text>
fill="#ddb26f">9</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#fb9fb1" stroke-width="2"/>
fill="#1a1a1a" stroke="#ddb26f" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#fb9fb1">A</text>
fill="#ddb26f">A</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#fb9fb1" stroke-width="2"/>
fill="#1a1a1a" stroke="#ddb26f" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#fb9fb1">J</text>
fill="#ddb26f">J</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#fb9fb1" stroke-width="2"/>
fill="#1a1a1a" stroke="#ddb26f" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#fb9fb1">K</text>
fill="#ddb26f">K</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -1,18 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#1a1a1a" stroke="#fb9fb1" stroke-width="2"/>
fill="#1a1a1a" stroke="#ddb26f" stroke-width="2"/>
<!-- Top-left rank in JetBrains-Mono-styled FiraMono (rank digits
and letters render correctly in FiraMono; only the suit glyphs
needed to escape to paths). -->
<text x="14" y="44" font-family="Fira Mono" font-size="36" font-weight="700"
fill="#fb9fb1">Q</text>
fill="#ddb26f">Q</text>
<!-- Top-left small suit glyph at (14, 50), 20 × 20.
`suit_path_d` is authored in a 32-unit box, so scale 0.625
lands the visible glyph at 20 px. -->
<g transform="translate(14 50) scale(0.625)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
@@ -20,6 +20,6 @@
(178, 286). Same upright orientation as the top-left small
glyph — no 180° rotation applied. -->
<g transform="translate(178 286) scale(2)">
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#fb9fb1" stroke-width="3"/>
<path d="M16,2 L 29,16 L 16,30 L 3,16 Z" fill="none" stroke="#ddb26f" stroke-width="3"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB