@pech/chess-board 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/coords.ts","../src/fen.ts","../src/pieces-svg.ts","../src/assets.ts","../src/styles.ts","../src/dom.ts","../src/diff.ts","../src/arrows.ts","../src/board.ts"],"names":["sq"],"mappings":"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","file":"index.js","sourcesContent":["import type { Color, SquareKey } from './types.ts';\n\nexport const FILES = 'abcdefgh';\n\nexport function squareToCoords(\n sq: SquareKey,\n orientation: Color,\n): [col: number, row: number] {\n const fileIdx = FILES.indexOf(sq.charAt(0));\n const rank = Number(sq.charAt(1));\n if (orientation === 'white') {\n return [fileIdx, 8 - rank];\n }\n return [7 - fileIdx, rank - 1];\n}\n\nexport function coordsToSquare(\n col: number,\n row: number,\n orientation: Color,\n): SquareKey | null {\n if (col < 0 || col > 7 || row < 0 || row > 7) return null;\n let fileIdx: number;\n let rank: number;\n if (orientation === 'white') {\n fileIdx = col;\n rank = 8 - row;\n } else {\n fileIdx = 7 - col;\n rank = row + 1;\n }\n const file = FILES.charAt(fileIdx);\n if (!file) return null;\n return `${file}${rank}` as SquareKey;\n}\n\nexport function isLightSquare(sq: SquareKey): boolean {\n const fileIdx = FILES.indexOf(sq.charAt(0));\n const rankIdx = Number(sq.charAt(1)) - 1;\n return (fileIdx + rankIdx) % 2 !== 0;\n}\n","import type { Piece, PieceType, SquareKey } from './types.ts';\nimport { FILES } from './coords.ts';\n\nexport const STARTING_FEN =\n 'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1';\n\nconst FEN_PIECES: Readonly<Record<string, Piece>> = {\n K: { color: 'white', type: 'king' },\n Q: { color: 'white', type: 'queen' },\n R: { color: 'white', type: 'rook' },\n B: { color: 'white', type: 'bishop' },\n N: { color: 'white', type: 'knight' },\n P: { color: 'white', type: 'pawn' },\n k: { color: 'black', type: 'king' },\n q: { color: 'black', type: 'queen' },\n r: { color: 'black', type: 'rook' },\n b: { color: 'black', type: 'bishop' },\n n: { color: 'black', type: 'knight' },\n p: { color: 'black', type: 'pawn' },\n};\n\nconst PIECE_TO_CHAR: Record<PieceType, string> = {\n king: 'k',\n queen: 'q',\n rook: 'r',\n bishop: 'b',\n knight: 'n',\n pawn: 'p',\n};\n\nexport function parseFen(fen: string): Map<SquareKey, Piece> {\n const pieces = new Map<SquareKey, Piece>();\n const placement = fen.split(' ')[0] ?? '';\n const rows = placement.split('/');\n\n for (let r = 0; r < rows.length; r++) {\n const row = rows[r];\n if (!row) continue;\n const rank = 8 - r;\n let fileIdx = 0;\n for (const ch of row) {\n if (ch >= '1' && ch <= '8') {\n fileIdx += Number(ch);\n } else {\n const piece = FEN_PIECES[ch];\n if (piece && fileIdx < 8) {\n const file = FILES.charAt(fileIdx);\n pieces.set(`${file}${rank}` as SquareKey, piece);\n }\n fileIdx++;\n }\n }\n }\n\n return pieces;\n}\n\nexport function positionToFen(\n pieces: ReadonlyMap<SquareKey, Piece>,\n): string {\n const rows: string[] = [];\n for (let rank = 8; rank >= 1; rank--) {\n let row = '';\n let empty = 0;\n for (let f = 0; f < 8; f++) {\n const file = FILES.charAt(f);\n const key = `${file}${rank}` as SquareKey;\n const piece = pieces.get(key);\n if (piece) {\n if (empty > 0) {\n row += String(empty);\n empty = 0;\n }\n const ch = PIECE_TO_CHAR[piece.type];\n row += piece.color === 'white' ? ch.toUpperCase() : ch;\n } else {\n empty++;\n }\n }\n if (empty > 0) row += String(empty);\n rows.push(row);\n }\n return rows.join('/');\n}\n","export const PIECE_SVGS: Record<string, string> = {\n \"white-king\": \"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 4096 4096\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <path d=\\\"m2125.3 872.45h-156.01v-287.84h-182.37q-74.707 0-74.707-72.51v-2.1973q0-72.51 74.707-72.51h182.37v-186.77q0-76.904 79.102-76.904 76.904 0 76.904 76.904v186.77h188.96q72.51 0 72.51 72.51v2.1973q0 72.51-72.51 72.51l-186.77 2.1973z\\\"/>\\n <path d=\\\"m815.81 3151-72.51-410.89q-2.1973 0-6.5918-8.789-10.986-15.381-63.721-39.551-50.537-26.367-118.65-87.891-96.68-81.299-151.61-131.84-52.734-50.537-96.68-109.86-134.03-184.57-149.41-446.04-21.973-252.69 204.35-503.17 228.52-250.49 617.43-235.11 145.02 8.789 340.58 70.312 63.721 26.367 129.64 52.734 68.115 24.17 134.03 50.537 35.156 17.578 61.523 35.156-10.986-46.143-10.986-92.285 0-171.39 120.85-292.24 123.05-120.85 294.43-123.05 171.39 0 292.24 123.05 120.85 120.85 120.85 290.04 0 35.156-8.789 92.285 30.762-19.775 59.326-32.959 101.07-43.945 265.87-103.27 188.96-63.721 340.58-72.51 388.92-17.578 615.23 235.11 221.92 250.49 206.54 503.17-17.578 261.47-151.61 446.04-43.945 59.326-98.877 112.06-54.932 50.537-147.22 129.64-72.51 61.523-123.05 87.891-50.537 24.17-59.326 39.551-2.1973 4.3945-4.3946 6.5918-2.1972 2.1973-2.1972 4.3945l-70.312 413.09 145.02 542.72q-109.86 98.877-492.19 162.6t-883.3 63.721q-509.77 0-896.48-68.115-386.72-65.918-485.6-166.99z\\\"/>\\n <path d=\\\"m2123.2 2423.8q377.93 4.3945 692.14 46.143 314.21 39.551 492.19 101.07 83.496-65.918 182.37-145.02 98.877-81.299 164.79-164.8 105.47-134.03 105.47-353.76 0-197.75-94.482-329.59-169.19-246.09-514.16-246.09-206.54 0-424.07 85.693-191.16 76.904-290.04 171.39-184.57 184.57-272.46 474.61-30.762 103.27-37.354 188.96-4.3946 83.496-4.3946 171.39z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2048.4 2015.1q15.381-61.524 26.367-85.693 21.973-85.693 50.537-145.02 13.184-37.354 37.354-85.693 26.367-50.537 54.932-114.26 17.578-37.354 37.354-90.088 19.775-54.932 39.551-107.67 17.578-43.945 17.578-94.482 0-107.67-76.904-182.37-76.904-76.904-186.77-76.904-261.47 0-261.47 261.47 0 50.537 17.578 94.482 48.34 142.82 74.707 197.75 28.564 63.721 52.734 114.26 24.17 48.34 41.748 85.693 28.564 72.51 48.34 145.02 4.3945 13.184 26.367 83.496z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m1971.5 2423.8q-2.1973-85.693-6.5918-169.19-4.3945-85.693-32.959-188.96-90.088-294.43-272.46-474.61-94.482-92.285-290.04-171.39-224.12-87.891-424.07-87.891-347.17 0-514.16 248.29-94.482 131.84-94.482 329.59 0 215.33 105.47 353.76 63.721 81.299 162.6 162.6 98.877 81.299 184.57 147.22 384.52-138.43 1182.1-149.41z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3248.1 3614.6q-424.07-171.39-1190.9-171.39-795.41 0-1204.1 175.78 386.72 153.81 1197.5 153.81 386.72 0 705.32-43.945 318.6-41.748 492.19-114.26z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3191 3408.1-65.918-252.69q-435.06-96.68-1076.7-96.68-639.4 0-1074.5 96.68l-70.312 254.88q419.68-123.05 1147-123.05 722.9 0 1140.4 120.85z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m949.84 3017q417.48-105.47 1107.4-105.47 676.76 0 1092 101.07l54.932-323q-441.65-116.46-1155.8-116.46-718.51 0-1153.6 118.65z\\\" fill=\\\"#fff\\\"/>\\n</svg>\",\n \"white-queen\": \"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 4096 4096\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <path d=\\\"m3781.6 1118.5q-125.24 0-213.13-85.693-87.891-87.891-87.891-213.13 0-123.05 87.891-210.94 87.891-90.088 213.13-90.088 123.05 0 210.94 90.088 87.891 87.891 87.891 210.94 0 125.24-87.891 213.13-87.891 85.693-210.94 85.693z\\\"/>\\n <path d=\\\"m314.25 1118.5q-125.24 0-213.13-85.693-85.693-87.891-85.693-213.13 0-123.05 85.693-210.94 87.891-90.088 213.13-90.088t213.13 90.088q87.891 87.891 87.891 210.94 0 125.24-87.891 213.13-87.891 85.693-213.13 85.693z\\\"/>\\n <path d=\\\"m2968.6 876.76q-125.24 0-213.13-85.693-85.693-87.891-85.693-213.13 0-123.05 85.693-210.94 87.891-87.891 213.13-87.891 125.24 0 213.13 87.891 87.891 87.891 87.891 210.94 0 125.24-87.891 213.13-87.891 85.693-213.13 85.693z\\\"/>\\n <path d=\\\"m1122.9 876.76q-125.24 0-213.13-85.693-87.891-87.891-87.891-213.13 0-123.05 87.891-210.94 87.891-87.891 213.13-87.891 123.05 0 210.94 87.891 87.891 87.891 87.891 210.94 0 125.24-87.891 213.13-87.891 85.693-210.94 85.693z\\\"/>\\n <path d=\\\"m3399.2 3706.9q-107.67 94.482-483.4 158.2t-865.72 63.721q-498.78 0-876.71-65.918t-476.81-164.8l138.43-527.34-61.523-344.97-193.36-336.18-186.77-1366.7 107.67-41.748 602.05 1015.1 13.184-1208.5 149.41-26.367 459.23 1215.1 246.09-1307.4h151.61l246.09 1303 454.83-1210.7 151.61 26.367 13.184 1208.5 604.25-1017.3 103.27 48.34-182.37 1360.1-195.56 336.18-61.523 349.37z\\\"/>\\n <path d=\\\"m2045.8 766.99q-125.24 0-213.13-87.891-85.693-87.891-85.693-213.13 0-123.05 85.693-210.94 87.891-87.891 213.13-87.891 123.05 0 210.94 87.891 90.088 87.891 90.088 210.94 0 125.24-90.088 213.13-87.891 87.891-210.94 87.891z\\\"/>\\n <path d=\\\"m3781.6 964.65q145.02 0 145.02-145.02 0-147.22-145.02-147.22-147.22 0-147.22 147.22 0 145.02 147.22 145.02z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m314.25 964.65q147.22 0 147.22-145.02 0-147.22-147.22-147.22-145.02 0-145.02 147.22 0 145.02 145.02 145.02z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2968.6 722.95q147.22 0 147.22-145.02t-147.22-145.02q-145.02 0-145.02 145.02t145.02 145.02z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m1122.9 722.95q145.02 0 145.02-145.02t-145.02-145.02q-147.22 0-147.22 145.02t147.22 145.02z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3221.3 3627.8q-402.1-166.99-1166.7-166.99-780.03 0-1179.9 171.39 384.52 151.61 1173.3 151.61 377.93 0 689.94-41.748 314.21-41.748 483.4-114.26z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3166.3 3425.6-65.918-248.29q-430.66-94.482-1054.7-94.482-617.43 0-1052.5 94.482l-68.115 250.49q408.69-123.05 1122.8-123.05 696.53 0 1118.4 120.85z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3034.5 2313.8q50.537 15.381 112.06 15.381 134.03 0 250.49-83.496l120.85-760.25z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m1050.4 2302.8-472.41-815.19 120.85 742.68q125.24 87.891 243.9 87.891 46.143 0 107.67-15.381z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m1608.5 2179.8-360.35-986.57v1004.2q6.5918-8.789 19.775-21.973 43.945-92.285 145.02-92.285 83.496 0 136.23 70.312z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2843.4 2210.5v-1017.3l-362.55 997.56q41.748-15.381 70.312-39.551 43.945-54.932 118.65-54.932 87.891 0 140.62 76.904 6.5918 8.7891 15.381 19.775 8.7891 8.789 17.578 17.578z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2234.8 2168.8-186.77-1074.5-186.77 1061.3q6.5918-4.3946 30.762-21.973 50.537-98.877 153.81-98.877 112.06 0 145.02 98.877 13.184 13.184 43.945 35.156z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3219.1 2693.9 142.82-252.69q-105.47 41.748-215.33 41.748-294.43 0-470.21-239.5-131.84 109.86-294.43 109.86-210.94 0-336.18-164.79-140.62 153.81-336.18 153.81-158.2 0-290.04-107.67-184.57 235.11-476.81 235.11-112.06 0-221.92-41.748l153.81 263.67q426.27-123.05 1171.1-123.05 758.06 0 1173.3 125.24z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3164.2 2825.8q-424.07-107.67-1109.6-107.67-703.12 0-1122.8 109.86l32.959 210.94q428.47-101.07 1089.8-101.07 656.98 0 1072.3 98.877z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2045.8 613.18q147.22 0 147.22-147.22 0-145.02-147.22-145.02-145.02 0-145.02 145.02 0 147.22 145.02 147.22z\\\" fill=\\\"#fff\\\"/>\\n</svg>\",\n \"white-rook\": \"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 4096 4096\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <path d=\\\"m2350.1 549.46h373.54v-301.03h602.05v823.97l-487.79 375.73v1050.3l373.54 373.54v450.44h336.18v525.15h-2999.3v-525.15h336.18v-450.44l375.73-373.54v-1050.3l-487.79-375.73v-823.97h599.85v301.03h375.73v-301.03h602.05z\\\"/>\\n <path d=\\\"m2763.2 1298.9 279.05-226.32h-1986.3l281.25 226.32z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3004.9 2872.1-226.32-224.12h-1456.8l-230.71 224.12z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3174.1 923.07v-525.15h-301.03v301.03h-676.76v-301.03h-296.63v301.03h-674.56v-301.03h-301.03v525.15z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2686.3 1448.2h-1274.4v1050.3h1274.4z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3059.8 3023.6h-2021.5v298.83h2021.5z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3400.4 3471.9h-2702.6v226.32h2702.6z\\\" fill=\\\"#fff\\\"/>\\n</svg>\",\n \"white-bishop\": \"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 4096 4096\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <path d=\\\"m2048 3456.4q-30.762 125.24-74.707 173.58t-116.46 101.07q-79.102 54.932-186.77 92.285-107.67 39.551-239.5 19.775l-617.43-85.693q-37.354-4.3945-68.115 0-28.564 4.3946-54.932 4.3946-46.143 0-118.65 19.775-70.312 21.973-109.86 61.523l-213.13-349.37q39.551-43.945 70.312-61.524t72.51-37.354q127.44-59.326 272.46-72.51 61.523-4.3945 120.85-2.1972 59.326 2.1972 123.05-4.3946 118.65 19.775 237.3 37.354 120.85 15.381 241.7 32.959 131.84 0 177.98-26.367 24.17-13.184 76.904-48.34t105.47-103.27q-116.46-13.184-237.3-43.945-120.85-32.959-213.13-68.115l228.52-566.89q-171.39-98.877-239.5-158.2-68.115-61.523-107.67-140.62-57.129-101.07-74.707-195.56-15.381-94.482-13.184-169.19 2.1973-131.84 61.523-290.04 61.524-160.4 228.52-285.64 138.43-105.47 270.26-217.53 131.84-112.06 261.47-261.47-162.6-83.496-162.6-265.87 0-123.05 85.693-210.94 87.891-87.891 213.13-87.891 123.05 0 210.94 87.891 87.891 87.891 87.891 210.94 0 180.18-162.6 265.87 127.44 149.41 257.08 261.47 131.84 112.06 274.66 217.53 164.79 125.24 224.12 285.64 59.326 158.2 63.721 290.04 0 74.707-15.381 169.19-15.381 94.482-70.312 195.56-43.945 79.102-112.06 140.62-65.918 59.326-235.11 158.2l228.52 566.89q-96.68 35.156-217.53 68.115-120.85 30.762-232.91 43.945 50.537 68.115 103.27 103.27 52.734 35.156 79.102 48.34 46.143 26.367 177.98 26.367 118.65-17.578 237.3-32.959 120.85-17.578 241.7-37.354 59.326 6.5918 118.65 4.3946 61.523-2.1973 125.24 2.1972 140.62 13.184 272.46 72.51 39.551 19.775 70.312 37.354 32.959 17.578 72.51 61.524l-215.33 349.37q-39.551-39.551-112.06-61.523-70.312-19.775-114.26-19.775-28.564 0-59.326-4.3946-28.564-4.3945-65.918 0l-615.23 85.693q-131.84 19.775-246.09-17.578-112.06-37.354-184.57-98.877-72.51-59.326-116.46-103.27-41.748-41.748-70.312-166.99z\\\"/>\\n <path d=\\\"m1968.9 3208.1h-70.312q-123.05 197.75-235.11 248.29-52.734 26.367-116.46 48.34-63.721 21.973-147.22 21.973-15.381 0-235.11-35.156-105.47-15.381-166.99-32.959t-96.68-21.973q-125.24-15.381-292.24 13.184-101.07 17.578-188.96 63.721l105.47 171.39q26.367-26.367 68.115-35.156 43.945-6.5918 79.102-15.381 92.285-15.381 175.78-4.3946 28.564 6.5918 112.06 15.381 83.496 10.986 221.92 32.959 164.8 24.17 224.12 24.17 230.71 0 353.76-87.891 74.707-57.129 140.62-160.4 68.115-101.07 68.115-246.09z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2048 2379.7q213.13 0 408.69 32.959 215.33-76.904 312.01-239.5 83.496-140.62 83.496-309.81 0-101.07-50.537-221.92-50.537-123.05-164.79-221.92-129.64-107.67-283.45-235.11-153.81-129.64-305.42-301.03-153.81 171.39-307.62 301.03-153.81 127.44-281.25 235.11-116.46 98.877-166.99 221.92-48.34 120.85-48.34 221.92 0 169.19 81.299 309.81 94.482 162.6 314.21 239.5 193.36-32.959 408.69-32.959z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2048 2779.6q257.08 0 494.38 50.537l-105.47-270.26q-193.36-30.762-388.92-30.762-199.95 0-391.11 30.762l-105.47 270.26q235.11-50.537 496.58-50.537z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2048 694.4q149.41 0 149.41-149.41t-149.41-149.41-149.41 149.41 149.41 149.41z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2048 3087.2q149.41 0 290.04-24.17 142.82-26.367 274.66-61.523-257.08-68.115-564.7-68.115-312.01 0-564.7 68.115 127.44 35.156 270.26 61.523 142.82 24.17 294.43 24.17z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m1968.9 1817.2-182.37-2.1973q-74.707 0-74.707-74.707t74.707-74.707h182.37v-188.96q0-76.904 79.102-76.904 76.904 0 76.904 76.904v188.96h188.96q72.51 0 72.51 74.707t-72.51 74.707h-188.96v180.18q0 79.102-76.904 79.102-79.102 0-79.102-79.102z\\\"/>\\n <path d=\\\"m2124.9 3208.1q0 145.02 65.918 246.09 68.115 103.27 145.02 160.4 120.85 87.891 353.76 87.891 57.129 0 224.12-24.17 136.23-21.973 219.73-32.959 83.496-8.7891 112.06-15.381 83.496-10.986 175.78 4.3946 35.156 8.789 76.904 15.381 43.945 8.7891 72.51 35.156l105.47-171.39q-90.088-46.143-191.16-63.721-166.99-28.564-292.24-13.184-37.354 4.3945-98.877 21.973-59.326 17.578-162.6 32.959-221.92 35.156-235.11 35.156-85.693 0-149.41-21.973-63.721-21.973-114.26-48.34-116.46-52.734-237.3-248.29z\\\" fill=\\\"#fff\\\"/>\\n</svg>\",\n \"white-knight\": \"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 4096 4096\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <path d=\\\"m2166.6 613.2q344.97 21.973 639.4 177.98 294.43 156.01 500.98 399.9 145.02 171.39 272.46 413.09 129.64 241.7 206.54 511.96 87.891 314.21 109.86 661.38 24.17 344.97 24.17 639.4v479t-342.77 0q-340.58 0-885.5 0h-1474.4q-19.775 0-19.775-107.67 2.1972-107.67 15.381-173.58 8.7891-52.734 41.748-149.41t109.86-235.11q35.156-70.312 166.99-204.35 131.84-136.23 303.22-314.21 98.877-101.07 153.81-254.88 57.129-153.81 48.34-279.05-81.299 65.918-177.98 107.67-465.82 166.99-674.56 483.4-15.381 19.775-98.877 177.98-43.945 83.496-74.707 114.26-41.748 41.748-120.85 46.143-123.05 6.5918-191.16-118.65-92.285 26.367-164.79 21.973-123.05-46.143-177.98-98.877-112.06-112.06-147.22-224.12-32.959-112.06-32.959-241.7 0-184.57 228.52-487.79 268.07-349.37 285.64-531.74 0-79.102 15.381-177.98 13.184-68.115 54.932-131.84 28.564-43.945 37.354-59.326 10.986-17.578 37.354-50.537 19.775-26.367 32.959-39.551 13.184-15.381 32.959-39.551 24.17-28.564 61.523-65.918-116.46-320.8-94.482-661.38 437.26 156.01 733.89 489.99 72.51-248.29 285.64-402.1 175.78 123.05 279.05 325.2z\\\"/>\\n <path d=\\\"m3654.1 3739.9q-2.1972 0 4.3946-120.85 6.5918-118.65 6.5918-257.08 2.1972-274.66 0-566.89-2.1973-294.43-79.102-586.67-74.707-281.25-164.79-479-90.088-199.95-195.56-344.97-158.2-237.3-430.66-402.1-272.46-164.79-569.09-215.33 19.775 107.67 17.578 210.94-4.3945 79.102-74.707 79.102-81.299 0-72.51-79.102 6.5918-290.04-206.54-496.58-166.99 175.78-180.18 408.69-4.3946 76.904-79.102 68.115-70.312-2.1973-70.312-81.299 0 0 4.3945-17.578-90.088 28.564-188.96 81.299-63.721 43.945-103.27-21.973-39.551-65.918 35.156-103.27 94.482-48.34 142.82-72.51-188.96-193.36-430.66-312.01 26.367 305.42 166.99 577.88 37.354 57.129-17.578 101.07-61.523 48.34-103.27-15.381-15.381-21.973-43.945-79.102-46.143 46.143-61.523 68.115-15.381 19.775-54.932 87.891-37.354 68.115-54.932 112.06-19.775 54.932-17.578 90.088 4.3945 32.959 6.5918 74.707-19.775 129.64-90.088 243.9-68.115 114.26-175.78 279.05-103.27 158.2-158.2 237.3-54.932 79.102-83.496 202.15-19.775 74.707 0 182.37 19.775 105.47 85.693 164.8 101.07 103.27 195.56 94.482 30.762 0 81.299-24.17 52.734-24.17 81.299-92.285 57.129-125.24 94.482-125.24 54.932 0 59.326 61.523 0 13.184-35.156 109.86-19.775 43.945-52.734 92.285-41.748 57.129-37.354 48.34 35.156 125.24 116.46 43.945 24.17-24.17 54.932-90.088t96.68-177.98q76.904-129.64 164.8-210.94 87.891-81.299 156.01-131.84 39.551-28.564 96.68-65.918t153.81-76.904q76.904-30.762 169.19-74.707 94.482-46.142 166.99-116.46 101.07-98.877 156.01-243.9 28.564-81.299 21.973-199.95-19.775-74.707 74.707-74.707 70.312 0 79.102 72.51 0 248.29-140.62 452.64 46.143 140.62 24.17 307.62-19.775 134.03-94.482 287.84-72.51 151.61-296.63 338.38-454.83 377.93-430.66 777.83 0 0 373.54 0 375.73 0 705.32 0z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m674.71 2404q-63.721 39.551-76.904 105.47 2.1973 72.51-68.115 79.102-76.904 8.7891-79.102-65.918 8.7891-145.02 129.64-230.71 57.129-46.142 105.47 8.7891 48.34 59.326-10.986 103.27z\\\"/>\\n <path d=\\\"m1327.3 1355.9q28.564 43.945 21.973 92.285-21.973 140.62-156.01 118.65-39.551-6.5918-63.721-26.367-8.789 10.986-26.367 48.34-24.17 70.312-92.285 48.34-68.115-26.367-52.734-98.877 98.877-252.69 358.15-347.17 74.707-21.973 98.877 43.945 26.367 70.312-39.551 96.68-13.184 6.5918-24.17 13.184-10.986 4.3945-24.17 10.986z\\\"/>\\n</svg>\",\n \"white-pawn\": \"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 4096 4096\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <path d=\\\"m2049.1 3846.4h-1186.5q-87.891-219.73-87.891-459.23 0-406.49 230.71-729.49t593.26-461.43q-156.01-72.51-254.88-217.53-96.68-147.22-96.68-331.79 0-230.71 153.81-399.9t377.93-195.56q-177.98-134.03-177.98-353.76 0-184.57 129.64-316.41 131.84-131.84 318.6-131.84 184.57 0 316.41 131.84t131.84 316.41q0 219.73-177.98 353.76 224.12 26.367 377.93 195.56 153.81 169.19 153.81 399.9 0 184.57-101.07 331.79-98.877 145.02-252.69 217.53 362.55 138.43 593.26 461.43t230.71 729.49q0 237.3-85.693 459.23z\\\"/>\\n <path d=\\\"m2049.1 3697h1078.9q46.143-158.2 46.143-309.81 0-342.77-191.16-621.83-188.96-279.05-487.79-410.89-145.02-10.986-145.02-158.2 0-116.46 147.22-171.39 204.35-142.82 204.35-377.93 0-169.19-114.26-296.63t-276.86-147.22q-131.84-10.986-131.84-149.41 0-61.523 48.34-114.26 118.65-92.285 118.65-241.7 0-123.05-87.891-210.94-87.891-87.891-208.74-87.891-125.24 0-213.13 87.891-85.693 87.891-85.693 210.94 0 147.22 118.65 241.7 48.34 48.34 48.34 114.26 0 138.43-129.64 149.41-164.79 19.775-279.05 147.22-112.06 127.44-112.06 296.63 0 235.11 204.35 377.93 147.22 57.129 147.22 171.39 0 147.22-147.22 158.2-298.83 131.84-487.79 410.89t-188.96 621.83q0 162.6 46.143 309.81z\\\" fill=\\\"#fff\\\"/>\\n</svg>\",\n \"black-king\": \"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 4096 4096\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <path d=\\\"m815.83 3151.1-72.51-410.89q-2.1973 0-6.5918-8.789-10.986-15.381-63.721-39.551-50.537-26.367-118.65-87.891-96.68-81.299-151.61-131.84-52.734-50.537-96.68-109.86-134.03-184.57-149.41-446.04-21.973-252.69 204.35-503.17 228.52-250.49 617.43-235.11 145.02 8.789 340.58 70.312 63.721 26.367 129.64 52.734 68.115 24.17 134.03 50.537 35.156 17.578 61.523 35.156-10.986-46.143-10.986-92.285 0-171.39 120.85-292.24 123.05-120.85 294.43-123.05 171.39 0 292.24 123.05 120.85 120.85 120.85 290.04 0 35.156-8.789 92.285 30.762-19.775 59.326-32.959 101.07-43.945 265.87-103.27 188.96-63.721 340.58-72.51 388.92-17.578 615.23 235.11 221.92 250.49 206.54 503.17-17.578 261.47-151.61 446.04-43.945 59.326-98.877 112.06-54.932 50.537-147.22 129.64-72.51 61.523-123.05 87.891-50.537 24.17-59.326 39.551-2.1973 4.3945-4.3946 6.5918-2.1972 2.1973-2.1972 4.3945l-70.312 413.09 145.02 542.72q-109.86 98.877-492.19 162.6t-883.3 63.721q-509.77 0-896.48-68.115-386.72-65.918-485.6-166.99z\\\"/>\\n <path d=\\\"m2048.5 2015.1q15.381-61.524 26.367-85.693 21.973-85.693 50.537-145.02 13.184-37.354 37.354-85.693 26.367-50.537 54.932-114.26 17.578-37.354 37.354-90.088 19.775-54.932 39.551-107.67 17.578-43.945 17.578-94.482 0-107.67-76.904-182.37-76.904-76.904-186.77-76.904-261.47 0-261.47 261.47 0 50.537 17.578 94.482 48.34 142.82 74.707 197.75 28.564 63.721 52.734 114.26 24.17 48.34 41.748 85.693 28.564 72.51 48.34 145.02 4.3945 13.184 26.367 83.496z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2048.5 1639.3q-4.3945-21.973-10.986-37.354-13.184-43.945-21.973-63.721-6.5918-15.381-17.578-37.354-10.986-24.17-21.973-50.537-6.5918-15.381-17.578-39.551-8.7891-26.367-15.381-48.34-6.5918-19.775-6.5918-41.748 0-116.46 112.06-116.46 116.46 0 116.46 114.26 0 28.564-8.7891 41.748-30.762 83.496-32.959 90.088-32.959 65.918-41.748 85.693-15.381 35.156-19.775 63.721-6.5918 13.184-8.7891 24.17-2.1972 8.7891-4.3945 15.381z\\\"/>\\n <path d=\\\"m1969.4 2566.6q0-87.891-4.3945-241.7-4.3945-156.01-32.959-259.28-90.088-294.43-272.46-474.61-94.482-92.285-290.04-171.39-224.12-87.891-424.07-87.891-347.17 0-514.16 248.29-94.482 131.84-94.482 329.59 0 215.33 105.47 353.76 54.932 79.102 210.94 195.56 156.01 116.46 263.67 215.33 191.16-41.748 430.66-72.51 241.7-30.762 621.83-35.156z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m1802.4 2397.4q-274.66 4.3945-503.17 28.564-226.32 24.17-351.56 68.115-65.918-81.299-153.81-162.6-85.693-83.496-151.61-156.01-109.86-112.06-109.86-246.09 0-164.79 54.932-241.7 59.326-87.891 182.37-129.64 123.05-43.945 248.29-43.945 158.2 0 303.22 70.312 142.82 74.707 188.96 118.65 149.41 151.61 232.91 329.59 28.564 65.918 41.748 184.57 15.381 116.46 17.578 180.18z\\\"/>\\n <path d=\\\"m2125.4 872.49h-156.01v-287.84h-182.37q-74.707 0-74.707-72.51v-2.1973q0-72.51 74.707-72.51h182.37v-186.77q0-76.904 79.102-76.904 76.904 0 76.904 76.904v186.77h188.96q72.51 0 72.51 72.51v2.1973q0 72.51-72.51 72.51l-186.77 2.1973z\\\"/>\\n <path d=\\\"m3191 3605.9-65.918-259.28q-428.47-98.877-1076.7-98.877-641.6 0-1072.3 98.877l-70.312 261.47q417.48-127.44 1144.8-127.44 349.37 0 648.19 35.156 298.83 35.156 492.19 90.088z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3133.9 2948.9q-404.3-112.06-1076.7-112.06-676.76 0-1089.8 114.26l32.959 221.92q415.28-107.67 1056.9-107.67 639.4 0 1041.5 105.47z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2127.6 2568.8q377.93 6.5918 619.63 37.354 241.7 30.762 435.06 72.51 120.85-118.65 268.07-226.32t206.54-184.57q105.47-142.82 105.47-355.96 0-195.56-94.482-327.39-169.19-248.29-516.36-248.29-202.15 0-421.88 87.891-199.95 79.102-290.04 171.39-186.77 180.18-272.46 474.61-32.959 101.07-37.354 257.08-2.1972 156.01-2.1972 241.7z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2288 2397.4q0-63.721 13.184-180.18 15.381-118.65 46.143-184.57 81.299-177.98 232.91-329.59 43.945-43.945 188.96-118.65 142.82-70.312 305.42-70.312 123.05 0 243.9 43.945 123.05 41.748 184.57 129.64 54.932 74.707 54.932 241.7 0 131.84-107.67 246.09-70.312 72.51-151.61 147.22-81.299 72.51-156.01 171.39-127.44-43.945-355.96-68.115-226.32-24.17-498.78-28.564z\\\"/>\\n</svg>\",\n \"black-queen\": \"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 4096 4096\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <path d=\\\"m2045.9 767.01q-125.24 0-213.13-87.891-85.693-87.891-85.693-213.13 0-123.05 85.693-210.94 87.891-87.891 213.13-87.891 123.05 0 210.94 87.891 90.088 87.891 90.088 210.94 0 125.24-90.088 213.13-87.891 87.891-210.94 87.891z\\\"/>\\n <path d=\\\"m3399.4 3706.9q-107.67 94.482-483.4 158.2t-865.72 63.721q-498.78 0-876.71-65.918t-476.81-164.8l138.43-527.34-61.523-344.97-193.36-336.18-186.77-1366.7 107.67-41.748 602.05 1015.1 13.184-1208.5 149.41-26.367 459.23 1215.1 246.09-1307.4h151.61l246.09 1303 454.83-1210.7 151.61 26.367 13.184 1208.5 604.25-1017.3 103.27 48.34-182.37 1360.1-195.56 336.18-61.523 349.37z\\\"/>\\n <path d=\\\"m1123 876.8q-125.24 0-213.13-85.693-87.891-87.891-87.891-213.13 0-123.05 87.891-210.94 87.891-87.891 213.13-87.891 123.05 0 210.94 87.891 87.891 87.891 87.891 210.94 0 125.24-87.891 213.13-87.891 85.693-210.94 85.693z\\\"/>\\n <path d=\\\"m2968.7 876.8q-125.24 0-213.13-85.693-85.693-87.891-85.693-213.13 0-123.05 85.693-210.94 87.891-87.891 213.13-87.891 125.24 0 213.13 87.891 87.891 87.891 87.891 210.94 0 125.24-87.891 213.13-87.891 85.693-213.13 85.693z\\\"/>\\n <path d=\\\"m314.38 1118.5q-125.24 0-213.13-85.693-85.693-87.891-85.693-213.13 0-123.05 85.693-210.94 87.891-90.088 213.13-90.088t213.13 90.088q87.891 87.891 87.891 210.94 0 125.24-87.891 213.13-87.891 85.693-213.13 85.693z\\\"/>\\n <path d=\\\"m3781.7 1118.5q-125.24 0-213.13-85.693-87.891-87.891-87.891-213.13 0-123.05 87.891-210.94 87.891-90.088 213.13-90.088 123.05 0 210.94 90.088 87.891 87.891 87.891 210.94 0 125.24-87.891 213.13-87.891 85.693-210.94 85.693z\\\"/>\\n <path d=\\\"m3131.3 2979.6q-404.3-112.06-1076.7-112.06-676.76 0-1089.8 114.26l32.959 221.92q415.28-107.67 1056.9-107.67 639.4 0 1041.5 105.47z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3188.4 3636.6-65.918-259.28q-428.47-98.877-1076.7-98.877-641.6 0-1072.3 98.877l-70.312 261.47q417.48-127.44 1144.8-127.44 349.37 0 648.19 35.156 298.83 35.156 492.19 90.088z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3285.1 2586.3q-182.37-65.918-514.16-107.67-329.59-43.945-729.49-43.945-391.11 0-716.31 41.748-325.2 39.551-511.96 105.47l109.86 199.95q184.57-54.932 479-79.102t643.8-24.17 646 24.17 481.2 81.299z\\\" fill=\\\"#fff\\\"/>\\n</svg>\",\n \"black-rook\": \"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 4096 4096\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <path d=\\\"m2350.1 549.46h373.54v-301.03h602.05v823.97l-487.79 375.73v1050.3l373.54 373.54v450.44h336.18v525.15h-2999.3v-525.15h336.18v-450.44l375.73-373.54v-1050.3l-487.79-375.73v-823.97h599.85v301.03h375.73v-301.03h602.05z\\\"/>\\n <path d=\\\"m2049 2836.8h-909.67l-101.07 94.482v127.44h2021.5v-127.44l-101.07-94.482z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2049 2458.9h-637.21v101.07l-131.84 127.44h1538.1l-131.84-127.44v-101.07z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2049 1259.2h-769.04l131.84 103.27v125.24h1274.4v-125.24l131.84-103.27z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2049 887.86h-1125v101.07l160.4 120.85h1931.4l156.01-120.85v-101.07z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m1038.3 3287.3v224.12h2021.5v-224.12z\\\" fill=\\\"#fff\\\"/>\\n</svg>\",\n \"black-bishop\": \"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 4096 4096\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <path d=\\\"m2048 3456.3q-30.762 125.24-74.707 173.58t-116.46 101.07q-79.102 54.932-186.77 92.285-107.67 39.551-239.5 19.775l-617.43-85.693q-37.354-4.3945-68.115 0-28.564 4.3946-54.932 4.3946-46.143 0-118.65 19.775-70.312 21.973-109.86 61.523l-213.13-349.37q39.551-43.945 70.312-61.524t72.51-37.354q127.44-59.326 272.46-72.51 61.523-4.3945 120.85-2.1972 59.326 2.1972 123.05-4.3946 118.65 19.775 237.3 37.354 120.85 15.381 241.7 32.959 131.84 0 177.98-26.367 24.17-13.184 76.904-48.34t105.47-103.27q-116.46-13.184-237.3-43.945-120.85-32.959-213.13-68.115l228.52-566.89q-171.39-98.877-239.5-158.2-68.115-61.523-107.67-140.62-57.129-101.07-74.707-195.56-15.381-94.482-13.184-169.19 2.1973-131.84 61.523-290.04 61.524-160.4 228.52-285.64 138.43-105.47 270.26-217.53 131.84-112.06 261.47-261.47-162.6-83.496-162.6-265.87 0-123.05 85.693-210.94 87.891-87.891 213.13-87.891 123.05 0 210.94 87.891 87.891 87.891 87.891 210.94 0 180.18-162.6 265.87 127.44 149.41 257.08 261.47 131.84 112.06 274.66 217.53 164.79 125.24 224.12 285.64 59.326 158.2 63.721 290.04 0 74.707-15.381 169.19-15.381 94.482-70.312 195.56-43.945 79.102-112.06 140.62-65.918 59.326-235.11 158.2l228.52 566.89q-96.68 35.156-217.53 68.115-120.85 30.762-232.91 43.945 50.537 68.115 103.27 103.27 52.734 35.156 79.102 48.34 46.143 26.367 177.98 26.367 118.65-17.578 237.3-32.959 120.85-17.578 241.7-37.354 59.326 6.5918 118.65 4.3946 61.523-2.1973 125.24 2.1972 140.62 13.184 272.46 72.51 39.551 19.775 70.312 37.354 32.959 17.578 72.51 61.524l-215.33 349.37q-39.551-39.551-112.06-61.523-70.312-19.775-114.26-19.775-28.564 0-59.326-4.3946-28.564-4.3945-65.918 0l-615.23 85.693q-131.84 19.775-246.09-17.578-112.06-37.354-184.57-98.877-72.51-59.326-116.46-103.27-41.748-41.748-70.312-166.99z\\\"/>\\n <path d=\\\"m1966.7 1821.5v186.77q0 81.299 81.299 81.299t81.299-81.299v-188.96h197.75q76.904 0 76.904-79.102t-76.904-79.102h-197.75v-197.75q0-81.299-81.299-81.299t-81.299 81.299v197.75h-193.36q-76.904 0-76.904 79.102t76.904 79.102z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m1918.4 3416.7q50.537-107.67 50.537-208.74h-70.312q-85.693 140.62-177.98 208.74z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2371 3416.7q-87.891-65.918-175.78-208.74h-70.312q0 107.67 50.537 208.74z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2447.9 2586.2-63.721-153.81v-59.326q-166.99-24.17-336.18-24.17-164.79 0-333.98 24.17l-2.1972 59.326-59.326 153.81q186.77-32.959 395.51-32.959 210.94 0 399.9 32.959z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2632.5 3038.8-92.285-224.12q-224.12-48.34-492.19-48.34-265.87 0-487.79 48.34l-92.285 221.92q272.46-68.115 580.08-68.115 303.22 0 584.47 70.312z\\\" fill=\\\"#fff\\\"/>\\n</svg>\",\n \"black-knight\": \"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 4096 4096\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <path d=\\\"m2166.7 613.11q344.97 21.973 639.4 177.98 294.43 156.01 500.98 399.9 145.02 171.39 272.46 413.09 129.64 241.7 206.54 511.96 87.891 314.21 109.86 661.38 24.17 344.97 24.17 639.4v479t-342.77 0q-340.58 0-885.5 0h-1474.4q-19.775 0-19.775-107.67 2.1972-107.67 15.381-173.58 8.7891-52.734 41.748-149.41t109.86-235.11q35.156-70.312 166.99-204.35 131.84-136.23 303.22-314.21 98.877-101.07 153.81-254.88 57.129-153.81 48.34-279.05-81.299 65.918-177.98 107.67-465.82 166.99-674.56 483.4-15.381 19.775-98.877 177.98-43.945 83.496-74.707 114.26-41.748 41.748-120.85 46.143-123.05 6.5918-191.16-118.65-92.285 26.367-164.79 21.973-123.05-46.143-177.98-98.877-112.06-112.06-147.22-224.12-32.959-112.06-32.959-241.7 0-184.57 228.52-487.79 268.07-349.37 285.64-531.74 0-79.102 15.381-177.98 13.184-68.115 54.932-131.84 28.564-43.945 37.354-59.326 10.986-17.578 37.354-50.537 19.775-26.367 32.959-39.551 13.184-15.381 32.959-39.551 24.17-28.564 61.523-65.918-116.46-320.8-94.482-661.38 437.26 156.01 733.89 489.99 72.51-248.29 285.64-402.1 175.78 123.05 279.05 325.2z\\\"/>\\n <path d=\\\"m1237.2 1355.8q48.34-24.17 48.34-24.17 65.918-26.367 41.748-96.68-26.367-65.918-101.07-43.945-259.28 94.482-358.15 347.17-15.381 72.51 52.734 98.877 68.115 21.973 92.285-48.34 17.578-37.354 26.367-48.34 24.17 19.775 63.721 26.367 134.03 21.973 156.01-118.65 6.5918-48.34-21.973-92.285z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m683.47 2450q63.721-43.945 13.184-105.47-52.734-50.537-116.46-8.789-134.03 87.891-142.82 230.71 2.1973 72.51 85.693 68.115 79.102-6.5918 76.904-81.299 17.578-70.312 83.496-103.27z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m3654.2 3739.8q-2.1972 0 4.3946-120.85 6.5918-118.65 6.5918-257.08 2.1972-274.66 0-566.89-2.1973-294.43-79.102-586.67-74.707-281.25-164.79-479-90.088-199.95-195.56-344.97-158.2-237.3-430.66-402.1-272.46-164.79-569.09-215.33 8.789 50.537 4.3945 103.27-2.1973 52.734 2.1973 101.07 213.13 72.51 402.1 180.18 188.96 107.67 276.86 232.91 105.47 145.02 195.56 344.97 90.088 197.75 164.79 479 74.707 292.24 76.904 586.67 2.1973 292.24 2.1973 566.89 0 138.43-6.5918 257.08-6.5918 120.85 0 120.85z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m1595.4 953.71q-10.986-79.102 4.3946-171.39-131.84 26.367-248.29 123.05-70.312 37.353-32.959 103.27 37.354 68.115 103.27 21.973 46.142-24.17 83.496-43.945 39.551-21.973 90.088-32.959z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m2168.9 2026q153.81-202.15 151.61-450.44-8.7891-72.51-83.496-72.51-101.07 0-79.102 74.707 6.5918 120.85-24.17 199.95-50.537 125.24-112.06 186.77-32.959 65.918 39.551 96.68 70.312 32.959 107.67-35.156z\\\" fill=\\\"#fff\\\"/>\\n <path d=\\\"m872.46 2841.2q8.789-19.775 28.564-59.326 37.354-92.285 37.354-109.86-4.3945-61.523-63.721-61.523-43.945 0-103.27 125.24-8.7891 17.578-26.367 30.762-59.326 61.524 17.578 103.27 70.312 41.748 109.86-28.564z\\\" fill=\\\"#fff\\\"/>\\n</svg>\",\n \"black-pawn\": \"<svg version=\\\"1.1\\\" viewBox=\\\"0 0 4096 4096\\\" xmlns=\\\"http://www.w3.org/2000/svg\\\">\\n <path d=\\\"m2049.1 3846.5h-1186.5q-87.891-219.73-87.891-459.23 0-406.49 230.71-729.49 230.71-323 593.26-461.43-156.01-72.51-254.88-217.53-96.68-147.22-96.68-331.79 0-230.71 153.81-399.9 153.81-169.19 377.93-195.56-177.98-134.03-177.98-353.76 0-184.57 129.64-316.41 131.84-131.84 318.6-131.84 184.57 0 316.41 131.84 131.84 131.84 131.84 316.41 0 219.73-177.98 353.76 224.12 26.367 377.93 195.56 153.81 169.19 153.81 399.9 0 184.57-101.07 331.79-98.877 145.02-252.69 217.53 362.55 138.43 593.26 461.43 230.71 323 230.71 729.49 0 237.3-85.693 459.23z\\\" dominant-baseline=\\\"central\\\" aria-label=\\\"♟\\\"/>\\n</svg>\",\n};\n","import type { Piece, PieceTheme, BoardTheme } from './types.ts';\nimport { PIECE_SVGS } from './pieces-svg.ts';\n\nexport const defaultPieceTheme: PieceTheme = (piece: Piece): string => {\n return PIECE_SVGS[`${piece.color}-${piece.type}`] ?? '';\n};\n\nexport const defaultBoardTheme: BoardTheme = {\n lightSquare: '#f0d9b5',\n darkSquare: '#b58863',\n};\n","export function injectStyles(): void {\n if (typeof document === 'undefined') return;\n if (document.getElementById('cb-styles')) return;\n const el = document.createElement('style');\n el.id = 'cb-styles';\n el.textContent = STYLES;\n document.head.appendChild(el);\n}\n\nconst STYLES = /* css */ `\n.cb-board {\n position: relative;\n display: grid;\n grid-template-columns: repeat(8, 1fr);\n grid-template-rows: repeat(8, 1fr);\n aspect-ratio: 1 / 1;\n width: 100%;\n contain: layout style paint;\n user-select: none;\n -webkit-user-select: none;\n touch-action: none;\n -webkit-touch-callout: none;\n box-sizing: border-box;\n overflow: hidden;\n}\n\n/* Squares */\n.cb-square {\n position: relative;\n width: 100%;\n height: 100%;\n box-sizing: border-box;\n}\n.cb-square.cb-light { background: var(--cb-light-sq); }\n.cb-square.cb-dark { background: var(--cb-dark-sq); }\n\n/* Highlight: last move */\n.cb-square.cb-hl-lastmove.cb-light { background: var(--cb-hl-lm-light, #cdd16a); }\n.cb-square.cb-hl-lastmove.cb-dark { background: var(--cb-hl-lm-dark, #aaaa23); }\n\n/* Highlight: selected */\n.cb-square.cb-hl-selected.cb-light { background: var(--cb-hl-sel-light, #7fc97f); }\n.cb-square.cb-hl-selected.cb-dark { background: var(--cb-hl-sel-dark, #5aad5a); }\n\n/* Highlight: check */\n.cb-square.cb-hl-check {\n background: radial-gradient(\n ellipse at center,\n rgba(255,0,0,0.6) 0%,\n rgba(255,0,0,0.3) 40%,\n rgba(255,0,0,0) 70%\n ) !important;\n}\n\n/* Legal move indicators: dot on empty squares */\n.cb-square.cb-legal::after {\n content: '';\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 28%;\n height: 28%;\n border-radius: 50%;\n background: rgba(0, 0, 0, 0.14);\n pointer-events: none;\n z-index: 1;\n}\n\n/* Legal move indicators: ring on capture squares */\n.cb-square.cb-legal.cb-has-piece::after {\n width: 100%;\n height: 100%;\n border-radius: 0;\n background: radial-gradient(transparent 48%, rgba(0,0,0,0.12) 52%);\n}\n\n/* Pieces — smaller than cell so they don't touch edges (padding via size) */\n.cb-piece {\n position: absolute;\n width: 12.5%;\n height: 12.5%;\n top: 0;\n left: 0;\n z-index: 2;\n pointer-events: none;\n will-change: transform;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.cb-piece.cb-animating {\n transition: transform var(--cb-anim-duration, 150ms) ease-out;\n}\n.cb-piece.cb-dragging {\n z-index: 10;\n cursor: grabbing;\n transition: none !important;\n}\n.cb-piece img,\n.cb-piece svg {\n width: var(--cb-piece-size, 85%);\n height: var(--cb-piece-size, 85%);\n object-fit: contain;\n display: block;\n pointer-events: none;\n}\n\n/* Coordinates */\n.cb-coord {\n position: absolute;\n font-size: 0.7em;\n font-family: system-ui, sans-serif;\n font-weight: 700;\n pointer-events: none;\n z-index: 1;\n line-height: 1;\n}\n.cb-coord-file { right: 2px; bottom: 1px; }\n.cb-coord-rank { left: 2px; top: 1px; }\n.cb-coord.cb-on-light { color: var(--cb-dark-sq); }\n.cb-coord.cb-on-dark { color: var(--cb-light-sq); }\n\n/* SVG overlay for arrows */\n.cb-svg {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n z-index: 3;\n pointer-events: none;\n overflow: visible;\n}\n`;\n","import type { Color, Piece, PieceTheme, BoardTheme, SquareKey } from './types.ts';\nimport { squareToCoords, coordsToSquare, isLightSquare } from './coords.ts';\n\nexport function createBoardDOM(\n orientation: Color,\n theme: BoardTheme,\n showCoords: boolean,\n): {\n boardEl: HTMLElement;\n squareEls: Map<SquareKey, HTMLElement>;\n svgEl: SVGSVGElement;\n} {\n const boardEl = document.createElement('div');\n boardEl.className = 'cb-board';\n boardEl.style.setProperty('--cb-light-sq', theme.lightSquare);\n boardEl.style.setProperty('--cb-dark-sq', theme.darkSquare);\n\n const squareEls = new Map<SquareKey, HTMLElement>();\n\n for (let row = 0; row < 8; row++) {\n for (let col = 0; col < 8; col++) {\n const sq = coordsToSquare(col, row, orientation)!;\n const light = isLightSquare(sq);\n const div = document.createElement('div');\n div.className = `cb-square ${light ? 'cb-light' : 'cb-dark'}`;\n div.setAttribute('data-square', sq);\n\n if (showCoords) {\n appendCoords(div, sq, row, col, light);\n }\n\n boardEl.appendChild(div);\n squareEls.set(sq, div);\n }\n }\n\n const svgEl = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svgEl.setAttribute('class', 'cb-svg');\n svgEl.setAttribute('viewBox', '0 0 100 100');\n boardEl.appendChild(svgEl);\n\n return { boardEl, squareEls, svgEl };\n}\n\nexport function rebuildSquares(\n boardEl: HTMLElement,\n squareEls: Map<SquareKey, HTMLElement>,\n orientation: Color,\n theme: BoardTheme,\n showCoords: boolean,\n): void {\n for (const el of squareEls.values()) {\n el.remove();\n }\n squareEls.clear();\n\n boardEl.style.setProperty('--cb-light-sq', theme.lightSquare);\n boardEl.style.setProperty('--cb-dark-sq', theme.darkSquare);\n\n const svgEl = boardEl.querySelector('.cb-svg');\n\n for (let row = 0; row < 8; row++) {\n for (let col = 0; col < 8; col++) {\n const sq = coordsToSquare(col, row, orientation)!;\n const light = isLightSquare(sq);\n const div = document.createElement('div');\n div.className = `cb-square ${light ? 'cb-light' : 'cb-dark'}`;\n div.setAttribute('data-square', sq);\n\n if (showCoords) {\n appendCoords(div, sq, row, col, light);\n }\n\n if (svgEl) {\n boardEl.insertBefore(div, svgEl);\n } else {\n boardEl.appendChild(div);\n }\n squareEls.set(sq, div);\n }\n }\n}\n\nexport function createPieceEl(\n sq: SquareKey,\n piece: Piece,\n orientation: Color,\n pieceTheme: PieceTheme,\n): HTMLElement {\n const [col, row] = squareToCoords(sq, orientation);\n const el = document.createElement('div');\n el.className = 'cb-piece';\n el.setAttribute('data-square', sq);\n el.setAttribute('aria-label', `${piece.color} ${piece.type}`);\n el.style.transform = `translate(${col * 100}%, ${row * 100}%)`;\n\n const content = pieceTheme(piece);\n if (content.trimStart().startsWith('<')) {\n el.innerHTML = content;\n } else {\n const img = document.createElement('img');\n img.src = content;\n img.alt = `${piece.color} ${piece.type}`;\n img.draggable = false;\n el.appendChild(img);\n }\n\n return el;\n}\n\nfunction appendCoords(\n div: HTMLElement,\n sq: SquareKey,\n row: number,\n col: number,\n light: boolean,\n): void {\n const colorCls = light ? 'cb-on-light' : 'cb-on-dark';\n if (row === 7) {\n const span = document.createElement('span');\n span.className = `cb-coord cb-coord-file ${colorCls}`;\n span.textContent = sq.charAt(0);\n div.appendChild(span);\n }\n if (col === 0) {\n const span = document.createElement('span');\n span.className = `cb-coord cb-coord-rank ${colorCls}`;\n span.textContent = sq.charAt(1);\n div.appendChild(span);\n }\n}\n","import type { Piece, SquareKey } from './types.ts';\n\nexport interface PieceDiff {\n readonly moved: ReadonlyArray<{\n from: SquareKey;\n to: SquareKey;\n piece: Piece;\n }>;\n readonly added: ReadonlyArray<{ square: SquareKey; piece: Piece }>;\n readonly removed: readonly SquareKey[];\n}\n\nfunction samePiece(a: Piece, b: Piece): boolean {\n return a.color === b.color && a.type === b.type;\n}\n\nexport function diffPieces(\n oldPieces: ReadonlyMap<SquareKey, Piece>,\n newPieces: ReadonlyMap<SquareKey, Piece>,\n): PieceDiff {\n const disappeared: Array<{ square: SquareKey; piece: Piece }> = [];\n const appeared: Array<{ square: SquareKey; piece: Piece }> = [];\n\n for (const [sq, piece] of oldPieces) {\n const np = newPieces.get(sq);\n if (!np || !samePiece(piece, np)) {\n disappeared.push({ square: sq, piece });\n }\n }\n\n for (const [sq, piece] of newPieces) {\n const op = oldPieces.get(sq);\n if (!op || !samePiece(op, piece)) {\n appeared.push({ square: sq, piece });\n }\n }\n\n const moved: Array<{ from: SquareKey; to: SquareKey; piece: Piece }> = [];\n const usedD = new Set<number>();\n const usedA = new Set<number>();\n\n for (let a = 0; a < appeared.length; a++) {\n if (usedA.has(a)) continue;\n const ap = appeared[a]!;\n for (let d = 0; d < disappeared.length; d++) {\n if (usedD.has(d)) continue;\n const dp = disappeared[d]!;\n if (samePiece(dp.piece, ap.piece)) {\n moved.push({ from: dp.square, to: ap.square, piece: ap.piece });\n usedD.add(d);\n usedA.add(a);\n break;\n }\n }\n }\n\n const removed = disappeared\n .filter((_, i) => !usedD.has(i))\n .map((d) => d.square);\n const added = appeared.filter((_, i) => !usedA.has(i));\n\n return { moved, added, removed };\n}\n","import type { Arrow, Color, SquareKey } from './types.ts';\nimport { squareToCoords } from './coords.ts';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\nconst DEFAULT_COLOR = 'rgba(0, 180, 50, 0.8)';\n\nfunction squareCenter(\n sq: SquareKey,\n orientation: Color,\n): [x: number, y: number] {\n const [col, row] = squareToCoords(sq, orientation);\n return [(col + 0.5) * 12.5, (row + 0.5) * 12.5];\n}\n\nfunction createArrowEl(arrow: Arrow, orientation: Color): SVGGElement {\n const color = arrow.color ?? DEFAULT_COLOR;\n const [x1, y1] = squareCenter(arrow.from, orientation);\n const [x2, y2] = squareCenter(arrow.to, orientation);\n\n const dx = x2 - x1;\n const dy = y2 - y1;\n const len = Math.sqrt(dx * dx + dy * dy);\n const nx = dx / len;\n const ny = dy / len;\n\n const headLen = 3.5;\n const headW = 2.8;\n const endX = x2 - nx * headLen;\n const endY = y2 - ny * headLen;\n\n const g = document.createElementNS(SVG_NS, 'g');\n g.setAttribute('data-arrow', `${arrow.from}-${arrow.to}`);\n\n const line = document.createElementNS(SVG_NS, 'line');\n line.setAttribute('x1', String(x1));\n line.setAttribute('y1', String(y1));\n line.setAttribute('x2', String(endX));\n line.setAttribute('y2', String(endY));\n line.setAttribute('stroke', color);\n line.setAttribute('stroke-width', '2.4');\n line.setAttribute('stroke-linecap', 'round');\n line.setAttribute('opacity', '0.85');\n\n const head = document.createElementNS(SVG_NS, 'polygon');\n head.setAttribute(\n 'points',\n `${x2},${y2} ${endX - ny * headW},${endY + nx * headW} ${endX + ny * headW},${endY - nx * headW}`,\n );\n head.setAttribute('fill', color);\n head.setAttribute('opacity', '0.85');\n\n g.appendChild(line);\n g.appendChild(head);\n return g;\n}\n\nexport function renderArrows(\n svgEl: SVGSVGElement,\n arrows: readonly Arrow[],\n orientation: Color,\n): void {\n svgEl.replaceChildren();\n for (const arrow of arrows) {\n svgEl.appendChild(createArrowEl(arrow, orientation));\n }\n}\n","import type {\n Arrow,\n BoardTheme,\n ChessBoardOptions,\n Color,\n Piece,\n PieceTheme,\n SquareKey,\n} from './types.ts';\nimport { parseFen, positionToFen, STARTING_FEN } from './fen.ts';\nimport { defaultPieceTheme, defaultBoardTheme } from './assets.ts';\nimport { injectStyles } from './styles.ts';\nimport { squareToCoords, coordsToSquare } from './coords.ts';\nimport { createBoardDOM, createPieceEl, rebuildSquares } from './dom.ts';\nimport { diffPieces } from './diff.ts';\nimport { renderArrows } from './arrows.ts';\n\ninterface DragState {\n readonly pieceEl: HTMLElement;\n readonly originSq: SquareKey;\n readonly pointerId: number;\n readonly boardRect: DOMRect;\n}\n\nexport class ChessBoard {\n // ── DOM ──────────────────────────────────────────────────────────────\n private boardEl: HTMLElement;\n private svgEl: SVGSVGElement;\n private squareEls: Map<SquareKey, HTMLElement>;\n private readonly pieceEls = new Map<SquareKey, HTMLElement>();\n\n // ── Config ───────────────────────────────────────────────────────────\n private readonly pieceTheme: PieceTheme;\n private readonly boardTheme: BoardTheme;\n private readonly animDuration: number;\n private readonly draggable: boolean;\n private readonly clickable: boolean;\n private readonly viewOnly: boolean;\n private readonly showCoords: boolean;\n private readonly onMoveCallback:\n | ((from: SquareKey, to: SquareKey) => boolean | void)\n | null;\n private readonly onSelectCallback:\n | ((sq: SquareKey | null) => void)\n | null;\n private readonly onArrowCallback:\n | ((from: SquareKey, to: SquareKey) => void)\n | null;\n\n // ── State ────────────────────────────────────────────────────────────\n private pieces: Map<SquareKey, Piece>;\n private orientation: Color;\n private selected: SquareKey | null = null;\n private lastMoveSquares: [SquareKey, SquareKey] | null = null;\n private checkSq: SquareKey | null = null;\n private legalSqs = new Set<SquareKey>();\n private arrowList: Arrow[] = [];\n\n // ── Interaction ──────────────────────────────────────────────────────\n private dragState: DragState | null = null;\n private arrowDragOrigin: SquareKey | null = null;\n private pendingClick: { sq: SquareKey; x: number; y: number } | null =\n null;\n private destroyed = false;\n\n // ────────────────────────────────────────────────────────────────────\n // Constructor\n // ────────────────────────────────────────────────────────────────────\n constructor(container: HTMLElement, options?: ChessBoardOptions) {\n injectStyles();\n\n this.orientation = options?.orientation ?? 'white';\n this.pieceTheme = options?.pieceTheme ?? defaultPieceTheme;\n this.boardTheme = options?.boardTheme ?? defaultBoardTheme;\n this.animDuration = options?.animationDuration ?? 150;\n this.draggable = options?.draggable ?? true;\n this.clickable = options?.clickable ?? true;\n this.viewOnly = options?.viewOnly ?? false;\n this.showCoords = options?.coordinates ?? true;\n this.onMoveCallback = options?.onMove ?? null;\n this.onSelectCallback = options?.onSelect ?? null;\n this.onArrowCallback = options?.onArrowDrawn ?? null;\n\n const { boardEl, squareEls, svgEl } = createBoardDOM(\n this.orientation,\n this.boardTheme,\n this.showCoords,\n );\n this.boardEl = boardEl;\n this.squareEls = squareEls;\n this.svgEl = svgEl;\n this.boardEl.style.setProperty(\n '--cb-anim-duration',\n `${this.animDuration}ms`,\n );\n container.appendChild(this.boardEl);\n\n const fen = options?.position ?? STARTING_FEN;\n this.pieces = parseFen(fen);\n this.renderAllPieces();\n\n this.boardEl.addEventListener('pointerdown', this.handlePointerDown);\n this.boardEl.addEventListener('pointermove', this.handlePointerMove);\n this.boardEl.addEventListener('pointerup', this.handlePointerUp);\n this.boardEl.addEventListener('pointercancel', this.handlePointerCancel);\n this.boardEl.addEventListener('contextmenu', this.handleContextMenu);\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Public API — position\n // ────────────────────────────────────────────────────────────────────\n setPosition(fen: string): void {\n const newPieces = parseFen(fen);\n this.syncPieces(newPieces, true);\n }\n\n getPosition(): string {\n return positionToFen(this.pieces);\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Public API — orientation\n // ────────────────────────────────────────────────────────────────────\n setOrientation(orientation: Color): void {\n if (orientation === this.orientation) return;\n this.orientation = orientation;\n rebuildSquares(\n this.boardEl,\n this.squareEls,\n orientation,\n this.boardTheme,\n this.showCoords,\n );\n this.repositionAllPieces();\n this.refreshHighlights();\n this.renderArrowsInternal();\n }\n\n getOrientation(): Color {\n return this.orientation;\n }\n\n flip(): void {\n this.setOrientation(\n this.orientation === 'white' ? 'black' : 'white',\n );\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Public API — selection & highlights\n // ────────────────────────────────────────────────────────────────────\n select(sq: SquareKey | null): void {\n if (sq) {\n this.doSelect(sq);\n } else {\n this.doDeselect();\n }\n }\n\n setLastMove(from: SquareKey, to: SquareKey): void {\n this.clearHighlightType('cb-hl-lastmove');\n this.lastMoveSquares = [from, to];\n this.squareEls.get(from)?.classList.add('cb-hl-lastmove');\n this.squareEls.get(to)?.classList.add('cb-hl-lastmove');\n }\n\n clearLastMove(): void {\n this.clearHighlightType('cb-hl-lastmove');\n this.lastMoveSquares = null;\n }\n\n setCheck(sq: SquareKey | null): void {\n this.clearHighlightType('cb-hl-check');\n this.checkSq = sq;\n if (sq) {\n this.squareEls.get(sq)?.classList.add('cb-hl-check');\n }\n }\n\n setLegalMoves(squares: readonly SquareKey[]): void {\n this.clearHighlightType('cb-legal');\n this.legalSqs = new Set(squares);\n for (const sq of squares) {\n this.squareEls.get(sq)?.classList.add('cb-legal');\n }\n }\n\n clearLegalMoves(): void {\n this.clearHighlightType('cb-legal');\n this.legalSqs.clear();\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Public API — arrows\n // ────────────────────────────────────────────────────────────────────\n setArrows(arrows: readonly Arrow[]): void {\n this.arrowList = [...arrows];\n this.renderArrowsInternal();\n }\n\n addArrow(from: SquareKey, to: SquareKey, color?: string): void {\n const exists = this.arrowList.some(\n (a) => a.from === from && a.to === to,\n );\n if (exists) return;\n this.arrowList.push({ from, to, color });\n this.renderArrowsInternal();\n }\n\n removeArrow(from: SquareKey, to: SquareKey): void {\n this.arrowList = this.arrowList.filter(\n (a) => !(a.from === from && a.to === to),\n );\n this.renderArrowsInternal();\n }\n\n clearArrows(): void {\n this.arrowList = [];\n this.renderArrowsInternal();\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Public API — lifecycle\n // ────────────────────────────────────────────────────────────────────\n destroy(): void {\n if (this.destroyed) return;\n this.destroyed = true;\n this.boardEl.removeEventListener(\n 'pointerdown',\n this.handlePointerDown,\n );\n this.boardEl.removeEventListener(\n 'pointermove',\n this.handlePointerMove,\n );\n this.boardEl.removeEventListener('pointerup', this.handlePointerUp);\n this.boardEl.removeEventListener(\n 'pointercancel',\n this.handlePointerCancel,\n );\n this.boardEl.removeEventListener(\n 'contextmenu',\n this.handleContextMenu,\n );\n this.boardEl.remove();\n this.pieceEls.clear();\n this.squareEls.clear();\n this.pieces.clear();\n this.arrowList.length = 0;\n this.legalSqs.clear();\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Rendering internals\n // ────────────────────────────────────────────────────────────────────\n private renderAllPieces(): void {\n for (const el of this.pieceEls.values()) el.remove();\n this.pieceEls.clear();\n for (const [sq, piece] of this.pieces) {\n const el = createPieceEl(\n sq,\n piece,\n this.orientation,\n this.pieceTheme,\n );\n this.boardEl.insertBefore(el, this.svgEl);\n this.pieceEls.set(sq, el);\n }\n this.updateOccupied();\n }\n\n private syncPieces(\n newPieces: Map<SquareKey, Piece>,\n animate: boolean,\n ): void {\n const diff = diffPieces(this.pieces, newPieces);\n\n // Process removed first so captured pieces are gone before we move\n // the capturing piece to their square (avoid overwriting pieceEls).\n for (const sq of diff.removed) {\n const el = this.pieceEls.get(sq);\n if (el) {\n el.remove();\n this.pieceEls.delete(sq);\n }\n }\n\n for (const { from, to } of diff.moved) {\n const el = this.pieceEls.get(from);\n if (!el) continue;\n this.pieceEls.delete(from);\n this.pieceEls.set(to, el);\n el.setAttribute('data-square', to);\n this.translatePiece(el, to, animate);\n }\n\n for (const { square, piece } of diff.added) {\n const el = createPieceEl(\n square,\n piece,\n this.orientation,\n this.pieceTheme,\n );\n this.boardEl.insertBefore(el, this.svgEl);\n this.pieceEls.set(square, el);\n }\n\n this.pieces = newPieces;\n this.updateOccupied();\n }\n\n private repositionAllPieces(): void {\n for (const [sq, el] of this.pieceEls) {\n const [col, row] = squareToCoords(sq, this.orientation);\n el.style.transform = `translate(${col * 100}%, ${row * 100}%)`;\n }\n }\n\n private translatePiece(\n el: HTMLElement,\n sq: SquareKey,\n animate: boolean,\n ): void {\n const [col, row] = squareToCoords(sq, this.orientation);\n if (animate && this.animDuration > 0) {\n el.classList.add('cb-animating');\n el.style.transform = `translate(${col * 100}%, ${row * 100}%)`;\n el.addEventListener(\n 'transitionend',\n () => el.classList.remove('cb-animating'),\n { once: true },\n );\n } else {\n el.style.transform = `translate(${col * 100}%, ${row * 100}%)`;\n }\n }\n\n private updateOccupied(): void {\n for (const [sq, el] of this.squareEls) {\n el.classList.toggle('cb-has-piece', this.pieces.has(sq));\n }\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Highlight internals\n // ────────────────────────────────────────────────────────────────────\n private refreshHighlights(): void {\n this.clearHighlightType('cb-hl-lastmove');\n this.clearHighlightType('cb-hl-selected');\n this.clearHighlightType('cb-hl-check');\n this.clearHighlightType('cb-legal');\n\n if (this.lastMoveSquares) {\n this.squareEls\n .get(this.lastMoveSquares[0])\n ?.classList.add('cb-hl-lastmove');\n this.squareEls\n .get(this.lastMoveSquares[1])\n ?.classList.add('cb-hl-lastmove');\n }\n if (this.selected) {\n this.squareEls.get(this.selected)?.classList.add('cb-hl-selected');\n }\n if (this.checkSq) {\n this.squareEls.get(this.checkSq)?.classList.add('cb-hl-check');\n }\n for (const sq of this.legalSqs) {\n this.squareEls.get(sq)?.classList.add('cb-legal');\n }\n this.updateOccupied();\n }\n\n private clearHighlightType(cls: string): void {\n for (const el of this.squareEls.values()) {\n el.classList.remove(cls);\n }\n }\n\n private renderArrowsInternal(): void {\n renderArrows(this.svgEl, this.arrowList, this.orientation);\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Selection internals\n // ────────────────────────────────────────────────────────────────────\n private doSelect(sq: SquareKey): void {\n if (this.selected) {\n this.squareEls\n .get(this.selected)\n ?.classList.remove('cb-hl-selected');\n }\n this.selected = sq;\n this.squareEls.get(sq)?.classList.add('cb-hl-selected');\n this.onSelectCallback?.(sq);\n }\n\n private doDeselect(): void {\n if (this.selected) {\n this.squareEls\n .get(this.selected)\n ?.classList.remove('cb-hl-selected');\n }\n this.selected = null;\n this.clearLegalMoves();\n this.onSelectCallback?.(null);\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Move internals (after accepted drag or click-to-move)\n // ────────────────────────────────────────────────────────────────────\n private applyMove(from: SquareKey, to: SquareKey): void {\n const piece = this.pieces.get(from);\n if (!piece) return;\n\n const capturedEl = this.pieceEls.get(to);\n if (capturedEl) {\n capturedEl.remove();\n this.pieceEls.delete(to);\n }\n\n this.pieces.delete(from);\n this.pieces.set(to, piece);\n\n const el = this.pieceEls.get(from);\n if (el) {\n this.pieceEls.delete(from);\n this.pieceEls.set(to, el);\n el.setAttribute('data-square', to);\n const [col, row] = squareToCoords(to, this.orientation);\n el.style.transform = `translate(${col * 100}%, ${row * 100}%)`;\n }\n\n this.setLastMove(from, to);\n this.updateOccupied();\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Coordinate helpers\n // ────────────────────────────────────────────────────────────────────\n private squareFromPointer(e: PointerEvent): SquareKey | null {\n const rect = this.boardEl.getBoundingClientRect();\n const size = rect.width / 8;\n const col = Math.max(\n 0,\n Math.min(7, Math.floor((e.clientX - rect.left) / size)),\n );\n const row = Math.max(\n 0,\n Math.min(7, Math.floor((e.clientY - rect.top) / size)),\n );\n return coordsToSquare(col, row, this.orientation);\n }\n\n // ────────────────────────────────────────────────────────────────────\n // Event handlers (arrow-function fields for stable `this`)\n // ────────────────────────────────────────────────────────────────────\n private handlePointerDown = (e: PointerEvent): void => {\n if (this.destroyed) return;\n\n // Right click → arrow drawing\n if (e.button === 2) {\n e.preventDefault();\n const sq = this.squareFromPointer(e);\n if (sq) {\n this.arrowDragOrigin = sq;\n this.boardEl.setPointerCapture(e.pointerId);\n }\n return;\n }\n\n if (e.button !== 0 || this.viewOnly) return;\n\n const sq = this.squareFromPointer(e);\n if (!sq) return;\n\n // Left click clears drawn arrows\n if (this.arrowList.length > 0) {\n this.clearArrows();\n }\n\n // Piece already selected + press on a legal square (empty or capture) → try move; don't drag/select the target piece\n if (\n this.selected &&\n sq !== this.selected &&\n this.legalSqs.has(sq)\n ) {\n const result = this.onMoveCallback?.(this.selected, sq);\n if (result === false) {\n this.doDeselect();\n } else {\n this.applyMove(this.selected, sq);\n this.doDeselect();\n }\n return;\n }\n\n // Press on a piece → start drag immediately; release on same square will count as select\n if (this.pieces.has(sq)) {\n if (this.draggable) {\n this.startDrag(sq, e);\n } else {\n this.pendingClick = { sq, x: e.clientX, y: e.clientY };\n this.boardEl.setPointerCapture(e.pointerId);\n }\n }\n };\n\n private handlePointerMove = (e: PointerEvent): void => {\n if (this.destroyed) return;\n\n if (this.arrowDragOrigin) return;\n\n if (this.dragState) {\n this.updateDrag(e);\n }\n };\n\n private handlePointerUp = (e: PointerEvent): void => {\n if (this.destroyed) return;\n\n // Arrow drawing end\n if (e.button === 2 && this.arrowDragOrigin) {\n const sq = this.squareFromPointer(e);\n if (sq && sq !== this.arrowDragOrigin) {\n this.addArrow(this.arrowDragOrigin, sq);\n this.onArrowCallback?.(this.arrowDragOrigin, sq);\n }\n try {\n this.boardEl.releasePointerCapture(e.pointerId);\n } catch {\n /* already released */\n }\n this.arrowDragOrigin = null;\n return;\n }\n\n // Drag end\n if (this.dragState) {\n this.endDrag(e);\n return;\n }\n\n // Click end: try move, or select/deselect on pointerup and release capture\n if (this.pendingClick) {\n const clickedSq = this.pendingClick.sq;\n if (this.selected && clickedSq !== this.selected) {\n // Clicked a different square (empty or piece): try to move selected piece there\n const result = this.onMoveCallback?.(this.selected, clickedSq);\n if (result === false) {\n // Only select the piece on clickedSq if it's not a legal move (e.g. capture); otherwise deselect\n if (\n this.pieces.has(clickedSq) &&\n this.clickable &&\n !this.legalSqs.has(clickedSq)\n ) {\n this.doSelect(clickedSq);\n } else {\n this.doDeselect();\n }\n } else {\n this.applyMove(this.selected, clickedSq);\n this.doDeselect();\n }\n } else if (this.clickable) {\n if (clickedSq === this.selected) {\n this.doDeselect();\n } else {\n this.doSelect(clickedSq);\n }\n }\n try {\n this.boardEl.releasePointerCapture(e.pointerId);\n } catch {\n /* already released */\n }\n this.pendingClick = null;\n return;\n }\n };\n\n private handlePointerCancel = (e: PointerEvent): void => {\n if (this.destroyed) return;\n\n if (this.dragState) {\n const { pieceEl, originSq, pointerId } = this.dragState;\n pieceEl.classList.remove('cb-dragging');\n try {\n this.boardEl.releasePointerCapture(pointerId);\n } catch {\n /* already released */\n }\n this.translatePiece(pieceEl, originSq, true);\n this.dragState = null;\n return;\n }\n\n if (this.pendingClick) {\n try {\n this.boardEl.releasePointerCapture(e.pointerId);\n } catch {\n /* already released */\n }\n this.pendingClick = null;\n return;\n }\n\n if (this.arrowDragOrigin) {\n try {\n this.boardEl.releasePointerCapture(e.pointerId);\n } catch {\n /* already released */\n }\n this.arrowDragOrigin = null;\n }\n };\n\n private handleContextMenu = (e: Event): void => {\n e.preventDefault();\n };\n\n // ────────────────────────────────────────────────────────────────────\n // Drag internals\n // ────────────────────────────────────────────────────────────────────\n private startDrag(sq: SquareKey, e: PointerEvent): void {\n const el = this.pieceEls.get(sq);\n if (!el) return;\n\n this.boardEl.setPointerCapture(e.pointerId);\n\n // Select piece so selection highlight and legal-move squares show (same as when clicking)\n if (this.clickable) {\n this.doSelect(sq);\n }\n\n const rect = this.boardEl.getBoundingClientRect();\n el.classList.add('cb-dragging');\n el.classList.remove('cb-animating');\n\n this.dragState = {\n pieceEl: el,\n originSq: sq,\n pointerId: e.pointerId,\n boardRect: rect,\n };\n\n this.updateDrag(e);\n }\n\n private updateDrag(e: PointerEvent): void {\n if (!this.dragState) return;\n const { pieceEl, boardRect } = this.dragState;\n const pieceSize = boardRect.width / 8;\n const relX = e.clientX - boardRect.left;\n const relY = e.clientY - boardRect.top;\n const tx = ((relX - pieceSize / 2) / pieceSize) * 100;\n const ty = ((relY - pieceSize / 2) / pieceSize) * 100;\n pieceEl.style.transform = `translate(${tx}%, ${ty}%)`;\n }\n\n private endDrag(e: PointerEvent): void {\n if (!this.dragState) return;\n const { pieceEl, originSq, pointerId } = this.dragState;\n\n pieceEl.classList.remove('cb-dragging');\n try {\n this.boardEl.releasePointerCapture(pointerId);\n } catch {\n /* already released */\n }\n\n const sq = this.squareFromPointer(e);\n\n if (sq && sq !== originSq) {\n const result = this.onMoveCallback?.(originSq, sq);\n if (result === false) {\n this.translatePiece(pieceEl, originSq, true);\n if (this.clickable) this.doSelect(originSq);\n } else {\n this.applyMove(originSq, sq);\n this.doDeselect();\n }\n } else {\n this.translatePiece(pieceEl, originSq, true);\n if (this.clickable) this.doSelect(originSq);\n }\n\n this.dragState = null;\n }\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "@pech/chess-board",
3
+ "version": "1.0.0",
4
+ "description": "Chess board UI library — render and interact with chess positions",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "sideEffects": false,
20
+ "scripts": {
21
+ "build": "tsup",
22
+ "dev": "tsup --watch",
23
+ "test": "vitest run",
24
+ "test:watch": "vitest",
25
+ "typecheck": "tsc --noEmit",
26
+ "prepublishOnly": "npm run typecheck && npm run build"
27
+ },
28
+ "keywords": [
29
+ "chess",
30
+ "chessboard",
31
+ "board",
32
+ "ui",
33
+ "render",
34
+ "fen",
35
+ "typescript"
36
+ ],
37
+ "license": "MIT",
38
+ "author": "Eduardo Pech",
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "https://github.com/EduardoPech/chess-board.git"
42
+ },
43
+ "homepage": "https://github.com/EduardoPech/chess-board#readme",
44
+ "bugs": {
45
+ "url": "https://github.com/EduardoPech/chess-board/issues"
46
+ },
47
+ "engines": {
48
+ "node": ">=18"
49
+ },
50
+ "publishConfig": {
51
+ "access": "public"
52
+ },
53
+ "devDependencies": {
54
+ "@types/bun": "latest",
55
+ "tsup": "^8.5.1",
56
+ "typescript": "^5.9.3",
57
+ "vitest": "^4.0.18"
58
+ }
59
+ }