From cd4c82c4c61c2e1579780028b419ac744cfc66ef Mon Sep 17 00:00:00 2001 From: OlekTopalDev Date: Mon, 22 Apr 2024 05:45:07 -0400 Subject: [PATCH] Olek first commit --- package-lock.json | 106 +++++--------- package.json | 1 + src/assets/dial_bg.png | Bin 0 -> 25743 bytes src/components/Results/EnergyScore/arc.jsx | 131 ++++++++++++++++++ .../Results/EnergyScore/energyscore.jsx | 8 +- src/components/Results/EnergyScore/needle.jsx | 72 ++++++++++ .../Results/EnergyScore/scorering.jsx | 82 +++++------ 7 files changed, 281 insertions(+), 119 deletions(-) create mode 100644 src/assets/dial_bg.png create mode 100644 src/components/Results/EnergyScore/arc.jsx create mode 100644 src/components/Results/EnergyScore/needle.jsx diff --git a/package-lock.json b/package-lock.json index 8c455ff..7625101 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "babel-plugin-react-css-modules": "^5.2.6", + "file-loader": "^6.2.0", "html2canvas": "^1.4.1", "ionicons": "^7.3.0", "jspdf": "^2.5.1", @@ -2743,7 +2744,6 @@ "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -3541,7 +3541,6 @@ "version": "8.56.2", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", - "dev": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -3551,7 +3550,6 @@ "version": "3.7.7", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -3560,8 +3558,7 @@ "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" }, "node_modules/@types/express": { "version": "4.17.21", @@ -3868,8 +3865,7 @@ "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/mime": { "version": "1.3.5", @@ -4163,7 +4159,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -4172,26 +4167,22 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -4201,14 +4192,12 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -4220,7 +4209,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -4229,7 +4217,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -4237,14 +4224,12 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -4260,7 +4245,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", @@ -4273,7 +4257,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-buffer": "1.11.6", @@ -4285,7 +4268,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -4299,7 +4281,6 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" @@ -4352,14 +4333,12 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/accepts": { "version": "1.3.8", @@ -4378,7 +4357,6 @@ "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -4390,7 +4368,6 @@ "version": "1.9.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, "peerDependencies": { "acorn": "^8" } @@ -5130,8 +5107,7 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/bytes": { "version": "3.0.0", @@ -5278,7 +5254,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, "engines": { "node": ">=6.0" } @@ -6232,7 +6207,6 @@ "version": "5.15.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -6392,8 +6366,7 @@ "node_modules/es-module-lexer": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==" }, "node_modules/es-set-tostringtag": { "version": "2.0.2", @@ -6873,7 +6846,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -6885,7 +6857,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "engines": { "node": ">=4.0" } @@ -6917,7 +6888,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, "engines": { "node": ">=0.8.x" } @@ -7112,6 +7082,25 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -7565,8 +7554,7 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/globals": { "version": "11.12.0", @@ -8584,7 +8572,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -8598,7 +8585,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -8607,7 +8593,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8977,7 +8962,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, "engines": { "node": ">=6.11.5" } @@ -8986,7 +8970,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -9242,8 +9225,7 @@ "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", @@ -9291,7 +9273,6 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -9300,7 +9281,6 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -9410,8 +9390,7 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/no-case": { "version": "3.0.4", @@ -10345,7 +10324,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -10878,7 +10856,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -10929,7 +10906,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -11044,7 +11020,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -11298,7 +11273,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -11308,7 +11282,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -11639,7 +11612,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -11648,7 +11620,6 @@ "version": "5.27.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", - "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -11666,7 +11637,6 @@ "version": "5.3.10", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", @@ -11699,8 +11669,7 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/text-segmentation": { "version": "1.0.3", @@ -12090,7 +12059,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -12112,7 +12080,6 @@ "version": "5.90.1", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.1.tgz", "integrity": "sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==", - "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", @@ -12436,7 +12403,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, "engines": { "node": ">=10.13.0" } @@ -12445,7 +12411,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -12458,7 +12423,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, "engines": { "node": ">=4.0" } diff --git a/package.json b/package.json index ed00d68..4ee2639 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "babel-plugin-react-css-modules": "^5.2.6", + "file-loader": "^6.2.0", "html2canvas": "^1.4.1", "ionicons": "^7.3.0", "jspdf": "^2.5.1", diff --git a/src/assets/dial_bg.png b/src/assets/dial_bg.png new file mode 100644 index 0000000000000000000000000000000000000000..aa62a3b602c09e2bebf3b29017a3ae73452e66ee GIT binary patch literal 25743 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 { + const maxScore = 100; + const scorePerArc = maxScore / 3; + const arcPathsRef = useRef([]); + const [circleInfo, setCircleInfo] = useState({ x: 0, y: 0, color: '#fff' }); + const [center, setCenter] = useState({ x: 0, y: 0 }); + const [circleRadius, setCircleRadius] = useState(0); + + const gradientColors = { + gradient1: "#F27374", + gradient2: "#FFA685", + gradient3: "#4892A7" + }; + + const arcsInfo = [ + { startAngle: 230, endAngle: 310, gradientId: "gradient1" }, + { startAngle: 320, endAngle: 400, gradientId: "gradient2" }, + { startAngle: 50, endAngle: 130, gradientId: "gradient3" } + ]; + + const scoreToAngle = (arcScore, arcIndex) => { + const arcLength = arcsInfo[arcIndex].endAngle - arcsInfo[arcIndex].startAngle; + return arcsInfo[arcIndex].startAngle + (arcScore / scorePerArc) * arcLength; + }; + + const describeArc = (radius, startAngle, endAngle) => { + const start = polarToCartesian(center.x, center.y, radius, startAngle); + const end = polarToCartesian(center.x, center.y, radius, endAngle); + const largeArcFlag = endAngle - startAngle <= 180 ? '0' : '1'; + + return [ + 'M', start.x, start.y, + 'A', radius, radius, 0, largeArcFlag, 1, end.x, end.y + ].join(' '); + }; + + const calculateScores = (totalScore) => { + let remainingScore = totalScore; + return arcsInfo.map((_, index) => { + if (remainingScore > scorePerArc) { + remainingScore -= scorePerArc; + return scorePerArc; + } else { + const scoreForArc = remainingScore; + remainingScore = 0; + return scoreForArc; + } + }); + }; + + useEffect(() => { + setCenter({ x: width / 2, y: height / 2 }); + setCircleRadius(0.95 * Math.min(width, height) / 2 - 1); + }, [score, width, height]); + + useEffect(() => { + const scores = calculateScores(score); + const scoresToArr = scores.filter(score => score > 0); + scoresToArr.forEach((score, index) => { + const pathElement = arcPathsRef.current[index]; + if (pathElement && score > 0) { + const endAngle = scoreToAngle(score, index); + const arcPath = describeArc(circleRadius, arcsInfo[index].startAngle, endAngle); + pathElement.setAttribute('d', arcPath); + + if (index === scoresToArr.length - 1) { + const { x, y } = polarToCartesian(center.x, center.y, circleRadius, endAngle); + setCircleInfo({ x: x - 12, y: y - 12, color: gradientColors[arcsInfo[index].gradientId] }); + } + } + }); + }, [center, circleRadius, score]); + + return ( +
+
+ + + + + + + + + + + + + + + + + {arcsInfo.map((arc, index) => ( + (arcPathsRef.current[index] = el)} + fill="none" + stroke={`url(#${arc.gradientId})`} + strokeWidth="8" + strokeLinecap="round" + /> + ))} + +
+ + + +
+
+
+ ) +} + +const polarToCartesian = (centerX, centerY, radius, angleInDegrees) => { + const angleInRadians = ((angleInDegrees - 90) * Math.PI) / 180.0; + return { + x: centerX + radius * Math.cos(angleInRadians), + y: centerY + radius * Math.sin(angleInRadians), + }; +}; + +export default Arc; \ No newline at end of file diff --git a/src/components/Results/EnergyScore/energyscore.jsx b/src/components/Results/EnergyScore/energyscore.jsx index ce12afd..285ab40 100644 --- a/src/components/Results/EnergyScore/energyscore.jsx +++ b/src/components/Results/EnergyScore/energyscore.jsx @@ -23,18 +23,18 @@ const EnergyScore = (props) => { display: 'flex', alignItems: 'center', justifyContent: 'space-between', - backgroundColor: '#f5f5f5', + backgroundColor: '#f2f0f1', borderRadius: '100px', padding: '10px 20px', height: '200px', margin: '20px' }} > -
+
-

Score is based on the estimated CO2 emissions of your home

+
Score is based on the estimated CO2 emissions of your home
@@ -43,7 +43,7 @@ const EnergyScore = (props) => { score={score} details={props.details} /> - { + const needleRef = useRef(null); + const [angle, setAngle] = useState(150); + const [score, setScore] = useState(0); + const [radius, setRadius] = useState(0); + const [center, setCenter] = useState({ x: 0, y: 0 }); + const startAngle = 140; + + const calculateEndAngle = (score) => { + const effectiveScore = Math.min(100, Math.max(0, score)); + let rawEndAngle; + if (effectiveScore <= 33) { + rawEndAngle = startAngle + effectiveScore / 33 * 80; + } else if (effectiveScore <= 66) { + rawEndAngle = startAngle + 90 + (effectiveScore - 33) / 33 * 80; + } else { + rawEndAngle = startAngle + 180 + (effectiveScore - 66) / 33 * 80 + } + return rawEndAngle; + }; + + const endAngle = calculateEndAngle(desiredScore); + + const calculatePosition = (angle) => { + const x = center.x + radius * Math.cos(angle * Math.PI / 180); + const y = center.y + radius * Math.sin(angle * Math.PI / 180); + return { x, y }; + }; + + const calculateRotation = (angle) => { + return angle + 90; + }; + + useEffect(() => { + setAngle(endAngle); + setScore(desiredScore); + }, [endAngle]); + + useEffect(() => { + setRadius(0.75 * Math.min(width, height) / 2); + setCenter({ x: width / 2, y: height / 2 }); + }, [width, height]); + + const position = calculatePosition(angle); + const rotation = calculateRotation(angle); + + return ( +
+ + + + + + + + + +
+ {parseInt(score)} + {scoreLabel} +
+
+ ); +}; + +export default Needle; diff --git a/src/components/Results/EnergyScore/scorering.jsx b/src/components/Results/EnergyScore/scorering.jsx index 026e252..41bef38 100644 --- a/src/components/Results/EnergyScore/scorering.jsx +++ b/src/components/Results/EnergyScore/scorering.jsx @@ -1,55 +1,49 @@ -import React from 'react'; -import { PieChart, Pie, Cell, ResponsiveContainer } from 'recharts'; +import React, { useState, useEffect, useRef } from 'react'; +import Needle from './needle'; +import Arc from './arc'; +import backgroundImage from '../../../assets/dial_bg.png'; const COLORS = ['#f00', '#ffbf00', '#00ff00']; const ScoreRing = ({ value, scoreLabel }) => { + const dialRef = useRef(null); const score = Math.min(Math.max(value, 0), 100); - const colorIndex = score === 100 ? COLORS.length - 1 : Math.floor(score / (100 / COLORS.length)); + const [width, setWidth] = useState(0); + const [height, setHeight] = useState(0); + useEffect(() => { + const getDimensions = () => { + if (dialRef.current) { + setWidth(dialRef.current.offsetWidth); + setHeight(dialRef.current.offsetHeight); + } + }; + getDimensions(); - const data = [ - { value: score, fill: COLORS[colorIndex] }, - { value: 100 - score, fill: '#ccc' } - ]; + const resizeObserver = new ResizeObserver(getDimensions); + if (dialRef.current) { + resizeObserver.observe(dialRef.current); + } + + return () => { + if (dialRef.current) { + resizeObserver.unobserve(dialRef.current); + } + }; + }, []); return ( - - - - {data.map((entry, index) => ( - - ))} - - - {score} - - - {scoreLabel} - - - +
+ + +
); };