diff --git a/package-lock.json b/package-lock.json index 02a8b1b..157837f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,15 +8,22 @@ "name": "pragativeer-v2", "version": "0.1.0", "dependencies": { + "clsx": "^2.1.1", + "framer-motion": "^12.41.0", + "lucide-react": "^1.21.0", "next": "16.2.9", "react": "19.2.4", - "react-dom": "19.2.4" + "react-dom": "19.2.4", + "react-katex": "^3.1.0", + "recharts": "^3.9.0", + "tailwind-merge": "^3.6.0" }, "devDependencies": { "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "@types/react-katex": "^3.0.4", "eslint": "^9", "eslint-config-next": "16.2.9", "tailwindcss": "^4", @@ -1246,6 +1253,42 @@ "node": ">=12.4.0" } }, + "node_modules/@reduxjs/toolkit": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz", + "integrity": "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==", + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@standard-schema/utils": "^0.3.0", + "immer": "^11.0.0", + "redux": "^5.0.1", + "redux-thunk": "^3.1.0", + "reselect": "^5.1.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18 || ^19", + "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@reduxjs/toolkit/node_modules/immer": { + "version": "11.1.8", + "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.8.tgz", + "integrity": "sha512-/tbkHMW7y10Lx6i1crLjD4/OhNkRG+Fo7byZHtah0547nIeXYcpIXaUh0IAQY6gO5459qpGGYapcEOHtFXkIuA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -1253,6 +1296,18 @@ "dev": true, "license": "MIT" }, + "node_modules/@standard-schema/spec": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz", + "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==", + "license": "MIT" + }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", @@ -1544,6 +1599,69 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", @@ -1579,7 +1697,7 @@ "version": "19.2.17", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -1595,6 +1713,22 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/react-katex": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/react-katex/-/react-katex-3.0.4.tgz", + "integrity": "sha512-aLkykKzSKLpXI6REJ3uClao6P47HAFfR1gcHOZwDeTuALsyjgMhz+oynLV4gX0kiJVnvHrBKF/TLXqyNTpHDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.0.tgz", @@ -2680,6 +2814,15 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2700,6 +2843,15 @@ "dev": true, "license": "MIT" }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2733,9 +2885,130 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, + "devOptional": true, "license": "MIT" }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -2815,6 +3088,12 @@ } } }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3122,6 +3401,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-toolkit": { + "version": "1.48.1", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.48.1.tgz", + "integrity": "sha512-wfnXlwd5I75eXRtdD2vuEs50xHHESECDsGD7yiQnfFVNoa5522NwXEbmgo98LfiukSQHs+mBM7/YG3qKJB9/mQ==", + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -3551,6 +3840,12 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3692,6 +3987,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/framer-motion": { + "version": "12.41.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.41.0.tgz", + "integrity": "sha512-OHAMNiCEON1RDBlRGuulsN5AD8ptMjvk5QWfFmYmBLPZ3zFGIJe60kQucQQf4cez1OzQmjYBWDY+dYfISkUdqg==", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.41.0", + "motion-utils": "^12.39.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/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -4010,6 +4332,16 @@ "node": ">= 4" } }, + "node_modules/immer": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz", + "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -4052,6 +4384,15 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -4529,7 +4870,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -4618,6 +4958,22 @@ "node": ">=4.0" } }, + "node_modules/katex": { + "version": "0.16.47", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.47.tgz", + "integrity": "sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "license": "MIT", + "dependencies": { + "commander": "^8.3.0" + }, + "bin": { + "katex": "cli.js" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -4950,7 +5306,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -4969,6 +5324,15 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.21.0.tgz", + "integrity": "sha512-reEZMXq8Qdd5jg5XYkQ5TR1fB/GiQ7ih4vcrthYDtgjSDwh0i6/YLiGjsWsIwgN49gpAnd4J2elSNzncMEEUUQ==", + "license": "ISC", + "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", @@ -5036,6 +5400,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/motion-dom": { + "version": "12.41.0", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.41.0.tgz", + "integrity": "sha512-Lk3J39fOGg6xNr1KRZsN6usDyBf8aP7MEbUPez1VCughHt79OrP7VGqNrPyFL0riaT7WS8t9DRw1M3BHtM/xKw==", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.39.0" + } + }, + "node_modules/motion-utils": { + "version": "12.39.0", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.39.0.tgz", + "integrity": "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ==", + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5198,7 +5577,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5497,7 +5875,6 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -5561,9 +5938,89 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, "license": "MIT" }, + "node_modules/react-katex": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/react-katex/-/react-katex-3.1.0.tgz", + "integrity": "sha512-At9uLOkC75gwn2N+ZXc5HD8TlATsB+3Hkp9OGs6uA8tM3dwZ3Wljn74Bk3JyHFPgSnesY/EMrIAB1WJwqZqejA==", + "license": "MIT", + "dependencies": { + "katex": "^0.16.0" + }, + "peerDependencies": { + "prop-types": "^15.8.1", + "react": ">=15.3.2 <20" + } + }, + "node_modules/react-redux": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz", + "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "use-sync-external-store": "^1.4.0" + }, + "peerDependencies": { + "@types/react": "^18.2.25 || ^19", + "react": "^18.0 || ^19", + "redux": "^5.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/recharts": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-3.9.0.tgz", + "integrity": "sha512-dCEcE9y20c8H2tkVeByrAXhhnBJk6/QLbxKmn+dJUptOfc5NMjwRh1jo0vZPRLD+5dMrHrP+hPEsfbGBMfnf5Q==", + "license": "MIT", + "workspaces": [ + "www" + ], + "dependencies": { + "@reduxjs/toolkit": "^1.9.0 || 2.x.x", + "clsx": "^2.1.1", + "decimal.js-light": "^2.5.1", + "es-toolkit": "^1.39.3", + "eventemitter3": "^5.0.1", + "immer": "^10.1.1", + "react-redux": "8.x.x || 9.x.x", + "reselect": "5.2.0", + "tiny-invariant": "^1.3.3", + "use-sync-external-store": "^1.2.2", + "victory-vendor": "^37.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-is": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/redux": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", + "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", + "license": "MIT" + }, + "node_modules/redux-thunk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz", + "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==", + "license": "MIT", + "peerDependencies": { + "redux": "^5.0.0" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -5608,6 +6065,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/reselect": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.2.0.tgz", + "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==", + "license": "MIT" + }, "node_modules/resolve": { "version": "2.0.0-next.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", @@ -6180,6 +6643,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tailwind-merge": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, "node_modules/tailwindcss": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.1.tgz", @@ -6201,6 +6674,12 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", @@ -6541,6 +7020,37 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/victory-vendor": { + "version": "37.3.6", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-37.3.6.tgz", + "integrity": "sha512-SbPDPdDBYp+5MJHhBCAyI7wKM3d5ivekigc2Dk2s7pgbZ9wIgIBYGVw4zGHBml/qTFbexrofXW6Gu4noGxrOwQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index daa43d5..454c97c 100644 --- a/package.json +++ b/package.json @@ -9,15 +9,22 @@ "lint": "eslint" }, "dependencies": { + "clsx": "^2.1.1", + "framer-motion": "^12.41.0", + "lucide-react": "^1.21.0", "next": "16.2.9", "react": "19.2.4", - "react-dom": "19.2.4" + "react-dom": "19.2.4", + "react-katex": "^3.1.0", + "recharts": "^3.9.0", + "tailwind-merge": "^3.6.0" }, "devDependencies": { "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "@types/react-katex": "^3.0.4", "eslint": "^9", "eslint-config-next": "16.2.9", "tailwindcss": "^4", diff --git a/public/PragatiVeer_Logo/PNG_Logos/Rectangular_dark_background.png b/public/PragatiVeer_Logo/PNG_Logos/Rectangular_dark_background.png new file mode 100644 index 0000000..3ce2bf7 Binary files /dev/null and b/public/PragatiVeer_Logo/PNG_Logos/Rectangular_dark_background.png differ diff --git a/public/PragatiVeer_Logo/PNG_Logos/Rectangular_light_background.png b/public/PragatiVeer_Logo/PNG_Logos/Rectangular_light_background.png new file mode 100644 index 0000000..9fb8a57 Binary files /dev/null and b/public/PragatiVeer_Logo/PNG_Logos/Rectangular_light_background.png differ diff --git a/public/PragatiVeer_Logo/PNG_Logos/Square_dark_background.png b/public/PragatiVeer_Logo/PNG_Logos/Square_dark_background.png new file mode 100644 index 0000000..4aec149 Binary files /dev/null and b/public/PragatiVeer_Logo/PNG_Logos/Square_dark_background.png differ diff --git a/public/PragatiVeer_Logo/PNG_Logos/Square_light_background.png b/public/PragatiVeer_Logo/PNG_Logos/Square_light_background.png new file mode 100644 index 0000000..80a728a Binary files /dev/null and b/public/PragatiVeer_Logo/PNG_Logos/Square_light_background.png differ diff --git a/public/PragatiVeer_Logo/SVG_Logos/Rectangular_dark_background.svg b/public/PragatiVeer_Logo/SVG_Logos/Rectangular_dark_background.svg new file mode 100644 index 0000000..1576863 --- /dev/null +++ b/public/PragatiVeer_Logo/SVG_Logos/Rectangular_dark_background.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/PragatiVeer_Logo/SVG_Logos/Rectangular_light_background.svg b/public/PragatiVeer_Logo/SVG_Logos/Rectangular_light_background.svg new file mode 100644 index 0000000..77aa452 --- /dev/null +++ b/public/PragatiVeer_Logo/SVG_Logos/Rectangular_light_background.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/PragatiVeer_Logo/SVG_Logos/Square_dark_background.svg b/public/PragatiVeer_Logo/SVG_Logos/Square_dark_background.svg new file mode 100644 index 0000000..e5ae71f --- /dev/null +++ b/public/PragatiVeer_Logo/SVG_Logos/Square_dark_background.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/PragatiVeer_Logo/SVG_Logos/Square_light_background.svg b/public/PragatiVeer_Logo/SVG_Logos/Square_light_background.svg new file mode 100644 index 0000000..6c8d3b7 --- /dev/null +++ b/public/PragatiVeer_Logo/SVG_Logos/Square_light_background.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/course_business.png b/public/course_business.png new file mode 100644 index 0000000..12d19f1 Binary files /dev/null and b/public/course_business.png differ diff --git a/public/course_design.png b/public/course_design.png new file mode 100644 index 0000000..b1e9e25 Binary files /dev/null and b/public/course_design.png differ diff --git a/public/course_tech.png b/public/course_tech.png new file mode 100644 index 0000000..64d223b Binary files /dev/null and b/public/course_tech.png differ diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx new file mode 100644 index 0000000..c6dd117 --- /dev/null +++ b/src/app/about/page.tsx @@ -0,0 +1,24 @@ +import { Button } from "@/components/ui/button" +import Link from "next/link" +import { ArrowLeft } from "lucide-react" + +export default function AboutPage() { + return ( +
+
+ + Back to Home + +
+
+

About PragatiVeer

+

+ We are a team of educators and engineers dedicated to re-engineering NEET/JEE preparation through the power of Artificial Intelligence. +

+ + + +
+
+ ) +} diff --git a/src/app/admin/agents/page.tsx b/src/app/admin/agents/page.tsx new file mode 100644 index 0000000..55e6ff7 --- /dev/null +++ b/src/app/admin/agents/page.tsx @@ -0,0 +1,87 @@ +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { Activity, BrainCircuit, Zap, Server, ShieldCheck } from "lucide-react" + +export default function AgentsPage() { + const agents = [ + { name: "DPP Generator Node", status: "Healthy", latency: "140ms", tokens: "4.2M", successRate: "99.9%" }, + { name: "Tutor Agent (Physics)", status: "Healthy", latency: "320ms", tokens: "8.1M", successRate: "98.5%" }, + { name: "Tutor Agent (Chem/Bio)", status: "Healthy", latency: "290ms", tokens: "6.5M", successRate: "99.1%" }, + { name: "Evaluator Node", status: "Under Load", latency: "850ms", tokens: "12.4M", successRate: "97.2%" }, + ] + + return ( +
+
+

AI Agents Monitor

+

Real-time telemetry for internal LLM orchestration nodes.

+
+ +
+ + + Global API Status + + +
+
Operational +
+
+
+ + + Total Tokens Used (24h) + + +
31.2M
+
+
+ + + Avg Generation Latency + + +
400ms
+
+
+
+ +

Active Microservices

+
+ {agents.map((agent, i) => ( + + + + {agent.name} + +
+ {agent.status} +
+
+ +
+
+
Latency
+
{agent.latency}
+
+
+
Tokens
+
{agent.tokens}
+
+
+
Success
+
{agent.successRate}
+
+
+
+
+
+
+
+ ))} +
+
+ ) +} diff --git a/src/app/admin/layout.tsx b/src/app/admin/layout.tsx new file mode 100644 index 0000000..21e2c9a --- /dev/null +++ b/src/app/admin/layout.tsx @@ -0,0 +1,62 @@ +"use client" + +import { ReactNode } from "react" +import { LayoutDashboard, Users, Database, Terminal, Settings } from "lucide-react" +import Link from "next/link" +import Image from "next/image" +import { usePathname } from "next/navigation" + +export default function AdminLayout({ children }: { children: ReactNode }) { + const pathname = usePathname() + + return ( +
+ {/* Sidebar */} + + + {/* Main Content */} +
+ {children} +
+
+ ) +} + +function NavItem({ href, icon, label, active }: { href: string, icon: React.ReactNode, label: string, active?: boolean }) { + return ( + + {icon} + {label} + + ) +} diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx new file mode 100644 index 0000000..71ffddb --- /dev/null +++ b/src/app/admin/page.tsx @@ -0,0 +1,200 @@ +"use client" + +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { Badge } from "@/components/ui/badge" +import { Button } from "@/components/ui/button" +import { Terminal, Users, Database, Activity, RefreshCw } from "lucide-react" +import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, AreaChart, Area } from 'recharts' + +const data = [ + { name: 'Mon', accuracy: 88, tokens: 1.2 }, + { name: 'Tue', accuracy: 90, tokens: 1.5 }, + { name: 'Wed', accuracy: 89, tokens: 1.8 }, + { name: 'Thu', accuracy: 92, tokens: 2.1 }, + { name: 'Fri', accuracy: 95, tokens: 2.4 }, + { name: 'Sat', accuracy: 94, tokens: 2.2 }, + { name: 'Sun', accuracy: 96, tokens: 2.8 }, +]; + +export default function AdminDashboard() { + return ( +
+
+
+

Command Center

+

Real-time system monitoring and agent status.

+
+ +
+ + {/* KPI Stats */} +
+ + + Total Revenue +
+
+ +
₹12.4M
+

+14.2% from last month

+
+
+ + + Active Students +
+
+ +
45,231
+

+2,401 this week

+
+
+ + + AI Agent Accuracy +
+
+ +
96.4%
+

Based on 1.2M interactions

+
+
+ + + Question Bank +
+
+ +
142k
+

1.2k added today

+
+
+
+ +
+ {/* Charts */} + + + AI Token Usage vs Accuracy + + + + + + + + + + + + + `${value}M`} /> + + + + + + + + {/* Live Agent Status */} + + + Live Agent Status + + +
+
+
+ + +
+
+

DPP Generator

+

Latency: 142ms

+
+
+ Healthy +
+ +
+
+
+ + +
+
+

Tutor Agent

+

Latency: 840ms

+
+
+ Healthy +
+ +
+
+
+ +
+
+

Evaluator Node

+

Latency: 2100ms

+
+
+ Degraded +
+
+
+
+ + {/* Question Bank Manager Preview */} + + +
+ Recent Question Uploads +
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
IDSubjectTopicPreviewActions
#Q-8942PhysicsThermodynamicsAn ideal gas undergoes an isothermal expansion... + +
#Q-8941MathCalculusEvaluate the integral of e^x sin(x) dx... + +
+
+
+
+
+ ) +} diff --git a/src/app/admin/questions/page.tsx b/src/app/admin/questions/page.tsx new file mode 100644 index 0000000..9e3308f --- /dev/null +++ b/src/app/admin/questions/page.tsx @@ -0,0 +1,102 @@ +import { Button } from "@/components/ui/button" +import { Badge } from "@/components/ui/badge" +import { Search, Plus, Filter, MoreHorizontal, Edit, Trash } from "lucide-react" + +export default function QuestionsPage() { + const questions = [ + { id: "Q-NEET-2026-001", subject: "Physics", chapter: "Thermodynamics", type: "MCQ", difficulty: "Hard", status: "Active" }, + { id: "Q-NEET-2026-002", subject: "Chemistry", chapter: "Organic Chemistry", type: "Assertion/Reason", difficulty: "Medium", status: "Active" }, + { id: "Q-JEE-2026-003", subject: "Mathematics", chapter: "Calculus", type: "Numerical", difficulty: "Expert", status: "Review" }, + { id: "Q-NEET-2026-004", subject: "Biology", chapter: "Genetics", type: "MCQ", difficulty: "Easy", status: "Active" }, + { id: "Q-JEE-2026-005", subject: "Physics", chapter: "Mechanics", type: "MCQ", difficulty: "Medium", status: "Draft" }, + ] + + return ( +
+
+
+

Question Bank

+

Manage and curate the global repository for NEET/JEE.

+
+
+ + +
+
+ +
+
+
+ + +
+
+ +
+ + + + + + + + + + + + + + {questions.map((q) => ( + + + + + + + + + + ))} + +
Question IDSubjectChapterTypeDifficultyStatusActions
{q.id} + {q.subject} + {q.chapter}{q.type} + + {q.difficulty} + + + + {q.status} + + +
+ + + +
+
+
+
+ Showing 1 to 5 of 12,405 entries +
+ + +
+
+
+
+ ) +} diff --git a/src/app/admin/settings/page.tsx b/src/app/admin/settings/page.tsx new file mode 100644 index 0000000..2323d40 --- /dev/null +++ b/src/app/admin/settings/page.tsx @@ -0,0 +1,69 @@ +import { Button } from "@/components/ui/button" +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" + +export default function SettingsPage() { + return ( +
+
+

System Settings

+

Configure global application variables and security protocols.

+
+ +
+ + + AI Inference Configuration + Manage the underlying LLM models and API keys for the AI agents. + + +
+ + +
+
+ + +
+ +
+
+ + + + Platform Maintenance + Global toggles for site availability. + + +
+
+
Maintenance Mode
+
Disable all student access and show maintenance screen.
+
+
+
+
+
+
+
+
Allow New Registrations
+
Open the `/signup` route for new users.
+
+
+
+
+
+
+
+ + + + Danger Zone + + + + + +
+
+ ) +} diff --git a/src/app/admin/students/page.tsx b/src/app/admin/students/page.tsx new file mode 100644 index 0000000..931a21c --- /dev/null +++ b/src/app/admin/students/page.tsx @@ -0,0 +1,79 @@ +import { Button } from "@/components/ui/button" +import { Badge } from "@/components/ui/badge" +import { Search, Download, MoreVertical } from "lucide-react" + +export default function StudentsPage() { + const students = [ + { id: "STU-001", name: "Rahul Sharma", email: "rahul@example.com", tier: "AI Pro", target: "NEET", joined: "Oct 12, 2025", tests: 42 }, + { id: "STU-002", name: "Priya Patel", email: "priya@example.com", tier: "Basic", target: "JEE Main", joined: "Nov 05, 2025", tests: 14 }, + { id: "STU-003", name: "Amit Kumar", email: "amit@example.com", tier: "AI Pro", target: "JEE Adv", joined: "Dec 01, 2025", tests: 89 }, + { id: "STU-004", name: "Sneha Reddy", email: "sneha@example.com", tier: "AI Pro", target: "NEET", joined: "Dec 15, 2025", tests: 34 }, + { id: "STU-005", name: "Vikram Singh", email: "vikram@example.com", tier: "Basic", target: "NEET", joined: "Jan 10, 2026", tests: 5 }, + ] + + return ( +
+
+
+

Student Directory

+

Manage users, view engagement, and handle subscriptions.

+
+ +
+ +
+
+
+ + +
+
+ +
+ + + + + + + + + + + + + {students.map((s) => ( + + + + + + + + + ))} + +
StudentPlan TierTarget ExamTests TakenJoined Date
+
{s.name}
+
{s.email}
+
+ + {s.tier} + + {s.target}{s.tests}{s.joined} + +
+
+
+ Showing top 5 active students out of 12,400 total. +
+
+
+ ) +} diff --git a/src/app/cbt/[examId]/layout.tsx b/src/app/cbt/[examId]/layout.tsx new file mode 100644 index 0000000..fe846c6 --- /dev/null +++ b/src/app/cbt/[examId]/layout.tsx @@ -0,0 +1,9 @@ +import { ReactNode } from "react" + +export default function CBTLayout({ children }: { children: ReactNode }) { + return ( +
+ {children} +
+ ) +} diff --git a/src/app/cbt/[examId]/page.tsx b/src/app/cbt/[examId]/page.tsx new file mode 100644 index 0000000..401c501 --- /dev/null +++ b/src/app/cbt/[examId]/page.tsx @@ -0,0 +1,139 @@ +import { Button } from "@/components/ui/button" +import { Badge } from "@/components/ui/badge" +import { Clock, Flag, ChevronLeft, ChevronRight, Pause, MoreVertical } from "lucide-react" +import Image from "next/image" + +export default function CBTExamPage({ params }: { params: { examId: string } }) { + return ( + <> +
+
+
+ PragatiVeer + PragatiVeer +
+
+
+

AITS Full Syllabus Test 4

+

Physics • Section A

+
+
+ +
+
+ + 02:45:12 +
+ + +
+
+ +
+ {/* Main Question Area */} +
+
+
+ Question 12 +
+ +4 / -1 + +
+
+ +
+

+ A solid cylinder of mass M and radius R is rolling without slipping down an inclined plane of angle θ. + What is the minimum coefficient of static friction μ_s required to prevent slipping? +

+
+ +
+ {['(1/3) tan θ', '(2/3) tan θ', '(1/2) tan θ', 'tan θ'].map((option, idx) => ( + + ))} +
+
+
+ + {/* Side Panel for Question Grid */} + + + {/* Mobile bottom nav */} +
+ + +
+
+ + ) +} diff --git a/src/app/contact/page.tsx b/src/app/contact/page.tsx new file mode 100644 index 0000000..c5a3d93 --- /dev/null +++ b/src/app/contact/page.tsx @@ -0,0 +1,48 @@ +import { Button } from "@/components/ui/button" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import Link from "next/link" +import { ArrowLeft, Mail, MapPin, Phone } from "lucide-react" + +export default function ContactPage() { + return ( +
+
+ + Back to Home + +
+
+

Contact Us

+

+ Have a question or need support? We're here to help you ace your preparation. +

+ + + + Send us a message + + +
+ + +
+
+ + +
+ + +
+
+ support@pragativeer.com +
+
+ Tech Hub, Bengaluru, India +
+
+
+
+
+
+ ) +} diff --git a/src/app/dashboard/analytics/page.tsx b/src/app/dashboard/analytics/page.tsx new file mode 100644 index 0000000..9968892 --- /dev/null +++ b/src/app/dashboard/analytics/page.tsx @@ -0,0 +1,63 @@ +import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card" +import { LineChart, Activity, BrainCircuit } from "lucide-react" + +export default function AnalyticsPage() { + return ( +
+
+

Performance Analytics

+

Deep AI-driven insights into your study patterns and test trajectories.

+
+ +
+ + + Projected Score Trajectory + Your mock scores over the last 6 months projected towards the final exam. + + + {/* Placeholder for an actual chart library like Recharts */} +
+ +

Data gathering in progress...

+

Complete 2 more CBTs to unlock predictive graphing.

+
+
+
+ +
+ + + AI Diagnosis + + +

+ Our models detect a consistent 14% accuracy drop in physics questions involving Calculus. We are adjusting your upcoming DPPs to focus heavily on integration applications in kinematics. +

+
+
+ + + + Subject Mastery + + +
+
Biology 89%
+
+
+
+
Chemistry 68%
+
+
+
+
Physics 42%
+
+
+
+
+
+
+
+ ) +} diff --git a/src/app/dashboard/cbt/page.tsx b/src/app/dashboard/cbt/page.tsx new file mode 100644 index 0000000..a5d603d --- /dev/null +++ b/src/app/dashboard/cbt/page.tsx @@ -0,0 +1,84 @@ +import { Button } from "@/components/ui/button" +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" +import { Badge } from "@/components/ui/badge" +import { Activity, Clock, PlayCircle, Search } from "lucide-react" + +export default function CBTPage() { + const upcomingExams = [ + { title: "AITS Full Syllabus Test 4", date: "Tomorrow, 10:00 AM", duration: "180 Min", marks: 720 }, + { title: "Part Test 3: Mechanics", date: "Oct 24, 2026", duration: "180 Min", marks: 720 }, + { title: "Weekly Revision Test", date: "Oct 28, 2026", duration: "90 Min", marks: 360 }, + ] + + const pastExams = [ + { title: "AITS Full Syllabus Test 3", date: "Oct 15, 2026", score: 645, total: 720, percentile: "99.4" }, + { title: "Part Test 2: Electromagnetism", date: "Oct 08, 2026", score: 680, total: 720, percentile: "99.8" }, + ] + + return ( +
+
+
+

Computer Based Tests (CBT)

+

Real exam environment simulations to conquer NEET/JEE.

+
+
+ + +
+
+ +
+

+ Upcoming & Active Exams +

+
+ {upcomingExams.map((exam, i) => ( + + + Mock Test +

{exam.title}

+
+
{exam.date}
+
{exam.duration} • {exam.marks} Marks
+
+ +
+
+ ))} +
+
+ +
+

+ Past Attempts +

+
+ {pastExams.map((exam, i) => ( + + +
+

{exam.title}

+

{exam.date}

+
+
+
+
Score
+
{exam.score}/{exam.total}
+
+
+
Percentile
+
{exam.percentile}
+
+ +
+
+
+ ))} +
+
+
+ ) +} diff --git a/src/app/dashboard/dpp/page.tsx b/src/app/dashboard/dpp/page.tsx new file mode 100644 index 0000000..0b38312 --- /dev/null +++ b/src/app/dashboard/dpp/page.tsx @@ -0,0 +1,56 @@ +import { Button } from "@/components/ui/button" +import { Card, CardContent } from "@/components/ui/card" +import { BrainCircuit, Play, CheckCircle2, ChevronRight } from "lucide-react" + +export default function DPPPage() { + const dpps = [ + { title: "Rotational Dynamics: Top Overturning", subject: "Physics", count: 15, status: "Pending", priority: "High" }, + { title: "Chemical Kinetics: First Order Reactions", subject: "Chemistry", count: 20, status: "Pending", priority: "Medium" }, + { title: "Genetics: Mendelian Inheritance", subject: "Biology", count: 25, status: "Completed", score: "23/25" }, + { title: "Calculus: Definite Integration", subject: "Mathematics", count: 15, status: "Completed", score: "14/15" }, + ] + + return ( +
+
+
+

Daily Practice Problems (DPP)

+

+ Hyper-personalized problem sets generated daily by our AI Evaluator to target your specific weak areas based on past exam performance. +

+
+ +
+ +
+ {dpps.map((dpp, i) => ( + + +
+
+ {dpp.status === 'Completed' ? :
} +
+
+
{dpp.subject}
+

{dpp.title}

+
+ {dpp.count} Questions • {dpp.status === 'Completed' ? `Score: ${dpp.score}` : `${dpp.priority} Priority`} +
+
+
+
+ {dpp.status === 'Completed' ? ( + + ) : ( + + )} +
+
+
+ ))} +
+
+ ) +} diff --git a/src/app/dashboard/layout.tsx b/src/app/dashboard/layout.tsx new file mode 100644 index 0000000..28cb838 --- /dev/null +++ b/src/app/dashboard/layout.tsx @@ -0,0 +1,123 @@ +"use client" + +import { ReactNode, useState, useEffect, useRef } from "react" +import { BookOpen, LayoutDashboard, Settings, FileText, Activity, LineChart, Trophy, LogOut, User, ChevronUp } from "lucide-react" +import Link from "next/link" +import Image from "next/image" +import { usePathname } from "next/navigation" + +export default function DashboardLayout({ children }: { children: ReactNode }) { + const pathname = usePathname() + const [dropdownOpen, setDropdownOpen] = useState(false) + const dropdownRef = useRef(null) + + // Close dropdown when clicking outside + useEffect(() => { + function handleClickOutside(event: MouseEvent) { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + setDropdownOpen(false) + } + } + document.addEventListener("mousedown", handleClickOutside) + return () => document.removeEventListener("mousedown", handleClickOutside) + }, []) + + return ( +
+ {/* Sidebar */} + + + {/* Main Content */} +
+ {children} +
+
+ ) +} + +function NavItem({ href, icon, label, active }: { href: string, icon: React.ReactNode, label: string, active?: boolean }) { + return ( + + {icon} + {label} + + ) +} diff --git a/src/app/dashboard/materials/page.tsx b/src/app/dashboard/materials/page.tsx new file mode 100644 index 0000000..fe029f1 --- /dev/null +++ b/src/app/dashboard/materials/page.tsx @@ -0,0 +1,69 @@ +import { Card, CardContent } from "@/components/ui/card" +import { Folder, FileText, Download, PlaySquare } from "lucide-react" + +export default function MaterialsPage() { + const folders = [ + { name: "Physics Formula Sheets", items: 12, color: "text-blue-500" }, + { name: "Organic Chem Mind Maps", items: 8, color: "text-emerald-500" }, + { name: "Biology NCERT Highlights", items: 22, color: "text-rose-500" }, + { name: "Past Year Papers (2015-2025)", items: 10, color: "text-amber-500" }, + ] + + const recentFiles = [ + { name: "Kinematics 1D & 2D Rapid Revision.pdf", type: "PDF", size: "2.4 MB" }, + { name: "S-Block Elements Trick Video.mp4", type: "Video", size: "45 MB" }, + { name: "Human Reproduction Master Notes.pdf", type: "PDF", size: "8.1 MB" }, + ] + + return ( +
+
+

Study Materials

+

High-yield notes, mind maps, and video lectures.

+
+ +
+ {folders.map((folder, i) => ( + + + +

{folder.name}

+

{folder.items} Files

+
+
+ ))} +
+ +
+

Recently Accessed

+
+ + + + + + + + + + + {recentFiles.map((file, i) => ( + + + + + + + ))} + +
File NameTypeSizeDownload
+ {file.type === 'PDF' ? : } + {file.name} + {file.type}{file.size} + +
+
+
+
+ ) +} diff --git a/src/app/dashboard/page.tsx b/src/app/dashboard/page.tsx new file mode 100644 index 0000000..7c668bd --- /dev/null +++ b/src/app/dashboard/page.tsx @@ -0,0 +1,149 @@ +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" +import { Badge } from "@/components/ui/badge" +import { Button } from "@/components/ui/button" +import { Activity, BrainCircuit, ArrowRight, Clock } from "lucide-react" + +export default function DashboardPage() { + return ( +
+
+
+

Welcome back, Student

+

Here is your daily AI-curated study plan.

+
+ +
+ + {/* AI Predicted Weak Areas */} +
+
+

AI Focus Areas

+
+
+ + + Rotational Motion + Physics + + +
+ Mastery + 42% +
+
+
+
+
+
+ + + Chemical Kinetics + Chemistry + + +
+ Mastery + 68% +
+
+
+
+
+
+ + + Genetics + Biology + + +
+ Mastery + 89% +
+
+
+
+
+
+
+
+ +
+ {/* Dynamic DPP Modules */} +
+
+

Today's DPPs

+ +
+
+ + +
+
+ +
+
+

Physics: Rotational Dynamics

+

20 Questions • High Priority

+
+
+ +
+
+ + + +
+
+ +
+
+

Biology: Human Physiology

+

30 Questions • Revision

+
+
+ +
+
+
+
+ + {/* Upcoming CBTs */} +
+
+

Upcoming CBTs

+
+ +
+
+
+ Mock Test + Tomorrow, 10:00 AM +
+

AITS Full Syllabus Test 4

+

+ 180 Minutes • 720 Marks +

+
+ +
+
+
+

Part Test 3: Mechanics

+

Oct 24, 2026

+
+ +
+
+
+
+
+ ) +} diff --git a/src/app/dashboard/rank-predictor/page.tsx b/src/app/dashboard/rank-predictor/page.tsx new file mode 100644 index 0000000..f922be4 --- /dev/null +++ b/src/app/dashboard/rank-predictor/page.tsx @@ -0,0 +1,50 @@ +import { Card, CardContent } from "@/components/ui/card" +import { Button } from "@/components/ui/button" +import { Trophy, TrendingUp, AlertTriangle } from "lucide-react" + +export default function RankPredictorPage() { + return ( +
+
+
+ +
+

Rank Predictor AI

+

+ Our proprietary neural network analyzes your CBT scores against 100,000+ past successful candidates to predict your All India Rank. +

+
+ + +
+ +
Estimated NEET (UG) AIR
+
+ ~14,500 +
+ +
+
+ +
+
On the Right Track
+
Your biology and chemistry scores are securing a top 20k finish.
+
+
+
+ +
+
Physics Bottleneck
+
Pushing Physics beyond 120 marks will breach the top 5k rank.
+
+
+
+ + +
+
+
+ ) +} diff --git a/src/app/dashboard/settings/page.tsx b/src/app/dashboard/settings/page.tsx new file mode 100644 index 0000000..f3dc1f0 --- /dev/null +++ b/src/app/dashboard/settings/page.tsx @@ -0,0 +1,68 @@ +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" +import { Button } from "@/components/ui/button" + +export default function SettingsPage() { + return ( +
+
+

Account Settings

+

Manage your personal details and platform preferences.

+
+ +
+ + + Profile Details + Update your personal information. + + +
+
+ + +
+
+ + +
+
+
+ + +
+ +
+
+ + + + Academic Preferences + Tailor the AI to your specific exam targets. + + +
+ +
+ + +
+
+
+ + +
+
+
+
+
+ ) +} diff --git a/src/app/dpp/review/[dppId]/layout.tsx b/src/app/dpp/review/[dppId]/layout.tsx new file mode 100644 index 0000000..a525761 --- /dev/null +++ b/src/app/dpp/review/[dppId]/layout.tsx @@ -0,0 +1,9 @@ +import { ReactNode } from "react" + +export default function DPplayout({ children }: { children: ReactNode }) { + return ( +
+ {children} +
+ ) +} diff --git a/src/app/dpp/review/[dppId]/page.tsx b/src/app/dpp/review/[dppId]/page.tsx new file mode 100644 index 0000000..53752c9 --- /dev/null +++ b/src/app/dpp/review/[dppId]/page.tsx @@ -0,0 +1,133 @@ +import { Button } from "@/components/ui/button" +import { Badge } from "@/components/ui/badge" +import { ArrowLeft, Sparkles, Send, CheckCircle2, MessageSquare, ThumbsUp, ThumbsDown } from "lucide-react" +import Link from "next/link" +import Image from "next/image" + +export default function DPplayoutPage({ params }: { params: { dppId: string } }) { + return ( +
+
+
+ + + +
+
+ PragatiVeer + PragatiVeer +
+
+ AI Review +

Rotational Dynamics DPP #4

+
+
+
+ Score: 14/20 +
+
+ +
+
+
+

+ + Question 3 +

+ Medium Difficulty +
+
+

+ Two identical solid spheres roll down two different inclined planes of the same height but different angles of inclination. + Which sphere reaches the bottom with greater speed? +

+
+ +
+
C
+ They reach with the same speed. + Your Answer +
+
+ + {/* AI Solution Breakdown */} +
+
+
+ +
+

AI Step-by-Step Solution

+
+ +
+
+
+

Step 1: Energy Conservation

+

+ By the law of conservation of mechanical energy, the potential energy at the top is converted into translational and rotational kinetic energy at the bottom. +

+
+ mgh = ½mv² + ½Iω² +
+
+ +
+
+

Step 2: Moment of Inertia

+

+ For a solid sphere, the moment of inertia I = ⅖mr². Substitute this and ω = v/r into the energy equation. +

+
+ mgh = ½mv² + ½(⅖mr²)(v²/r²)
+ mgh = ½mv² + ⅕mv²
+ gh = 7/10 v² +
+
+ +
+
+

Step 3: Final Velocity

+

+ Solving for v, we get: +

+
+ v = √(10gh/7) +
+

+ The final speed depends only on height h and acceleration due to gravity g. It is independent of the angle of inclination. Therefore, both spheres reach the bottom with the same speed. +

+
+
+ +
+ + +
+
+
+ +
+
+ + +
+
+
+ ) +} diff --git a/src/app/favicon.ico b/src/app/favicon.ico deleted file mode 100644 index 718d6fe..0000000 Binary files a/src/app/favicon.ico and /dev/null differ diff --git a/src/app/globals.css b/src/app/globals.css index a2dc41e..80a63b8 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,26 +1,113 @@ @import "tailwindcss"; +@theme { + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); + + --color-background: var(--background); + --color-foreground: var(--foreground); + + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + + --radius-xl: 0.75rem; + --radius-2xl: 1rem; +} + :root { --background: #ffffff; --foreground: #171717; -} + --border: #e5e5e5; + --input: #e5e5e5; + --ring: #171717; -@theme inline { - --color-background: var(--background); - --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); + --primary: #171717; + --primary-foreground: #fafafa; + --secondary: #f5f5f5; + --secondary-foreground: #171717; + --accent: #f5f5f5; + --accent-foreground: #171717; + --muted: #f5f5f5; + --muted-foreground: #737373; } @media (prefers-color-scheme: dark) { :root { --background: #0a0a0a; --foreground: #ededed; + --border: #1f1f1f; + --input: #1f1f1f; + --ring: #D1FF4D; + + --primary: #D1FF4D; + --primary-foreground: #0a0a0a; + --secondary: #171717; + --secondary-foreground: #ededed; + --accent: #00F0FF; + --accent-foreground: #0a0a0a; + --muted: #171717; + --muted-foreground: #a3a3a3; } } body { background: var(--background); color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; + font-family: var(--font-sans), Arial, Helvetica, sans-serif; + @apply antialiased selection:bg-primary/20; +} + +@layer utilities { + .text-balance { + text-wrap: balance; + } + + .bg-grid { + background-size: 40px 40px; + background-image: linear-gradient(to right, rgba(255, 255, 255, 0.03) 1px, transparent 1px), + linear-gradient(to bottom, rgba(255, 255, 255, 0.03) 1px, transparent 1px); + } + + .animate-gradient { + background-size: 200% auto; + animation: gradient-shift 4s linear infinite; + } + + .animate-marquee { + animation: marquee 30s linear infinite; + } + + .animate-shine { + animation: shine 3s infinite linear; + } +} + +@keyframes gradient-shift { + 0% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } + 100% { background-position: 0% 50%; } +} + +@keyframes marquee { + 0% { transform: translateX(0%); } + 100% { transform: translateX(-50%); } +} + +@keyframes shine { + 0% { transform: translateX(-100%) skewX(-15deg); } + 30% { transform: translateX(200%) skewX(-15deg); } + 100% { transform: translateX(200%) skewX(-15deg); } } diff --git a/src/app/icon.svg b/src/app/icon.svg new file mode 100644 index 0000000..e5ae71f --- /dev/null +++ b/src/app/icon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 976eb90..5adc7bb 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -13,8 +13,9 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", + title: "PragatiVeer - AI Powered NEET/JEE Preparation", + description: "Experience the most accurate Computer-Based Test simulator combined with adaptive Daily Practice Problems generated specifically for your weak areas in real-time.", + keywords: "NEET, JEE, Prep, AI, CBT, DPP, Online Test, Study", }; export default function RootLayout({ diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx new file mode 100644 index 0000000..f3bde61 --- /dev/null +++ b/src/app/login/page.tsx @@ -0,0 +1,101 @@ +"use client" + +import { Button } from "@/components/ui/button" +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" +import { ArrowLeft, Eye, EyeOff } from "lucide-react" +import Link from "next/link" +import Image from "next/image" +import { useState } from "react" + +export default function LoginPage() { + const [showPassword, setShowPassword] = useState(false) + return ( +
+ + Back to Home + + +
+
+
+ PragatiVeer + PragatiVeer +
+
+ + + + Welcome back + Enter your credentials to access your dashboard. + + +
+
+ + +
+
+
+ + Forgot password? +
+
+ + +
+
+
+ + + + + +
+
+ +
+
+ Or continue with +
+
+ + + + +
+
+ +

+ Don't have an account? Sign up +

+
+
+ ) +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 3f36f7c..127216c 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,65 +1,531 @@ -import Image from "next/image"; +"use client" + +import { Button } from "@/components/ui/button" +import { Badge } from "@/components/ui/badge" +import { Card, CardContent } from "@/components/ui/card" +import { BrainCircuit, Activity, Zap, CheckCircle2, Shield, ArrowRight, Play, BookOpen, LineChart, Trophy, Sparkles, MessageSquare } from "lucide-react" +import Image from "next/image" +import Link from "next/link" +import { motion, useScroll, useTransform, Variants } from "framer-motion" +import { useRef } from "react" + +export default function MarketingPage() { + const containerRef = useRef(null) + const { scrollYProgress } = useScroll({ + target: containerRef, + offset: ["start start", "end start"] + }) + + // Slower background parallax + const yBg = useTransform(scrollYProgress, [0, 1], ["0%", "50%"]) + + // Stagger variants for the features + const containerVariants: Variants = { + hidden: { opacity: 0 }, + visible: { + opacity: 1, + transition: { + staggerChildren: 0.2 + } + } + } + + const itemVariants: Variants = { + hidden: { opacity: 0, y: 30 }, + visible: { + opacity: 1, + y: 0, + transition: { type: "spring", stiffness: 100, damping: 12 } + } + } -export default function Home() { return ( -
-
- Next.js logo -
-

- To get started, edit the page.tsx file. -

-

- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -

-
-
- - Vercel logomark + + {/* Animated Deep Background */} +
+
+
+ + {/* Floating Orbs (Using Framer Motion) */} + + + + {/* Navigation */} +
+ +
+ {/* Hero Section */} +
+ + + The Next Evolution of Prep + + + + + NEET/JEE Prep,
+ Re-engineered by AI. +
+ + + Experience the most accurate CBT simulator combined with adaptive DPPs generated specifically for your weak areas in real-time. + + + + + + + + + + + + {/* Dashboard Preview Mockup */} + + {/* Top Window Chrome Bar */} +
+
+
+
+
+
+
+
+ pragativeer.ai/dashboard/student +
+
+ + AI Active + +
+
+ + {/* Dashboard Inner Screen */} +
+ {/* Mock Sidebar */} +
+
+
+ + Overview +
+
+ + Exams (CBT) +
+
+ + Daily Practice +
+
+ + Study Materials +
+
+
+

AI Intelligence

+
+
+ + Analytics +
+
+ + Rank Predictor +
+
+
+
+ + {/* Mock Main Content Area */} +
+ {/* Greeting & Header */} +
+
+

Welcome, Demo Student

+

Your adaptive NEET path is optimized. Next review in 2 hours.

+
+
+ + Subscription: AI Pro Plan +
+
+ + {/* Dashboard Grid Cards */} +
+ {/* Card 1: Weakness Analysis */} +
+
+

Focus Topic

+ Physics +
+
+
+ Rotational Dynamics + 42% Mastery +
+
+
+
+
+

+ AI recommendation: Solve 5 intermediate DPP questions on Moment of Inertia to unlock the next level and boost your expected score. +

+
+ + {/* Card 2: Live Score & AIR Rank Predictor */} +
+
+

Rank Simulator

+ NEET Target +
+
+
+

Estimated AIR

+

1,240

+
+
+

Expected Score

+

685 / 720

+
+
+ {/* Mini Sparkline Chart representation */} +
+ {[30, 45, 35, 55, 70, 60, 85].map((val, i) => ( +
+ ))} +
+
+
+ + {/* AI Tutor Consultation Interface */} +
+
+ +
+
+
+

AI Tutor Agent

+ Response generated instantly +
+
+ "I have analyzed your last CBT physics test. You excelled in Mechanics but hesitated on electromagnetic induction questions, spending an average of 42 seconds longer per problem. I have generated a custom 10-question DPP focusing exclusively on induction. Let's tackle it now." +
+
+ + + + +
+
+
+ +
+
+
+
+ + {/* Infinite Trust Bar */} +
+
+
+
+ {/* First Set */} +
+
NTA Compliant
+
99.9% Uptime
+
10M+ AI Models
+
50k+ Selections
+
+ {/* Duplicate Set for seamless scroll */} +
+
NTA Compliant
+
99.9% Uptime
+
10M+ AI Models
+
50k+ Selections
+
+
+
+ + {/* Animated DPP Engine Section */} +
+ +

Adaptive Engine

+

Our AI analyzes every keystroke and hesitation to generate the exact problems you need to solve next.

+
+ + + + + +
+ +
+
+ +
+

Real-time Analysis

+

+ Every test attempt updates your knowledge graph instantly, identifying micro-concepts where you struggle. +

+
+
+
+ + + + +
+ +
+
+ +
+

Dynamic Generation

+

+ Custom problems are generated on the fly, matching the exact difficulty and NTA pattern required for growth. +

+
+
+
+ + + + +
+ +
+
+ +
+

Instant Resolution

+

+ Get interactive, step-by-step AI breakdowns for every wrong answer. Ask follow-up questions until you master it. +

+
+
+
+
+
+ + {/* Animated Pricing */} +
+
+ + +

Simple, Transparent Pricing

+

Unlock the ultimate unfair advantage for your NEET/JEE preparation.

+
+ +
+ + +

Basic

+

Perfect for self-paced revision.

+
₹999/mo
+
    +
  • 10 Full Syllabus CBTs
  • +
  • Standard Question Bank
  • +
  • Basic Analytics
  • +
+ + + +
+
+ + + +
+
+ MOST POPULAR +
+
+

AI Pro

+

The complete AI-driven preparation system.

+
₹2499/mo
+
    +
  • Unlimited Dynamic CBTs
  • +
  • Adaptive AI DPPs
  • +
  • Interactive AI Tutor (24/7)
  • +
  • Predictive Rank Analytics
  • +
+ + + +
+
+
+
+
+ + {/* Global Footer (Static) */} +
+
+
+
+
+ PragatiVeer + PragatiVeer +
+

+ Re-engineering NEET & JEE preparation with adaptive AI models. Learn faster, rank higher. +

+
+ + + + + + + + + +
+
+ +
+

Product

+
    +
  • Features
  • +
  • Pricing
  • +
  • Student Dashboard
  • +
  • Admin Panel
  • +
+
+ +
+

Company

+
    +
  • About Us
  • +
  • Contact
  • +
  • Careers
  • +
+
+ +
+

Legal

+
    +
  • Privacy Policy
  • +
  • Terms of Service
  • +
+
+
+ +
+

© {new Date().getFullYear()} PragatiVeer. All rights reserved.

+
+ Made with
by AI Agents +
+
+
+
- ); + ) } diff --git a/src/app/signup/page.tsx b/src/app/signup/page.tsx new file mode 100644 index 0000000..03fcacb --- /dev/null +++ b/src/app/signup/page.tsx @@ -0,0 +1,114 @@ +"use client" + +import { Button } from "@/components/ui/button" +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" +import { ArrowLeft, Eye, EyeOff } from "lucide-react" +import Link from "next/link" +import Image from "next/image" +import { useState } from "react" + +export default function SignupPage() { + const [showPassword, setShowPassword] = useState(false) + return ( +
+ + Back to Home + + +
+
+
+ PragatiVeer + PragatiVeer +
+
+ + + + Create an account + Start your AI-powered preparation journey today. + + +
+
+
+ + +
+
+ + +
+
+
+ + +
+
+ +
+ + +
+
+
+ + + + + +
+
+ +
+
+ Or continue with +
+
+ + + + +
+
+ +

+ Already have an account? Log in +

+
+
+ ) +} diff --git a/src/components/ui/badge.tsx b/src/components/ui/badge.tsx new file mode 100644 index 0000000..9fb651c --- /dev/null +++ b/src/components/ui/badge.tsx @@ -0,0 +1,26 @@ +import * as React from "react" +import { cn } from "@/lib/utils" + +export interface BadgeProps extends React.HTMLAttributes { + variant?: "default" | "secondary" | "outline" | "destructive"; +} + +function Badge({ className, variant = "default", ...props }: BadgeProps) { + return ( +
+ ) +} + +export { Badge } diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx new file mode 100644 index 0000000..89248d8 --- /dev/null +++ b/src/components/ui/button.tsx @@ -0,0 +1,37 @@ +import * as React from "react" +import { cn } from "@/lib/utils" + +export interface ButtonProps extends React.ButtonHTMLAttributes { + variant?: "default" | "outline" | "ghost" | "secondary" | "link"; + size?: "default" | "sm" | "lg" | "icon"; + asChild?: boolean; +} + +const Button = React.forwardRef( + ({ className, variant = "default", size = "default", ...props }, ref) => { + return ( +