diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..66e1566 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,8 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ + reactCompiler: true, +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..cc086d1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1666 @@ +{ + "name": "mugit3", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mugit3", + "version": "0.1.0", + "dependencies": { + "framer-motion": "^12.38.0", + "lucide-react": "^1.14.0", + "next": "16.2.5", + "next-themes": "^0.4.6", + "react": "19.2.4", + "react-dom": "19.2.4" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "babel-plugin-react-compiler": "1.0.0", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "devOptional": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "devOptional": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "devOptional": true, + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@img/colour": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "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" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "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" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "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" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "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" + ], + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "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" + ], + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "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" + ], + "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-arm": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "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" + ], + "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-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" + ], + "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" + ], + "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.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", + "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", + "cpu": [ + "s390x" + ], + "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-s390x": "1.2.4" + } + }, + "node_modules/@img/sharp-linux-x64": { + "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" + ], + "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-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "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" + ], + "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-linuxmusl-arm64": "1.2.4" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "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" + ], + "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-linuxmusl-x64": "1.2.4" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", + "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", + "cpu": [ + "wasm32" + ], + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.7.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "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" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "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" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "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" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.5.tgz", + "integrity": "sha512-Lb9ElHD2klcyeVD25vW+siPFqz9QMzDUSgvFZNO+dZEKoMHex4viJhVuzBhrXKqb+UKnih7mVYbt50/7KLsSCA==" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.5.tgz", + "integrity": "sha512-BW+8PGVmsruomXHsitD8JG6gny9lEdobctjBwvtPF8AKtxGDR7nR35FOl/oK9UAPXBOBm+vx0k8qtpeHOXQMGQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.2.5.tgz", + "integrity": "sha512-ZoCGnCl9LlQJWmqXrZAUlNxvuNmclvE+7zUif+nDydkkehl9FKxHJ+wxSQMj+C37BYFerKiEdX9s9o02ir975Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.2.5.tgz", + "integrity": "sha512-AwcZzMChaWkOTZt3vu+2ZMIj8g4dYQY+B8VUVhlFSQ2JtvyZpefyYHTe00D6b6L7BysYw7vl3zsvs9jix8tl5Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.2.5.tgz", + "integrity": "sha512-QqMgqWbCBFsfiQ7BF3dUlW8HJy1LWhpcqbTpoHMWA9IV+TnWwDKozQJA5NdIAHjQ00yX2Q7AUkLr/XK4n77q8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.2.5.tgz", + "integrity": "sha512-3hzeiFGZtyATVx9pCeuzTshXmh50vHZitqaeZiyJZaUmjQyrfjsVUgS8apOj1vEJCIpKJM/55F45yPAV2kpjsA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.2.5.tgz", + "integrity": "sha512-0mzZV/mAt7Qj2tYNdTB6AqrS8dwng/AQLSYC5Z1YLpZdi2wxqKDPK7RY2RvjB1fXyJfOfdA3l/yTF5yLi+WfuQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.2.5.tgz", + "integrity": "sha512-f/H4nZ2zJBvA8/+HpsB9mNonF9zfQoAU6D0WxJrfzhJDvJLfngVN85oqxUyrDVK99DIFfFYhLpGa5K+c5uotSw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.2.5.tgz", + "integrity": "sha512-nuP7DHs4koAojsIxVPkihNgKiRUKtCU65j5X6DAbSy8VBrfT/o90bCLLHPf51JEdOZwZMFzM6e0NiGWfIWjVAg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz", + "integrity": "sha512-Ai7+yQPxz3ddrDQzFfBKdHEVBg0w3Zl83jnjuwxnZOsnH9pGn93QHQtpU0p/8rYWxvbFZHneni6p1BSLK4DkGA==", + "dev": true, + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.4" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.4.tgz", + "integrity": "sha512-9El/iI069DKDSXwTvB9J4BwdO5JhRrOweGaK25taBAvBXyXqJAX+Jqdvs8r8gKpsI/1m0LeJLyQYTf/WLrBT1Q==", + "dev": true, + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.4", + "@tailwindcss/oxide-darwin-arm64": "4.2.4", + "@tailwindcss/oxide-darwin-x64": "4.2.4", + "@tailwindcss/oxide-freebsd-x64": "4.2.4", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.4", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.4", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.4", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.4", + "@tailwindcss/oxide-linux-x64-musl": "4.2.4", + "@tailwindcss/oxide-wasm32-wasi": "4.2.4", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.4", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.4" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.4.tgz", + "integrity": "sha512-e7MOr1SAn9U8KlZzPi1ZXGZHeC5anY36qjNwmZv9pOJ8E4Q6jmD1vyEHkQFmNOIN7twGPEMXRHmitN4zCMN03g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.4.tgz", + "integrity": "sha512-tSC/Kbqpz/5/o/C2sG7QvOxAKqyd10bq+ypZNf+9Fi2TvbVbv1zNpcEptcsU7DPROaSbVgUXmrzKhurFvo5eDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.4.tgz", + "integrity": "sha512-yPyUXn3yO/ufR6+Kzv0t4fCg2qNr90jxXc5QqBpjlPNd0NqyDXcmQb/6weunH/MEDXW5dhyEi+agTDiqa3WsGg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.4.tgz", + "integrity": "sha512-BoMIB4vMQtZsXdGLVc2z+P9DbETkiopogfWZKbWwM8b/1Vinbs4YcUwo+kM/KeLkX3Ygrf4/PsRndKaYhS8Eiw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.4.tgz", + "integrity": "sha512-7pIHBLTHYRAlS7V22JNuTh33yLH4VElwKtB3bwchK/UaKUPpQ0lPQiOWcbm4V3WP2I6fNIJ23vABIvoy2izdwA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.4.tgz", + "integrity": "sha512-+E4wxJ0ZGOzSH325reXTWB48l42i93kQqMvDyz5gqfRzRZ7faNhnmvlV4EPGJU3QJM/3Ab5jhJ5pCRUsKn6OQw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.4.tgz", + "integrity": "sha512-bBADEGAbo4ASnppIziaQJelekCxdMaxisrk+fB7Thit72IBnALp9K6ffA2G4ruj90G9XRS2VQ6q2bCKbfFV82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.4.tgz", + "integrity": "sha512-7Mx25E4WTfnht0TVRTyC00j3i0M+EeFe7wguMDTlX4mRxafznw0CA8WJkFjWYH5BlgELd1kSjuU2JiPnNZbJDA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.4.tgz", + "integrity": "sha512-2wwJRF7nyhOR0hhHoChc04xngV3iS+akccHTGtz965FwF0up4b2lOdo6kI1EbDaEXKgvcrFBYcYQQ/rrnWFVfA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.4.tgz", + "integrity": "sha512-FQsqApeor8Fo6gUEklzmaa9994orJZZDBAlQpK2Mq+DslRKFJeD6AjHpBQ0kZFQohVr8o85PPh8eOy86VlSCmw==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz", + "integrity": "sha512-L9BXqxC4ToVgwMFqj3pmZRqyHEztulpUJzCxUtLjobMCzTPsGt1Fa9enKbOpY2iIyVtaHNeNvAK8ERP/64sqGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.4.tgz", + "integrity": "sha512-ESlKG0EpVJQwRjXDDa9rLvhEAh0mhP1sF7sap9dNZT0yyl9SAG6T7gdP09EH0vIv0UNTlo6jPWyujD6559fZvw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.4.tgz", + "integrity": "sha512-wgAVj6nUWAolAu8YFvzT2cTBIElWHkjZwFYovF+xsqKsW2ADxM/X2opxj5NsF/qVccAOjRNe8X2IdPzMsWyHTg==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.4", + "@tailwindcss/oxide": "4.2.4", + "postcss": "^8.5.6", + "tailwindcss": "4.2.4" + } + }, + "node_modules/@types/node": { + "version": "20.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz", + "integrity": "sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==", + "dev": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/babel-plugin-react-compiler": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz", + "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==", + "devOptional": true, + "dependencies": { + "@babel/types": "^7.26.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.27", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", + "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001792", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", + "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz", + "integrity": "sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/framer-motion": { + "version": "12.38.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.38.0.tgz", + "integrity": "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==", + "dependencies": { + "motion-dom": "^12.38.0", + "motion-utils": "^12.36.0", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", + "dev": true, + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lucide-react": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.14.0.tgz", + "integrity": "sha512-+1mdWcfSJVUsaTIjN9zoezmUhfXo5l0vP7ekBMPo3jcS/aIkxHnXqAPsByszMZx/Y8oQBRJxJx5xg+RH3urzxA==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/motion-dom": { + "version": "12.38.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.38.0.tgz", + "integrity": "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==", + "dependencies": { + "motion-utils": "^12.36.0" + } + }, + "node_modules/motion-utils": { + "version": "12.36.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.36.0.tgz", + "integrity": "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==" + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/next": { + "version": "16.2.5", + "resolved": "https://registry.npmjs.org/next/-/next-16.2.5.tgz", + "integrity": "sha512-TkVTm9F2WEulkgGljm4wPwNgvCCWCVw6StUHsZb8WZpHFRjepoUWg3d7L4IMg7IyjcJ4Co9eVhpro8e8O+KarQ==", + "dependencies": { + "@next/env": "16.2.5", + "@swc/helpers": "0.5.15", + "baseline-browser-mapping": "^2.9.19", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.2.5", + "@next/swc-darwin-x64": "16.2.5", + "@next/swc-linux-arm64-gnu": "16.2.5", + "@next/swc-linux-arm64-musl": "16.2.5", + "@next/swc-linux-x64-gnu": "16.2.5", + "@next/swc-linux-x64-musl": "16.2.5", + "@next/swc-win32-arm64-msvc": "16.2.5", + "@next/swc-win32-x64-msvc": "16.2.5", + "sharp": "^0.34.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@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", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/postcss": { + "version": "8.5.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", + "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", + "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sharp": { + "version": "0.34.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", + "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@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" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@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/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/tailwindcss": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz", + "integrity": "sha512-HhKppgO81FQof5m6TEnuBWCZGgfRAWbaeOaGT00KOy/Pf/j6oUihdvBpA7ltCeAvZpFhW3j0PTclkxsd4IXYDA==", + "dev": true + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1fcb6dd --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "mugit3", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start" + }, + "dependencies": { + "framer-motion": "^12.38.0", + "lucide-react": "^1.14.0", + "next": "16.2.5", + "next-themes": "^0.4.6", + "react": "19.2.4", + "react-dom": "19.2.4" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "babel-plugin-react-compiler": "1.0.0", + "tailwindcss": "^4", + "typescript": "^5" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/public/fonts/YekanBakhFaNum-Bold.woff b/public/fonts/YekanBakhFaNum-Bold.woff new file mode 100644 index 0000000..97c2ba6 Binary files /dev/null and b/public/fonts/YekanBakhFaNum-Bold.woff differ diff --git a/public/fonts/YekanBakhFaNum-Regular.woff b/public/fonts/YekanBakhFaNum-Regular.woff new file mode 100644 index 0000000..1cedfdf Binary files /dev/null and b/public/fonts/YekanBakhFaNum-Regular.woff differ diff --git a/public/fonts/YekanBakhFaNum-SemiBold.woff b/public/fonts/YekanBakhFaNum-SemiBold.woff new file mode 100644 index 0000000..2032742 Binary files /dev/null and b/public/fonts/YekanBakhFaNum-SemiBold.woff differ diff --git a/public/images/1-2.png b/public/images/1-2.png new file mode 100644 index 0000000..f0bb349 Binary files /dev/null and b/public/images/1-2.png differ diff --git a/public/images/3.png b/public/images/3.png new file mode 100644 index 0000000..62d12d6 Binary files /dev/null and b/public/images/3.png differ diff --git a/public/images/earth-dark.png b/public/images/earth-dark.png new file mode 100644 index 0000000..435b6c1 Binary files /dev/null and b/public/images/earth-dark.png differ diff --git a/public/images/earth-light.png b/public/images/earth-light.png new file mode 100644 index 0000000..949337a Binary files /dev/null and b/public/images/earth-light.png differ diff --git a/src/app/[locale]/layout.tsx b/src/app/[locale]/layout.tsx new file mode 100644 index 0000000..71647e2 --- /dev/null +++ b/src/app/[locale]/layout.tsx @@ -0,0 +1,32 @@ +import { redirect } from 'next/navigation'; +import { I18nProvider } from '../../i18n/provider'; +import { isLocale, locales, messages } from '../../i18n/messages'; + +export function generateStaticParams() { + return locales.map((locale) => ({ locale })); +} + +export default async function LocaleLayout({ + children, + params, +}: { + children: React.ReactNode; + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + if (!isLocale(locale)) redirect('/fa'); + + const dir = locale === 'en' ? 'ltr' : 'rtl'; + + return ( + +
+ {children} +
+
+ ); +} diff --git a/src/app/[locale]/page.tsx b/src/app/[locale]/page.tsx new file mode 100644 index 0000000..f8024c0 --- /dev/null +++ b/src/app/[locale]/page.tsx @@ -0,0 +1,23 @@ +import Navbar from '../components/header'; +import Hero from '../components/hero'; +import MainContent from '../components/maincontext'; +import { Footer } from '../components/footer'; + +export default async function Home({ + params, +}: { + params: Promise<{ locale: string }>; +}) { + const { locale } = await params; + const dir = locale === 'en' ? 'ltr' : 'rtl'; + + return ( +
+ + + +
+ ); +} + diff --git a/src/app/components/footer.tsx b/src/app/components/footer.tsx new file mode 100644 index 0000000..03d1c32 --- /dev/null +++ b/src/app/components/footer.tsx @@ -0,0 +1,170 @@ +'use client'; + +import React from 'react'; +import { + ArrowLeft, + Box, + Share2, + MessageCircle, + Mail, + Send, + Activity, + Globe, + ShieldCheck, + Headphones, + Sun, + ChevronDown + } from 'lucide-react'; + +import Link from 'next/link'; +import { useI18n } from '../../i18n/provider'; +import { useTheme } from 'next-themes'; +import { usePathname, useRouter } from 'next/navigation'; + +export const Footer = () => { + const { locale, t } = useI18n(); + const dir = locale === 'en' ? 'ltr' : 'rtl'; + const { theme, setTheme } = useTheme(); + const router = useRouter(); + const pathname = usePathname(); + + return ( + + ); +}; diff --git a/src/app/components/global.tsx b/src/app/components/global.tsx new file mode 100644 index 0000000..a626505 --- /dev/null +++ b/src/app/components/global.tsx @@ -0,0 +1,155 @@ +'use client'; + +import React, { useEffect, useState } from 'react'; +import Image from 'next/image'; +import { motion, Variants } from 'framer-motion'; +import { MapPin, Globe, ArrowLeft } from 'lucide-react'; +import { useI18n } from '../../i18n/provider'; +import { useTheme } from 'next-themes'; + +// کامپوننت اختصاصی برای کارت‌های لوکیشن با افکت GPS +const LocationCard = ({ + name, + ping, + color, + positionClass, + delay +}: { + name: string, + ping: string, + color: string, + positionClass: string, + delay: number +}) => { + + return ( + + {/* آیکون با افکت GPS چشمک‌زن */} +
+ {/* نقطه چشمک‌زن (GPS Pulse) */} + + {/* آیکون اصلی پین */} + +
+
+

{name}

+

{ping}

+
+
+ ); +}; + +const GlobalInfrastructure = () => { + const { locale, t } = useI18n(); + const dir = locale === 'en' ? 'ltr' : 'rtl'; + const flipClass = locale === 'en' ? '-scale-x-100' : ''; + + // انیمیشن ورود کل سکشن + const fadeIn: Variants = { + hidden: { opacity: 0, y: 30 }, + visible: { opacity: 1, y: 0, transition: { duration: 0.8, ease: "easeOut" } } + }; + + + const { resolvedTheme } = useTheme(); + const [mounted, setMounted] = useState(false); + + useEffect(() => setMounted(true), []); + + return ( + +
+ {/* Container اصلی - دقیقاً مطابق رنگ تصویر */} +
+ + {/* تصویر پس‌زمینه در سمت چپ */} +
+ {/* عرض عکس طوری تنظیم شده که نیمه چپ را بپوشاند */} +
+ Global Network + + + {/* گرادینت برای محو کردن دقیق مرز عکس در پس‌زمینه */} +
+
+
+ + {/* کانتینر پین‌های شناور روی کره زمین */} +
+ + + +
+ + {/* محتوای متنی (سمت راست) */} +
+

+ {t('global_badge')} +

+

+ {t('global_title')} +

+

+ {t('global_desc')} +

+ + {/* دکمه دقیقاً مطابق تصویر (آیکون کره راست، فلش چپ) */} + +
+ +
+
+
+ ); +}; + +export default GlobalInfrastructure; diff --git a/src/app/components/header.tsx b/src/app/components/header.tsx new file mode 100644 index 0000000..2b76f5b --- /dev/null +++ b/src/app/components/header.tsx @@ -0,0 +1,101 @@ +'use client'; + +import { useState, useEffect } from 'react'; +import { motion } from 'framer-motion'; +import { Cloud, Moon, Sun } from 'lucide-react'; +import { useTheme } from 'next-themes'; +import { usePathname, useRouter } from 'next/navigation'; +import { useI18n } from '../../i18n/provider'; + +export default function Header() { + const [isScrolled, setIsScrolled] = useState(false); + const { locale, t } = useI18n(); + const dir = locale === 'en' ? 'ltr' : 'rtl'; + const { theme, setTheme } = useTheme(); + const router = useRouter(); + const pathname = usePathname(); + + useEffect(() => { + const handleScroll = () => { + // حساسیت اسکرول تنظیم شده تا تغییرات به موقع انجام شود + if (window.scrollY > 40) { + setIsScrolled(true); + } else { + setIsScrolled(false); + } + }; + + window.addEventListener('scroll', handleScroll); + return () => window.removeEventListener('scroll', handleScroll); + }, []); + + return ( + // حذف پدینگ ثابت از بالا تا هدر بتواند به سقف بچسبد +
+ + {/* بخش لوگو */} +
+
+ +
+ MugCloud +
+ + {/* منوی دسکتاپ */} + + + {/* بخش اکشن‌ها */} +
+ {/* دکمه انتخاب زبان (در حالت کپسولی پنهان می‌شود) */} +
+ +
+ + {/* دکمه تغییر تم */} + + + {/* دکمه شروع کنید */} + +
+
+
+ ); +} diff --git a/src/app/components/hero.tsx b/src/app/components/hero.tsx new file mode 100644 index 0000000..1e57da8 --- /dev/null +++ b/src/app/components/hero.tsx @@ -0,0 +1,182 @@ +'use client'; + +import Image from 'next/image'; +import { motion, Variants } from 'framer-motion'; +import { useEffect, useState } from 'react'; +import { + ChevronDown, + Globe, + ArrowLeft, + Box, + Headphones, + ShieldCheck, + Zap, + Cloud +} from 'lucide-react'; +import { useI18n } from '../../i18n/provider'; +import { useTheme } from 'next-themes'; + +export default function HeroSection() { + // تنظیمات انیمیشن برای نمایش متوالی (Stagger) + const { locale, t } = useI18n(); + const dir = locale === 'en' ? 'ltr' : 'rtl'; + const flipClass = locale === 'en' ? '-scale-x-100' : ''; + const { resolvedTheme } = useTheme(); + const [mounted, setMounted] = useState(false); + + useEffect(() => setMounted(true), []); + + const containerVariants: Variants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.2, + }, + }, + }; + + const itemVariants: Variants = { + hidden: { opacity: 0, y: 20 }, + visible: { + opacity: 1, + y: 0, + transition: { duration: 0.6, ease: "easeOut" } + }, + }; + + return ( +
+ {/* Background Image with slight scale-in animation */} + + Servers Background + + {/* لایه گرادینت */} +
+ + + + + {/* Content Wrapper */} +
+ + + + {/* Hero Content */} +
+ + {/* Right Side - Text & Buttons */} + + + {t('hero_title_1')} +
+ {t('hero_title_2')} {t('hero_title_3')} {t('hero_title_4')} +
+ + + {t('hero_subtitle')} + + + + + + + + + {/* Features list */} + +
+ {t('hero_feat_support')} +
+
+ {t('hero_feat_uptime')} +
+
+ {t('hero_feat_speed')} +
+
+
+ + {/* Left Side - Glassmorphism Floating Cards */} +
+ {/* Top Shield Card */} + + + + + {/* Bottom Chart Card */} + +
+ {t('hero_uptime_card_title')} + +
+
+ ۹۹.۹۹٪ +
+ {/* SVG Chart Line */} + + + +
+
+ +
+
+
+ ); +} diff --git a/src/app/components/maincontext.tsx b/src/app/components/maincontext.tsx new file mode 100644 index 0000000..137d13f --- /dev/null +++ b/src/app/components/maincontext.tsx @@ -0,0 +1,171 @@ +'use client'; + +import { motion } from 'framer-motion'; +import { + ArrowLeft, Server, Cloud, Database, Shield, + Globe, Clock, MapPin, Users, Star +} from 'lucide-react'; +import Image from 'next/image'; +import GlobalInfrastructure from './global'; +import { Services } from './services'; +import { useI18n } from '../../i18n/provider'; + + +const fadeIn = { + hidden: { opacity: 0, y: 20 }, + visible: { opacity: 1, y: 0, transition: { duration: 0.6 } } +}; + +const staggerContainer = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { staggerChildren: 0.1 } + } +}; + +export default function MainContent() { + const { locale, t } = useI18n(); + const dir = locale === 'en' ? 'ltr' : 'rtl'; + const [productsTitleLine1, productsTitleLine2] = t('main_products_title').split('\n'); + + return ( + // بخش اصلی با z-index بالاتر برای قرار گرفتن روی Hero +
+ + {/* + کادر اصلی دربرگیرنده کل محتوا + استفاده از mt-32- برای کشیدن کادر به بالا و ادغام با هیرو + */} +
+ + {/* بخش محصولات */} + + {/* توضیحات محصولات */} + + {t('main_products_badge')} +

+ {productsTitleLine1} +
+ {productsTitleLine2} +

+

+ {t('main_products_desc') + .split('\n') + .map((line, idx) => ( + + {line} + {idx === 0 ?
: null} +
+ ))} +

+ +
+ + {/* کارت‌های محصولات */} +
+ {[ + { title: t('product_ssl_title'), desc: t('product_ssl_desc'), price: '۱۹۹,۰۰۰', icon: Shield, color: 'text-purple-400', bg: 'bg-purple-500/10' }, + { title: t('product_dedicated_title'), desc: t('product_dedicated_desc'), price: '۶,۹۹۰,۰۰۰', icon: Database, color: 'text-emerald-400', bg: 'bg-emerald-500/10' }, + { title: t('product_vps_title'), desc: t('product_vps_desc'), price: '۱,۹۹۰,۰۰۰', icon: Cloud, color: 'text-blue-400', bg: 'bg-blue-500/10' }, + { title: t('product_host_title'), desc: t('product_host_desc'), price: '۴۹۹,۰۰۰', icon: Server, color: 'text-sky-400', bg: 'bg-sky-500/10' }, + ].map((item, i) => ( + +
+ +
+

{item.title}

+

{item.desc}

+
+ {t('price_from')} {item.price} {t('toman')} +
+
+ ))} +
+
+ + + + {/* بخش زیرساخت جهانی */} + + + {/* نوار آمار و ارقام */} + + {[ + { label: t('stats_uptime'), value: '۹۹.۹۹٪', icon: Clock }, + { label: t('stats_dc'), value: '+ ۱۴', icon: Globe }, + { label: t('stats_servers'), value: '+ ۲۴,۰۰۰', icon: Server }, + { label: t('stats_customers'), value: '+ ۱۲۸,۰۰۰', icon: Users }, + ].map((stat, i) => ( +
+
+
{stat.value}
+
{stat.label}
+
+
+ +
+
+ ))} +
+ + {/* بخش نظرات و اعتماد */} + + + {t('trust_badge')} +

{t('trust_title')}

+

{t('trust_desc')}

+
+ digikala + TAPSI + Snapp! + دیوار +
+
+ + {/* کارت‌های نظرات */} +
+ {[ + { text: t('testimonial_1_text'), name: t('testimonial_1_name'), role: t('testimonial_1_role') }, + { text: t('testimonial_2_text'), name: t('testimonial_2_name'), role: t('testimonial_2_role') } + ].map((testimonial, i) => ( + +
+
+ {[...Array(5)].map((_, j) => )} +
+

{testimonial.text}

+
+
+
+
{testimonial.name}
+
{testimonial.role}
+
+
+
+
+
+
+ ))} +
+
+ +
+
+ ); +} diff --git a/src/app/components/pricing.tsx b/src/app/components/pricing.tsx new file mode 100644 index 0000000..a3cb1e7 --- /dev/null +++ b/src/app/components/pricing.tsx @@ -0,0 +1,52 @@ +// components/Pricing.tsx +'use client'; +import { motion } from 'framer-motion'; +import { Check } from 'lucide-react'; + +const plans = [ + { name: 'پایه', price: '۴۹۹,۰۰۰', features: ['۲۰ گیگابایت فضای NVMe', 'پهنای باند نامحدود', 'پشتیبانی تیکت'], popular: false }, + { name: 'حرفه‌ای', price: '۱,۴۹۹,۰۰۰', features: ['۵۰ گیگابایت فضای NVMe', 'پهنای باند نامحدود', 'پشتیبانی ویژه ۲۴/۷', 'گواهی SSL رایگان'], popular: true }, + { name: 'سازمانی', price: '۳,۹۹۰,۰۰۰', features: ['فضای ذخیره‌سازی نامحدود', 'سرور اختصاصی مجازی', 'مدیریت کامل سرور', 'پشتیبان‌گیری روزانه'], popular: false }, +]; + +export default function Pricing() { + return ( +
+
+

پلن‌های قیمت‌گذاری

+

مناسب‌ترین پلن را برای کسب‌وکار خود انتخاب کنید.

+
+ +
+ {plans.map((plan, i) => ( + + {plan.popular && پیشنهاد ویژه} +

{plan.name}

+
+ {plan.price} + / ماهانه +
+
    + {plan.features.map((feat, j) => ( +
  • + {feat} + +
  • + ))} +
+ +
+ ))} +
+
+ ); +} diff --git a/src/app/components/product.tsx b/src/app/components/product.tsx new file mode 100644 index 0000000..f8725d1 --- /dev/null +++ b/src/app/components/product.tsx @@ -0,0 +1,48 @@ +// components/Products.tsx +'use client'; +import { motion } from 'framer-motion'; +import { Server, Cloud, Shield, HardDrive, ArrowLeft } from 'lucide-react'; + +const products = [ + { id: 1, title: 'گواهی SSL', desc: 'امنیت وب‌سایت خود را با SSL تضمین کنید', price: '۱۹۹,۰۰۰', icon: Shield, color: 'bg-purple-500/20 text-purple-400' }, + { id: 2, title: 'سرور اختصاصی', desc: 'سرورهای فیزیکی قدرتمند با بالاترین عملکرد', price: '۶,۹۹۰,۰۰۰', icon: HardDrive, color: 'bg-teal-500/20 text-teal-400' }, + { id: 3, title: 'سرور مجازی (VPS)', desc: 'سرورهای مجازی قدرتمند با منابع اختصاصی', price: '۱,۹۹۰,۰۰۰', icon: Cloud, color: 'bg-blue-500/20 text-blue-400' }, + { id: 4, title: 'هاست وب', desc: 'هاست سریع و پایدار برای وب‌سایت‌های شخصی و شرکتی', price: '۴۹۹,۰۰۰', icon: Server, color: 'bg-indigo-500/20 text-indigo-400' }, +]; + +export default function Products() { + return ( +
+
+
+

محصولات ما

+

هر آنچه برای رشد
پروژه‌ی شما نیاز دارید

+

از هاست اشتراکی تا سرورهای اختصاصی قدرتمند. همه چیز برای عملکرد بهتر وب‌سایت و اپلیکیشن شما

+
+ +
+ +
+ {products.map((p, i) => ( + +
+ +
+

{p.title}

+

{p.desc}

+

شروع از {p.price} تومان

+
+ ))} +
+
+ ); +} diff --git a/src/app/components/services.tsx b/src/app/components/services.tsx new file mode 100644 index 0000000..dd12e00 --- /dev/null +++ b/src/app/components/services.tsx @@ -0,0 +1,110 @@ +'use client'; + +import React from 'react'; +import { motion } from 'framer-motion'; +import { Server, Cloud, Shield, Lock } from 'lucide-react'; +import { useI18n } from '../../i18n/provider'; + +export const Services = () => { + const { locale, t } = useI18n(); + const dir = locale === 'en' ? 'ltr' : 'rtl'; + + const services = [ + { + icon: Server, + title: t('service_hosting_title'), + desc: t('service_hosting_desc'), + gradient: 'from-blue-500/20 to-cyan-500/20', + iconColor: 'text-blue-400', + }, + { + icon: Cloud, + title: t('service_vps_title'), + desc: t('service_vps_desc'), + gradient: 'from-indigo-500/20 to-purple-500/20', + iconColor: 'text-indigo-400', + }, + { + icon: Shield, + title: t('service_dedicated_title'), + desc: t('service_dedicated_desc'), + gradient: 'from-teal-500/20 to-emerald-500/20', + iconColor: 'text-teal-400', + }, + { + icon: Lock, + title: t('service_ssl_title'), + desc: t('service_ssl_desc'), + gradient: 'from-purple-500/20 to-pink-500/20', + iconColor: 'text-purple-400', + }, + ]; + + return ( +
+ {/* هاله نور پس‌زمینه */} +
+ +
+ {/* بخش عنوان */} + +

+ {t('services_title')} +

+

+ {t('services_subtitle')} +

+
+ + {/* گرید کارت‌های خدمات */} +
+ {services.map((service, index) => ( + + {/* بدنه کارت شیشه‌ای */} +
+ + {/* گرادینت پس‌زمینه در حالت Hover */} + + +
+ {/* آیکون با انیمیشن چرخش */} + + + + + {/* متون کارت */} +

+ {service.title} +

+

+ {service.desc} +

+
+
+
+ ))} +
+
+
+ ); +}; diff --git a/src/app/favicon.ico b/src/app/favicon.ico new file mode 100644 index 0000000..718d6fe Binary files /dev/null and b/src/app/favicon.ico differ diff --git a/src/app/globals.css b/src/app/globals.css new file mode 100644 index 0000000..bd82358 --- /dev/null +++ b/src/app/globals.css @@ -0,0 +1,196 @@ +@import "tailwindcss"; + +@font-face { + font-family: "YekanBakhFaNum"; + src: url("/fonts/YekanBakhFaNum-Regular.woff") format("woff"); + font-weight: 400; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "YekanBakhFaNum"; + src: url("/fonts/YekanBakhFaNum-SemiBold.woff") format("woff"); + font-weight: 600; + font-style: normal; + font-display: swap; +} + +@font-face { + font-family: "YekanBakhFaNum"; + src: url("/fonts/YekanBakhFaNum-Bold.woff") format("woff"); + font-weight: 700; + font-style: normal; + font-display: swap; +} + +:root { + /* Theme tokens (default = dark, per request) */ + --background: #000918; + --foreground: #ffffff; + + --app-bg: #000918; + --hero-bg: #050a15; + --footer-bg: #000918; + + --text-primary: #ffffff; + --text-muted: #d1d5db; /* gray-300 */ + --text-muted-2: #9ca3af; /* gray-400 */ + --text-muted-3: #6b7280; /* gray-500 */ + + --glass-02: rgba(255, 255, 255, 0.02); + --glass-04: rgba(255, 255, 255, 0.04); + --glass-05: rgba(255, 255, 255, 0.05); + --glass-10: rgba(255, 255, 255, 0.10); + + --border-05: rgba(255, 255, 255, 0.05); + --border-10: rgba(255, 255, 255, 0.10); + --border-20: rgba(255, 255, 255, 0.20); + + /* Section-specific surfaces (keep dark visuals identical) */ + --surface-main-wrap: rgba(10, 17, 32, 0.50); /* #0a1120/50 */ + --global-surface-bg: #091120; + --global-surface-bg-80: rgba(9, 17, 32, 0.80); + --global-surface-border: rgba(30, 41, 59, 0.50); /* #1e293b/50 */ + --footer-surface-bg: #0f1629; + --footer-cta-from: #0b1426; + --footer-cta-via: #0d1a30; + --footer-cta-to: #0a1829; + --footer-chip-bg: #131b2f; + --footer-chip-inner-bg: #1a233a; + --footer-icon-bg: #161f36; + + --hero-image-opacity: 1; + --hero-bottom-fade-from: #000918; + + /* --font-family-base: system-ui, -apple-system, Segoe UI, Roboto, Helvetica, Arial, + "Apple Color Emoji", "Segoe UI Emoji"; */ + + /* Tailwind `font-sans` bridge */ + --font-geist-sans: var(--font-family-base); +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); +} + +/* Light theme: white base + very subtle blue/green gradients, keeping glass feel */ +html.light { + --background: #ffffff; + --foreground: #0b1020; + + --app-bg: radial-gradient(1000px 600px at 10% 10%, rgba(56, 189, 248, 0.10), transparent 60%), + radial-gradient(900px 520px at 85% 20%, rgba(132, 225, 188, 0.12), transparent 55%), + #ffffff; + --hero-bg: radial-gradient(1000px 600px at 15% 0%, rgba(56, 189, 248, 0.12), transparent 60%), + radial-gradient(900px 520px at 85% 25%, rgba(132, 225, 188, 0.14), transparent 55%), + #ffffff; + --footer-bg: #f8fafc; + + --text-primary: #0b1020; + --text-muted: #334155; /* slate-700-ish */ + --text-muted-2: #475569; /* slate-600-ish */ + --text-muted-3: #64748b; /* slate-500-ish */ + + --glass-02: rgba(2, 6, 23, 0.02); + --glass-04: rgba(2, 6, 23, 0.04); + --glass-05: rgba(2, 6, 23, 0.05); + --glass-10: rgba(2, 6, 23, 0.10); + + --border-05: rgba(2, 6, 23, 0.06); + --border-10: rgba(2, 6, 23, 0.12); + --border-20: rgba(2, 6, 23, 0.18); + + --surface-main-wrap: rgba(255, 255, 255, 0.70); + --global-surface-bg: rgba(255, 255, 255, 0.75); + --global-surface-bg-80: rgba(255, 255, 255, 0.80); + --global-surface-border: rgba(2, 6, 23, 0.12); + --footer-surface-bg: rgba(255, 255, 255, 0.75); + --footer-cta-from: rgba(56, 189, 248, 0.12); + --footer-cta-via: rgba(132, 225, 188, 0.12); + --footer-cta-to: rgba(56, 189, 248, 0.08); + --footer-chip-bg: rgba(255, 255, 255, 0.60); + --footer-chip-inner-bg: rgba(255, 255, 255, 0.55); + --footer-icon-bg: rgba(2, 6, 23, 0.04); + + --hero-image-opacity: 0.12; + --hero-bottom-fade-from: #ffffff; +} + +body { + background: var(--background); + color: var(--text-primary); + font-family: var(--font-family-base); +} + +.locale-fa { + --font-family-base: "YekanBakhFaNum", system-ui, -apple-system, Segoe UI, Roboto, Helvetica, + Arial, "Apple Color Emoji", "Segoe UI Emoji"; + --font-geist-sans: var(--font-family-base); +} + +/* Direction hooks (edit freely) */ +.locale-scope[data-locale="en"] .en-row-reverse { + flex-direction: row-reverse !important; +} +.locale-scope[data-locale="en"] .en-row { + flex-direction: row !important; +} +.locale-scope[data-locale="en"] .en-justify-start { + justify-content: flex-start; +} +.locale-scope[data-locale="en"] .en-justify-end { + justify-content: flex-end; +} +.locale-scope[data-locale="en"] .en-items-start { + align-items: flex-start; +} +.locale-scope[data-locale="en"] .en-items-end { + align-items: flex-end; +} +.locale-scope[data-locale="en"] .en-text-left { + text-align: left !important; +} +.locale-scope[data-locale="en"] .en-text-right { + text-align: right !important; +} + +/* Shadow hooks (defaults are subtle; tweak as needed) */ +.locale-scope[data-locale="en"] .en-shadow-left { + box-shadow: -12px 0 40px rgba(2, 6, 23, 0.12); +} +.locale-scope[data-locale="en"] .en-shadow-right { + box-shadow: 12px 0 40px rgba(2, 6, 23, 0.12); +} + +/* Optional FA-specific hooks (use only when you need overrides for /fa) */ +.locale-scope[data-locale="fa"] .fa-text-right { + text-align: right !important; +} +.locale-scope[data-locale="fa"] .fa-text-left { + text-align: left !important; +} +.locale-scope[data-locale="fa"] .fa-row-reverse { + flex-direction: row-reverse !important; +} +.locale-scope[data-locale="fa"] .fa-row { + flex-direction: row !important; +} + +/* Debug helper: uncomment to visually verify EN scope is applied */ +/* .locale-scope[data-locale="en"] { outline: 2px dashed rgba(59,130,246,0.35); outline-offset: -2px; } */ + +.app-bg { + background: var(--app-bg); +} + +.hero-bg { + background: var(--hero-bg); +} + +.footer-bg { + background: var(--footer-bg); +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx new file mode 100644 index 0000000..2e0f2dc --- /dev/null +++ b/src/app/layout.tsx @@ -0,0 +1,23 @@ +import type { Metadata } from "next"; +import "./globals.css"; +import { Providers } from "./providers"; + + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx new file mode 100644 index 0000000..2e7fc1f --- /dev/null +++ b/src/app/page.tsx @@ -0,0 +1,5 @@ +import { redirect } from 'next/navigation'; + +export default function Home() { + redirect('/fa'); +} diff --git a/src/app/providers.tsx b/src/app/providers.tsx new file mode 100644 index 0000000..fd6b53a --- /dev/null +++ b/src/app/providers.tsx @@ -0,0 +1,17 @@ +'use client'; + +import { ThemeProvider } from 'next-themes'; + +export function Providers({ children }: { children: React.ReactNode }) { + return ( + + {children} + + ); +} + diff --git a/src/i18n/messages.ts b/src/i18n/messages.ts new file mode 100644 index 0000000..81e2c07 --- /dev/null +++ b/src/i18n/messages.ts @@ -0,0 +1,220 @@ +export const locales = ['fa', 'en'] as const; +export type Locale = (typeof locales)[number]; + +export function isLocale(value: string): value is Locale { + return (locales as readonly string[]).includes(value); +} + +export type Messages = Record; + +export const messages: Record = { + fa: { + nav_products: 'محصولات', + nav_pricing: 'تعرفه', + nav_network: 'شبکه', + nav_support: 'پشتیبانی', + nav_start: 'شروع کنید', + nav_lang_en: 'English', + nav_lang_fa: 'فا', + + hero_title_1: 'زیرساختی قدرتمند', + hero_title_2: 'برای آینده‌ی', + hero_title_3: 'آنلاین', + hero_title_4: 'شما', + hero_subtitle: + 'سریع، پایدار و ایمن — خدمات هاستینگ، سرور مجازی، سرور اختصاصی و گواهی SSL با بهترین کیفیت و پشتیبانی ۲۴/۷.', + hero_cta_primary: 'شروع کنید', + hero_cta_secondary: 'مشاهده محصولات', + hero_feat_support: 'پشتیبانی ۲۴/۷', + hero_feat_uptime: 'آپتایم ۹۹.۹۹٪', + hero_feat_speed: 'سرعت بالا', + hero_uptime_card_title: 'آپتایم سرورها', + + main_products_badge: 'محصولات ما', + main_products_title: 'هر آنچه برای رشد\nپروژه‌ی شما نیاز دارید', + main_products_desc: + 'از هاست اشتراکی تا سرورهای اختصاصی قدرتمند.\nهمه چیز برای عملکرد بهتر وب‌سایت و اپلیکیشن شما', + main_products_all: 'مشاهده همه محصولات', + product_ssl_title: 'گواهی SSL', + product_ssl_desc: 'امنیت وب‌سایت خود را با SSL تضمین کنید', + product_dedicated_title: 'سرور اختصاصی', + product_dedicated_desc: 'سرورهای فیزیکی قدرتمند با بالاترین عملکرد', + product_vps_title: 'سرور مجازی (VPS)', + product_vps_desc: 'سرورهای مجازی قدرتمند با منابع اختصاصی', + product_host_title: 'هاست وب', + product_host_desc: 'هاست سریع و پایدار برای وب‌سایت‌های شخصی و شرکتی', + price_from: 'شروع از', + toman: 'تومان', + stats_uptime: 'آپتایم شبکه', + stats_dc: 'موقعیت دیتاسنتر', + stats_servers: 'سرورهای فعال', + stats_customers: 'مشتری فعال', + + trust_badge: 'مورد اعتماد هزاران کسب‌وکار', + trust_title: 'اعتماد شما، بزرگ‌ترین دارایی ماست.', + trust_desc: 'کسب‌وکارهای بزرگ و استارتاپ‌ها، زیرساخت خود را به ما سپرده‌اند.', + testimonial_1_text: 'سرعت و پایداری سرورها فوق‌العاده‌ست. پشتیبانی هم همیشه در دسترس و خیلی حرفه‌ای.', + testimonial_1_name: 'علی محمدی', + testimonial_1_role: 'مدیر فنی، تپسی', + testimonial_2_text: 'از وقتی سرورهای ما رو به آروان‌کلاد منتقل کردیم، خیالمون از بابت پایداری راحت شده.', + testimonial_2_name: 'سارا یوسفی', + testimonial_2_role: 'مدیر محصول، دیجی‌کالا', + + services_title: 'خدمات ما', + services_subtitle: + 'بهترین راهکارهای میزبانی وب و زیرساخت ابری برای توسعه و رشد کسب‌وکار شما', + service_hosting_title: 'میزبانی وب (هاستینگ)', + service_hosting_desc: 'میزبانی وب با بالاترین سرعت و پایداری برای سایت‌ها و پروژه‌های شما.', + service_vps_title: 'سرور مجازی (VPS)', + service_vps_desc: 'منابع اختصاصی و دسترسی Root با سرورهای ابری پرسرعت و پایدار.', + service_dedicated_title: 'سرور اختصاصی', + service_dedicated_desc: 'قدرت، امنیت و کنترل بی‌نهایت با سرورهای اختصاصی (Bare Metal).', + service_ssl_title: 'گواهینامه SSL', + service_ssl_desc: 'تامین امنیت اطلاعات کاربران و افزایش اعتبار و سئو سایت شما.', + + global_badge: 'زیرساخت جهانی', + global_title: 'سرعت و پایداری در سطح جهانی', + global_desc: + 'دیتاسنترهای ما در بهترین نقاط جهان قرار دارند تا کمترین تأخیر و بیشترین سرعت را برای شما فراهم کنند.', + global_cta: 'مشاهده دیتاسنترها', + + footer_cta_title: 'زیرساخت مطمئن برای رشد پروژه‌هات آماده‌ست', + footer_cta_desc: 'همین امروز سرویس مناسب خود را انتخاب کنید و با خیال راحت آینده را بسازید.', + footer_cta_start: 'شروع کنید', + footer_cta_view_services: 'مشاهده سرویس‌ها', + footer_about: + 'ارائه‌دهنده خدمات زیرساخت ابری و سرورهای پرسرعت با بیشترین سطح امنیت و پایداری برای کسب‌وکارهای آنلاین در ایران و جهان.', + footer_col_products: 'محصولات', + footer_col_resources: 'منابع', + footer_col_company: 'شرکت', + footer_col_legal: 'حقوقی', + footer_link_cloud_hosting: 'هاست ابری', + footer_link_vps: 'سرور مجازی (VPS)', + footer_link_dedicated: 'سرور اختصاصی', + footer_link_ssl: 'گواهی SSL', + footer_link_domain: 'ثبت دامنه', + footer_link_docs: 'مستندات', + footer_link_blog: 'وبلاگ', + footer_link_guides: 'راهنماها', + footer_link_api: 'API و توسعه‌دهندگان', + footer_link_status: 'وضعیت سرورها', + footer_link_about: 'درباره ما', + footer_link_contact: 'تماس با ما', + footer_link_careers: 'فرصت‌های شغلی', + footer_link_partners: 'همکاری با ما', + footer_link_terms: 'قوانین استفاده', + footer_link_privacy: 'حریم خصوصی', + footer_link_refund: 'سیاست بازگشت وجه', + footer_link_rules: 'قوانین و مقررات', + footer_feature_uptime: 'آپتایم شبکه', + footer_feature_dc: 'دیتاسنترهای جهانی', + footer_feature_security: 'امنیت پیشرفته', + footer_feature_support: 'پشتیبانی ۲۴/۷', + footer_lang_fa: 'فارسی', + footer_rights: '© 2026 MugCloud. تمامی حقوق محفوظ است.', + }, + en: { + nav_products: 'Products', + nav_pricing: 'Pricing', + nav_network: 'Network', + nav_support: 'Support', + nav_start: 'Get started', + nav_lang_en: 'English', + nav_lang_fa: 'FA', + + hero_title_1: 'Powerful infrastructure', + hero_title_2: 'for your', + hero_title_3: 'online', + hero_title_4: 'future', + hero_subtitle: + 'Fast, stable, and secure — hosting, VPS, dedicated servers, and SSL certificates with top quality and 24/7 support.', + hero_cta_primary: 'Get started', + hero_cta_secondary: 'View products', + hero_feat_support: '24/7 support', + hero_feat_uptime: '99.99% uptime', + hero_feat_speed: 'High speed', + hero_uptime_card_title: 'Server uptime', + + main_products_badge: 'Our products', + main_products_title: 'Everything you need\nto grow your project', + main_products_desc: + 'From shared hosting to powerful dedicated servers.\nEverything for better performance of your website and app.', + main_products_all: 'View all products', + product_ssl_title: 'SSL certificate', + product_ssl_desc: 'Secure your website with SSL', + product_dedicated_title: 'Dedicated server', + product_dedicated_desc: 'Powerful bare-metal servers for maximum performance', + product_vps_title: 'VPS', + product_vps_desc: 'High-performance virtual servers with dedicated resources', + product_host_title: 'Web hosting', + product_host_desc: 'Fast and reliable hosting for personal and business websites', + price_from: 'Starting from', + toman: 'Toman', + stats_uptime: 'Network uptime', + stats_dc: 'Datacenter locations', + stats_servers: 'Active servers', + stats_customers: 'Active customers', + + trust_badge: 'Trusted by thousands', + trust_title: 'Your trust is our greatest asset.', + trust_desc: 'Big companies and startups trust us with their infrastructure.', + testimonial_1_text: 'Server speed and stability are outstanding. Support is always available and highly professional.', + testimonial_1_name: 'Ali Mohammadi', + testimonial_1_role: 'Tech Lead, Tapsi', + testimonial_2_text: 'Since moving our servers, we’ve felt confident about stability and reliability.', + testimonial_2_name: 'Sara Yousefi', + testimonial_2_role: 'Product Manager, Digikala', + + services_title: 'Our services', + services_subtitle: 'Modern hosting and cloud infrastructure solutions to grow your business', + service_hosting_title: 'Web hosting', + service_hosting_desc: 'High-speed and reliable hosting for your sites and projects.', + service_vps_title: 'VPS', + service_vps_desc: 'Dedicated resources and root access with fast and stable cloud servers.', + service_dedicated_title: 'Dedicated server', + service_dedicated_desc: 'Power, security, and full control with bare-metal servers.', + service_ssl_title: 'SSL certificate', + service_ssl_desc: 'Protect user data and improve trust and SEO for your site.', + + global_badge: 'Global infrastructure', + global_title: 'Global-grade speed and stability', + global_desc: + 'Our datacenters are located in top global regions to deliver the lowest latency and highest speed.', + global_cta: 'View datacenters', + + footer_cta_title: 'Reliable infrastructure to grow your product', + footer_cta_desc: 'Pick the right service today and build the future with confidence.', + footer_cta_start: 'Get started', + footer_cta_view_services: 'View services', + footer_about: + 'Cloud infrastructure and high-performance servers with strong security and reliability for businesses in Iran and worldwide.', + footer_col_products: 'Products', + footer_col_resources: 'Resources', + footer_col_company: 'Company', + footer_col_legal: 'Legal', + footer_link_cloud_hosting: 'Cloud hosting', + footer_link_vps: 'VPS', + footer_link_dedicated: 'Dedicated servers', + footer_link_ssl: 'SSL certificates', + footer_link_domain: 'Domain registration', + footer_link_docs: 'Documentation', + footer_link_blog: 'Blog', + footer_link_guides: 'Guides', + footer_link_api: 'API & Developers', + footer_link_status: 'System status', + footer_link_about: 'About us', + footer_link_contact: 'Contact', + footer_link_careers: 'Careers', + footer_link_partners: 'Partners', + footer_link_terms: 'Terms of use', + footer_link_privacy: 'Privacy policy', + footer_link_refund: 'Refund policy', + footer_link_rules: 'Rules & regulations', + footer_feature_uptime: 'Network uptime', + footer_feature_dc: 'Global datacenters', + footer_feature_security: 'Advanced security', + footer_feature_support: '24/7 support', + footer_lang_fa: 'Persian', + footer_rights: '© 2026 MugCloud. All rights reserved.', + }, +}; diff --git a/src/i18n/provider.tsx b/src/i18n/provider.tsx new file mode 100644 index 0000000..5034c5c --- /dev/null +++ b/src/i18n/provider.tsx @@ -0,0 +1,37 @@ +'use client'; + +import React, { createContext, useContext, useMemo } from 'react'; +import type { Locale, Messages } from './messages'; + +type I18nContextValue = { + locale: Locale; + t: (key: string) => string; +}; + +const I18nContext = createContext(null); + +export function I18nProvider({ + locale, + messages, + children, +}: { + locale: Locale; + messages: Messages; + children: React.ReactNode; +}) { + const value = useMemo(() => { + return { + locale, + t: (key: string) => messages[key] ?? key, + }; + }, [locale, messages]); + + return {children}; +} + +export function useI18n() { + const ctx = useContext(I18nContext); + if (!ctx) throw new Error('useI18n must be used within I18nProvider'); + return ctx; +} + diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..cf9c65d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts" + ], + "exclude": ["node_modules"] +}