Updated the front end upto alright

This commit is contained in:
viswasri 2025-05-06 12:49:57 +05:30
parent a361ab2c25
commit 5901f56eac
23 changed files with 1595 additions and 528 deletions

21
components.json Normal file
View File

@ -0,0 +1,21 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": false,
"tsx": false,
"tailwind": {
"config": "tailwind.config.js",
"css": "src/index.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}

331
package-lock.json generated
View File

@ -13,24 +13,33 @@
"@mui/icons-material": "^6.1.10",
"@mui/material": "^6.1.10",
"@mui/styles": "^6.1.10",
"@radix-ui/react-slot": "^1.1.2",
"bootstrap": "^5.3.3",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^0.484.0",
"react": "^18.3.1",
"react-bootstrap": "^2.10.7",
"react-dom": "^18.3.1",
"react-icons": "^5.5.0",
"react-router-dom": "^7.0.2",
"survey-react-ui": "^1.12.13"
"react-router-dom": "^7.4.0",
"survey-react-ui": "^1.12.13",
"tailwind-merge": "^3.0.2",
"tw-animate-css": "^1.2.5"
},
"devDependencies": {
"@eslint/js": "^9.15.0",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@vitejs/plugin-react": "^4.3.4",
"autoprefixer": "^10.4.21",
"eslint": "^9.15.0",
"eslint-plugin-react": "^7.37.2",
"eslint-plugin-react-hooks": "^5.0.0",
"eslint-plugin-react-refresh": "^0.4.14",
"globals": "^15.12.0",
"postcss": "^8.5.3",
"tailwindcss": "^4.0.17",
"vite": "^6.0.1"
}
},
@ -1345,6 +1354,37 @@
"url": "https://opencollective.com/popperjs"
}
},
"node_modules/@radix-ui/react-compose-refs": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz",
"integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==",
"peerDependencies": {
"@types/react": "*",
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
}
}
},
"node_modules/@radix-ui/react-slot": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz",
"integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==",
"dependencies": {
"@radix-ui/react-compose-refs": "1.1.1"
},
"peerDependencies": {
"@types/react": "*",
"react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
},
"peerDependenciesMeta": {
"@types/react": {
"optional": true
}
}
},
"node_modules/@react-aria/ssr": {
"version": "3.9.7",
"resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.7.tgz",
@ -1957,6 +1997,43 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/autoprefixer": {
"version": "10.4.21",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
"integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
"dev": true,
"funding": [
{
"type": "opencollective",
"url": "https://opencollective.com/postcss/"
},
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/autoprefixer"
},
{
"type": "github",
"url": "https://github.com/sponsors/ai"
}
],
"dependencies": {
"browserslist": "^4.24.4",
"caniuse-lite": "^1.0.30001702",
"fraction.js": "^4.3.7",
"normalize-range": "^0.1.2",
"picocolors": "^1.1.1",
"postcss-value-parser": "^4.2.0"
},
"bin": {
"autoprefixer": "bin/autoprefixer"
},
"engines": {
"node": "^10 || ^12 || >=14"
},
"peerDependencies": {
"postcss": "^8.1.0"
}
},
"node_modules/available-typed-arrays": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
@ -2037,9 +2114,9 @@
}
},
"node_modules/browserslist": {
"version": "4.24.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
"integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
"version": "4.24.4",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
"integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
"dev": true,
"funding": [
{
@ -2056,9 +2133,9 @@
}
],
"dependencies": {
"caniuse-lite": "^1.0.30001669",
"electron-to-chromium": "^1.5.41",
"node-releases": "^2.0.18",
"caniuse-lite": "^1.0.30001688",
"electron-to-chromium": "^1.5.73",
"node-releases": "^2.0.19",
"update-browserslist-db": "^1.1.1"
},
"bin": {
@ -2096,9 +2173,9 @@
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001686",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz",
"integrity": "sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==",
"version": "1.0.30001707",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz",
"integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==",
"dev": true,
"funding": [
{
@ -2131,6 +2208,17 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/class-variance-authority": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
"integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
"dependencies": {
"clsx": "^2.1.1"
},
"funding": {
"url": "https://polar.sh/cva"
}
},
"node_modules/classnames": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
@ -2370,9 +2458,9 @@
}
},
"node_modules/electron-to-chromium": {
"version": "1.5.68",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.68.tgz",
"integrity": "sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ==",
"version": "1.5.128",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz",
"integrity": "sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==",
"dev": true
},
"node_modules/error-ex": {
@ -2879,6 +2967,19 @@
"is-callable": "^1.1.3"
}
},
"node_modules/fraction.js": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
"integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
"dev": true,
"engines": {
"node": "*"
},
"funding": {
"type": "patreon",
"url": "https://github.com/sponsors/rawify"
}
},
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@ -3787,6 +3888,14 @@
"yallist": "^3.0.2"
}
},
"node_modules/lucide-react": {
"version": "0.484.0",
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.484.0.tgz",
"integrity": "sha512-oZy8coK9kZzvqhSgfbGkPtTgyjpBvs3ukLgDPv14dSOZtBtboryWF5o8i3qen7QbGg7JhiJBz5mK1p8YoMZTLQ==",
"peerDependencies": {
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@ -3829,11 +3938,20 @@
"dev": true
},
"node_modules/node-releases": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
"integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
"version": "2.0.19",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
"dev": true
},
"node_modules/normalize-range": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
"integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@ -4051,9 +4169,9 @@
}
},
"node_modules/postcss": {
"version": "8.4.49",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
"integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
"version": "8.5.3",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
"integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
"dev": true,
"funding": [
{
@ -4070,7 +4188,7 @@
}
],
"dependencies": {
"nanoid": "^3.3.7",
"nanoid": "^3.3.8",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
},
@ -4078,6 +4196,12 @@
"node": "^10 || ^12 || >=14"
}
},
"node_modules/postcss-value-parser": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@ -4199,9 +4323,9 @@
}
},
"node_modules/react-router": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-7.0.2.tgz",
"integrity": "sha512-m5AcPfTRUcjwmhBzOJGEl6Y7+Crqyju0+TgTQxoS4SO+BkWbhOrcfZNq6wSWdl2BBbJbsAoBUb8ZacOFT+/JlA==",
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-7.4.0.tgz",
"integrity": "sha512-Y2g5ObjkvX3VFeVt+0CIPuYd9PpgqCslG7ASSIdN73LwA1nNWzcMLaoMRJfP3prZFI92svxFwbn7XkLJ+UPQ6A==",
"dependencies": {
"@types/cookie": "^0.6.0",
"cookie": "^1.0.1",
@ -4222,11 +4346,11 @@
}
},
"node_modules/react-router-dom": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.0.2.tgz",
"integrity": "sha512-VJOQ+CDWFDGaWdrG12Nl+d7yHtLaurNgAQZVgaIy7/Xd+DojgmYLosFfZdGz1wpxmjJIAkAMVTKWcvkx1oggAw==",
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.4.0.tgz",
"integrity": "sha512-VlksBPf3n2bijPvnA7nkTsXxMAKOj+bWp4R9c3i+bnwlSOFAGOkJkKhzy/OsRkWaBMICqcAl1JDzh9ZSOze9CA==",
"dependencies": {
"react-router": "7.0.2"
"react-router": "7.4.0"
},
"engines": {
"node": ">=20.0.0"
@ -4643,6 +4767,21 @@
"survey-core": "1.12.13"
}
},
"node_modules/tailwind-merge": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.0.2.tgz",
"integrity": "sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==",
"funding": {
"type": "github",
"url": "https://github.com/sponsors/dcastil"
}
},
"node_modules/tailwindcss": {
"version": "4.0.17",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.17.tgz",
"integrity": "sha512-OErSiGzRa6rLiOvaipsDZvLMSpsBZ4ysB4f0VKGXUrjw2jfkJRd6kjRKV2+ZmTCNvwtvgdDam5D7w6WXsdLJZw==",
"dev": true
},
"node_modules/tiny-warning": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
@ -4658,6 +4797,14 @@
"resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz",
"integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g=="
},
"node_modules/tw-animate-css": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.2.5.tgz",
"integrity": "sha512-ABzjfgVo+fDbhRREGL4KQZUqqdPgvc5zVrLyeW9/6mVqvaDepXc7EvedA+pYmMnIOsUAQMwcWzNvom26J2qYvQ==",
"funding": {
"url": "https://github.com/sponsors/Wombosvideo"
}
},
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@ -5809,6 +5956,20 @@
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
"integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="
},
"@radix-ui/react-compose-refs": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.1.tgz",
"integrity": "sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==",
"requires": {}
},
"@radix-ui/react-slot": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.2.tgz",
"integrity": "sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==",
"requires": {
"@radix-ui/react-compose-refs": "1.1.1"
}
},
"@react-aria/ssr": {
"version": "3.9.7",
"resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.7.tgz",
@ -6234,6 +6395,20 @@
"is-shared-array-buffer": "^1.0.2"
}
},
"autoprefixer": {
"version": "10.4.21",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
"integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==",
"dev": true,
"requires": {
"browserslist": "^4.24.4",
"caniuse-lite": "^1.0.30001702",
"fraction.js": "^4.3.7",
"normalize-range": "^0.1.2",
"picocolors": "^1.1.1",
"postcss-value-parser": "^4.2.0"
}
},
"available-typed-arrays": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
@ -6288,14 +6463,14 @@
}
},
"browserslist": {
"version": "4.24.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
"integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
"version": "4.24.4",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
"integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
"dev": true,
"requires": {
"caniuse-lite": "^1.0.30001669",
"electron-to-chromium": "^1.5.41",
"node-releases": "^2.0.18",
"caniuse-lite": "^1.0.30001688",
"electron-to-chromium": "^1.5.73",
"node-releases": "^2.0.19",
"update-browserslist-db": "^1.1.1"
}
},
@ -6318,9 +6493,9 @@
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
},
"caniuse-lite": {
"version": "1.0.30001686",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001686.tgz",
"integrity": "sha512-Y7deg0Aergpa24M3qLC5xjNklnKnhsmSyR/V89dLZ1n0ucJIFNs7PgR2Yfa/Zf6W79SbBicgtGxZr2juHkEUIA==",
"version": "1.0.30001707",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz",
"integrity": "sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==",
"dev": true
},
"chalk": {
@ -6333,6 +6508,14 @@
"supports-color": "^7.1.0"
}
},
"class-variance-authority": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz",
"integrity": "sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==",
"requires": {
"clsx": "^2.1.1"
}
},
"classnames": {
"version": "2.5.1",
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
@ -6512,9 +6695,9 @@
}
},
"electron-to-chromium": {
"version": "1.5.68",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.68.tgz",
"integrity": "sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ==",
"version": "1.5.128",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz",
"integrity": "sha512-bo1A4HH/NS522Ws0QNFIzyPcyUUNV/yyy70Ho1xqfGYzPUme2F/xr4tlEOuM6/A538U1vDA7a4XfCd1CKRegKQ==",
"dev": true
},
"error-ex": {
@ -6906,6 +7089,12 @@
"is-callable": "^1.1.3"
}
},
"fraction.js": {
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
"integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
"dev": true
},
"fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@ -7542,6 +7731,12 @@
"yallist": "^3.0.2"
}
},
"lucide-react": {
"version": "0.484.0",
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.484.0.tgz",
"integrity": "sha512-oZy8coK9kZzvqhSgfbGkPtTgyjpBvs3ukLgDPv14dSOZtBtboryWF5o8i3qen7QbGg7JhiJBz5mK1p8YoMZTLQ==",
"requires": {}
},
"minimatch": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@ -7569,9 +7764,15 @@
"dev": true
},
"node-releases": {
"version": "2.0.18",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
"integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
"version": "2.0.19",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
"integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
"dev": true
},
"normalize-range": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
"integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
"dev": true
},
"object-assign": {
@ -7722,16 +7923,22 @@
"dev": true
},
"postcss": {
"version": "8.4.49",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
"integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
"version": "8.5.3",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz",
"integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==",
"dev": true,
"requires": {
"nanoid": "^3.3.7",
"nanoid": "^3.3.8",
"picocolors": "^1.1.1",
"source-map-js": "^1.2.1"
}
},
"postcss-value-parser": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
"prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@ -7823,9 +8030,9 @@
"dev": true
},
"react-router": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-7.0.2.tgz",
"integrity": "sha512-m5AcPfTRUcjwmhBzOJGEl6Y7+Crqyju0+TgTQxoS4SO+BkWbhOrcfZNq6wSWdl2BBbJbsAoBUb8ZacOFT+/JlA==",
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/react-router/-/react-router-7.4.0.tgz",
"integrity": "sha512-Y2g5ObjkvX3VFeVt+0CIPuYd9PpgqCslG7ASSIdN73LwA1nNWzcMLaoMRJfP3prZFI92svxFwbn7XkLJ+UPQ6A==",
"requires": {
"@types/cookie": "^0.6.0",
"cookie": "^1.0.1",
@ -7834,11 +8041,11 @@
}
},
"react-router-dom": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.0.2.tgz",
"integrity": "sha512-VJOQ+CDWFDGaWdrG12Nl+d7yHtLaurNgAQZVgaIy7/Xd+DojgmYLosFfZdGz1wpxmjJIAkAMVTKWcvkx1oggAw==",
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.4.0.tgz",
"integrity": "sha512-VlksBPf3n2bijPvnA7nkTsXxMAKOj+bWp4R9c3i+bnwlSOFAGOkJkKhzy/OsRkWaBMICqcAl1JDzh9ZSOze9CA==",
"requires": {
"react-router": "7.0.2"
"react-router": "7.4.0"
}
},
"react-transition-group": {
@ -8135,6 +8342,17 @@
"integrity": "sha512-ha12Kq1FX76zE1BbDOlhcIqn4Ob+48F8qnxZu/nfhXsn5E33NrvPfgRLmHaiTiHbgqEDkzyPyo+MupUA/ahtiw==",
"requires": {}
},
"tailwind-merge": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.0.2.tgz",
"integrity": "sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw=="
},
"tailwindcss": {
"version": "4.0.17",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.0.17.tgz",
"integrity": "sha512-OErSiGzRa6rLiOvaipsDZvLMSpsBZ4ysB4f0VKGXUrjw2jfkJRd6kjRKV2+ZmTCNvwtvgdDam5D7w6WXsdLJZw==",
"dev": true
},
"tiny-warning": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz",
@ -8150,6 +8368,11 @@
"resolved": "https://registry.npmjs.org/turbo-stream/-/turbo-stream-2.4.0.tgz",
"integrity": "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g=="
},
"tw-animate-css": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.2.5.tgz",
"integrity": "sha512-ABzjfgVo+fDbhRREGL4KQZUqqdPgvc5zVrLyeW9/6mVqvaDepXc7EvedA+pYmMnIOsUAQMwcWzNvom26J2qYvQ=="
},
"type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",

View File

@ -15,24 +15,33 @@
"@mui/icons-material": "^6.1.10",
"@mui/material": "^6.1.10",
"@mui/styles": "^6.1.10",
"@radix-ui/react-slot": "^1.1.2",
"bootstrap": "^5.3.3",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"lucide-react": "^0.484.0",
"react": "^18.3.1",
"react-bootstrap": "^2.10.7",
"react-dom": "^18.3.1",
"react-icons": "^5.5.0",
"react-router-dom": "^7.0.2",
"survey-react-ui": "^1.12.13"
"react-router-dom": "^7.4.0",
"survey-react-ui": "^1.12.13",
"tailwind-merge": "^3.0.2",
"tw-animate-css": "^1.2.5"
},
"devDependencies": {
"@eslint/js": "^9.15.0",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
"@vitejs/plugin-react": "^4.3.4",
"autoprefixer": "^10.4.21",
"eslint": "^9.15.0",
"eslint-plugin-react": "^7.37.2",
"eslint-plugin-react-hooks": "^5.0.0",
"eslint-plugin-react-refresh": "^0.4.14",
"globals": "^15.12.0",
"postcss": "^8.5.3",
"tailwindcss": "^4.0.17",
"vite": "^6.0.1"
}
}

View File

@ -1,28 +1,29 @@
import React from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';
import Navbar from './Components/Navbar';
import Pay from './Components/Register';
import Contact from './Components/Contact';
import Donor from './Components/Donor';
import Footer from './Components/Footer';
import FormBuilder from './Components/FormBuilder';
import AboutUs from './Components/AboutUs';
import './App.css';
import Home from './Components/Home';
import 'bootstrap/dist/css/bootstrap.min.css';
import Supporter from './Components/Supporter';
import FundDrive from './Components/FundDrive';
function App() {
return (
<Router>
<Navbar />
<Routes>
<Route path="/" element={<Home />} />
<Route path="/register" element={<Pay />} />
<Route path="/home" element={<Home />} />
<Route path="/aboutUs" element={<AboutUs />} />
<Route path="/form" element={<FormBuilder />} />
<Route path="/contact" element={<Contact />} />
<Route path="/donor" element={<Donor />} />
<Route path="/supporter" element={<Supporter />} />
<Route path="/FundDrive" element={<FundDrive />} />
</Routes>
</Router>
);

View File

@ -1,13 +1,22 @@
.carousel {
position: relative;
width: 100%;
margin: 0 auto;
overflow: hidden;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
padding: 20px 0px;
max-height: 600px;
position: relative;
}
position: relative;
width: 100%;
margin: 0 auto;
overflow: hidden;
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2);
max-height: 600px;
padding: 0; /* Remove padding */
}
.carousel-image {
width: 100%;
height: 600px; /* Ensures full height */
object-fit: cover; /* Covers the container without distortion */
display: block; /* Removes any inline spacing */
margin: 0; /* Removes any margins */
padding: 0; /* Ensures no extra spacing */
}
.carousel .carousel-slider{
@ -19,13 +28,6 @@
overflow: hidden;
}
.carousel-image {
width: 90%;
height: auto;
transition: opacity 1s ease-in-out;
}
.carousel-indicators {
position: absolute;
bottom: 10px;

View File

@ -17,7 +17,8 @@ const Carousel = ({ images }) => {
<img
src={images[currentIndex]}
alt={`Slide ${currentIndex + 1}`}
className="carousel-image"
className="carousel-image"
/>
<div className="carousel-indicators">
{images.map((_, index) => (

View File

@ -9,7 +9,7 @@ const Contact = () => {
Email: <a href="mailto:VETRIVEL.EDUCATION.TRUST@gmail.com">VETRIVEL.EDUCATION.TRUST@gmail.com</a>
</p>
<p>
<FaPhone /> <a href="tel:+917604883357">+91 7604883357</a>
<FaPhone /> <a href="tel:+917604883357">+91 9632828337</a>
</p>
<p>
<FaLinkedin /> <a href="https://www.linkedin.com/in/vallies/" target="_blank" rel="noopener noreferrer">Valli's LinkedIn</a>

View File

@ -1,50 +0,0 @@
.donar-form {
width: 50%;
margin: 0 auto;
padding: 20px;
background-color: #f9f9f9;
border-radius: 8px;
box-shadow: 0 0 10px rgb(241, 235, 235);
}
.donar-form h2 {
text-align: center;
margin-bottom: 20px;
}
form {
display: flex;
flex-direction: column;
}
.form-group {
margin-bottom: 15px;
}
label {
font-weight: bold;
margin-bottom: 5px;
display: block;
}
input {
width: 100%;
padding: 10px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 16px;
}
button {
padding: 10px;
border: none;
background-color: #4CAF50;
color: white;
font-size: 16px;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #45a049;
}

View File

@ -1,51 +0,0 @@
import React from 'react';
import './Donar.css';
const Donar = () => {
return (
<div className="donar-form">
<h2>Donar Details</h2>
<form>
<div className="form-group">
<label htmlFor="aadharFront">Upload Aadhaar Front:</label>
<input type="file" id="aadharFront" name="aadharFront" accept="image/*" required />
</div>
<div className="form-group">
<label htmlFor="aadharBack">Upload Aadhaar Back:</label>
<input type="file" id="aadharBack" name="aadharBack" accept="image/*" required />
</div>
<div className="form-group">
<label htmlFor="medicalDoc1">Upload Medical Document 1:</label>
<input type="file" id="medicalDoc1" name="medicalDoc1" accept="image/*" required />
</div>
<div className="form-group">
<label htmlFor="medicalDoc2">Upload Medical Document 2:</label>
<input type="file" id="medicalDoc2" name="medicalDoc2" accept="image/*" />
</div>
<div className="form-group">
<label htmlFor="medicalDoc3">Upload Medical Document 3:</label>
<input type="file" id="medicalDoc3" name="medicalDoc3" accept="image/*" />
</div>
<div className="form-group">
<label htmlFor="medicalDoc4">Upload Medical Document 4:</label>
<input type="file" id="medicalDoc4" name="medicalDoc4" accept="image/*" />
</div>
<button type="submit">Submit</button>
</form>
</div>
);
};
export default Donar;

View File

@ -1,111 +0,0 @@
import React, { useState } from 'react';
import './Donar.css';
const Donor = () => {
const [submitted, setSubmitted] = useState(false);
const [images, setImages] = useState({
aadharFront: null,
aadharBack: null,
medicalDoc1: null,
medicalDoc2: null,
medicalDoc3: null,
medicalDoc4: null,
});
const handleSubmit = (event) => {
event.preventDefault();
setSubmitted(true);
};
const handleImageChange = (event) => {
const { name } = event.target;
const file = event.target.files[0];
if (file) {
const reader = new FileReader();
reader.onload = (e) => {
setImages((prevImages) => ({
...prevImages,
[name]: e.target.result,
}));
};
reader.readAsDataURL(file);
}
};
return (
<div className="donar-form" style={{ textAlign: "center", maxWidth: "600px", margin: "auto" }}>
{!submitted ? (
<form onSubmit={handleSubmit}>
<div className="form-group">
<label htmlFor="name">Full Name:</label>
<input type="text" id="name" name="name" placeholder="Enter your full name" required />
</div>
<div className="form-group">
<label htmlFor="phone">Phone Number:</label>
<input type="tel" id="phone" name="phone" placeholder="Enter your phone number" required />
</div>
<div className="form-group">
<label htmlFor="email">Email:</label>
<input type="email" id="email" name="email" placeholder="Enter your email" required />
</div>
<div className="form-group">
<label htmlFor="dob">Date of Birth:</label>
<input type="date" id="dob" name="dob" required />
</div>
<div className="form-group">
<label htmlFor="age">Age:</label>
<input type="number" id="age" name="age" placeholder="Enter your age" required />
</div>
<button type="submit" style={{ fontSize: "14px", padding: "8px 15px", marginTop: "10px" }}>
Submit Details
</button>
</form>
) : (
<div>
<h2>Upload Documents</h2>
<form>
{["aadharFront", "aadharBack", "medicalDoc1", "medicalDoc2", "medicalDoc3", "medicalDoc4"].map((doc) => (
<div key={doc} className="form-group" style={{ textAlign: "center" }}>
<label htmlFor={doc}>
{doc.replace(/([A-Z])/g, " $1").replace(/^./, (str) => str.toUpperCase())}:
</label>
<input
type="file"
id={doc}
name={doc}
accept="image/*"
onChange={handleImageChange}
required={doc === "aadharFront" || doc === "aadharBack" || doc === "medicalDoc1"}
style={{ display: "block", margin: "10px auto", width: "250px" }}
/>
{images[doc] && (
<img
src={images[doc]}
alt="Preview"
style={{ marginTop: "10px", width: "100px", height: "100px", objectFit: "cover", borderRadius: "10px" }}
/>
)}
</div>
))}
<button type="submit" style={{ fontSize: "14px", padding: "8px 15px", marginTop: "10px" }}>
Submit Documents
</button>
</form>
</div>
)}
</div>
);
};
export default Donor;

View File

@ -0,0 +1,205 @@
/* Centering the form container */
.form-container {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background: linear-gradient(135deg, #f3f4f6, #e0e0e0);
display: flex;
justify-content: center;
align-items: center;
padding: 20px;
box-sizing: border-box;
overflow: auto;
}
/* Styling for labels */
label {
font-size: 20px; /* Increased label font size */
font-weight: bold;
}
/* Container for each radio button */
.radio-box {
display: flex;
align-items: center;
justify-content: flex-start;
width: 380px; /* Reduced width */
height: 35px; /* Smaller height */
padding: 6px;
border: 1.5px solid #ccc;
border-radius: auto;
border: none;
box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2);
background-color: #f9f9f9;
transition: 0.3s ease-in-out;
font-size: 14px; /* Increased font size */
}
.radio-box:hover {
background-color: #e0e0e0;
}
.radio-label {
font-size: 14px; /* Reduce label font size */
}
/* Bigger radio buttons */
.radio-input {
width: 14px;
height: 14px;
margin-right: 6px;
cursor: pointer;
}
/* Buttons container */
.button-group {
display: flex;
justify-content: center;
gap: 10px;
margin-top: 10px;
}
/* Bigger buttons for Next, Back, and Submit */
.form-button {
padding: 8px 20px;
font-size: 18px; /* Increased font size */
font-weight: bold;
background-color: #2563eb;
color: white;
border: none;
border-radius: auto;
cursor: pointer;
transition: background 0.3s ease-in-out;
width: 150px;
text-align: center;
}
.form-button:hover {
background-color: #1e40af;
}
.form-button:disabled {
background-color: #a1a1aa;
cursor: not-allowed;
}
/* Upload section adjustments */
.upload-section {
text-align: center;
}
.upload-title {
font-size: 20px; /* Increased font size */
margin-bottom: 8px;
}
.file-input {
margin: 8px 0;
font-size: 18px; /* Increased font size */
}
/* Image preview styling */
.image-preview {
display: flex;
flex-wrap: wrap;
gap: 8px;
justify-content: center;
margin-top: 8px;
}
.uploaded-image {
width: 70px;
height: 70px;
object-fit: cover;
border-radius: 5px;
border: 1px solid #ddd;
}
.upload-box {
border: 2px dashed #ccc;
padding: 20px;
text-align: center;
width: 100%;
max-width: 400px;
margin: 10px auto;
background-color: #f9f9f9;
cursor: pointer;
font-size: 18px; /* Increased font size */
}
.upload-box:hover {
border-color: #007bff;
}
.upload-placeholder {
color: #888;
font-size: 18px; /* Increased font size */
}
/* Grey color for Next and Back buttons */
.form-button.next-button,
.form-button.back-button {
background-color: #4b5563;
width: 100px;
height: 35px;
font-size: 18px; /* Increased font size */
}
.form-button.next-button:hover,
.form-button.back-button:hover {
background-color: #4b5563; /* Darker Grey on hover */
}
/* Blue color for Submit button */
.form-button.submit-button {
background-color: #2563eb; /* Blue */
width: 100px;
height: 35px;
font-size: 18px; /* Increased font size */
}
.form-button.submit-button:hover {
background-color: #1e40af; /* Darker Blue on hover */
}
/* Input Fields */
.input-small {
font-size: 14px;
margin-top: 5px;
background-color: #f5f5f5;
border: 1px solid #ccc;
border-radius: 5px;
border: none;
box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.1);
transition: all 0.2s ease-in-out;
width: 380px; /* Reduced width */
height: 30px; /* Smaller height */
padding: 8px;
}
.container-box{
border: 3px solid #eeeeee;
padding: 20px;
margin: 15px auto 0 auto;
width: 33%;
background-color: #eeeeee; /* Lighter Grey Background */
border-radius: 10px;
color: black;
}
.center-wrapper {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background-color: #ffffff; /* or any background you like */
}

View File

@ -0,0 +1,218 @@
import React, { useState } from "react";
import "./FundDrive.css";
const FundDrive = () => {
const [step, setStep] = useState(1);
const [formData, setFormData] = useState({
name: "",
email: "",
phone: "",
age: "",
dob: "",
category: "",
customCategory: "",
images: []
});
const categories = [
"Medical Fundraising",
"Education & Scholarships",
"Disaster Relief & Aid",
"Memorial & Tribute Funds",
"Community Development",
"Social Causes",
"Religious & Faith-Based Giving",
"Crowdfunding for Needs",
"Nonprofit & NGO Fundraising",
"Others",
];
const handleInputChange = (e) => {
setFormData({ ...formData, [e.target.name]: e.target.value });
};
const handleImageUpload = (event) => {
const files = Array.from(event.target.files);
setFormData({ ...formData, images: [...formData.images, ...files] });
};
const handleNext = () => {
setStep(step + 1);
};
const handleBack = () => {
if (step > 1) setStep(step - 1);
};
const handleSubmit = () => {
alert("Fundraising submission successful!");
};
return (
<div className="container">
<div className="container-box">
<form>
{step === 1 && (
<div className="step-box">
<h4>Step 1:Personal Details</h4>
<label>Name:</label>
<input
type="text"
name="name"
value={formData.name}
onChange={handleInputChange}
required
className="input-small"
placeholder="Enter your name"
/>
<label>Email:</label>
<input
type="email"
name="email"
value={formData.email}
onChange={handleInputChange}
required
className="input-small"
placeholder="Enter your email"
/>
<label>Phone Number:</label>
<input
type="tel"
name="phone"
value={formData.phone}
onChange={handleInputChange}
required
className="input-small"
placeholder="Enter phone number"
/>
<label>Age:</label>
<input
type="number"
name="age"
value={formData.age}
onChange={handleInputChange}
required
className="input-small"
placeholder="Enter your age"
/>
<label>Date of Birth:</label>
<input
type="date"
name="dob"
value={formData.dob}
onChange={handleInputChange}
required
className="input-small"
/>
<br /><br />
<button
type="button"
onClick={handleNext}
className="form-button next-button"
disabled={!formData.name || !formData.email || !formData.phone || !formData.age || !formData.dob}
>
Next
</button>
</div>
)}
{step === 2 && (
<div className="form-container-box">
<h4>Step 2:Select a category</h4>
{categories.map((item, index) => (
<div key={index} className="radio-box">
<input
type="radio"
name="category"
value={item}
checked={formData.category === item}
onChange={handleInputChange}
className="radio-input"
/>
<label className="radio-label">{item}</label>
</div>
))}
{formData.category === "Others" && (
<input
type="text"
name="customCategory"
placeholder="Fill the category"
value={formData.customCategory}
onChange={handleInputChange}
className="custom-category-input"
/>
)}
<div className="button-group">
<button type="button" className="form-button back-button" onClick={handleBack}>Back</button>
<button
type="button"
className="form-button next-button"
onClick={handleNext}
disabled={!formData.category || (formData.category === "Others" && !formData.customCategory.trim())}
>
Next
</button>
</div>
</div>
)}
{step === 3 && (
<div className="upload-section-box">
<h4>Step 3:Upload an Image</h4>
<h3 className="upload-title">{formData.category === "Others" ? formData.customCategory : formData.category}</h3>
<div className="upload-box">
<input
type="file"
multiple
accept="image/*"
onChange={handleImageUpload}
className="file-input"
/>
<p className="upload-placeholder">Click or Drag & Drop to upload images</p>
</div>
<div className="image-preview">
{formData.images.map((image, index) => (
<img key={index} src={URL.createObjectURL(image)} alt={`Proof ${index + 1}`} className="uploaded-image" />
))}
</div>
<div className="button-group">
<button type="button" className="form-button back-button" onClick={handleBack}>Back</button>
<button type="button" className="form-button submit-button" onClick={handleSubmit} disabled={formData.images.length === 0}>Submit</button>
</div>
</div>
)}
</form>
</div>
</div>
);
};
export default FundDrive;

View File

@ -1,37 +0,0 @@
import React from "react";
const FundRaised = () => {
return (
<form>
<div className="form-group">
<label htmlFor="fundName">Fundraiser Name:</label>
<input type="text" id="fundName" name="fundName" placeholder="Enter fundraiser name" required />
</div>
<div className="form-group">
<label htmlFor="fundAmount">Required Amount:</label>
<input type="number" id="fundAmount" name="fundAmount" placeholder="Enter required amount" required />
</div>
<div className="form-group">
<label htmlFor="fundPurpose">Purpose of Fundraising:</label>
<textarea id="fundPurpose" name="fundPurpose" placeholder="Describe the purpose" required></textarea>
</div>
<div className="form-group">
<label htmlFor="supportingDoc1">Upload Supporting Document 1:</label>
<input type="file" id="supportingDoc1" name="supportingDoc1" accept="image/*,application/pdf" required />
</div>
<div className="form-group">
<label htmlFor="supportingDoc2">Upload Supporting Document 2 (Optional):</label>
<input type="file" id="supportingDoc2" name="supportingDoc2" accept="image/*,application/pdf" />
</div>
<button type="submit" style={{ fontSize: "12px", padding: "5px 10px" }}>Submit</button>
</form>
);
};
export default FundRaised;

View File

@ -7,14 +7,16 @@
color: #fff;
width: 100%;
position: sticky;
padding: 20px !important;
top: 0;
z-index: 1000;
padding: 15px 20px;
}
.navbar .logo {
width: 80px;
height: auto;
border-radius: 35%;
padding: 20px;
padding: 10px;
}
.navbar .brand {
@ -22,16 +24,15 @@
font-weight: bold;
cursor: pointer;
display: flex;
justify-content: start;
align-items: center;
}
.navbar .brand-section {
display: flex;
flex-direction: column;
justify-content: start;
align-items: start;
line-height: 15px;
align-items: flex-start;
line-height: 1.2;
margin-left: 10px;
}
.navbar .college-name {
@ -40,70 +41,102 @@
.navbar p {
font-size: 15px;
margin: 0;
}
/* Links Container */
.navbar .links {
display: flex;
align-items: center;
padding: 5px 20px;
}
/* Default Navbar Links */
.navbar .links a {
margin: 0 10px;
text-decoration: none;
color: #fff;
font-size: 18px;
transition: all 0.3s ease-in-out;
}
.navbar .links {
padding: 5px 20px;
/* Fundraising Button */
.navbar .links .fundraising-link {
background-color: #28a745; /* Green background */
color: white !important;
padding: 8px 15px;
border-radius: 8px;
font-weight: bold;
border: 2px solid transparent;
transition: background-color 0.3s ease-in-out, color 0.3s ease-in-out;
}
.navbar .links a:hover {
color: #28a745;
.navbar .links .fundraising-link:hover {
background-color: white;
color: #28a745 !important;
border: 2px solid #28a745;
}
/* Navbar Header */
.navbar-header {
background-color: rgba(245, 146, 38, 1);
height: 30px;
width: 100%;
}
/* Add hamburger menu for small screens */
/* Hamburger menu for small screens */
.hamburger {
display: none;
font-size: 30px;
cursor: pointer;
background: none;
border: none;
color: #fff;
padding: 10px;
}
.navbar p{
margin: 0;
}
/* For screens smaller than 450px */
/* Mobile Responsiveness */
@media (max-width: 900px) {
.navbar .links {
display: none; /* Hide the links by default */
display: flex;
flex-direction: column;
position: absolute;
top: 60px; /* Adjust the position */
right: 0;
position: fixed;
top: 0;
right: -100%;
width: 60%;
height: 100vh;
background-color: #343a40;
width: 100%;
padding: 10px 0;
padding-top: 60px;
transition: right 0.3s ease-in-out;
}
.navbar .links.open {
display: flex; /* Show links when the menu is open */
z-index: 10;
position: absolute;
top:100px;
transition: 2s linear ease-in-out;
}
/* Show the hamburger menu on small screens */
.hamburger {
display: block; /* Show hamburger */
color: #fff;
right: 0;
}
.navbar .links a {
padding: 10px 20px;
padding: 15px 20px;
text-align: center;
display: block;
width: 100%;
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
}
.navbar .links .fundraising-link {
display: inline-block;
text-align: center;
margin-top: 10px;
}
.hamburger {
display: block;
}
/* Prevent scrolling when menu is open */
body.menu-open {
overflow: hidden;
}
}

View File

@ -2,14 +2,14 @@ import React, { useState } from "react";
import { Link, useNavigate } from "react-router-dom";
import "./Navbar.css";
const Navbar = () => {
function Navbar() {
const [menuOpen, setMenuOpen] = useState(false); // State to handle the hamburger menu toggle
const navigate = useNavigate();
// Toggle menu visibility
const toggleMenu = () => {
function toggleMenu() {
setMenuOpen(!menuOpen);
};
}
return (
<nav className="navbar-container">
@ -29,24 +29,27 @@ const Navbar = () => {
</div>
{/* Hamburger icon */}
<div className="hamburger" onClick={toggleMenu}>
<button className="hamburger" onClick={toggleMenu} aria-label="Toggle menu">
&#9776;
</div>
</button>
{/* Links */}
<div className={`links ${menuOpen ? "open" : ""}`}>
<Link to="/">Home</Link>
<Link to="/home">Home</Link>
<Link to="/aboutUs">About Us</Link>
<Link to="/register">Register</Link>
<Link to="/contact">Contact</Link>
<Link to="/donor">Donor</Link>
<Link to="/fundraised">FundRaised</Link>
<Link to="/FundDrive">Projects</Link>
<Link to="/supporter">Donor</Link>
</div>
</div>
</nav>
);
};
}
export default Navbar;

View File

@ -1,154 +0,0 @@
import React, { useState } from "react";
import { TextField, Button, Container, Typography, Grid } from "@mui/material";
const Register = () => {
const [step, setStep] = useState(1); // Track the form step (1 for basic info, 2 for donation)
const [userInfo, setUserInfo] = useState({
name: "",
email: "",
phone: "",
donationAmount: "",
});
// Handle changes in input fields
const handleChange = (e) => {
const { name, value } = e.target;
setUserInfo({
...userInfo,
[name]: value,
});
};
const sendOTPviaEmail = () => {
const payload = {
userInfo, // Ensure `userInfo` is defined and contains valid data
};
fetch(`http://localhost:3333/api/v1/sendOTPviaEmail`, { // Correctly points to the backend route
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(payload), // Payload is properly serialized
})
.then((response) => {
console.log("response ==== ", response);
if(response.ok && response.status == 200){
setStep(2)
}
})
.catch((error) => {
console.log("error ===== ", error);
});
};
const handleSubmit = (e) => {
e.preventDefault();
if (step === 1) {
sendOTPviaEmail();
} else {
console.log("Form Data Submitted:", userInfo);
}
};
return (
<Container maxWidth="sm" sx={{ paddingTop: 5 }}>
<Typography variant="h4" gutterBottom>
Register and Donate
</Typography>
<Typography variant="body1" paragraph>
Support our cause by donating. Your contributions help us make education
accessible to all.
</Typography>
<form onSubmit={handleSubmit}>
{step === 1 ? (
<>
<Typography variant="h6" gutterBottom>
Step 1: Basic Information
</Typography>
<Grid container spacing={2}>
<Grid item xs={12}>
<TextField
fullWidth
label="Name"
name="name"
value={userInfo.name}
onChange={handleChange}
required
/>
</Grid>
<Grid item xs={12}>
<TextField
fullWidth
label="Email"
type="email"
name="email"
value={userInfo.email}
onChange={handleChange}
required
/>
</Grid>
<Grid item xs={12}>
<TextField
fullWidth
label="Phone Number"
type="tel"
name="phone"
value={userInfo.phone}
onChange={handleChange}
required
/>
</Grid>
<Grid item xs={12}>
<Button
type="submit"
variant="contained"
color="primary"
fullWidth
>
Next Step
</Button>
</Grid>
</Grid>
</>
) : (
<>
<Typography variant="h6" gutterBottom>
Step 2: Donation Information
</Typography>
<Grid container spacing={2}>
<Grid item xs={12}>
<TextField
fullWidth
label="Donation Amount"
type="number"
name="donationAmount"
value={userInfo.donationAmount}
onChange={handleChange}
required
/>
</Grid>
<Grid item xs={12}>
<Button
type="submit"
variant="contained"
color="primary"
fullWidth
>
Donate Now
</Button>
</Grid>
</Grid>
</>
)}
</form>
</Container>
);
};
export default Register;

View File

@ -0,0 +1,212 @@
/* Overall Supporter Container */
.supporter-container {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
}
/* Styling for labels */
label {
font-size: 20px; /* Increased label font size */
font-weight: bold;
}
h3 {
text-align: center;
margin-bottom: 15px;
color: #333;
}
label {
display: block;
font-size: 14px;
font-weight: bold;
margin-top: 10px;
color: #555;
}
/* Input Fields */
.input-small {
font-size: 14px;
margin-top: 5px;
background-color: #f5f5f5;
border: 1px solid #ccc;
border-radius: 5px;
border: none;
box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.1);
transition: all 0.2s ease-in-out;
width: 380px; /* Reduced width */
height: 30px; /* Smaller height */
padding: 8px;
}
.input-small:focus {
background-color: #ffffff;
border-color: #2563eb;
outline: none;
}
/* File Input */
input[type="file"] {
padding: 5px;
background-color: #fff;
border-radius: 5px;
border: 1px solid #ccc;
font-size: 14px;
}
input[type="file"]:hover {
cursor: pointer;
}
/* Button Container */
.button-group {
display: flex;
justify-content: center;
gap: 10px;
margin-top: 15px;
}
/* Button Styling */
.form-button {
padding: 10px 20px;
font-size: 14px;
font-weight: bold;
background-color: #2563eb; /* Default to blue */
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
transition: background 0.3s ease-in-out;
width: 150px;
text-align: center;
}
.form-button:hover {
background-color: #1e40af;
}
.form-button:disabled {
background-color: #a1a1aa;
cursor: not-allowed;
}
/* Image Preview */
.preview-image {
width: 100%;
max-height: 200px;
object-fit: contain;
margin-top: 10px;
border-radius: 5px;
border: 1px solid #ddd;
}
/* Responsive Design */
@media (max-width: 500px) {
.supporter-container {
max-width: 100%;
padding: 15px;
}
.form-button {
width: 100%;
}
}
/* Dark Grey color for Next and Back buttons */
.form-button.next-button{
background-color: #4b5563; /* Dark grey */
width: 100px;
height: 35px;
}
.form-button.back-button {
background-color: #4b5563; /* Dark grey */
width: 100px;
height: 35px;
}
form-button.next-button:hover{
background-color: #374151; /* Darker grey on hover */
}
.form-button.back-button:hover {
background-color: #374151; /* Darker grey on hover */
}
/* Blue color for Submit button */
.form-button.submit-button {
background-color: #2563eb; /* Blue */
width: 100px;
height: 35px;
}
.form-button.submit-button:hover {
background-color: #1e40af; /* Darker blue on hover */
}
/* Highlight the required fields if they are not filled */
input:invalid, select:invalid, input[type="file"]:invalid {
border-color: #ccc; /* Default border for invalid fields (no color change) */
background-color: #f5f5f5; /* Keep the default background for invalid fields */
}
input:valid, select:valid, input[type="file"]:valid {
border-color: #ccc; /* Default border for valid fields (no color change) */
background-color: #f5f5f5; /* Keep the default background for valid fields */
}
/* Add a "required" text next to input fields to indicate they are mandatory */
label::after {
content: "*";
color: red;
padding-left: 5px;
}
.form-button.upi-button
{
background-color: #008712; /* Blue */
width: 200px;
height: 35px;
}
.form-button.upi-button:hover {
background-color: #008712; /* Darker blue on hover */
}
.form-button.net-banking-button
{
background-color: #008712; /* Blue */
width: 215px;
height: 35px;
}
.form-button.net-banking-button:hover{
background-color:#008712; /* Darker blue on hover */
} ;
.step-box {
border: 3px solid #eeeeee;
padding: 25px;
margin: 20px auto;
width: 80%;
background-color: #eeeeee; /* Lighter Grey Background */
border-radius: 10px;
color: black; /* Adjusted text color for better contrast */
}
.step1-box, .step2-box, .step3-box, .step4-box {
border: 3px solid #eeeeee;
padding: 20px;
margin: 15px 0;
background-color: #eeeeee; /* Even Lighter Grey Background */
border-radius: 8px;
color: black;
}

View File

@ -0,0 +1,354 @@
import React, { useState } from "react";
import "./Supporter.css";
const Supporter = () => {
const [step, setStep] = useState(1);
const [isSubmitting, setIsSubmitting] = useState(false);
const [formData, setFormData] = useState({
name: "",
email: "",
phone: "",
age: "",
dob: "",
aadharFront: null,
aadharBack: null,
paymentMethod: "",
paymentScreenshot: null,
});
const [showPaymentScreenshot, setShowPaymentScreenshot] = useState(false);
const handleChange = (e) => {
const { name, value, files } = e.target;
setFormData((prev) => ({
...prev,
[name]: files ? files[0] : value,
}));
};
const nextStep = () => {
if (isValid()) setStep((prev) => prev + 1);
};
const prevStep = () => setStep((prev) => prev - 1);
const isValid = () => {
if (step === 1) {
return formData.name && formData.email && formData.phone && formData.age && formData.dob;
}
if (step === 2) {
return formData.aadharFront && formData.aadharBack;
}
if (step === 3) {
return formData.paymentMethod;
}
if (step === 4 && formData.paymentMethod === "UPI") {
return formData.paymentScreenshot;
}
return true;
};
const handleSubmit = async (e) => {
e.preventDefault();
setIsSubmitting(true);
try {
console.log("Submitting Form Data:", formData);
setTimeout(() => {
alert("Form Submitted Successfully!");
setIsSubmitting(false);
setFormData({
name: "",
email: "",
phone: "",
age: "",
dob: "",
aadharFront: null,
aadharBack: null,
paymentMethod: "",
paymentScreenshot: null,
});
}, 2000);
} catch (error) {
console.error("Submission Error:", error);
alert("Something went wrong. Please try again.");
setIsSubmitting(false);
}
};
const handleUPIPayment = () => {
const upiUrl =
"upi://pay?pa=157511100001246@UBIN0815756.ifsc.npci&pn=Ashoka%20Windows%20and%20Annex%20Apartment%20Owners%20Association&cu=INR&am=50&tn=113%20Dec%202021%20fine&tr=202112113fine&refUrl=https%3A%2F%2Fwww.ashokawindows.com";
// Open the UPI payment app
window.location.href = upiUrl;
// Immediately show the upload screenshot field after clicking Pay via UPI
setShowPaymentScreenshot(true);
};
const handleNetBankingPayment = () => {
// Placeholder for actual Net Banking redirection or API call
alert("Redirecting to Net Banking Payment Gateway...");
};
return (
<div className="supporter-container">
<div className="step-box">
<form onSubmit={handleSubmit}>
{step === 1 && (
<div className="step1-box">
<h4>Step 1:Personal Details</h4>
<label>Name:</label>
<input
type="text"
name="name"
value={formData.name}
onChange={handleChange}
required
className="input-small"
placeholder="Enter your name"
/>
<label>Email:</label>
<input
type="email"
name="email"
value={formData.email}
onChange={handleChange}
required
className="input-small"
placeholder="Enter your email"
/>
<label>Phone Number:</label>
<input
type="tel"
name="phone"
value={formData.phone}
onChange={handleChange}
required
className="input-small"
placeholder="Enter phone number"
/>
<label>Age:</label>
<input
type="number"
name="age"
value={formData.age}
onChange={handleChange}
required
className="input-small"
placeholder="Enter your age"
/>
<label>Date of Birth:</label>
<input
type="date"
name="dob"
value={formData.dob}
onChange={handleChange}
required
className="input-small"
/>
<br />
<br />
<button
type="button"
onClick={nextStep}
disabled={!isValid()}
className="form-button next-button"
>
Next
</button>
</div>
)}
{step === 2 && (
<div className="step2-box">
<h4>Step 2:Upload a Images</h4>
<label>Aadhar Card Front:</label>
<input
type="file"
name="aadharFront"
onChange={handleChange}
required
className="input-small"
/>
<label>Aadhar Card Back:</label>
<input
type="file"
name="aadharBack"
onChange={handleChange}
required
className="input-small"
/>
<br />
<br />
<button
type="button"
onClick={prevStep}
className="form-button back-button"
>
Back
</button>
<div style={{ marginTop: "10px" }}>
<button
type="button"
onClick={nextStep}
disabled={!isValid()}
className="form-button next-button"
>
Next
</button>
</div>
</div>
)}
{step === 3 && (
<div className="step3-box">
<h4>Step 3:Select Payment Method</h4>
<label>Payment Method:</label>
<select
name="paymentMethod"
value={formData.paymentMethod}
onChange={handleChange}
required
className="input-small"
>
<option value="UPI">Pay by any UPI App</option>
<option value="Net Banking">Net Banking</option>
</select>
<br />
<br />
<button
type="button"
onClick={prevStep}
className="form-button back-button"
>
Back
</button>
<div style={{ marginTop: "10px" }}>
<button
type="button"
onClick={nextStep}
disabled={!isValid()}
className="form-button next-button"
>
Next
</button>
</div>
</div>
)}
{step === 4 && formData.paymentMethod === "UPI" && (
<div className="step4-box">
<h4>Step 4:Pay via UPI</h4>
<br></br>
<br></br>
<button
type="button"
onClick={handleUPIPayment}
className="form-button upi-button"
>
Pay via UPI
</button>
{/* Upload screenshot field appears after Pay via UPI is clicked */}
{showPaymentScreenshot && (
<div className="payment-screenshot">
<label>Upload Payment Screenshot:</label>
<input
type="file"
name="paymentScreenshot"
onChange={handleChange}
required
className="input-small"
/>
</div>
)}
<br />
<br />
<button
type="button"
onClick={prevStep}
className="form-button back-button"
>
Back
</button>
<div style={{ marginTop: "10px" }}>
<button
type="submit"
disabled={isSubmitting || !formData.paymentScreenshot}
className="form-button submit-button"
>
{isSubmitting ? "Submitting..." : "Submit"}
</button>
</div>
</div>
)}
{step === 4 && formData.paymentMethod === "Net Banking" && (
<div className="step4-box">
<h4>Step 4:Pay via Net banking</h4>
<br></br>
<br></br>
{/* Net Banking - Redirection or Process */}
<button
type="button"
onClick={handleNetBankingPayment}
className="form-button net-banking-button"
>
Pay via Net Banking
</button>
{/* Upload screenshot field appears after Pay via Net Banking is clicked */}
{showPaymentScreenshot && (
<div className="payment-screenshot">
<label>Upload Payment Screenshot:</label>
<input
type="file"
name="paymentScreenshot"
onChange={handleChange}
required
className="input-small"
/>
</div>
)}
<br />
<br />
<button
type="button"
onClick={prevStep}
className="form-button back-button"
>
Back
</button>
<div style={{ marginTop: "10px" }}>
<button
type="submit"
disabled={isSubmitting || !formData.paymentScreenshot}
className="form-button submit-button"
>
{isSubmitting ? "Submitting..." : "Submit"}
</button>
</div>
</div>
)}
</form>
</div>
</div>
);
};
export default Supporter;

View File

@ -0,0 +1,55 @@
import * as React from "react"
import { Slot } from "@radix-ui/react-slot"
import { cva } from "class-variance-authority";
import { cn } from "@/lib/utils"
const buttonVariants = cva(
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
{
variants: {
variant: {
default:
"bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
destructive:
"bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
outline:
"border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
secondary:
"bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80",
ghost:
"hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
default: "h-9 px-4 py-2 has-[>svg]:px-3",
sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5",
lg: "h-10 rounded-md px-6 has-[>svg]:px-4",
icon: "size-9",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
)
function Button({
className,
variant,
size,
asChild = false,
...props
}) {
const Comp = asChild ? Slot : "button"
return (
<Comp
data-slot="button"
className={cn(buttonVariants({ variant, size, className }))}
{...props} />
);
}
export { Button, buttonVariants }

101
src/components/ui/card.jsx Normal file
View File

@ -0,0 +1,101 @@
import * as React from "react"
import { cn } from "@/lib/utils"
function Card({
className,
...props
}) {
return (
<div
data-slot="card"
className={cn(
"bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-sm",
className
)}
{...props} />
);
}
function CardHeader({
className,
...props
}) {
return (
<div
data-slot="card-header"
className={cn(
"@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
className
)}
{...props} />
);
}
function CardTitle({
className,
...props
}) {
return (
<div
data-slot="card-title"
className={cn("leading-none font-semibold", className)}
{...props} />
);
}
function CardDescription({
className,
...props
}) {
return (
<div
data-slot="card-description"
className={cn("text-muted-foreground text-sm", className)}
{...props} />
);
}
function CardAction({
className,
...props
}) {
return (
<div
data-slot="card-action"
className={cn(
"col-start-2 row-span-2 row-start-1 self-start justify-self-end",
className
)}
{...props} />
);
}
function CardContent({
className,
...props
}) {
return (<div data-slot="card-content" className={cn("px-6", className)} {...props} />);
}
function CardFooter({
className,
...props
}) {
return (
<div
data-slot="card-footer"
className={cn("flex items-center px-6 [.border-t]:pt-6", className)}
{...props} />
);
}
export {
Card,
CardHeader,
CardFooter,
CardTitle,
CardAction,
CardDescription,
CardContent,
}

View File

@ -0,0 +1,24 @@
import * as React from "react"
import { cn } from "@/lib/utils"
function Input({
className,
type,
...props
}) {
return (
<input
type={type}
data-slot="input"
className={cn(
"file:text-foreground placeholder:text-muted-foreground selection:bg-primary selection:text-primary-foreground dark:bg-input/30 border-input flex h-9 w-full min-w-0 rounded-md border bg-transparent px-3 py-1 text-base shadow-xs transition-[color,box-shadow] outline-none file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50 md:text-sm",
"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
"aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive",
className
)}
{...props} />
);
}
export { Input }

View File

@ -66,3 +66,5 @@ button:focus-visible {
background-color: #f9f9f9;
}
}

6
src/lib/utils.js Normal file
View File

@ -0,0 +1,6 @@
import { clsx } from "clsx";
import { twMerge } from "tailwind-merge"
export function cn(...inputs) {
return twMerge(clsx(inputs));
}