feat(engine): rename themes — Classic is default, Dark replaces Default
Build and Deploy / build-and-push (push) Successful in 33s

- Rename assets/themes/default/ → assets/themes/dark/; update theme.ron
  id/name to "dark"/"Dark"
- Rename all DEFAULT_THEME_* constants → DARK_THEME_* and
  default_theme_svg_bytes / populate_embedded_default_theme → dark_*
- Add bundled_theme_url() helper for URL resolution without needing the
  registry (used by Startup systems where ordering isn't guaranteed)
- Registry now lists Classic first (new player default), Dark second
- settings.rs default_theme_id() returns "classic" so fresh installs
  start on the white card theme

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
funman300
2026-05-13 22:51:09 -07:00
parent 7a0d57b2b1
commit 20b7a617e0
61 changed files with 198 additions and 237 deletions
@@ -0,0 +1,43 @@
# Default theme — provenance
This directory is the bundled-default card theme that ships embedded in
the binary via Bevy's `embedded_asset!` macro (see
`solitaire_engine/src/assets/sources.rs`). At runtime its files are
addressable as `embedded://solitaire_engine/assets/themes/default/...`.
## Current state (Phase 3)
The `theme.ron` manifest in this directory lists all 52 face slots plus
a back slot, but **the referenced SVG files do not yet exist**. The
manifest is intentionally a stub so that:
1. `embedded_asset!` has a real file to bundle (the manifest itself).
2. `ThemeManifest::validate` accepts the manifest (it requires all 52
faces to be listed by name).
3. The `embedded://` asset source can be source-registered and queried
without runtime errors during Phase 3.
The actual SVG art will be added when the project swaps in the
`hayeah/playing-cards-assets` artwork — see the implementation plan in
`/CARD_PLAN.md`. At that point, every `.svg` filename listed in
`theme.ron`'s `faces` map (and `back.svg`) must be added here, and each
new file needs a corresponding `embedded_asset!(app, ...)` call in
`solitaire_engine/src/assets/sources.rs::register_default_theme`.
## How to add files to the bundled default theme
For each new file you drop into this directory:
1. Drop the file under `solitaire_engine/assets/themes/default/`.
2. Add one line to `register_default_theme` in
`solitaire_engine/src/assets/sources.rs` of the form:
```rust
embedded_asset!(app, "../../assets/themes/default/<filename>");
```
(The path is relative to `sources.rs`, which lives in
`solitaire_engine/src/assets/`.)
3. Update this file with the licence and origin of the new asset.
## Licence
To be filled in once real artwork lands.
@@ -0,0 +1,21 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<defs>
<pattern id="scanlines" x="0" y="0" width="2" height="4" patternUnits="userSpaceOnUse">
<rect x="0" y="0" width="2" height="2" fill="#1a1a1a"/>
</pattern>
</defs>
<!-- Background fill, then scanlines on top (the scanlines stay
darker than BACK_BG so the "off" rows show through). -->
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="#151515" stroke="#353535" stroke-width="2"/>
<rect x="1" y="1" width="254" height="382" rx="16" ry="16"
fill="url(#scanlines)"/>
<!-- Top-left accent badge (the only theme-varying element). -->
<rect x="12" y="12" width="24" height="32" fill="#a54242"/>
<!-- Bottom-right "▌RS" monogram in JetBrains-Mono-styled FiraMono. -->
<text x="244" y="368" font-family="Fira Mono" font-size="24"
fill="#505050" text-anchor="end">&#x258C;RS</text>
</svg>

After

Width:  |  Height:  |  Size: 956 B

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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="#e8e8e8" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e8e8e8" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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="#e8e8e8" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e8e8e8" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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="#e8e8e8" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e8e8e8" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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="#e8e8e8" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e8e8e8" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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="#e8e8e8" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e8e8e8" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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="#e8e8e8" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e8e8e8" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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="#e8e8e8" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e8e8e8" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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="#e8e8e8" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e8e8e8" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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="#e8e8e8" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e8e8e8" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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="#e8e8e8" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e8e8e8" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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="#e8e8e8" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e8e8e8" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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="#e8e8e8" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e8e8e8" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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="#e8e8e8" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e8e8e8" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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="#e35353" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e35353" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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="#e35353" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e35353" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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="#e35353" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e35353" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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="#e35353" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e35353" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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="#e35353" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e35353" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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="#e35353" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e35353" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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="#e35353" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e35353" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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="#e35353" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e35353" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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="#e35353" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e35353" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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="#e35353" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e35353" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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="#e35353" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e35353" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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="#e35353" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e35353" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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="#e35353" stroke-width="3"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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="#e35353" stroke-width="3"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e35353">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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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,28 C 8,22 2,17 2,11 C 2,7 5,4 9,4 C 12,4 14,6 16,9 C 18,6 20,4 23,4 C 27,4 30,7 30,11 C 30,17 24,22 16,28 Z" fill="#e35353"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,25 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="384" viewBox="0 0 256 384">
<rect x="0" y="0" width="256" height="384" rx="16" ry="16"
fill="#1a1a1a"/>
<!-- 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="#e8e8e8">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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
<!-- Bottom-right large suit glyph at (178, 286), 64 × 64.
Visible bottom-right at (242, 350), visible top-left at
(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 9,9 2,14 2,21 C 2,25 5,28 9,28 C 13,28 14,26 14,24 L 13,30 L 19,30 L 18,24 C 18,26 19,28 23,28 C 27,28 30,25 30,21 C 30,14 23,9 16,4 Z" fill="#e8e8e8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

@@ -0,0 +1,77 @@
// Default card theme manifest — Phase 3 stub.
//
// The 53 SVG paths below are deliberate placeholders so the manifest
// validates against `ThemeManifest::validate` (which requires all 52
// faces plus a back). The actual SVG art lands in a later phase when
// the swap to hayeah/playing-cards-assets is complete; until then this
// file exists so the `embedded://` asset source has something to
// register, and so source-registration tests have a real RON file to
// parse.
//
// Suit / rank tokens follow `CardKey::manifest_name`:
// suits: clubs, diamonds, hearts, spades
// ranks: ace, 2, 3, 4, 5, 6, 7, 8, 9, 10, jack, queen, king
(
meta: (
id: "dark",
name: "Dark",
author: "Ferrous Solitaire",
version: "0.1.0",
card_aspect: (2, 3),
),
back: "back.svg",
faces: {
"clubs_ace": "clubs_ace.svg",
"clubs_2": "clubs_2.svg",
"clubs_3": "clubs_3.svg",
"clubs_4": "clubs_4.svg",
"clubs_5": "clubs_5.svg",
"clubs_6": "clubs_6.svg",
"clubs_7": "clubs_7.svg",
"clubs_8": "clubs_8.svg",
"clubs_9": "clubs_9.svg",
"clubs_10": "clubs_10.svg",
"clubs_jack": "clubs_jack.svg",
"clubs_queen": "clubs_queen.svg",
"clubs_king": "clubs_king.svg",
"diamonds_ace": "diamonds_ace.svg",
"diamonds_2": "diamonds_2.svg",
"diamonds_3": "diamonds_3.svg",
"diamonds_4": "diamonds_4.svg",
"diamonds_5": "diamonds_5.svg",
"diamonds_6": "diamonds_6.svg",
"diamonds_7": "diamonds_7.svg",
"diamonds_8": "diamonds_8.svg",
"diamonds_9": "diamonds_9.svg",
"diamonds_10": "diamonds_10.svg",
"diamonds_jack": "diamonds_jack.svg",
"diamonds_queen": "diamonds_queen.svg",
"diamonds_king": "diamonds_king.svg",
"hearts_ace": "hearts_ace.svg",
"hearts_2": "hearts_2.svg",
"hearts_3": "hearts_3.svg",
"hearts_4": "hearts_4.svg",
"hearts_5": "hearts_5.svg",
"hearts_6": "hearts_6.svg",
"hearts_7": "hearts_7.svg",
"hearts_8": "hearts_8.svg",
"hearts_9": "hearts_9.svg",
"hearts_10": "hearts_10.svg",
"hearts_jack": "hearts_jack.svg",
"hearts_queen": "hearts_queen.svg",
"hearts_king": "hearts_king.svg",
"spades_ace": "spades_ace.svg",
"spades_2": "spades_2.svg",
"spades_3": "spades_3.svg",
"spades_4": "spades_4.svg",
"spades_5": "spades_5.svg",
"spades_6": "spades_6.svg",
"spades_7": "spades_7.svg",
"spades_8": "spades_8.svg",
"spades_9": "spades_9.svg",
"spades_10": "spades_10.svg",
"spades_jack": "spades_jack.svg",
"spades_queen": "spades_queen.svg",
"spades_king": "spades_king.svg",
},
)