From 3d5a2dd88a90db666eaa514137f5d0b0bc54ed80 Mon Sep 17 00:00:00 2001 From: Sean Edmunds Date: Mon, 13 Jul 2026 14:30:56 -0500 Subject: [PATCH] New Weather API --- package-lock.json | 632 ++++++------------ package.json | 3 +- .../WeatherModal/CurrentWeather.tsx | 123 ++-- .../WeatherModal/ExtendedForecastCard.tsx | 114 +++- src/components/WeatherModal/WeatherGraphs.tsx | 51 +- src/components/WeatherModal/WeatherIcon.tsx | 288 ++++---- src/components/WeatherModal/WeatherModal.tsx | 23 +- .../WeatherModal/WeatherTooltip.tsx | 3 + src/hooks/index.ts | 3 +- src/hooks/useAPI.tsx | 246 +++++-- src/hooks/useCommonHooks.ts | 4 - src/pages/homepage/Homepage.tsx | 134 +--- .../homepage/components/Header/Header.tsx | 9 +- .../homepage/components/Search/Search.tsx | 8 +- src/types/index.ts | 7 +- src/types/location.ts | 4 - src/types/weather.ts | 146 ++-- tsconfig.app.json | 26 - tsconfig.json | 23 +- tsconfig.node.json | 25 - 20 files changed, 847 insertions(+), 1025 deletions(-) delete mode 100644 tsconfig.app.json delete mode 100644 tsconfig.node.json diff --git a/package-lock.json b/package-lock.json index f0081c6..53870a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "name": "triggerfrontend", "version": "1.2.0", "dependencies": { - "@gfazioli/mantine-text-animate": "^4.0.6", + "@gfazioli/mantine-text-animate": "^4.0.7", "@hello-pangea/dnd": "^18.0.1", "@mantine/core": "^9.4.1", "@mantine/dates": "^9.4.1", @@ -21,6 +21,7 @@ "@tanstack/react-table": "^8.21.3", "idb-keyval": "^6.3.0", "jotai": "^2.20.1", + "openmeteo": "^1.2.3", "react": "^19.2.7", "react-dom": "^19.2.7", "react-fontpicker-ts": "^1.3.0", @@ -43,32 +44,30 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -78,25 +77,21 @@ } }, "node_modules/@babel/runtime": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", - "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -116,7 +111,6 @@ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz", "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@emnapi/wasi-threads": "1.2.2", @@ -128,7 +122,6 @@ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz", "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -139,39 +132,35 @@ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz", "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@floating-ui/core": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", - "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", - "license": "MIT", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz", + "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==", "dependencies": { - "@floating-ui/utils": "^0.2.11" + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/dom": { - "version": "1.7.6", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", - "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", - "license": "MIT", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz", + "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==", "dependencies": { - "@floating-ui/core": "^1.7.5", - "@floating-ui/utils": "^0.2.11" + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" } }, "node_modules/@floating-ui/react": { - "version": "0.27.19", - "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.19.tgz", - "integrity": "sha512-31B8h5mm8YxotlE7/AU/PhNAl8eWxAmjL/v2QOxroDNkTFLk3Uu82u63N3b6TXa4EGJeeZLVcd/9AlNlVqzeog==", - "license": "MIT", + "version": "0.27.20", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.27.20.tgz", + "integrity": "sha512-CMqMy7OaXl9W0eq1Uy7L7i2Y/anPvHmFmESd2CEw0t5YvZhcVCeo4MBevAmswRllX7Y2dEidA4ozGPunLSTQpw==", "dependencies": { - "@floating-ui/react-dom": "^2.1.8", - "@floating-ui/utils": "^0.2.11", + "@floating-ui/react-dom": "^2.1.9", + "@floating-ui/utils": "^0.2.12", "tabbable": "^6.0.0" }, "peerDependencies": { @@ -180,12 +169,11 @@ } }, "node_modules/@floating-ui/react-dom": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", - "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", - "license": "MIT", + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.9.tgz", + "integrity": "sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==", "dependencies": { - "@floating-ui/dom": "^1.7.6" + "@floating-ui/dom": "^1.8.0" }, "peerDependencies": { "react": ">=16.8.0", @@ -193,16 +181,14 @@ } }, "node_modules/@floating-ui/utils": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", - "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", - "license": "MIT" + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz", + "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==" }, "node_modules/@gfazioli/mantine-text-animate": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@gfazioli/mantine-text-animate/-/mantine-text-animate-4.0.6.tgz", - "integrity": "sha512-tdoZc06dT1hwOjb1V0r9v0Bp7Q5RS/xdhyU70p2DPcJ3QL43a7dRmaGPfXemx+WpsD0/Zu+GiD4g1EnXs/Qwcg==", - "license": "MIT", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/@gfazioli/mantine-text-animate/-/mantine-text-animate-4.0.7.tgz", + "integrity": "sha512-vU8/T3J4T+ZvVgu162ORea7WsLH2y/uiIIgkmKTMbcu4viTe4orHIxecXVVZ4RsiNNlL1pIUC5uZRvBPWKJpZw==", "peerDependencies": { "@mantine/core": ">=9.0.0", "@mantine/hooks": ">=9.0.0", @@ -214,7 +200,6 @@ "version": "18.0.1", "resolved": "https://registry.npmjs.org/@hello-pangea/dnd/-/dnd-18.0.1.tgz", "integrity": "sha512-xojVWG8s/TGrKT1fC8K2tIWeejJYTAeJuj36zM//yEm/ZrnZUSFGS15BpO+jGZT1ybWvyXmeDJwPYb4dhWlbZQ==", - "license": "Apache-2.0", "dependencies": { "@babel/runtime": "^7.26.7", "css-box-model": "^1.2.1", @@ -232,7 +217,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" @@ -243,7 +227,6 @@ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -262,8 +245,7 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", @@ -279,7 +261,6 @@ "version": "9.4.1", "resolved": "https://registry.npmjs.org/@mantine/core/-/core-9.4.1.tgz", "integrity": "sha512-lZWEICrum4+vwKxzh/mk4RB1N6BqZ0Cshdl6lhm7OYLiQzmOaxKtOgyaWz+vr65G8mqTXjalZalB+wmMVBYK2Q==", - "license": "MIT", "dependencies": { "@floating-ui/react": "^0.27.19", "clsx": "^2.1.1", @@ -297,7 +278,6 @@ "version": "9.4.1", "resolved": "https://registry.npmjs.org/@mantine/dates/-/dates-9.4.1.tgz", "integrity": "sha512-DoQDvQMAlIw6ohwhUwYuTYQevG9y5AQmYWkhOHUuavABFEZmtBglkwziBoATvxT09I/6I56UMPhproXcS6XUfg==", - "license": "MIT", "dependencies": { "clsx": "^2.1.1" }, @@ -313,7 +293,6 @@ "version": "9.4.1", "resolved": "https://registry.npmjs.org/@mantine/form/-/form-9.4.1.tgz", "integrity": "sha512-e4tqC/D8ii7maPySWIWY306MNljPRprHPhu0/jaZrX7sRyJy+C8V9aU+ZFKYliM1CeiH1UX88+q4hWFUWVEdQw==", - "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "fast-deep-equal": "^3.1.3", @@ -327,7 +306,6 @@ "version": "9.4.1", "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-9.4.1.tgz", "integrity": "sha512-eTI8wmzPx3r98zgKIEuvukmoGTHBhmtI6+9E6o2DbTmEU2eM1bCdjE2vFdf0op2AlRO0KEYEcZhNQi4T/SJk0A==", - "license": "MIT", "peerDependencies": { "react": "^19.2.0" } @@ -336,7 +314,6 @@ "version": "9.4.1", "resolved": "https://registry.npmjs.org/@mantine/notifications/-/notifications-9.4.1.tgz", "integrity": "sha512-Sm1g8E8RkFmesxpNz9zFvOjkTVxOa7dJJjMGoHNIXH+9/wO0s9kInny4mVnxTbLJJsD6nTqIQlk1v8tq2C4Ftw==", - "license": "MIT", "dependencies": { "@mantine/store": "9.4.1", "react-transition-group": "4.4.5" @@ -352,7 +329,6 @@ "version": "9.4.1", "resolved": "https://registry.npmjs.org/@mantine/store/-/store-9.4.1.tgz", "integrity": "sha512-/DCZq0aqqIdm03J0RJ7pbzoau2cwY8ndSOjskHOKHhTeWMnOBdCKXA3oMO5aIDldDqJ9T7Io4Boh4Pt461zNQw==", - "license": "MIT", "peerDependencies": { "react": "^19.2.0" } @@ -362,7 +338,6 @@ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@tybys/wasm-util": "^0.10.3" @@ -376,12 +351,22 @@ "@emnapi/runtime": "^1.7.1" } }, + "node_modules/@openmeteo/sdk": { + "version": "1.27.2", + "resolved": "https://registry.npmjs.org/@openmeteo/sdk/-/sdk-1.27.2.tgz", + "integrity": "sha512-aCDyWjDqdT6kf73chJJ//kWlqwh8fZgMwtU9sO14ElRn++Yte/MuX6rnPPhFK+1KSP78vx/aGBlwh9o6Mrs1Jg==", + "dependencies": { + "flatbuffers": "^25.9.23" + }, + "engines": { + "node": ">=12.0" + } + }, "node_modules/@oxc-project/types": { "version": "0.139.0", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz", "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/Boshen" } @@ -390,18 +375,16 @@ "version": "1.0.0-next.29", "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@reduxjs/toolkit": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.8.2.tgz", - "integrity": "sha512-MYlOhQ0sLdw4ud48FoC5w0dH9VfWQjtCjreKwYTT3l+r427qYC5Y8PihNutepr8XrNaBUDQo9khWUwQxZaqt5A==", - "license": "MIT", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz", + "integrity": "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==", "dependencies": { "@standard-schema/spec": "^1.0.0", "@standard-schema/utils": "^0.3.0", - "immer": "^10.0.3", + "immer": "^11.0.0", "redux": "^5.0.1", "redux-thunk": "^3.1.0", "reselect": "^5.1.0" @@ -427,7 +410,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "android" @@ -444,7 +426,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -461,7 +442,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -478,7 +458,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "freebsd" @@ -495,7 +474,6 @@ "arm" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -512,7 +490,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -529,7 +506,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -546,7 +522,6 @@ "ppc64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -563,7 +538,6 @@ "s390x" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -580,7 +554,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -597,7 +570,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "linux" @@ -614,7 +586,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "openharmony" @@ -631,7 +602,6 @@ "wasm32" ], "dev": true, - "license": "MIT", "optional": true, "dependencies": { "@emnapi/core": "1.11.1", @@ -650,7 +620,6 @@ "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -667,7 +636,6 @@ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "win32" @@ -680,15 +648,13 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@rollup/pluginutils": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", "dev": true, - "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -706,6 +672,12 @@ } } }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, "node_modules/@standard-schema/spec": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", @@ -714,14 +686,12 @@ "node_modules/@standard-schema/utils": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", - "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", - "license": "MIT" + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==" }, "node_modules/@tanstack/query-core": { "version": "5.101.2", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.101.2.tgz", "integrity": "sha512-hH5MLoJhF7KaIGd7q3xTXGXvslI+GYlM1Z/35aSHHWaCJWB7XvTSHYuV3eM7tw+aE0mT/xMro4M4Q9rCGHT0lw==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -731,7 +701,6 @@ "version": "5.101.2", "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.101.2.tgz", "integrity": "sha512-o+wHcqgN7Pp0s8v1i0UGq/ZrrEKrxdIiMQmKRdYb2w7NPtylYSJ4+wg/tIn71m9DLstwUwdEGAvROdly6HXP6w==", - "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" @@ -741,7 +710,6 @@ "version": "5.101.2", "resolved": "https://registry.npmjs.org/@tanstack/query-persist-client-core/-/query-persist-client-core-5.101.2.tgz", "integrity": "sha512-rgMsbvBVpSPDUsprC9FYxojdG0Q1LH6yq1i3DXz2aps4VEqv2l4Msj3YDqIifU3xkl/DrYe9YWntZAJLrM6xTg==", - "license": "MIT", "dependencies": { "@tanstack/query-core": "5.101.2" }, @@ -754,7 +722,6 @@ "version": "5.101.2", "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.2.tgz", "integrity": "sha512-seDkr6kzGzX1okaaTtZPtgA688CDPlXUz1C6xSg0ESqn04Vuc8tlrYms1s3de+znBqhPVxFRfpAfUf+6XvfPWg==", - "license": "MIT", "dependencies": { "@tanstack/query-core": "5.101.2" }, @@ -770,7 +737,6 @@ "version": "5.101.2", "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.101.2.tgz", "integrity": "sha512-eU7HctdA9gDjqoERoEdzLbw9DiqnBDfh5+Hu0u26gjqoHJezOpQAuiesDL2VvkU+2cPV76zgv0tMZsOrI4LjnQ==", - "license": "MIT", "dependencies": { "@tanstack/query-devtools": "5.101.2" }, @@ -787,7 +753,6 @@ "version": "5.101.2", "resolved": "https://registry.npmjs.org/@tanstack/react-query-persist-client/-/react-query-persist-client-5.101.2.tgz", "integrity": "sha512-19UpaRtf0lvB2QAJ2MoixxtGf3osMOd508g99EsttUj4+3eLs+ulnNgYjB7AkQMHrRlcbVXqpVNqWkB4a7g8Zw==", - "license": "MIT", "dependencies": { "@tanstack/query-persist-client-core": "5.101.2" }, @@ -804,7 +769,6 @@ "version": "8.21.3", "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.21.3.tgz", "integrity": "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww==", - "license": "MIT", "dependencies": { "@tanstack/table-core": "8.21.3" }, @@ -824,7 +788,6 @@ "version": "8.21.3", "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz", "integrity": "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==", - "license": "MIT", "engines": { "node": ">=12" }, @@ -838,7 +801,6 @@ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", "dev": true, - "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" @@ -849,35 +811,30 @@ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", "dev": true, - "license": "MIT", "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", - "license": "MIT" + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==" }, "node_modules/@types/d3-color": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "license": "MIT" + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" }, "node_modules/@types/d3-ease": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==" }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "license": "MIT", "dependencies": { "@types/d3-color": "*" } @@ -885,23 +842,20 @@ "node_modules/@types/d3-path": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", - "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", - "license": "MIT" + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==" }, "node_modules/@types/d3-scale": { "version": "4.0.9", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", - "license": "MIT", "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-shape": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", - "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", - "license": "MIT", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", "dependencies": { "@types/d3-path": "*" } @@ -909,35 +863,30 @@ "node_modules/@types/d3-time": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", - "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", - "license": "MIT" + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==" }, "node_modules/@types/d3-timer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==" }, "node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true }, "node_modules/@types/node": { "version": "26.1.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", "dev": true, - "license": "MIT", "dependencies": { "undici-types": "~8.3.0" } @@ -947,7 +896,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", "devOptional": true, - "license": "MIT", "dependencies": { "csstype": "^3.2.2" } @@ -957,7 +905,6 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "dev": true, - "license": "MIT", "peerDependencies": { "@types/react": "^19.2.0" } @@ -965,8 +912,7 @@ "node_modules/@types/use-sync-external-store": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", - "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", - "license": "MIT" + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==" }, "node_modules/@typescript/typescript-aix-ppc64": { "version": "7.0.2", @@ -976,7 +922,6 @@ "ppc64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "aix" @@ -993,7 +938,6 @@ "arm64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "darwin" @@ -1010,7 +954,6 @@ "x64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "darwin" @@ -1027,7 +970,6 @@ "arm64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "freebsd" @@ -1044,7 +986,6 @@ "x64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "freebsd" @@ -1061,7 +1002,6 @@ "arm" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1078,7 +1018,6 @@ "arm64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1095,7 +1034,6 @@ "loong64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1112,7 +1050,6 @@ "mips64el" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1129,7 +1066,6 @@ "ppc64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1146,7 +1082,6 @@ "riscv64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1163,7 +1098,6 @@ "s390x" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1180,7 +1114,6 @@ "x64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "linux" @@ -1197,7 +1130,6 @@ "arm64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "netbsd" @@ -1214,7 +1146,6 @@ "x64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "netbsd" @@ -1231,7 +1162,6 @@ "arm64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "openbsd" @@ -1248,7 +1178,6 @@ "x64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "openbsd" @@ -1265,7 +1194,6 @@ "x64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "sunos" @@ -1282,7 +1210,6 @@ "arm64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "win32" @@ -1299,7 +1226,6 @@ "x64" ], "dev": true, - "license": "Apache-2.0", "optional": true, "os": [ "win32" @@ -1313,7 +1239,6 @@ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.3.tgz", "integrity": "sha512-vmFvco5/QuC2f9Oj+wTk0+9XeDFkHxSamwZKYc7MxYwKICfvUvlMhqKI0VuICPltGqh1neqBKDvO4kes1ya8vg==", "dev": true, - "license": "MIT", "dependencies": { "@rolldown/pluginutils": "^1.0.1" }, @@ -1339,7 +1264,6 @@ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.10.tgz", "integrity": "sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==", "dev": true, - "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^1.0.2", "@vitest/utils": "4.1.10", @@ -1370,7 +1294,6 @@ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz", "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==", "dev": true, - "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", @@ -1388,7 +1311,6 @@ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz", "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==", "dev": true, - "license": "MIT", "dependencies": { "@vitest/spy": "4.1.10", "estree-walker": "^3.0.3", @@ -1410,22 +1332,11 @@ } } }, - "node_modules/@vitest/mocker/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/@vitest/pretty-format": { "version": "4.1.10", "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz", "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==", "dev": true, - "license": "MIT", "dependencies": { "tinyrainbow": "^3.1.0" }, @@ -1438,7 +1349,6 @@ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz", "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==", "dev": true, - "license": "MIT", "dependencies": { "@vitest/utils": "4.1.10", "pathe": "^2.0.3" @@ -1452,7 +1362,6 @@ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz", "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==", "dev": true, - "license": "MIT", "dependencies": { "@vitest/pretty-format": "4.1.10", "@vitest/utils": "4.1.10", @@ -1468,7 +1377,6 @@ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz", "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==", "dev": true, - "license": "MIT", "funding": { "url": "https://opencollective.com/vitest" } @@ -1478,7 +1386,6 @@ "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-4.1.10.tgz", "integrity": "sha512-EOUqfXHTXtpSHsyLHH40ts3Ue+hRhSGwzwzMlK0dTEOLSDYyOXLyr5JDGmHQWhN2DYI30gw6dVx3cdgM9FZl+Q==", "dev": true, - "license": "MIT", "dependencies": { "@vitest/utils": "4.1.10", "fflate": "^0.8.2", @@ -1500,7 +1407,6 @@ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz", "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==", "dev": true, - "license": "MIT", "dependencies": { "@vitest/pretty-format": "4.1.10", "convert-source-map": "^2.0.0", @@ -1515,7 +1421,6 @@ "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.28.tgz", "integrity": "sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==", "dev": true, - "license": "MIT", "dependencies": { "@volar/source-map": "2.4.28" } @@ -1524,15 +1429,13 @@ "version": "2.4.28", "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.28.tgz", "integrity": "sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/@volar/typescript": { "version": "2.4.28", "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.28.tgz", "integrity": "sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==", "dev": true, - "license": "MIT", "dependencies": { "@volar/language-core": "2.4.28", "path-browserify": "^1.0.1", @@ -1544,7 +1447,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -1557,15 +1459,14 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/ast-v8-to-istanbul": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.0.tgz", - "integrity": "sha512-1fSfIwuDICFA4LKkCzRPO7F0hzFf0B7+Xqrl27ynQaa+Rh0e1Es0v6kWHPott3lU10AyAr7oKHa65OppjLn3Rg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.4.tgz", + "integrity": "sha512-0bC0/4bTSrnwdhU3IsZDwEdojvuPrSg59OYZfKsLRtJZ0u8VBx9DebfqqG8bRdCC0I7vjgxmPi41P0lpkhJHtA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", @@ -1573,27 +1474,11 @@ "js-tokens": "^10.0.0" } }, - "node_modules/ast-v8-to-istanbul/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", - "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", - "dev": true - }, "node_modules/chai": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" } @@ -1610,28 +1495,24 @@ "version": "6.1.1", "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/confbox": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/cookie": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", - "license": "MIT", "engines": { "node": ">=18" }, @@ -1644,7 +1525,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", - "license": "MIT", "dependencies": { "tiny-invariant": "^1.0.6" } @@ -1658,7 +1538,6 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "license": "ISC", "dependencies": { "internmap": "1 - 2" }, @@ -1670,7 +1549,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "license": "ISC", "engines": { "node": ">=12" } @@ -1679,16 +1557,14 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", "engines": { "node": ">=12" } }, "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "license": "ISC", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", "engines": { "node": ">=12" } @@ -1697,7 +1573,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -1709,7 +1584,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "license": "ISC", "engines": { "node": ">=12" } @@ -1718,7 +1592,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -1734,7 +1607,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "license": "ISC", "dependencies": { "d3-path": "^3.1.0" }, @@ -1746,7 +1618,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "license": "ISC", "dependencies": { "d3-array": "2 - 3" }, @@ -1758,7 +1629,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "license": "ISC", "dependencies": { "d3-time": "1 - 3" }, @@ -1770,15 +1640,14 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/dayjs": { - "version": "1.11.20", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", - "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "version": "1.11.21", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz", + "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==", "peer": true }, "node_modules/debug": { @@ -1786,7 +1655,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -1802,8 +1670,7 @@ "node_modules/decimal.js-light": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", - "license": "MIT" + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, "node_modules/detect-libc": { "version": "2.1.2", @@ -1817,8 +1684,7 @@ "node_modules/detect-node-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "license": "MIT" + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" }, "node_modules/dom-helpers": { "version": "5.2.1", @@ -1830,41 +1696,35 @@ } }, "node_modules/es-module-lexer": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.0.tgz", - "integrity": "sha512-KLdwQm2NvGLDkQDCGvmiQrhkd0JbMzXthwQAUgWjQuQdBLFa3eiBP5arXZyA+f8x+x7OXgud6bq2rxjGtHV2tw==", - "dev": true, - "license": "MIT" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", + "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", + "dev": true }, "node_modules/es-toolkit": { - "version": "1.39.5", - "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.39.5.tgz", - "integrity": "sha512-z9V0qU4lx1TBXDNFWfAASWk6RNU6c6+TJBKE+FLIg8u0XJ6Yw58Hi0yX8ftEouj6p1QARRlXLFfHbIli93BdQQ==", - "license": "MIT", - "workspaces": [ - "docs", - "benchmarks" - ] + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.49.0.tgz", + "integrity": "sha512-G5iZ6Pc/FNRY/soKZHC+TxGDD83rHUDXxzaWhGCX44vAv/tMs56WMusnm/KMNK+luUPsgA9U28cGr4RDlSzL2g==" }, "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "license": "MIT" + "dependencies": { + "@types/estree": "^1.0.0" + } }, "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==" }, "node_modules/expect-type": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.0.0" } @@ -1873,8 +1733,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz", "integrity": "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -1886,7 +1745,6 @@ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.0.0" }, @@ -1903,15 +1761,18 @@ "version": "0.8.3", "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.3.tgz", "integrity": "sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==", - "dev": true, - "license": "MIT" + "dev": true + }, + "node_modules/flatbuffers": { + "version": "25.9.23", + "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", + "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==" }, "node_modules/flatted": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -1931,7 +1792,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "license": "MIT", "engines": { "node": ">=6" } @@ -1955,20 +1815,17 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/idb-keyval": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.3.0.tgz", - "integrity": "sha512-um+2dgAWmYsu615EXpWVwSmapJhON0G43t3Ka/EVaohzPQXSMqKEqeDK/oIW3Ow+BXaF2PvSc+oBTFp793A5Ow==", - "license": "Apache-2.0" + "integrity": "sha512-um+2dgAWmYsu615EXpWVwSmapJhON0G43t3Ka/EVaohzPQXSMqKEqeDK/oIW3Ow+BXaF2PvSc+oBTFp793A5Ow==" }, "node_modules/immer": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.1.tgz", - "integrity": "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==", - "license": "MIT", + "version": "11.1.11", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.11.tgz", + "integrity": "sha512-qzXuyXAkPySAGYkfsAwodDPWT8Zm7/Uo5BNt4BjhMhG5WlWyZZ4wQqnWwdS8kjlQ1Cwu6gjw3A6+0gTQwlyYtw==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -1978,7 +1835,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "license": "ISC", "engines": { "node": ">=12" } @@ -1997,7 +1853,6 @@ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", @@ -2007,25 +1862,11 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/istanbul-reports": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -2038,7 +1879,6 @@ "version": "2.20.1", "resolved": "https://registry.npmjs.org/jotai/-/jotai-2.20.1.tgz", "integrity": "sha512-dnuKfU/GLi8B28RRMjQ3AfoN7kfzP8o41+AX2FmITZqEMY8PHnjABq+VkEooomLwYaGjda+pgy0yFSjaHX/ZPg==", - "license": "MIT", "engines": { "node": ">=12.20.0" }, @@ -2064,15 +1904,15 @@ } }, "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true }, "node_modules/klona": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "license": "MIT", "engines": { "node": ">= 8" } @@ -2081,8 +1921,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/lightningcss": { "version": "1.32.0", @@ -2338,7 +2177,6 @@ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz", "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==", "dev": true, - "license": "MIT", "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", @@ -2362,23 +2200,27 @@ "loose-envify": "cli.js" } }, + "node_modules/loose-envify/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "node_modules/magicast": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.2.tgz", - "integrity": "sha512-E3ZJh4J3S9KfwdjZhe2afj6R9lGIN5Pher1pF39UGrXRqq/VDaGVIGN13BjHd2u8B61hArAGOnso7nBOouW3TQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", "dev": true, "dependencies": { - "@babel/parser": "^7.29.0", + "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } @@ -2388,7 +2230,6 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^7.5.3" }, @@ -2404,7 +2245,6 @@ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", "dev": true, - "license": "MIT", "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", @@ -2416,15 +2256,13 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/mlly/node_modules/pkg-types": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", "dev": true, - "license": "MIT", "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", @@ -2436,7 +2274,6 @@ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" } @@ -2448,9 +2285,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "dev": true, "funding": [ { @@ -2458,7 +2295,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2483,17 +2319,27 @@ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" ], - "license": "MIT", "engines": { "node": ">=12.20.0" } }, + "node_modules/openmeteo": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/openmeteo/-/openmeteo-1.2.3.tgz", + "integrity": "sha512-3updmgCMnCAAjAgV3RfhMdIBPi/43RtbjQ4CizHGn52RP9SpgmVCDRpun+Ex75NG3jTF3pZp+d1BPlP9DWMHiQ==", + "dependencies": { + "@openmeteo/sdk": "^1.23.0", + "flatbuffers": "^25.9.23" + }, + "engines": { + "node": ">=12.0" + } + }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/pathe": { "version": "2.0.3", @@ -2505,15 +2351,13 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/picomatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -2526,7 +2370,6 @@ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz", "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==", "dev": true, - "license": "MIT", "dependencies": { "confbox": "^0.2.4", "exsolve": "^1.0.8", @@ -2534,9 +2377,9 @@ } }, "node_modules/postcss": { - "version": "8.5.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.16.tgz", - "integrity": "sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==", + "version": "8.5.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", + "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==", "dev": true, "funding": [ { @@ -2552,7 +2395,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", @@ -2572,6 +2414,11 @@ "react-is": "^16.13.1" } }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/quansync": { "version": "0.2.11", "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", @@ -2586,20 +2433,17 @@ "type": "individual", "url": "https://github.com/sponsors/sxzz" } - ], - "license": "MIT" + ] }, "node_modules/raf-schd": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/raf-schd/-/raf-schd-4.0.3.tgz", - "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==", - "license": "MIT" + "integrity": "sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==" }, "node_modules/react": { "version": "19.2.7", "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2608,7 +2452,6 @@ "version": "19.2.7", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", - "license": "MIT", "dependencies": { "scheduler": "^0.27.0" }, @@ -2628,31 +2471,29 @@ "version": "5.7.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.7.0.tgz", "integrity": "sha512-LBLy340Rzqy6+/yVhZKT3B/QpP1BZaesGqasf09HPOBzRarcDIFH0WwXlXQfE7q7ipxK4MSiC5DIBWURCny6fw==", - "license": "MIT", "peerDependencies": { "react": "*" } }, "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "version": "19.2.7", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.2.7.tgz", + "integrity": "sha512-kZFnouyVv7eP/Phmrlo9FK+zcAdriZJvzxXHF1Sl1P377WSGe2G/JxVolhTrB/jeV47lKImhNUsijjHAAbcl/A==", + "peer": true }, "node_modules/react-number-format": { "version": "5.4.5", "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.4.5.tgz", "integrity": "sha512-y8O2yHHj3w0aE9XO8d2BCcUOOdQTRSVq+WIuMlLVucAm5XNjJAy+BoOJiuQMldVYVOKTMyvVNfnbl2Oqp+YxGw==", - "license": "MIT", "peerDependencies": { "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/react-redux": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz", - "integrity": "sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==", - "license": "MIT", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", + "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", "dependencies": { "@types/use-sync-external-store": "^0.0.6", "use-sync-external-store": "^1.4.0" @@ -2675,7 +2516,6 @@ "version": "2.7.2", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.7.2.tgz", "integrity": "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==", - "license": "MIT", "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", @@ -2700,7 +2540,6 @@ "version": "2.3.8", "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.8.tgz", "integrity": "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==", - "license": "MIT", "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" @@ -2722,7 +2561,6 @@ "version": "7.18.1", "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.1.tgz", "integrity": "sha512-GDLgg3i3uM0aeJO3Fm+TCS+sDQ7gu12T6x0qdTEzcwqEfleci7JwugVNIF3U//0FWKnJT7ptG+20B2jfDqnZAg==", - "license": "MIT", "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" @@ -2744,7 +2582,6 @@ "version": "7.18.1", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.1.tgz", "integrity": "sha512-KaZh+X/6UtEp28x51AUYZDMg9NGoz2ja3dNHa+ta/tk40vCzKhQ/RypCWBMLbmDr6//E24Vv5uPsrqXFozdkAg==", - "license": "MIT", "dependencies": { "react-router": "7.18.1" }, @@ -2760,7 +2597,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz", "integrity": "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==", - "license": "MIT", "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" @@ -2797,10 +2633,6 @@ "version": "3.9.2", "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.9.2.tgz", "integrity": "sha512-G4fy+Pk46RaXgwWMh+Nzhyo/lbFAVqXo9gtetlyehe6Ehge9CsgDuOTwQDD+i1+llaLktNBiNq4bhnGlDRXFtw==", - "license": "MIT", - "workspaces": [ - "www" - ], "dependencies": { "@reduxjs/toolkit": "^1.9.0 || 2.x.x", "clsx": "^2.1.1", @@ -2823,48 +2655,29 @@ "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/recharts/node_modules/immer": { - "version": "11.1.11", - "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.11.tgz", - "integrity": "sha512-qzXuyXAkPySAGYkfsAwodDPWT8Zm7/Uo5BNt4BjhMhG5WlWyZZ4wQqnWwdS8kjlQ1Cwu6gjw3A6+0gTQwlyYtw==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, "node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", - "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", - "license": "MIT" + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==" }, "node_modules/redux-thunk": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", - "license": "MIT", "peerDependencies": { "redux": "^5.0.0" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, "node_modules/reselect": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz", - "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==", - "license": "MIT" + "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==" }, "node_modules/rolldown": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz", "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==", "dev": true, - "license": "MIT", "dependencies": { "@oxc-project/types": "=0.139.0", "@rolldown/pluginutils": "^1.0.0" @@ -2896,15 +2709,13 @@ "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==" }, "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -2915,22 +2726,19 @@ "node_modules/set-cookie-parser": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", - "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", - "license": "MIT" + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==" }, "node_modules/siginfo": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/sirv": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", "dev": true, - "license": "MIT", "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", @@ -2953,27 +2761,35 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/std-env": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", + "dev": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT" + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } }, "node_modules/tabbable": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", - "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", - "license": "MIT" + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz", + "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==" }, "node_modules/tagged-tag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz", "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", - "license": "MIT", "engines": { "node": ">=20" }, @@ -2990,15 +2806,13 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/tinyexec": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", "dev": true, - "license": "MIT", "engines": { "node": ">=18" } @@ -3008,7 +2822,6 @@ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, - "license": "MIT", "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" @@ -3025,7 +2838,6 @@ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -3035,7 +2847,6 @@ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -3043,14 +2854,12 @@ "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/type-fest": { "version": "5.8.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.8.0.tgz", "integrity": "sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==", - "license": "(MIT OR CC0-1.0)", "dependencies": { "tagged-tag": "^1.0.0" }, @@ -3066,7 +2875,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-7.0.2.tgz", "integrity": "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc" }, @@ -3100,22 +2908,19 @@ "version": "1.6.4", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/undici-types": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/unplugin": { "version": "2.3.11", "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz", "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", @@ -3131,7 +2936,6 @@ "resolved": "https://registry.npmjs.org/unplugin-dts/-/unplugin-dts-1.0.3.tgz", "integrity": "sha512-/GR887wfG4r1cWyt1UZsLRuMIjsmEbGkS9yJrz+0dsToHAYUD5CTyP3JMGVLv25j9K0mJcwAVvZno/aTuSUvNg==", "dev": true, - "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.4", "@volar/typescript": "^2.4.26", @@ -3184,7 +2988,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", "integrity": "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==", - "license": "MIT", "dependencies": { "tslib": "^2.0.0" }, @@ -3205,7 +3008,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.3.tgz", "integrity": "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==", - "license": "MIT", "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" @@ -3224,10 +3026,9 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.4.0.tgz", - "integrity": "sha512-9WXSPC5fMv61vaupRkCKCxsPxBocVnwakBEkMIHHpkTTg6icbJtg6jzgtLDm4bl3cSHAca52rYWih0k4K3PfHw==", - "license": "MIT", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } @@ -3236,7 +3037,6 @@ "version": "37.3.6", "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", - "license": "MIT AND ISC", "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", @@ -3259,7 +3059,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", "dev": true, - "license": "MIT", "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", @@ -3337,7 +3136,6 @@ "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-5.0.3.tgz", "integrity": "sha512-gIth6NdCEHWPiiRMCK3N6C8WjvdsrtEQrmsiG8h6Ov+lFP+b07Y+wcs9H0H7n146l0PDTYK4cQN1vgeG1pMdRQ==", "dev": true, - "license": "MIT", "dependencies": { "unplugin-dts": "1.0.3" }, @@ -3376,8 +3174,8 @@ "version": "3.1.6", "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "deprecated": "unmaintained", "dev": true, - "license": "MIT", "bin": { "tsconfck": "bin/tsconfck.js" }, @@ -3413,7 +3211,6 @@ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz", "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==", "dev": true, - "license": "MIT", "dependencies": { "@vitest/expect": "4.1.10", "@vitest/mocker": "4.1.10", @@ -3502,22 +3299,19 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/why-is-node-running": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, - "license": "MIT", "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" diff --git a/package.json b/package.json index 3fc34c4..e8da8d7 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "preview": "vite preview" }, "dependencies": { - "@gfazioli/mantine-text-animate": "^4.0.6", + "@gfazioli/mantine-text-animate": "^4.0.7", "@hello-pangea/dnd": "^18.0.1", "@mantine/core": "^9.4.1", "@mantine/dates": "^9.4.1", @@ -23,6 +23,7 @@ "@tanstack/react-table": "^8.21.3", "idb-keyval": "^6.3.0", "jotai": "^2.20.1", + "openmeteo": "^1.2.3", "react": "^19.2.7", "react-dom": "^19.2.7", "react-fontpicker-ts": "^1.3.0", diff --git a/src/components/WeatherModal/CurrentWeather.tsx b/src/components/WeatherModal/CurrentWeather.tsx index 38b9c78..08656c6 100644 --- a/src/components/WeatherModal/CurrentWeather.tsx +++ b/src/components/WeatherModal/CurrentWeather.tsx @@ -1,27 +1,63 @@ import { Box, Card, Group, Stack, Text } from '@mantine/core'; -import { useCommonHooks, useSunStateAPI } from 'hooks'; +import { useCommonHooks } from 'hooks'; import { FaLongArrowAltDown, FaLongArrowAltUp, FaWind } from 'react-icons/fa'; import { WiBarometer, WiHumidity, WiSunrise, WiSunset } from 'react-icons/wi'; import { textClasses } from 'styles'; -import type { CurrentWeather as CW, SunState } from 'types'; +import type { MeteoWeather } from 'types'; import WeatherFeaturePill from './WeatherFeaturePill'; import WeatherIcon from './WeatherIcon'; -export default function CurrentWeather({ current }: { current: CW }) { - const { currentLocation, isMobile, theme, textShadowStyle } = useCommonHooks(); - const { data: sunStateData } = useSunStateAPI({ - lat: currentLocation.lat, - lon: currentLocation.lon, - }); +const WeatherCodes: { [key: number]: string } = { + 0: 'Clear sky', - const sunStates: SunState[] = - sunStateData?.results.map((item: SunState) => { - return { - date: item.date, - sunrise: item.sunrise, - sunset: item.sunset, - }; - }) || []; + 1: 'Mainly clear', + 2: 'Partly cloudy', + 3: 'Overcast', + + 45: 'Fog', + 48: 'Depositing rime fog', + + 51: 'Drizzle: Light', + 53: 'Drizzle: Moderate', + 55: 'Drizzle: Dense', + + 56: 'Freezing Drizzle: Light', + 57: 'Freezing Drizzle: Dense', + + 61: 'Rain: Slight', + 63: 'Rain: Moderate', + 65: 'Rain: Heavy', + + 66: 'Freezing Rain: Light', + 67: 'Freezing Rain: Heavy', + + 71: 'Snowfall: Slight', + 73: 'Snowfall: Moderate', + 75: 'Snowfall: Heavy', + + 77: 'Snow grains', + + 80: 'Rain showers: Slight', + 81: 'Rain showers: Moderate', + 82: 'Rain showers: Violent', + + 85: 'Snow showers: Slight', + 86: 'Snow showers: Heavy', + + 95: 'Thunderstorm: Slight or moderate', + 96: 'Thunderstorm with slight hail', + 99: 'Thunderstorm with heavy hail', +} as const; + +export default function CurrentWeather({ + current, +}: { + current: MeteoWeather | undefined; +}) { + const { isMobile, theme, textShadowStyle } = useCommonHooks(); + + const sunrise = new Date(current?.daily.sunrise[0] || 0).toLocaleTimeString(); + const sunset = new Date(current?.daily.sunset[0] || 0).toLocaleTimeString(); return ( <> @@ -71,25 +107,11 @@ export default function CurrentWeather({ current }: { current: CW }) { opacity: 0.5, }} > - + - {current.temperature}°F + {current.current.temperature_2m?.toFixed(0)}° + F 25 ? 'flex-start' : 'center'} + justify={ + WeatherCodes[Number(current.current.weather_code)].length > 25 + ? 'flex-start' + : 'center' + } style={{ width: '100%', maxWidth: '180px', @@ -120,13 +146,15 @@ export default function CurrentWeather({ current }: { current: CW }) { > 25 + WeatherCodes[Number(current.current.weather_code)].length > 25 ? textClasses.autoScrollText : undefined } classNames={textClasses} > - {current.temperature === 69 ? 'Nice' : current.textDescription} + {current.current.temperature_2m?.toFixed(0) === '69' + ? 'Nice' + : WeatherCodes[Number(current.current.weather_code)]} @@ -134,8 +162,9 @@ export default function CurrentWeather({ current }: { current: CW }) { leftSide={Feels like } rightSide={ - {current.heatIndex ?? current.windChill ?? current.temperature}° - F + {current.current.apparent_temperature?.toFixed(0) ?? + current.current.temperature_2m?.toFixed(0)} + °F } highlight='right' @@ -164,7 +193,7 @@ export default function CurrentWeather({ current }: { current: CW }) { } rightSide={ - {current.highTemp}°F + {current.daily.temperature_2m_max?.[0].toFixed(0)}°F } highlight='right' @@ -178,7 +207,7 @@ export default function CurrentWeather({ current }: { current: CW }) { } rightSide={ - {current.lowTemp}°F + {current.daily.temperature_2m_min?.[0].toFixed(0)}°F } highlight='right' @@ -205,7 +234,7 @@ export default function CurrentWeather({ current }: { current: CW }) { Humidity } - rightSide={{current.humidity}%} + rightSide={{current.current.relative_humidity_2m}%} highlight='right' /> } - rightSide={{current.windSpeed}mph} + rightSide={ + {current.current.wind_speed_10m?.toFixed(0)}mph + } highlight='right' /> } - rightSide={{current.pressure} in} + rightSide={ + {current.current.surface_pressure?.toFixed(0)} mbar + } highlight='right' /> @@ -257,7 +290,7 @@ export default function CurrentWeather({ current }: { current: CW }) { /> } - rightSide={{sunStates[0]?.sunrise}} + rightSide={{sunrise}} highlight='left' /> } - rightSide={{sunStates[0]?.sunset}} + rightSide={{sunset}} highlight='left' /> diff --git a/src/components/WeatherModal/ExtendedForecastCard.tsx b/src/components/WeatherModal/ExtendedForecastCard.tsx index db55233..3defff5 100644 --- a/src/components/WeatherModal/ExtendedForecastCard.tsx +++ b/src/components/WeatherModal/ExtendedForecastCard.tsx @@ -1,17 +1,78 @@ import { Card, Group, SimpleGrid, Stack, Text } from '@mantine/core'; import { useCommonHooks } from 'hooks'; import { textClasses } from 'styles'; -import type { ExtendedForecast } from 'types'; +import type { Daily } from 'types'; import WeatherIcon from './WeatherIcon'; -export default function ExtendedForecastCard({ - forecast, -}: { - forecast: ExtendedForecast[]; -}) { +const WeatherCodes: { [key: number]: string } = { + 0: 'Clear sky', + + 1: 'Mainly clear', + 2: 'Partly cloudy', + 3: 'Overcast', + + 45: 'Fog', + 48: 'Depositing rime fog', + + 51: 'Drizzle: Light', + 53: 'Drizzle: Moderate', + 55: 'Drizzle: Dense', + + 56: 'Freezing Drizzle: Light', + 57: 'Freezing Drizzle: Dense', + + 61: 'Rain: Slight', + 63: 'Rain: Moderate', + 65: 'Rain: Heavy', + + 66: 'Freezing Rain: Light', + 67: 'Freezing Rain: Heavy', + + 71: 'Snowfall: Slight', + 73: 'Snowfall: Moderate', + 75: 'Snowfall: Heavy', + + 77: 'Snow grains', + + 80: 'Rain showers: Slight', + 81: 'Rain showers: Moderate', + 82: 'Rain showers: Violent', + + 85: 'Snow showers: Slight', + 86: 'Snow showers: Heavy', + + 95: 'Thunderstorm: Slight or moderate', + 96: 'Thunderstorm with slight hail', + 99: 'Thunderstorm with heavy hail', +} as const; + +export default function ExtendedForecastCard({ daily }: { daily: Daily | undefined }) { const { isMobile, theme } = useCommonHooks(); - const day = forecast.slice(2, 14).filter((item: ExtendedForecast) => item.isDaytime); - const night = forecast.slice(2, 14).filter((item: ExtendedForecast) => !item.isDaytime); + const forecast = daily?.time.map((_: any, index: number) => { + const time = new Date(daily.time[index]); + time.setMinutes(daily.time[index].getTimezoneOffset() + time.getMinutes()); + + return { + apparentTemperatureMax: daily.apparent_temperature_max?.[index], + apparentTemperatureMin: daily.apparent_temperature_min?.[index], + daylightDuration: daily.daylight_duration?.[index], + precipitationHours: daily.precipitation_hours?.[index], + precipitationProbability: daily.precipitation_probability_max?.[index], + precipitationSum: daily.precipitation_sum?.[index], + sunrise: daily.sunrise[index], + sunset: daily.sunset[index], + sunshineDuration: daily.sunshine_duration?.[index], + temperatureMax: daily.temperature_2m_max?.[index], + temperatureMin: daily.temperature_2m_min?.[index], + time: time, + unIndexClearSkyMax: daily.uv_index_clear_sky_max?.[index], + uvIndexMax: daily.uv_index_max?.[index], + weatherCode: daily.weather_code?.[index], + windDirection: daily.wind_direction_10m_dominant?.[index], + windGusts: daily.wind_gusts_10m_max?.[index], + windSpeed: daily.wind_speed_10m_max?.[index], + }; + }); return ( - {day.map((item: ExtendedForecast, index: number) => { - const short = item.shortForecast.includes('And') - ? item.shortForecast.substring(0, item.shortForecast.indexOf('And')) - : item.shortForecast.includes('then') - ? item.shortForecast.substring(0, item.shortForecast.indexOf('then')) - : item.shortForecast; - + {forecast?.slice(1, 7).map((item: any) => { return ( 15 ? 'flex-start' : 'center'} + justify={ + item.time.toLocaleDateString('en-US', { weekday: 'long' }).length > 15 + ? 'flex-start' + : 'center' + } style={{ width: '100%', whiteSpace: 'nowrap', @@ -66,16 +125,20 @@ export default function ExtendedForecastCard({ > 15 ? textClasses.autoScrollText : undefined + item.time.toLocaleDateString('en-US', { weekday: 'long' }).length > 15 + ? textClasses.autoScrollText + : undefined } classNames={textClasses} > - {item.name} + {item.time.toLocaleDateString('en-US', { weekday: 'long' })} - + 15 ? 'flex-start' : 'center'} + justify={ + WeatherCodes[item.weatherCode].length > 15 ? 'flex-start' : 'center' + } style={{ width: '100%', whiteSpace: 'nowrap', @@ -85,15 +148,18 @@ export default function ExtendedForecastCard({ }} > 15 ? textClasses.autoScrollText : undefined} + className={ + WeatherCodes[item.weatherCode].length > 15 + ? textClasses.autoScrollText + : undefined + } classNames={textClasses} > - {short} + {WeatherCodes[item.weatherCode]} - {item.temperature}°{item.temperatureUnit}/{night[index].temperature}° - {item.temperatureUnit} + {item.temperatureMax.toFixed(0)}°F/{item.temperatureMin.toFixed(0)}°F ); diff --git a/src/components/WeatherModal/WeatherGraphs.tsx b/src/components/WeatherModal/WeatherGraphs.tsx index 83c2b92..19f0819 100644 --- a/src/components/WeatherModal/WeatherGraphs.tsx +++ b/src/components/WeatherModal/WeatherGraphs.tsx @@ -11,16 +11,31 @@ import { XAxis, YAxis, } from 'recharts'; -import type { HourlyForecast } from 'types'; +import type { Hourly } from 'types'; import WeatherTooltip from './WeatherTooltip'; -export default function WeatherGraphs({ - hourlyForecast, -}: { - hourlyForecast: HourlyForecast[]; -}) { +export default function WeatherGraphs({ hourly }: { hourly: Hourly | undefined }) { const colorPrecipitation = 'colorPrecipitation'; const colorHumidity = 'colorHumidity'; + + const later = new Date(); + const now = new Date(); + later.setDate(now.getDate() + 1); + const hourlyForecast = hourly?.time + ?.map((_: any, index: number) => { + return { + dewpoint: hourly.dew_point_2m?.[index].toFixed(0), + isDaytime: hourly.is_day?.[index], + name: hourly.time[index], + startTime: hourly.time[index], + endTime: hourly.time[index + 1], + probabilityOfPrecipitation: hourly.precipitation_probability?.[index], + temperature: hourly.temperature_2m?.[index].toFixed(0), + relativeHumidity: hourly.relative_humidity_2m?.[index].toFixed(0), + }; + }) + .filter((hour: any) => hour.startTime > now && hour.startTime < later); + return ( { + dataKey={(data) => { return new Date(data.startTime).toLocaleTimeString('en-US', { hour: 'numeric', minute: 'numeric', @@ -49,7 +64,7 @@ export default function WeatherGraphs({ }} /> - } /> + } /> { - return (data.dewpoint.value * 9) / 5 + 32; - }} + dataKey='dewpoint' stroke={'var(--mantine-color-accent-0)'} strokeWidth={2} dot={{ @@ -78,7 +91,7 @@ export default function WeatherGraphs({ fill: 'var(--mantine-color-accent-0)', }} /> - + @@ -112,7 +125,7 @@ export default function WeatherGraphs({ { + dataKey={(data) => { return new Date(data.startTime).toLocaleTimeString('en-US', { hour: 'numeric', minute: 'numeric', @@ -121,14 +134,12 @@ export default function WeatherGraphs({ /> - } /> + } /> { - return data.relativeHumidity.value; - }} + dataKey={'relativeHumidity'} stroke={'var(--mantine-color-primary-0)'} strokeWidth={2} fill={`url(#${colorPrecipitation})`} @@ -142,9 +153,7 @@ export default function WeatherGraphs({ unit={'%'} type='monotone' name='Precipitation' - dataKey={(data: HourlyForecast) => { - return data.probabilityOfPrecipitation.value; - }} + dataKey={'probabilityOfPrecipitation'} stroke={'var(--mantine-color-accent-0)'} strokeWidth={2} fill={`url(#${colorHumidity})`} @@ -154,7 +163,7 @@ export default function WeatherGraphs({ fill: 'var(--mantine-color-accent-0)', }} /> - + diff --git a/src/components/WeatherModal/WeatherIcon.tsx b/src/components/WeatherModal/WeatherIcon.tsx index 4515618..cf1e23f 100644 --- a/src/components/WeatherModal/WeatherIcon.tsx +++ b/src/components/WeatherModal/WeatherIcon.tsx @@ -1,5 +1,4 @@ -import { Group, Image } from '@mantine/core'; -import { FaArrowRight } from 'react-icons/fa'; +import { Image } from '@mantine/core'; import CloudyIcon from '../../assets/weather/cloudy.svg'; import HazeIcon from '../../assets/weather/haze.svg'; import HeavyRainIcon from '../../assets/weather/heavy-rain.svg'; @@ -9,168 +8,166 @@ import SleetIcon from '../../assets/weather/sleet.svg'; import SnowIcon from '../../assets/weather/snow.svg'; import SunnyIcon from '../../assets/weather/sunny.svg'; import ThunderstormIcon from '../../assets/weather/thunderstorm.svg'; -import WindyIcon from '../../assets/weather/windy.svg'; export default function WeatherIcon({ size, - textDescription, + code, }: { size: string; - textDescription: string; + code: number | undefined; }) { - const icon = textDescription.includes('then') - ? [ - textDescription.substring(0, textDescription.trim().indexOf('then')), - textDescription.substring(textDescription.trim().indexOf('then') + 4).trim(), - ] - : [textDescription.trim()]; - - const lookupSource = (icon: any) => { - switch (icon.trim()) { - case 'Ash': + const lookupSource = (code: any) => { + switch (code) { + case 0: return { - src: HazeIcon, - alt: 'HazeIcon', + src: SunnyIcon, + alt: 'SunnyIcon', }; - case 'Broken Clouds': + + case 1: return { src: PartlyCloudyIcon, alt: 'PartlyCloudyIcon', }; - case 'Chance Rain Showers': + case 2: return { - src: RainIcon, - alt: 'RainIcon', + src: PartlyCloudyIcon, + alt: 'PartlyCloudyIcon', }; - case 'Chance Showers': - return { - src: RainIcon, - alt: 'RainIcon', - }; - case 'Slight Chance Showers': - return { - src: RainIcon, - alt: 'RainIcon', - }; - case 'Cloudy': + case 3: return { src: CloudyIcon, alt: 'CloudyIcon', }; - case 'Dust': + + case 45: return { src: HazeIcon, alt: 'HazeIcon', }; - case 'Drizzle': + case 48: + return { + src: HazeIcon, + alt: 'HazeIcon', + }; + + case 51: return { src: RainIcon, alt: 'RainIcon', }; - case 'Fog': + case 53: return { - src: HazeIcon, - alt: 'HazeIcon', + src: RainIcon, + alt: 'RainIcon', }; - case 'Freezing Rain': + case 55: + return { + src: RainIcon, + alt: 'RainIcon', + }; + + case 56: return { src: SleetIcon, alt: 'SleetIcon', }; - case 'Haze': + case 57: return { - src: HazeIcon, - alt: 'HazeIcon', + src: SleetIcon, + alt: 'SleetIcon', }; - case 'Heavy Rain': + + case 61: + return { + src: RainIcon, + alt: 'RainIcon', + }; + case 63: + return { + src: RainIcon, + alt: 'RainIcon', + }; + case 65: + return { + src: RainIcon, + alt: 'RainIcon', + }; + + case 66: + return { + src: SleetIcon, + alt: 'SleetIcon', + }; + case 67: + return { + src: SleetIcon, + alt: 'SleetIcon', + }; + + case 71: + return { + src: SnowIcon, + alt: 'SnowIcon', + }; + case 73: + return { + src: SnowIcon, + alt: 'SnowIcon', + }; + case 75: + return { + src: SnowIcon, + alt: 'SnowIcon', + }; + + case 77: + return { + src: SnowIcon, + alt: 'SnowIcon', + }; + + case 80: return { src: HeavyRainIcon, alt: 'HeavyRainIcon', }; - case 'Heavy Snow': + case 81: + return { + src: HeavyRainIcon, + alt: 'HeavyRainIcon', + }; + case 82: + return { + src: HeavyRainIcon, + alt: 'HeavyRainIcon', + }; + + case 85: return { src: SnowIcon, alt: 'SnowIcon', }; - case 'Light Rain': - return { - src: RainIcon, - alt: 'RainIcon', - }; - case 'Mist': - return { - src: HazeIcon, - alt: 'HazeIcon', - }; - case 'Moderate Rain': - return { - src: RainIcon, - alt: 'RainIcon', - }; - case 'Mostly Cloudy': - return { - src: CloudyIcon, - alt: 'CloudyIcon', - }; - case 'Overcast Clouds': - return { - src: PartlyCloudyIcon, - alt: 'PartlyCloudyIcon', - }; - case 'Patchy Fog': - return { - src: HazeIcon, - alt: 'HazeIcon', - }; - case 'Partly Sunny': - return { - src: PartlyCloudyIcon, - alt: 'PartlyCloudyIcon', - }; - case 'Rain': - return { - src: RainIcon, - alt: 'RainIcon', - }; - case 'Scattered Clouds': - return { - src: PartlyCloudyIcon, - alt: 'PartlyCloudyIcon', - }; - case 'Showers': - return { - src: RainIcon, - alt: 'RainIcon', - }; - case 'Sleet': - return { - src: SleetIcon, - alt: 'SleetIcon', - }; - case 'Smoke': - return { - src: HazeIcon, - alt: 'HazeIcon', - }; - case 'Snow': + case 86: return { src: SnowIcon, alt: 'SnowIcon', }; - case 'Squall': - return { - src: WindyIcon, - alt: 'WindyIcon', - }; - case 'Thunderstorm': + + case 95: return { src: ThunderstormIcon, alt: 'ThunderstormIcon', }; - case 'Tornado': + case 96: return { - src: WindyIcon, - alt: 'WindyIcon', + src: ThunderstormIcon, + alt: 'ThunderstormIcon', + }; + case 99: + return { + src: ThunderstormIcon, + alt: 'ThunderstormIcon', }; default: @@ -182,61 +179,14 @@ export default function WeatherIcon({ }; return ( - <> - {icon.length === 1 ? ( - {lookupSource(icon[0]).alt} - ) : ( - - {lookupSource(icon[0]).alt} - {lookupSource(icon[1]).alt} - - - )} - + {lookupSource(code).alt} ); } diff --git a/src/components/WeatherModal/WeatherModal.tsx b/src/components/WeatherModal/WeatherModal.tsx index 1b250f1..b3ce868 100644 --- a/src/components/WeatherModal/WeatherModal.tsx +++ b/src/components/WeatherModal/WeatherModal.tsx @@ -1,34 +1,23 @@ import { Center, Group, Modal, Stack, Text } from '@mantine/core'; -import { useCommonHooks, useWeatherAPI } from 'hooks'; +import { useCommonHooks } from 'hooks'; import { modalClasses } from 'styles'; - -import type { CurrentWeather as CW, ExtendedForecast, HourlyForecast } from 'types'; +import type { MeteoWeather } from 'types'; import CurrentWeather from './CurrentWeather'; import ExtendedForecastCard from './ExtendedForecastCard'; import WeatherGraphs from './WeatherGraphs'; export function WeatherModal({ current, - extendedForecast, weatherModalOpened, handleResetSearch, closeWeatherModal, }: { - current: CW; - extendedForecast: ExtendedForecast[]; + current: MeteoWeather | undefined; weatherModalOpened: boolean; handleResetSearch: () => void; closeWeatherModal: () => void; }) { - const { isMobile, currentUser, currentLocation } = useCommonHooks(); - const { data: hourly } = useWeatherAPI({ - endpoint: 'hourly', - office: currentLocation.office, - x: currentLocation.x, - y: currentLocation.y, - }); - const hourlyForecast: HourlyForecast[] = - hourly?.properties?.periods?.slice(1, 25) || []; + const { isMobile, currentUser } = useCommonHooks(); return ( - - + + diff --git a/src/components/WeatherModal/WeatherTooltip.tsx b/src/components/WeatherModal/WeatherTooltip.tsx index 37a38f8..6622570 100644 --- a/src/components/WeatherModal/WeatherTooltip.tsx +++ b/src/components/WeatherModal/WeatherTooltip.tsx @@ -10,6 +10,9 @@ function WeatherTooltip({ payload, active }: any) { borderRadius: '8px', }} > + + {payload[0]?.payload.startTime?.toLocaleString()} + {payload.map((item: any) => ( { - const response = await fetch(url); - if (!response.ok) { - throw new Error(`${response.status} ${response.statusText}`); - } - return await response.json(); + +const callWeatherEndpoint = async (lat: number, lon: number) => { + const weatherParams = { + latitude: lat, + longitude: lon, + daily: [ + 'sunrise', + 'sunset', + 'daylight_duration', + 'sunshine_duration', + 'uv_index_max', + 'uv_index_clear_sky_max', + 'temperature_2m_max', + 'temperature_2m_min', + 'apparent_temperature_max', + 'apparent_temperature_min', + 'wind_speed_10m_max', + 'wind_gusts_10m_max', + 'wind_direction_10m_dominant', + 'precipitation_sum', + 'precipitation_hours', + 'precipitation_probability_max', + 'weather_code', + ], + hourly: [ + 'temperature_2m', + 'relative_humidity_2m', + 'dew_point_2m', + 'apparent_temperature', + 'precipitation_probability', + 'precipitation', + 'rain', + 'showers', + 'snowfall', + 'snow_depth', + 'weather_code', + 'pressure_msl', + 'surface_pressure', + 'cloud_cover', + 'cloud_cover_low', + 'cloud_cover_mid', + 'cloud_cover_high', + 'visibility', + 'evapotranspiration', + 'et0_fao_evapotranspiration', + 'vapour_pressure_deficit', + 'wind_speed_10m', + 'wind_direction_10m', + 'wind_gusts_10m', + 'uv_index', + 'uv_index_clear_sky', + 'is_day', + 'sunshine_duration', + ], + current: [ + 'temperature_2m', + 'relative_humidity_2m', + 'apparent_temperature', + 'is_day', + 'wind_speed_10m', + 'wind_direction_10m', + 'wind_gusts_10m', + 'precipitation', + 'rain', + 'showers', + 'snowfall', + 'surface_pressure', + 'pressure_msl', + 'cloud_cover', + 'weather_code', + ], + wind_speed_unit: 'mph', + temperature_unit: 'fahrenheit', + precipitation_unit: 'inch', + }; + + const url = 'https://api.open-meteo.com/v1/forecast'; + const responses = await fetchWeatherApi(url, weatherParams); + + const response = responses[0]; + + const current = response ? response.current() : null; + const hourly = response ? response.hourly() : null; + const daily = response ? response.daily() : null; + + const sunrise = daily?.variables(0); + const sunset = daily?.variables(1); + const utcOffsetSeconds = response.utcOffsetSeconds(); + const weatherData = { + current: { + time: new Date((Number(current?.time()) + utcOffsetSeconds) * 1000), + temperature_2m: current?.variables(0)?.value(), + relative_humidity_2m: current?.variables(1)?.value(), + apparent_temperature: current?.variables(2)?.value(), + is_day: current?.variables(3)?.value(), + wind_speed_10m: current?.variables(4)?.value(), + wind_direction_10m: current?.variables(5)?.value(), + wind_gusts_10m: current?.variables(6)?.value(), + precipitation: current?.variables(7)?.value(), + rain: current?.variables(8)?.value(), + showers: current?.variables(9)?.value(), + snowfall: current?.variables(10)?.value(), + surface_pressure: current?.variables(11)?.value(), + pressure_msl: current?.variables(12)?.value(), + cloud_cover: current?.variables(13)?.value(), + weather_code: current?.variables(14)?.value(), + }, + hourly: { + time: Array.from( + { + length: + (Number(hourly?.timeEnd()) - Number(hourly?.time())) / + Number(hourly?.interval()), + }, + (_, i) => + new Date( + (Number(hourly?.time()) + i * Number(hourly?.interval()) + utcOffsetSeconds) * + 1000, + ), + ), + temperature_2m: hourly?.variables(0)?.valuesArray(), + relative_humidity_2m: hourly?.variables(1)?.valuesArray(), + dew_point_2m: hourly?.variables(2)?.valuesArray(), + apparent_temperature: hourly?.variables(3)?.valuesArray(), + precipitation_probability: hourly?.variables(4)?.valuesArray(), + precipitation: hourly?.variables(5)?.valuesArray(), + rain: hourly?.variables(6)?.valuesArray(), + showers: hourly?.variables(7)?.valuesArray(), + snowfall: hourly?.variables(8)?.valuesArray(), + snow_depth: hourly?.variables(9)?.valuesArray(), + weather_code: hourly?.variables(10)?.valuesArray(), + pressure_msl: hourly?.variables(11)?.valuesArray(), + surface_pressure: hourly?.variables(12)?.valuesArray(), + cloud_cover: hourly?.variables(13)?.valuesArray(), + cloud_cover_low: hourly?.variables(14)?.valuesArray(), + cloud_cover_mid: hourly?.variables(15)?.valuesArray(), + cloud_cover_high: hourly?.variables(16)?.valuesArray(), + visibility: hourly?.variables(17)?.valuesArray(), + evapotranspiration: hourly?.variables(18)?.valuesArray(), + et0_fao_evapotranspiration: hourly?.variables(19)?.valuesArray(), + vapour_pressure_deficit: hourly?.variables(20)?.valuesArray(), + wind_speed_10m: hourly?.variables(21)?.valuesArray(), + wind_direction_10m: hourly?.variables(22)?.valuesArray(), + wind_gusts_10m: hourly?.variables(23)?.valuesArray(), + uv_index: hourly?.variables(24)?.valuesArray(), + uv_index_clear_sky: hourly?.variables(25)?.valuesArray(), + is_day: hourly?.variables(26)?.valuesArray(), + sunshine_duration: hourly?.variables(27)?.valuesArray(), + }, + daily: { + time: Array.from( + { + length: + (Number(daily?.timeEnd()) - Number(daily?.time())) / + Number(daily?.interval()), + }, + (_, i) => + new Date( + (Number(daily?.time()) + i * Number(daily?.interval()) + utcOffsetSeconds) * + 1000, + ), + ), + // Map Int64 values to according structure + sunrise: [new Array(sunrise?.valuesInt64Length())].map( + (_, i) => new Date((Number(sunrise?.valuesInt64(i)) + utcOffsetSeconds) * 1000), + ), + // Map Int64 values to according structure + sunset: [new Array(sunset?.valuesInt64Length())].map( + (_, i) => new Date((Number(sunset?.valuesInt64(i)) + utcOffsetSeconds) * 1000), + ), + daylight_duration: daily?.variables(2)?.valuesArray(), + sunshine_duration: daily?.variables(3)?.valuesArray(), + uv_index_max: daily?.variables(4)?.valuesArray(), + uv_index_clear_sky_max: daily?.variables(5)?.valuesArray(), + temperature_2m_max: daily?.variables(6)?.valuesArray(), + temperature_2m_min: daily?.variables(7)?.valuesArray(), + apparent_temperature_max: daily?.variables(8)?.valuesArray(), + apparent_temperature_min: daily?.variables(9)?.valuesArray(), + wind_speed_10m_max: daily?.variables(10)?.valuesArray(), + wind_gusts_10m_max: daily?.variables(11)?.valuesArray(), + wind_direction_10m_dominant: daily?.variables(12)?.valuesArray(), + precipitation_sum: daily?.variables(13)?.valuesArray(), + precipitation_hours: daily?.variables(14)?.valuesArray(), + precipitation_probability_max: daily?.variables(15)?.valuesArray(), + weather_code: daily?.variables(16)?.valuesArray(), + }, + }; + + return weatherData; }; export function useQueryAPI({ endpoint }: { endpoint: string }) { const callEndpoint = async (endpoint: string) => { @@ -143,54 +327,10 @@ export function useMutationAPI() { }); } -export function useWeatherAPI({ - endpoint, - lat, - lon, - office, - station, - x, - y, -}: { - endpoint: string; - lat?: number; - lon?: number; - office?: string; - station?: string; - x?: number; - y?: number; -}) { - let url = ''; - if (endpoint === 'baseline') { - url = `https://api.weather.gov/gridpoints/${office}/${x},${y}`; - } else if (endpoint === 'current') { - url = `https://api.weather.gov/stations/${station}/observations`; - } else if (endpoint === 'forecast') { - url = `https://api.weather.gov/gridpoints/${office}/${x},${y}/forecast`; - } else if (endpoint === 'hourly') { - url = `https://api.weather.gov/gridpoints/${office}/${x},${y}/forecast/hourly`; - } else if (endpoint === 'points') { - url = `https://api.weather.gov/points/${lat},${lon}`; - } else if (endpoint === 'stations') { - url = `https://api.weather.gov/gridpoints/${office}/${x},${y}/stations`; - } - +export function useOpenMeteoAPI({ lat, lon }: { lat: number; lon: number }) { return useQuery({ - queryKey: ['GET', url], - queryFn: () => callEndpoint(url), - }); -} - -export function useSunStateAPI({ lat, lon }: { lat: number; lon: number }) { - const date = new Date(); - const today = `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`; - date.setDate(date.getDate() + 1); - const tomorrow = `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`; - const url = `https://api.sunrisesunset.io/json?lat=${lat}&lng=${lon}&date_start=${today}&date_end=${tomorrow}`; - - return useQuery({ - queryKey: ['GET', url], - queryFn: () => callEndpoint(url), + queryKey: ['GET', 'weather'], + queryFn: () => callWeatherEndpoint(lat, lon), }); } diff --git a/src/hooks/useCommonHooks.ts b/src/hooks/useCommonHooks.ts index b3d1b45..ec99fcf 100644 --- a/src/hooks/useCommonHooks.ts +++ b/src/hooks/useCommonHooks.ts @@ -108,10 +108,6 @@ export function useCommonHooks() { const [currentLocation, setCurrentLocation] = useLocalStorage({ key: 'location', defaultValue: { - office: 'HGX', - station: 'KHOU', - x: 65, - y: 96, lat: 29.750950134386066, lon: -95.36220654860034, }, diff --git a/src/pages/homepage/Homepage.tsx b/src/pages/homepage/Homepage.tsx index 0b0d299..54c23b1 100644 --- a/src/pages/homepage/Homepage.tsx +++ b/src/pages/homepage/Homepage.tsx @@ -1,15 +1,10 @@ import { Box, Grid, Stack } from '@mantine/core'; import { useDisclosure } from '@mantine/hooks'; -import CurrentWeather from 'components/WeatherModal/CurrentWeather'; -import { useCommonHooks, useOSMAPI, useQueryAPI, useWeatherAPI } from 'hooks'; +import { useCommonHooks, useOpenMeteoAPI, useOSMAPI, useQueryAPI } from 'hooks'; import { useEffect, useState } from 'react'; import { stackClasses } from 'styles'; -import type { - CurrentWeather as CW, - ExtendedForecast, - Message, - PersonalData, -} from 'types'; +import type { Message, MeteoWeather, PersonalData } from 'types'; +import CurrentWeather from '../../components/WeatherModal/CurrentWeather'; import { Applications, Bookmarks, @@ -48,73 +43,19 @@ export function Homepage() { const { data: weatherMetadata } = useOSMAPI({ address: personalData?.[0]?.physicalAddress, }); - const { data: points } = useWeatherAPI({ - endpoint: 'points', + const { data: meteoWeather } = useOpenMeteoAPI({ lat: weatherMetadata?.[0].lat ?? currentLocation.lat, lon: weatherMetadata?.[0].lon ?? currentLocation.lon, }); - const { data: basicWeather } = useWeatherAPI({ - endpoint: 'baseline', - office: points?.properties.gridId ?? currentLocation.office, - x: points?.properties.gridX ?? currentLocation.x, - y: points?.properties.gridY ?? currentLocation.y, - }); - const { data: stations } = useWeatherAPI({ - endpoint: 'stations', - office: points?.properties.gridId ?? currentLocation.office, - x: points?.properties.gridX ?? currentLocation.x, - y: points?.properties.gridY ?? currentLocation.y, - }); - const { data: weather } = useWeatherAPI({ - endpoint: 'current', - station: - stations?.features[0].properties.stationIdentifier ?? currentLocation.station, - }); - const { data: forecast } = useWeatherAPI({ - endpoint: 'forecast', - office: points?.properties.gridId ?? currentLocation.office, - x: points?.properties.gridX ?? currentLocation.x, - y: points?.properties.gridY ?? currentLocation.y, - }); const personal: PersonalData = personalData?.[0]; const message: Message = messageData?.[0] || {}; const [displayedGreeting, setDisplayedGreeting] = useState(''); - const [current, setCurrent] = useState({ - icon: '', - textDescription: '', - temperature: 0, - highTemp: 0, - lowTemp: 0, - precipitation: 'N/A', - humidity: 0, - heatIndex: null, - windChill: null, - windSpeed: 0, - windDirection: 0, - pressure: 0, - }); + + const [meteoCurrent, setMeteoCurrent] = useState(); const [providerModalOpened, { open: openProviderModal, close: closeProviderModal }] = useDisclosure(false); - const extendedForecast = forecast?.properties?.periods.map( - (item: ExtendedForecast) => ({ - detailedForecast: item.detailedForecast, - isDaytime: item.isDaytime, - name: item.name, - shortForecast: item.shortForecast, - temperature: item.temperature, - temperatureUnit: item.temperatureUnit, - }), - ) || [ - { - detailedForecast: '', - isDaytime: true, - name: '', - shortForecast: '', - temperature: 0, - temperatureUnit: 'F', - }, - ]; + const [weatherModalOpened, { open: openWeatherModal, close: closeWeatherModal }] = useDisclosure(false); @@ -142,59 +83,16 @@ export function Homepage() { }); } }, [message, personal]); + useEffect(() => { - if (weather !== undefined && basicWeather !== undefined) { - setCurrent({ - icon: weather.features[0]?.properties.icon?.replace('medium', 'large') ?? '', - textDescription: weather.features[0]?.properties.textDescription, - temperature: Math.round( - (weather.features?.find((feature: any) => feature.properties.temperature.value) - .properties.temperature.value * - 9) / - 5 + - 32, - ), - highTemp: Math.round( - (basicWeather.properties.maxTemperature.values[0].value * 9) / 5 + 32, - ), - lowTemp: Math.round( - (basicWeather.properties.minTemperature.values[0].value * 9) / 5 + 32, - ), - precipitation: - weather.features[0]?.properties?.precipitationLastHour?.value ?? 'N/A', - humidity: Math.round(weather.features[0]?.properties?.relativeHumidity?.value), - heatIndex: - basicWeather.properties.heatIndex?.values[0].value === null - ? null - : Math.round( - (basicWeather.properties.heatIndex.values[0].value * 9) / 5 + 32, - ), - windChill: - basicWeather.properties.windChill?.values[0].value === null - ? null - : Math.round( - (basicWeather.properties.windChill.values[0].value * 9) / 5 + 32, - ), - windSpeed: Math.round(weather.features[0]?.properties.windSpeed.value / 1.60934), - windDirection: weather.features[0]?.properties.windDirection.value, - pressure: Math.round( - weather.features[0]?.properties.barometricPressure.value / 3386.38, - ), - }); - } - }, [weather, basicWeather]); - useEffect(() => { - if (forecast) { + if (meteoWeather) { + setMeteoCurrent(meteoWeather); setCurrentLocation({ - office: points?.properties.gridId, - station: stations?.features[0].properties.stationIdentifier, - x: points?.properties.gridX, - y: points?.properties.gridY, lat: weatherMetadata?.[0].lat, lon: weatherMetadata?.[0].lon, }); } - }, [forecast]); + }, [meteoWeather]); return ( 0 || bookmarkFilter.length > 0 ? ( <> @@ -231,12 +128,11 @@ export function Homepage() { - + {meteoCurrent && } void; }) { const [time, setTime] = useState(new Date()); @@ -101,7 +101,7 @@ export function Header({ textShadow: theme.textShadowsEnabled ? textShadowStyle : undefined, }} > - {current.temperature}°F + {current?.current.temperature_2m?.toFixed(0)}°F - {current.highTemp}°F/{current.lowTemp}°F + {current?.daily.temperature_2m_max?.[0].toFixed(0)}°F/ + {current?.daily.temperature_2m_min?.[0].toFixed(0)}°F void; openWeatherModal: () => void; @@ -647,7 +644,6 @@ export function Search({ {weatherModalOpened && ( | null | undefined; + cloud_cover: Float32Array | null | undefined; + cloud_cover_high: Float32Array | null | undefined; + cloud_cover_mid: Float32Array | null | undefined; + cloud_cover_low: Float32Array | null | undefined; + dew_point_2m: Float32Array | null | undefined; + et0_fao_evapotranspiration: Float32Array | null | undefined; + evapotranspiration: Float32Array | null | undefined; + is_day: Float32Array | null | undefined; + precipitation: Float32Array | null | undefined; + precipitation_probability: Float32Array | null | undefined; + pressure_msl: Float32Array | null | undefined; + rain: Float32Array | null | undefined; + relative_humidity_2m: Float32Array | null | undefined; + showers: Float32Array | null | undefined; + snow_depth: Float32Array | null | undefined; + snowfall: Float32Array | null | undefined; + sunshine_duration: Float32Array | null | undefined; + surface_pressure: Float32Array | null | undefined; + temperature_2m: Float32Array | null | undefined; + time: Date[]; + uv_index_clear_sky: Float32Array | null | undefined; + uv_index: Float32Array | null | undefined; + vapour_pressure_deficit: Float32Array | null | undefined; + visibility: Float32Array | null | undefined; + weather_code: Float32Array | null | undefined; + wind_direction_10m: Float32Array | null | undefined; + wind_gusts_10m: Float32Array | null | undefined; + wind_speed_10m: Float32Array | null | undefined; +} + +export interface Daily { + apparent_temperature_max: Float32Array | null | undefined; + apparent_temperature_min: Float32Array | null | undefined; + daylight_duration: Float32Array | null | undefined; + precipitation_hours: Float32Array | null | undefined; + precipitation_probability_max: Float32Array | null | undefined; + precipitation_sum: Float32Array | null | undefined; + sunrise: Date[]; + sunset: Date[]; + sunshine_duration: Float32Array | null | undefined; + temperature_2m_max: Float32Array | null | undefined; + temperature_2m_min: Float32Array | null | undefined; + time: Date[]; + uv_index_clear_sky_max: Float32Array | null | undefined; + uv_index_max: Float32Array | null | undefined; + weather_code: Float32Array | null | undefined; + wind_direction_10m_dominant: Float32Array | null | undefined; + wind_gusts_10m_max: Float32Array | null | undefined; + wind_speed_10m_max: Float32Array | null | undefined; +} diff --git a/tsconfig.app.json b/tsconfig.app.json deleted file mode 100644 index 4c7ac8c..0000000 --- a/tsconfig.app.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", - "target": "es2023", - "lib": ["ES2023", "DOM"], - "module": "esnext", - "types": ["vite/client"], - "skipLibCheck": true, - "composite": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": false, - "verbatimModuleSyntax": true, - "moduleDetection": "force", - "noEmit": false, - "jsx": "react-jsx", - - /* Linting */ - "noUnusedLocals": true, - "noUnusedParameters": true, - "erasableSyntaxOnly": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"] -} diff --git a/tsconfig.json b/tsconfig.json index 0a486c8..f037d76 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,17 +1,16 @@ { "compilerOptions": { - "target": "ES2020", + "target": "ES2022", "useDefineForClassFields": true, - "module": "nodenext", + "module": "ES2022", "skipLibCheck": true, - "rootDir": "./src", "allowJs": false, "lib": ["ESNext", "DOM"], "allowSyntheticDefaultImports": true, "types": ["vite/client", "vitest"], /* Bundler mode */ - "moduleResolution": "nodenext", + "moduleResolution": "bundler", "allowImportingTsExtensions": true, "resolveJsonModule": true, "isolatedModules": true, @@ -25,17 +24,13 @@ "noFallthroughCasesInSwitch": true, "paths": { - "components": ["./components/index.ts"], - "contexts": ["./contexts/index.ts"], - "hooks": ["./hooks/index.ts"], - "pages": ["./pages/index.ts"], - "styles": ["./styles/index.ts"], - "types": ["./types/index.ts"] + "components": ["./src/components/index.ts"], + "contexts": ["./src/contexts/index.ts"], + "hooks": ["./src/hooks/index.ts"], + "pages": ["./src/pages/index.ts"], + "styles": ["./src/styles/index.ts"], + "types": ["./src/types/index.ts"] } }, "include": ["src"], - "references": [ - { "path": "./tsconfig.node.json" }, - { "path": "./tsconfig.app.json" } - ] } diff --git a/tsconfig.node.json b/tsconfig.node.json deleted file mode 100644 index 7242f5d..0000000 --- a/tsconfig.node.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", - "target": "es2023", - "lib": ["ES2023"], - "module": "esnext", - "types": ["node"], - "skipLibCheck": true, - "composite": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": false, - "verbatimModuleSyntax": true, - "moduleDetection": "force", - "noEmit": false, - - /* Linting */ - "noUnusedLocals": true, - "noUnusedParameters": true, - "erasableSyntaxOnly": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["vite.config.ts"] -}