From 102a8d63d4f6d08e9ddaf845a2c09391810a5d26 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Sun, 1 Feb 2026 20:22:43 +0200 Subject: [PATCH 01/26] Ran - downloaded Chart JS --- .../src/strategy/generic-line-chart.tsx | 29 + package-lock.json | 1701 ++++++++++++++--- package.json | 3 +- 3 files changed, 1470 insertions(+), 263 deletions(-) create mode 100644 apps/scouting/frontend/src/strategy/generic-line-chart.tsx diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx new file mode 100644 index 0000000..3ae6260 --- /dev/null +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -0,0 +1,29 @@ +//בס"ד +import { Line } from 'react-chartjs-2'; + +import { + Chart as ChartJS, + LineElement, + PointElement, + LinearScale, + CategoryScale, + Title, + Tooltip, + Legend, + Filler +} from 'chart.js'; + +ChartJS.register( + LineElement, + PointElement, + LinearScale, + CategoryScale, + Title, + Tooltip, + Legend, + Filler +); + +export const LineGraph = () =>{ + return +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a9aa59a..5eb10de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "@radix-ui/react-slider": "^1.3.6", "@tailwindcss/vite": "^4.1.17", "axios": "^1.13.2", + "chart.js": "^4.5.1", "dotenv": "^17.2.3", "dotenv-cli": "^11.0.0", "eslint-plugin-bsd": "^1.0.0", @@ -24,6 +25,7 @@ "io-ts": "^2.2.22", "is-odd": "^3.0.1", "qrcode.react": "^4.2.0", + "react-chartjs-2": "^5.3.1", "react-icons": "^5.5.0", "react-router-dom": "^7.13.0", "tailwindcss": "^4.1.17", @@ -162,6 +164,7 @@ "version": "7.28.6", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", @@ -1763,216 +1766,610 @@ "dev": true, "license": "MIT" }, - "node_modules/@esbuild/win32-x64": { + "node_modules/@esbuild/aix-ppc64": { "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", "cpu": [ - "x64" + "ppc64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "aix" ], "engines": { "node": ">=18" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.1", + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=18" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=18" } }, - "node_modules/@eslint-react/ast": { - "version": "2.7.2", - "dev": true, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@eslint-react/eff": "2.7.2", - "@typescript-eslint/types": "^8.53.0", - "@typescript-eslint/typescript-estree": "^8.53.0", - "@typescript-eslint/utils": "^8.53.0", - "string-ts": "^2.3.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "node": ">=18" } }, - "node_modules/@eslint-react/core": { - "version": "2.7.2", - "dev": true, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@eslint-react/ast": "2.7.2", - "@eslint-react/eff": "2.7.2", - "@eslint-react/shared": "2.7.2", - "@eslint-react/var": "2.7.2", - "@typescript-eslint/scope-manager": "^8.53.0", - "@typescript-eslint/types": "^8.53.0", - "@typescript-eslint/utils": "^8.53.0", - "birecord": "^0.1.1", - "ts-pattern": "^5.9.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "node": ">=18" } }, - "node_modules/@eslint-react/eff": { - "version": "2.7.2", - "dev": true, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=20.19.0" + "node": ">=18" } }, - "node_modules/@eslint-react/eslint-plugin": { - "version": "2.7.2", - "dev": true, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@eslint-react/eff": "2.7.2", - "@eslint-react/shared": "2.7.2", - "@typescript-eslint/scope-manager": "^8.53.0", - "@typescript-eslint/type-utils": "^8.53.0", - "@typescript-eslint/types": "^8.53.0", - "@typescript-eslint/utils": "^8.53.0", - "eslint-plugin-react-dom": "2.7.2", - "eslint-plugin-react-hooks-extra": "2.7.2", - "eslint-plugin-react-naming-convention": "2.7.2", - "eslint-plugin-react-web-api": "2.7.2", - "eslint-plugin-react-x": "2.7.2", - "ts-api-utils": "^2.4.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "node": ">=18" } }, - "node_modules/@eslint-react/shared": { - "version": "2.7.2", - "dev": true, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@eslint-react/eff": "2.7.2", - "@typescript-eslint/utils": "^8.53.0", - "ts-pattern": "^5.9.0", - "zod": "^3.25.0 || ^4.0.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "node": ">=18" } }, - "node_modules/@eslint-react/var": { - "version": "2.7.2", - "dev": true, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@eslint-react/ast": "2.7.2", - "@eslint-react/eff": "2.7.2", - "@typescript-eslint/scope-manager": "^8.53.0", - "@typescript-eslint/types": "^8.53.0", - "@typescript-eslint/utils": "^8.53.0", - "ts-pattern": "^5.9.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" + "node": ">=18" } }, - "node_modules/@eslint/config-array": { - "version": "0.21.1", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/object-schema": "^2.1.7", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], "license": "MIT", - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "*" + "node": ">=18" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.4.2", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@eslint/core": "^0.17.0" - }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/core": { - "version": "0.17.0", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": ">=18" } }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.3", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint-react/ast": { + "version": "2.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/eff": "2.7.2", + "@typescript-eslint/types": "^8.53.0", + "@typescript-eslint/typescript-estree": "^8.53.0", + "@typescript-eslint/utils": "^8.53.0", + "string-ts": "^2.3.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint-react/core": { + "version": "2.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.7.2", + "@eslint-react/eff": "2.7.2", + "@eslint-react/shared": "2.7.2", + "@eslint-react/var": "2.7.2", + "@typescript-eslint/scope-manager": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", + "@typescript-eslint/utils": "^8.53.0", + "birecord": "^0.1.1", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint-react/eff": { + "version": "2.7.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@eslint-react/eslint-plugin": { + "version": "2.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/eff": "2.7.2", + "@eslint-react/shared": "2.7.2", + "@typescript-eslint/scope-manager": "^8.53.0", + "@typescript-eslint/type-utils": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", + "@typescript-eslint/utils": "^8.53.0", + "eslint-plugin-react-dom": "2.7.2", + "eslint-plugin-react-hooks-extra": "2.7.2", + "eslint-plugin-react-naming-convention": "2.7.2", + "eslint-plugin-react-web-api": "2.7.2", + "eslint-plugin-react-x": "2.7.2", + "ts-api-utils": "^2.4.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint-react/shared": { + "version": "2.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/eff": "2.7.2", + "@typescript-eslint/utils": "^8.53.0", + "ts-pattern": "^5.9.0", + "zod": "^3.25.0 || ^4.0.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint-react/var": { + "version": "2.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-react/ast": "2.7.2", + "@eslint-react/eff": "2.7.2", + "@typescript-eslint/scope-manager": "^8.53.0", + "@typescript-eslint/types": "^8.53.0", + "@typescript-eslint/utils": "^8.53.0", + "ts-pattern": "^5.9.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.12", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", "license": "MIT", - "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1994,7 +2391,6 @@ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.12", "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2003,7 +2399,6 @@ "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -2024,7 +2419,6 @@ "node_modules/@eslint/object-schema": { "version": "2.1.7", "license": "Apache-2.0", - "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } @@ -2032,7 +2426,6 @@ "node_modules/@eslint/plugin-kit": { "version": "0.4.1", "license": "Apache-2.0", - "peer": true, "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" @@ -2044,7 +2437,6 @@ "node_modules/@humanfs/core": { "version": "0.19.1", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=18.18.0" } @@ -2052,7 +2444,6 @@ "node_modules/@humanfs/node": { "version": "0.16.7", "license": "Apache-2.0", - "peer": true, "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" @@ -2064,7 +2455,6 @@ "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=12.22" }, @@ -2076,7 +2466,6 @@ "node_modules/@humanwhocodes/retry": { "version": "0.4.3", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=18.18" }, @@ -2172,6 +2561,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, "node_modules/@radix-ui/number": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.1.1.tgz", @@ -2485,64 +2880,389 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", - "dev": true, + "node_modules/@rollup/plugin-terser": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", + "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "serialize-javascript": "^6.0.1", + "smob": "^1.0.0", + "terser": "^5.17.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.55.2.tgz", + "integrity": "sha512-21J6xzayjy3O6NdnlO6aXi/urvSRjm6nCI6+nF6ra2YofKruGixN9kfT+dt55HVNwfDmpDHJcaS3JuP/boNnlA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.55.2.tgz", + "integrity": "sha512-eXBg7ibkNUZ+sTwbFiDKou0BAckeV6kIigK7y5Ko4mB/5A1KLhuzEKovsmfvsL8mQorkoincMFGnQuIT92SKqA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.55.2.tgz", + "integrity": "sha512-UCbaTklREjrc5U47ypLulAgg4njaqfOVLU18VrCrI+6E5MQjuG0lSWaqLlAJwsD7NpFV249XgB0Bi37Zh5Sz4g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.55.2.tgz", + "integrity": "sha512-dP67MA0cCMHFT2g5XyjtpVOtp7y4UyUxN3dhLdt11at5cPKnSm4lY+EhwNvDXIMzAMIo2KU+mc9wxaAQJTn7sQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.55.2.tgz", + "integrity": "sha512-WDUPLUwfYV9G1yxNRJdXcvISW15mpvod1Wv3ok+Ws93w1HjIVmCIFxsG2DquO+3usMNCpJQ0wqO+3GhFdl6Fow==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.55.2.tgz", + "integrity": "sha512-Ng95wtHVEulRwn7R0tMrlUuiLVL/HXA8Lt/MYVpy88+s5ikpntzZba1qEulTuPnPIZuOPcW9wNEiqvZxZmgmqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.55.2.tgz", + "integrity": "sha512-AEXMESUDWWGqD6LwO/HkqCZgUE1VCJ1OhbvYGsfqX2Y6w5quSXuyoy/Fg3nRqiwro+cJYFxiw5v4kB2ZDLhxrw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.55.2.tgz", + "integrity": "sha512-ZV7EljjBDwBBBSv570VWj0hiNTdHt9uGznDtznBB4Caj3ch5rgD4I2K1GQrtbvJ/QiB+663lLgOdcADMNVC29Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.55.2.tgz", + "integrity": "sha512-uvjwc8NtQVPAJtq4Tt7Q49FOodjfbf6NpqXyW/rjXoV+iZ3EJAHLNAnKT5UJBc6ffQVgmXTUL2ifYiLABlGFqA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.55.2.tgz", + "integrity": "sha512-s3KoWVNnye9mm/2WpOZ3JeUiediUVw6AvY/H7jNA6qgKA2V2aM25lMkVarTDfiicn/DLq3O0a81jncXszoyCFA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.55.2.tgz", + "integrity": "sha512-gi21faacK+J8aVSyAUptML9VQN26JRxe484IbF+h3hpG+sNVoMXPduhREz2CcYr5my0NE3MjVvQ5bMKX71pfVA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.55.2.tgz", + "integrity": "sha512-qSlWiXnVaS/ceqXNfnoFZh4IiCA0EwvCivivTGbEu1qv2o+WTHpn1zNmCTAoOG5QaVr2/yhCoLScQtc/7RxshA==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.55.2.tgz", + "integrity": "sha512-rPyuLFNoF1B0+wolH277E780NUKf+KoEDb3OyoLbAO18BbeKi++YN6gC/zuJoPPDlQRL3fIxHxCxVEWiem2yXw==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.55.2.tgz", + "integrity": "sha512-g+0ZLMook31iWV4PvqKU0i9E78gaZgYpSrYPed/4Bu+nGTgfOPtfs1h11tSSRPXSjC5EzLTjV/1A7L2Vr8pJoQ==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.55.2.tgz", + "integrity": "sha512-i+sGeRGsjKZcQRh3BRfpLsM3LX3bi4AoEVqmGDyc50L6KfYsN45wVCSz70iQMwPWr3E5opSiLOwsC9WB4/1pqg==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.55.2.tgz", + "integrity": "sha512-C1vLcKc4MfFV6I0aWsC7B2Y9QcsiEcvKkfxprwkPfLaN8hQf0/fKHwSF2lcYzA9g4imqnhic729VB9Fo70HO3Q==", + "cpu": [ + "riscv64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.55.2.tgz", + "integrity": "sha512-68gHUK/howpQjh7g7hlD9DvTTt4sNLp1Bb+Yzw2Ki0xvscm2cOdCLZNJNhd2jW8lsTPrHAHuF751BygifW4bkQ==", + "cpu": [ + "s390x" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.55.2.tgz", + "integrity": "sha512-1e30XAuaBP1MAizaOBApsgeGZge2/Byd6wV4a8oa6jPdHELbRHBiw7wvo4dp7Ie2PE8TZT4pj9RLGZv9N4qwlw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.55.2.tgz", + "integrity": "sha512-4BJucJBGbuGnH6q7kpPqGJGzZnYrpAzRd60HQSt3OpX/6/YVgSsJnNzR8Ot74io50SeVT4CtCWe/RYIAymFPwA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.55.2.tgz", + "integrity": "sha512-cT2MmXySMo58ENv8p6/O6wI/h/gLnD3D6JoajwXFZH6X9jz4hARqUhWpGuQhOgLNXscfZYRQMJvZDtWNzMAIDw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.55.2.tgz", + "integrity": "sha512-sZnyUgGkuzIXaK3jNMPmUIyJrxu/PjmATQrocpGA1WbCPX8H5tfGgRSuYtqBYAvLuIGp8SPRb1O4d1Fkb5fXaQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.55.2.tgz", + "integrity": "sha512-sDpFbenhmWjNcEbBcoTV0PWvW5rPJFvu+P7XoTY0YLGRupgLbFY0XPfwIbJOObzO7QgkRDANh65RjhPmgSaAjQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", - "dev": true, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.55.2.tgz", + "integrity": "sha512-GvJ03TqqaweWCigtKQVBErw2bEhu1tyfNQbarwr94wCGnczA9HF8wqEe3U/Lfu6EdeNP0p6R+APeHVwEqVxpUQ==", + "cpu": [ + "ia32" + ], "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@rollup/pluginutils/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.55.2.tgz", + "integrity": "sha512-KvXsBvp13oZz9JGe5NYS7FNizLe99Ny+W8ETsuCyjXiKdiGrcz2/J/N8qxZ/RSwivqjQguug07NLHqrIHrqfYw==", + "cpu": [ + "x64" + ], "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.55.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.55.2.tgz", + "integrity": "sha512-xNO+fksQhsAckRtDSPWaMeT1uIM+JrDRXlerpnWNXhn1TdB3YZ6uKBMBTKP0eX9XtYEP978hHk1f8332i2AW8Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", @@ -2601,6 +3321,195 @@ "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" } }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", + "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", + "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", + "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", + "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", + "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", + "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", + "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", + "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", + "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", + "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.0", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.18", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", + "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { "version": "4.1.18", "cpu": [ @@ -2728,8 +3637,7 @@ }, "node_modules/@types/json-schema": { "version": "7.0.15", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/node": { "version": "24.10.9", @@ -2835,6 +3743,7 @@ "version": "8.53.1", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.53.1", "@typescript-eslint/types": "8.53.1", @@ -3048,6 +3957,7 @@ "node_modules/acorn": { "version": "8.15.0", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3058,7 +3968,6 @@ "node_modules/acorn-jsx": { "version": "5.3.2", "license": "MIT", - "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -3066,7 +3975,6 @@ "node_modules/ajv": { "version": "6.12.6", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3118,8 +4026,7 @@ }, "node_modules/argparse": { "version": "2.0.1", - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", @@ -3435,6 +4342,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3507,7 +4415,6 @@ "node_modules/callsites": { "version": "3.1.0", "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -3545,6 +4452,19 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chart.js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, "node_modules/chokidar": { "version": "3.6.0", "dev": true, @@ -3789,8 +4709,7 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", @@ -4195,7 +5114,6 @@ "node_modules/escape-string-regexp": { "version": "4.0.0", "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -4457,7 +5375,6 @@ "node_modules/eslint-scope": { "version": "8.4.0", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -4482,7 +5399,6 @@ "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.12", "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4491,7 +5407,6 @@ "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", "license": "Apache-2.0", - "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4502,7 +5417,6 @@ "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4513,7 +5427,6 @@ "node_modules/espree": { "version": "10.4.0", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", @@ -4529,7 +5442,6 @@ "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "4.2.1", "license": "Apache-2.0", - "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -4540,7 +5452,6 @@ "node_modules/esquery": { "version": "1.7.0", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -4551,7 +5462,6 @@ "node_modules/esrecurse": { "version": "4.3.0", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -4638,8 +5548,7 @@ }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fast-uri": { "version": "3.1.0", @@ -4661,7 +5570,6 @@ "node_modules/file-entry-cache": { "version": "8.0.0", "license": "MIT", - "peer": true, "dependencies": { "flat-cache": "^4.0.0" }, @@ -4739,7 +5647,6 @@ "node_modules/flat-cache": { "version": "4.0.1", "license": "MIT", - "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" @@ -4749,9 +5656,8 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "license": "ISC", - "peer": true + "version": "3.3.3", + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.11", @@ -4841,7 +5747,8 @@ }, "node_modules/fp-ts": { "version": "2.16.11", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fresh": { "version": "2.0.0", @@ -5019,7 +5926,6 @@ "node_modules/glob-parent": { "version": "6.0.2", "license": "ISC", - "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -5046,7 +5952,6 @@ "node_modules/globals": { "version": "14.0.0", "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -5201,7 +6106,6 @@ "node_modules/ignore": { "version": "5.3.2", "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } @@ -5214,7 +6118,6 @@ "node_modules/import-fresh": { "version": "3.3.1", "license": "MIT", - "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -5229,7 +6132,6 @@ "node_modules/imurmurhash": { "version": "0.1.4", "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.19" } @@ -5753,7 +6655,6 @@ "node_modules/js-yaml": { "version": "4.1.1", "license": "MIT", - "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -5774,8 +6675,7 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-schema": { "version": "0.4.0", @@ -5786,13 +6686,11 @@ }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json5": { "version": "2.2.3", @@ -5844,7 +6742,6 @@ "node_modules/keyv": { "version": "4.5.4", "license": "MIT", - "peer": true, "dependencies": { "json-buffer": "3.0.1" } @@ -5862,7 +6759,6 @@ "node_modules/levn": { "version": "0.4.1", "license": "MIT", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -5898,6 +6794,206 @@ "lightningcss-win32-x64-msvc": "1.30.2" } }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/lightningcss-win32-x64-msvc": { "version": "1.30.2", "cpu": [ @@ -5944,8 +7040,7 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash.sortby": { "version": "4.7.0", @@ -6272,7 +7367,6 @@ "node_modules/optionator": { "version": "0.9.4", "license": "MIT", - "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -6336,7 +7430,6 @@ "node_modules/parent-module": { "version": "1.0.1", "license": "MIT", - "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -6455,7 +7548,6 @@ "node_modules/prelude-ls": { "version": "1.2.1", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8.0" } @@ -6585,13 +7677,25 @@ "node_modules/react": { "version": "19.2.3", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/react-chartjs-2": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.1.tgz", + "integrity": "sha512-h5IPXKg9EXpjoBzUfyWJvllMjG2mQ4EiuHQFhms/AjUm0XSZHhyRy2xVmLXHKrtcdrPO4mnGqRtYoD0vp95A0A==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/react-dom": { "version": "19.2.3", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -6813,7 +7917,6 @@ "node_modules/resolve-from": { "version": "4.0.0", "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -7476,7 +8579,6 @@ "node_modules/strip-json-comments": { "version": "3.1.1", "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -7562,6 +8664,7 @@ "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", "devOptional": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", @@ -7607,6 +8710,7 @@ "node_modules/tinyglobby/node_modules/picomatch": { "version": "4.0.3", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -7701,6 +8805,7 @@ "node_modules/tsx": { "version": "4.21.0", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" @@ -7731,6 +8836,62 @@ "turbo-windows-arm64": "2.7.5" } }, + "node_modules/turbo-darwin-64": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.7.5.tgz", + "integrity": "sha512-nN3wfLLj4OES/7awYyyM7fkU8U8sAFxsXau2bYJwAWi6T09jd87DgHD8N31zXaJ7LcpyppHWPRI2Ov9MuZEwnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/turbo-darwin-arm64": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.7.5.tgz", + "integrity": "sha512-wCoDHMiTf3FgLAbZHDDx/unNNonSGhsF5AbbYODbxnpYyoKDpEYacUEPjZD895vDhNvYCH0Nnk24YsP4n/cD6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/turbo-linux-64": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.7.5.tgz", + "integrity": "sha512-KKPvhOmJMmzWj/yjeO4LywkQ85vOJyhru7AZk/+c4B6OUh/odQ++SiIJBSbTG2lm1CuV5gV5vXZnf/2AMlu3Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/turbo-linux-arm64": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.7.5.tgz", + "integrity": "sha512-8PIva4L6BQhiPikUTds9lSFSHXVDAsEvV6QUlgwPsXrtXVQMVi6Sv9p+IxtlWQFvGkdYJUgX9GnK2rC030Xcmw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/turbo-windows-64": { "version": "2.7.5", "cpu": [ @@ -7743,10 +8904,23 @@ "win32" ] }, + "node_modules/turbo-windows-arm64": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.7.5.tgz", + "integrity": "sha512-G377Gxn6P42RnCzfMyDvsqQV7j69kVHKlhz9J4RhtJOB5+DyY4yYh/w0oTIxZQ4JRMmhjwLu3w9zncMoQ6nNDw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/type-check": { "version": "0.4.0", "license": "MIT", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -7851,6 +9025,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -8024,7 +9199,6 @@ "node_modules/uri-js": { "version": "4.4.1", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -8054,6 +9228,7 @@ "node_modules/vite": { "version": "7.3.1", "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -8172,6 +9347,7 @@ "node_modules/vite/node_modules/picomatch": { "version": "4.0.3", "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -8291,7 +9467,6 @@ "node_modules/word-wrap": { "version": "1.2.5", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -8453,6 +9628,7 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -8507,6 +9683,7 @@ "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, diff --git a/package.json b/package.json index 37dd3ee..f4dc8e1 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ "typescript-eslint": "^8.47.0", "vite-plugin-pwa": "^1.2.0" }, - "engines": { "node": ">=18" }, @@ -42,6 +41,7 @@ "@radix-ui/react-slider": "^1.3.6", "@tailwindcss/vite": "^4.1.17", "axios": "^1.13.2", + "chart.js": "^4.5.1", "dotenv": "^17.2.3", "dotenv-cli": "^11.0.0", "eslint-plugin-bsd": "^1.0.0", @@ -52,6 +52,7 @@ "io-ts": "^2.2.22", "is-odd": "^3.0.1", "qrcode.react": "^4.2.0", + "react-chartjs-2": "^5.3.1", "react-icons": "^5.5.0", "react-router-dom": "^7.13.0", "tailwindcss": "^4.1.17", From cd64c338529cfb930d06b4e3560ce88926c9d7a8 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Sun, 1 Feb 2026 20:30:58 +0200 Subject: [PATCH 02/26] Ran - initial setup of chart js --- apps/scouting/frontend/src/main.tsx | 4 +++- .../frontend/src/strategy/data-for-charts.ts | 19 +++++++++++++++++++ .../src/strategy/generic-line-chart.tsx | 3 ++- 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 apps/scouting/frontend/src/strategy/data-for-charts.ts diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index ef3faa3..d40ae19 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -5,13 +5,15 @@ import { registerSW } from "virtual:pwa-register"; import "./index.css"; import App from "./App"; import { BrowserRouter } from "react-router-dom"; +import { Line } from "react-chartjs-2"; +import { LineGraph } from "./strategy/generic-line-chart"; registerSW({ immediate: true }); createRoot(document.getElementById("root")!).render( - + , ); diff --git a/apps/scouting/frontend/src/strategy/data-for-charts.ts b/apps/scouting/frontend/src/strategy/data-for-charts.ts new file mode 100644 index 0000000..76c61ec --- /dev/null +++ b/apps/scouting/frontend/src/strategy/data-for-charts.ts @@ -0,0 +1,19 @@ +// בס"ד +export const lineChartData = { + labels: [ + "Sunday", + "Monday", + "Tuesday", + "Wednesday", + "Thursday", + "Friday", + "Saturday" + ], + datasets: [ + { + label: "Steps", + data: [3000,4000,5000,6000,7000,9000,1000], + borderColor: "red" + } + ] +} \ No newline at end of file diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index 3ae6260..78f2a83 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -12,6 +12,7 @@ import { Legend, Filler } from 'chart.js'; +import { lineChartData } from './data-for-charts'; ChartJS.register( LineElement, @@ -25,5 +26,5 @@ ChartJS.register( ); export const LineGraph = () =>{ - return + return } \ No newline at end of file From 132bfb7bb32298e02ece3784953765d2b8adba25 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Sun, 1 Feb 2026 20:41:43 +0200 Subject: [PATCH 03/26] Ran - almost fulfilled initial setup --- .../src/strategy/data-templates-for-charts.ts | 12 ++++++++++++ .../test-dataset.ts} | 0 .../frontend/src/strategy/generic-line-chart.tsx | 2 +- 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 apps/scouting/frontend/src/strategy/data-templates-for-charts.ts rename apps/scouting/frontend/src/strategy/{data-for-charts.ts => datasets.ts/test-dataset.ts} (100%) diff --git a/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts b/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts new file mode 100644 index 0000000..f911a6d --- /dev/null +++ b/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts @@ -0,0 +1,12 @@ +// בס"ד +interface DataSet { + name: string; + points: Record; + color?: string; //assign color if not defined +} + +interface LineChartProps { + dataSets: DataSet[]; + max?: number; + min?: number; +} \ No newline at end of file diff --git a/apps/scouting/frontend/src/strategy/data-for-charts.ts b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts similarity index 100% rename from apps/scouting/frontend/src/strategy/data-for-charts.ts rename to apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index 78f2a83..da3322f 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -12,7 +12,7 @@ import { Legend, Filler } from 'chart.js'; -import { lineChartData } from './data-for-charts'; +import { lineChartData } from './data-templates-for-charts'; ChartJS.register( LineElement, From 056a123b5e1fdb50e5e28d9e4760f2ef642a6be7 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Sun, 1 Feb 2026 21:03:58 +0200 Subject: [PATCH 04/26] Ran - almost done with generic --- .../frontend/src/strategy/data-templates-for-charts.ts | 4 ++-- .../scouting/frontend/src/strategy/generic-line-chart.tsx | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts b/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts index f911a6d..2a63157 100644 --- a/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts +++ b/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts @@ -5,8 +5,8 @@ interface DataSet { color?: string; //assign color if not defined } -interface LineChartProps { - dataSets: DataSet[]; +export interface LineChartProps{ + dataSets: DataSet[]; max?: number; min?: number; } \ No newline at end of file diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index da3322f..30d644b 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -1,6 +1,5 @@ //בס"ד import { Line } from 'react-chartjs-2'; - import { Chart as ChartJS, LineElement, @@ -12,7 +11,8 @@ import { Legend, Filler } from 'chart.js'; -import { lineChartData } from './data-templates-for-charts'; +import { lineChartData } from './datasets.ts/test-dataset'; +import type { LineChartProps } from './data-templates-for-charts'; ChartJS.register( LineElement, @@ -25,6 +25,6 @@ ChartJS.register( Filler ); -export const LineGraph = () =>{ - return +export const LineGraph = (lineChartProps: LineChartProps) =>{ + return } \ No newline at end of file From 081d3e563621e1097908c528f42ddbf9a1c86d64 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Tue, 3 Feb 2026 12:13:17 +0200 Subject: [PATCH 05/26] Ran - Yoni's format must be converted into a valid one --- apps/scouting/frontend/src/main.tsx | 2 +- .../src/strategy/data-templates-for-charts.ts | 6 +-- .../src/strategy/generic-line-chart.tsx | 37 ++++++++++++++----- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index d40ae19..c73dbc4 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -13,7 +13,7 @@ registerSW({ immediate: true }); createRoot(document.getElementById("root")!).render( - + , ); diff --git a/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts b/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts index 2a63157..122eae6 100644 --- a/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts +++ b/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts @@ -5,8 +5,8 @@ interface DataSet { color?: string; //assign color if not defined } -export interface LineChartProps{ - dataSets: DataSet[]; +export interface LineChartProps { + dataSetsProps: DataSet[]; max?: number; min?: number; -} \ No newline at end of file +} diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index 30d644b..9d9a1c7 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -1,5 +1,5 @@ //בס"ד -import { Line } from 'react-chartjs-2'; +import { Line } from "react-chartjs-2"; import { Chart as ChartJS, LineElement, @@ -9,10 +9,9 @@ import { Title, Tooltip, Legend, - Filler -} from 'chart.js'; -import { lineChartData } from './datasets.ts/test-dataset'; -import type { LineChartProps } from './data-templates-for-charts'; + Filler, +} from "chart.js"; +import type { LineChartProps } from "./data-templates-for-charts"; ChartJS.register( LineElement, @@ -22,9 +21,29 @@ ChartJS.register( Title, Tooltip, Legend, - Filler + Filler, ); -export const LineGraph = (lineChartProps: LineChartProps) =>{ - return -} \ No newline at end of file +import type { ChartData, ChartOptions } from "chart.js"; + +export const LineGraph = ({ dataSetsProps, min, max }: LineChartProps) => { + const labels = Object.keys(dataSetsProps[0]?.points ?? {}); + + const data: ChartData<"line", number[], string> = { + labels, + datasets: dataSetsProps.map((ds) => ({ + label: ds.name, + data: labels.map((l) => ds.points[l] ?? 0), + borderColor: ds.color ?? "blue", + fill: false, + })), + }; + + const options: ChartOptions<"line"> = { + scales: { + y: { min, max }, + }, + }; + + return ; +}; From 40567f1ac652e2cf057e2d8fc301c304b7371924 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Tue, 3 Feb 2026 12:21:36 +0200 Subject: [PATCH 06/26] Ran - validation processing --- .../src/strategy/generic-line-chart.tsx | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index 9d9a1c7..6e06249 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -26,8 +26,23 @@ ChartJS.register( import type { ChartData, ChartOptions } from "chart.js"; -export const LineGraph = ({ dataSetsProps, min, max }: LineChartProps) => { +const convertDataToValidFormat: ChartData<"line", number[], string> = ({ + dataSetsProps +}: DataSet[] ) => { const labels = Object.keys(dataSetsProps[0]?.points ?? {}); + return { + labels, + datasets: dataSetsProps.map((ds) => ({ + label: ds.name, + data: labels.map((l) => ds.points[l] ?? 0), + borderColor: ds.color ?? "blue", + fill: false, + })) + } +}; + +export const LineGraph = ({ dataSetsProps, min, max }: LineChartProps) => { + const data: ChartData<"line", number[], string> = { labels, From ce71fb19e8b925d50009e0afa227c356b7e918e3 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Tue, 3 Feb 2026 16:58:53 +0200 Subject: [PATCH 07/26] Ran - I think it is completed, but must be tested first --- .../src/strategy/generic-line-chart.tsx | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index 6e06249..c9473ae 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -26,25 +26,12 @@ ChartJS.register( import type { ChartData, ChartOptions } from "chart.js"; -const convertDataToValidFormat: ChartData<"line", number[], string> = ({ - dataSetsProps -}: DataSet[] ) => { +const convertDataToValidFormat = ({ + dataSetsProps, +}: LineChartProps): ChartData<"line", number[], string> => { const labels = Object.keys(dataSetsProps[0]?.points ?? {}); - return { - labels, - datasets: dataSetsProps.map((ds) => ({ - label: ds.name, - data: labels.map((l) => ds.points[l] ?? 0), - borderColor: ds.color ?? "blue", - fill: false, - })) - } -}; - -export const LineGraph = ({ dataSetsProps, min, max }: LineChartProps) => { - - const data: ChartData<"line", number[], string> = { + return { labels, datasets: dataSetsProps.map((ds) => ({ label: ds.name, @@ -53,12 +40,14 @@ export const LineGraph = ({ dataSetsProps, min, max }: LineChartProps) => { fill: false, })), }; +}; +export const LineGraph = ({ dataSetsProps, min, max }: LineChartProps) => { const options: ChartOptions<"line"> = { scales: { y: { min, max }, }, }; - + const data = convertDataToValidFormat({ dataSetsProps }); return ; }; From 474483f1faf80ea53f7ce28dff00c7761809fdb0 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Tue, 3 Feb 2026 17:20:13 +0200 Subject: [PATCH 08/26] Ran - to be fixed --- apps/scouting/frontend/src/main.tsx | 3 ++- .../src/strategy/datasets.ts/test-dataset.ts | 20 ++----------------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index c73dbc4..fafd845 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -7,13 +7,14 @@ import App from "./App"; import { BrowserRouter } from "react-router-dom"; import { Line } from "react-chartjs-2"; import { LineGraph } from "./strategy/generic-line-chart"; +import { scoringTeams } from "./strategy/datasets.ts/test-dataset"; registerSW({ immediate: true }); createRoot(document.getElementById("root")!).render( - + , ); diff --git a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts index 76c61ec..4d22e79 100644 --- a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts +++ b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts @@ -1,19 +1,3 @@ // בס"ד -export const lineChartData = { - labels: [ - "Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday" - ], - datasets: [ - { - label: "Steps", - data: [3000,4000,5000,6000,7000,9000,1000], - borderColor: "red" - } - ] -} \ No newline at end of file +import type { LineChartProps } from "../data-templates-for-charts"; +export const scoringTeams: LineChartProps = {}; From 36c6cfe97408b26060b14507c075437aa3d274f3 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Tue, 3 Feb 2026 19:14:24 +0200 Subject: [PATCH 09/26] Ran - finished with line chart --- apps/scouting/frontend/src/main.tsx | 8 ++++++-- .../src/strategy/data-templates-for-charts.ts | 2 +- .../src/strategy/datasets.ts/test-dataset.ts | 19 +++++++++++++++++-- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index fafd845..8d4d31a 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -7,14 +7,18 @@ import App from "./App"; import { BrowserRouter } from "react-router-dom"; import { Line } from "react-chartjs-2"; import { LineGraph } from "./strategy/generic-line-chart"; -import { scoringTeams } from "./strategy/datasets.ts/test-dataset"; +import { lineChartProps } from "./strategy/datasets.ts/test-dataset"; registerSW({ immediate: true }); createRoot(document.getElementById("root")!).render( - + , ); diff --git a/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts b/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts index 122eae6..42e0634 100644 --- a/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts +++ b/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts @@ -1,5 +1,5 @@ // בס"ד -interface DataSet { +export interface DataSet { name: string; points: Record; color?: string; //assign color if not defined diff --git a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts index 4d22e79..b9bdf2f 100644 --- a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts +++ b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts @@ -1,3 +1,18 @@ // בס"ד -import type { LineChartProps } from "../data-templates-for-charts"; -export const scoringTeams: LineChartProps = {}; +import type { DataSet, LineChartProps } from "../data-templates-for-charts"; + +export const scoring4590: DataSet = { + name: "4590", + points: { + 1: 50, + 2: 30, + 3:40 + }, + color: "green" +}; + +export const lineChartProps: LineChartProps = { + dataSetsProps: [scoring4590], + max: 100, + min: 0 +} \ No newline at end of file From 7e69ef65ea6b4694cc03e78d3d4bef7ce8a29098 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Tue, 3 Feb 2026 19:50:57 +0200 Subject: [PATCH 10/26] Ran - the basics works --- apps/scouting/frontend/src/main.tsx | 17 ++++---- .../src/strategy/generic-line-chart.tsx | 39 +++++++++++++++++-- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index 8d4d31a..2f1bc5e 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -6,19 +6,22 @@ import "./index.css"; import App from "./App"; import { BrowserRouter } from "react-router-dom"; import { Line } from "react-chartjs-2"; -import { LineGraph } from "./strategy/generic-line-chart"; -import { lineChartProps } from "./strategy/datasets.ts/test-dataset"; +import { LineGraph, PieGraph } from "./strategy/generic-line-chart"; +import { + lineChartProps, + scoring4590, +} from "./strategy/datasets.ts/test-dataset"; registerSW({ immediate: true }); createRoot(document.getElementById("root")!).render( - + , ); diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index c9473ae..a72ed93 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -1,5 +1,5 @@ //בס"ד -import { Line } from "react-chartjs-2"; +import { Line, Pie } from "react-chartjs-2"; import { Chart as ChartJS, LineElement, @@ -10,8 +10,8 @@ import { Tooltip, Legend, Filler, + ArcElement, } from "chart.js"; -import type { LineChartProps } from "./data-templates-for-charts"; ChartJS.register( LineElement, @@ -22,11 +22,13 @@ ChartJS.register( Tooltip, Legend, Filler, + ArcElement ); import type { ChartData, ChartOptions } from "chart.js"; +import type { DataSet, LineChartProps } from "./data-templates-for-charts"; -const convertDataToValidFormat = ({ +const convertDataToLineChartFormat = ({ dataSetsProps, }: LineChartProps): ChartData<"line", number[], string> => { const labels = Object.keys(dataSetsProps[0]?.points ?? {}); @@ -48,6 +50,35 @@ export const LineGraph = ({ dataSetsProps, min, max }: LineChartProps) => { y: { min, max }, }, }; - const data = convertDataToValidFormat({ dataSetsProps }); + const data = convertDataToLineChartFormat({ dataSetsProps }); return ; }; + +const convertDataToPieChartFormat = ({ + name, + points, + color, +}: DataSet): ChartData<"pie", number[], string> => { + const labels = Object.keys(points); + const values = Object.values(points); + + return { + labels, + datasets: [ + { + label: name, + data: values, + backgroundColor: labels.map(() => color ?? "blue"), // optional + }, + ], + }; +}; + +export const PieGraph = ({ name, points, color }: DataSet) => { + const data = convertDataToPieChartFormat({ name, points, color }); + const options: ChartOptions<"pie"> = { + responsive: true, + maintainAspectRatio: false, +}; + return ; +}; From 8d7a055ca4ad4c915662ca8da3f29ded81095260 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Tue, 3 Feb 2026 19:54:54 +0200 Subject: [PATCH 11/26] Ran - better tested --- apps/scouting/frontend/src/main.tsx | 8 +++--- .../src/strategy/datasets.ts/test-dataset.ts | 26 +++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index 2f1bc5e..23f52a9 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -9,7 +9,7 @@ import { Line } from "react-chartjs-2"; import { LineGraph, PieGraph } from "./strategy/generic-line-chart"; import { lineChartProps, - scoring4590, + scoringQual1, } from "./strategy/datasets.ts/test-dataset"; registerSW({ immediate: true }); @@ -18,9 +18,9 @@ createRoot(document.getElementById("root")!).render( , diff --git a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts index b9bdf2f..3936a8d 100644 --- a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts +++ b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts @@ -1,18 +1,18 @@ // בס"ד import type { DataSet, LineChartProps } from "../data-templates-for-charts"; -export const scoring4590: DataSet = { - name: "4590", - points: { - 1: 50, - 2: 30, - 3:40 - }, - color: "green" +export const scoringQual1: DataSet = { + name: "scoringQual1", + points: { + "GreenBlitz 4590": 50, + "Orbit 1690": 30, + "Makers Assenble 5951": 40 + }, + color: "green", }; -export const lineChartProps: LineChartProps = { - dataSetsProps: [scoring4590], - max: 100, - min: 0 -} \ No newline at end of file +export const lineChartProps: LineChartProps = { + dataSetsProps: [scoringQual1], + max: 100, + min: 0, +}; From ab5f16de4dbf47fecf1745df120da9b39f83bf25 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Tue, 3 Feb 2026 19:55:36 +0200 Subject: [PATCH 12/26] Ran - linting shit --- apps/scouting/frontend/src/main.tsx | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index 23f52a9..278c6c7 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -3,14 +3,9 @@ import { StrictMode } from "react"; import { createRoot } from "react-dom/client"; import { registerSW } from "virtual:pwa-register"; import "./index.css"; -import App from "./App"; import { BrowserRouter } from "react-router-dom"; -import { Line } from "react-chartjs-2"; -import { LineGraph, PieGraph } from "./strategy/generic-line-chart"; -import { - lineChartProps, - scoringQual1, -} from "./strategy/datasets.ts/test-dataset"; +import { PieGraph } from "./strategy/generic-line-chart"; +import { scoringQual1 } from "./strategy/datasets.ts/test-dataset"; registerSW({ immediate: true }); From d3c19b3efb8c393f9987cb2edcbe2fa08e917cf7 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Tue, 3 Feb 2026 20:06:40 +0200 Subject: [PATCH 13/26] Ran - almost PRed --- apps/scouting/frontend/src/main.tsx | 2 +- .../src/strategy/generic-line-chart.tsx | 35 +---------- .../src/strategy/generic-pie-chart.tsx | 58 +++++++++++++++++++ 3 files changed, 62 insertions(+), 33 deletions(-) create mode 100644 apps/scouting/frontend/src/strategy/generic-pie-chart.tsx diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index 278c6c7..f748788 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -4,7 +4,7 @@ import { createRoot } from "react-dom/client"; import { registerSW } from "virtual:pwa-register"; import "./index.css"; import { BrowserRouter } from "react-router-dom"; -import { PieGraph } from "./strategy/generic-line-chart"; +import { PieGraph } from "./strategy/generic-pie-chart"; import { scoringQual1 } from "./strategy/datasets.ts/test-dataset"; registerSW({ immediate: true }); diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index a72ed93..98873e1 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -1,5 +1,5 @@ //בס"ד -import { Line, Pie } from "react-chartjs-2"; +import { Line } from "react-chartjs-2"; import { Chart as ChartJS, LineElement, @@ -22,11 +22,11 @@ ChartJS.register( Tooltip, Legend, Filler, - ArcElement + ArcElement, ); import type { ChartData, ChartOptions } from "chart.js"; -import type { DataSet, LineChartProps } from "./data-templates-for-charts"; +import type { LineChartProps } from "./data-templates-for-charts"; const convertDataToLineChartFormat = ({ dataSetsProps, @@ -53,32 +53,3 @@ export const LineGraph = ({ dataSetsProps, min, max }: LineChartProps) => { const data = convertDataToLineChartFormat({ dataSetsProps }); return ; }; - -const convertDataToPieChartFormat = ({ - name, - points, - color, -}: DataSet): ChartData<"pie", number[], string> => { - const labels = Object.keys(points); - const values = Object.values(points); - - return { - labels, - datasets: [ - { - label: name, - data: values, - backgroundColor: labels.map(() => color ?? "blue"), // optional - }, - ], - }; -}; - -export const PieGraph = ({ name, points, color }: DataSet) => { - const data = convertDataToPieChartFormat({ name, points, color }); - const options: ChartOptions<"pie"> = { - responsive: true, - maintainAspectRatio: false, -}; - return ; -}; diff --git a/apps/scouting/frontend/src/strategy/generic-pie-chart.tsx b/apps/scouting/frontend/src/strategy/generic-pie-chart.tsx new file mode 100644 index 0000000..dfb0640 --- /dev/null +++ b/apps/scouting/frontend/src/strategy/generic-pie-chart.tsx @@ -0,0 +1,58 @@ +//בס"ד +import { Pie } from "react-chartjs-2"; +import { + Chart as ChartJS, + LineElement, + PointElement, + LinearScale, + CategoryScale, + Title, + Tooltip, + Legend, + Filler, + ArcElement, +} from "chart.js"; + +ChartJS.register( + LineElement, + PointElement, + LinearScale, + CategoryScale, + Title, + Tooltip, + Legend, + Filler, + ArcElement +); + +import type { ChartData, ChartOptions } from "chart.js"; +import type { DataSet } from "./data-templates-for-charts"; + +const convertDataToPieChartFormat = ({ + name, + points, + color, +}: DataSet): ChartData<"pie", number[], string> => { + const labels = Object.keys(points); + const values = Object.values(points); + + return { + labels, + datasets: [ + { + label: name, + data: values, + backgroundColor: labels.map(() => color ?? "blue"), // optional + }, + ], + }; +}; + +export const PieGraph = ({ name, points, color }: DataSet) => { + const data = convertDataToPieChartFormat({ name, points, color }); + const options: ChartOptions<"pie"> = { + responsive: true, + maintainAspectRatio: false, +}; + return ; +}; From b4b4867e6637688d79f128eacbfb1048acc9cb43 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Tue, 3 Feb 2026 20:21:45 +0200 Subject: [PATCH 14/26] Ran - cleaning the code --- .../frontend/src/strategy/generic-line-chart.tsx | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index 98873e1..272c288 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -31,14 +31,16 @@ import type { LineChartProps } from "./data-templates-for-charts"; const convertDataToLineChartFormat = ({ dataSetsProps, }: LineChartProps): ChartData<"line", number[], string> => { - const labels = Object.keys(dataSetsProps[0]?.points ?? {}); + const pointDefaultValue = 0; + + const labels = Object.keys(dataSetsProps[0]?.points ?? {}); return { labels, - datasets: dataSetsProps.map((ds) => ({ - label: ds.name, - data: labels.map((l) => ds.points[l] ?? 0), - borderColor: ds.color ?? "blue", + datasets: dataSetsProps.map((dataset) => ({ + label: dataset.name, + data: labels.map((label) => dataset.points[label] ?? pointDefaultValue), + borderColor: dataset.color ?? "blue", fill: false, })), }; From 1eabcf2a06989f3bb12c01d1f03b3c6874567a51 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Wed, 4 Feb 2026 16:43:05 +0200 Subject: [PATCH 15/26] Ran - hopefully works --- .../scouting/frontend/src/strategy/generic-line-chart.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index 272c288..bc31b08 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -31,15 +31,15 @@ import type { LineChartProps } from "./data-templates-for-charts"; const convertDataToLineChartFormat = ({ dataSetsProps, }: LineChartProps): ChartData<"line", number[], string> => { - const pointDefaultValue = 0; - + const labels = Array.from( + new Set(dataSetsProps.flatMap((ds) => Object.keys(ds.points))), + ); - const labels = Object.keys(dataSetsProps[0]?.points ?? {}); return { labels, datasets: dataSetsProps.map((dataset) => ({ label: dataset.name, - data: labels.map((label) => dataset.points[label] ?? pointDefaultValue), + data: labels.map((label) => dataset.points[label] ?? null), // 👈 gap, not fake zero borderColor: dataset.color ?? "blue", fill: false, })), From c19d8b2198d9012515b0fe16501e44a96f76436c Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Wed, 4 Feb 2026 16:49:11 +0200 Subject: [PATCH 16/26] Ran - added tests --- apps/scouting/frontend/src/main.tsx | 8 +++---- .../src/strategy/datasets.ts/test-dataset.ts | 22 ++++++++++++++----- .../src/strategy/generic-line-chart.tsx | 3 +-- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index f748788..bd6ac3c 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -5,7 +5,7 @@ import { registerSW } from "virtual:pwa-register"; import "./index.css"; import { BrowserRouter } from "react-router-dom"; import { PieGraph } from "./strategy/generic-pie-chart"; -import { scoringQual1 } from "./strategy/datasets.ts/test-dataset"; +import { greenBlitzQuals } from "./strategy/datasets.ts/test-dataset"; registerSW({ immediate: true }); @@ -13,9 +13,9 @@ createRoot(document.getElementById("root")!).render( , diff --git a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts index 3936a8d..01e67d5 100644 --- a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts +++ b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts @@ -1,18 +1,28 @@ // בס"ד import type { DataSet, LineChartProps } from "../data-templates-for-charts"; -export const scoringQual1: DataSet = { - name: "scoringQual1", +export const greenBlitzQuals: DataSet = { + name: "greenBlitzQuals", points: { - "GreenBlitz 4590": 50, - "Orbit 1690": 30, - "Makers Assenble 5951": 40 + 1: 50, + 2: 30, + 3: 40, + }, + color: "green", +}; + +export const maQuals: DataSet = { + name: "maQuals", + points: { + 1: 10, + 3: 60, + 5: 20, }, color: "green", }; export const lineChartProps: LineChartProps = { - dataSetsProps: [scoringQual1], + dataSetsProps: [greenBlitzQuals, maQuals], max: 100, min: 0, }; diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index bc31b08..d31fd98 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -39,9 +39,8 @@ const convertDataToLineChartFormat = ({ labels, datasets: dataSetsProps.map((dataset) => ({ label: dataset.name, - data: labels.map((label) => dataset.points[label] ?? null), // 👈 gap, not fake zero + data: labels.map((label) => dataset.points[label] ?? null), borderColor: dataset.color ?? "blue", - fill: false, })), }; }; From 066131f1ac04e3d7782b6f37fc31458bc1130944 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Wed, 4 Feb 2026 16:55:17 +0200 Subject: [PATCH 17/26] Ran - must improve overlap --- apps/scouting/frontend/src/main.tsx | 16 ++++++++++------ .../src/strategy/datasets.ts/test-dataset.ts | 6 +++++- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index bd6ac3c..f9bab39 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -5,18 +5,22 @@ import { registerSW } from "virtual:pwa-register"; import "./index.css"; import { BrowserRouter } from "react-router-dom"; import { PieGraph } from "./strategy/generic-pie-chart"; -import { greenBlitzQuals } from "./strategy/datasets.ts/test-dataset"; +import { + greenBlitzQuals, + lineChartProps, +} from "./strategy/datasets.ts/test-dataset"; +import { LineGraph } from "./strategy/generic-line-chart"; registerSW({ immediate: true }); createRoot(document.getElementById("root")!).render( - + , ); diff --git a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts index 01e67d5..a6518d8 100644 --- a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts +++ b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts @@ -7,6 +7,8 @@ export const greenBlitzQuals: DataSet = { 1: 50, 2: 30, 3: 40, + 6: 90, + 7: 32 }, color: "green", }; @@ -15,10 +17,12 @@ export const maQuals: DataSet = { name: "maQuals", points: { 1: 10, + 2: 20, 3: 60, + 4: 80, 5: 20, }, - color: "green", + color: "red", }; export const lineChartProps: LineChartProps = { From 32a7f61b635893a576a912784b54fe71f0a4ee34 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Wed, 4 Feb 2026 17:04:56 +0200 Subject: [PATCH 18/26] Ran - works --- .../frontend/src/strategy/datasets.ts/test-dataset.ts | 4 ++-- apps/scouting/frontend/src/strategy/generic-line-chart.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts index a6518d8..638ad5b 100644 --- a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts +++ b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts @@ -7,8 +7,8 @@ export const greenBlitzQuals: DataSet = { 1: 50, 2: 30, 3: 40, - 6: 90, - 7: 32 + 6: 33, + 9:22 }, color: "green", }; diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index d31fd98..e1ee322 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -33,7 +33,7 @@ const convertDataToLineChartFormat = ({ }: LineChartProps): ChartData<"line", number[], string> => { const labels = Array.from( new Set(dataSetsProps.flatMap((ds) => Object.keys(ds.points))), - ); + ).sort((a, b) => Number(a) - Number(b)); return { labels, From c0677363265d6afe6cd34f3e5c981387a07d6108 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Wed, 4 Feb 2026 17:12:42 +0200 Subject: [PATCH 19/26] Ran - linting --- apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts index 638ad5b..fa921ce 100644 --- a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts +++ b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts @@ -8,7 +8,7 @@ export const greenBlitzQuals: DataSet = { 2: 30, 3: 40, 6: 33, - 9:22 + 9: 22, }, color: "green", }; From 09743f77868217efe61ca49e2619b55a1ba0d93e Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Wed, 4 Feb 2026 17:28:21 +0200 Subject: [PATCH 20/26] moved lineChartProps to the designated commponent --- .../frontend/src/strategy/data-templates-for-charts.ts | 6 +----- .../frontend/src/strategy/datasets.ts/test-dataset.ts | 3 ++- apps/scouting/frontend/src/strategy/generic-line-chart.tsx | 7 ++++++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts b/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts index 42e0634..272d4f1 100644 --- a/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts +++ b/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts @@ -5,8 +5,4 @@ export interface DataSet { color?: string; //assign color if not defined } -export interface LineChartProps { - dataSetsProps: DataSet[]; - max?: number; - min?: number; -} + diff --git a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts index fa921ce..978134a 100644 --- a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts +++ b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts @@ -1,5 +1,6 @@ // בס"ד -import type { DataSet, LineChartProps } from "../data-templates-for-charts"; +import type { DataSet } from "../data-templates-for-charts"; +import type { LineChartProps } from "../generic-line-chart"; export const greenBlitzQuals: DataSet = { name: "greenBlitzQuals", diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index e1ee322..e5b522b 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -26,8 +26,13 @@ ChartJS.register( ); import type { ChartData, ChartOptions } from "chart.js"; -import type { LineChartProps } from "./data-templates-for-charts"; +import type { DataSet } from "./data-templates-for-charts"; +export interface LineChartProps { + dataSetsProps: DataSet[]; + max?: number; + min?: number; +} const convertDataToLineChartFormat = ({ dataSetsProps, }: LineChartProps): ChartData<"line", number[], string> => { From 5fcfc8dc32fb7f4cdea14ff70a6fc5be1d2b2af3 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Wed, 4 Feb 2026 17:30:11 +0200 Subject: [PATCH 21/26] Ran - half of Yoni's CR --- ...templates-for-charts.ts => dataset-template.ts} | 0 .../src/strategy/datasets.ts/test-dataset.ts | 2 +- .../frontend/src/strategy/generic-line-chart.tsx | 6 +++--- .../frontend/src/strategy/generic-pie-chart.tsx | 14 +++++++------- 4 files changed, 11 insertions(+), 11 deletions(-) rename apps/scouting/frontend/src/strategy/{data-templates-for-charts.ts => dataset-template.ts} (100%) diff --git a/apps/scouting/frontend/src/strategy/data-templates-for-charts.ts b/apps/scouting/frontend/src/strategy/dataset-template.ts similarity index 100% rename from apps/scouting/frontend/src/strategy/data-templates-for-charts.ts rename to apps/scouting/frontend/src/strategy/dataset-template.ts diff --git a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts index 978134a..f9f494e 100644 --- a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts +++ b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts @@ -1,5 +1,5 @@ // בס"ד -import type { DataSet } from "../data-templates-for-charts"; +import type { DataSet } from "../dataset-template"; import type { LineChartProps } from "../generic-line-chart"; export const greenBlitzQuals: DataSet = { diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx index e5b522b..7702844 100644 --- a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-line-chart.tsx @@ -13,6 +13,9 @@ import { ArcElement, } from "chart.js"; +import type { ChartData, ChartOptions } from "chart.js"; +import type { DataSet } from "./dataset-template"; + ChartJS.register( LineElement, PointElement, @@ -25,9 +28,6 @@ ChartJS.register( ArcElement, ); -import type { ChartData, ChartOptions } from "chart.js"; -import type { DataSet } from "./data-templates-for-charts"; - export interface LineChartProps { dataSetsProps: DataSet[]; max?: number; diff --git a/apps/scouting/frontend/src/strategy/generic-pie-chart.tsx b/apps/scouting/frontend/src/strategy/generic-pie-chart.tsx index dfb0640..818ee81 100644 --- a/apps/scouting/frontend/src/strategy/generic-pie-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-pie-chart.tsx @@ -13,6 +13,9 @@ import { ArcElement, } from "chart.js"; +import type { ChartData, ChartOptions } from "chart.js"; +import type { DataSet } from "./dataset-template"; + ChartJS.register( LineElement, PointElement, @@ -22,12 +25,9 @@ ChartJS.register( Tooltip, Legend, Filler, - ArcElement + ArcElement, ); -import type { ChartData, ChartOptions } from "chart.js"; -import type { DataSet } from "./data-templates-for-charts"; - const convertDataToPieChartFormat = ({ name, points, @@ -51,8 +51,8 @@ const convertDataToPieChartFormat = ({ export const PieGraph = ({ name, points, color }: DataSet) => { const data = convertDataToPieChartFormat({ name, points, color }); const options: ChartOptions<"pie"> = { - responsive: true, - maintainAspectRatio: false, -}; + responsive: true, + maintainAspectRatio: false, + }; return ; }; From 7e9b0bbb0ce414aeb3f43de08d611735add02027 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Wed, 4 Feb 2026 17:35:01 +0200 Subject: [PATCH 22/26] Ran - Yoni's CR --- apps/scouting/frontend/src/main.tsx | 7 ++----- apps/scouting/frontend/src/strategy/generic-pie-chart.tsx | 4 +++- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index f9bab39..dbd91bc 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -10,17 +10,14 @@ import { lineChartProps, } from "./strategy/datasets.ts/test-dataset"; import { LineGraph } from "./strategy/generic-line-chart"; +import App from "./App"; registerSW({ immediate: true }); createRoot(document.getElementById("root")!).render( - + , ); diff --git a/apps/scouting/frontend/src/strategy/generic-pie-chart.tsx b/apps/scouting/frontend/src/strategy/generic-pie-chart.tsx index 818ee81..c9ba5ff 100644 --- a/apps/scouting/frontend/src/strategy/generic-pie-chart.tsx +++ b/apps/scouting/frontend/src/strategy/generic-pie-chart.tsx @@ -33,6 +33,8 @@ const convertDataToPieChartFormat = ({ points, color, }: DataSet): ChartData<"pie", number[], string> => { + const defaultColor = "red"; + const labels = Object.keys(points); const values = Object.values(points); @@ -42,7 +44,7 @@ const convertDataToPieChartFormat = ({ { label: name, data: values, - backgroundColor: labels.map(() => color ?? "blue"), // optional + backgroundColor: labels.map(() => color ?? defaultColor), }, ], }; From 735f248ef9e6939b2e9383c333c12091cea56833 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Wed, 4 Feb 2026 17:35:53 +0200 Subject: [PATCH 23/26] Ran - renaming --- apps/scouting/frontend/src/main.tsx | 4 ++-- .../src/strategy/{generic-line-chart.tsx => LineChart.tsx} | 0 .../src/strategy/{generic-pie-chart.tsx => PieChart.tsx} | 0 .../frontend/src/strategy/datasets.ts/test-dataset.ts | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename apps/scouting/frontend/src/strategy/{generic-line-chart.tsx => LineChart.tsx} (100%) rename apps/scouting/frontend/src/strategy/{generic-pie-chart.tsx => PieChart.tsx} (100%) diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index dbd91bc..53bb474 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -4,12 +4,12 @@ import { createRoot } from "react-dom/client"; import { registerSW } from "virtual:pwa-register"; import "./index.css"; import { BrowserRouter } from "react-router-dom"; -import { PieGraph } from "./strategy/generic-pie-chart"; +import { PieGraph } from "./strategy/PieChart"; import { greenBlitzQuals, lineChartProps, } from "./strategy/datasets.ts/test-dataset"; -import { LineGraph } from "./strategy/generic-line-chart"; +import { LineGraph } from "./strategy/LineChart"; import App from "./App"; registerSW({ immediate: true }); diff --git a/apps/scouting/frontend/src/strategy/generic-line-chart.tsx b/apps/scouting/frontend/src/strategy/LineChart.tsx similarity index 100% rename from apps/scouting/frontend/src/strategy/generic-line-chart.tsx rename to apps/scouting/frontend/src/strategy/LineChart.tsx diff --git a/apps/scouting/frontend/src/strategy/generic-pie-chart.tsx b/apps/scouting/frontend/src/strategy/PieChart.tsx similarity index 100% rename from apps/scouting/frontend/src/strategy/generic-pie-chart.tsx rename to apps/scouting/frontend/src/strategy/PieChart.tsx diff --git a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts index f9f494e..71b64ae 100644 --- a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts +++ b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts @@ -1,6 +1,6 @@ // בס"ד import type { DataSet } from "../dataset-template"; -import type { LineChartProps } from "../generic-line-chart"; +import type { LineChartProps } from "../LineChart"; export const greenBlitzQuals: DataSet = { name: "greenBlitzQuals", From 312ebcca7e2876cf8de2897bd6bae0f8caa01a58 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Wed, 4 Feb 2026 17:40:52 +0200 Subject: [PATCH 24/26] Removed file for testing --- apps/scouting/frontend/src/main.tsx | 6 ---- .../frontend/src/strategy/LineChart.tsx | 4 ++- .../src/strategy/datasets.ts/test-dataset.ts | 33 ------------------- 3 files changed, 3 insertions(+), 40 deletions(-) delete mode 100644 apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts diff --git a/apps/scouting/frontend/src/main.tsx b/apps/scouting/frontend/src/main.tsx index 53bb474..65fea39 100644 --- a/apps/scouting/frontend/src/main.tsx +++ b/apps/scouting/frontend/src/main.tsx @@ -4,12 +4,6 @@ import { createRoot } from "react-dom/client"; import { registerSW } from "virtual:pwa-register"; import "./index.css"; import { BrowserRouter } from "react-router-dom"; -import { PieGraph } from "./strategy/PieChart"; -import { - greenBlitzQuals, - lineChartProps, -} from "./strategy/datasets.ts/test-dataset"; -import { LineGraph } from "./strategy/LineChart"; import App from "./App"; registerSW({ immediate: true }); diff --git a/apps/scouting/frontend/src/strategy/LineChart.tsx b/apps/scouting/frontend/src/strategy/LineChart.tsx index 7702844..a4b1084 100644 --- a/apps/scouting/frontend/src/strategy/LineChart.tsx +++ b/apps/scouting/frontend/src/strategy/LineChart.tsx @@ -36,6 +36,8 @@ export interface LineChartProps { const convertDataToLineChartFormat = ({ dataSetsProps, }: LineChartProps): ChartData<"line", number[], string> => { + const defaultColor = "red"; + const labels = Array.from( new Set(dataSetsProps.flatMap((ds) => Object.keys(ds.points))), ).sort((a, b) => Number(a) - Number(b)); @@ -45,7 +47,7 @@ const convertDataToLineChartFormat = ({ datasets: dataSetsProps.map((dataset) => ({ label: dataset.name, data: labels.map((label) => dataset.points[label] ?? null), - borderColor: dataset.color ?? "blue", + borderColor: dataset.color ?? defaultColor, })), }; }; diff --git a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts b/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts deleted file mode 100644 index 71b64ae..0000000 --- a/apps/scouting/frontend/src/strategy/datasets.ts/test-dataset.ts +++ /dev/null @@ -1,33 +0,0 @@ -// בס"ד -import type { DataSet } from "../dataset-template"; -import type { LineChartProps } from "../LineChart"; - -export const greenBlitzQuals: DataSet = { - name: "greenBlitzQuals", - points: { - 1: 50, - 2: 30, - 3: 40, - 6: 33, - 9: 22, - }, - color: "green", -}; - -export const maQuals: DataSet = { - name: "maQuals", - points: { - 1: 10, - 2: 20, - 3: 60, - 4: 80, - 5: 20, - }, - color: "red", -}; - -export const lineChartProps: LineChartProps = { - dataSetsProps: [greenBlitzQuals, maQuals], - max: 100, - min: 0, -}; From b385209e456d27ef7bbfa0aa03afba70138dbde8 Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Wed, 4 Feb 2026 17:43:56 +0200 Subject: [PATCH 25/26] Ran - renamed a file --- .../src/strategy/{dataset-template.ts => DatasetTemplate.ts} | 0 apps/scouting/frontend/src/strategy/LineChart.tsx | 2 +- apps/scouting/frontend/src/strategy/PieChart.tsx | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename apps/scouting/frontend/src/strategy/{dataset-template.ts => DatasetTemplate.ts} (100%) diff --git a/apps/scouting/frontend/src/strategy/dataset-template.ts b/apps/scouting/frontend/src/strategy/DatasetTemplate.ts similarity index 100% rename from apps/scouting/frontend/src/strategy/dataset-template.ts rename to apps/scouting/frontend/src/strategy/DatasetTemplate.ts diff --git a/apps/scouting/frontend/src/strategy/LineChart.tsx b/apps/scouting/frontend/src/strategy/LineChart.tsx index a4b1084..a190a2a 100644 --- a/apps/scouting/frontend/src/strategy/LineChart.tsx +++ b/apps/scouting/frontend/src/strategy/LineChart.tsx @@ -14,7 +14,7 @@ import { } from "chart.js"; import type { ChartData, ChartOptions } from "chart.js"; -import type { DataSet } from "./dataset-template"; +import type { DataSet } from "./DatasetTemplate"; ChartJS.register( LineElement, diff --git a/apps/scouting/frontend/src/strategy/PieChart.tsx b/apps/scouting/frontend/src/strategy/PieChart.tsx index c9ba5ff..bf9b4af 100644 --- a/apps/scouting/frontend/src/strategy/PieChart.tsx +++ b/apps/scouting/frontend/src/strategy/PieChart.tsx @@ -14,7 +14,7 @@ import { } from "chart.js"; import type { ChartData, ChartOptions } from "chart.js"; -import type { DataSet } from "./dataset-template"; +import type { DataSet } from "./DatasetTemplate"; ChartJS.register( LineElement, From 19c4d31b555ca8e58c78ae18295cb8e2fe11b71a Mon Sep 17 00:00:00 2001 From: RJ0907 Date: Wed, 4 Feb 2026 17:49:26 +0200 Subject: [PATCH 26/26] Ran - added the color picker for the pie chart --- apps/scouting/frontend/src/strategy/LineChart.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/scouting/frontend/src/strategy/LineChart.tsx b/apps/scouting/frontend/src/strategy/LineChart.tsx index a190a2a..89ba8d3 100644 --- a/apps/scouting/frontend/src/strategy/LineChart.tsx +++ b/apps/scouting/frontend/src/strategy/LineChart.tsx @@ -36,7 +36,7 @@ export interface LineChartProps { const convertDataToLineChartFormat = ({ dataSetsProps, }: LineChartProps): ChartData<"line", number[], string> => { - const defaultColor = "red"; + const defaultColors = ["blue", "red", "violet", "orange"]; const labels = Array.from( new Set(dataSetsProps.flatMap((ds) => Object.keys(ds.points))), @@ -44,10 +44,10 @@ const convertDataToLineChartFormat = ({ return { labels, - datasets: dataSetsProps.map((dataset) => ({ + datasets: dataSetsProps.map((dataset, index) => ({ label: dataset.name, data: labels.map((label) => dataset.points[label] ?? null), - borderColor: dataset.color ?? defaultColor, + borderColor: dataset.color ?? defaultColors[index % defaultColors.length], })), }; };