diff --git a/.gitignore b/.gitignore
index 1328c60..f465461 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,4 +3,6 @@ node_modules
dist
dist-ssr
*.local
-_release_assets
\ No newline at end of file
+_release_assets
+*/**/*.temp.*
+*.temp.*
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 415d317..b11c161 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -26,9 +26,10 @@
"@types/gif.js": "^0.2.2",
"@types/hammerjs": "^2.0.41",
"@types/howler": "^2.2.6",
- "@types/node": "^17.0.8",
+ "@types/node": "^17.0.30",
"@types/ua-parser-js": "^0.7.36",
"@vitejs/plugin-legacy": "^1.8.1",
+ "canvas": "^2.9.1",
"mime": "^3.0.0",
"npm": "^8.8.0",
"typescript": "^4.4.4",
@@ -522,6 +523,41 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
+ "node_modules/@mapbox/node-pre-gyp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz",
+ "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==",
+ "dev": true,
+ "dependencies": {
+ "detect-libc": "^2.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "make-dir": "^3.1.0",
+ "node-fetch": "^2.6.7",
+ "nopt": "^5.0.0",
+ "npmlog": "^5.0.1",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.5",
+ "tar": "^6.1.11"
+ },
+ "bin": {
+ "node-pre-gyp": "bin/node-pre-gyp"
+ }
+ },
+ "node_modules/@mapbox/node-pre-gyp/node_modules/semver": {
+ "version": "7.3.7",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
+ "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/@types/chess.js": {
"version": "0.11.2",
"resolved": "https://registry.npmjs.org/@types/chess.js/-/chess.js-0.11.2.tgz",
@@ -553,9 +589,9 @@
"dev": true
},
"node_modules/@types/node": {
- "version": "17.0.27",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.27.tgz",
- "integrity": "sha512-4/Ke7bbWOasuT3kceBZFGakP1dYN2XFd8v2l9bqF2LNWrmeU07JLpp56aEeG6+Q3olqO5TvXpW0yaiYnZJ5CXg==",
+ "version": "17.0.30",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.30.tgz",
+ "integrity": "sha512-oNBIZjIqyHYP8VCNAV9uEytXVeXG2oR0w9lgAXro20eugRQfY002qr3CUl6BAe+Yf/z3CRjPdz27Pu6WWtuSRw==",
"dev": true
},
"node_modules/@types/ua-parser-js": {
@@ -583,6 +619,33 @@
"vite": "^2.8.0"
}
},
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
@@ -595,6 +658,25 @@
"node": ">=4"
}
},
+ "node_modules/aproba": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
+ "dev": true
+ },
+ "node_modules/are-we-there-yet": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
+ "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+ "dev": true,
+ "dependencies": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^3.6.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/babel-plugin-jsx-dom-expressions": {
"version": "0.32.17",
"resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.32.17.tgz",
@@ -628,6 +710,22 @@
"babel-plugin-jsx-dom-expressions": "^0.32.17"
}
},
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
"node_modules/browserslist": {
"version": "4.20.3",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
@@ -673,6 +771,21 @@
}
]
},
+ "node_modules/canvas": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.1.tgz",
+ "integrity": "sha512-vSQti1uG/2gjv3x6QLOZw7TctfufaerTWbVe+NSduHxxLGB+qf3kFgQ6n66DSnuoINtVUjrLLIK2R+lxrBG07A==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "@mapbox/node-pre-gyp": "^1.0.0",
+ "nan": "^2.15.0",
+ "simple-get": "^3.0.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -692,6 +805,15 @@
"resolved": "https://registry.npmjs.org/chess.js/-/chess.js-0.12.1.tgz",
"integrity": "sha512-95PsuUCtoxPyQNB+29k54OWGeEEpuWXu+d+oWL/fcko5T5NhDuGxaYmoXcZ6KUnFKyUYxdLjwqRqCWZonRuoJQ=="
},
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -707,6 +829,15 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
+ "node_modules/color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "dev": true,
+ "bin": {
+ "color-support": "bin.js"
+ }
+ },
"node_modules/common-tags": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
@@ -715,6 +846,18 @@
"node": ">=4.0.0"
}
},
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "node_modules/console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+ "dev": true
+ },
"node_modules/convert-source-map": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
@@ -752,12 +895,45 @@
}
}
},
+ "node_modules/decompress-response": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
+ "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+ "dev": true,
+ "dependencies": {
+ "mimic-response": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+ "dev": true
+ },
+ "node_modules/detect-libc": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
+ "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/electron-to-chromium": {
"version": "1.4.119",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.119.tgz",
"integrity": "sha512-HPEmKy+d0xK8oCfEHc5t6wDsSAi1WmE3Ld08QrBjAPxaAzfuKP66VJ77lcTqxTt7GJmSE279s75mhW64Xh+4kw==",
"dev": true
},
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
"node_modules/esbuild": {
"version": "0.14.38",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.38.tgz",
@@ -1131,6 +1307,24 @@
"node": ">=0.8.0"
}
},
+ "node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "dev": true,
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
"node_modules/fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
@@ -1151,6 +1345,26 @@
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
+ "node_modules/gauge": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+ "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+ "dev": true,
+ "dependencies": {
+ "aproba": "^1.0.3 || ^2.0.0",
+ "color-support": "^1.1.2",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.1",
+ "object-assign": "^4.1.1",
+ "signal-exit": "^3.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "wide-align": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -1165,6 +1379,26 @@
"resolved": "https://registry.npmjs.org/gif.js/-/gif.js-0.2.0.tgz",
"integrity": "sha1-YV5uN4iFDNOiDIX+nwlTnnhJA+g="
},
+ "node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -1208,6 +1442,12 @@
"node": ">=4"
}
},
+ "node_modules/has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+ "dev": true
+ },
"node_modules/howler": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/howler/-/howler-2.2.3.tgz",
@@ -1219,6 +1459,35 @@
"integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==",
"dev": true
},
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
"node_modules/is-core-module": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
@@ -1231,6 +1500,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/is-mobile": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-3.1.1.tgz",
@@ -1278,6 +1556,18 @@
"node": ">=6"
}
},
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/magic-string": {
"version": "0.26.1",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.1.tgz",
@@ -1290,6 +1580,21 @@
"node": ">=12"
}
},
+ "node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/merge-anything": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.0.2.tgz",
@@ -1318,12 +1623,79 @@
"node": ">=10.0.0"
}
},
+ "node_modules/mimic-response": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+ "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz",
+ "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "dev": true,
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
+ "node_modules/nan": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
+ "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==",
+ "dev": true
+ },
"node_modules/nanoid": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
@@ -1336,12 +1708,47 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "dev": true,
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
"node_modules/node-releases": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz",
"integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==",
"dev": true
},
+ "node_modules/nopt": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+ "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+ "dev": true,
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/npm": {
"version": "8.8.0",
"resolved": "https://registry.npmjs.org/npm/-/npm-8.8.0.tgz",
@@ -3779,6 +4186,45 @@
"inBundle": true,
"license": "ISC"
},
+ "node_modules/npmlog": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
+ "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+ "dev": true,
+ "dependencies": {
+ "are-we-there-yet": "^2.0.0",
+ "console-control-strings": "^1.1.0",
+ "gauge": "^3.0.0",
+ "set-blocking": "^2.0.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
@@ -3815,6 +4261,20 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/regenerator-runtime": {
"version": "0.13.9",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
@@ -3838,6 +4298,21 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/rollup": {
"version": "2.70.2",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.2.tgz",
@@ -3868,6 +4343,49 @@
"semver": "bin/semver.js"
}
},
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/simple-get": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz",
+ "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
+ "dev": true,
+ "dependencies": {
+ "decompress-response": "^4.2.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
"node_modules/solid-js": {
"version": "1.3.17",
"resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.3.17.tgz",
@@ -3912,6 +4430,61 @@
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
"dev": true
},
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "node_modules/string_decoder/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -3942,6 +4515,23 @@
"integrity": "sha512-hqTN6kW+pN6/qro6G9OZ7ceDQOcYno020zBQKpZQLsJhYTDMCMNfXi/Y8duF5iW+4WWZr42ry0MMkcRGpbwG2A==",
"dev": true
},
+ "node_modules/tar": {
+ "version": "6.1.11",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
+ "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
+ "dev": true,
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^3.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@@ -3951,6 +4541,12 @@
"node": ">=4"
}
},
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
+ "dev": true
+ },
"node_modules/ts-toolbelt": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz",
@@ -3988,6 +4584,12 @@
"node": "*"
}
},
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
"node_modules/vite": {
"version": "2.9.5",
"resolved": "https://registry.npmjs.org/vite/-/vite-2.9.5.tgz",
@@ -4040,10 +4642,47 @@
"vite": "^2.8.0"
}
},
+ "node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
+ "dev": true
+ },
"node_modules/webm-writer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/webm-writer/-/webm-writer-1.0.0.tgz",
"integrity": "sha512-xafP4mzUqht03HBXP0Ov2YGsxfD08uncad9fQeshYwQXrcP6Z/4uxd1IUaGKqKigFPAgaD9xb6JEKA8SXLQMLA=="
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+ "dev": true,
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/wide-align": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+ "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^1.0.2 || 2 || 3 || 4"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
}
},
"dependencies": {
@@ -4409,6 +5048,34 @@
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
+ "@mapbox/node-pre-gyp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz",
+ "integrity": "sha512-aDF3S3rK9Q2gey/WAttUlISduDItz5BU3306M9Eyv6/oS40aMprnopshtlKTykxRNIBEZuRMaZAnbrQ4QtKGyw==",
+ "dev": true,
+ "requires": {
+ "detect-libc": "^2.0.0",
+ "https-proxy-agent": "^5.0.0",
+ "make-dir": "^3.1.0",
+ "node-fetch": "^2.6.7",
+ "nopt": "^5.0.0",
+ "npmlog": "^5.0.1",
+ "rimraf": "^3.0.2",
+ "semver": "^7.3.5",
+ "tar": "^6.1.11"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.3.7",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
+ "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
+ }
+ },
"@types/chess.js": {
"version": "0.11.2",
"resolved": "https://registry.npmjs.org/@types/chess.js/-/chess.js-0.11.2.tgz",
@@ -4440,9 +5107,9 @@
"dev": true
},
"@types/node": {
- "version": "17.0.27",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.27.tgz",
- "integrity": "sha512-4/Ke7bbWOasuT3kceBZFGakP1dYN2XFd8v2l9bqF2LNWrmeU07JLpp56aEeG6+Q3olqO5TvXpW0yaiYnZJ5CXg==",
+ "version": "17.0.30",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.30.tgz",
+ "integrity": "sha512-oNBIZjIqyHYP8VCNAV9uEytXVeXG2oR0w9lgAXro20eugRQfY002qr3CUl6BAe+Yf/z3CRjPdz27Pu6WWtuSRw==",
"dev": true
},
"@types/ua-parser-js": {
@@ -4464,6 +5131,27 @@
"systemjs": "^6.12.1"
}
},
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "requires": {
+ "debug": "4"
+ }
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
@@ -4473,6 +5161,22 @@
"color-convert": "^1.9.0"
}
},
+ "aproba": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
+ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
+ "dev": true
+ },
+ "are-we-there-yet": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
+ "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
+ "dev": true,
+ "requires": {
+ "delegates": "^1.0.0",
+ "readable-stream": "^3.6.0"
+ }
+ },
"babel-plugin-jsx-dom-expressions": {
"version": "0.32.17",
"resolved": "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.32.17.tgz",
@@ -4505,6 +5209,22 @@
"babel-plugin-jsx-dom-expressions": "^0.32.17"
}
},
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
"browserslist": {
"version": "4.20.3",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
@@ -4524,6 +5244,17 @@
"integrity": "sha512-10T30NYOEQtN6C11YGg411yebhvpnC6Z102+B95eAsN0oB6KUs01ivE8u+G6FMIRtIrVlYXhL+LUwQ3/hXwDWw==",
"dev": true
},
+ "canvas": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.9.1.tgz",
+ "integrity": "sha512-vSQti1uG/2gjv3x6QLOZw7TctfufaerTWbVe+NSduHxxLGB+qf3kFgQ6n66DSnuoINtVUjrLLIK2R+lxrBG07A==",
+ "dev": true,
+ "requires": {
+ "@mapbox/node-pre-gyp": "^1.0.0",
+ "nan": "^2.15.0",
+ "simple-get": "^3.0.3"
+ }
+ },
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -4540,6 +5271,12 @@
"resolved": "https://registry.npmjs.org/chess.js/-/chess.js-0.12.1.tgz",
"integrity": "sha512-95PsuUCtoxPyQNB+29k54OWGeEEpuWXu+d+oWL/fcko5T5NhDuGxaYmoXcZ6KUnFKyUYxdLjwqRqCWZonRuoJQ=="
},
+ "chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "dev": true
+ },
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
@@ -4555,11 +5292,29 @@
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
+ "color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "dev": true
+ },
"common-tags": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
"integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA=="
},
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
+ "dev": true
+ },
"convert-source-map": {
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz",
@@ -4584,12 +5339,39 @@
"ms": "2.1.2"
}
},
+ "decompress-response": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz",
+ "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==",
+ "dev": true,
+ "requires": {
+ "mimic-response": "^2.0.0"
+ }
+ },
+ "delegates": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
+ "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
+ "dev": true
+ },
+ "detect-libc": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
+ "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
+ "dev": true
+ },
"electron-to-chromium": {
"version": "1.4.119",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.119.tgz",
"integrity": "sha512-HPEmKy+d0xK8oCfEHc5t6wDsSAi1WmE3Ld08QrBjAPxaAzfuKP66VJ77lcTqxTt7GJmSE279s75mhW64Xh+4kw==",
"dev": true
},
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
"esbuild": {
"version": "0.14.38",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.38.tgz",
@@ -4770,6 +5552,21 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
+ "fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "dev": true,
+ "requires": {
+ "minipass": "^3.0.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
"fsevents": {
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
@@ -4783,6 +5580,23 @@
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
+ "gauge": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
+ "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
+ "dev": true,
+ "requires": {
+ "aproba": "^1.0.3 || ^2.0.0",
+ "color-support": "^1.1.2",
+ "console-control-strings": "^1.0.0",
+ "has-unicode": "^2.0.1",
+ "object-assign": "^4.1.1",
+ "signal-exit": "^3.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1",
+ "wide-align": "^1.1.2"
+ }
+ },
"gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -4794,6 +5608,20 @@
"resolved": "https://registry.npmjs.org/gif.js/-/gif.js-0.2.0.tgz",
"integrity": "sha1-YV5uN4iFDNOiDIX+nwlTnnhJA+g="
},
+ "glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
"globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -4825,6 +5653,12 @@
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
+ "has-unicode": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
+ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
+ "dev": true
+ },
"howler": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/howler/-/howler-2.2.3.tgz",
@@ -4836,6 +5670,32 @@
"integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==",
"dev": true
},
+ "https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "requires": {
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
"is-core-module": {
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
@@ -4845,6 +5705,12 @@
"has": "^1.0.3"
}
},
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
"is-mobile": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-3.1.1.tgz",
@@ -4874,6 +5740,15 @@
"integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==",
"dev": true
},
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
"magic-string": {
"version": "0.26.1",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.1.tgz",
@@ -4883,6 +5758,15 @@
"sourcemap-codec": "^1.4.8"
}
},
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "requires": {
+ "semver": "^6.0.0"
+ }
+ },
"merge-anything": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/merge-anything/-/merge-anything-5.0.2.tgz",
@@ -4899,24 +5783,88 @@
"integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
"dev": true
},
+ "mimic-response": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz",
+ "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minipass": {
+ "version": "3.1.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz",
+ "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "dev": true,
+ "requires": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ }
+ },
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true
+ },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
+ "nan": {
+ "version": "2.15.0",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
+ "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==",
+ "dev": true
+ },
"nanoid": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
"integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
"dev": true
},
+ "node-fetch": {
+ "version": "2.6.7",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
+ "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==",
+ "dev": true,
+ "requires": {
+ "whatwg-url": "^5.0.0"
+ }
+ },
"node-releases": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz",
"integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==",
"dev": true
},
+ "nopt": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
+ "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
+ "dev": true,
+ "requires": {
+ "abbrev": "1"
+ }
+ },
"npm": {
"version": "8.8.0",
"resolved": "https://registry.npmjs.org/npm/-/npm-8.8.0.tgz",
@@ -6620,6 +7568,39 @@
}
}
},
+ "npmlog": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
+ "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
+ "dev": true,
+ "requires": {
+ "are-we-there-yet": "^2.0.0",
+ "console-control-strings": "^1.1.0",
+ "gauge": "^3.0.0",
+ "set-blocking": "^2.0.0"
+ }
+ },
+ "object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
+ "dev": true
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
"path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
@@ -6643,6 +7624,17 @@
"source-map-js": "^1.0.2"
}
},
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
"regenerator-runtime": {
"version": "0.13.9",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
@@ -6660,6 +7652,15 @@
"supports-preserve-symlinks-flag": "^1.0.0"
}
},
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
"rollup": {
"version": "2.70.2",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.2.tgz",
@@ -6681,6 +7682,35 @@
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
},
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "simple-concat": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
+ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
+ "dev": true
+ },
+ "simple-get": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz",
+ "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==",
+ "dev": true,
+ "requires": {
+ "decompress-response": "^4.2.0",
+ "once": "^1.3.1",
+ "simple-concat": "^1.0.0"
+ }
+ },
"solid-js": {
"version": "1.3.17",
"resolved": "https://registry.npmjs.org/solid-js/-/solid-js-1.3.17.tgz",
@@ -6716,6 +7746,43 @@
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
"dev": true
},
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ }
+ }
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -6737,12 +7804,32 @@
"integrity": "sha512-hqTN6kW+pN6/qro6G9OZ7ceDQOcYno020zBQKpZQLsJhYTDMCMNfXi/Y8duF5iW+4WWZr42ry0MMkcRGpbwG2A==",
"dev": true
},
+ "tar": {
+ "version": "6.1.11",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
+ "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
+ "dev": true,
+ "requires": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^3.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ }
+ },
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
"dev": true
},
+ "tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
+ "dev": true
+ },
"ts-toolbelt": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/ts-toolbelt/-/ts-toolbelt-9.6.0.tgz",
@@ -6760,6 +7847,12 @@
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.2.tgz",
"integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg=="
},
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
"vite": {
"version": "2.9.5",
"resolved": "https://registry.npmjs.org/vite/-/vite-2.9.5.tgz",
@@ -6788,10 +7881,47 @@
"vite": "^2.8.0"
}
},
+ "webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
+ "dev": true
+ },
"webm-writer": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/webm-writer/-/webm-writer-1.0.0.tgz",
"integrity": "sha512-xafP4mzUqht03HBXP0Ov2YGsxfD08uncad9fQeshYwQXrcP6Z/4uxd1IUaGKqKigFPAgaD9xb6JEKA8SXLQMLA=="
+ },
+ "whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+ "dev": true,
+ "requires": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "wide-align": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+ "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.2 || 2 || 3 || 4"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
}
}
}
diff --git a/package.json b/package.json
index b775de0..8a51e18 100644
--- a/package.json
+++ b/package.json
@@ -14,9 +14,10 @@
"@types/gif.js": "^0.2.2",
"@types/hammerjs": "^2.0.41",
"@types/howler": "^2.2.6",
- "@types/node": "^17.0.8",
+ "@types/node": "^17.0.30",
"@types/ua-parser-js": "^0.7.36",
"@vitejs/plugin-legacy": "^1.8.1",
+ "canvas": "^2.9.1",
"mime": "^3.0.0",
"npm": "^8.8.0",
"typescript": "^4.4.4",
diff --git a/public/boards/avocado.png b/public/boards/avocado.png
new file mode 100644
index 0000000..16da6cd
Binary files /dev/null and b/public/boards/avocado.png differ
diff --git a/public/boards/azure.png b/public/boards/azure.png
new file mode 100644
index 0000000..1acefc1
Binary files /dev/null and b/public/boards/azure.png differ
diff --git a/public/boards/botez.png b/public/boards/botez.png
new file mode 100644
index 0000000..30ccba7
Binary files /dev/null and b/public/boards/botez.png differ
diff --git a/public/boards/clay.png b/public/boards/clay.png
new file mode 100644
index 0000000..db29e0b
Binary files /dev/null and b/public/boards/clay.png differ
diff --git a/public/boards/contrast_a.png b/public/boards/contrast_a.png
new file mode 100644
index 0000000..71ce24e
Binary files /dev/null and b/public/boards/contrast_a.png differ
diff --git a/public/boards/contrast_b.png b/public/boards/contrast_b.png
new file mode 100644
index 0000000..d4e6b95
Binary files /dev/null and b/public/boards/contrast_b.png differ
diff --git a/public/boards/contrast_c.png b/public/boards/contrast_c.png
new file mode 100644
index 0000000..682849a
Binary files /dev/null and b/public/boards/contrast_c.png differ
diff --git a/public/boards/contrast_d.png b/public/boards/contrast_d.png
new file mode 100644
index 0000000..c56c939
Binary files /dev/null and b/public/boards/contrast_d.png differ
diff --git a/public/boards/danny.png b/public/boards/danny.png
new file mode 100644
index 0000000..d91b150
Binary files /dev/null and b/public/boards/danny.png differ
diff --git a/public/boards/danny_blue.png b/public/boards/danny_blue.png
new file mode 100644
index 0000000..c9fdf80
Binary files /dev/null and b/public/boards/danny_blue.png differ
diff --git a/public/boards/danny_cyan.png b/public/boards/danny_cyan.png
new file mode 100644
index 0000000..ce5ea35
Binary files /dev/null and b/public/boards/danny_cyan.png differ
diff --git a/public/boards/danny_green.png b/public/boards/danny_green.png
new file mode 100644
index 0000000..37418af
Binary files /dev/null and b/public/boards/danny_green.png differ
diff --git a/public/boards/danny_pink.png b/public/boards/danny_pink.png
new file mode 100644
index 0000000..fa27c02
Binary files /dev/null and b/public/boards/danny_pink.png differ
diff --git a/public/boards/danny_purple.png b/public/boards/danny_purple.png
new file mode 100644
index 0000000..b68c93d
Binary files /dev/null and b/public/boards/danny_purple.png differ
diff --git a/public/boards/danny_red.png b/public/boards/danny_red.png
new file mode 100644
index 0000000..a3d44bb
Binary files /dev/null and b/public/boards/danny_red.png differ
diff --git a/public/boards/danny_yellow.png b/public/boards/danny_yellow.png
new file mode 100644
index 0000000..d5db3df
Binary files /dev/null and b/public/boards/danny_yellow.png differ
diff --git a/public/boards/danya.png b/public/boards/danya.png
new file mode 100644
index 0000000..20d506e
Binary files /dev/null and b/public/boards/danya.png differ
diff --git a/public/boards/leko.png b/public/boards/leko.png
new file mode 100644
index 0000000..c52c5ac
Binary files /dev/null and b/public/boards/leko.png differ
diff --git a/public/boards/lichess.png b/public/boards/lichess.png
new file mode 100644
index 0000000..fd558fc
Binary files /dev/null and b/public/boards/lichess.png differ
diff --git a/public/boards/lila.png b/public/boards/lila.png
new file mode 100644
index 0000000..6e1129a
Binary files /dev/null and b/public/boards/lila.png differ
diff --git a/public/boards/lines_alabaster.png b/public/boards/lines_alabaster.png
new file mode 100644
index 0000000..88f1742
Binary files /dev/null and b/public/boards/lines_alabaster.png differ
diff --git a/public/boards/lines_cardboard.png b/public/boards/lines_cardboard.png
new file mode 100644
index 0000000..ac24e11
Binary files /dev/null and b/public/boards/lines_cardboard.png differ
diff --git a/public/boards/lines_paper.png b/public/boards/lines_paper.png
new file mode 100644
index 0000000..28bc619
Binary files /dev/null and b/public/boards/lines_paper.png differ
diff --git a/public/boards/lines_parchment.png b/public/boards/lines_parchment.png
new file mode 100644
index 0000000..30901ea
Binary files /dev/null and b/public/boards/lines_parchment.png differ
diff --git a/public/boards/mono_blue.png b/public/boards/mono_blue.png
new file mode 100644
index 0000000..008e1fd
Binary files /dev/null and b/public/boards/mono_blue.png differ
diff --git a/public/boards/mono_chico.png b/public/boards/mono_chico.png
new file mode 100644
index 0000000..34543a8
Binary files /dev/null and b/public/boards/mono_chico.png differ
diff --git a/public/boards/mono_contessa.png b/public/boards/mono_contessa.png
new file mode 100644
index 0000000..9456aa2
Binary files /dev/null and b/public/boards/mono_contessa.png differ
diff --git a/public/boards/mono_coper.png b/public/boards/mono_coper.png
new file mode 100644
index 0000000..28067be
Binary files /dev/null and b/public/boards/mono_coper.png differ
diff --git a/public/boards/mono_coral.png b/public/boards/mono_coral.png
new file mode 100644
index 0000000..8619761
Binary files /dev/null and b/public/boards/mono_coral.png differ
diff --git a/public/boards/mono_cornflower.png b/public/boards/mono_cornflower.png
new file mode 100644
index 0000000..1dcc4b7
Binary files /dev/null and b/public/boards/mono_cornflower.png differ
diff --git a/public/boards/mono_dodger.png b/public/boards/mono_dodger.png
new file mode 100644
index 0000000..b1b8246
Binary files /dev/null and b/public/boards/mono_dodger.png differ
diff --git a/public/boards/mono_flamingo.png b/public/boards/mono_flamingo.png
new file mode 100644
index 0000000..e7a872e
Binary files /dev/null and b/public/boards/mono_flamingo.png differ
diff --git a/public/boards/mono_goblin.png b/public/boards/mono_goblin.png
new file mode 100644
index 0000000..a5c026a
Binary files /dev/null and b/public/boards/mono_goblin.png differ
diff --git a/public/boards/mono_harvest.png b/public/boards/mono_harvest.png
new file mode 100644
index 0000000..aab544e
Binary files /dev/null and b/public/boards/mono_harvest.png differ
diff --git a/public/boards/mono_heliotrope.png b/public/boards/mono_heliotrope.png
new file mode 100644
index 0000000..14e4a08
Binary files /dev/null and b/public/boards/mono_heliotrope.png differ
diff --git a/public/boards/mono_mahogany.png b/public/boards/mono_mahogany.png
new file mode 100644
index 0000000..c1d9f42
Binary files /dev/null and b/public/boards/mono_mahogany.png differ
diff --git a/public/boards/mono_mantis.png b/public/boards/mono_mantis.png
new file mode 100644
index 0000000..28b32bb
Binary files /dev/null and b/public/boards/mono_mantis.png differ
diff --git a/public/boards/mono_meadow.png b/public/boards/mono_meadow.png
new file mode 100644
index 0000000..dc670df
Binary files /dev/null and b/public/boards/mono_meadow.png differ
diff --git a/public/boards/mono_mojo.png b/public/boards/mono_mojo.png
new file mode 100644
index 0000000..dd6e18b
Binary files /dev/null and b/public/boards/mono_mojo.png differ
diff --git a/public/boards/mono_mulberry.png b/public/boards/mono_mulberry.png
new file mode 100644
index 0000000..0026363
Binary files /dev/null and b/public/boards/mono_mulberry.png differ
diff --git a/public/boards/mono_rose.png b/public/boards/mono_rose.png
new file mode 100644
index 0000000..2fe16b3
Binary files /dev/null and b/public/boards/mono_rose.png differ
diff --git a/public/boards/mono_sycamore.png b/public/boards/mono_sycamore.png
new file mode 100644
index 0000000..909ea8e
Binary files /dev/null and b/public/boards/mono_sycamore.png differ
diff --git a/public/boards/mono_teal.png b/public/boards/mono_teal.png
new file mode 100644
index 0000000..b1c4bfb
Binary files /dev/null and b/public/boards/mono_teal.png differ
diff --git a/public/boards/mono_terracotta.png b/public/boards/mono_terracotta.png
new file mode 100644
index 0000000..f42d1c9
Binary files /dev/null and b/public/boards/mono_terracotta.png differ
diff --git a/public/boards/mud.png b/public/boards/mud.png
new file mode 100644
index 0000000..3dc0551
Binary files /dev/null and b/public/boards/mud.png differ
diff --git a/public/boards/patina.png b/public/boards/patina.png
new file mode 100644
index 0000000..214afe3
Binary files /dev/null and b/public/boards/patina.png differ
diff --git a/public/boards/peach.png b/public/boards/peach.png
new file mode 100644
index 0000000..e82af2e
Binary files /dev/null and b/public/boards/peach.png differ
diff --git a/public/boards/rock.png b/public/boards/rock.png
new file mode 100644
index 0000000..a00836b
Binary files /dev/null and b/public/boards/rock.png differ
diff --git a/public/boards/rose.png b/public/boards/rose.png
new file mode 100644
index 0000000..8132658
Binary files /dev/null and b/public/boards/rose.png differ
diff --git a/public/boards/smooth_forest.png b/public/boards/smooth_forest.png
new file mode 100644
index 0000000..7988c1d
Binary files /dev/null and b/public/boards/smooth_forest.png differ
diff --git a/public/boards/smooth_laguna.png b/public/boards/smooth_laguna.png
new file mode 100644
index 0000000..4377448
Binary files /dev/null and b/public/boards/smooth_laguna.png differ
diff --git a/public/boards/smooth_mono.png b/public/boards/smooth_mono.png
new file mode 100644
index 0000000..40da5cb
Binary files /dev/null and b/public/boards/smooth_mono.png differ
diff --git a/public/boards/smooth_sea.png b/public/boards/smooth_sea.png
new file mode 100644
index 0000000..9e3f2ad
Binary files /dev/null and b/public/boards/smooth_sea.png differ
diff --git a/public/boards/smooth_spring.png b/public/boards/smooth_spring.png
new file mode 100644
index 0000000..6cd395f
Binary files /dev/null and b/public/boards/smooth_spring.png differ
diff --git a/public/boards/smooth_summer.png b/public/boards/smooth_summer.png
new file mode 100644
index 0000000..016e903
Binary files /dev/null and b/public/boards/smooth_summer.png differ
diff --git a/public/boards/smooth_sunset.png b/public/boards/smooth_sunset.png
new file mode 100644
index 0000000..d6a49a3
Binary files /dev/null and b/public/boards/smooth_sunset.png differ
diff --git a/public/boards/smooth_violet.png b/public/boards/smooth_violet.png
new file mode 100644
index 0000000..f406baf
Binary files /dev/null and b/public/boards/smooth_violet.png differ
diff --git a/public/boards/spring.png b/public/boards/spring.png
new file mode 100644
index 0000000..8c73405
Binary files /dev/null and b/public/boards/spring.png differ
diff --git a/public/boards/standard.png b/public/boards/standard.png
new file mode 100644
index 0000000..86a6749
Binary files /dev/null and b/public/boards/standard.png differ
diff --git a/public/boards/violet.png b/public/boards/violet.png
new file mode 100644
index 0000000..591060a
Binary files /dev/null and b/public/boards/violet.png differ
diff --git a/public/boards/wood1.png b/public/boards/wood1.png
new file mode 100644
index 0000000..01b35c3
Binary files /dev/null and b/public/boards/wood1.png differ
diff --git a/public/boards/wood2.png b/public/boards/wood2.png
new file mode 100644
index 0000000..7dd0252
Binary files /dev/null and b/public/boards/wood2.png differ
diff --git a/public/boards/wood3.png b/public/boards/wood3.png
new file mode 100644
index 0000000..f584a69
Binary files /dev/null and b/public/boards/wood3.png differ
diff --git a/public/boards/wood4.png b/public/boards/wood4.png
new file mode 100644
index 0000000..54ff3a4
Binary files /dev/null and b/public/boards/wood4.png differ
diff --git a/public/boards/wood5.png b/public/boards/wood5.png
new file mode 100644
index 0000000..fbe2a1b
Binary files /dev/null and b/public/boards/wood5.png differ
diff --git a/public/boards/wood6.png b/public/boards/wood6.png
new file mode 100644
index 0000000..be3d043
Binary files /dev/null and b/public/boards/wood6.png differ
diff --git a/public/boards/wood7.png b/public/boards/wood7.png
new file mode 100644
index 0000000..520351c
Binary files /dev/null and b/public/boards/wood7.png differ
diff --git a/public/boards/wood8.png b/public/boards/wood8.png
new file mode 100644
index 0000000..c37dbfb
Binary files /dev/null and b/public/boards/wood8.png differ
diff --git a/public/pieces/checkers/bb.svg b/public/pieces/checkers/bb.svg
new file mode 100644
index 0000000..696a872
--- /dev/null
+++ b/public/pieces/checkers/bb.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/pieces/checkers/bw.svg b/public/pieces/checkers/bw.svg
new file mode 100644
index 0000000..915bb2a
--- /dev/null
+++ b/public/pieces/checkers/bw.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/pieces/checkers/kb.svg b/public/pieces/checkers/kb.svg
new file mode 100644
index 0000000..696a872
--- /dev/null
+++ b/public/pieces/checkers/kb.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/pieces/checkers/kw.svg b/public/pieces/checkers/kw.svg
new file mode 100644
index 0000000..915bb2a
--- /dev/null
+++ b/public/pieces/checkers/kw.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/pieces/checkers/nb.svg b/public/pieces/checkers/nb.svg
new file mode 100644
index 0000000..696a872
--- /dev/null
+++ b/public/pieces/checkers/nb.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/pieces/checkers/nw.svg b/public/pieces/checkers/nw.svg
new file mode 100644
index 0000000..915bb2a
--- /dev/null
+++ b/public/pieces/checkers/nw.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/pieces/checkers/pb.svg b/public/pieces/checkers/pb.svg
new file mode 100644
index 0000000..696a872
--- /dev/null
+++ b/public/pieces/checkers/pb.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/pieces/checkers/pw.svg b/public/pieces/checkers/pw.svg
new file mode 100644
index 0000000..915bb2a
--- /dev/null
+++ b/public/pieces/checkers/pw.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/pieces/checkers/qb.svg b/public/pieces/checkers/qb.svg
new file mode 100644
index 0000000..696a872
--- /dev/null
+++ b/public/pieces/checkers/qb.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/pieces/checkers/qw.svg b/public/pieces/checkers/qw.svg
new file mode 100644
index 0000000..915bb2a
--- /dev/null
+++ b/public/pieces/checkers/qw.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/pieces/checkers/rb.svg b/public/pieces/checkers/rb.svg
new file mode 100644
index 0000000..696a872
--- /dev/null
+++ b/public/pieces/checkers/rb.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/pieces/checkers/rw.svg b/public/pieces/checkers/rw.svg
new file mode 100644
index 0000000..915bb2a
--- /dev/null
+++ b/public/pieces/checkers/rw.svg
@@ -0,0 +1,5 @@
+
diff --git a/public/stylus/chesscom/checkers.user.css b/public/stylus/chesscom/checkers.user.css
new file mode 100644
index 0000000..c911c7a
--- /dev/null
+++ b/public/stylus/chesscom/checkers.user.css
@@ -0,0 +1,24 @@
+
+ /* ==UserStyle==
+ @name Checkers chess set
+ @namespace chess.com
+ @version 1.0.0
+ @description Chess set for chess.com
+ @author sharechess.github.io
+ ==/UserStyle== */
+
+ @-moz-document domain("chess.com") {
+ .piece.bb, .promotion-piece.bb {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiMxMTExMTEiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiM2NjY2NjYiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iIzMzMzMzMyIvPgo8L3N2Zz4K') !important}
+.piece.wb, .promotion-piece.wb {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiM1NTU1NTUiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiNFRUVFRUUiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iI0JCQkJCQiIvPgo8L3N2Zz4K') !important}
+.piece.bk, .promotion-piece.bk {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiMxMTExMTEiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiM2NjY2NjYiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iIzMzMzMzMyIvPgo8L3N2Zz4K') !important}
+.piece.wk, .promotion-piece.wk {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiM1NTU1NTUiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiNFRUVFRUUiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iI0JCQkJCQiIvPgo8L3N2Zz4K') !important}
+.piece.bn, .promotion-piece.bn {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiMxMTExMTEiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiM2NjY2NjYiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iIzMzMzMzMyIvPgo8L3N2Zz4K') !important}
+.piece.wn, .promotion-piece.wn {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiM1NTU1NTUiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiNFRUVFRUUiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iI0JCQkJCQiIvPgo8L3N2Zz4K') !important}
+.piece.bp, .promotion-piece.bp {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiMxMTExMTEiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiM2NjY2NjYiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iIzMzMzMzMyIvPgo8L3N2Zz4K') !important}
+.piece.wp, .promotion-piece.wp {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiM1NTU1NTUiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiNFRUVFRUUiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iI0JCQkJCQiIvPgo8L3N2Zz4K') !important}
+.piece.bq, .promotion-piece.bq {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiMxMTExMTEiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiM2NjY2NjYiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iIzMzMzMzMyIvPgo8L3N2Zz4K') !important}
+.piece.wq, .promotion-piece.wq {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiM1NTU1NTUiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiNFRUVFRUUiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iI0JCQkJCQiIvPgo8L3N2Zz4K') !important}
+.piece.br, .promotion-piece.br {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiMxMTExMTEiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiM2NjY2NjYiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iIzMzMzMzMyIvPgo8L3N2Zz4K') !important}
+.piece.wr, .promotion-piece.wr {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiM1NTU1NTUiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiNFRUVFRUUiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iI0JCQkJCQiIvPgo8L3N2Zz4K') !important}
+ }
+
\ No newline at end of file
diff --git a/public/stylus/lichess/checkers.user.css b/public/stylus/lichess/checkers.user.css
new file mode 100644
index 0000000..07fe118
--- /dev/null
+++ b/public/stylus/lichess/checkers.user.css
@@ -0,0 +1,24 @@
+
+ /* ==UserStyle==
+ @name Checkers chess set
+ @namespace lichess.org
+ @version 1.0.0
+ @description Chess set for lichess.org
+ @author sharechess.github.io
+ ==/UserStyle== */
+
+ @-moz-document domain("lichess.org") {
+ .is2d .bishop.black {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiMxMTExMTEiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiM2NjY2NjYiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iIzMzMzMzMyIvPgo8L3N2Zz4K') !important}
+.is2d .bishop.white {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiM1NTU1NTUiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiNFRUVFRUUiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iI0JCQkJCQiIvPgo8L3N2Zz4K') !important}
+.is2d .king.black {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiMxMTExMTEiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiM2NjY2NjYiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iIzMzMzMzMyIvPgo8L3N2Zz4K') !important}
+.is2d .king.white {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiM1NTU1NTUiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiNFRUVFRUUiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iI0JCQkJCQiIvPgo8L3N2Zz4K') !important}
+.is2d .knight.black {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiMxMTExMTEiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiM2NjY2NjYiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iIzMzMzMzMyIvPgo8L3N2Zz4K') !important}
+.is2d .knight.white {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiM1NTU1NTUiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiNFRUVFRUUiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iI0JCQkJCQiIvPgo8L3N2Zz4K') !important}
+.is2d .pawn.black {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiMxMTExMTEiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiM2NjY2NjYiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iIzMzMzMzMyIvPgo8L3N2Zz4K') !important}
+.is2d .pawn.white {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiM1NTU1NTUiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiNFRUVFRUUiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iI0JCQkJCQiIvPgo8L3N2Zz4K') !important}
+.is2d .queen.black {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiMxMTExMTEiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiM2NjY2NjYiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iIzMzMzMzMyIvPgo8L3N2Zz4K') !important}
+.is2d .queen.white {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiM1NTU1NTUiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiNFRUVFRUUiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iI0JCQkJCQiIvPgo8L3N2Zz4K') !important}
+.is2d .rook.black {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiMxMTExMTEiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiM2NjY2NjYiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iIzMzMzMzMyIvPgo8L3N2Zz4K') !important}
+.is2d .rook.white {background-image:url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMjU2IDQzOUMzMTEuOTQyIDQzOSAzNjMuMTE5IDQyMy41NTUgNDAwLjY0NyAzOTcuOTU5QzQzOC4xMTUgMzcyLjQwNCA0NjMgMzM1Ljg2IDQ2MyAyOTRWMjE4QzQ2MyAxNzYuMTQgNDM4LjExNSAxMzkuNTk2IDQwMC42NDcgMTE0LjA0MUMzNjMuMTE5IDg4LjQ0NDggMzExLjk0MiA3MyAyNTYgNzNDMjAwLjA1OCA3MyAxNDguODgxIDg4LjQ0NDggMTExLjM1MyAxMTQuMDQxQzczLjg4NDggMTM5LjU5NiA0OSAxNzYuMTQgNDkgMjE4VjI5NEM0OSAzMzUuODYgNzMuODg0OCAzNzIuNDA0IDExMS4zNTMgMzk3Ljk1OUMxNDguODgxIDQyMy41NTUgMjAwLjA1OCA0MzkgMjU2IDQzOVoiIGZpbGw9IiM1NTU1NTUiLz4KPHBhdGggZD0iTTI1NiAzNTFDMzYzLjY5NiAzNTEgNDUxIDI5MS40NTQgNDUxIDIxOEM0NTEgMTQ0LjU0NiAzNjMuNjk2IDg1IDI1NiA4NUMxNDguMzA0IDg1IDYxIDE0NC41NDYgNjEgMjE4QzYxIDI5MS40NTQgMTQ4LjMwNCAzNTEgMjU2IDM1MVoiIGZpbGw9IiNFRUVFRUUiLz4KPHBhdGggZD0iTTI1NiA0MjdDMzYzLjY5NiA0MjcgNDUxIDM2Ny40NTQgNDUxIDI5NFYyMThDNDUxIDI5MS40NTQgMzYzLjY5NiAzNTEgMjU2IDM1MUMxNDguMzA0IDM1MSA2MSAyOTEuNDU0IDYxIDIxOFYyOTRDNjEgMzY3LjQ1NCAxNDguMzA0IDQyNyAyNTYgNDI3WiIgZmlsbD0iI0JCQkJCQiIvPgo8L3N2Zz4K') !important}
+ }
+
\ No newline at end of file
diff --git a/scripts/createBoardsStylesheets.ts b/scripts/createBoardsStylesheets.ts
new file mode 100644
index 0000000..85d9264
--- /dev/null
+++ b/scripts/createBoardsStylesheets.ts
@@ -0,0 +1,42 @@
+import { BoardStyle } from "./../src/types";
+import { loadImage, createCanvas } from "canvas";
+import Board from "../src/board/Board";
+import { CreateCanvas, LoadImage } from "../src/types";
+import boardStyles from "../src/board/styles-board/boardStyles";
+import fs from "fs";
+
+const size = 1024;
+const OUT_DIR = "public/boards";
+
+const main = async () => {
+ const create = () => createCanvas(size, size);
+ const load = (src: string) => loadImage(`public${src}`);
+
+ for (const boardStyle of Object.keys(boardStyles)) {
+ console.log(`Generating image for board ${boardStyle}...`);
+
+ const board = new Board(
+ {
+ size,
+ tiles: 8,
+ showBorder: false,
+ showExtraInfo: false,
+ boardStyle: boardStyle as BoardStyle,
+ },
+ load as unknown as LoadImage,
+ create as unknown as CreateCanvas
+ );
+
+ await board.renderStatic();
+ // @ts-ignore
+ const image = board.canvas.toBuffer();
+
+ if (!fs.existsSync(OUT_DIR)) {
+ fs.mkdirSync(OUT_DIR, { recursive: true });
+ }
+
+ fs.writeFileSync(`${OUT_DIR}/${boardStyle}.png`, image);
+ }
+};
+
+main();
diff --git a/src/board/Board.ts b/src/board/Board.ts
index ce8b1b5..a47cd5f 100644
--- a/src/board/Board.ts
+++ b/src/board/Board.ts
@@ -1,5 +1,13 @@
-import { BoardConfig, Header, Position } from "./../types";
-import { Style, BoardStyle } from "../types";
+import {
+ BoardConfig,
+ CreateCanvas,
+ Header,
+ LoadImage,
+ Position,
+ Style,
+ BoardStyle,
+} from "./../types";
+// @ts-ignore
import drawRectangle from "./layers/drawRectangle";
import drawCoords from "./layers/drawCoords";
import drawMoveIndicators from "./layers/drawMoveIndicators";
@@ -9,6 +17,7 @@ import drawExtraInfo from "./layers/drawExtraInfo";
import boards from "./styles-board/boardStyles";
import isLink from "../utils/isLink";
import { PiecesStyle } from "./styles-pieces/piecesStyles";
+import loadImageBrowser from "./loaders/loadImage";
const defaultConfig: BoardConfig = {
size: 720,
@@ -62,13 +71,19 @@ class Board {
private ctx: CanvasRenderingContext2D;
private tempCtx: CanvasRenderingContext2D;
- private tempCanvas: HTMLCanvasElement = document.createElement("canvas");
- public canvas: HTMLCanvasElement = document.createElement("canvas");
+ private tempCanvas: HTMLCanvasElement;
+ public canvas: HTMLCanvasElement;
+
+ constructor(
+ config: Partial = {},
+ private loadImage: LoadImage = loadImageBrowser,
+ private createCanvas: CreateCanvas = () => document.createElement("canvas")
+ ) {
+ this.canvas = this.createCanvas();
+ this.tempCanvas = this.createCanvas();
- constructor(config: Partial = {}) {
const ctx = this.canvas.getContext("2d");
const tempCtx = this.tempCanvas.getContext("2d");
- this.canvas.classList.add("board");
if (ctx === null || tempCtx === null) {
throw new Error("Cannot create canvas 2D context");
@@ -94,7 +109,7 @@ class Board {
this.cfg = cfg;
this.setSize(cfg.size);
- this.setStyle(cfg.boardStyle);
+ this.setStyle(cfg.boardStyle, refresh);
if (refresh) {
await this.refresh();
@@ -151,10 +166,12 @@ class Board {
this.borderScale = scale;
}
- setStyle(style: BoardStyle) {
+ setStyle(style: BoardStyle, refresh: boolean = true) {
this.style = boards[style];
this.cfg.boardStyle = style;
- this.refresh();
+ if (refresh) {
+ this.refresh();
+ }
return this;
}
@@ -252,12 +269,13 @@ class Board {
this.scale,
this.margin,
this.style,
- this.getFinalHeader()
+ this.getFinalHeader(),
+ this.loadImage
);
}
async renderBackground() {
- const canvas = document.createElement("canvas");
+ const canvas = this.createCanvas();
const ctx = canvas.getContext("2d") as CanvasRenderingContext2D;
canvas.width = this.size;
@@ -265,7 +283,19 @@ class Board {
const { background, dark, light, border, coords } = this.style;
- await drawRectangle(ctx, this.width, this.height, 0, 0, border);
+ ctx.clearRect(0, 0, this.size, this.size);
+ ctx.fillStyle = "#FF0000";
+ ctx.fillRect(0, 0, this.size, this.size);
+
+ await drawRectangle(
+ ctx,
+ this.width,
+ this.height,
+ 0,
+ 0,
+ border,
+ this.loadImage
+ );
await drawRectangle(
ctx,
@@ -274,6 +304,7 @@ class Board {
this.cfg.showBorder ? this.borderWidth : 0,
(this.cfg.showBorder ? this.borderWidth : 0) + this.margin,
background,
+ this.loadImage,
this.cfg.tiles
);
@@ -288,7 +319,15 @@ class Board {
const x = file * this.squareSize + this.borderWidth;
const y = rank * this.squareSize + this.borderWidth + this.margin;
- await drawRectangle(ctx, this.squareSize, this.squareSize, x, y, style);
+ await drawRectangle(
+ ctx,
+ this.squareSize,
+ this.squareSize,
+ x,
+ y,
+ style,
+ this.loadImage
+ );
}
}
@@ -306,6 +345,7 @@ class Board {
);
}
+ console.log("Background rendered!");
this.background = canvas;
}
@@ -331,7 +371,8 @@ class Board {
this.borderWidth,
this.cfg.tiles,
this.cfg.flipped,
- this.margin
+ this.margin,
+ this.loadImage
);
}
@@ -361,7 +402,8 @@ class Board {
this.cfg.flipped,
this.margin,
this.cfg.piecesStyle,
- this.cfg.showShadows
+ this.cfg.showShadows,
+ this.loadImage
);
if (this.cfg.showExtraInfo && header) {
@@ -384,6 +426,55 @@ class Board {
this.ctx.drawImage(this.tempCanvas, 0, 0);
}
+ async renderStatic() {
+ this.ctx.clearRect(0, 0, this.size, this.size);
+ const { background, dark, light, border } = this.style;
+
+ drawRectangle(
+ this.ctx,
+ this.width,
+ this.height,
+ 0,
+ 0,
+ border,
+ this.loadImage
+ );
+
+ drawRectangle(
+ this.ctx,
+ this.innerSize,
+ this.innerSize,
+ this.cfg.showBorder ? this.borderWidth : 0,
+ (this.cfg.showBorder ? this.borderWidth : 0) + this.margin,
+ background,
+ this.loadImage,
+ this.cfg.tiles
+ );
+
+ for (let rank = 0; rank < this.cfg.tiles; rank++) {
+ for (let file = 0; file < this.cfg.tiles; file++) {
+ const style =
+ (file % 2 === 0 && rank % 2 === 0) ||
+ (file % 2 !== 0 && rank % 2 !== 0)
+ ? light
+ : dark;
+
+ const x = file * this.squareSize + this.borderWidth;
+ const y = rank * this.squareSize + this.borderWidth + this.margin;
+
+ drawRectangle(
+ this.ctx,
+ this.squareSize,
+ this.squareSize,
+ x,
+ y,
+ style,
+ this.loadImage
+ );
+ }
+ }
+ }
+
toImgUrl() {
return this.canvas.toDataURL();
}
diff --git a/src/board/layers/drawHeader.ts b/src/board/layers/drawHeader.ts
index 5cda030..81e46c8 100644
--- a/src/board/layers/drawHeader.ts
+++ b/src/board/layers/drawHeader.ts
@@ -1,7 +1,6 @@
-import { Header, Style } from "../../types";
+import { Header, LoadImage, Style } from "../../types";
import drawRectangle from "./drawRectangle";
import drawText from "./drawText";
-import loadImage from "../loaders/loadImage";
const drawHeader = async (
ctx: CanvasRenderingContext2D,
@@ -9,10 +8,19 @@ const drawHeader = async (
scale: number,
margin: number,
style: Style,
- data: Header
+ data: Header,
+ loadImage: LoadImage
) => {
ctx.clearRect(0, 0, size, size);
- await drawRectangle(ctx, size, size + margin * 2, 0, 0, style.border);
+ await drawRectangle(
+ ctx,
+ size,
+ size + margin * 2,
+ 0,
+ 0,
+ style.border,
+ loadImage
+ );
const font = "Ubuntu";
diff --git a/src/board/layers/drawMoveIndicators.ts b/src/board/layers/drawMoveIndicators.ts
index 8c3115e..a18b81b 100644
--- a/src/board/layers/drawMoveIndicators.ts
+++ b/src/board/layers/drawMoveIndicators.ts
@@ -1,4 +1,4 @@
-import { Solid } from "./../../types";
+import { Solid, LoadImage } from "./../../types";
import { Move } from "chess.js";
import { Style, SquareStyle } from "../../types";
import drawRectangle from "./drawRectangle";
@@ -21,7 +21,8 @@ const drawMoveIndicators = async (
borderWidth: number,
tiles: number,
flipped: boolean,
- margin: number
+ margin: number,
+ loadImage: LoadImage
) => {
const [x0, y0] = notationToXY(move.from, flipped, tiles);
const [x1, y1] = notationToXY(move.to, flipped, tiles);
@@ -62,8 +63,24 @@ const drawMoveIndicators = async (
toStyle = fromStyle;
}
- drawRectangle(ctx, squareSize, squareSize, fromX, fromY + margin, fromStyle);
- drawRectangle(ctx, squareSize, squareSize, toX, toY + margin, toStyle);
+ drawRectangle(
+ ctx,
+ squareSize,
+ squareSize,
+ fromX,
+ fromY + margin,
+ fromStyle,
+ loadImage
+ );
+ drawRectangle(
+ ctx,
+ squareSize,
+ squareSize,
+ toX,
+ toY + margin,
+ toStyle,
+ loadImage
+ );
};
export default drawMoveIndicators;
diff --git a/src/board/layers/drawPieces.ts b/src/board/layers/drawPieces.ts
index 7a86203..4a302fb 100644
--- a/src/board/layers/drawPieces.ts
+++ b/src/board/layers/drawPieces.ts
@@ -1,6 +1,5 @@
-import { state } from "../../state";
-import { Position } from "../../types";
-import ImagesCache from "../loaders/PiecesCache";
+import { LoadImage, Position } from "../../types";
+import PiecesCache from "../loaders/PiecesCache";
import { PiecesStyle } from "../styles-pieces/piecesStyles";
const drawPieces = async (
@@ -11,7 +10,8 @@ const drawPieces = async (
flipped: boolean,
margin: number,
piecesStyle: PiecesStyle,
- shadow: boolean = true
+ shadow: boolean = true,
+ loadImage: LoadImage
) => {
const { placement, check, mate, turn } = position;
ctx.shadowColor = "rgba(0, 0, 0, 0)";
@@ -20,7 +20,7 @@ const drawPieces = async (
ctx.shadowOffsetY = 0;
for (const { x, y, type, color } of placement) {
- const img = await ImagesCache.get(piecesStyle, type, color);
+ const img = await PiecesCache.get(piecesStyle, type, color, loadImage);
const rank = flipped ? 8 - 1 - y : y;
const file = flipped ? 8 - 1 - x : x;
@@ -28,7 +28,7 @@ const drawPieces = async (
const hex = mate ? "#ff002f" : "#ffa600";
ctx.shadowColor = hex;
- ctx.shadowBlur = squareSize * (state.mobile ? 0.15 : 0.15);
+ ctx.shadowBlur = squareSize * 0.15;
ctx.shadowOffsetX = 0;
ctx.shadowOffsetY = 0;
ctx.drawImage(
diff --git a/src/board/layers/drawRectangle.ts b/src/board/layers/drawRectangle.ts
index dadc200..3e89e8f 100644
--- a/src/board/layers/drawRectangle.ts
+++ b/src/board/layers/drawRectangle.ts
@@ -1,6 +1,5 @@
-import { SquareStyle } from "../../types";
+import { LoadImage, SquareStyle } from "../../types";
import createGradient from "../fill/createGradient";
-import loadImage from "../loaders/loadImage";
const drawRectangle = async (
ctx: CanvasRenderingContext2D,
@@ -9,6 +8,7 @@ const drawRectangle = async (
x: number,
y: number,
squareStyle: SquareStyle,
+ loadImage: LoadImage,
tiles: number = 8
) => {
if (squareStyle.type === "image") {
diff --git a/src/board/loaders/PiecesCache.ts b/src/board/loaders/PiecesCache.ts
index 48baf47..42ea984 100644
--- a/src/board/loaders/PiecesCache.ts
+++ b/src/board/loaders/PiecesCache.ts
@@ -1,16 +1,15 @@
-import { PieceType, PieceColor } from "../../types";
+import { PieceType, PieceColor, LoadImage } from "../../types";
import {
PiecesStyle,
pieceNames,
PieceName,
} from "../styles-pieces/piecesStyles";
-import loadImage from "./loadImage";
let style: PiecesStyle | null = null;
let piecesImages: Map = new Map();
const PiecesCache = {
- async load(piecesSetName: PiecesStyle) {
+ async load(piecesSetName: PiecesStyle, loadImage: LoadImage) {
await Promise.all(
pieceNames.map((key) => {
const src = `/pieces/${piecesSetName}/${key}.svg`;
@@ -24,10 +23,11 @@ const PiecesCache = {
async get(
piecesSetName: PiecesStyle,
pieceName: PieceType,
- pieceColor: PieceColor
+ pieceColor: PieceColor,
+ loadImage: LoadImage
) {
if (style !== piecesSetName) {
- await this.load(piecesSetName);
+ await this.load(piecesSetName, loadImage);
style = piecesSetName;
}
@@ -35,23 +35,6 @@ const PiecesCache = {
return piecesImages.get(piece) as HTMLImageElement;
},
-
- async getDataURLs() {
- return Promise.all(
- [...piecesImages.entries()].map(
- async ([key, img]: [string, HTMLImageElement]) => {
- let blob = await fetch(img.src).then((r) => r.blob());
- let dataUrl = await new Promise((resolve) => {
- let reader = new FileReader();
- reader.onload = () => resolve(reader.result);
- reader.readAsDataURL(blob);
- });
-
- return [key, dataUrl];
- }
- )
- );
- },
};
export default PiecesCache;
diff --git a/src/board/styles-pieces/piecesStyles.ts b/src/board/styles-pieces/piecesStyles.ts
index 8ec90a5..0a101ba 100644
--- a/src/board/styles-pieces/piecesStyles.ts
+++ b/src/board/styles-pieces/piecesStyles.ts
@@ -11,6 +11,7 @@ const piecesStyles = [
"cardinal",
"cases",
"cburnett",
+ "checkers",
"chess7",
"chessnut",
"companion",
diff --git a/src/player/Player.ts b/src/player/Player.ts
index 3fdf65b..608b646 100644
--- a/src/player/Player.ts
+++ b/src/player/Player.ts
@@ -210,7 +210,7 @@ class Player {
}
if (this.ply > 0 && state.siteConfig.sounds) {
- state.boardConfig.piecesStyle.includes("anarc")
+ state.boardConfig.piecesStyle.includes("anarchy")
? this.playAnarchySFX(position)
: this.playSFX(position);
}
diff --git a/src/types.ts b/src/types.ts
index d86ffd8..be5ef9d 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -205,3 +205,7 @@ export type Header = {
Site: string | null;
Result: string | null;
};
+
+export type LoadImage = (src: string) => Promise;
+
+export type CreateCanvas = () => HTMLCanvasElement;
diff --git a/tsconfig.json b/tsconfig.json
index 0df4c5b..ca260ab 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -15,7 +15,7 @@
"noImplicitReturns": true,
"jsx": "preserve",
"jsxImportSource": "solid-js",
- "types": ["vite/client"]
+ "types": ["vite/client", "node"]
},
"include": ["./src", "public/gif.worker.js", "public/gif.worker.js"]
}
diff --git a/tsconfig.scripts.json b/tsconfig.scripts.json
new file mode 100644
index 0000000..3289514
--- /dev/null
+++ b/tsconfig.scripts.json
@@ -0,0 +1,21 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "useDefineForClassFields": true,
+ "module": "CommonJS",
+ "lib": ["ESNext", "DOM"],
+ "moduleResolution": "Node",
+ "strict": true,
+ "sourceMap": true,
+ "resolveJsonModule": true,
+ "esModuleInterop": true,
+ "noEmit": true,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "noImplicitReturns": true,
+ "jsx": "preserve",
+ "jsxImportSource": "solid-js",
+ "types": ["vite/client", "node"]
+ },
+ "include": ["./src", "public/gif.worker.js", "public/gif.worker.js"]
+}