diff --git a/next.config.ts b/next.config.ts index 18b2799..27069f3 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,15 +1,61 @@ import type { NextConfig } from "next"; +const securityHeaders = [ + { + key: "X-Frame-Options", + value: "DENY", + }, + { + key: "X-Content-Type-Options", + value: "nosniff", + }, + { + key: "Referrer-Policy", + value: "strict-origin-when-cross-origin", + }, + { + key: "Permissions-Policy", + value: "camera=(), microphone=(), geolocation=()", + }, + { + key: "Cross-Origin-Opener-Policy", + value: "same-origin", + }, + { + key: "Cross-Origin-Resource-Policy", + value: "same-site", + }, + { + key: "Strict-Transport-Security", + value: "max-age=63072000; includeSubDomains; preload", + }, +]; + const nextConfig: NextConfig = { - /* config options here */ + images: { + remotePatterns: [ + { + protocol: "https", + hostname: "github.com", + }, + { + protocol: "https", + hostname: "avatars.githubusercontent.com", + }, + ], + }, async headers() { return [ { - source: '/assets/:path*', + source: "/:path*", + headers: securityHeaders, + }, + { + source: "/assets/:path*", headers: [ { - key: 'Cache-Control', - value: 'public, max-age=31536000, immutable', + key: "Cache-Control", + value: "public, max-age=31536000, immutable", }, ], }, diff --git a/package-lock.json b/package-lock.json index 3c77e0c..4e1dc5f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,23 +8,23 @@ "name": "trg-page", "version": "0.1.0", "dependencies": { + "@tsparticles/engine": "^3.9.1", + "@tsparticles/react": "^3.0.0", "framer-motion": "^12.18.1", - "next": "15.3.8", + "next": "15.5.12", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-tsparticles": "^2.12.2", - "stats.js": "^0.17.0", - "tsparticles": "^3.8.1" + "stats.js": "^0.17.0" }, "devDependencies": { - "@eslint/eslintrc": "^3", + "@eslint/eslintrc": "^3.3.3", "@svgr/webpack": "^8.1.0", "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", - "eslint": "^9", - "eslint-config-next": "15.3.3", + "eslint": "^9.39.2", + "eslint-config-next": "15.5.12", "tailwindcss": "^4", "typescript": "^5" } @@ -1814,9 +1814,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", - "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", + "integrity": "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==", "license": "MIT", "optional": true, "dependencies": { @@ -1835,9 +1835,9 @@ } }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1867,9 +1867,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -1877,13 +1877,13 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", - "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", "minimatch": "^3.1.2" }, @@ -1892,19 +1892,22 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", - "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", - "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -1915,9 +1918,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", "dev": true, "license": "MIT", "dependencies": { @@ -1927,7 +1930,7 @@ "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, @@ -1939,9 +1942,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.28.0.tgz", - "integrity": "sha512-fnqSjGWd/CoIp4EXIxWVK/sHA6DOHN4+8Ix2cX5ycOY7LG0UY8nHCU5pIp2eaE1Mc7Qd8kHspYNzYXT2ojPLzg==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { @@ -1952,9 +1955,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -1962,13 +1965,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", - "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.14.0", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { @@ -2041,10 +2044,20 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz", - "integrity": "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", + "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", "cpu": [ "arm64" ], @@ -2060,13 +2073,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.1.0" + "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz", - "integrity": "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", + "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", "cpu": [ "x64" ], @@ -2082,13 +2095,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.1.0" + "@img/sharp-libvips-darwin-x64": "1.2.4" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz", - "integrity": "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", + "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", "cpu": [ "arm64" ], @@ -2102,9 +2115,9 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz", - "integrity": "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", + "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", "cpu": [ "x64" ], @@ -2118,9 +2131,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz", - "integrity": "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", + "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", "cpu": [ "arm" ], @@ -2134,9 +2147,9 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz", - "integrity": "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", + "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", "cpu": [ "arm64" ], @@ -2150,9 +2163,9 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz", - "integrity": "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", + "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", "cpu": [ "ppc64" ], @@ -2165,10 +2178,26 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@img/sharp-libvips-linux-riscv64": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", + "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", + "cpu": [ + "riscv64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz", - "integrity": "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", + "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", "cpu": [ "s390x" ], @@ -2182,9 +2211,9 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz", - "integrity": "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", + "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "cpu": [ "x64" ], @@ -2198,9 +2227,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz", - "integrity": "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", + "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", "cpu": [ "arm64" ], @@ -2214,9 +2243,9 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz", - "integrity": "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", + "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", "cpu": [ "x64" ], @@ -2230,9 +2259,9 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz", - "integrity": "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", + "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", "cpu": [ "arm" ], @@ -2248,13 +2277,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.1.0" + "@img/sharp-libvips-linux-arm": "1.2.4" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz", - "integrity": "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", + "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", "cpu": [ "arm64" ], @@ -2270,13 +2299,57 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.1.0" + "@img/sharp-libvips-linux-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", + "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-riscv64": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", + "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", + "cpu": [ + "riscv64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-riscv64": "1.2.4" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz", - "integrity": "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", "cpu": [ "s390x" ], @@ -2292,13 +2365,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.1.0" + "@img/sharp-libvips-linux-s390x": "1.2.4" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz", - "integrity": "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", + "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", "cpu": [ "x64" ], @@ -2314,13 +2387,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.1.0" + "@img/sharp-libvips-linux-x64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz", - "integrity": "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", + "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", "cpu": [ "arm64" ], @@ -2336,13 +2409,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz", - "integrity": "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", + "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", "cpu": [ "x64" ], @@ -2358,20 +2431,20 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.1.0" + "@img/sharp-libvips-linuxmusl-x64": "1.2.4" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz", - "integrity": "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", "cpu": [ "wasm32" ], "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { - "@emnapi/runtime": "^1.4.3" + "@emnapi/runtime": "^1.7.0" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -2381,9 +2454,9 @@ } }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz", - "integrity": "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", + "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", "cpu": [ "arm64" ], @@ -2400,9 +2473,9 @@ } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz", - "integrity": "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", + "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", "cpu": [ "ia32" ], @@ -2419,9 +2492,9 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz", - "integrity": "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", + "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", "cpu": [ "x64" ], @@ -2517,15 +2590,15 @@ } }, "node_modules/@next/env": { - "version": "15.3.8", - "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.8.tgz", - "integrity": "sha512-SAfHg0g91MQVMPioeFeDjE+8UPF3j3BvHjs8ZKJAUz1BG7eMPvfCKOAgNWJ6s1MLNeP6O2InKQRTNblxPWuq+Q==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.12.tgz", + "integrity": "sha512-pUvdJN1on574wQHjaBfNGDt9Mz5utDSZFsIIQkMzPgNS8ZvT4H2mwOrOIClwsQOb6EGx5M76/CZr6G8i6pSpLg==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "15.3.3", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.3.3.tgz", - "integrity": "sha512-VKZJEiEdpKkfBmcokGjHu0vGDG+8CehGs90tBEy/IDoDDKGngeyIStt2MmE5FYNyU9BhgR7tybNWTAJY/30u+Q==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-15.5.12.tgz", + "integrity": "sha512-+ZRSDFTv4aC96aMb5E41rMjysx8ApkryevnvEYZvPZO52KvkqP5rNExLUXJFr9P4s0f3oqNQR6vopCZsPWKDcQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2533,9 +2606,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.5.tgz", - "integrity": "sha512-lM/8tilIsqBq+2nq9kbTW19vfwFve0NR7MxfkuSUbRSgXlMQoJYg+31+++XwKVSXk4uT23G2eF/7BRIKdn8t8w==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.12.tgz", + "integrity": "sha512-RnRjBtH8S8eXCpUNkQ+543DUc7ys8y15VxmFU9HRqlo9BG3CcBUiwNtF8SNoi2xvGCVJq1vl2yYq+3oISBS0Zg==", "cpu": [ "arm64" ], @@ -2549,9 +2622,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.5.tgz", - "integrity": "sha512-WhwegPQJ5IfoUNZUVsI9TRAlKpjGVK0tpJTL6KeiC4cux9774NYE9Wu/iCfIkL/5J8rPAkqZpG7n+EfiAfidXA==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.12.tgz", + "integrity": "sha512-nqa9/7iQlboF1EFtNhWxQA0rQstmYRSBGxSM6g3GxvxHxcoeqVXfGNr9stJOme674m2V7r4E3+jEhhGvSQhJRA==", "cpu": [ "x64" ], @@ -2565,9 +2638,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.5.tgz", - "integrity": "sha512-LVD6uMOZ7XePg3KWYdGuzuvVboxujGjbcuP2jsPAN3MnLdLoZUXKRc6ixxfs03RH7qBdEHCZjyLP/jBdCJVRJQ==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.12.tgz", + "integrity": "sha512-dCzAjqhDHwmoB2M4eYfVKqXs99QdQxNQVpftvP1eGVppamXh/OkDAwV737Zr0KPXEqRUMN4uCjh6mjO+XtF3Mw==", "cpu": [ "arm64" ], @@ -2581,9 +2654,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.5.tgz", - "integrity": "sha512-k8aVScYZ++BnS2P69ClK7v4nOu702jcF9AIHKu6llhHEtBSmM2zkPGl9yoqbSU/657IIIb0QHpdxEr0iW9z53A==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.12.tgz", + "integrity": "sha512-+fpGWvQiITgf7PUtbWY1H7qUSnBZsPPLyyq03QuAKpVoTy/QUx1JptEDTQMVvQhvizCEuNLEeghrQUyXQOekuw==", "cpu": [ "arm64" ], @@ -2597,9 +2670,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.5.tgz", - "integrity": "sha512-2xYU0DI9DGN/bAHzVwADid22ba5d/xrbrQlr2U+/Q5WkFUzeL0TDR963BdrtLS/4bMmKZGptLeg6282H/S2i8A==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.12.tgz", + "integrity": "sha512-jSLvgdRRL/hrFAPqEjJf1fFguC719kmcptjNVDJl26BnJIpjL3KH5h6mzR4mAweociLQaqvt4UyzfbFjgAdDcw==", "cpu": [ "x64" ], @@ -2613,9 +2686,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.5.tgz", - "integrity": "sha512-TRYIqAGf1KCbuAB0gjhdn5Ytd8fV+wJSM2Nh2is/xEqR8PZHxfQuaiNhoF50XfY90sNpaRMaGhF6E+qjV1b9Tg==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.12.tgz", + "integrity": "sha512-/uaF0WfmYqQgLfPmN6BvULwxY0dufI2mlN2JbOKqqceZh1G4hjREyi7pg03zjfyS6eqNemHAZPSoP84x17vo6w==", "cpu": [ "x64" ], @@ -2629,9 +2702,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.5.tgz", - "integrity": "sha512-h04/7iMEUSMY6fDGCvdanKqlO1qYvzNxntZlCzfE8i5P0uqzVQWQquU1TIhlz0VqGQGXLrFDuTJVONpqGqjGKQ==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.12.tgz", + "integrity": "sha512-xhsL1OvQSfGmlL5RbOmU+FV120urrgFpYLq+6U8C6KIym32gZT6XF/SDE92jKzzlPWskkbjOKCpqk5m4i8PEfg==", "cpu": [ "arm64" ], @@ -2645,9 +2718,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "15.3.5", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.5.tgz", - "integrity": "sha512-5fhH6fccXxnX2KhllnGhkYMndhOiLOLEiVGYjP2nizqeGWkN10sA9taATlXwake2E2XMvYZjjz0Uj7T0y+z1yw==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.12.tgz", + "integrity": "sha512-Z1Dh6lhFkxvBDH1FoW6OU/L6prYwPSlwjLiZkExIAh8fbP6iI/M7iGTQAJPYJ9YFlWobCZ1PHbchFhFYb2ADkw==", "cpu": [ "x64" ], @@ -2993,12 +3066,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "license": "Apache-2.0" - }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -3241,490 +3308,63 @@ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.8.tgz", "integrity": "sha512-7GmYk1n28teDHUjPlIx4Z6Z4hHEgvP5ZW2QS9ygnDAdI/myh3HTHjDqtSqgu1BpRoI4OiLx+fThAyA1JePoENA==", "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.8.tgz", - "integrity": "sha512-fou+U20j+Jl0EHwK92spoWISON2OBnCazIc038Xj2TdweYV33ZRkS9nwqiUi2d/Wba5xg5UoHfvynnb/UB49cQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/postcss": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.8.tgz", - "integrity": "sha512-vB/vlf7rIky+w94aWMw34bWW1ka6g6C3xIOdICKX2GC0VcLtL6fhlLiafF0DVIwa9V6EHz8kbWMkS2s2QvvNlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.8", - "@tailwindcss/oxide": "4.1.8", - "postcss": "^8.4.41", - "tailwindcss": "4.1.8" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@tsparticles/basic": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/basic/-/basic-3.8.1.tgz", - "integrity": "sha512-my114zRmekT/+I2cGuEnHxlX5G/jO0iVtNnsxxlsgspXUTSY+fDixmrNF4UgFkuaIwd9Bv/yH+7S/4HE4qte7A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1", - "@tsparticles/move-base": "3.8.1", - "@tsparticles/plugin-hex-color": "3.8.1", - "@tsparticles/plugin-hsl-color": "3.8.1", - "@tsparticles/plugin-rgb-color": "3.8.1", - "@tsparticles/shape-circle": "3.8.1", - "@tsparticles/updater-color": "3.8.1", - "@tsparticles/updater-opacity": "3.8.1", - "@tsparticles/updater-out-modes": "3.8.1", - "@tsparticles/updater-size": "3.8.1" - } - }, - "node_modules/@tsparticles/engine": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/engine/-/engine-3.8.1.tgz", - "integrity": "sha512-S8h10nuZfElY7oih//NUHnT5qf4v3/dnsU8CMs7dz5lBEGr3amrYrXk0V+YKPTIQwfdmJHUaSBoAqFiv4aEGIA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "hasInstallScript": true, - "license": "MIT" - }, - "node_modules/@tsparticles/interaction-external-attract": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-attract/-/interaction-external-attract-3.8.1.tgz", - "integrity": "sha512-GWzyj5MOzjb5pNWuqAueNZS2ilPcZ0isiqwcb0BjjpwfiGfL72UyIbNUDMLncsW+4jcwB4WyMsv/qOGDmAwVfQ==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/interaction-external-bounce": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-bounce/-/interaction-external-bounce-3.8.1.tgz", - "integrity": "sha512-tgVzsE3orneSeSUc1XhRD6Iqs8Rkm11iRdkncKSpNx4SI2eJWFPhwit2wIiHQ+IuvgCmM2DXRtLgEVeaux71zg==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/interaction-external-bubble": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-bubble/-/interaction-external-bubble-3.8.1.tgz", - "integrity": "sha512-edRVFybiVFd5vEjfEkHgrBTXfPTKc05EqCmRuOEd5gOll1ui0nPtknzj9JiLrPacQAJ7OgZKlHWYQb1u5Yy5Tw==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/interaction-external-connect": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-connect/-/interaction-external-connect-3.8.1.tgz", - "integrity": "sha512-DQ0nNB0VDSxFxeaJQvm91NDUU/UPoiHE+uUzyw5qSoWJEGTUOj/QkW0GuBinCo99i8MH/wLDqMS9nb+7ZejpUw==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/interaction-external-grab": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-grab/-/interaction-external-grab-3.8.1.tgz", - "integrity": "sha512-nPaHrazEr14CGokGGkFHYXZJTN3Inshe04uQNj+Rj4Lz9dAIqq8EFuSejp0g9lk2cTHWfVf4SK4r8+aJz9Ow4Q==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/interaction-external-pause": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-pause/-/interaction-external-pause-3.8.1.tgz", - "integrity": "sha512-W+6bjNDddtzlikwnfmk2G/GJsz4ZnoqvK0c63earvnPNUAJmkzrvmLS52JoaIOSyclOIeD4LmubT6IsQDv5ohA==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/interaction-external-push": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-push/-/interaction-external-push-3.8.1.tgz", - "integrity": "sha512-LgaXaBM5QXRCeYt3DzphEhE/OirEGnV4iJrXKGJ/FrYMH7kOao85rPmCtYQNYzIy6K0XstmATmTvFRziZ/M4VQ==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/interaction-external-remove": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-remove/-/interaction-external-remove-3.8.1.tgz", - "integrity": "sha512-mwo1DRJPIqzrWfs2G+kfQ5/HyM5j/soIj11zur3BkIlm9vdYIxUpA+hvO734oekSjJxY7YFmYUaqc4vC5TFE5w==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/interaction-external-repulse": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-repulse/-/interaction-external-repulse-3.8.1.tgz", - "integrity": "sha512-r0E828zrKIRHA27daItHtI9QEp1tO8d8dmF8Ld8+orn7q0+BKG+uGvNTYJFZ+hqR+lp5AkLOiThf7L2wLS9M1A==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/interaction-external-slow": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-slow/-/interaction-external-slow-3.8.1.tgz", - "integrity": "sha512-U4P6c9V6/fSDsWchD4oAYAIPHA/203LzQ7+792cMxa7YThza0VS7YyJUQ1PACjGMmfeKbE34/eoGPqESKakeLw==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/interaction-external-trail": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-external-trail/-/interaction-external-trail-3.8.1.tgz", - "integrity": "sha512-CUiTxCtTASYdqi55KpJ98IRnuLS+G66v+s1/dZeAE7F7wzL7tkcUBQ3hP1yzBpFmKsoYHJfz9nAfocAkgRb6hg==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/interaction-particles-attract": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-particles-attract/-/interaction-particles-attract-3.8.1.tgz", - "integrity": "sha512-lo5JAVdeh1tQq/7SDsIllNdyIJgF3hSquWLARUIwGolezD91bEmHp/rlhTscX5NrqiM3y7z3inJPhR0nP5kGeg==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/interaction-particles-collisions": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-particles-collisions/-/interaction-particles-collisions-3.8.1.tgz", - "integrity": "sha512-teqn1CZVoJkT/ubhkb4R/H1rnx7DoIeerHXS5uME+vrLIqzkn8QlWdEdTJ7PhdB+Ct2iYAeXCrJWwIqnKaAL3w==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/interaction-particles-links": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/interaction-particles-links/-/interaction-particles-links-3.8.1.tgz", - "integrity": "sha512-D+X7wEWyhfV7J0uDWf5vWDhxjfaNovNZW0BWscR9qSy8pl3hjRpv0sJ/QaQFscmK5SzVz28tUFDRLbH1aV5v/Q==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/move-base": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/move-base/-/move-base-3.8.1.tgz", - "integrity": "sha512-DNFRL1QT8ZQYLg3fIk74EbHJq5HGOq9CM2bCci9dDcdymvN4L7aWVFQavRiWDbi3y1EUW3+jeHSMbD3qHAfOeA==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/move-parallax": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/move-parallax/-/move-parallax-3.8.1.tgz", - "integrity": "sha512-umrIttaJGUgfxpnolbMU2BekoN4gw0RgcfVsWR7jzHErA7eTzdJ2mikbQFD+3/1DfTDgJOjWx+dy8a3G/bSsZg==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/plugin-absorbers": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/plugin-absorbers/-/plugin-absorbers-3.8.1.tgz", - "integrity": "sha512-Di2Gncl3tCOCkLr2xZH8qCTVop3ES1r4lnLGDfmWPwUoSwSAUDE1epXKuf/9aLgdCMe7B4v/BGIr3YKUtTO3ww==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/plugin-easing-quad": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/plugin-easing-quad/-/plugin-easing-quad-3.8.1.tgz", - "integrity": "sha512-+BiPNHgsNbbh0AhWKjrmJaAu5c37naqjbME8ZYl0BClI0AC5AzBUaezYRxECaLrdtHJvKrZXFMr6Q0sxjDc6QQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/plugin-emitters": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/plugin-emitters/-/plugin-emitters-3.8.1.tgz", - "integrity": "sha512-PGldE3OHs1hsZM6a8qHpXvKIMhaWAqZNwq8v7FwgJGxikXVvYtkKSaWslTpID3hYvtB6+whKig2uWURmq2TUsg==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/plugin-emitters-shape-circle": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/plugin-emitters-shape-circle/-/plugin-emitters-shape-circle-3.8.1.tgz", - "integrity": "sha512-YmUzR5I0Yotadsz/UstDzhRAxEKkJBZ3SSF3y0TcP4t7CDyv5moMzi0W1bW/MeT7rt8d8RLYsS9qyOX/5a5DDw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1", - "@tsparticles/plugin-emitters": "3.8.1" - } - }, - "node_modules/@tsparticles/plugin-emitters-shape-square": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/plugin-emitters-shape-square/-/plugin-emitters-shape-square-3.8.1.tgz", - "integrity": "sha512-hg8a9ZD3PPRuNW8y/jqrRS2J153DkVvAfSdsO+l2PASG8vYVaxzUD1kqAUknUhNZmhg3BvtwQp+ojCNaat5/Lg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1", - "@tsparticles/plugin-emitters": "3.8.1" - } - }, - "node_modules/@tsparticles/plugin-hex-color": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/plugin-hex-color/-/plugin-hex-color-3.8.1.tgz", - "integrity": "sha512-AmgB7XIYBCvg5HcqYb19YpcjEx2k4DpU2e24n0rradDDeqKKcz7EWI/08FlAnDb5HUs1em63vaAanl1vdm3+OA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/plugin-hsl-color": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/plugin-hsl-color/-/plugin-hsl-color-3.8.1.tgz", - "integrity": "sha512-Ja6oEX6yu0064e4a+Fv1TBJiG5y0hqWwoOKSqf/Ra/zo01ageOEvDVX70FOVSrP+iEPGPznKVNcZs1tEOOvO0g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/plugin-rgb-color": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/plugin-rgb-color/-/plugin-rgb-color-3.8.1.tgz", - "integrity": "sha512-xNLqnaFUYjU+7dCHQXjZdM4UojUAVorPVmXlYmkh1xmujLljEaFTwCg1UJVlNq+fXENIFkeaf3/XT0U/q0ZBTA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/shape-circle": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/shape-circle/-/shape-circle-3.8.1.tgz", - "integrity": "sha512-dM/f+qcpd8/KfviuVuKiTS8KLDE/T7xxHK7EI2S49yPW6yrJJBXdL7T4N9/n/6PF+Wslcl+kf/eTDjEAI3WjNQ==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/shape-emoji": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/shape-emoji/-/shape-emoji-3.8.1.tgz", - "integrity": "sha512-xiXNZ/afdecengUXhOqgUwR+vysgaseVpzEjoGoliOMWq4WHWv+S6ujNfes2oz3x736mTlvKdXcEWRncSXaKWw==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/shape-image": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/shape-image/-/shape-image-3.8.1.tgz", - "integrity": "sha512-7Yi25uLXvcY5A6TzyVBjYPsTmeTrE+0a2YO8kdp3O7V9NRGCSfXKnPRFp+lNOTiQRRvOG+SSzx2G18dfc/jwQg==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/shape-line": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/shape-line/-/shape-line-3.8.1.tgz", - "integrity": "sha512-aXVKkpGLgi1hbU/JO+opzy3OTt6PfxWrhGZyI0ms3vdcRX9uYlq4GoNUoKPVfntjWzhecF+FNNZ9gqUG/+WZLQ==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/shape-polygon": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/shape-polygon/-/shape-polygon-3.8.1.tgz", - "integrity": "sha512-1pAx85NJbgmsOngl+ZAYH8vxwPJmoddjWCbWTD0wlp/x+2NRjn1iaGBKObPKLgwVzsAXb9qNHMsUX/x0C54svw==", + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@tsparticles/shape-square": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/shape-square/-/shape-square-3.8.1.tgz", - "integrity": "sha512-4cjDt6542dkc15zxG1VYT7ScgPXM3+5VGtwMfh5CYNBx+GZZ3R+XUo1Q66JadcqKcNdHXfMWbXCMxs0GaiTtSw==", + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.8.tgz", + "integrity": "sha512-fou+U20j+Jl0EHwK92spoWISON2OBnCazIc038Xj2TdweYV33ZRkS9nwqiUi2d/Wba5xg5UoHfvynnb/UB49cQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@tsparticles/shape-star": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/shape-star/-/shape-star-3.8.1.tgz", - "integrity": "sha512-wBxnawqan/ocguNxY6cOEXF+YVnLIUmGBlnVGYx/7U9E2UHuHEKkoumob4fUflKISjvj5eQLpm/E1eUfYMd6RA==", + "node_modules/@tailwindcss/postcss": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.8.tgz", + "integrity": "sha512-vB/vlf7rIky+w94aWMw34bWW1ka6g6C3xIOdICKX2GC0VcLtL6fhlLiafF0DVIwa9V6EHz8kbWMkS2s2QvvNlw==", + "dev": true, "license": "MIT", "dependencies": { - "@tsparticles/engine": "3.8.1" + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.8", + "@tailwindcss/oxide": "4.1.8", + "postcss": "^8.4.41", + "tailwindcss": "4.1.8" } }, - "node_modules/@tsparticles/shape-text": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/shape-text/-/shape-text-3.8.1.tgz", - "integrity": "sha512-PuEQobjHE5F/G2anv87b4K+wrBBuqE6H08Pm7BAb+qDl/LDmVZrrYrm4xl1DP07M/fhBJZpaBSgQ/m/5synSHw==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" } }, - "node_modules/@tsparticles/slim": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/slim/-/slim-3.8.1.tgz", - "integrity": "sha512-b6JV8MrxMz0XYn0eBCI/Mq8VCRyeaWfUyQaQyxLiRd96xpBXCeULooJF+Eaz9it1sUI898a5QfvY8djNXs4OJw==", + "node_modules/@tsparticles/engine": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/@tsparticles/engine/-/engine-3.9.1.tgz", + "integrity": "sha512-DpdgAhWMZ3Eh2gyxik8FXS6BKZ8vyea+Eu5BC4epsahqTGY9V3JGGJcXC6lRJx6cPMAx1A0FaQAojPF3v6rkmQ==", "funding": [ { "type": "github", @@ -3739,142 +3379,17 @@ "url": "https://www.buymeacoffee.com/matteobruni" } ], - "license": "MIT", - "dependencies": { - "@tsparticles/basic": "3.8.1", - "@tsparticles/engine": "3.8.1", - "@tsparticles/interaction-external-attract": "3.8.1", - "@tsparticles/interaction-external-bounce": "3.8.1", - "@tsparticles/interaction-external-bubble": "3.8.1", - "@tsparticles/interaction-external-connect": "3.8.1", - "@tsparticles/interaction-external-grab": "3.8.1", - "@tsparticles/interaction-external-pause": "3.8.1", - "@tsparticles/interaction-external-push": "3.8.1", - "@tsparticles/interaction-external-remove": "3.8.1", - "@tsparticles/interaction-external-repulse": "3.8.1", - "@tsparticles/interaction-external-slow": "3.8.1", - "@tsparticles/interaction-particles-attract": "3.8.1", - "@tsparticles/interaction-particles-collisions": "3.8.1", - "@tsparticles/interaction-particles-links": "3.8.1", - "@tsparticles/move-parallax": "3.8.1", - "@tsparticles/plugin-easing-quad": "3.8.1", - "@tsparticles/shape-emoji": "3.8.1", - "@tsparticles/shape-image": "3.8.1", - "@tsparticles/shape-line": "3.8.1", - "@tsparticles/shape-polygon": "3.8.1", - "@tsparticles/shape-square": "3.8.1", - "@tsparticles/shape-star": "3.8.1", - "@tsparticles/updater-life": "3.8.1", - "@tsparticles/updater-rotate": "3.8.1", - "@tsparticles/updater-stroke-color": "3.8.1" - } - }, - "node_modules/@tsparticles/updater-color": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/updater-color/-/updater-color-3.8.1.tgz", - "integrity": "sha512-HKrZzrF8YJ+TD+FdIwaWOPV565bkBhe+Ewj7CwKblG7H/SG+C6n1xIYobXkGP5pYkkQ+Cm1UV/Aq0Ih7sa+rJg==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/updater-destroy": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/updater-destroy/-/updater-destroy-3.8.1.tgz", - "integrity": "sha512-OMy8zZv3ujiaLw1i2BNWOhDgBPNnDiKlTwIP1mK0N9cYOplJkgaxmHOc7NhCndnLvZaYHqfN2bujLK2iBgNdbw==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/updater-life": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/updater-life/-/updater-life-3.8.1.tgz", - "integrity": "sha512-5rCFFKD7js1lKgTpKOLo2OfmisWp4qqMVUVR4bNPeR0Ne/dcwDbKDzWyYS2AMsvWv/gcTTtWiarRfAiVQ5HtNg==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/updater-opacity": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/updater-opacity/-/updater-opacity-3.8.1.tgz", - "integrity": "sha512-41dJ0T7df7AUFFkV9yU0buUfUwh+hLYcViXxkDy+6CJiiNCNZ4H404w1DTpBQLL4fbxUcDk9BXZLV7gkE2OfAw==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/updater-out-modes": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/updater-out-modes/-/updater-out-modes-3.8.1.tgz", - "integrity": "sha512-BY8WqQwoDFpgPybwTzBU2GnxtRkjWnGStqBnR53x5+f1j7geTSY6WjcOvl1W+IkjtwtjiifriwBl41EbqMrjdQ==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/updater-roll": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/updater-roll/-/updater-roll-3.8.1.tgz", - "integrity": "sha512-KYFTfMr8/M5pYBJFUFVrkogJURtKO5ogNSocOCf0v2QLMsbT5+OKNO7CLtxPZD98vTGRD3CHlt53/PF0tSesDA==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/updater-rotate": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/updater-rotate/-/updater-rotate-3.8.1.tgz", - "integrity": "sha512-gpI07H1+diuuUdhJsQ1RlfHSD3fzBJrjyuwGuoXgHmvKzak6EWKpYfUMOraH4Dm41m/4kJZelle4nST+NpIuoA==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/updater-size": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/updater-size/-/updater-size-3.8.1.tgz", - "integrity": "sha512-SC2ZxewtpwKadCalotK6x2YanxRO3hTMW1Rxzx9V2rcjAIgh/Nw49Vuithy2TDq8RtTc9rHDAPic2vMQ/lYQwA==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/updater-stroke-color": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/updater-stroke-color/-/updater-stroke-color-3.8.1.tgz", - "integrity": "sha512-rofHCf5oRHP2H+BTJ4D3r4mTqZtre3c8bsdJHATle26+gLpzbt6I1a83wAY8xnsQa1BNnRAfEsnb7GpdZ1vYaw==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/updater-tilt": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/updater-tilt/-/updater-tilt-3.8.1.tgz", - "integrity": "sha512-qMVd/sjrAds8m6vXFH5YKN8zrQR9SLdn5N5EvHx/JuKpOut4NhG85u8AEJL6ct1g7hY8Zj9kfi/dDSSovkaHhw==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } - }, - "node_modules/@tsparticles/updater-twinkle": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/updater-twinkle/-/updater-twinkle-3.8.1.tgz", - "integrity": "sha512-ETJ1zLYp4vjSjmXDiXXr0yW4Vw8sL6XixM0NPU3yx/dKCVi9SGVMlRymfkxJV+9jMuU/pUCCmRnIdDS7YrDGmw==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" - } + "hasInstallScript": true, + "license": "MIT" }, - "node_modules/@tsparticles/updater-wobble": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/@tsparticles/updater-wobble/-/updater-wobble-3.8.1.tgz", - "integrity": "sha512-PkjVgeSkW0EebJQ9PdpwSMWU2fAvKsVSuH4KGmodYlgGkH0/zvKjMOPMEI6YRAor1/vF1soFyLYp9Vax7Ae13g==", - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1" + "node_modules/@tsparticles/react": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@tsparticles/react/-/react-3.0.0.tgz", + "integrity": "sha512-hjGEtTT1cwv6BcjL+GcVgH++KYs52bIuQGW3PWv7z3tMa8g0bd6RI/vWSLj7p//NZ3uTjEIeilYIUPBh7Jfq/Q==", + "peerDependencies": { + "@tsparticles/engine": "^3.0.2", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, "node_modules/@tybys/wasm-util": { @@ -3940,21 +3455,20 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.0.tgz", - "integrity": "sha512-QXwAlHlbcAwNlEEMKQS2RCgJsgXrTJdjXT08xEgbPFa2yYQgVjBymxP5DrfrE7X7iodSzd9qBUHUycdyVJTW1w==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.56.0.tgz", + "integrity": "sha512-lRyPDLzNCuae71A3t9NEINBiTn7swyOhvUj3MyUOxb8x6g6vPEFoOU+ZRmGMusNC3X3YMhqMIX7i8ShqhT74Pw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.34.0", - "@typescript-eslint/type-utils": "8.34.0", - "@typescript-eslint/utils": "8.34.0", - "@typescript-eslint/visitor-keys": "8.34.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/type-utils": "8.56.0", + "@typescript-eslint/utils": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", + "ignore": "^7.0.5", "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3964,9 +3478,9 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.34.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "@typescript-eslint/parser": "^8.56.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { @@ -3980,17 +3494,17 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.0.tgz", - "integrity": "sha512-vxXJV1hVFx3IXz/oy2sICsJukaBrtDEQSBiV48/YIV5KWjX1dO+bcIr/kCPrW6weKXvsaGKFNlwH0v2eYdRRbA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.56.0.tgz", + "integrity": "sha512-IgSWvLobTDOjnaxAfDTIHaECbkNlAlKv2j5SjpB2v7QHKv1FIfjwMy8FsDbVfDX/KjmCmYICcw7uGaXLhtsLNg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.34.0", - "@typescript-eslint/types": "8.34.0", - "@typescript-eslint/typescript-estree": "8.34.0", - "@typescript-eslint/visitor-keys": "8.34.0", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4000,20 +3514,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.0.tgz", - "integrity": "sha512-iEgDALRf970/B2YExmtPMPF54NenZUf4xpL3wsCRx/lgjz6ul/l13R81ozP/ZNuXfnLCS+oPmG7JIxfdNYKELw==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.56.0.tgz", + "integrity": "sha512-M3rnyL1vIQOMeWxTWIW096/TtVP+8W3p/XnaFflhmcFp+U4zlxUxWj4XwNs6HbDeTtN4yun0GNTTDBw/SvufKg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.34.0", - "@typescript-eslint/types": "^8.34.0", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.56.0", + "@typescript-eslint/types": "^8.56.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4023,18 +3537,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.0.tgz", - "integrity": "sha512-9Ac0X8WiLykl0aj1oYQNcLZjHgBojT6cW68yAgZ19letYu+Hxd0rE0veI1XznSSst1X5lwnxhPbVdwjDRIomRw==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.56.0.tgz", + "integrity": "sha512-7UiO/XwMHquH+ZzfVCfUNkIXlp/yQjjnlYUyYz7pfvlK3/EyyN6BK+emDmGNyQLBtLGaYrTAI6KOw8tFucWL2w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.34.0", - "@typescript-eslint/visitor-keys": "8.34.0" + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4045,9 +3559,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.0.tgz", - "integrity": "sha512-+W9VYHKFIzA5cBeooqQxqNriAP0QeQ7xTiDuIOr71hzgffm3EL2hxwWBIIj4GuofIbKxGNarpKqIq6Q6YrShOA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.56.0.tgz", + "integrity": "sha512-bSJoIIt4o3lKXD3xmDh9chZcjCz5Lk8xS7Rxn+6l5/pKrDpkCwtQNQQwZ2qRPk7TkUYhrq3WPIHXOXlbXP0itg==", "dev": true, "license": "MIT", "engines": { @@ -4058,20 +3572,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.0.tgz", - "integrity": "sha512-n7zSmOcUVhcRYC75W2pnPpbO1iwhJY3NLoHEtbJwJSNlVAZuwqu05zY3f3s2SDWWDSo9FdN5szqc73DCtDObAg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.56.0.tgz", + "integrity": "sha512-qX2L3HWOU2nuDs6GzglBeuFXviDODreS58tLY/BALPC7iu3Fa+J7EOTwnX9PdNBxUI7Uh0ntP0YWGnxCkXzmfA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.34.0", - "@typescript-eslint/utils": "8.34.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0", + "@typescript-eslint/utils": "8.56.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4081,14 +3596,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.0.tgz", - "integrity": "sha512-9V24k/paICYPniajHfJ4cuAWETnt7Ssy+R0Rbcqo5sSFr3QEZ/8TSoUi9XeXVBGXCaLtwTOKSLGcInCAvyZeMA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.56.0.tgz", + "integrity": "sha512-DBsLPs3GsWhX5HylbP9HNG15U0bnwut55Lx12bHB9MpXxQ+R5GC8MwQe+N1UFXxAeQDvEsEDY6ZYwX03K7Z6HQ==", "dev": true, "license": "MIT", "engines": { @@ -4100,22 +3615,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.0.tgz", - "integrity": "sha512-rOi4KZxI7E0+BMqG7emPSK1bB4RICCpF7QD3KCLXn9ZvWoESsOMlHyZPAHyG04ujVplPaHbmEvs34m+wjgtVtg==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.56.0.tgz", + "integrity": "sha512-ex1nTUMWrseMltXUHmR2GAQ4d+WjkZCT4f+4bVsps8QEdh0vlBsaCokKTPlnqBFqqGaxilDNJG7b8dolW2m43Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.34.0", - "@typescript-eslint/tsconfig-utils": "8.34.0", - "@typescript-eslint/types": "8.34.0", - "@typescript-eslint/visitor-keys": "8.34.0", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/project-service": "8.56.0", + "@typescript-eslint/tsconfig-utils": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/visitor-keys": "8.56.0", + "debug": "^4.4.3", + "minimatch": "^9.0.5", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4125,49 +3639,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -4185,16 +3669,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.0.tgz", - "integrity": "sha512-8L4tWatGchV9A1cKbjaavS6mwYwp39jql8xUmIIKJdm+qiaeHy5KMKlBrf30akXAWBzn2SqKsNOtSENWUwg7XQ==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.56.0.tgz", + "integrity": "sha512-RZ3Qsmi2nFGsS+n+kjLAYDPVlrzf7UhTffrDIKr+h2yzAlYP/y5ZulU0yeDEPItos2Ph46JAL5P/On3pe7kDIQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.34.0", - "@typescript-eslint/types": "8.34.0", - "@typescript-eslint/typescript-estree": "8.34.0" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.0", + "@typescript-eslint/types": "8.56.0", + "@typescript-eslint/typescript-estree": "8.56.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4204,19 +3688,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.0.tgz", - "integrity": "sha512-qHV7pW7E85A0x6qyrFn+O+q1k1p3tQCsqIZ1KZ5ESLXY57aTvUd3/a4rdPTeXisvhXn2VQG0VSKUqs8KHF2zcA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.56.0.tgz", + "integrity": "sha512-q+SL+b+05Ud6LbEE35qe4A99P+htKTKVbyiNEe45eCbJFyh/HVK9QXwlrbz+Q4L8SOW4roxSVwXYj4DMBT7Ieg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.34.0", - "eslint-visitor-keys": "^4.2.0" + "@typescript-eslint/types": "8.56.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -4226,6 +3710,19 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.0.tgz", + "integrity": "sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@unrs/resolver-binding-darwin-arm64": { "version": "1.7.12", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.12.tgz", @@ -4876,17 +4373,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", @@ -5013,25 +4499,11 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, - "node_modules/color": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", - "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", - "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.9.0" - }, - "engines": { - "node": ">=12.5.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "color-name": "~1.1.4" @@ -5044,20 +4516,9 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "devOptional": true, + "dev": true, "license": "MIT" }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "optional": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, "node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -5287,9 +4748,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { @@ -5358,9 +4819,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "devOptional": true, "license": "Apache-2.0", "engines": { @@ -5724,33 +5185,32 @@ } }, "node_modules/eslint": { - "version": "9.28.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.28.0.tgz", - "integrity": "sha512-ocgh41VhRlf9+fVpe7QKzwLj9c92fDiqOj8Y3Sd4/ZmVA4Btx4PlUYPq4pp9JDyupkf1upbEXecxL2mwNV7jPQ==", + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.0", - "@eslint/config-helpers": "^0.2.1", - "@eslint/core": "^0.14.0", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.28.0", - "@eslint/plugin-kit": "^0.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.3.0", - "eslint-visitor-keys": "^4.2.0", - "espree": "^10.3.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -5785,13 +5245,13 @@ } }, "node_modules/eslint-config-next": { - "version": "15.3.3", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.3.3.tgz", - "integrity": "sha512-QJLv/Ouk2vZnxL4b67njJwTLjTf7uZRltI0LL4GERYR4qMF5z08+gxkfODAeaK7TiC6o+cER91bDaEnwrTWV6Q==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.5.12.tgz", + "integrity": "sha512-ktW3XLfd+ztEltY5scJNjxjHwtKWk6vU2iwzZqSN09UsbBmMeE/cVlJ1yESg6Yx5LW7p/Z8WzUAgYXGLEmGIpg==", "dev": true, "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "15.3.3", + "@next/eslint-plugin-next": "15.5.12", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", @@ -6501,13 +5961,6 @@ "dev": true, "license": "ISC" }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -6672,13 +6125,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT", - "optional": true - }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", @@ -7112,9 +6558,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { @@ -7639,9 +7085,9 @@ } }, "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", "dependencies": { @@ -7651,22 +7097,6 @@ "node": ">= 18" } }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/motion-dom": { "version": "12.18.1", "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.18.1.tgz", @@ -7731,15 +7161,13 @@ "license": "MIT" }, "node_modules/next": { - "version": "15.3.8", - "resolved": "https://registry.npmjs.org/next/-/next-15.3.8.tgz", - "integrity": "sha512-L+4c5Hlr84fuaNADZbB9+ceRX9/CzwxJ+obXIGHupboB/Q1OLbSUapFs4bO8hnS/E6zV/JDX7sG1QpKVR2bguA==", + "version": "15.5.12", + "resolved": "https://registry.npmjs.org/next/-/next-15.5.12.tgz", + "integrity": "sha512-Fi/wQ4Etlrn60rz78bebG1i1SR20QxvV8tVp6iJspjLUSHcZoeUXCt+vmWoEcza85ElZzExK/jJ/F6SvtGktjA==", "license": "MIT", "dependencies": { - "@next/env": "15.3.8", - "@swc/counter": "0.1.3", + "@next/env": "15.5.12", "@swc/helpers": "0.5.15", - "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" @@ -7751,19 +7179,19 @@ "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "15.3.5", - "@next/swc-darwin-x64": "15.3.5", - "@next/swc-linux-arm64-gnu": "15.3.5", - "@next/swc-linux-arm64-musl": "15.3.5", - "@next/swc-linux-x64-gnu": "15.3.5", - "@next/swc-linux-x64-musl": "15.3.5", - "@next/swc-win32-arm64-msvc": "15.3.5", - "@next/swc-win32-x64-msvc": "15.3.5", - "sharp": "^0.34.1" + "@next/swc-darwin-arm64": "15.5.12", + "@next/swc-darwin-x64": "15.5.12", + "@next/swc-linux-arm64-gnu": "15.5.12", + "@next/swc-linux-arm64-musl": "15.5.12", + "@next/swc-linux-x64-gnu": "15.5.12", + "@next/swc-linux-x64-musl": "15.5.12", + "@next/swc-win32-arm64-msvc": "15.5.12", + "@next/swc-win32-x64-msvc": "15.5.12", + "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", - "@playwright/test": "^1.41.2", + "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", @@ -8242,34 +7670,6 @@ "dev": true, "license": "MIT" }, - "node_modules/react-tsparticles": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/react-tsparticles/-/react-tsparticles-2.12.2.tgz", - "integrity": "sha512-/nrEbyL8UROXKIMXe+f+LZN2ckvkwV2Qa+GGe/H26oEIc+wq/ybSG9REDwQiSt2OaDQGu0MwmA4BKmkL6wAWcA==", - "deprecated": "@tsparticles/react is the new version, please use that", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "tsparticles-engine": "^2.12.0" - }, - "peerDependencies": { - "react": ">=16" - } - }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -8523,9 +7923,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "devOptional": true, "license": "ISC", "bin": { @@ -8585,16 +7985,16 @@ } }, "node_modules/sharp": { - "version": "0.34.2", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.2.tgz", - "integrity": "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==", + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "hasInstallScript": true, "license": "Apache-2.0", "optional": true, "dependencies": { - "color": "^4.2.3", - "detect-libc": "^2.0.4", - "semver": "^7.7.2" + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.2", + "semver": "^7.7.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" @@ -8603,27 +8003,30 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.34.2", - "@img/sharp-darwin-x64": "0.34.2", - "@img/sharp-libvips-darwin-arm64": "1.1.0", - "@img/sharp-libvips-darwin-x64": "1.1.0", - "@img/sharp-libvips-linux-arm": "1.1.0", - "@img/sharp-libvips-linux-arm64": "1.1.0", - "@img/sharp-libvips-linux-ppc64": "1.1.0", - "@img/sharp-libvips-linux-s390x": "1.1.0", - "@img/sharp-libvips-linux-x64": "1.1.0", - "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", - "@img/sharp-libvips-linuxmusl-x64": "1.1.0", - "@img/sharp-linux-arm": "0.34.2", - "@img/sharp-linux-arm64": "0.34.2", - "@img/sharp-linux-s390x": "0.34.2", - "@img/sharp-linux-x64": "0.34.2", - "@img/sharp-linuxmusl-arm64": "0.34.2", - "@img/sharp-linuxmusl-x64": "0.34.2", - "@img/sharp-wasm32": "0.34.2", - "@img/sharp-win32-arm64": "0.34.2", - "@img/sharp-win32-ia32": "0.34.2", - "@img/sharp-win32-x64": "0.34.2" + "@img/sharp-darwin-arm64": "0.34.5", + "@img/sharp-darwin-x64": "0.34.5", + "@img/sharp-libvips-darwin-arm64": "1.2.4", + "@img/sharp-libvips-darwin-x64": "1.2.4", + "@img/sharp-libvips-linux-arm": "1.2.4", + "@img/sharp-libvips-linux-arm64": "1.2.4", + "@img/sharp-libvips-linux-ppc64": "1.2.4", + "@img/sharp-libvips-linux-riscv64": "1.2.4", + "@img/sharp-libvips-linux-s390x": "1.2.4", + "@img/sharp-libvips-linux-x64": "1.2.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", + "@img/sharp-libvips-linuxmusl-x64": "1.2.4", + "@img/sharp-linux-arm": "0.34.5", + "@img/sharp-linux-arm64": "0.34.5", + "@img/sharp-linux-ppc64": "0.34.5", + "@img/sharp-linux-riscv64": "0.34.5", + "@img/sharp-linux-s390x": "0.34.5", + "@img/sharp-linux-x64": "0.34.5", + "@img/sharp-linuxmusl-arm64": "0.34.5", + "@img/sharp-linuxmusl-x64": "0.34.5", + "@img/sharp-wasm32": "0.34.5", + "@img/sharp-win32-arm64": "0.34.5", + "@img/sharp-win32-ia32": "0.34.5", + "@img/sharp-win32-x64": "0.34.5" } }, "node_modules/shebang-command": { @@ -8725,16 +8128,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "optional": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", @@ -8782,14 +8175,6 @@ "node": ">= 0.4" } }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -9026,17 +8411,16 @@ } }, "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.9.tgz", + "integrity": "sha512-BTLcK0xsDh2+PUe9F6c2TlRp4zOOBMTkoQHQIWSIzI0R7KG46uEwq4OPk2W7bZcprBMsuaeFsqwYr7pjh6CuHg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", + "minizlib": "^3.1.0", "yallist": "^5.0.0" }, "engines": { @@ -9044,14 +8428,14 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -9061,11 +8445,14 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", - "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", + "version": "6.5.0", + "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" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -9076,9 +8463,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", "engines": { @@ -9102,9 +8489,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", + "integrity": "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==", "dev": true, "license": "MIT", "engines": { @@ -9133,63 +8520,6 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, - "node_modules/tsparticles": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/tsparticles/-/tsparticles-3.8.1.tgz", - "integrity": "sha512-8hrG4dZMg5xxJEJ6ZA6qwdQUQjtguI+VCtl1kvp2QlgmX6qvegv0jizO3gKKUZ9QAwprIW57YeA7UTPvFvxYWw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "license": "MIT", - "dependencies": { - "@tsparticles/engine": "3.8.1", - "@tsparticles/interaction-external-trail": "3.8.1", - "@tsparticles/plugin-absorbers": "3.8.1", - "@tsparticles/plugin-emitters": "3.8.1", - "@tsparticles/plugin-emitters-shape-circle": "3.8.1", - "@tsparticles/plugin-emitters-shape-square": "3.8.1", - "@tsparticles/shape-text": "3.8.1", - "@tsparticles/slim": "3.8.1", - "@tsparticles/updater-destroy": "3.8.1", - "@tsparticles/updater-roll": "3.8.1", - "@tsparticles/updater-tilt": "3.8.1", - "@tsparticles/updater-twinkle": "3.8.1", - "@tsparticles/updater-wobble": "3.8.1" - } - }, - "node_modules/tsparticles-engine": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/tsparticles-engine/-/tsparticles-engine-2.12.0.tgz", - "integrity": "sha512-ZjDIYex6jBJ4iMc9+z0uPe7SgBnmb6l+EJm83MPIsOny9lPpetMsnw/8YJ3xdxn8hV+S3myTpTN1CkOVmFv0QQ==", - "deprecated": "starting from tsparticles v3 the packages are now moved to @tsparticles/package-name instead of tsparticles-package-name", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "hasInstallScript": true, - "license": "MIT" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index 3bba85d..b42c973 100644 --- a/package.json +++ b/package.json @@ -9,23 +9,23 @@ "lint": "next lint" }, "dependencies": { + "@tsparticles/engine": "^3.9.1", + "@tsparticles/react": "^3.0.0", "framer-motion": "^12.18.1", - "next": "15.3.8", + "next": "15.5.12", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-tsparticles": "^2.12.2", - "stats.js": "^0.17.0", - "tsparticles": "^3.8.1" + "stats.js": "^0.17.0" }, "devDependencies": { - "@eslint/eslintrc": "^3", + "@eslint/eslintrc": "^3.3.3", "@svgr/webpack": "^8.1.0", "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", - "eslint": "^9", - "eslint-config-next": "15.3.3", + "eslint": "^9.39.2", + "eslint-config-next": "15.5.12", "tailwindcss": "^4", "typescript": "^5" } diff --git a/public/assets/contact-section/ethereum-foundation-official.svg b/public/assets/contact-section/ethereum-foundation-official.svg new file mode 100644 index 0000000..d22a55f --- /dev/null +++ b/public/assets/contact-section/ethereum-foundation-official.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/public/assets/contact-section/security-alliance-official.svg b/public/assets/contact-section/security-alliance-official.svg new file mode 100644 index 0000000..1b348cc --- /dev/null +++ b/public/assets/contact-section/security-alliance-official.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/assets/contact-section/wedf-logo.png b/public/assets/contact-section/wedf-logo.png new file mode 100644 index 0000000..72ca57b Binary files /dev/null and b/public/assets/contact-section/wedf-logo.png differ diff --git a/src/app/components/Card.tsx b/src/app/components/Card.tsx index b8791a8..820d859 100644 --- a/src/app/components/Card.tsx +++ b/src/app/components/Card.tsx @@ -9,19 +9,56 @@ interface CardProps { onExplore: () => void; buttonText?: string; links?: CardLink[]; + variant?: 'default' | 'ethos'; } -const Card: React.FC = ({ title, description, onClose, onExplore, buttonText, links }) => { - return ( -
-
-
-
+const toSafeExternalUrl = (value: string): string | null => { + try { + const parsed = new URL(value); + if (parsed.protocol === 'https:' || parsed.protocol === 'http:') { + return parsed.toString(); + } + return null; + } catch { + return null; + } +}; + +const Card: React.FC = ({ + title, + description, + onClose, + onExplore, + buttonText, + links, + variant = 'default', +}) => { + const isEthos = variant === 'ethos'; + + return ( +
+
+
+ {isEthos && ( +
+ )} +
{onClose && ( )} -

{title}

-

+

{title}

+

+ {description} +

{links && links.length > 0 ? ( -
- {links.map((link, idx) => ( - - {link.label} - - ))} +
+ {links.map((link, idx) => { + const safeUrl = toSafeExternalUrl(link.url); + if (!safeUrl) { + return null; + } + + return ( + + {link.label} + + ); + })}
) : ( = ({ title, description, onClose, onExplore, but e.preventDefault(); onExplore(); }} - className="text-white hover:text-white/80 text-base font-spartan-subtitle transition-colors uppercase underline underline-offset-2 decoration-white mt-6" + className={`font-spartan-subtitle transition-colors uppercase underline underline-offset-2 mt-6 ${ + isEthos + ? 'text-white/90 hover:text-white text-sm decoration-white/60' + : 'text-white hover:text-white/80 text-base decoration-white' + }`} > {buttonText || "Explore"} @@ -79,4 +128,4 @@ const Card: React.FC = ({ title, description, onClose, onExplore, but ); }; -export default Card; \ No newline at end of file +export default Card; diff --git a/src/app/components/ContributorMiniCard.tsx b/src/app/components/ContributorMiniCard.tsx new file mode 100644 index 0000000..56cabe6 --- /dev/null +++ b/src/app/components/ContributorMiniCard.tsx @@ -0,0 +1,113 @@ +import Image from "next/image"; +import React from "react"; + +import { ContributorProfile } from "../data/membersConfig"; + +interface ContributorMiniCardProps { + contributor: ContributorProfile; +} + +const toSafeExternalUrl = (value?: string): string | null => { + if (!value) { + return null; + } + + try { + const parsed = new URL(value); + if (parsed.protocol === "https:" || parsed.protocol === "http:") { + return parsed.toString(); + } + return null; + } catch { + return null; + } +}; + +const ContributorMiniCard: React.FC = ({ contributor }) => { + const initials = + contributor.alias + .split(" ") + .map((part) => part[0]) + .join("") + .slice(0, 2) + .toUpperCase() || contributor.name.slice(0, 2).toUpperCase(); + + const fallbackGithubAvatar = contributor.githubUsername + ? `https://github.com/${encodeURIComponent(contributor.githubUsername)}.png?size=256` + : undefined; + const avatarUrl = + toSafeExternalUrl(contributor.avatar) || toSafeExternalUrl(fallbackGithubAvatar); + + return ( +
+
+ +
+
+
+
+ {avatarUrl ? ( + {contributor.name} + ) : ( +
+ {initials} +
+ )} +
+ +
+

+ {contributor.alias} +

+

+ {contributor.title} +

+
+

+ {contributor.className} +

+ + Lv {contributor.level} + +
+
+
+ +
+

+ Projects +

+
+ {contributor.projects.slice(0, 3).map((project) => ( +

+ {project} +

+ ))} +
+
+
+ +
+

+ Participation Score +

+

+ {contributor.participationScore} +

+
+
+
+ ); +}; + +export default ContributorMiniCard; diff --git a/src/app/components/MainContent.tsx b/src/app/components/MainContent.tsx index a0445e3..dc52581 100644 --- a/src/app/components/MainContent.tsx +++ b/src/app/components/MainContent.tsx @@ -2,10 +2,24 @@ import React, { useRef, useState, useEffect } from 'react'; import Image from 'next/image'; -const TRANSITION_SCROLL = 50; // Scroll para activar transición +const TRANSITION_SCROLL = 500; +const COLOR_START = { r: 255, g: 255, b: 255 }; +const COLOR_END = { r: 247, g: 57, b: 47 }; + +function lerpColor( + a: { r: number; g: number; b: number }, + b: { r: number; g: number; b: number }, + t: number +) { + return { + r: Math.round(a.r + (b.r - a.r) * t), + g: Math.round(a.g + (b.g - a.g) * t), + b: Math.round(a.b + (b.b - a.b) * t), + }; +} const MainContent = ({ onSectionEnd, transitioning: parentTransitioning }: { onSectionEnd: () => void; transitioning?: boolean }) => { - const [, setProgress] = useState(0); // 0 a 1 + const [progress, setProgress] = useState(0); const [transitioning, setTransitioning] = useState(false); const [blockScroll, setBlockScroll] = useState(false); const [showSection, setShowSection] = useState(true); @@ -45,6 +59,7 @@ const MainContent = ({ onSectionEnd, transitioning: parentTransitioning }: { onS ' with research, tools and resources', ' for the public good.' ]; + const text = lines.join(''); if (!showSection) return null; @@ -80,21 +95,31 @@ const MainContent = ({ onSectionEnd, transitioning: parentTransitioning }: { onS

- {lines.map((line, lineIndex) => ( -
- {line.split('').map((char, charIndex) => ( - - {char === ' ' ? '\u00A0' : char} - - ))} -
- ))} + {lines.map((line, lineIndex) => { + const startIndex = text.indexOf(line); + return ( +
+ {line.split('').map((char, charIndex) => { + const index = startIndex + charIndex; + const t = Math.max(0, Math.min(1, progress * text.length - index)); + const color = lerpColor(COLOR_START, COLOR_END, t); + const isActive = t >= 1; + return ( + + {char === ' ' ? '\u00A0' : char} + + ); + })} +
+ ); + })}

diff --git a/src/app/components/MemberCard.tsx b/src/app/components/MemberCard.tsx new file mode 100644 index 0000000..543d109 --- /dev/null +++ b/src/app/components/MemberCard.tsx @@ -0,0 +1,136 @@ +import React from "react"; +import Image from "next/image"; + +import { MemberProfile } from "../data/membersConfig"; +import RadarChart from "./RadarChart"; +import SkillTree from "./SkillTree"; + +interface MemberCardProps { + member: MemberProfile; +} + +const toSafeExternalUrl = (value?: string): string | null => { + if (!value) { + return null; + } + + try { + const parsed = new URL(value); + if (parsed.protocol === "https:" || parsed.protocol === "http:") { + return parsed.toString(); + } + return null; + } catch { + return null; + } +}; + +const MemberCard: React.FC = ({ member }) => { + const initials = + member.alias + .split(" ") + .map((part) => part[0]) + .join("") + .slice(0, 2) + .toUpperCase() || member.name.slice(0, 2).toUpperCase(); + const fallbackGithubAvatar = member.githubUsername + ? `https://github.com/${encodeURIComponent(member.githubUsername)}.png?size=256` + : undefined; + const avatarUrl = + toSafeExternalUrl(member.avatar) || toSafeExternalUrl(fallbackGithubAvatar); + + return ( +
+
+
+
+
+
+
+ {avatarUrl ? ( + {member.name} + ) : ( +
+ {initials} +
+ )} +
+
+
+
{member.name}
+
+ {member.alias} +
+
{member.title}
+
+
+ +
+ + Level {member.level} + + + {member.className} + +
+ +

{member.bio}

+ +
    + {member.highlights.map((item) => ( +
  • + + {item} +
  • + ))} +
+ +
+ {member.specialties.map((item) => ( + + {item} + + ))} +
+
+ +
+ + +
+
+

+ Radix Chart +

+ Capability Mesh +
+
+ +
+
+ {member.radar.map((stat) => ( +
+ {stat.label} + + {stat.value} + +
+ ))} +
+
+
+
+
+ ); +}; + +export default MemberCard; diff --git a/src/app/components/MemberPreviewCard.tsx b/src/app/components/MemberPreviewCard.tsx new file mode 100644 index 0000000..33c6b42 --- /dev/null +++ b/src/app/components/MemberPreviewCard.tsx @@ -0,0 +1,142 @@ +import Image from "next/image"; +import React from "react"; + +import { MemberProfile } from "../data/membersConfig"; +import RadarChart from "./RadarChart"; + +interface MemberPreviewCardProps { + member: MemberProfile; + isActive: boolean; + onSelect: () => void; +} + +const toSafeExternalUrl = (value?: string): string | null => { + if (!value) { + return null; + } + + try { + const parsed = new URL(value); + if (parsed.protocol === "https:" || parsed.protocol === "http:") { + return parsed.toString(); + } + return null; + } catch { + return null; + } +}; + +const MemberPreviewCard: React.FC = ({ + member, + isActive, + onSelect, +}) => { + const initials = + member.alias + .split(" ") + .map((part) => part[0]) + .join("") + .slice(0, 2) + .toUpperCase() || member.name.slice(0, 2).toUpperCase(); + const fallbackGithubAvatar = member.githubUsername + ? `https://github.com/${encodeURIComponent(member.githubUsername)}.png?size=256` + : undefined; + const avatarUrl = + toSafeExternalUrl(member.avatar) || toSafeExternalUrl(fallbackGithubAvatar); + const socials = [ + { key: "github", label: "GH", href: toSafeExternalUrl(member.socials?.github) }, + { key: "x", label: "X", href: toSafeExternalUrl(member.socials?.x) }, + { key: "linkedin", label: "IN", href: toSafeExternalUrl(member.socials?.linkedin) }, + { key: "website", label: "WEB", href: toSafeExternalUrl(member.socials?.website) }, + ]; + + return ( +
{ + if (event.key === "Enter" || event.key === " ") { + event.preventDefault(); + onSelect(); + } + }} + className={`relative w-full max-w-[320px] overflow-hidden rounded-2xl border p-2.5 text-left transition-all ${ + isActive + ? "border-[#f7392f]/70 bg-[#1a1111]/92 shadow-[0_0_24px_rgba(247,57,47,0.22)]" + : "border-white/10 bg-black/45 hover:border-white/25" + }`} + > +
+
+
+
+
+ {avatarUrl ? ( + {member.name} + ) : ( +
+ {initials} +
+ )} +
+
+

+ {member.alias} +

+

+ {member.title} +

+
+

+ {member.className} +

+ + Lv {member.level} + +
+
+
+ +
+
+ +
+
+
+
+ + +
+ ); +}; + +export default MemberPreviewCard; diff --git a/src/app/components/Navbar.tsx b/src/app/components/Navbar.tsx index 795e4e6..16ed852 100644 --- a/src/app/components/Navbar.tsx +++ b/src/app/components/Navbar.tsx @@ -3,11 +3,16 @@ import Image from "next/image"; import Link from "next/link"; import { usePathname } from "next/navigation"; -import React, { useState } from "react"; +import React, { useEffect, useRef, useState } from "react"; const Navbar = () => { const pathname = usePathname(); const [isMenuOpen, setIsMenuOpen] = useState(false); + const [isWhoOpen, setIsWhoOpen] = useState(false); + const [isMobileWhoOpen, setIsMobileWhoOpen] = useState(false); + const closeWhoTimeoutRef = useRef | null>(null); + + const isWhoActive = pathname === "/members" || pathname === "/contributors"; const toggleMenu = () => { setIsMenuOpen(!isMenuOpen); @@ -15,147 +20,344 @@ const Navbar = () => { const closeMenu = () => { setIsMenuOpen(false); + setIsWhoOpen(false); + setIsMobileWhoOpen(false); + }; + + const clearWhoCloseTimer = () => { + if (closeWhoTimeoutRef.current) { + clearTimeout(closeWhoTimeoutRef.current); + closeWhoTimeoutRef.current = null; + } + }; + + const openWhoMenu = () => { + clearWhoCloseTimer(); + setIsWhoOpen(true); + }; + + const scheduleWhoClose = () => { + clearWhoCloseTimer(); + closeWhoTimeoutRef.current = setTimeout(() => { + setIsWhoOpen(false); + }, 220); }; + useEffect(() => { + return () => { + clearWhoCloseTimer(); + }; + }, []); + return ( - + )} + + ); }; -export default Navbar; \ No newline at end of file +export default Navbar; diff --git a/src/app/components/RadarChart.tsx b/src/app/components/RadarChart.tsx new file mode 100644 index 0000000..d05a003 --- /dev/null +++ b/src/app/components/RadarChart.tsx @@ -0,0 +1,150 @@ +import React from "react"; + +import { MemberStat } from "../data/membersConfig"; + +interface RadarChartProps { + stats: MemberStat[]; + size?: number; + showLabels?: boolean; +} + +const RADAR_LABEL_ABBREVIATIONS: Record = { + SOCIAL: "SOC", + EDUCATION: "EDU", + ART: "ART", + DEVELOPMENT: "DEV", + OPERATIONS: "OPS", + SECURITY: "SEC", +}; + +const toRadarLabel = (label: string): string => { + const normalized = label.trim().toUpperCase(); + return RADAR_LABEL_ABBREVIATIONS[normalized] || normalized.slice(0, 3); +}; + +const RadarChart: React.FC = ({ stats, size = 220, showLabels = true }) => { + if (!stats.length) { + return null; + } + + const isCompact = !showLabels || size <= 96; + const padding = showLabels ? 24 : 14; + const center = size / 2; + const radius = size / 2 - padding; + const angleStep = (Math.PI * 2) / stats.length; + const maxValue = 100; + const pointRadius = isCompact ? Math.max(0.9, size * 0.012) : 3; + const pointStroke = isCompact ? 0.55 : 1; + const axisStroke = isCompact ? 0.7 : 1; + const polygonStroke = isCompact ? 1.15 : 2; + + const buildPolygon = (ratio: number) => + stats + .map((_, index) => { + const angle = -Math.PI / 2 + index * angleStep; + const r = radius * ratio; + const x = center + Math.cos(angle) * r; + const y = center + Math.sin(angle) * r; + return `${x.toFixed(2)},${y.toFixed(2)}`; + }) + .join(" "); + + const dataPolygon = stats + .map((stat, index) => { + const angle = -Math.PI / 2 + index * angleStep; + const r = (stat.value / maxValue) * radius; + const x = center + Math.cos(angle) * r; + const y = center + Math.sin(angle) * r; + return `${x.toFixed(2)},${y.toFixed(2)}`; + }) + .join(" "); + + const labelRadius = radius + 14; + + return ( + + ); +}; + +export default RadarChart; diff --git a/src/app/components/Scene.tsx b/src/app/components/Scene.tsx index c5d82b4..a5d49a8 100644 --- a/src/app/components/Scene.tsx +++ b/src/app/components/Scene.tsx @@ -69,6 +69,19 @@ const Scene: React.FC = ({ show, transitioning, onBack }) => { }; }, [show, transitioning, onBack]); + React.useEffect(() => { + if (!activeCard) return; + const handleKeyDown = (event: KeyboardEvent) => { + if (event.key === 'Escape') { + setActiveCard(null); + setActiveElement(null); + setIsTempleHovered(false); + } + }; + window.addEventListener('keydown', handleKeyDown); + return () => window.removeEventListener('keydown', handleKeyDown); + }, [activeCard]); + // Handle custom cursor useEffect(() => { if (!customCursor.visible || !isDesktop) return; @@ -245,21 +258,20 @@ const Scene: React.FC = ({ show, transitioning, onBack }) => {
{activeCard && ( - <> -
-
-
e.stopPropagation()}> - -
+
+
+
e.stopPropagation()}> +
- +
)} {/* Bottom Left Flower */} @@ -340,4 +352,4 @@ const Scene: React.FC = ({ show, transitioning, onBack }) => { ); }; -export default Scene; \ No newline at end of file +export default Scene; diff --git a/src/app/components/SkillTree.tsx b/src/app/components/SkillTree.tsx new file mode 100644 index 0000000..9fc3cb1 --- /dev/null +++ b/src/app/components/SkillTree.tsx @@ -0,0 +1,222 @@ +import React, { useMemo, useState } from "react"; + +import { CareerPathNode, SkillTier } from "../data/membersConfig"; + +const MAX_LEVEL = 5; +const HEXAGON_CLIP_PATH = "polygon(25% 5%, 75% 5%, 100% 50%, 75% 95%, 25% 95%, 0 50%)"; +const SKILL_EMOJIS = ["🛡️", "🧠", "⚙️", "🔍", "🧪", "📡", "🧰", "🛰️", "🗝️", "🚀"]; + +type SkillBadge = { + id: string; + label: string; + description: string; + level: number; + requires: string[]; + emoji: string; +}; + +interface SkillTreeProps { + tiers: SkillTier[]; + careerPath?: CareerPathNode[]; +} + +interface LevelPipsProps { + level: number; + compact?: boolean; +} + +const normalizeRequires = (requires?: string | string[]): string[] => { + if (!requires) { + return []; + } + const values = Array.isArray(requires) ? requires : [requires]; + return values.map((value) => value.trim()).filter(Boolean); +}; + +const LevelPips: React.FC = ({ level, compact = false }) => ( + + {Array.from({ length: MAX_LEVEL }).map((_, index) => { + const active = index < level; + return ( + + ); + })} + +); + +const SkillTree: React.FC = ({ tiers, careerPath }) => { + const badges = useMemo(() => { + if (careerPath && careerPath.length > 0) { + return careerPath.map((node, index) => ({ + id: node.id, + label: node.label, + description: node.description, + level: node.level, + requires: normalizeRequires(node.requires), + emoji: SKILL_EMOJIS[index % SKILL_EMOJIS.length], + })); + } + + let emojiIndex = 0; + + return tiers.flatMap((tier, tierIndex) => + tier.nodes.map((node, nodeIndex) => { + const previousTier = tiers[tierIndex - 1]; + const previousNode = + previousTier?.nodes[Math.min(nodeIndex, previousTier.nodes.length - 1)]; + + const fallback: SkillBadge = { + id: `${tier.label}-${node.label}`, + label: node.label, + description: + node.description || + (tierIndex === 0 + ? `${node.label} is part of the core foundation every guild member starts with.` + : `${node.label} is developed during the ${tier.label.toLowerCase()} stage.`), + level: node.level, + requires: node.requires ? [node.requires] : previousNode ? [previousNode.label] : [], + emoji: SKILL_EMOJIS[emojiIndex % SKILL_EMOJIS.length], + }; + + emojiIndex += 1; + return fallback; + }) + ); + }, [careerPath, tiers]); + + const [activeBadgeId, setActiveBadgeId] = useState(badges[0]?.id || ""); + + const badgeById = useMemo(() => { + const map = new Map(); + badges.forEach((badge) => map.set(badge.id, badge)); + return map; + }, [badges]); + + const badgeByLabel = useMemo(() => { + const map = new Map(); + badges.forEach((badge) => { + if (!map.has(badge.label.toLowerCase())) { + map.set(badge.label.toLowerCase(), badge); + } + }); + return map; + }, [badges]); + + const activeBadge = badgeById.get(activeBadgeId) || badges[0] || null; + + const activeDependencies = (activeBadge?.requires || []).map((requiredLabel) => { + const requiredBadge = badgeByLabel.get(requiredLabel.toLowerCase()); + return { + label: requiredLabel, + level: requiredBadge?.level || 0, + }; + }); + + return ( +
+
+

+ Career Badges +

+ Compact View +
+ +
+ {badges.map((badge) => { + const isActive = activeBadge?.id === badge.id; + + return ( + + ); + })} +
+ +
+ {activeBadge ? ( +
+
+

+ {activeBadge.label} +

+ +
+ +

+ {activeBadge.description} +

+ +
+

+ Dependencies +

+ {activeDependencies.length > 0 ? ( +
+ {activeDependencies.map((dependency) => ( + + {dependency.label} + + + ))} +
+ ) : ( +

+ None +

+ )} +
+
+ ) : ( +
+

+ No skill badges configured. +

+
+ )} +
+
+ ); +}; + +export default SkillTree; diff --git a/src/app/components/SupportersCollaborators.tsx b/src/app/components/SupportersCollaborators.tsx index 73c0aad..48befdc 100644 --- a/src/app/components/SupportersCollaborators.tsx +++ b/src/app/components/SupportersCollaborators.tsx @@ -5,14 +5,79 @@ import Image from 'next/image'; const SupportersCollaborators: React.FC = () => { return ( -
- Supporters & Collaborators -
- - Ethereum Foundation +
+
+

+ About the Guild +

+

+ Supporters & Collaborators +

+

+ We collaborate with aligned organizations that support The Red Guild through grants, + shared security initiatives, and ecosystem efforts focused on public-benefit outcomes. +

+
+ +
+
+

Aligned partners

+

+ Foundations, security alliances, and public-interest groups helping sustain research, + tooling, and education for a safer ecosystem. +

+
+
+

Support model

+

+ Grants, donations, and collaborative programs that keep public-benefit security work + active and broadly accessible. +

+
+
+ +

diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx index 11263f9..392970c 100644 --- a/src/app/contact/page.tsx +++ b/src/app/contact/page.tsx @@ -1,45 +1,86 @@ 'use client'; +import Link from "next/link"; + import Navbar from "../components/Navbar"; import BackgroundClouds from "../components/BackgroundClouds"; import ParticlesDOM from '../components/ParticlesDOM'; -import XIcon from '../components/assets/XIcon'; -import Image from 'next/image'; export default function ContactPage() { return ( -

+
-
-

Contact Us

- - {/* Email - Prominent position */} -
- - hello@theredguild.org +
+ - {/* Social media icons */} -
-
- - - - - GitHub - - - Blog - +
+
+

Emergency channels

+ +
+
+

Include in your message

+
    +
  • Name
  • +
  • Handle
  • +
  • Organization
  • +
  • Email
  • +
- - {/* Supporters & Collaborators */} - {/* */}
); -} \ No newline at end of file +} diff --git a/src/app/contributors/page.tsx b/src/app/contributors/page.tsx new file mode 100644 index 0000000..b1d5e3e --- /dev/null +++ b/src/app/contributors/page.tsx @@ -0,0 +1,84 @@ +'use client'; + +import React, { useMemo } from "react"; + +import Navbar from "../components/Navbar"; +import BackgroundClouds from "../components/BackgroundClouds"; +import ParticlesDOM from "../components/ParticlesDOM"; +import ContributorMiniCard from "../components/ContributorMiniCard"; +import { contributors } from "../data/membersConfig"; + +export default function ContributorsPage() { + const contributorsScoreboard = useMemo( + () => + [...contributors] + .sort((a, b) => b.participationScore - a.participationScore) + .slice(0, 10), + [] + ); + const totalParticipation2026 = useMemo( + () => contributors.reduce((sum, contributor) => sum + contributor.participationScore, 0), + [] + ); + + return ( +
+ + + + +
+
+

+ Who +

+

+ Contributors +

+

+ Community contributors who collaborated with The Red Guild on specific projects. +

+
+ +
+
+

+ Contributor Roster +

+
+ {contributors.map((contributor) => ( + + ))} +
+
+ + +
+
+
+ ); +} diff --git a/src/app/data/cardContent.ts b/src/app/data/cardContent.ts index 733362f..e6ebb7b 100644 --- a/src/app/data/cardContent.ts +++ b/src/app/data/cardContent.ts @@ -44,12 +44,16 @@ export const cardContent: CardContentMap = { }, topRightLights: { title: "Security Frameworks", - description: "A curated resource full of best practices and potential pitfalls in crypto security, collaborating with industry experts at the Security Alliance (SEAL).", + description: "A curated resource full of best practices and potential pitfalls in crypto security, collaborating with industry experts at Security Alliance (SEAL).", buttonText: "Learn & contribute", links: [ { label: "Learn & contribute", url: "https://frameworks.securityalliance.dev" + }, + { + label: "Security Alliance (SEAL)", + url: "https://www.securityalliance.org/" } ] }, @@ -66,19 +70,27 @@ export const cardContent: CardContentMap = { url: "https://updraft.cyfrin.io/courses/security" }, { - label: "Undercover campaign at Ethereum Argentina", - url: "https://blog.theredguild.org/you-were-not-pwned-the-red-guild-ethereum-argentina-2023/" + label: "Security awareness campaign at Devconnect", + url: "https://blog.theredguild.org/against-all-odds-security-awareness-campaign-at-devconnect/" } ] }, letters: { title: "Security Research & Advisories", description: "Public investigations and technical posts like the Ethereum 7702 accounts deep dive, VSCode extensions audit, and the SLOVENLY COMET advisory.", - buttonText: "Read our blog", + buttonText: "Read our research", links: [ { - label: "Read our blog", - url: "https://blog.theredguild.org/" + label: "One Time Pwnage (SEAL Radar)", + url: "https://www.securityalliance.org/news/2025-03-slovenly-comet" + }, + { + label: "VSCode internals: escaping containers", + url: "https://blog.theredguild.org/leveraging-vscode-internals-to-escape-containers/" + }, + { + label: "Devcontainer security research (Part II)", + url: "https://blog.theredguild.org/where-do-you-run-your-code-part-ii-2/" } ] }, @@ -100,4 +112,4 @@ export const cardContent: CardContentMap = { } ] } -}; \ No newline at end of file +}; diff --git a/src/app/data/membersConfig.ts b/src/app/data/membersConfig.ts new file mode 100644 index 0000000..3ba2402 --- /dev/null +++ b/src/app/data/membersConfig.ts @@ -0,0 +1,742 @@ +export type MemberStat = { + label: string; + value: number; +}; + +export type SkillNode = { + label: string; + level: number; + description?: string; + icon?: string; + requires?: string; +}; + +export type SkillTier = { + label: string; + nodes: SkillNode[]; +}; + +export type CareerPathNode = { + id: string; + label: string; + level: number; + description: string; + stage: string; + requires?: string | string[]; + icon?: string; +}; + +export type MemberSocials = { + github?: string; + x?: string; + linkedin?: string; + website?: string; +}; + +export type MemberProfile = { + id: string; + name: string; + alias: string; + title: string; + level: number; + className: string; + bio: string; + highlights: string[]; + specialties: string[]; + radar: MemberStat[]; + skillTree: SkillTier[]; + careerPath?: CareerPathNode[]; + githubUsername?: string; + socials?: MemberSocials; + avatar?: string; +}; + +export type ContributorProfile = { + id: string; + name: string; + alias: string; + title: string; + className: string; + level: number; + projects: string[]; + participationScore: number; + githubUsername?: string; + socials?: MemberSocials; + avatar?: string; +}; + +export const members: MemberProfile[] = [ + { + id: "mattaereal", + name: "Matías Aereal Aeón", + alias: "matta", + title: "Security Knowmad", + level: 5, + className: "Founder", + githubUsername: "mattaereal", + avatar: "https://github.com/mattaereal.png?size=256&cb=20260220", + socials: { + github: "https://github.com/mattaereal", + x: "https://x.com/mattaereal", + }, + bio: "Systems engineer and former developer with deep security background in reverse engineering, red teaming, pentesting, and peer review. Leads strategy, operations, and partnerships while staying obsessive about Linux hardening and OPSEC.", + highlights: [ + "Leads business, operations, and multi-team security direction", + "Runs deep technical reviews from exploit paths to architecture flaws", + "Designs strict OPSEC setups and Linux-first security workflows", + ], + specialties: [ + "Security Leadership", + "Reverse Engineering", + "Red Teaming & Pentesting", + "Peer Review", + "Linux & Sysadmin", + "OPSEC", + "EVM Bytecode", + "Artist Producer", + ], + radar: [ + { label: "SOCIAL", value: 94 }, + { label: "SECURITY", value: 98 }, + { label: "DEVELOPMENT", value: 72 }, + { label: "EDUCATION", value: 81 }, + { label: "OPERATIONS", value: 97 }, + { label: "ART", value: 84 }, + ], + skillTree: [ + { + label: "Core", + nodes: [ + { + label: "Security Foundations", + level: 5, + description: "Applies attacker mindset and defensive depth across systems and teams.", + icon: "/assets/lights.svg", + }, + { + label: "Linux & Sysadmin Ops", + level: 5, + description: "Builds resilient systems using hardening-first operational practices.", + icon: "/assets/lettersn.svg", + }, + ], + }, + { + label: "Paths", + nodes: [ + { + label: "Reverse Engineering", + level: 5, + description: "Dissects unknown behavior and reconstructs root exploit mechanics.", + icon: "/assets/tree.svg", + requires: "Security Foundations", + }, + { + label: "Red Teaming & Pentesting", + level: 5, + description: "Validates security posture through offensive assessments and simulation.", + icon: "/assets/flower.svg", + requires: "Linux & Sysadmin Ops", + }, + ], + }, + { + label: "Mastery", + nodes: [ + { + label: "EVM Bytecode Analysis", + level: 5, + description: "Works at low-level execution detail to analyze contract behavior deeply.", + icon: "/assets/sun.svg", + requires: "Reverse Engineering", + }, + { + label: "Security Leadership", + level: 5, + description: "Bridges technical depth with execution, management, and business goals.", + icon: "/assets/temple.svg", + requires: "Red Teaming & Pentesting", + }, + ], + }, + ], + careerPath: [ + { + id: "matta-linux-ops", + label: "Arch Linux BTW", + level: 4, + description: "Applies sysadmin discipline and hardening practices across environments.", + stage: "Foundation", + icon: "/assets/lights.svg", + }, + { + id: "matta-opsec", + label: "OpSec", + level: 4, + description: "Builds and maintains strict personal and organizational operational security.", + stage: "Foundation", + requires: "Arch Linux BTW", + icon: "/assets/temple.svg", + }, + { + id: "matta-reverse-engineering", + label: "Reverse Engineering", + level: 3.5, + description: "Investigates internals, flaws, and exploit chains under real constraints.", + stage: "Practice", + requires: "Arch Linux BTW", + icon: "/assets/lettersn.svg", + }, + { + id: "matta-social-engineering", + label: "Social Engineering", + level: 5, + description: "Understands manipulation patterns and designs defenses against human-layer attacks.", + stage: "Practice", + requires: "OpSec", + icon: "/assets/flower.svg", + }, + { + id: "matta-redteam-pentest", + label: "Red Teaming", + level: 5, + description: "Stress-tests organizations through adversarial simulation and review.", + stage: "Mastery", + requires: ["Reverse Engineering", "Social Engineering"], + icon: "/assets/flower.svg", + }, + { + id: "matta-singing", + label: "Singing", + level: 3, + description: "Performs vocally and channels artistic expression into team culture.", + stage: "Identity", + icon: "/assets/tree.svg", + }, + { + id: "matta-security-leadership", + label: "Leadership", + level: 4, + description: "Aligns people, operations, and technical direction across the organization.", + stage: "Leadership", + requires: ["Red Teaming", "OpSec"], + icon: "/assets/sun.svg", + }, + ], + }, + { + id: "tincho", + name: "Martin Abbatemarco", + alias: "tincho", + title: "Ethereum Security Researcher", + level: 5, + className: "Founder", + githubUsername: "tinchoabbate", + avatar: "https://github.com/tinchoabbate.png?size=256", + socials: { + github: "https://github.com/tinchoabbate", + x: "https://x.com/tinchoabbate", + }, + bio: "Systems engineer focused on Web3 internals: gas economics, EVM behavior, Solidity risk patterns, and Ethereum security research. Introverted profile with high technical precision and strong musical artistry.", + highlights: [ + "Deep-dives EVM and gas behavior under adversarial scenarios", + "Leads Solidity-focused review and exploit simulation work", + "Brings exceptional musicianship and creative discipline", + ], + specialties: [ + "Solidity (5/5)", + "Ethereum Internals", + "Gas & EVM Analysis", + "Smart Contract Auditing", + "Security Research", + "Music Artist", + ], + radar: [ + { label: "SOCIAL", value: 59 }, + { label: "SECURITY", value: 95 }, + { label: "DEVELOPMENT", value: 79 }, + { label: "EDUCATION", value: 81 }, + { label: "OPERATIONS", value: 64 }, + { label: "ART", value: 92 }, + ], + skillTree: [ + { + label: "Core", + nodes: [ + { + label: "Ethereum Internals", + level: 5, + description: "Understands account model, execution context, and protocol mechanics.", + icon: "/assets/temple.svg", + }, + { + label: "Solidity Security", + level: 5, + description: "Reviews contract design and implementation with exploit-aware mindset.", + icon: "/assets/lights.svg", + requires: "Ethereum Internals", + }, + ], + }, + { + label: "Paths", + nodes: [ + { + label: "Gas & EVM Trace Analysis", + level: 5, + description: "Analyzes costs, traces, and execution flows at opcode-level depth.", + icon: "/assets/tree.svg", + requires: "Ethereum Internals", + }, + { + label: "Smart Contract Peer Review", + level: 4, + description: "Performs rigorous review cycles and communicates actionable fixes.", + icon: "/assets/lettersn.svg", + requires: "Solidity Security", + }, + ], + }, + { + label: "Mastery", + nodes: [ + { + label: "On-chain Incident Forensics", + level: 4, + description: "Reconstructs exploit narratives from traces, state changes, and context.", + icon: "/assets/sun.svg", + requires: "Gas & EVM Trace Analysis", + }, + { + label: "Disclosure Strategy", + level: 4, + description: "Translates deep findings into safe, practical advisory guidance.", + icon: "/assets/flower.svg", + requires: "Smart Contract Peer Review", + }, + ], + }, + ], + careerPath: [ + { + id: "tincho-programming-fundamentals", + label: "Coding Basics", + level: 4, + description: "Systems-engineering base used for tooling and protocol-level analysis.", + stage: "Foundation", + icon: "/assets/temple.svg", + }, + { + id: "tincho-ethereum-internals", + label: "Ethereum Core", + level: 4, + description: "Strong understanding of EVM execution and chain-level behavior.", + stage: "Foundation", + requires: "Coding Basics", + icon: "/assets/lights.svg", + }, + { + id: "tincho-opsec", + label: "OpSec", + level: 3, + description: "Maintains practical personal and operational security hygiene.", + stage: "Foundation", + requires: "Coding Basics", + icon: "/assets/temple.svg", + }, + { + id: "tincho-solidity-security", + label: "Solidity Security", + level: 5, + description: "Top-tier smart contract review and exploit pattern recognition.", + stage: "Practice", + requires: "Ethereum Core", + icon: "/assets/tree.svg", + }, + { + id: "tincho-code-review", + label: "Code Review", + level: 5, + description: "Performs deep technical review and delivers actionable remediation guidance.", + stage: "Mastery", + requires: ["Ethereum Core", "Solidity Security"], + icon: "/assets/lettersn.svg", + }, + { + id: "tincho-musical-artistry", + label: "Music Producer", + level: 4, + description: "Strong music production craft that complements his technical identity.", + stage: "Identity", + icon: "/assets/flower.svg", + }, + { + id: "tincho-gamification", + label: "Gamification", + level: 5, + description: "Designs high-impact, challenge-based learning experiences for security.", + stage: "Leadership", + requires: ["Code Review", "OpSec"], + icon: "/assets/tree.svg", + }, + ], + }, + { + id: "dantesito", + name: "Dante Martinez", + alias: "dantesito", + title: "Permanent Intern", + level: 2, + className: "Core Contributor", + githubUsername: "d4rm5", + avatar: "https://github.com/d4rm5.png?size=256", + socials: { + github: "https://github.com/d4rm5", + x: "https://x.com/dantesito", + }, + bio: "Youngest member of the team and currently studying systems engineering. Building base capability across front-end, back-end, and security while contributing where needed.", + highlights: [ + "Growing in front-end, back-end, and security fundamentals", + "Supports implementation tasks across product and research", + "Focused on learning speed and consistency", + ], + specialties: [ + "Systems Engineering Student", + "Front-end Basics", + "Back-end Basics", + "Security Basics", + "Team Support", + ], + radar: [ + { label: "SOCIAL", value: 70 }, + { label: "SECURITY", value: 49 }, + { label: "DEVELOPMENT", value: 58 }, + { label: "EDUCATION", value: 55 }, + { label: "OPERATIONS", value: 52 }, + { label: "ART", value: 22 }, + ], + skillTree: [ + { + label: "Core", + nodes: [ + { + label: "Programming Fundamentals", + level: 2, + description: "Core coding foundation for practical engineering growth.", + icon: "/assets/lights.svg", + }, + { + label: "Systems Fundamentals", + level: 2, + description: "Builds understanding of system behavior, components, and constraints.", + icon: "/assets/tree.svg", + }, + ], + }, + { + label: "Paths", + nodes: [ + { + label: "Front-end Basics", + level: 2, + description: "Implements core UI components and simple interface behaviors.", + icon: "/assets/temple.svg", + requires: "Programming Fundamentals", + }, + { + label: "Back-end Basics", + level: 2, + description: "Builds simple APIs and handles data flow with supervision.", + icon: "/assets/flower.svg", + requires: "Programming Fundamentals", + }, + ], + }, + { + label: "Mastery", + nodes: [ + { + label: "Security Basics", + level: 2, + description: "Applies entry-level secure development and hygiene practices.", + icon: "/assets/lettersn.svg", + requires: "Back-end Basics", + }, + { + label: "Execution Consistency", + level: 3, + description: "Delivers reliable outcomes while learning across disciplines.", + icon: "/assets/sun.svg", + requires: "Front-end Basics", + }, + ], + }, + ], + careerPath: [ + { + id: "dante-programming-basics", + label: "Coding Basics", + level: 2, + description: "Foundational coding ability for real project contribution.", + stage: "Foundation", + icon: "/assets/temple.svg", + }, + { + id: "dante-systems-fundamentals", + label: "Systems Basics", + level: 2, + description: "Develops systems-engineering fundamentals across stack layers.", + stage: "Foundation", + requires: "Coding Basics", + icon: "/assets/tree.svg", + }, + { + id: "dante-frontend-basics", + label: "Front-end Basics", + level: 2, + description: "Builds simple UIs and interactions with growing confidence.", + stage: "Practice", + requires: "Coding Basics", + icon: "/assets/lights.svg", + }, + { + id: "dante-backend-basics", + label: "Back-end Basics", + level: 2, + description: "Implements basic server logic and API integration flows.", + stage: "Practice", + requires: "Coding Basics", + icon: "/assets/flower.svg", + }, + { + id: "dante-security-basics", + label: "Security Basics", + level: 2, + description: "Learns defensive practices and secure engineering fundamentals.", + stage: "Delivery", + requires: ["Front-end Basics", "Back-end Basics"], + icon: "/assets/temple.svg", + }, + { + id: "dante-team-contribution", + label: "Teamwork", + level: 3, + description: "Contributes consistently while growing toward deeper specialization.", + stage: "Delivery", + requires: "Security Basics", + icon: "/assets/sun.svg", + }, + ], + }, + { + id: "manut0r", + name: "Manuel Marquez", + alias: "Manut0r", + title: "Lead Developer", + level: 4, + className: "Lead Developer", + githubUsername: "marquezmanu", + avatar: "https://github.com/marquezmanu.png?size=256", + socials: { + github: "https://github.com/marquezmanu", + x: "https://x.com/manut0r", + linkedin: "https://www.linkedin.com/in/manut0r", + website: "https://manut0r.dev", + }, + bio: "Developer with 14 years of experience, specialized in front-end engineering, UI systems, and product execution. Strong social collaborator and currently leveling up security understanding.", + highlights: [ + "Owns front-end architecture and interface delivery quality", + "Builds scalable UI systems and smooth product flows", + "Actively learning security concepts for safer product decisions", + ], + specialties: [ + "Front-end Engineering", + "UI Architecture", + "UX Flows", + "Product Delivery", + "Team Collaboration", + "Security Learner", + ], + radar: [ + { label: "SOCIAL", value: 86 }, + { label: "SECURITY", value: 38 }, + { label: "DEVELOPMENT", value: 95 }, + { label: "EDUCATION", value: 67 }, + { label: "OPERATIONS", value: 80 }, + { label: "ART", value: 26 }, + ], + skillTree: [ + { + label: "Core", + nodes: [ + { + label: "Software Development", + level: 5, + description: "Delivers robust application features with production discipline.", + icon: "/assets/temple.svg", + }, + { + label: "Front-end Engineering", + level: 5, + description: "Builds high-quality web interfaces and maintainable component systems.", + icon: "/assets/tree.svg", + requires: "Software Development", + }, + ], + }, + { + label: "Paths", + nodes: [ + { + label: "UI Systems", + level: 5, + description: "Creates coherent design systems for consistency and delivery speed.", + icon: "/assets/lights.svg", + requires: "Front-end Engineering", + }, + { + label: "UX Flow Design", + level: 4, + description: "Optimizes end-to-end user journeys to reduce friction.", + icon: "/assets/flower.svg", + requires: "Front-end Engineering", + }, + ], + }, + { + label: "Mastery", + nodes: [ + { + label: "Interaction Craft", + level: 4, + description: "Builds intuitive interactions and responsive feedback loops.", + icon: "/assets/lettersn.svg", + requires: "UI Systems", + }, + { + label: "Product Delivery", + level: 5, + description: "Executes interface quality from concept to production release.", + icon: "/assets/sun.svg", + requires: "UX Flow Design", + }, + ], + }, + ], + careerPath: [ + { + id: "manut0r-programming-basics", + label: "Coding Basics", + level: 5, + description: "Long-term coding experience across real-world product cycles.", + stage: "Foundation", + icon: "/assets/temple.svg", + }, + { + id: "manut0r-software-development", + label: "Software Dev", + level: 5, + description: "Builds robust features and maintainable application architecture.", + stage: "Foundation", + requires: "Coding Basics", + icon: "/assets/tree.svg", + }, + { + id: "manut0r-frontend-engineering", + label: "Front-end Dev", + level: 5, + description: "Turns product requirements into reliable and reusable web interfaces.", + stage: "Practice", + requires: "Software Dev", + icon: "/assets/lights.svg", + }, + { + id: "manut0r-ui-systems", + label: "UI Systems", + level: 5, + description: "Creates cohesive visual systems and component patterns.", + stage: "Practice", + requires: "Front-end Dev", + icon: "/assets/lettersn.svg", + }, + { + id: "manut0r-ux-interfaces", + label: "UX Flows", + level: 4, + description: "Designs intuitive interface behavior and user task flows.", + stage: "Mastery", + requires: "Front-end Dev", + icon: "/assets/flower.svg", + }, + { + id: "manut0r-product-delivery", + label: "Delivery Lead", + level: 5, + description: "Leads end-to-end interface delivery with product and engineering alignment.", + stage: "Leadership", + requires: ["UI Systems", "UX Flows"], + icon: "/assets/sun.svg", + }, + ], + }, +]; + +export const contributors: ContributorProfile[] = [ + { + id: "eugenioclrc-contrib", + name: "Eugenio CLRC", + alias: "eugenioclrc", + title: "Contributor", + className: "Contributor", + level: 3, + projects: [ + "Devcon 24' CTF", + "Ekoparty 25 Village", + ], + participationScore: 82, + githubUsername: "eugenioclrc", + avatar: "https://github.com/eugenioclrc.png?size=256", + socials: { + github: "https://github.com/eugenioclrc", + }, + }, + { + id: "anon-node-01", + name: "Anonymous Contributor", + alias: "anon-node-01", + title: "Contributor", + className: "Anonymous", + level: 2, + projects: [ + "Devcon 24' CTF", + "Phishing Dojo QA", + ], + participationScore: 61, + }, + { + id: "anon-village-02", + name: "Anonymous Contributor", + alias: "anon-village-02", + title: "Contributor", + className: "Anonymous", + level: 3, + projects: [ + "Ekoparty 25 Village", + "Workshop Ops Support", + ], + participationScore: 74, + }, + { + id: "anon-research-03", + name: "Anonymous Contributor", + alias: "anon-research-03", + title: "Contributor", + className: "Anonymous", + level: 2, + projects: [ + "Threat Intel Triage", + "Security Advisories Drafting", + ], + participationScore: 57, + }, +]; diff --git a/src/app/ethos/page.tsx b/src/app/ethos/page.tsx new file mode 100644 index 0000000..74ad5a2 --- /dev/null +++ b/src/app/ethos/page.tsx @@ -0,0 +1,56 @@ +'use client'; + +import React from "react"; + +import Navbar from "../components/Navbar"; +import BackgroundClouds from "../components/BackgroundClouds"; +import ParticlesDOM from "../components/ParticlesDOM"; + +export default function EthosPage() { + return ( +
+ + + + +
+
+

+ About the Guild +

+

+ Our Ethos +

+

+ The Red Guild is a security collective devoted to protecting the open crypto ecosystem. + We move like a guild: research, education, and open-source tooling built in public for the + benefit of the community. +

+

+ Our work blends adversarial rigor with public-good intent. We investigate threats, teach + defenders, and ship practical tools that raise the baseline for everyone. +

+
+ +
+
+

What we do

+
    +
  • Security research, advisories, and investigations
  • +
  • Education programs, workshops, and awareness campaigns
  • +
  • Open-source tooling for safer development
  • +
+
+
+

How we work

+
    +
  • Community-first collaboration and open knowledge
  • +
  • Responsible disclosure and transparent reporting
  • +
  • Iterative practice, shared playbooks, repeatable wins
  • +
+
+
+
+
+ ); +} diff --git a/src/app/globals.css b/src/app/globals.css index dcdd3d7..0831f0a 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -748,6 +748,13 @@ body::-webkit-scrollbar { font-size: 0.875rem; } +.font-manrope-body { + font-family: var(--font-manrope), 'Spartan', sans-serif; + font-weight: 500; + line-height: 1.4; + letter-spacing: 0.01em; +} + /* Pixelify Sans class for active characters */ .font-pixelify-sans { font-family: var(--font-pixelify-sans); diff --git a/src/app/initiatives/page.tsx b/src/app/initiatives/page.tsx index 0a5da9c..f24f722 100644 --- a/src/app/initiatives/page.tsx +++ b/src/app/initiatives/page.tsx @@ -12,13 +12,44 @@ export default function InitiativesPage() { console.log('Explorar clickeado:', title); }; + const totalInitiatives = Object.keys(cardContent).length; + return (
-
-

Initiatives

+
+
+

+ About the Guild +

+

+ Initiatives +

+

+ Our initiatives turn security knowledge into practical impact: training, tooling, + research, and public resources that anyone can use to harden crypto systems. +

+
+ +
+
+

What is active now

+

+ {totalInitiatives} active lines of work, from adversarial training grounds to + open-source safety tooling and long-form technical advisories. +

+
+
+

How to engage

+

+ Pick an initiative below to access challenges, documentation, event archives, or + code repositories and join the work where it is happening. +

+
+
+
{Object.entries(cardContent).map(([key, content]) => (
handleExplore(content.title)} />
@@ -38,4 +70,4 @@ export default function InitiativesPage() {
); -} \ No newline at end of file +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 3c077ff..aa5071b 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,5 +1,5 @@ import type { Metadata } from "next"; -import { Inter, Pixelify_Sans } from "next/font/google"; +import { Inter, Pixelify_Sans, Manrope } from "next/font/google"; import "./globals.css"; const inter = Inter({ @@ -14,6 +14,12 @@ const pixelifySans = Pixelify_Sans({ variable: "--font-pixelify-sans", }); +const manrope = Manrope({ + subsets: ["latin"], + weight: ["400", "500", "600", "700"], + variable: "--font-manrope", +}); + const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || "http://localhost:3000"; const ogImage = "https://opengraph.b-cdn.net/production/images/e40efc77-0740-4c48-b3f8-f8cc5c1d5720.png?token=I0ecXikVP-poYNtEyFMuJyPRCVQ6JdgFd7tHAt_3iJk&height=730&width=1200&expires=33286790432"; @@ -56,11 +62,11 @@ export default function RootLayout({ {children} ); -} \ No newline at end of file +} diff --git a/src/app/members/page.tsx b/src/app/members/page.tsx new file mode 100644 index 0000000..4e07d6c --- /dev/null +++ b/src/app/members/page.tsx @@ -0,0 +1,61 @@ +'use client'; + +import React, { useMemo, useState } from "react"; + +import Navbar from "../components/Navbar"; +import BackgroundClouds from "../components/BackgroundClouds"; +import ParticlesDOM from "../components/ParticlesDOM"; +import MemberCard from "../components/MemberCard"; +import MemberPreviewCard from "../components/MemberPreviewCard"; +import { members } from "../data/membersConfig"; + +export default function MembersPage() { + const [selectedMemberId, setSelectedMemberId] = useState(members[0]?.id || ""); + + const selectedMember = useMemo( + () => members.find((member) => member.id === selectedMemberId) || members[0], + [selectedMemberId] + ); + return ( +
+ + + +
+
+

+ The Red Guild Roster +

+

+ Members +

+

+ Contributors presented as playable profiles: a mix of ethos, skills, + and tactical focus. Please, don't take this too seriously. +

+

+ Select a member card to open the full profile. +

+
+ +
+ {members.map((member) => ( + setSelectedMemberId(member.id)} + /> + ))} +
+ + {selectedMember && ( +
+ +
+ )} + +
+
+ ); +} diff --git a/src/app/supporters/page.tsx b/src/app/supporters/page.tsx index e7de5d3..a161047 100644 --- a/src/app/supporters/page.tsx +++ b/src/app/supporters/page.tsx @@ -7,11 +7,11 @@ import SupportersCollaborators from '../components/SupportersCollaborators'; export default function SupportersPage() { return ( -
+
-
+
{/* Supporters & Collaborators Section */}