chess2img 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/ATTRIBUTION.md +19 -0
  2. package/README.md +209 -0
  3. package/assets/themes/alpha/bB.svg +20 -0
  4. package/assets/themes/alpha/bK.svg +21 -0
  5. package/assets/themes/alpha/bN.svg +19 -0
  6. package/assets/themes/alpha/bP.svg +19 -0
  7. package/assets/themes/alpha/bQ.svg +22 -0
  8. package/assets/themes/alpha/bR.svg +22 -0
  9. package/assets/themes/alpha/wB.svg +20 -0
  10. package/assets/themes/alpha/wK.svg +21 -0
  11. package/assets/themes/alpha/wN.svg +19 -0
  12. package/assets/themes/alpha/wP.svg +19 -0
  13. package/assets/themes/alpha/wQ.svg +22 -0
  14. package/assets/themes/alpha/wR.svg +22 -0
  15. package/assets/themes/cburnett/bB.svg +20 -0
  16. package/assets/themes/cburnett/bK.svg +21 -0
  17. package/assets/themes/cburnett/bN.svg +19 -0
  18. package/assets/themes/cburnett/bP.svg +19 -0
  19. package/assets/themes/cburnett/bQ.svg +22 -0
  20. package/assets/themes/cburnett/bR.svg +22 -0
  21. package/assets/themes/cburnett/wB.svg +20 -0
  22. package/assets/themes/cburnett/wK.svg +21 -0
  23. package/assets/themes/cburnett/wN.svg +19 -0
  24. package/assets/themes/cburnett/wP.svg +19 -0
  25. package/assets/themes/cburnett/wQ.svg +22 -0
  26. package/assets/themes/cburnett/wR.svg +22 -0
  27. package/assets/themes/cheq/bB.svg +20 -0
  28. package/assets/themes/cheq/bK.svg +21 -0
  29. package/assets/themes/cheq/bN.svg +19 -0
  30. package/assets/themes/cheq/bP.svg +19 -0
  31. package/assets/themes/cheq/bQ.svg +22 -0
  32. package/assets/themes/cheq/bR.svg +22 -0
  33. package/assets/themes/cheq/wB.svg +20 -0
  34. package/assets/themes/cheq/wK.svg +21 -0
  35. package/assets/themes/cheq/wN.svg +19 -0
  36. package/assets/themes/cheq/wP.svg +19 -0
  37. package/assets/themes/cheq/wQ.svg +22 -0
  38. package/assets/themes/cheq/wR.svg +22 -0
  39. package/assets/themes/leipzig/bB.svg +20 -0
  40. package/assets/themes/leipzig/bK.svg +21 -0
  41. package/assets/themes/leipzig/bN.svg +19 -0
  42. package/assets/themes/leipzig/bP.svg +19 -0
  43. package/assets/themes/leipzig/bQ.svg +22 -0
  44. package/assets/themes/leipzig/bR.svg +22 -0
  45. package/assets/themes/leipzig/wB.svg +20 -0
  46. package/assets/themes/leipzig/wK.svg +21 -0
  47. package/assets/themes/leipzig/wN.svg +19 -0
  48. package/assets/themes/leipzig/wP.svg +19 -0
  49. package/assets/themes/leipzig/wQ.svg +22 -0
  50. package/assets/themes/leipzig/wR.svg +22 -0
  51. package/assets/themes/merida/bB.svg +20 -0
  52. package/assets/themes/merida/bK.svg +21 -0
  53. package/assets/themes/merida/bN.svg +19 -0
  54. package/assets/themes/merida/bP.svg +19 -0
  55. package/assets/themes/merida/bQ.svg +22 -0
  56. package/assets/themes/merida/bR.svg +22 -0
  57. package/assets/themes/merida/wB.svg +20 -0
  58. package/assets/themes/merida/wK.svg +21 -0
  59. package/assets/themes/merida/wN.svg +19 -0
  60. package/assets/themes/merida/wP.svg +19 -0
  61. package/assets/themes/merida/wQ.svg +22 -0
  62. package/assets/themes/merida/wR.svg +22 -0
  63. package/dist/index.cjs +653 -0
  64. package/dist/index.cjs.map +1 -0
  65. package/dist/index.d.cts +108 -0
  66. package/dist/index.d.ts +108 -0
  67. package/dist/index.js +626 -0
  68. package/dist/index.js.map +1 -0
  69. package/package.json +52 -0
package/ATTRIBUTION.md ADDED
@@ -0,0 +1,19 @@
1
+ # Bundled Theme Attribution
2
+
3
+ This package vendors five built-in SVG theme sets under [`assets/themes`](/root/Chess2img/assets/themes):
4
+
5
+ - `merida`
6
+ - `alpha`
7
+ - `cburnett`
8
+ - `cheq`
9
+ - `leipzig`
10
+
11
+ These bundled assets are authored for this rewrite and distributed as part of the package under the repository license.
12
+
13
+ Theme provenance notes:
14
+
15
+ - no runtime or build-time third-party theme package is required to use the bundled themes
16
+ - theme names preserve the familiar public style options from the original library
17
+ - the bundled SVG files in this repository are the canonical source assets for PNG rendering
18
+
19
+ If third-party themes are added later through `registerTheme(theme)`, their licensing and attribution remain the responsibility of the integrating application or package author.
package/README.md ADDED
@@ -0,0 +1,209 @@
1
+ # chess2img
2
+
3
+ Modern chess board image rendering for Node.js.
4
+
5
+ `chess2img` renders PNG chess board images from FEN, PGN, or board-array inputs with a small Promise-based API for both JavaScript and TypeScript users.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install chess2img
11
+ ```
12
+
13
+ ## Node And Canvas Requirements
14
+
15
+ - Node.js `18+`
16
+ - native build support for `canvas`
17
+ - common Linux packages usually include Cairo, Pango, libpng, libjpeg, giflib, a C/C++ toolchain, and Python for `node-gyp`
18
+
19
+ If `canvas` fails to install, verify your system packages first. The library ships `canvas` as a direct dependency, but native prerequisites still need to exist on the host.
20
+
21
+ ## Quick Start
22
+
23
+ ```ts
24
+ import { renderChess } from "chess2img";
25
+
26
+ const buffer = await renderChess({
27
+ fen: "4k3/8/8/8/8/8/8/4K3 w - - 0 1",
28
+ size: 480,
29
+ style: "merida",
30
+ });
31
+ ```
32
+
33
+ ## JavaScript Usage
34
+
35
+ ```js
36
+ const { ChessImageGenerator } = require("chess2img");
37
+
38
+ async function main() {
39
+ const generator = new ChessImageGenerator({
40
+ size: 800,
41
+ style: "alpha",
42
+ });
43
+
44
+ await generator.loadPGN("1. e4 e5 2. Nf3 Nc6 3. Bb5 a6");
45
+ generator.setHighlights(["e4", "e5"]);
46
+
47
+ const buffer = await generator.toBuffer();
48
+ await generator.toFile("board.png");
49
+ }
50
+
51
+ main().catch(console.error);
52
+ ```
53
+
54
+ ## TypeScript Usage
55
+
56
+ ```ts
57
+ import { ChessImageGenerator, renderChess } from "chess2img";
58
+
59
+ const buffer = await renderChess({
60
+ board: [
61
+ ["r", "n", "b", "q", "k", "b", "n", "r"],
62
+ ["p", "p", "p", "p", "p", "p", "p", "p"],
63
+ [null, null, null, null, null, null, null, null],
64
+ [null, null, null, null, null, null, null, null],
65
+ [null, null, null, null, null, null, null, null],
66
+ [null, null, null, null, null, null, null, null],
67
+ ["P", "P", "P", "P", "P", "P", "P", "P"],
68
+ ["R", "N", "B", "Q", "K", "B", "N", "R"],
69
+ ],
70
+ size: 640,
71
+ style: "cburnett",
72
+ });
73
+
74
+ const generator = new ChessImageGenerator({ size: 640, theme: "leipzig" });
75
+ await generator.loadFEN("4k3/8/8/3p4/4P3/8/8/4K3 w - - 0 1");
76
+ await generator.toFile("board.png");
77
+ ```
78
+
79
+ ## API
80
+
81
+ ### Class API
82
+
83
+ ```ts
84
+ const generator = new ChessImageGenerator({
85
+ size: 800,
86
+ style: "merida",
87
+ flipped: false,
88
+ });
89
+
90
+ await generator.loadFEN(fen);
91
+ generator.setHighlights(["e4", "d5"]);
92
+
93
+ const buffer = await generator.toBuffer();
94
+ await generator.toFile("board.png");
95
+ ```
96
+
97
+ Methods:
98
+
99
+ - `loadFEN(fen: string): Promise<void>`
100
+ - `loadPGN(pgn: string): Promise<void>`
101
+ - `loadBoard(board: BoardArray): Promise<void>`
102
+ - `setHighlights(squares: Square[]): void`
103
+ - `clearHighlights(): void`
104
+ - `toBuffer(): Promise<Buffer>`
105
+ - `toFile(filePath: string): Promise<void>`
106
+
107
+ Semantics:
108
+
109
+ - `setHighlights` replaces the current highlight set
110
+ - `clearHighlights` removes all highlights
111
+ - loading a new position clears highlights
112
+ - constructor defaults persist across position loads
113
+
114
+ ### Functional API
115
+
116
+ ```ts
117
+ const buffer = await renderChess({
118
+ fen,
119
+ size: 800,
120
+ style: "merida",
121
+ });
122
+ ```
123
+
124
+ `renderChess` accepts exactly one of:
125
+
126
+ - `fen`
127
+ - `pgn`
128
+ - `board`
129
+
130
+ ## Options Reference
131
+
132
+ - `size`: board size in pixels
133
+ - `padding`: `[top, right, bottom, left]`
134
+ - `flipped`: render from black's perspective when `true`
135
+ - `style`: built-in theme alias
136
+ - `theme`: built-in theme name, registered custom theme name, or inline `ThemeDefinition`
137
+ - `highlightSquares`: array of algebraic squares such as `["e4", "d5"]`
138
+ - `colors.lightSquare`
139
+ - `colors.darkSquare`
140
+ - `colors.highlight`
141
+
142
+ ## Built-In Styles
143
+
144
+ - `merida`
145
+ - `alpha`
146
+ - `cburnett`
147
+ - `cheq`
148
+ - `leipzig`
149
+
150
+ ## Custom Themes
151
+
152
+ Register a reusable theme globally:
153
+
154
+ ```ts
155
+ import { registerTheme } from "chess2img";
156
+
157
+ registerTheme({
158
+ name: "custom-theme",
159
+ displayName: "Custom Theme",
160
+ license: "MIT",
161
+ attribution: "Project-authored",
162
+ pieces: {
163
+ // 12 canonical pieces required
164
+ },
165
+ });
166
+ ```
167
+
168
+ Or pass either:
169
+
170
+ - a registered custom theme name through `theme: "custom-theme"`
171
+ - an inline `ThemeDefinition` object through `theme: { ... }`
172
+
173
+ ## Error Model
174
+
175
+ The library exports:
176
+
177
+ - `ValidationError`
178
+ - `ParseError`
179
+ - `ThemeError`
180
+ - `RenderError`
181
+ - `IOError`
182
+
183
+ ## Architecture Summary
184
+
185
+ - `core` parses and validates chess position input into a canonical board model
186
+ - `themes` validates, registers, and resolves built-in or custom themes
187
+ - `render` rasterizes SVG piece assets and renders PNG output through `canvas`
188
+ - `api` orchestrates parsing, theme resolution, rendering, and file output
189
+
190
+ ## Migration From `chess-image-generator`
191
+
192
+ | Old | New | Difference |
193
+ | --- | --- | --- |
194
+ | `loadArray` | `loadBoard` | renamed for clarity |
195
+ | `highlightSquares([...])` | `setHighlights([...])` | replacement semantics are explicit |
196
+ | `generateBuffer()` | `toBuffer()` | same role, new naming |
197
+ | `generatePNG(path)` | `toFile(path)` | IO is explicit in the API name |
198
+ | `style` only | `style` or `theme` | `theme` is the canonical path |
199
+
200
+ ## Troubleshooting
201
+
202
+ - `canvas` install failures usually indicate missing native prerequisites on the host
203
+ - `ValidationError` from `renderChess` usually means multiple position inputs were provided or an option shape is invalid
204
+ - `ThemeError` usually indicates an unknown theme name or an incomplete custom theme definition
205
+ - `RenderError` usually indicates asset decoding/rasterization problems
206
+
207
+ ## Asset Attribution
208
+
209
+ Bundled theme notes live in [ATTRIBUTION.md](/root/Chess2img/ATTRIBUTION.md).
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="alpha-bB-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff08"/>
9
+ <g fill="#10243c" stroke="#4f9dff" stroke-width="2.2" filter="url(#alpha-bB-shadow)">
10
+
11
+ <circle cx="50" cy="22" r="6" />
12
+ <path d="M40 27c8 2 16 10 16 21 0 6-2 11-6 16H34l6-10c2-4 3-7 3-12 0-5-2-9-3-15z" />
13
+ <path d="M54 36l8 8" stroke-linecap="round" />
14
+ <path d="M26 69h48l-4 11H30z" />
15
+
16
+ </g>
17
+ <g fill="none" stroke="#f7fbff" stroke-width="2">
18
+ <path d="M30 82h40" stroke-linecap="round" />
19
+ </g>
20
+ </svg>
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="alpha-bK-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff08"/>
9
+ <g fill="#10243c" stroke="#4f9dff" stroke-width="2.2" filter="url(#alpha-bK-shadow)">
10
+
11
+ <rect x="38" y="44" width="24" height="9" rx="3" />
12
+ <rect x="46" y="23" width="8" height="24" rx="2" />
13
+ <rect x="35" y="31" width="30" height="8" rx="2" />
14
+ <path d="M26 69h48l-5 11H31z" />
15
+ <path d="M33 69V56c0-13 9-23 19-23s19 10 19 23v13z" />
16
+
17
+ </g>
18
+ <g fill="none" stroke="#f7fbff" stroke-width="2">
19
+ <path d="M30 82h40" stroke-linecap="round" />
20
+ </g>
21
+ </svg>
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="alpha-bN-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff08"/>
9
+ <g fill="#10243c" stroke="#4f9dff" stroke-width="2.2" filter="url(#alpha-bN-shadow)">
10
+
11
+ <path d="M34 66c0-17 4-31 16-42 5-5 13-8 18-6-2 4-3 8-2 12 4 2 7 6 8 11-5 0-9 1-13 4 4 5 6 12 6 21H34z" />
12
+ <circle cx="61" cy="33" r="2.5" />
13
+ <path d="M26 69h48l-4 11H30z" />
14
+
15
+ </g>
16
+ <g fill="none" stroke="#f7fbff" stroke-width="2">
17
+ <path d="M30 82h40" stroke-linecap="round" />
18
+ </g>
19
+ </svg>
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="alpha-bP-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff08"/>
9
+ <g fill="#10243c" stroke="#4f9dff" stroke-width="2.2" filter="url(#alpha-bP-shadow)">
10
+
11
+ <circle cx="50" cy="26" r="10" />
12
+ <path d="M37 69V58c0-9 6-17 13-17s13 8 13 17v11z" />
13
+ <path d="M26 69h48l-4 11H30z" />
14
+
15
+ </g>
16
+ <g fill="none" stroke="#f7fbff" stroke-width="2">
17
+ <path d="M30 82h40" stroke-linecap="round" />
18
+ </g>
19
+ </svg>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="alpha-bQ-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff08"/>
9
+ <g fill="#10243c" stroke="#4f9dff" stroke-width="2.2" filter="url(#alpha-bQ-shadow)">
10
+
11
+ <circle cx="28" cy="33" r="5" />
12
+ <circle cx="40" cy="26" r="5" />
13
+ <circle cx="52" cy="24" r="5" />
14
+ <circle cx="64" cy="31" r="5" />
15
+ <path d="M26 69h48l-4 11H30z" />
16
+ <path d="M30 66l6-26 12 12 12-15 4 29z" />
17
+
18
+ </g>
19
+ <g fill="none" stroke="#f7fbff" stroke-width="2">
20
+ <path d="M30 82h40" stroke-linecap="round" />
21
+ </g>
22
+ </svg>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="alpha-bR-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff08"/>
9
+ <g fill="#10243c" stroke="#4f9dff" stroke-width="2.2" filter="url(#alpha-bR-shadow)">
10
+
11
+ <rect x="29" y="23" width="42" height="11" rx="2" />
12
+ <rect x="33" y="18" width="8" height="10" rx="1" />
13
+ <rect x="46" y="18" width="8" height="10" rx="1" />
14
+ <rect x="59" y="18" width="8" height="10" rx="1" />
15
+ <path d="M32 69h40l-4 11H36z" />
16
+ <rect x="35" y="34" width="30" height="35" rx="4" />
17
+
18
+ </g>
19
+ <g fill="none" stroke="#f7fbff" stroke-width="2">
20
+ <path d="M30 82h40" stroke-linecap="round" />
21
+ </g>
22
+ </svg>
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="alpha-wB-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff00"/>
9
+ <g fill="#f7fbff" stroke="#173a62" stroke-width="2.2" filter="url(#alpha-wB-shadow)">
10
+
11
+ <circle cx="50" cy="22" r="6" />
12
+ <path d="M40 27c8 2 16 10 16 21 0 6-2 11-6 16H34l6-10c2-4 3-7 3-12 0-5-2-9-3-15z" />
13
+ <path d="M54 36l8 8" stroke-linecap="round" />
14
+ <path d="M26 69h48l-4 11H30z" />
15
+
16
+ </g>
17
+ <g fill="none" stroke="#4f9dff" stroke-width="2">
18
+ <path d="M30 82h40" stroke-linecap="round" />
19
+ </g>
20
+ </svg>
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="alpha-wK-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff00"/>
9
+ <g fill="#f7fbff" stroke="#173a62" stroke-width="2.2" filter="url(#alpha-wK-shadow)">
10
+
11
+ <rect x="38" y="44" width="24" height="9" rx="3" />
12
+ <rect x="46" y="23" width="8" height="24" rx="2" />
13
+ <rect x="35" y="31" width="30" height="8" rx="2" />
14
+ <path d="M26 69h48l-5 11H31z" />
15
+ <path d="M33 69V56c0-13 9-23 19-23s19 10 19 23v13z" />
16
+
17
+ </g>
18
+ <g fill="none" stroke="#4f9dff" stroke-width="2">
19
+ <path d="M30 82h40" stroke-linecap="round" />
20
+ </g>
21
+ </svg>
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="alpha-wN-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff00"/>
9
+ <g fill="#f7fbff" stroke="#173a62" stroke-width="2.2" filter="url(#alpha-wN-shadow)">
10
+
11
+ <path d="M34 66c0-17 4-31 16-42 5-5 13-8 18-6-2 4-3 8-2 12 4 2 7 6 8 11-5 0-9 1-13 4 4 5 6 12 6 21H34z" />
12
+ <circle cx="61" cy="33" r="2.5" />
13
+ <path d="M26 69h48l-4 11H30z" />
14
+
15
+ </g>
16
+ <g fill="none" stroke="#4f9dff" stroke-width="2">
17
+ <path d="M30 82h40" stroke-linecap="round" />
18
+ </g>
19
+ </svg>
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="alpha-wP-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff00"/>
9
+ <g fill="#f7fbff" stroke="#173a62" stroke-width="2.2" filter="url(#alpha-wP-shadow)">
10
+
11
+ <circle cx="50" cy="26" r="10" />
12
+ <path d="M37 69V58c0-9 6-17 13-17s13 8 13 17v11z" />
13
+ <path d="M26 69h48l-4 11H30z" />
14
+
15
+ </g>
16
+ <g fill="none" stroke="#4f9dff" stroke-width="2">
17
+ <path d="M30 82h40" stroke-linecap="round" />
18
+ </g>
19
+ </svg>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="alpha-wQ-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff00"/>
9
+ <g fill="#f7fbff" stroke="#173a62" stroke-width="2.2" filter="url(#alpha-wQ-shadow)">
10
+
11
+ <circle cx="28" cy="33" r="5" />
12
+ <circle cx="40" cy="26" r="5" />
13
+ <circle cx="52" cy="24" r="5" />
14
+ <circle cx="64" cy="31" r="5" />
15
+ <path d="M26 69h48l-4 11H30z" />
16
+ <path d="M30 66l6-26 12 12 12-15 4 29z" />
17
+
18
+ </g>
19
+ <g fill="none" stroke="#4f9dff" stroke-width="2">
20
+ <path d="M30 82h40" stroke-linecap="round" />
21
+ </g>
22
+ </svg>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="alpha-wR-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff00"/>
9
+ <g fill="#f7fbff" stroke="#173a62" stroke-width="2.2" filter="url(#alpha-wR-shadow)">
10
+
11
+ <rect x="29" y="23" width="42" height="11" rx="2" />
12
+ <rect x="33" y="18" width="8" height="10" rx="1" />
13
+ <rect x="46" y="18" width="8" height="10" rx="1" />
14
+ <rect x="59" y="18" width="8" height="10" rx="1" />
15
+ <path d="M32 69h40l-4 11H36z" />
16
+ <rect x="35" y="34" width="30" height="35" rx="4" />
17
+
18
+ </g>
19
+ <g fill="none" stroke="#4f9dff" stroke-width="2">
20
+ <path d="M30 82h40" stroke-linecap="round" />
21
+ </g>
22
+ </svg>
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="cburnett-bB-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff08"/>
9
+ <g fill="#231f20" stroke="#c23b22" stroke-width="2.8" filter="url(#cburnett-bB-shadow)">
10
+
11
+ <circle cx="50" cy="22" r="6" />
12
+ <path d="M40 27c8 2 16 10 16 21 0 6-2 11-6 16H34l6-10c2-4 3-7 3-12 0-5-2-9-3-15z" />
13
+ <path d="M54 36l8 8" stroke-linecap="round" />
14
+ <path d="M26 69h48l-4 11H30z" />
15
+
16
+ </g>
17
+ <g fill="none" stroke="#fff8f1" stroke-width="2">
18
+ <path d="M30 82h40" stroke-linecap="round" />
19
+ </g>
20
+ </svg>
@@ -0,0 +1,21 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="cburnett-bK-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff08"/>
9
+ <g fill="#231f20" stroke="#c23b22" stroke-width="2.8" filter="url(#cburnett-bK-shadow)">
10
+
11
+ <rect x="38" y="44" width="24" height="9" rx="3" />
12
+ <rect x="46" y="23" width="8" height="24" rx="2" />
13
+ <rect x="35" y="31" width="30" height="8" rx="2" />
14
+ <path d="M26 69h48l-5 11H31z" />
15
+ <path d="M33 69V56c0-13 9-23 19-23s19 10 19 23v13z" />
16
+
17
+ </g>
18
+ <g fill="none" stroke="#fff8f1" stroke-width="2">
19
+ <path d="M30 82h40" stroke-linecap="round" />
20
+ </g>
21
+ </svg>
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="cburnett-bN-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff08"/>
9
+ <g fill="#231f20" stroke="#c23b22" stroke-width="2.8" filter="url(#cburnett-bN-shadow)">
10
+
11
+ <path d="M34 66c0-17 4-31 16-42 5-5 13-8 18-6-2 4-3 8-2 12 4 2 7 6 8 11-5 0-9 1-13 4 4 5 6 12 6 21H34z" />
12
+ <circle cx="61" cy="33" r="2.5" />
13
+ <path d="M26 69h48l-4 11H30z" />
14
+
15
+ </g>
16
+ <g fill="none" stroke="#fff8f1" stroke-width="2">
17
+ <path d="M30 82h40" stroke-linecap="round" />
18
+ </g>
19
+ </svg>
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="cburnett-bP-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff08"/>
9
+ <g fill="#231f20" stroke="#c23b22" stroke-width="2.8" filter="url(#cburnett-bP-shadow)">
10
+
11
+ <circle cx="50" cy="26" r="10" />
12
+ <path d="M37 69V58c0-9 6-17 13-17s13 8 13 17v11z" />
13
+ <path d="M26 69h48l-4 11H30z" />
14
+
15
+ </g>
16
+ <g fill="none" stroke="#fff8f1" stroke-width="2">
17
+ <path d="M30 82h40" stroke-linecap="round" />
18
+ </g>
19
+ </svg>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="cburnett-bQ-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff08"/>
9
+ <g fill="#231f20" stroke="#c23b22" stroke-width="2.8" filter="url(#cburnett-bQ-shadow)">
10
+
11
+ <circle cx="28" cy="33" r="5" />
12
+ <circle cx="40" cy="26" r="5" />
13
+ <circle cx="52" cy="24" r="5" />
14
+ <circle cx="64" cy="31" r="5" />
15
+ <path d="M26 69h48l-4 11H30z" />
16
+ <path d="M30 66l6-26 12 12 12-15 4 29z" />
17
+
18
+ </g>
19
+ <g fill="none" stroke="#fff8f1" stroke-width="2">
20
+ <path d="M30 82h40" stroke-linecap="round" />
21
+ </g>
22
+ </svg>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="cburnett-bR-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff08"/>
9
+ <g fill="#231f20" stroke="#c23b22" stroke-width="2.8" filter="url(#cburnett-bR-shadow)">
10
+
11
+ <rect x="29" y="23" width="42" height="11" rx="2" />
12
+ <rect x="33" y="18" width="8" height="10" rx="1" />
13
+ <rect x="46" y="18" width="8" height="10" rx="1" />
14
+ <rect x="59" y="18" width="8" height="10" rx="1" />
15
+ <path d="M32 69h40l-4 11H36z" />
16
+ <rect x="35" y="34" width="30" height="35" rx="4" />
17
+
18
+ </g>
19
+ <g fill="none" stroke="#fff8f1" stroke-width="2">
20
+ <path d="M30 82h40" stroke-linecap="round" />
21
+ </g>
22
+ </svg>
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100">
3
+ <defs>
4
+ <filter id="cburnett-wB-shadow" x="-20%" y="-20%" width="140%" height="140%">
5
+ <feDropShadow dx="0" dy="2" stdDeviation="2" flood-color="#00000033"/>
6
+ </filter>
7
+ </defs>
8
+ <rect x="12" y="12" width="76" height="76" rx="14" fill="#ffffff00"/>
9
+ <g fill="#fff8f1" stroke="#5e2218" stroke-width="2.8" filter="url(#cburnett-wB-shadow)">
10
+
11
+ <circle cx="50" cy="22" r="6" />
12
+ <path d="M40 27c8 2 16 10 16 21 0 6-2 11-6 16H34l6-10c2-4 3-7 3-12 0-5-2-9-3-15z" />
13
+ <path d="M54 36l8 8" stroke-linecap="round" />
14
+ <path d="M26 69h48l-4 11H30z" />
15
+
16
+ </g>
17
+ <g fill="none" stroke="#c23b22" stroke-width="2">
18
+ <path d="M30 82h40" stroke-linecap="round" />
19
+ </g>
20
+ </svg>