diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..b2597c5 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +build/** linguist-vendored \ No newline at end of file diff --git a/.github/deploy.yml b/.github/deploy.yml new file mode 100644 index 0000000..cf3fc1c --- /dev/null +++ b/.github/deploy.yml @@ -0,0 +1,17 @@ +name: Deploy to GitHub Pages + +on: + push: + branches: [ main ] + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Deploy + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: build + branch: gh-pages \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8996736 --- /dev/null +++ b/.gitignore @@ -0,0 +1,20 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..69879cb --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 scar17off + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..c37ef62 --- /dev/null +++ b/README.md @@ -0,0 +1,82 @@ +# Chess Analysis Engine โ™Ÿ๏ธ + +![GitHub](https://img.shields.io/github/license/scar17off/chess-analysis-engine) +![JavaScript](https://img.shields.io/badge/language-JavaScript-yellow) +![Version](https://img.shields.io/badge/version-1.0-blue) +![GitHub stars](https://img.shields.io/github/stars/scar17off/chess-analysis-engine?style=social) +![GitHub forks](https://img.shields.io/github/forks/scar17off/chess-analysis-engine?style=social) +![GitHub issues](https://img.shields.io/github/issues/scar17off/chess-analysis-engine) +![GitHub pull requests](https://img.shields.io/github/issues-pr/scar17off/chess-analysis-engine) +![GitHub last commit](https://img.shields.io/github/last-commit/scar17off/chess-analysis-engine) +![GitHub repo size](https://img.shields.io/github/repo-size/scar17off/chess-analysis-engine) +![GitHub contributors](https://img.shields.io/github/contributors/scar17off/chess-analysis-engine) +![GitHub commit activity](https://img.shields.io/github/commit-activity/m/scar17off/chess-analysis-engine) +![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/scar17off/chess-analysis-engine) + +An interactive chess game with built-in analysis engine and customizable AI opponent. Play against the computer, analyze positions, and improve your chess skills. ๐ŸŽฎ ๐Ÿค– + +## Features โœจ + +- Interactive chess board with legal move validation โ™Ÿ๏ธ +- Customizable AI opponent with adjustable strength (ELO rating) ๐Ÿค– +- Real-time position analysis ๐Ÿ“Š +- Opening book integration ๐Ÿ“š +- Move quality evaluation ๐ŸŽฏ +- Complete move history with annotations ๐Ÿ“ +- Free mode for position analysis ๐Ÿ” +- Multiple engine modes (depth-based and time-based) โš™๏ธ + +## Game Modes ๐ŸŽฎ + +### vs Computer ๐Ÿค– +Play against an AI opponent with adjustable strength from beginner to master level. The AI's playing strength can be fine-tuned using the ELO rating slider in settings. + +### Free Mode ๐Ÿ”“ +Analyze positions freely by moving pieces for both sides. This mode is perfect for studying specific positions or recreating games. + +## Analysis Features ๐Ÿ“Š + +- Real-time position evaluation ๐Ÿ“ˆ +- Move suggestions with quality indicators ๐Ÿ’ก +- Opening book recognition ๐Ÿ“š +- Move quality assessment (Brilliant, Great, Good, Inaccuracy, Mistake, Blunder) โญ +- Complete game history with annotations ๐Ÿ“ + +## Settings โš™๏ธ + +### Game Settings ๐ŸŽฎ +- Free Mode toggle ๐Ÿ”“ +- Opponent strength adjustment (ELO rating) ๐Ÿ’ช +- Opening book usage toggle ๐Ÿ“š + +### Analysis Engine Settings ๐Ÿ”ง +- Engine mode selection (Depth/Time based) โš™๏ธ +- Analysis power adjustment ๐Ÿ”‹ +- Engine statistics display (ELO, Rank, Depth/Time) ๐Ÿ“Š + +## Technical Details ๐Ÿ’ป + +Built with: +- React โš›๏ธ +- HTML5 Canvas ๐ŸŽจ +- Font Awesome icons ๐ŸŽฏ +- Custom chess engine โ™Ÿ๏ธ + +## Getting Started ๐Ÿš€ + +1. Clone the repository ๐Ÿ“ฅ +2. Install dependencies:```bash +npm install +``` +3. Start the development server: +```bash +npm start +``` + +## Contributing ๐Ÿค + +Contributions are welcome! Please feel free to submit a Pull Request. + +## License ๐Ÿ“„ + +This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details. diff --git a/build/asset-manifest.json b/build/asset-manifest.json new file mode 100644 index 0000000..4fa28fc --- /dev/null +++ b/build/asset-manifest.json @@ -0,0 +1,13 @@ +{ + "files": { + "main.css": "/static/css/main.1caca42d.css", + "main.js": "/static/js/main.3526cdc1.js", + "index.html": "/index.html", + "main.1caca42d.css.map": "/static/css/main.1caca42d.css.map", + "main.3526cdc1.js.map": "/static/js/main.3526cdc1.js.map" + }, + "entrypoints": [ + "static/css/main.1caca42d.css", + "static/js/main.3526cdc1.js" + ] +} \ No newline at end of file diff --git a/build/favicon.ico b/build/favicon.ico new file mode 100644 index 0000000..a11777c Binary files /dev/null and b/build/favicon.ico differ diff --git a/build/index.html b/build/index.html new file mode 100644 index 0000000..76a1324 --- /dev/null +++ b/build/index.html @@ -0,0 +1 @@ +Chess Analysis Engine
\ No newline at end of file diff --git a/build/manifest.json b/build/manifest.json new file mode 100644 index 0000000..f9051fe --- /dev/null +++ b/build/manifest.json @@ -0,0 +1,8 @@ +{ + "short_name": "React App", + "name": "Create React App Sample", + "start_url": ".", + "display": "standalone", + "theme_color": "#000000", + "background_color": "#ffffff" +} diff --git a/build/robots.txt b/build/robots.txt new file mode 100644 index 0000000..e9e57dc --- /dev/null +++ b/build/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: diff --git a/build/static/css/main.1caca42d.css b/build/static/css/main.1caca42d.css new file mode 100644 index 0000000..cbd61a8 --- /dev/null +++ b/build/static/css/main.1caca42d.css @@ -0,0 +1,2 @@ +body{background-color:#2f3437;font-family:Arial,sans-serif;margin:0;padding:0}.app-container{display:flex;gap:20px;margin:0 auto;max-width:1400px}.canvas-section,.image-section{flex:1 1;min-width:300px}.upload-container{background:#fff;border-radius:8px;box-shadow:0 2px 4px #0000001a;padding:20px}.image-input{display:none}.upload-label{background-color:#007bff;border-radius:4px;color:#fff;cursor:pointer;display:inline-block;padding:10px 20px;transition:background-color .3s}.upload-label:hover{background-color:#0056b3}.preview-container{margin-top:20px}.original-preview{border-radius:4px;height:auto;max-width:100%}canvas{background-color:#fff;border:1px solid #ccc;margin-bottom:20px;width:100%}.controls,canvas{border-radius:8px}.controls{background:#fff;box-shadow:0 2px 4px #0000001a;padding:20px}.slider-container{flex-direction:column;margin-bottom:20px}.filter-controls,.slider-container{display:flex;gap:10px}button{background-color:#007bff;border:none;border-radius:4px;color:#fff;cursor:pointer;padding:8px 16px;transition:background-color .3s}button:hover{background-color:#0056b3}select{border:1px solid #ccc;border-radius:4px;padding:8px}@media (max-width:768px){.app-container{flex-direction:column}.canvas-section,.image-section{width:100%}}.overlay-controls{border:1px solid #eee;border-radius:4px;margin:15px 0;padding:10px}.opacity-control{align-items:center;display:flex;gap:10px;margin-top:10px}.opacity-control input[type=range]{flex:1 1}.chess-game{align-items:center;background-color:#2f3437;display:flex;flex-direction:column;padding:20px}canvas{border:2px solid #1b1b1b;box-shadow:0 5px 15px #00000080;cursor:pointer;height:736px!important;width:736px!important}.status{color:#fff;font-size:1.2em;font-weight:700;margin-top:20px}@media (max-width:768px){canvas{height:auto!important;width:100%!important}}.chess-container{background-color:#2f3437;display:flex;gap:20px;padding:20px}.game-section{flex:0 0 auto}.analysis-panel{background:#262421;border-radius:8px;color:#fff;flex:1 1;max-height:736px;overflow-y:auto;padding:20px}.analysis-header{align-items:center;border-bottom:1px solid #3a3a3a;display:flex;gap:20px;margin-bottom:10px;padding-bottom:10px}.analysis-header h3{margin:0;padding:0}.move-list{font-family:monospace}.move-entry{grid-gap:10px;align-items:center;border-bottom:1px solid #3a3a3a;cursor:pointer;display:grid;font-family:Consolas,Monaco,Courier New,monospace;gap:10px;grid-template-columns:40px 120px 120px;padding:4px 8px}.move-entry .move-number{width:40px}.move-entry .black-move,.move-entry .white-move{color:#fff}.move-entry .analysis-section,.move-entry .move-section{display:flex;font-family:Consolas,Monaco,Courier New,monospace;gap:10px;white-space:nowrap}.move-entry:hover{background-color:#333}.move-entry.selected{background-color:#3a3a3a}.move-entry .eval{color:#7fa650;display:inline-block;min-width:45px}.move-entry .eval,.move-entry .line{font-family:Consolas,Monaco,Courier New,monospace}.move-entry .line{color:#b4b4b4;margin-right:20px}.status-container{align-items:center;display:flex;flex-direction:column;gap:10px}.move-navigation{align-items:center;display:flex;gap:15px}.move-navigation button{background:none;border:none;color:#7fa650;cursor:pointer}.move-navigation button:hover{color:#9fc670}.move-navigation span{color:#fff;font-family:monospace}.move-entry .move-number{color:#666;display:inline-block;width:30px}.move-entry .move{color:#fff;margin-left:10px}.analysis-panel h3{border-bottom:1px solid #3a3a3a;margin-top:20px;padding-bottom:10px}.tab-header{display:flex;gap:2px;margin-bottom:20px}.tab-button{background:#333;border:none;color:#999;cursor:pointer;padding:10px 20px;transition:all .3s}.tab-button.active,.tab-button:hover{background:#444;color:#fff}.tab-button.active{border-bottom:2px solid #7fa650}.tab-content{height:636px;overflow-y:auto}.settings-tab{padding:20px}.setting-item{align-items:center;display:flex;gap:10px;margin-bottom:15px}.setting-item label{color:#fff;min-width:120px}.setting-item select{background:#333;border:1px solid #555;border-radius:4px;color:#fff;padding:5px 10px}.setting-item select:focus{border-color:#7fa650;outline:none}.setting-item input[type=number]{background:#333;border:1px solid #555;border-radius:4px;color:#fff;font-family:Consolas,Monaco,Courier New,monospace;padding:5px 10px;width:60px}.setting-item input[type=number]:focus{border-color:#7fa650;outline:none}.setting-item input[type=number]::-webkit-inner-spin-button,.setting-item input[type=number]::-webkit-outer-spin-button{background:#444;opacity:1}.empty-message{color:#666;font-style:italic;padding:20px;text-align:center}.setting-item.checkbox{align-items:center;display:flex;gap:10px}.setting-item.checkbox input[type=checkbox]{accent-color:#7fa650;cursor:pointer;height:18px;width:18px}.setting-item.checkbox label{cursor:pointer;min-width:auto}.quality-icon{align-items:center;display:flex;font-size:14px;justify-content:center;min-width:20px;text-align:center}.quality-icon svg{height:14px;width:14px}.move-with-quality{align-items:center;display:flex;gap:8px}.analysis-section{align-items:center;display:flex;gap:12px}.move-notation{color:#fff}.book-indicator{color:#a88865;font-size:.9em;font-style:italic}.move-with-quality.book-move{background-color:#a888651a}.setting-group{margin-bottom:30px}.setting-group h4{color:#7fa650;font-size:1.1em;margin-bottom:15px}.engine-stats{background:#333;border-radius:4px;margin-top:15px;padding:15px}.stat-item{align-items:center;display:flex;gap:10px;margin-bottom:8px}.stat-item:last-child{margin-bottom:0}.bullet{color:#7fa650;font-size:1.2em}.setting-item input[type=range]{-webkit-appearance:none;background:#444;border-radius:2px;height:4px;margin:10px 0;width:100%}.setting-item input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:#7fa650;border-radius:50%;cursor:pointer;height:16px;width:16px}.setting-item input[type=range]::-moz-range-thumb{background:#7fa650;border:none;border-radius:50%;cursor:pointer;height:16px;width:16px} +/*# sourceMappingURL=main.1caca42d.css.map*/ \ No newline at end of file diff --git a/build/static/css/main.1caca42d.css.map b/build/static/css/main.1caca42d.css.map new file mode 100644 index 0000000..01382e7 --- /dev/null +++ b/build/static/css/main.1caca42d.css.map @@ -0,0 +1 @@ +{"version":3,"file":"static/css/main.1caca42d.css","mappings":"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","sources":["styles.css"],"sourcesContent":["body {\n margin: 0;\n padding: 0;\n font-family: Arial, sans-serif;\n background-color: #2f3437;\n}\n\n.app-container {\n display: flex;\n gap: 20px;\n max-width: 1400px;\n margin: 0 auto;\n}\n\n.image-section {\n flex: 1;\n min-width: 300px;\n}\n\n.canvas-section {\n flex: 1;\n min-width: 300px;\n}\n\n.upload-container {\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.image-input {\n display: none;\n}\n\n.upload-label {\n display: inline-block;\n padding: 10px 20px;\n background-color: #007bff;\n color: white;\n border-radius: 4px;\n cursor: pointer;\n transition: background-color 0.3s;\n}\n\n.upload-label:hover {\n background-color: #0056b3;\n}\n\n.preview-container {\n margin-top: 20px;\n}\n\n.original-preview {\n max-width: 100%;\n height: auto;\n border-radius: 4px;\n}\n\ncanvas {\n width: 100%;\n border: 1px solid #ccc;\n margin-bottom: 20px;\n border-radius: 8px;\n background-color: white;\n}\n\n.controls {\n background: white;\n padding: 20px;\n border-radius: 8px;\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n}\n\n.slider-container {\n display: flex;\n flex-direction: column;\n gap: 10px;\n margin-bottom: 20px;\n}\n\n.filter-controls {\n display: flex;\n gap: 10px;\n}\n\nbutton {\n padding: 8px 16px;\n cursor: pointer;\n background-color: #007bff;\n color: white;\n border: none;\n border-radius: 4px;\n transition: background-color 0.3s;\n}\n\nbutton:hover {\n background-color: #0056b3;\n}\n\nselect {\n padding: 8px;\n border-radius: 4px;\n border: 1px solid #ccc;\n}\n\n@media (max-width: 768px) {\n .app-container {\n flex-direction: column;\n }\n \n .image-section,\n .canvas-section {\n width: 100%;\n }\n}\n\n.overlay-controls {\n margin: 15px 0;\n padding: 10px;\n border: 1px solid #eee;\n border-radius: 4px;\n}\n\n.opacity-control {\n margin-top: 10px;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.opacity-control input[type=\"range\"] {\n flex: 1;\n}\n\n.chess-game {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 20px;\n background-color: #2f3437;\n}\n\ncanvas {\n border: 2px solid #1b1b1b;\n cursor: pointer;\n width: 736px !important;\n height: 736px !important;\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n}\n\n.status {\n margin-top: 20px;\n font-size: 1.2em;\n font-weight: bold;\n color: #ffffff;\n}\n\n@media (max-width: 768px) {\n canvas {\n width: 100% !important;\n height: auto !important;\n }\n}\n\n.chess-container {\n display: flex;\n gap: 20px;\n padding: 20px;\n background-color: #2f3437;\n}\n\n.game-section {\n flex: 0 0 auto;\n}\n\n.analysis-panel {\n flex: 1;\n background: #262421;\n padding: 20px;\n border-radius: 8px;\n color: #fff;\n max-height: 736px;\n overflow-y: auto;\n}\n\n.analysis-header {\n display: flex;\n align-items: center;\n gap: 20px;\n padding-bottom: 10px;\n border-bottom: 1px solid #3a3a3a;\n margin-bottom: 10px;\n}\n\n.analysis-header h3 {\n margin: 0;\n padding: 0;\n}\n\n.move-list {\n font-family: monospace;\n}\n\n.move-entry {\n padding: 4px 8px;\n border-bottom: 1px solid #3a3a3a;\n cursor: pointer;\n display: grid;\n grid-template-columns: 40px 120px 120px;\n align-items: center;\n gap: 10px;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n}\n\n.move-entry .move-number {\n color: #666;\n width: 40px;\n}\n\n.move-entry .white-move {\n color: #fff;\n}\n\n.move-entry .black-move {\n color: #fff;\n}\n\n.move-entry .analysis-section {\n display: flex;\n gap: 10px;\n white-space: nowrap;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n}\n\n.move-entry .move-section {\n display: flex;\n gap: 10px;\n white-space: nowrap;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n}\n\n.move-entry:hover {\n background-color: #333;\n}\n\n.move-entry.selected {\n background-color: #3a3a3a;\n}\n\n.move-entry .eval {\n display: inline-block;\n min-width: 45px;\n color: #7fa650;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n}\n\n.move-entry .line {\n color: #b4b4b4;\n margin-right: 20px;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n}\n\n.status-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 10px;\n}\n\n.move-navigation {\n display: flex;\n align-items: center;\n gap: 15px;\n}\n\n.move-navigation button {\n background: none;\n border: none;\n color: #7fa650;\n cursor: pointer;\n}\n\n.move-navigation button:hover {\n color: #9fc670;\n}\n\n.move-navigation span {\n color: #fff;\n font-family: monospace;\n}\n\n.move-entry .move-number {\n display: inline-block;\n width: 30px;\n color: #666;\n}\n\n.move-entry .move {\n color: #fff;\n margin-left: 10px;\n}\n\n.analysis-panel h3 {\n margin-top: 20px;\n padding-bottom: 10px;\n border-bottom: 1px solid #3a3a3a;\n}\n\n.tab-header {\n display: flex;\n gap: 2px;\n margin-bottom: 20px;\n}\n\n.tab-button {\n padding: 10px 20px;\n background: #333;\n border: none;\n color: #999;\n cursor: pointer;\n transition: all 0.3s;\n}\n\n.tab-button:hover {\n background: #444;\n color: #fff;\n}\n\n.tab-button.active {\n background: #444;\n color: #fff;\n border-bottom: 2px solid #7fa650;\n}\n\n.tab-content {\n height: calc(736px - 100px);\n overflow-y: auto;\n}\n\n.settings-tab {\n padding: 20px;\n}\n\n.setting-item {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 15px;\n}\n\n.setting-item label {\n color: #fff;\n min-width: 120px;\n}\n\n.setting-item select {\n background: #333;\n color: #fff;\n border: 1px solid #555;\n padding: 5px 10px;\n border-radius: 4px;\n}\n\n.setting-item select:focus {\n outline: none;\n border-color: #7fa650;\n}\n\n.setting-item input[type=\"number\"] {\n background: #333;\n color: #fff;\n border: 1px solid #555;\n padding: 5px 10px;\n border-radius: 4px;\n width: 60px;\n font-family: 'Consolas', 'Monaco', 'Courier New', monospace;\n}\n\n.setting-item input[type=\"number\"]:focus {\n outline: none;\n border-color: #7fa650;\n}\n\n.setting-item input[type=\"number\"]::-webkit-inner-spin-button,\n.setting-item input[type=\"number\"]::-webkit-outer-spin-button {\n opacity: 1;\n background: #444;\n}\n\n.empty-message {\n color: #666;\n text-align: center;\n padding: 20px;\n font-style: italic;\n}\n\n.setting-item.checkbox {\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.setting-item.checkbox input[type=\"checkbox\"] {\n width: 18px;\n height: 18px;\n cursor: pointer;\n accent-color: #7fa650;\n}\n\n.setting-item.checkbox label {\n cursor: pointer;\n min-width: auto;\n}\n\n.move-with-quality {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.quality-icon {\n font-size: 14px;\n min-width: 20px;\n text-align: center;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.quality-icon svg {\n width: 14px;\n height: 14px;\n}\n\n.move-with-quality {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.analysis-section {\n display: flex;\n align-items: center;\n gap: 12px;\n}\n\n.move-notation {\n color: #fff;\n}\n\n.book-indicator {\n color: #a88865;\n font-style: italic;\n font-size: 0.9em;\n}\n\n.move-with-quality.book-move {\n background-color: rgba(168, 136, 101, 0.1);\n}\n\n.setting-group {\n margin-bottom: 30px;\n}\n\n.setting-group h4 {\n color: #7fa650;\n margin-bottom: 15px;\n font-size: 1.1em;\n}\n\n.engine-stats {\n margin-top: 15px;\n padding: 15px;\n background: #333;\n border-radius: 4px;\n}\n\n.stat-item {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-bottom: 8px;\n}\n\n.stat-item:last-child {\n margin-bottom: 0;\n}\n\n.bullet {\n color: #7fa650;\n font-size: 1.2em;\n}\n\n.setting-item input[type=\"range\"] {\n width: 100%;\n margin: 10px 0;\n background: #444;\n height: 4px;\n border-radius: 2px;\n -webkit-appearance: none;\n}\n\n.setting-item input[type=\"range\"]::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: 16px;\n height: 16px;\n background: #7fa650;\n border-radius: 50%;\n cursor: pointer;\n}\n\n.setting-item input[type=\"range\"]::-moz-range-thumb {\n width: 16px;\n height: 16px;\n background: #7fa650;\n border-radius: 50%;\n cursor: pointer;\n border: none;\n}\n "],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/build/static/js/main.3526cdc1.js b/build/static/js/main.3526cdc1.js new file mode 100644 index 0000000..70a6937 --- /dev/null +++ b/build/static/js/main.3526cdc1.js @@ -0,0 +1,3 @@ +/*! For license information please see main.3526cdc1.js.LICENSE.txt */ +(()=>{var e={497:(e,n,t)=>{"use strict";var r=t(218);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,n,t,a,o,l){if(l!==r){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function n(){return e}e.isRequired=e;var t={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:n,element:e,elementType:e,instanceOf:n,node:e,objectOf:n,oneOf:n,oneOfType:n,shape:n,exact:n,checkPropTypes:o,resetWarningCache:a};return t.PropTypes=t,t}},173:(e,n,t)=>{e.exports=t(497)()},218:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},730:(e,n,t)=>{"use strict";var r=t(43),a=t(853);function o(e){for(var n="https://reactjs.org/docs/error-decoder.html?invariant="+e,t=1;t