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 (
+
+
+
+ About PragatiVeer
+
+ We are a team of educators and engineers dedicated to re-engineering NEET/JEE preparation through the power of Artificial Intelligence.
+
+
+ Join the Revolution
+
+
+
+ )
+}
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
+
+
+
+
+
+
+
+ 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 (
+
+
+
+ {/* 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
+
+ Add Question
+
+
+
+
+
+
+ ID
+ Subject
+ Topic
+ Preview
+ Actions
+
+
+
+
+ #Q-8942
+ Physics
+ Thermodynamics
+ An ideal gas undergoes an isothermal expansion...
+
+ Edit
+
+
+
+ #Q-8941
+ Math
+ Calculus
+ Evaluate the integral of e^x sin(x) dx...
+
+ Edit
+
+
+
+
+
+
+
+
+ )
+}
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.
+
+
+
Filter
+
Add Question
+
+
+
+
+
+
+
+
+
+
+ Question ID
+ Subject
+ Chapter
+ Type
+ Difficulty
+ Status
+ Actions
+
+
+
+ {questions.map((q) => (
+
+ {q.id}
+
+ {q.subject}
+
+ {q.chapter}
+ {q.type}
+
+
+ {q.difficulty}
+
+
+
+
+ {q.status}
+
+
+
+
+
+
+
+
+
+
+ ))}
+
+
+
+
+
Showing 1 to 5 of 12,405 entries
+
+ Previous
+ Next
+
+
+
+
+ )
+}
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.
+
+
+
+ Primary Model Name
+
+
+
+ OpenAI API Key (Fallback)
+
+
+ Save Configuration
+
+
+
+
+
+ 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
+
+
+ Purge Generated Cache
+
+
+
+
+ )
+}
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.
+
+
Export CSV
+
+
+
+
+
+
+
+
+
+ Student
+ Plan Tier
+ Target Exam
+ Tests Taken
+ Joined Date
+
+
+
+
+ {students.map((s) => (
+
+
+ {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 (
+ <>
+
+
+
+
+
+
+
+
+
AITS Full Syllabus Test 4
+
Physics • Section A
+
+
+
+
+
+
+ 02:45:12
+
+
+ Pause
+
+
Submit Exam
+
+
+
+
+ {/* 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) => (
+
+
+ {String.fromCharCode(65 + idx)}
+
+ {option}
+
+ ))}
+
+
+
+
+ {/* Side Panel for Question Grid */}
+
+
+ {/* Mobile bottom nav */}
+
+ Previous
+ Save & Next
+
+
+ >
+ )
+}
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 (
+
+
+
+ Contact Us
+
+ Have a question or need support? We're here to help you ace your preparation.
+
+
+
+
+ Send us a message
+
+
+
+ Your Email
+
+
+
+ Message
+
+
+ Send 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
+
+
+
+
+
+
+
+
+
+
+ )
+}
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
+
+
+ Start Exam
+
+
+
+ ))}
+
+
+
+
+
+ Past Attempts
+
+
+ {pastExams.map((exam, i) => (
+
+
+
+
{exam.title}
+
{exam.date}
+
+
+
+
Score
+
{exam.score} /{exam.total}
+
+
+
Percentile
+
{exam.percentile}
+
+
Review Analysis
+
+
+
+ ))}
+
+
+
+ )
+}
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.
+
+
+
+ Generate Custom DPP
+
+
+
+
+ {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' ? (
+
Review
+ ) : (
+
+ )}
+
+
+
+ ))}
+
+
+ )
+}
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
+
+
+
+
+ File Name
+ Type
+ Size
+ Download
+
+
+
+ {recentFiles.map((file, i) => (
+
+
+ {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 (
+
+
+
+ {/* 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
+ View All
+
+
+
+
+
+
+
+
+
+
Physics: Rotational Dynamics
+
20 Questions • High Priority
+
+
+
+ Start
+
+
+
+
+
+
+
+
+
+
Biology: Human Physiology
+
30 Questions • Revision
+
+
+
+ Start
+
+
+
+
+
+
+ {/* Upcoming CBTs */}
+
+
+
Upcoming CBTs
+
+
+
+
+
+ Mock Test
+ Tomorrow, 10:00 AM
+
+
AITS Full Syllabus Test 4
+
+ 180 Minutes • 720 Marks
+
+
+
Remind Me
+
+
+
+
Part Test 3: Mechanics
+
Oct 24, 2026
+
+
Details
+
+
+
+
+
+ )
+}
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.
+
+
+
+
+
+ Recalculate with Latest Mock
+
+
+
+
+ )
+}
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.
+
+
+
+
+ Email Address
+
+
+ Save Changes
+
+
+
+
+
+ Academic Preferences
+ Tailor the AI to your specific exam targets.
+
+
+
+
+ Target Year
+
+ 2026
+ 2027
+
+
+
+
+
+
+ )
+}
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 (
+
+
+
+
+
+
+
+
+
+
+
+
+
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.
+
+
+
+
+
+ Helpful
+ Not Helpful
+
+
+
+
+
+
+ )
+}
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
+
+
+
+
+
+
+
+ Welcome back
+ Enter your credentials to access your dashboard.
+
+
+
+
+ Email
+
+
+
+
+ Password
+ Forgot password?
+
+
+
+ setShowPassword(!showPassword)}
+ className="absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors"
+ >
+ {showPassword ? : }
+
+
+
+
+
+
+
+ Sign In
+
+
+
+
+
+
+
+
+ Or continue with
+
+
+
+
+
+
+ Google
+
+
+
+
+
+
+ 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 (
-
-
-
-
-
- To get started, edit the page.tsx file.
-
-
- Looking for a starting point or more instructions? Head over to{" "}
-
- Templates
- {" "}
- or the{" "}
-
- Learning
- {" "}
- center.
-
-
-
-
-
+
+ {/* Animated Deep Background */}
+
+
+
+
+ {/* Floating Orbs (Using Framer Motion) */}
+
+
+
+ {/* Navigation */}
+
+
+
+
- Deploy Now
-
-
- Documentation
-
+
+
+
+ Features
+ Pricing
+ About
+
+
+ Log in
+
+ Get Started
+
+
+
+
+
+ {/* 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.
+
+
+
+
+
+ Start Free Trial
+
+
+
+
+
+ Watch Demo
+
+
+
+
+ {/* Dashboard Preview Mockup */}
+
+ {/* Top Window Chrome Bar */}
+
+
+
+
+ pragativeer.ai/dashboard/student
+
+
+
+ AI Active
+
+
+
+
+ {/* Dashboard Inner Screen */}
+
+ {/* Mock Sidebar */}
+
+
+
+
+
+
+ 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."
+
+
+
+
+ Start Custom DPP
+
+
+
+ Ask AI to explain
+
+
+
+
+
+
+
+
+
+
+ {/* Infinite Trust Bar */}
+
+
+
+
+ {/* First Set */}
+
+
NTA Compliant
+
+
10M+ AI Models
+
50k+ Selections
+
+ {/* Duplicate Set for seamless scroll */}
+
+
NTA Compliant
+
+
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
+
+
+ Choose Basic
+
+
+
+
+
+
+
+
+ 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
+
+
+
Get AI Pro
+
+
+
+
+
+
+
+ {/* Global Footer (Static) */}
+
+
+
+
+
+
+
+
+
+ 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
+
+
+
+
+
+
+
+ Create an account
+ Start your AI-powered preparation journey today.
+
+
+
+
+
+ Email
+
+
+
+
Password
+
+
+ setShowPassword(!showPassword)}
+ className="absolute right-3 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground transition-colors"
+ >
+ {showPassword ? : }
+
+
+
+
+
+
+
+ Create Account
+
+
+
+
+
+
+
+
+ Or continue with
+
+
+
+
+
+
+ Google
+
+
+
+
+
+
+ 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 (
+
+ )
+ }
+)
+Button.displayName = "Button"
+
+export { Button }
diff --git a/src/components/ui/card.tsx b/src/components/ui/card.tsx
new file mode 100644
index 0000000..2c630e0
--- /dev/null
+++ b/src/components/ui/card.tsx
@@ -0,0 +1,72 @@
+import * as React from "react"
+import { cn } from "@/lib/utils"
+
+const Card = React.forwardRef>(
+ ({ className, ...props }, ref) => (
+
+ )
+)
+Card.displayName = "Card"
+
+const CardHeader = React.forwardRef>(
+ ({ className, ...props }, ref) => (
+
+ )
+)
+CardHeader.displayName = "CardHeader"
+
+const CardTitle = React.forwardRef>(
+ ({ className, ...props }, ref) => (
+
+ )
+)
+CardTitle.displayName = "CardTitle"
+
+const CardDescription = React.forwardRef>(
+ ({ className, ...props }, ref) => (
+
+ )
+)
+CardDescription.displayName = "CardDescription"
+
+const CardContent = React.forwardRef>(
+ ({ className, ...props }, ref) => (
+
+ )
+)
+CardContent.displayName = "CardContent"
+
+const CardFooter = React.forwardRef>(
+ ({ className, ...props }, ref) => (
+
+ )
+)
+CardFooter.displayName = "CardFooter"
+
+export { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }
diff --git a/src/lib/utils.ts b/src/lib/utils.ts
new file mode 100644
index 0000000..bd0c391
--- /dev/null
+++ b/src/lib/utils.ts
@@ -0,0 +1,6 @@
+import { clsx, type ClassValue } from "clsx"
+import { twMerge } from "tailwind-merge"
+
+export function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs))
+}