diff --git a/package-lock.json b/package-lock.json index cf939273..8d5ec593 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1159,9 +1159,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.9.tgz", + "integrity": "sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==", "cpu": [ "arm" ], @@ -1172,9 +1172,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.9.tgz", + "integrity": "sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==", "cpu": [ "arm64" ], @@ -1185,9 +1185,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz", + "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==", "cpu": [ "arm64" ], @@ -1198,9 +1198,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz", + "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==", "cpu": [ "x64" ], @@ -1211,9 +1211,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.9.tgz", + "integrity": "sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==", "cpu": [ "arm64" ], @@ -1224,9 +1224,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.9.tgz", + "integrity": "sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==", "cpu": [ "x64" ], @@ -1237,9 +1237,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.9.tgz", + "integrity": "sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==", "cpu": [ "arm" ], @@ -1250,9 +1250,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.9.tgz", + "integrity": "sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==", "cpu": [ "arm" ], @@ -1263,9 +1263,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz", + "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==", "cpu": [ "arm64" ], @@ -1276,9 +1276,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz", + "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==", "cpu": [ "arm64" ], @@ -1289,9 +1289,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.9.tgz", + "integrity": "sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==", "cpu": [ "loong64" ], @@ -1302,9 +1302,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.9.tgz", + "integrity": "sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==", "cpu": [ "ppc64" ], @@ -1315,9 +1315,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.9.tgz", + "integrity": "sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==", "cpu": [ "riscv64" ], @@ -1328,9 +1328,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.9.tgz", + "integrity": "sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==", "cpu": [ "s390x" ], @@ -1341,9 +1341,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz", + "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==", "cpu": [ "x64" ], @@ -1354,9 +1354,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz", + "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==", "cpu": [ "x64" ], @@ -1367,9 +1367,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz", + "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==", "cpu": [ "arm64" ], @@ -1380,9 +1380,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.9.tgz", + "integrity": "sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==", "cpu": [ "ia32" ], @@ -1393,9 +1393,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz", + "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==", "cpu": [ "x64" ], @@ -1406,42 +1406,42 @@ ] }, "node_modules/@tailwindcss/node": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.8.tgz", - "integrity": "sha512-FKArQpbrbwv08TNT0k7ejYXpF+R8knZFAatNc0acOxbgeqLzwb86r+P3LGOjIeI3Idqe9CVkZrh4GlsJLJKkkw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.0.9.tgz", + "integrity": "sha512-tOJvdI7XfJbARYhxX+0RArAhmuDcczTC46DGCEziqxzzbIaPnfYaIyRT31n4u8lROrsO7Q6u/K9bmQHL2uL1bQ==", "license": "MIT", "dependencies": { "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", - "tailwindcss": "4.0.8" + "tailwindcss": "4.0.9" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.8.tgz", - "integrity": "sha512-KfMcuAu/Iw+DcV1e8twrFyr2yN8/ZDC/odIGta4wuuJOGkrkHZbvJvRNIbQNhGh7erZTYV6Ie0IeD6WC9Y8Hcw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.0.9.tgz", + "integrity": "sha512-eLizHmXFqHswJONwfqi/WZjtmWZpIalpvMlNhTM99/bkHtUs6IqgI1XQ0/W5eO2HiRQcIlXUogI2ycvKhVLNcA==", "license": "MIT", "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.0.8", - "@tailwindcss/oxide-darwin-arm64": "4.0.8", - "@tailwindcss/oxide-darwin-x64": "4.0.8", - "@tailwindcss/oxide-freebsd-x64": "4.0.8", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.8", - "@tailwindcss/oxide-linux-arm64-gnu": "4.0.8", - "@tailwindcss/oxide-linux-arm64-musl": "4.0.8", - "@tailwindcss/oxide-linux-x64-gnu": "4.0.8", - "@tailwindcss/oxide-linux-x64-musl": "4.0.8", - "@tailwindcss/oxide-win32-arm64-msvc": "4.0.8", - "@tailwindcss/oxide-win32-x64-msvc": "4.0.8" + "@tailwindcss/oxide-android-arm64": "4.0.9", + "@tailwindcss/oxide-darwin-arm64": "4.0.9", + "@tailwindcss/oxide-darwin-x64": "4.0.9", + "@tailwindcss/oxide-freebsd-x64": "4.0.9", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.9", + "@tailwindcss/oxide-linux-arm64-gnu": "4.0.9", + "@tailwindcss/oxide-linux-arm64-musl": "4.0.9", + "@tailwindcss/oxide-linux-x64-gnu": "4.0.9", + "@tailwindcss/oxide-linux-x64-musl": "4.0.9", + "@tailwindcss/oxide-win32-arm64-msvc": "4.0.9", + "@tailwindcss/oxide-win32-x64-msvc": "4.0.9" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.8.tgz", - "integrity": "sha512-We7K79+Sm4mwJHk26Yzu/GAj7C7myemm7PeXvpgMxyxO70SSFSL3uCcqFbz9JA5M5UPkrl7N9fkBe/Y0iazqpA==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.0.9.tgz", + "integrity": "sha512-YBgy6+2flE/8dbtrdotVInhMVIxnHJPbAwa7U1gX4l2ThUIaPUp18LjB9wEH8wAGMBZUb//SzLtdXXNBHPUl6Q==", "cpu": [ "arm64" ], @@ -1455,9 +1455,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.8.tgz", - "integrity": "sha512-Lv9Isi2EwkCTG1sRHNDi0uRNN1UGFdEThUAGFrydRmQZnraGLMjN8gahzg2FFnOizDl7LB2TykLUuiw833DSNg==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.0.9.tgz", + "integrity": "sha512-pWdl4J2dIHXALgy2jVkwKBmtEb73kqIfMpYmcgESr7oPQ+lbcQ4+tlPeVXaSAmang+vglAfFpXQCOvs/aGSqlw==", "cpu": [ "arm64" ], @@ -1471,9 +1471,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.8.tgz", - "integrity": "sha512-fWfywfYIlSWtKoqWTjukTHLWV3ARaBRjXCC2Eo0l6KVpaqGY4c2y8snUjp1xpxUtpqwMvCvFWFaleMoz1Vhzlw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.0.9.tgz", + "integrity": "sha512-4Dq3lKp0/C7vrRSkNPtBGVebEyWt9QPPlQctxJ0H3MDyiQYvzVYf8jKow7h5QkWNe8hbatEqljMj/Y0M+ERYJg==", "cpu": [ "x64" ], @@ -1487,9 +1487,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.8.tgz", - "integrity": "sha512-SO+dyvjJV9G94bnmq2288Ke0BIdvrbSbvtPLaQdqjqHR83v5L2fWADyFO+1oecHo9Owsk8MxcXh1agGVPIKIqw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.0.9.tgz", + "integrity": "sha512-k7U1RwRODta8x0uealtVt3RoWAWqA+D5FAOsvVGpYoI6ObgmnzqWW6pnVwz70tL8UZ/QXjeMyiICXyjzB6OGtQ==", "cpu": [ "x64" ], @@ -1503,9 +1503,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.8.tgz", - "integrity": "sha512-ZSHggWiEblQNV69V0qUK5vuAtHP+I+S2eGrKGJ5lPgwgJeAd6GjLsVBN+Mqn2SPVfYM3BOpS9jX/zVg9RWQVDQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.0.9.tgz", + "integrity": "sha512-NDDjVweHz2zo4j+oS8y3KwKL5wGCZoXGA9ruJM982uVJLdsF8/1AeKvUwKRlMBpxHt1EdWJSAh8a0Mfhl28GlQ==", "cpu": [ "arm" ], @@ -1519,9 +1519,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.8.tgz", - "integrity": "sha512-xWpr6M0OZLDNsr7+bQz+3X7zcnDJZJ1N9gtBWCtfhkEtDjjxYEp+Lr5L5nc/yXlL4MyCHnn0uonGVXy3fhxaVA==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.0.9.tgz", + "integrity": "sha512-jk90UZ0jzJl3Dy1BhuFfRZ2KP9wVKMXPjmCtY4U6fF2LvrjP5gWFJj5VHzfzHonJexjrGe1lMzgtjriuZkxagg==", "cpu": [ "arm64" ], @@ -1535,9 +1535,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.8.tgz", - "integrity": "sha512-5tz2IL7LN58ssGEq7h/staD7pu/izF/KeMWdlJ86WDe2Ah46LF3ET6ZGKTr5eZMrnEA0M9cVFuSPprKRHNgjeg==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.0.9.tgz", + "integrity": "sha512-3eMjyTC6HBxh9nRgOHzrc96PYh1/jWOwHZ3Kk0JN0Kl25BJ80Lj9HEvvwVDNTgPg154LdICwuFLuhfgH9DULmg==", "cpu": [ "arm64" ], @@ -1551,9 +1551,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.8.tgz", - "integrity": "sha512-KSzMkhyrxAQyY2o194NKVKU9j/c+NFSoMvnHWFaNHKi3P1lb+Vq1UC19tLHrmxSkKapcMMu69D7+G1+FVGNDXQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.0.9.tgz", + "integrity": "sha512-v0D8WqI/c3WpWH1kq/HP0J899ATLdGZmENa2/emmNjubT0sWtEke9W9+wXeEoACuGAhF9i3PO5MeyditpDCiWQ==", "cpu": [ "x64" ], @@ -1567,9 +1567,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.8.tgz", - "integrity": "sha512-yFYKG5UtHTRimjtqxUWXBgI4Tc6NJe3USjRIVdlTczpLRxq/SFwgzGl5JbatCxgSRDPBFwRrNPxq+ukfQFGdrw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.0.9.tgz", + "integrity": "sha512-Kvp0TCkfeXyeehqLJr7otsc4hd/BUPfcIGrQiwsTVCfaMfjQZCG7DjI+9/QqPZha8YapLA9UoIcUILRYO7NE1Q==", "cpu": [ "x64" ], @@ -1583,9 +1583,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.8.tgz", - "integrity": "sha512-tndGujmCSba85cRCnQzXgpA2jx5gXimyspsUYae5jlPyLRG0RjXbDshFKOheVXU4TLflo7FSG8EHCBJ0EHTKdQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.0.9.tgz", + "integrity": "sha512-m3+60T/7YvWekajNq/eexjhV8z10rswcz4BC9bioJ7YaN+7K8W2AmLmG0B79H14m6UHE571qB0XsPus4n0QVgQ==", "cpu": [ "arm64" ], @@ -1599,9 +1599,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.8.tgz", - "integrity": "sha512-T77jroAc0p4EHVVgTUiNeFn6Nj3jtD3IeNId2X+0k+N1XxfNipy81BEkYErpKLiOkNhpNFjPee8/ZVas29b2OQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.0.9.tgz", + "integrity": "sha512-dpc05mSlqkwVNOUjGu/ZXd5U1XNch1kHFJ4/cHkZFvaW1RzbHmRt24gvM8/HC6IirMxNarzVw4IXVtvrOoZtxA==", "cpu": [ "x64" ], @@ -1615,15 +1615,15 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.8.tgz", - "integrity": "sha512-+SAq44yLzYlzyrb7QTcFCdU8Xa7FOA0jp+Xby7fPMUie+MY9HhJysM7Vp+vL8qIp8ceQJfLD+FjgJuJ4lL6nyg==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.0.9.tgz", + "integrity": "sha512-BIKJO+hwdIsN7V6I7SziMZIVHWWMsV/uCQKYEbeiGRDRld+TkqyRRl9+dQ0MCXbhcVr+D9T/qX2E84kT7V281g==", "license": "MIT", "dependencies": { - "@tailwindcss/node": "4.0.8", - "@tailwindcss/oxide": "4.0.8", + "@tailwindcss/node": "4.0.9", + "@tailwindcss/oxide": "4.0.9", "lightningcss": "^1.29.1", - "tailwindcss": "4.0.8" + "tailwindcss": "4.0.9" }, "peerDependencies": { "vite": "^5.2.0 || ^6" @@ -1673,9 +1673,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.13.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz", - "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==", + "version": "22.13.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.8.tgz", + "integrity": "sha512-G3EfaZS+iOGYWLLRCEAXdWK9my08oHNZ+FHluRiggIYJPOXzhOiDgpVCUHaUvyIC5/fj7C/p637jdzC666AOKQ==", "devOptional": true, "license": "MIT", "dependencies": { @@ -1710,17 +1710,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.24.1.tgz", - "integrity": "sha512-ll1StnKtBigWIGqvYDVuDmXJHVH4zLVot1yQ4fJtLpL7qacwkxJc1T0bptqw+miBQ/QfUbhl1TcQ4accW5KUyA==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.25.0.tgz", + "integrity": "sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/type-utils": "8.24.1", - "@typescript-eslint/utils": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/scope-manager": "8.25.0", + "@typescript-eslint/type-utils": "8.25.0", + "@typescript-eslint/utils": "8.25.0", + "@typescript-eslint/visitor-keys": "8.25.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -1740,16 +1740,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.24.1.tgz", - "integrity": "sha512-Tqoa05bu+t5s8CTZFaGpCH2ub3QeT9YDkXbPd3uQ4SfsLoh1/vv2GEYAioPoxCWJJNsenXlC88tRjwoHNts1oQ==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.25.0.tgz", + "integrity": "sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/scope-manager": "8.25.0", + "@typescript-eslint/types": "8.25.0", + "@typescript-eslint/typescript-estree": "8.25.0", + "@typescript-eslint/visitor-keys": "8.25.0", "debug": "^4.3.4" }, "engines": { @@ -1765,14 +1765,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.24.1.tgz", - "integrity": "sha512-OdQr6BNBzwRjNEXMQyaGyZzgg7wzjYKfX2ZBV3E04hUCBDv3GQCHiz9RpqdUIiVrMgJGkXm3tcEh4vFSHreS2Q==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.25.0.tgz", + "integrity": "sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1" + "@typescript-eslint/types": "8.25.0", + "@typescript-eslint/visitor-keys": "8.25.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1783,14 +1783,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.24.1.tgz", - "integrity": "sha512-/Do9fmNgCsQ+K4rCz0STI7lYB4phTtEXqqCAs3gZW0pnK7lWNkvWd5iW545GSmApm4AzmQXmSqXPO565B4WVrw==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.25.0.tgz", + "integrity": "sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.24.1", - "@typescript-eslint/utils": "8.24.1", + "@typescript-eslint/typescript-estree": "8.25.0", + "@typescript-eslint/utils": "8.25.0", "debug": "^4.3.4", "ts-api-utils": "^2.0.1" }, @@ -1807,9 +1807,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.24.1.tgz", - "integrity": "sha512-9kqJ+2DkUXiuhoiYIUvIYjGcwle8pcPpdlfkemGvTObzgmYfJ5d0Qm6jwb4NBXP9W1I5tss0VIAnWFumz3mC5A==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.25.0.tgz", + "integrity": "sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==", "dev": true, "license": "MIT", "engines": { @@ -1821,14 +1821,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.24.1.tgz", - "integrity": "sha512-UPyy4MJ/0RE648DSKQe9g0VDSehPINiejjA6ElqnFaFIhI6ZEiZAkUI0D5MCk0bQcTf/LVqZStvQ6K4lPn/BRg==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.25.0.tgz", + "integrity": "sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/visitor-keys": "8.24.1", + "@typescript-eslint/types": "8.25.0", + "@typescript-eslint/visitor-keys": "8.25.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -1887,16 +1887,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.24.1.tgz", - "integrity": "sha512-OOcg3PMMQx9EXspId5iktsI3eMaXVwlhC8BvNnX6B5w9a4dVgpkQZuU8Hy67TolKcl+iFWq0XX+jbDGN4xWxjQ==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.25.0.tgz", + "integrity": "sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.24.1", - "@typescript-eslint/types": "8.24.1", - "@typescript-eslint/typescript-estree": "8.24.1" + "@typescript-eslint/scope-manager": "8.25.0", + "@typescript-eslint/types": "8.25.0", + "@typescript-eslint/typescript-estree": "8.25.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1911,13 +1911,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.24.1.tgz", - "integrity": "sha512-EwVHlp5l+2vp8CoqJm9KikPZgi3gbdZAtabKT9KPShGeOcJhsv4Zdo3oc8T8I0uKEmYoU4ItyxbptjF08enaxg==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.25.0.tgz", + "integrity": "sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.24.1", + "@typescript-eslint/types": "8.25.0", "eslint-visitor-keys": "^4.2.0" }, "engines": { @@ -2328,9 +2328,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001700", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", - "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", + "version": "1.0.30001701", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001701.tgz", + "integrity": "sha512-faRs/AW3jA9nTwmJBSO1PQ6L/EOgsB5HMQQq4iCu5zhPgVVgO/pZRHlmatwijZKetFw8/Pr4q6dEN8sJuq8qTw==", "dev": true, "funding": [ { @@ -2731,9 +2731,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.103.tgz", - "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==", + "version": "1.5.109", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.109.tgz", + "integrity": "sha512-AidaH9JETVRr9DIPGfp1kAarm/W6hRJTPuCnkF+2MqhF4KaAgRIcBc8nvjk+YMXZhwfISof/7WG29eS4iGxQLQ==", "dev": true, "license": "ISC" }, @@ -3075,9 +3075,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz", - "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.2.tgz", + "integrity": "sha512-1105/17ZIMjmCOJOPNfVdbXafLCLj3hPmkmB7dLgt7XsQ/zkxSuDerE/xgO3RxoHysR1N1whmquY0lSn2O0VLg==", "dev": true, "license": "MIT", "bin": { @@ -3152,9 +3152,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0.tgz", - "integrity": "sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", "dev": true, "license": "MIT", "engines": { @@ -3352,9 +3352,9 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", - "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", "dev": true, "license": "ISC", "dependencies": { @@ -3488,13 +3488,13 @@ } }, "node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.0", + "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" }, "engines": { @@ -3612,18 +3612,18 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.1", + "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "get-proto": "^1.0.0", + "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", @@ -5558,9 +5558,9 @@ } }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.4.tgz", - "integrity": "sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "dev": true, "funding": [ { @@ -6137,9 +6137,9 @@ } }, "node_modules/prettier": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.2.tgz", - "integrity": "sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", + "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", "dev": true, "license": "MIT", "bin": { @@ -6393,9 +6393,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", "engines": { @@ -6404,9 +6404,9 @@ } }, "node_modules/rollup": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", - "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.9.tgz", + "integrity": "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==", "license": "MIT", "dependencies": { "@types/estree": "1.0.6" @@ -6419,25 +6419,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.8", - "@rollup/rollup-android-arm64": "4.34.8", - "@rollup/rollup-darwin-arm64": "4.34.8", - "@rollup/rollup-darwin-x64": "4.34.8", - "@rollup/rollup-freebsd-arm64": "4.34.8", - "@rollup/rollup-freebsd-x64": "4.34.8", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", - "@rollup/rollup-linux-arm-musleabihf": "4.34.8", - "@rollup/rollup-linux-arm64-gnu": "4.34.8", - "@rollup/rollup-linux-arm64-musl": "4.34.8", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", - "@rollup/rollup-linux-riscv64-gnu": "4.34.8", - "@rollup/rollup-linux-s390x-gnu": "4.34.8", - "@rollup/rollup-linux-x64-gnu": "4.34.8", - "@rollup/rollup-linux-x64-musl": "4.34.8", - "@rollup/rollup-win32-arm64-msvc": "4.34.8", - "@rollup/rollup-win32-ia32-msvc": "4.34.8", - "@rollup/rollup-win32-x64-msvc": "4.34.8", + "@rollup/rollup-android-arm-eabi": "4.34.9", + "@rollup/rollup-android-arm64": "4.34.9", + "@rollup/rollup-darwin-arm64": "4.34.9", + "@rollup/rollup-darwin-x64": "4.34.9", + "@rollup/rollup-freebsd-arm64": "4.34.9", + "@rollup/rollup-freebsd-x64": "4.34.9", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.9", + "@rollup/rollup-linux-arm-musleabihf": "4.34.9", + "@rollup/rollup-linux-arm64-gnu": "4.34.9", + "@rollup/rollup-linux-arm64-musl": "4.34.9", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.9", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.9", + "@rollup/rollup-linux-riscv64-gnu": "4.34.9", + "@rollup/rollup-linux-s390x-gnu": "4.34.9", + "@rollup/rollup-linux-x64-gnu": "4.34.9", + "@rollup/rollup-linux-x64-musl": "4.34.9", + "@rollup/rollup-win32-arm64-msvc": "4.34.9", + "@rollup/rollup-win32-ia32-msvc": "4.34.9", + "@rollup/rollup-win32-x64-msvc": "4.34.9", "fsevents": "~2.3.2" } }, @@ -7043,9 +7043,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.8.tgz", - "integrity": "sha512-Me7N5CKR+D2A1xdWA5t5+kjjT7bwnxZOE6/yDI/ixJdJokszsn2n++mdU5yJwrsTpqFX2B9ZNMBJDwcqk9C9lw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.9.tgz", + "integrity": "sha512-12laZu+fv1ONDRoNR9ipTOpUD7RN9essRVkX36sjxuRUInpN7hIiHN4lBd/SIFjbISvnXzp8h/hXzmU8SQQYhw==", "license": "MIT" }, "node_modules/tailwindcss-animate": { @@ -7233,15 +7233,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.24.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.24.1.tgz", - "integrity": "sha512-cw3rEdzDqBs70TIcb0Gdzbt6h11BSs2pS0yaq7hDWDBtCCSei1pPSUXE9qUdQ/Wm9NgFg8mKtMt1b8fTHIl1jA==", + "version": "8.25.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.25.0.tgz", + "integrity": "sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.24.1", - "@typescript-eslint/parser": "8.24.1", - "@typescript-eslint/utils": "8.24.1" + "@typescript-eslint/eslint-plugin": "8.25.0", + "@typescript-eslint/parser": "8.25.0", + "@typescript-eslint/utils": "8.25.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -7299,9 +7299,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "dev": true, "funding": [ { diff --git a/public/assets/Images/GSOC.png b/public/assets/Images/GSOC.png new file mode 100644 index 00000000..75e1820d Binary files /dev/null and b/public/assets/Images/GSOC.png differ diff --git a/public/assets/Images/SOAS.jpeg b/public/assets/Images/SOAS.jpeg new file mode 100644 index 00000000..f3b00262 Binary files /dev/null and b/public/assets/Images/SOAS.jpeg differ diff --git a/src/components/AboutUs/GoalsSection.tsx b/src/components/AboutUs/GoalsSection.tsx new file mode 100644 index 00000000..854e007c --- /dev/null +++ b/src/components/AboutUs/GoalsSection.tsx @@ -0,0 +1,254 @@ +import { motion } from 'framer-motion'; +import SectionContainer from '@/components/shared/SectionContainer'; +import SectionTitle from '@/components/shared/SectionTitle'; +import { + goals, + progressItems, + sectionContent, +} from '@/constants/aboutUs/goals'; +import { + slideInLeft, + subtleRise, + statCard, + staggerContainer, + container, + statGrid, +} from '@/styles/Animations'; +import { useMemo, FC } from 'react'; + +interface GoalStat { + total: number; + completed: number; + inProgress: number; + percentComplete: number; +} + +const GoalsSection: FC = () => { + const renderProgressBars = (items) => { + return items.map((item, index) => ( + +
+ + {item.label} + + + {item.percent}% + +
+
+ +
+
+ )); + }; + + // Memoize the goal stats for performance + const goalStats: GoalStat = useMemo(() => { + const totalGoals = goals.length; + const completedGoals = progressItems.filter( + (item) => item.percent >= 75, + ).length; + const inProgressGoals = progressItems.filter( + (item) => item.percent >= 25 && item.percent < 75, + ).length; + + return { + total: totalGoals, + completed: completedGoals, + inProgress: inProgressGoals, + percentComplete: Math.round((completedGoals / totalGoals) * 100), + }; + }, []); + + return ( + <> + + {sectionContent.title.main} + {sectionContent.title.highlight} + + +
+
+
+ + {sectionContent.introduction} + + + {/* Dynamic goals rendering from goals array */} + + {goals.map((goal, i) => ( + +

+ {goal.title} +

+

+ {goal.description} +

+
+ ))} +
+
+
+ +
+ + {/* Progress Overview */} +
+

+ {sectionContent.progressTitle} +

+ + {/* Progress summary stats */} + + +

+ {goalStats.total} +

+

Total Goals

+
+ + +

+ {goalStats.completed} +

+

Completed

+
+ + +

+ {goalStats.inProgress} +

+

In Progress

+
+ + +

+ {goalStats.percentComplete}% +

+

Overall Progress

+
+
+ + {/* Overall progress bar */} +
+
+ + Overall Completion + + + {goalStats.percentComplete}% + +
+
+ +
+
+
+ + {/* Individual progress bars */} + +

+ Individual Progress +

+ {renderProgressBars(progressItems)} +
+ + {/* Goal insights */} + +
+ {sectionContent.insightsTitle || 'Progress Insights'} +
+

+ Our goals are on track with {goalStats.percentComplete}% + overall completion. We've fully achieved {goalStats.completed}{' '} + goals, with {goalStats.inProgress} more in progress. We + continue to work towards our mission with steady progress + across all initiatives. +

+
+
+
+
+
+ + ); +}; + +export default GoalsSection; diff --git a/src/components/AboutUs/HeroSection.tsx b/src/components/AboutUs/HeroSection.tsx new file mode 100644 index 00000000..8a81fb2d --- /dev/null +++ b/src/components/AboutUs/HeroSection.tsx @@ -0,0 +1,117 @@ +import { motion } from 'framer-motion'; +import { heroAnimations } from '@/styles/Animations'; + +const HeroSection = () => { + const title = 'ABOUT US'.split(''); + + return ( + + {/* Decorative background elements */} + + + + {/* Main title with animated letters */} + +
+ {title.map((letter, index) => ( + = title.length - 2 ? 'text-red-500' : ''} + > + {letter === ' ' ? '\u00A0' : letter} + + ))} + + {/* Animated underline */} + +
+
+ + {/* Subtitle with animated reveal */} + + + A Community + {' '} + of{' '} + + Open Source + {' '} + Enthusiasts + + + {/* Animated decorative circles */} +
+ {[...Array(6)].map((_, i) => ( + + ))} +
+ + {/* Interactive mouse-follow effect */} + + + ); +}; + +export default HeroSection; diff --git a/src/components/AboutUs/MissionSection.tsx b/src/components/AboutUs/MissionSection.tsx new file mode 100644 index 00000000..2043f7d9 --- /dev/null +++ b/src/components/AboutUs/MissionSection.tsx @@ -0,0 +1,104 @@ +import { motion } from 'framer-motion'; +import SectionContainer from '@/components/shared/SectionContainer'; +import SectionTitle from '@/components/shared/SectionTitle'; +import { content } from '@/constants/aboutUs/mission'; +import { missionSectionAnimations } from '@/styles/Animations'; + +const MissionSection = () => { + return ( + +
+ + + + + {content.title.prefix} + {' '} + + {content.title.highlighted} + + + + + + +
+ +
+ {content.paragraphs.map((paragraph, index) => ( + + {paragraph} + + ))} + + + {content.images.gallery.map((img, index) => ( + + + + ))} + +
+
+ + + + {content.images.main.alt} + + +
+
+
+ ); +}; + +export default MissionSection; diff --git a/src/components/AboutUs/PrinciplesSection.tsx b/src/components/AboutUs/PrinciplesSection.tsx new file mode 100644 index 00000000..fb83c36f --- /dev/null +++ b/src/components/AboutUs/PrinciplesSection.tsx @@ -0,0 +1,111 @@ +import { motion } from 'framer-motion'; +import SectionContainer from '@/components/shared/SectionContainer'; +import SectionTitle from '@/components/shared/SectionTitle'; +import { principles, principlesContent } from '@/constants/aboutUs/principles'; +import { principlesSectionAnimations } from '@/styles/Animations'; + +const PrinciplesSection = () => { + return ( + <> + + + {principlesContent.title.prefix} + {' '} + + {principlesContent.title.highlight} + + + +
+
+
+ + Our Principles + + +
+ +
+ + {principlesContent.description} + +
+
+ + + {principles.map((principle) => ( + + + {principle.title} +
+ + +
+

+ {principle.title} +

+

{principle.description}

+
+ + ))} + +
+ + + ); +}; + +export default PrinciplesSection; diff --git a/src/components/AboutUs/ProjectSection.tsx b/src/components/AboutUs/ProjectSection.tsx new file mode 100644 index 00000000..fee8a0bd --- /dev/null +++ b/src/components/AboutUs/ProjectSection.tsx @@ -0,0 +1,169 @@ +import { motion } from 'framer-motion'; +import SectionContainer from '@/components/shared/SectionContainer'; +import SectionTitle from '@/components/shared/SectionTitle'; +import { projects, projectsContent } from '@/constants/aboutUs/projects'; +import { projectsSectionAnimations } from '@/styles/Animations'; + +const ProjectsSection = () => { + const displayProjects = projects.slice( + 0, + projectsContent.displayProjectCount, + ); + + return ( + + + + + + {projectsContent.title.prefix} + {' '} + + {projectsContent.title.highlight} + + + + + {projectsContent.description && ( + + {projectsContent.description} + + )} + +
+ {displayProjects.map((project, i) => ( + + + {project.title} + + +
+
+

+ {project.title} +

+

{project.description}

+
+ +
+ {project.tags && project.tags.length > 0 && ( +
+ {project.tags.map((tag, tagIndex) => ( + + {tag} + + ))} +
+ )} + + {project.link ? ( + + {projectsContent.ctaText} + + + + + ) : ( + (window.location.href = '#projects')} + > + {projectsContent.ctaText} + + + + + )} +
+
+
+ ))} +
+ + {projects.length > projectsContent.displayProjectCount && ( + + + View all projects + + + + + + )} +
+
+ ); +}; + +export default ProjectsSection; diff --git a/src/components/AboutUs/RoadmapSection.tsx b/src/components/AboutUs/RoadmapSection.tsx new file mode 100644 index 00000000..cf252935 --- /dev/null +++ b/src/components/AboutUs/RoadmapSection.tsx @@ -0,0 +1,101 @@ +import React from 'react'; +import { motion } from 'framer-motion'; +import SectionContainer from '@/components/shared/SectionContainer'; +import SectionTitle from '@/components/shared/SectionTitle'; +import { roadmapItems, roadmapContent } from '@/constants/aboutUs/roadmap'; +import { roadmapSectionAnimations } from '@/styles/animations'; + +const RoadmapSection: React.FC = () => { + return ( + +
+ + + + {roadmapContent.title.prefix} + {' '} + + {roadmapContent.title.highlight} + + + + +
+
+
+ + + {roadmapItems.map((item, index) => ( + + +
+ {index + 1} +
+
+ +
+

+ {item.title} +

+

+ {item.description || 'Milestone in our journey'} +

+
+ + {index < roadmapItems.length - 1 && ( +
+ )} + + ))} +
+
+ + + {roadmapContent.description} + +
+
+ + ); +}; + +export default RoadmapSection; diff --git a/src/components/AboutUs/TextMaskSection.tsx b/src/components/AboutUs/TextMaskSection.tsx new file mode 100644 index 00000000..35f0da07 --- /dev/null +++ b/src/components/AboutUs/TextMaskSection.tsx @@ -0,0 +1,145 @@ +import { motion } from 'framer-motion'; +import { useState, useEffect } from 'react'; + +const TextMaskSection = () => { + const [fontSize, setFontSize] = useState('120'); + useEffect(() => { + const handleResize = () => { + const width = window.innerWidth; + if (width < 640) { + setFontSize('50'); + } else if (width < 768) { + setFontSize('70'); + } else if (width < 1024) { + setFontSize('90'); + } else { + setFontSize('120'); + } + }; + + handleResize(); + + // Add event listener + window.addEventListener('resize', handleResize); + + return () => { + window.removeEventListener('resize', handleResize); + }; + }, []); + + return ( + +
+
+ + +
+ + + + + + + SUGAR LABS + + + + + + + + + +
+ +
+
+
+ +
+ + Innovate. Educate. Transform. + + + + Sugar Labs creates innovative educational tools that transform how + children learn and explore technology. Our community-driven approach + empowers young minds to become creators, not just consumers. + + + +
+
+
+ ); +}; + +export default TextMaskSection; diff --git a/src/components/shared/NavigationLinks.tsx b/src/components/shared/NavigationLinks.tsx new file mode 100644 index 00000000..1de09451 --- /dev/null +++ b/src/components/shared/NavigationLinks.tsx @@ -0,0 +1,190 @@ +import { useEffect, useState, useRef } from 'react'; +import { + navigationSections, + navigationConfig, + navigationStyles, +} from '@/constants/aboutUs/navigation'; + +const NavigationLinks = () => { + const [activeSection, setActiveSection] = useState( + navigationConfig.defaultActiveSection, + ); + const [lastClickedSection, setLastClickedSection] = useState(''); + const foundSections = useRef>({}); + + useEffect(() => { + console.log('Checking for all section elements...'); + + navigationSections.forEach((section) => { + const element = document.getElementById(section.id); + foundSections.current[section.id] = !!element; + + if (!element) { + console.warn( + `Section with ID "${section.id}" not found in the document!`, + ); + } else { + console.log(`Found section: ${section.id}`); + } + }); + }, []); + + useEffect(() => { + const handleScroll = () => { + const sectionElements = navigationSections.map((section) => ({ + id: section.id, + element: document.getElementById(section.id), + })); + + const currentSection = sectionElements.find((section) => { + if (!section.element) return false; + + const rect = section.element.getBoundingClientRect(); + return ( + rect.top <= navigationConfig.activeDetectionOffset && + rect.bottom >= 50 + ); + }); + + const roadmapSection = sectionElements.find( + (s) => s.id === 'roadmap' && s.element, + ); + const isNearBottom = + window.innerHeight + window.scrollY >= document.body.offsetHeight - 100; + + if (isNearBottom && roadmapSection && roadmapSection.element) { + setActiveSection('roadmap'); + } else if (currentSection) { + setActiveSection(currentSection.id); + } else if (lastClickedSection) { + setActiveSection(lastClickedSection); + } + }; + + handleScroll(); + + window.addEventListener('scroll', handleScroll); + window.addEventListener('resize', handleScroll); + + return () => { + window.removeEventListener('scroll', handleScroll); + window.removeEventListener('resize', handleScroll); + }; + }, [lastClickedSection]); + + const scrollToSection = (sectionId: string) => { + let element = document.getElementById(sectionId); + + setLastClickedSection(sectionId); + setActiveSection(sectionId); + + if (!element && sectionId === 'roadmap') { + const alternativeIds = ['road-map', 'road_map', 'Roadmap', 'ROADMAP']; + + for (const altId of alternativeIds) { + element = document.getElementById(altId); + if (element) { + console.log(`Found roadmap with alternative ID: ${altId}`); + break; + } + } + + if (!element) { + const headings = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); + for (const heading of headings) { + if (heading.textContent?.toLowerCase().includes('roadmap')) { + element = + heading.closest('section') || + heading.closest('div') || + heading.parentElement; + console.log('Found roadmap section via heading text'); + break; + } + } + } + + if (!element) { + console.log( + 'Roadmap section not found - scrolling to bottom of the page', + ); + window.scrollTo({ + top: document.documentElement.scrollHeight, + behavior: 'smooth', + }); + return; + } + } + + if (element) { + const navBar = document.querySelector('header, nav:first-of-type'); + const offsetTop = navBar ? navBar.getBoundingClientRect().height : 0; + + const targetPosition = + element.offsetTop - offsetTop - navigationConfig.scrollOffset; + const startPosition = window.pageYOffset; + const distance = targetPosition - startPosition; + const duration = navigationConfig.scrollDuration; + let start: number | null = null; + + const animation = (currentTime: number) => { + if (start === null) start = currentTime; + const timeElapsed = currentTime - start; + const progress = Math.min(timeElapsed / duration, 1); + + const ease = (t: number) => + t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1; + + window.scrollTo(0, startPosition + distance * ease(progress)); + + if (timeElapsed < duration) { + requestAnimationFrame(animation); + } + }; + + requestAnimationFrame(animation); + } else { + console.error( + `Section with ID "${sectionId}" not found in the document!`, + ); + } + }; + + return ( + + ); +}; + +export default NavigationLinks; diff --git a/src/components/shared/SectionContainer.tsx b/src/components/shared/SectionContainer.tsx new file mode 100644 index 00000000..130d8d87 --- /dev/null +++ b/src/components/shared/SectionContainer.tsx @@ -0,0 +1,38 @@ +import { motion } from 'framer-motion'; +import { ReactNode } from 'react'; + +interface SectionContainerProps { + id: string; + children: ReactNode; + reverse?: boolean; +} + +const SectionContainer = ({ + id, + children, + reverse = false, +}: SectionContainerProps) => { + return ( + + {children} + + ); +}; + +export default SectionContainer; diff --git a/src/components/shared/SectionTitle.tsx b/src/components/shared/SectionTitle.tsx new file mode 100644 index 00000000..2a82fac5 --- /dev/null +++ b/src/components/shared/SectionTitle.tsx @@ -0,0 +1,24 @@ +import { motion } from 'framer-motion'; +import { ReactNode } from 'react'; + +const fadeInUp = { + hidden: { opacity: 0, y: 20 }, + visible: { opacity: 1, y: 0, transition: { duration: 0.6 } }, +}; + +interface SectionTitleProps { + children: ReactNode; +} + +const SectionTitle = ({ children }: SectionTitleProps) => { + return ( + + {children} + + ); +}; + +export default SectionTitle; diff --git a/src/constants/aboutUs/goals.ts b/src/constants/aboutUs/goals.ts new file mode 100644 index 00000000..8580d5fc --- /dev/null +++ b/src/constants/aboutUs/goals.ts @@ -0,0 +1,146 @@ +import { MotionProps, Variants } from 'framer-motion'; + +export interface Goal { + title: string; + description: string; +} + +interface ProgressItem extends Variants { + label: string; + percent: number; + color: string; + [key: string]: string | number; +} +export interface SectionContentType { + title: { + main: string; + highlight: string; + }; + introduction: string; + progressTitle: string; + resetViewButtonText: string; + insightsTitle: string; +} + +export interface AnimationsType { + goalItem: { + initial: MotionProps['initial']; + whileInView: MotionProps['whileInView']; + whileHover: MotionProps['whileHover']; + }; + progressBar: { + initial: MotionProps['initial']; + duration: number; + }; + flowContainer: { + initial: MotionProps['initial']; + whileInView: MotionProps['whileInView']; + transition: MotionProps['transition']; + }; + customNode: { + initial: MotionProps['initial']; + animate: MotionProps['animate']; + whileHover: MotionProps['whileHover']; + whileTap: MotionProps['whileTap']; + }; +} + +// Define the goals for the organization +export const goals: Goal[] = [ + { + title: 'Global Education Impact', + description: + 'Reach 1 million students worldwide with our educational tools by 2026', + }, + { + title: 'Open Source Advocacy', + description: + 'Foster a new generation of open source contributors through mentorship programs', + }, + { + title: 'Educational Innovation', + description: + 'Develop cutting-edge learning platforms that adapt to diverse learning styles', + }, + { + title: 'Community Building', + description: + 'Create sustainable global communities of practice around educational technology', + }, + { + title: 'Digital Equity', + description: + 'Ensure technology access for underrepresented and underserved communities worldwide', + }, +]; + +// Define progress metrics for each area +export const progressItems: ProgressItem[] = [ + { + percent: 75, + label: 'Education Impact', + color: 'from-orange-400 to-orange-600', + }, + { + percent: 60, + label: 'Community Growth', + color: 'from-orange-300 to-orange-500', + }, + { + percent: 85, + label: 'Innovation', + color: 'from-orange-500 to-orange-700', + }, + { + percent: 45, + label: 'Global Reach', + color: 'from-orange-600 to-orange-800', + }, + { + percent: 70, + label: 'Open Source Adoption', + color: 'from-orange-200 to-orange-400', + }, +]; + +// Section text content +export const sectionContent: SectionContentType = { + title: { + main: 'Our ', + highlight: 'Goals', + }, + introduction: + 'At Sugar Labs, we strive to create a vibrant ecosystem where technology empowers education. Our strategic goals focus on expanding our impact while maintaining our core values.', + progressTitle: 'Our Progress', + resetViewButtonText: 'Reset View', + insightsTitle: 'Progress Insights', +}; + +// Animation settings +export const animations: AnimationsType = { + goalItem: { + initial: { opacity: 0, x: -20 }, + whileInView: { opacity: 1, x: 0 }, + whileHover: { x: 10, backgroundColor: '#fef2f2' }, + }, + progressBar: { + initial: { width: 0 }, + duration: 1, + }, + flowContainer: { + initial: { opacity: 0, y: 20 }, + whileInView: { opacity: 1, y: 0 }, + transition: { duration: 0.6 }, + }, + customNode: { + initial: { scale: 0.9 }, + animate: { scale: 1 }, + whileHover: { + scale: 1.05, + boxShadow: + '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)', + borderColor: '#ef4444', + }, + whileTap: { scale: 0.95 }, + }, +}; diff --git a/src/constants/aboutUs/mission.ts b/src/constants/aboutUs/mission.ts new file mode 100644 index 00000000..c6f9e7c4 --- /dev/null +++ b/src/constants/aboutUs/mission.ts @@ -0,0 +1,32 @@ +export const content = { + sectionId: 'mission', + title: { + prefix: 'Our', + highlighted: 'Mission', + }, + paragraphs: [ + 'Sugar Labs is dedicated to creating educational tools that transform how children learn and explore technology. Our mission is to provide freely available, open-source software that encourages collaborative learning and creativity.', + 'We believe that every child deserves access to quality educational tools regardless of their background or location. By developing user-friendly software that runs on a variety of platforms, we aim to bridge the digital divide and empower the next generation of creative thinkers.', + "Our community-driven approach brings together educators, developers, and volunteers who are passionate about making a difference in education worldwide. Together, we're building tools that make learning engaging, accessible, and fun.", + ], + images: { + main: { + src: '/assets/Images/discuss.jpeg', + alt: 'Children using Sugar Labs software in a classroom', + }, + gallery: [ + { + src: '/assets/Images/teach2.jpeg', + alt: 'Students collaborating on a Sugar Labs project', + }, + { + src: '/assets/Images/teach.jpg', + alt: 'Teacher helping students with Sugar Labs activities', + }, + { + src: '/assets/Images/teach1.jpg', + alt: 'Children exploring creative software tools', + }, + ], + }, +}; diff --git a/src/constants/aboutUs/navigation.ts b/src/constants/aboutUs/navigation.ts new file mode 100644 index 00000000..d1e38b00 --- /dev/null +++ b/src/constants/aboutUs/navigation.ts @@ -0,0 +1,36 @@ +export interface NavigationSection { + id: string; + label: string; +} + +export const navigationSections: NavigationSection[] = [ + { id: 'mission', label: 'Our Mission' }, + { id: 'principles', label: 'Our Principles' }, + { id: 'goals', label: 'Our Goals' }, + { id: 'projects', label: 'Our Projects' }, + { id: 'roadmap', label: 'Our Roadmap' }, // +]; + +export const navigationConfig = { + scrollOffset: 20, + scrollDuration: 800, + stickyTopPosition: 70, + activeDetectionOffset: 100, + defaultActiveSection: 'mission', +}; + +export const navigationStyles = { + container: + 'sticky bg-white/90 backdrop-blur-md shadow-md rounded-lg p-4 mb-8 z-40 mt-16', + list: 'flex flex-wrap justify-center gap-4 md:gap-8', + button: { + base: 'px-4 py-2 rounded-md transition-all duration-300 text-sm md:text-base relative group', + active: 'text-red-500 font-medium', + inactive: 'text-gray-600 hover:text-red-500', + }, + indicator: { + base: 'absolute bottom-0 left-0 w-full h-0.5 bg-red-500 transform transition-all duration-300', + active: 'scale-x-100', + inactive: 'scale-x-0 group-hover:scale-x-100', + }, +}; diff --git a/src/constants/aboutUs/principles.ts b/src/constants/aboutUs/principles.ts new file mode 100644 index 00000000..091d8368 --- /dev/null +++ b/src/constants/aboutUs/principles.ts @@ -0,0 +1,55 @@ +export interface Principle { + id: number; + title: string; + description: string; + image: string; +} + +export const principles: Principle[] = [ + { + id: 1, + title: 'Open Learning', + description: + 'We believe in making education accessible to everyone through open-source software and collaborative learning environments.', + image: '/assets/Images/teach.jpg', + }, + { + id: 2, + title: 'Community Driven', + description: + 'Our success relies on active participation from a diverse community of contributors who share common educational goals.', + image: '/assets/Images/teach1.jpg', + }, + { + id: 3, + title: 'Innovation', + description: + 'We encourage creative problem-solving and innovative approaches to educational technology development.', + image: '/assets/Images/teach2.jpeg', + }, + { + id: 4, + title: 'Collaboration', + description: + 'Working together while maintaining independence allows each participant to contribute their unique perspective.', + image: '/assets/Images/teach.jpg', + }, + { + id: 5, + title: 'Sustainability', + description: + 'Building lasting solutions that can be maintained and improved by the community over time.', + image: '/assets/Images/teach1.jpg', + }, +]; + +export const principlesContent = { + sectionId: 'principles', + title: { + prefix: 'Our', + highlight: 'Principles', + }, + description: + "In order for Sugar Labs to be successful, it needs the participation of a large number of people who share common goals while maintaining independence, so that each participant has the ability to act independently. For these reasons, Sugar Labs subscribes to the principles described here, which are the author's own translation of an original text in Spanish.", + featuredImage: '/assets/Images/teach1.jpg', +}; diff --git a/src/constants/aboutUs/projects.ts b/src/constants/aboutUs/projects.ts new file mode 100644 index 00000000..d02cf5d1 --- /dev/null +++ b/src/constants/aboutUs/projects.ts @@ -0,0 +1,61 @@ +export interface Project { + title: string; + description: string; + tags?: string[]; + imageUrl?: string; + progress?: number; + link?: string; +} + +export const projects: Project[] = [ + { + title: 'Sugar on a Stick', + description: 'A live USB version of the Sugar platform', + tags: ['Distribution', 'Portable'], + imageUrl: '/assets/Images/SOAS.jpeg', + link: '/projects/sugar-on-a-stick', + }, + { + title: 'Google Summer of Code', + description: + 'GSOC is a global program focused on bringing more student developers into open source software development', + tags: ['Community', 'Development'], + imageUrl: '/assets/Images/GSOC.png', + link: '/projects/gsoc', + }, + { + title: 'Music Blocks', + description: 'A programming environment for exploring musical concepts', + tags: ['Education', 'Creative'], + progress: 75, + imageUrl: '/assets/Images/default-project.png', // Added a default image + link: '/projects/music-blocks', + }, + { + title: 'Sugarizer', + description: 'Web implementation of the Sugar platform for modern browsers', + tags: ['Web', 'Mobile'], + progress: 80, + imageUrl: '/assets/Images/default-project.png', // Added a default image + link: '/projects/sugarizer', + }, +]; + +export const projectIcons = [ + { color: 'bg-orange-100', icon: '🖥️', title: 'Sugar' }, + { color: 'bg-orange-200', icon: '🎵', title: 'Music Blocks' }, + { color: 'bg-orange-300', icon: '🌐', title: 'Sugarizer' }, + { color: 'bg-orange-100', icon: '🎮', title: 'Activities' }, +]; + +export const projectsContent = { + sectionId: 'projects', + title: { + prefix: 'Our', + highlight: 'Projects', + }, + description: + 'Sugar Labs develops and maintains several key projects that support our educational mission. These projects range from complete distributions to specific applications, each designed to enhance learning through technology.', + ctaText: 'Learn more', + displayProjectCount: 2, +}; diff --git a/src/constants/aboutUs/roadmap.ts b/src/constants/aboutUs/roadmap.ts new file mode 100644 index 00000000..f4da1704 --- /dev/null +++ b/src/constants/aboutUs/roadmap.ts @@ -0,0 +1,50 @@ +export interface RoadmapItem { + title: string; + description?: string; + borderColor?: string; + backgroundColor?: string; + stepColor?: string; +} + +export const roadmapItems: RoadmapItem[] = [ + { + title: 'Mission, Vision, Values', + description: 'Establishing our foundational principles', + borderColor: 'border-red-500', + stepColor: 'bg-red-500', + }, + { + title: 'Distribution', + description: 'Ensuring our software reaches users worldwide', + borderColor: 'border-red-400', + stepColor: 'bg-purple-500', + }, + { + title: 'Deployments', + description: 'Implementing solutions in educational settings', + borderColor: 'border-red-300', + stepColor: 'bg-blue-500', + }, + { + title: 'Quality Assurance', + description: 'Maintaining high standards through testing', + borderColor: 'border-blue-400', + stepColor: 'bg-red-500', + }, + { + title: 'Infrastructures', + description: 'Building robust systems for growth', + borderColor: 'border-blue-500', + stepColor: 'bg-purple-500', + }, +]; + +export const roadmapContent = { + sectionId: 'roadmap', + title: { + prefix: 'Our', + highlight: 'Roadmap', + }, + description: + 'Our strategic roadmap outlines our key milestones and future directions as we continue to grow and innovate.', +}; diff --git a/src/pages/About/AboutUs.tsx b/src/pages/About/AboutUs.tsx index f9a3cc1c..940a5d59 100644 --- a/src/pages/About/AboutUs.tsx +++ b/src/pages/About/AboutUs.tsx @@ -1,19 +1,48 @@ +import { useEffect, useState } from 'react'; +import { motion } from 'framer-motion'; import Header from '@/sections/Header'; import Footer from '@/sections/Footer'; +import NavigationLinks from '@/components/shared/NavigationLinks'; +import HeroSection from '@/components/AboutUs/HeroSection'; +import TextMaskSection from '@/components/AboutUs/TextMaskSection'; +import MissionSection from '@/components/AboutUs/MissionSection'; +import PrinciplesSection from '@/components/AboutUs/PrinciplesSection'; +import GoalsSection from '@/components/AboutUs/GoalsSection'; +import ProjectsSection from '@/components/AboutUs/ProjectSection'; +import RoadmapSection from '@/components/AboutUs/RoadmapSection'; const AboutUs = () => { + const [isLoaded, setIsLoaded] = useState(false); + + useEffect(() => { + setTimeout(() => setIsLoaded(true), 100); + }, []); + return ( -
+
-
-

About Us

-

- SugarLabs is a non-profit organization dedicated to providing children - with access to free and open-source software for learning. Our goal is - to empower children to explore, create, and share knowledge through - technology. -

-
+
+ + + + + +
+ + + + + +
+
+
); diff --git a/src/styles/Animations.ts b/src/styles/Animations.ts index f485bbb4..9212f5e4 100644 --- a/src/styles/Animations.ts +++ b/src/styles/Animations.ts @@ -327,3 +327,365 @@ export const item = { transition: { duration: 0.3 }, }, }; + +export const goalSectionAnimations = { + goalItem: slideInLeft, + progressBar: { + hidden: { width: 0 }, + visible: (percent: number) => ({ + width: `${percent}%`, + transition: { duration: 1, ease: 'easeOut' }, + }), + }, + flowContainer: subtleRise, + statCard: statCard, + insightsBox: subtleRise, + overallProgressBar: { + hidden: { width: 0 }, + visible: (percent: number) => ({ + width: `${percent}%`, + transition: { duration: 1.5, ease: 'easeOut' }, + }), + }, +}; + +// Hero Section animations +export const heroAnimations = { + container: { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { duration: 1 }, + }, + }, + letterAnimation: { + hidden: { opacity: 0, y: 50 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.6, ease: 'easeOut' }, + }, + }, + decoration: { + hidden: { scale: 0, opacity: 0 }, + visible: { + scale: 1, + opacity: 1, + transition: { duration: 0.8, ease: 'backOut' }, + }, + }, + subtitle: { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { delay: 1.5, duration: 0.8 }, + }, + }, + underline: { + hidden: { width: 0, opacity: 0 }, + visible: { + width: '100%', + opacity: 1, + transition: { delay: 1.2, duration: 0.8 }, + }, + }, + floatingCircle: { + hidden: { scale: 0, opacity: 0 }, + visible: (i: number) => ({ + scale: [0, 1.5, 1], + opacity: [0, 0.8, 0], + transition: { + duration: 3, + delay: i * 0.5, + repeat: Infinity, + repeatType: 'loop', + }, + }), + }, + hoverText: { + initial: {}, + hover: { + scale: 1.05, + transition: { type: 'spring', stiffness: 300 }, + }, + }, + mouseFollow: { + hidden: { opacity: 0 }, + visible: { + opacity: 0.2, + transition: { duration: 0.3 }, + }, + hover: { + scale: 1.2, + transition: { duration: 0.3 }, + }, + }, +}; + +export const missionSectionAnimations = { + // Container animations for staggered children + containerVariants: { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.2, + delayChildren: 0.1, + }, + }, + }, + + // Individual item animations + itemVariants: { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { + duration: 0.5, + ease: 'easeOut', + }, + }, + }, + + // Main image animations + mainImageVariants: { + initial: { opacity: 0, scale: 0.95 }, + whileInView: { opacity: 1, scale: 1 }, + transition: { duration: 0.6, ease: 'easeOut' }, + hover: { + scale: 1.03, + transition: { duration: 0.4 }, + }, + }, + + // Underline animation for title + titleUnderlineVariants: { + hidden: { width: 0 }, + visible: { + width: '100%', + transition: { delay: 0.5, duration: 0.4 }, + }, + }, + + // Image hover animations + imageHoverVariants: { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { + duration: 0.5, + }, + }, + hover: { + scale: 1.05, + boxShadow: '0 10px 25px rgba(0,0,0,0.2)', + transition: { + duration: 0.4, + }, + }, + }, + + // Image scale animation + imageScaleVariants: { + initial: { scale: 1 }, + hover: { + scale: 1.15, + transition: { duration: 0.4 }, + }, + }, +}; + +// Principles Section animations +export const principlesSectionAnimations = { + container: { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { staggerChildren: 0.1 }, + }, + }, + + card: { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.5 }, + }, + }, + + title: { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.5 }, + }, + }, + + description: { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { delay: 0.3, duration: 0.5 }, + }, + }, + + featureImage: { + hidden: { opacity: 0, scale: 0.95 }, + visible: { + opacity: 1, + scale: 1, + transition: { duration: 0.5 }, + }, + hover: { + scale: 1.05, + translateY: -10, + transition: { duration: 0.3 }, + }, + }, + + overlay: { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { duration: 0.3 }, + }, + }, + + cardImage: { + hidden: { opacity: 0.9 }, + hover: { + scale: 1.05, + transition: { duration: 0.3 }, + }, + }, +}; + +// Projects Section animations +export const projectsSectionAnimations = { + container: { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.15, + delayChildren: 0.1, + }, + }, + }, + + projectCard: { + hidden: { opacity: 0, y: 20 }, + visible: (i: number) => ({ + opacity: 1, + y: 0, + transition: { + delay: i * 0.1, + duration: 0.5, + ease: 'easeOut', + }, + }), + hover: { + y: -8, + boxShadow: + '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)', + transition: { duration: 0.3 }, + }, + }, + + learnMoreButton: { + hidden: { opacity: 0.9 }, + hover: { + x: 5, + transition: { duration: 0.2 }, + }, + }, + + title: { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.5, delay: 0.1 }, + }, + }, + + imageContainer: { + hidden: { opacity: 0, scale: 0.95 }, + visible: { + opacity: 1, + scale: 1, + transition: { duration: 0.4 }, + }, + }, +}; + +export const roadmapSectionAnimations = { + // Line connecting roadmap items + connectingLine: { + hidden: { width: 0 }, + visible: { + width: '100%', + transition: { duration: 1.2, ease: 'easeInOut' }, + }, + }, + + // Individual roadmap items/cards + roadmapCard: { + hidden: { opacity: 0, y: 20 }, + visible: (i: number) => ({ + opacity: 1, + y: 0, + transition: { + duration: 0.6, + delay: i * 0.3, + }, + }), + }, + + // Section title + title: { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.5 }, + }, + }, + + // Description paragraph + description: { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { delay: 0.8, duration: 0.5 }, + }, + }, + + // Number indicator + stepNumber: { + hidden: { scale: 0 }, + visible: (i: number) => ({ + scale: 1, + transition: { + type: 'spring', + stiffness: 300, + damping: 10, + delay: i * 0.3 + 0.3, + }, + }), + }, + + // Card hover effect + cardHover: { + scale: 1.03, + boxShadow: + '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)', + transition: { duration: 0.3 }, + }, +};