diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..6b3112ff6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.idea/ +.DS_Store +Thumbs.db \ No newline at end of file diff --git a/Front-end/.gitignore b/Front-end/.gitignore new file mode 100644 index 000000000..a547bf36d --- /dev/null +++ b/Front-end/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/Front-end/README.md b/Front-end/README.md new file mode 100644 index 000000000..a36934d87 --- /dev/null +++ b/Front-end/README.md @@ -0,0 +1,16 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs) +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) + +## React Compiler + +The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation). + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. diff --git a/Front-end/eslint.config.js b/Front-end/eslint.config.js new file mode 100644 index 000000000..ea36dd3dc --- /dev/null +++ b/Front-end/eslint.config.js @@ -0,0 +1,21 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{js,jsx}'], + extends: [ + js.configs.recommended, + reactHooks.configs.flat.recommended, + reactRefresh.configs.vite, + ], + languageOptions: { + globals: globals.browser, + parserOptions: { ecmaFeatures: { jsx: true } }, + }, + }, +]) diff --git a/Front-end/index.html b/Front-end/index.html new file mode 100644 index 000000000..7ff6f34d2 --- /dev/null +++ b/Front-end/index.html @@ -0,0 +1,14 @@ + + + + + + + BookMyVenue + + + +
+ + + \ No newline at end of file diff --git a/Front-end/package-lock.json b/Front-end/package-lock.json new file mode 100644 index 000000000..386ea1eca --- /dev/null +++ b/Front-end/package-lock.json @@ -0,0 +1,1610 @@ +{ + "name": "bookmyvenue", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "bookmyvenue", + "version": "0.0.0", + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.26.0" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.3.1", + "vite": "^5.4.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.3.tgz", + "integrity": "sha512-4An71tdz9X8+3sI4Qqqd2LWd9vS39J7sqd9EU4Scw7TJE/qB10Flv/UuqbPVgfQV9XoK8Np6jNquZitnZq5i+Q==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz", + "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz", + "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz", + "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz", + "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz", + "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz", + "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz", + "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz", + "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz", + "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz", + "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz", + "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz", + "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz", + "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz", + "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz", + "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz", + "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz", + "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz", + "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz", + "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz", + "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz", + "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz", + "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz", + "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz", + "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz", + "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.37", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.37.tgz", + "integrity": "sha512-girxaJ7WZssDOFhzCGZTDKoTa1gk6A1TbflaYTpykLJ4UU9Fz9kx1aREM8JCuoVHbL8X8T/mJg7w2oYSq72Oig==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.372", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.372.tgz", + "integrity": "sha512-M3yhbAlilnwqC8D21t28UCDGHyitShTmmLRU/H+b74P6Ski16Nb9HONYEaVpMj/pwC7BEo5B95FpjODLCWbtfA==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.47", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.47.tgz", + "integrity": "sha512-Uzmd6LXpouKo8EUK68IjH4+E01w/hXyV3R3g/geCJo+rXLNfh1xucB+LOzYEOQPSiUK3h/xZf0cQGcSsmyL2Og==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.4.tgz", + "integrity": "sha512-SVUsDe+DybHM/WmYKIVYhZh1o5Dcuf16yM6WjG02Q9XVFMZIJyHYhwrr6bFBXZkVP6z69kNkMyBCujt8FaFLJA==", + "dependencies": { + "@remix-run/router": "1.23.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.4.tgz", + "integrity": "sha512-q4HvNl+mmDdkS0g+MqiBZNteQJCuimWoOyHMy4T/RQLAn9Z29+E91QXRaxOujeMl2HTzRSS0KFPd7lxX3PjV0Q==", + "dependencies": { + "@remix-run/router": "1.23.3", + "react-router": "6.30.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/rollup": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", + "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.61.1", + "@rollup/rollup-android-arm64": "4.61.1", + "@rollup/rollup-darwin-arm64": "4.61.1", + "@rollup/rollup-darwin-x64": "4.61.1", + "@rollup/rollup-freebsd-arm64": "4.61.1", + "@rollup/rollup-freebsd-x64": "4.61.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", + "@rollup/rollup-linux-arm-musleabihf": "4.61.1", + "@rollup/rollup-linux-arm64-gnu": "4.61.1", + "@rollup/rollup-linux-arm64-musl": "4.61.1", + "@rollup/rollup-linux-loong64-gnu": "4.61.1", + "@rollup/rollup-linux-loong64-musl": "4.61.1", + "@rollup/rollup-linux-ppc64-gnu": "4.61.1", + "@rollup/rollup-linux-ppc64-musl": "4.61.1", + "@rollup/rollup-linux-riscv64-gnu": "4.61.1", + "@rollup/rollup-linux-riscv64-musl": "4.61.1", + "@rollup/rollup-linux-s390x-gnu": "4.61.1", + "@rollup/rollup-linux-x64-gnu": "4.61.1", + "@rollup/rollup-linux-x64-musl": "4.61.1", + "@rollup/rollup-openbsd-x64": "4.61.1", + "@rollup/rollup-openharmony-arm64": "4.61.1", + "@rollup/rollup-win32-arm64-msvc": "4.61.1", + "@rollup/rollup-win32-ia32-msvc": "4.61.1", + "@rollup/rollup-win32-x64-gnu": "4.61.1", + "@rollup/rollup-win32-x64-msvc": "4.61.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } +} diff --git a/Front-end/package.json b/Front-end/package.json new file mode 100644 index 000000000..7c56ef316 --- /dev/null +++ b/Front-end/package.json @@ -0,0 +1,20 @@ +{ + "name": "bookmyvenue", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.26.0" + }, + "devDependencies": { + "@vitejs/plugin-react": "^4.3.1", + "vite": "^5.4.1" + } +} diff --git a/Front-end/public/BMVLG.png b/Front-end/public/BMVLG.png new file mode 100644 index 000000000..77a21a785 Binary files /dev/null and b/Front-end/public/BMVLG.png differ diff --git a/Front-end/src/App.css b/Front-end/src/App.css new file mode 100644 index 000000000..1b26d6808 --- /dev/null +++ b/Front-end/src/App.css @@ -0,0 +1,1336 @@ +/* ================================================ + BookMyVenue — Global Styles + Font: Playfair Display + DM Sans + Theme: Warm Ivory + Deep Maroon + Gold + ================================================ */ + +@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@500;600;700;800&family=DM+Sans:wght@300;400;500;600;700&display=swap'); + +:root { + --primary: #8B1A2E; + --primary-light: #a82340; + --primary-dark: #6a1323; + --gold: #C9952A; + --gold-light: #e0b45a; + --bg: #FDFAF6; + --bg-warm: #F7F0E8; + --white: #ffffff; + --text: #1a1a1a; + --text-muted: #6b6b6b; + --border: #e8ddd0; + --shadow: 0 4px 20px rgba(0,0,0,0.08); + --shadow-lg: 0 12px 40px rgba(0,0,0,0.14); + --radius: 12px; + --radius-lg: 20px; + --font-display: 'Playfair Display', serif; + --font-body: 'DM Sans', sans-serif; +} + +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } + +html { scroll-behavior: smooth; } + +body { + font-family: var(--font-body); + background: var(--bg); + color: var(--text); + line-height: 1.6; +} + +a { text-decoration: none; color: inherit; } +button { cursor: pointer; font-family: var(--font-body); border: none; outline: none; } +input, select, textarea { font-family: var(--font-body); outline: none; } +img { max-width: 100%; display: block; } + +/* ===================== LAYOUT ===================== */ +.app { min-height: 100vh; display: flex; flex-direction: column; } +.main-content { flex: 1; padding-top: 72px; } + +/* ===================== NAVBAR ===================== */ +.navbar { + position: fixed; top: 0; left: 0; right: 0; z-index: 1000; + background: var(--white); + border-bottom: 1px solid var(--border); + box-shadow: 0 2px 12px rgba(0,0,0,0.06); +} + +.nav-container { + max-width: 1280px; margin: 0 auto; + display: flex; align-items: center; gap: 24px; + padding: 0 24px; height: 72px; +} + +.searchCity { + width: 100%; + padding: 10px 0px; + + input { + width: 100%; + border-radius: 7px; + height: 30px; + border: 1px #00000026 solid; + padding: 0 5px; + } +} + +.nav-logo { + display: flex; align-items: center; gap: 8px; + font-family: var(--font-display); font-size: 1.4rem; font-weight: 700; + color: var(--primary); white-space: nowrap; +} +.nav-logo .logo-icon { + font-size: 1.3rem; + width: 40px; + box-shadow: 1px 1px 20px 0px #00000024; + border-radius: 10px; +} +.logo-accent { color: var(--gold); } + +.city-selector { + position: relative; display: flex; align-items: center; gap: 6px; + padding: 8px 14px; border: 1.5px solid var(--border); border-radius: 8px; + cursor: pointer; font-size: 0.9rem; font-weight: 500; white-space: nowrap; + transition: border-color 0.2s; +} +.city-selector:hover { border-color: var(--primary); } +.city-pin { font-size: 1rem; } +.city-arrow { font-size: 0.65rem; color: var(--text-muted); } + +.city-dropdown { + position: absolute; top: calc(100% + 8px); left: 0; + background: var(--white); border: 1px solid var(--border); + border-radius: var(--radius); box-shadow: var(--shadow-lg); + padding: 16px; min-width: 280px; z-index: 100; +} +.dropdown-label { font-size: 0.75rem; color: var(--text-muted); font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 12px; } +.city-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 6px; } +.city-btn { + padding: 8px 12px; border-radius: 8px; border: 1.5px solid var(--border); + background: transparent; font-size: 0.85rem; text-align: left; + transition: all 0.2s; font-family: var(--font-body); +} +.city-btn:hover, .city-btn.active { background: var(--primary); color: var(--white); border-color: var(--primary); } + +.nav-links { display: flex; align-items: center; gap: 4px; flex: 1; } +.nav-link { + padding: 8px 14px; border-radius: 8px; font-size: 0.9rem; font-weight: 500; + color: var(--text); transition: all 0.2s; white-space: nowrap; +} +.nav-link:hover { background: var(--bg-warm); color: var(--primary); } + +.nav-auth { display: flex; align-items: center; gap: 10px; white-space: nowrap; } +.auth-buttons { display: flex; gap: 10px; align-items: center; } +.btn-login { + padding: 8px 20px; border-radius: 8px; font-size: 0.9rem; font-weight: 600; + color: var(--primary); border: 1.5px solid var(--primary); transition: all 0.2s; +} +.btn-login.Active { background: var(--primary); color: var(--white); } +.btn-login:hover { background: var(--primary-dark); color: var(--white); } +/* .btn-signup { + padding: 8px 20px; border-radius: 8px; font-size: 0.9rem; font-weight: 600; + background: var(--primary); color: var(--white); transition: all 0.2s; +} +.btn-signup:hover { background: var(--primary-dark); } */ + +.createBtnDiv { + width: 100%; + display: flex; + justify-content: flex-start; + padding: 5px 0px; + gap: 15px; + margin-bottom: 10px; + .create-btn { + padding: 8px 20px; + border-radius: 8px; + font-size: 0.9rem; + font-weight: 600; + color: var(--primary); + border: 1.5px solid var(--primary); + transition: all 0.2s; + } + .create-btn:hover { + color: var(--white); + background: var(--primary-dark); + } + .create-btn.Active { + padding: 8px 20px; + border-radius: 8px; + font-size: 0.9rem; + font-weight: 600; + background: var(--primary); + color: var(--white); + transition: all 0.2s; + } +} + +.user-menu-wrap { + position: relative; display: flex; align-items: center; gap: 8px; + cursor: pointer; padding: 6px 10px; border-radius: 8px; + transition: background 0.2s; +} +.user-menu-wrap:hover { background: var(--bg-warm); } +.user-avatar { + width: 36px; height: 36px; border-radius: 50%; + background: var(--primary); color: var(--white); + display: flex; align-items: center; justify-content: center; + font-weight: 700; font-size: 1rem; +} +.user-name-short { font-weight: 600; font-size: 0.9rem; } + +.user-dropdown { + position: absolute; top: calc(100% + 8px); right: 0; + background: var(--white); border: 1px solid var(--border); + border-radius: var(--radius); box-shadow: var(--shadow-lg); + min-width: 160px; overflow: hidden; +} +.dropdown-item { + display: block; padding: 12px 16px; font-size: 0.9rem; + color: var(--text); transition: background 0.15s; width: 100%; text-align: left; +} +.dropdown-item:hover { background: var(--bg-warm); } +.logout-btn { color: var(--primary); font-weight: 600; } + +.mobile-toggle { display: none; font-size: 1.3rem; padding: 6px; background: none; margin-left: auto; } +.mobile-menu { + background: var(--white); border-top: 1px solid var(--border); + padding: 16px 24px; display: flex; flex-direction: column; gap: 4px; +} +.mobile-link { padding: 10px 0; font-size: 1rem; font-weight: 500; border-bottom: 1px solid var(--border); } +.mobile-auth { display: flex; gap: 10px; padding-top: 12px; } + +/* ===================== HERO ===================== */ +.hero { + position: relative; min-height: 88vh; + display: flex; align-items: center; justify-content: center; + overflow: hidden; +} + +.hero-bg { + position: absolute; inset: 0; + background-image: url('https://images.unsplash.com/photo-1519167758481-83f550bb49b3?w=1600&q=80'); + background-size: cover; background-position: center; +} +.hero-overlay { + position: absolute; inset: 0; + background: linear-gradient(135deg, rgba(139,26,46,0.88) 0%, rgba(26,16,10,0.75) 100%); +} + +.hero-content { + position: relative; z-index: 1; + max-width: 900px; margin: 0 auto; + padding: 60px 24px; + text-align: center; color: var(--white); +} + +.hero-badge { + display: inline-flex; align-items: center; gap: 8px; + background: rgba(201,149,42,0.2); border: 1px solid var(--gold); + color: var(--gold-light); padding: 8px 20px; border-radius: 999px; + font-size: 0.85rem; font-weight: 600; letter-spacing: 0.03em; + margin-bottom: 28px; +} + +.hero-title { + font-family: var(--font-display); font-size: clamp(2.4rem, 5vw, 4rem); + font-weight: 800; line-height: 1.15; margin-bottom: 20px; + text-shadow: 0 2px 20px rgba(0,0,0,0.3); +} +.hero-highlight { color: var(--gold-light); } + +.hero-subtitle { + font-size: 1.1rem; opacity: 0.88; margin-bottom: 40px; line-height: 1.7; +} + +.hero-stats { + display: flex; align-items: center; justify-content: center; gap: 32px; + margin-top: 40px; flex-wrap: wrap; +} +.stat { display: flex; flex-direction: column; align-items: center; } +.stat-num { font-family: var(--font-display); font-size: 1.8rem; font-weight: 700; color: var(--gold-light); } +.stat-label { font-size: 0.8rem; opacity: 0.8; } +.stat-divider { width: 1px; height: 40px; background: rgba(255,255,255,0.25); } + +/* ===================== SEARCH BAR ===================== */ +.search-bar { + display: flex; gap: 0; background: var(--white); + border-radius: var(--radius); overflow: hidden; + box-shadow: 0 8px 32px rgba(0,0,0,0.2); + max-width: 780px; margin: 0 auto; +} +.search-bar-large { max-width: 820px; } + +.search-input-wrap { + display: flex; align-items: center; gap: 10px; + padding: 0 18px; flex: 1; border-right: 1px solid var(--border); +} +.search-icon { font-size: 1rem; opacity: 0.6; } +.search-input { + border: none; background: none; font-size: 0.95rem; + padding: 16px 0; width: 100%; color: var(--text); +} +.search-input::placeholder { color: var(--text-muted); } +.search-select { + border: none; border-right: 1px solid var(--border); + padding: 16px 18px; font-size: 0.9rem; background: none; + color: var(--text); cursor: pointer; min-width: 140px; +} +.search-btn { + padding: 16px 32px; background: var(--primary); color: var(--white); + font-size: 0.95rem; font-weight: 700; letter-spacing: 0.02em; + transition: background 0.2s; white-space: nowrap; +} +.search-btn:hover { background: var(--primary-dark); } + +/* ===================== SECTIONS ===================== */ +.section { max-width: 1280px; margin: 0 auto; padding: 72px 24px; } +.section-header { + display: flex; align-items: flex-end; justify-content: space-between; + margin-bottom: 40px; +} +.section-header h2 { + font-family: var(--font-display); font-size: clamp(1.6rem, 3vw, 2.2rem); + font-weight: 700; color: var(--text); +} +.section-header p { color: var(--text-muted); margin-top: 6px; font-size: 1rem; } +.see-all-link { color: var(--primary); font-weight: 600; font-size: 0.95rem; transition: opacity 0.2s; } +.see-all-link:hover { opacity: 0.7; } + +/* ===================== CATEGORIES ===================== */ +.categories-section { background: var(--bg-warm); max-width: 100%; } +.categories-section > * { max-width: 1280px; margin: 0 auto; } +.categories-section .section-header { max-width: 1280px; margin: 0 auto 40px; } + +.categories-grid { + max-width: 1280px; margin: 0 auto; + display: grid; grid-template-columns: repeat(6, 1fr); gap: 16px; + padding: 0 24px; +} + +.category-card { + display: flex; flex-direction: column; align-items: center; gap: 10px; + padding: 28px 16px; border-radius: var(--radius-lg); + background: var(--white); border: 2px solid transparent; + transition: all 0.25s; cursor: pointer; + box-shadow: var(--shadow); +} +.category-card:hover { border-color: var(--primary); transform: translateY(-4px); box-shadow: var(--shadow-lg); } +.cat-icon { font-size: 2.2rem; } +.cat-label { font-weight: 600; font-size: 0.9rem; color: var(--text); } +.cat-count { font-size: 0.75rem; color: var(--text-muted); } + +/* ===================== VENUE CARDS ===================== */ +.venues-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; } + +.venue-card { + background: var(--white); border-radius: var(--radius-lg); + overflow: hidden; box-shadow: var(--shadow); + transition: transform 0.25s, box-shadow 0.25s; cursor: pointer; +} +.venue-card:hover { transform: translateY(-6px); box-shadow: var(--shadow-lg); } + +.card-img-wrap { position: relative; height: 220px; overflow: hidden; } +.card-img { width: 100%; height: 100%; object-fit: cover; transition: transform 0.4s; } +.venue-card:hover .card-img { transform: scale(1.05); } +.card-badge { + position: absolute; top: 12px; left: 12px; + background: var(--primary); color: var(--white); + font-size: 0.75rem; font-weight: 700; padding: 4px 12px; border-radius: 999px; + text-transform: uppercase; letter-spacing: 0.04em; +} +.card-featured { + position: absolute; top: 12px; right: 12px; + background: var(--gold); color: var(--white); + font-size: 0.75rem; font-weight: 700; padding: 4px 10px; border-radius: 999px; +} + +.card-body { padding: 20px; } +.card-title { font-family: var(--font-display); font-size: 1.15rem; font-weight: 700; margin-bottom: 6px; } +.card-location { color: var(--text-muted); font-size: 0.85rem; margin-bottom: 10px; } +.card-meta { display: flex; gap: 16px; font-size: 0.85rem; color: var(--text-muted); margin-bottom: 12px; } +.card-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 14px; } +.tag { padding: 3px 10px; border-radius: 999px; background: var(--bg-warm); font-size: 0.75rem; font-weight: 500; color: var(--text-muted); } + +.card-footer { display: flex; align-items: center; justify-content: space-between; border-top: 1px solid var(--border); padding-top: 14px; } +.card-price { display: flex; flex-direction: column; } +.price-label { font-size: 0.7rem; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.05em; } +.price-amount { font-family: var(--font-display); font-size: 1.2rem; font-weight: 700; color: var(--primary); } +.price-unit { font-size: 0.75rem; color: var(--text-muted); } +.card-btn { + padding: 9px 20px; background: var(--primary); color: var(--white); + border-radius: 8px; font-size: 0.85rem; font-weight: 600; transition: background 0.2s; +} +.card-btn:hover { background: var(--primary-dark); } + +/* ===================== WHY SECTION ===================== */ +.features-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; } +.feature-card { + padding: 32px 24px; border-radius: var(--radius-lg); + background: var(--white); border: 1.5px solid var(--border); + transition: box-shadow 0.2s, border-color 0.2s; +} +.feature-card:hover { box-shadow: var(--shadow-lg); border-color: var(--primary); } +.feature-icon { font-size: 2.4rem; margin-bottom: 14px; display: block; } +.feature-card h3 { font-family: var(--font-display); font-size: 1.1rem; font-weight: 700; margin-bottom: 8px; } +.feature-card p { color: var(--text-muted); font-size: 0.9rem; line-height: 1.7; } + +/* ===================== TESTIMONIALS ===================== */ +.testimonials-section { background: var(--bg-warm); max-width: 100%; padding: 72px 24px; } +.testimonials-grid { max-width: 1280px; margin: 0 auto; display: grid; grid-template-columns: repeat(3, 1fr); gap: 24px; } +.testimonials-section .section-header { max-width: 1280px; margin: 0 auto 40px; } + +.testimonial-card { + background: var(--white); border-radius: var(--radius-lg); + padding: 32px; box-shadow: var(--shadow); position: relative; overflow: hidden; +} +.testimonial-quote { font-family: var(--font-display); font-size: 5rem; line-height: 0.7; color: var(--gold-light); opacity: 0.4; margin-bottom: 16px; } +.testimonial-text { color: var(--text); font-size: 0.95rem; line-height: 1.75; margin-bottom: 24px; } +.testimonial-author { display: flex; align-items: center; gap: 12px; } +.testimonial-avatar { + width: 44px; height: 44px; border-radius: 50%; + background: var(--primary); color: var(--white); + display: flex; align-items: center; justify-content: center; + font-weight: 700; font-size: 1.1rem; flex-shrink: 0; +} +.testimonial-name { font-weight: 700; font-size: 0.95rem; } +.testimonial-event { font-size: 0.8rem; color: var(--text-muted); } + +/* ===================== CTA ===================== */ +.cta-section { + background: linear-gradient(135deg, var(--primary), var(--primary-dark)); + padding: 72px 24px; text-align: center; color: var(--white); +} +.cta-content h2 { font-family: var(--font-display); font-size: 2.2rem; font-weight: 800; margin-bottom: 12px; } +.cta-content p { font-size: 1.1rem; opacity: 0.85; margin-bottom: 32px; } +.cta-btn { + padding: 16px 40px; background: var(--gold); color: var(--white); + border-radius: 10px; font-size: 1.05rem; font-weight: 700; + transition: background 0.2s, transform 0.2s; +} +.cta-btn:hover { background: var(--gold-light); transform: translateY(-2px); } + +/* ===================== VENUES PAGE ===================== */ +.venues-page {} +.venues-hero { + background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%); + padding: 60px 24px; text-align: center; color: var(--white); +} +.venues-hero h1 { font-family: var(--font-display); font-size: 2.4rem; font-weight: 800; margin-bottom: 8px; } +.venues-hero p { opacity: 0.85; font-size: 1rem; margin-bottom: 28px; } +.venues-hero .search-bar { max-width: 680px; } +.venues-hero .search-input { color: var(--text); } + +.venues-layout { display: flex; gap: 32px; max-width: 1280px; margin: 0 auto; padding: 40px 24px; align-items: flex-start; } + +/* Sidebar */ +.filters-sidebar { + width: 260px; flex-shrink: 0; + background: var(--white); border-radius: var(--radius-lg); + padding: 24px; box-shadow: var(--shadow); + position: sticky; top: 88px; +} +.filter-heading { font-family: var(--font-display); font-size: 1.1rem; font-weight: 700; margin-bottom: 20px; } +.filter-group { margin-bottom: 24px; border-bottom: 1px solid var(--border); padding-bottom: 20px; } +.filter-label { font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); margin-bottom: 10px; display: block; } +.filter-type-btn { + display: block; width: 100%; text-align: left; + padding: 8px 12px; border-radius: 8px; font-size: 0.9rem; + background: none; color: var(--text); transition: all 0.15s; margin-bottom: 4px; +} +.filter-type-btn:hover, .filter-type-btn.active { background: var(--primary); color: var(--white); } + +.range-value { font-size: 1rem; font-weight: 700; color: var(--primary); margin-bottom: 8px; } +.range-input { width: 100%; accent-color: var(--primary); } +.range-limits { display: flex; justify-content: space-between; font-size: 0.75rem; color: var(--text-muted); margin-top: 4px; } + +.checkbox-label { display: flex; align-items: center; gap: 8px; font-size: 0.9rem; margin-bottom: 8px; cursor: pointer; } +.checkbox-label input { accent-color: var(--primary); } + +.clear-filters-btn { + width: 100%; padding: 10px; border-radius: 8px; border: 1.5px solid var(--border); + background: none; font-size: 0.9rem; color: var(--text-muted); + transition: all 0.2s; +} +.clear-filters-btn:hover { border-color: var(--primary); color: var(--primary); } + +/* Venues Main */ +.venues-main { flex: 1; } +.venues-toolbar { display: flex; justify-content: space-between; align-items: center; margin-bottom: 24px; } +.results-count { font-size: 0.95rem; color: var(--text-muted); font-weight: 500; } +.sort-select { padding: 10px 14px; border: 1.5px solid var(--border); border-radius: 8px; font-size: 0.9rem; background: var(--white); cursor: pointer; } + +.no-results { text-align: center; padding: 80px 24px; color: var(--text-muted); } +.no-results span { font-size: 3rem; display: block; margin-bottom: 16px; } +.no-results h3 { font-family: var(--font-display); font-size: 1.4rem; margin-bottom: 8px; color: var(--text); } + +/* ===================== VENUE DETAILS ===================== */ +.venue-details-page { max-width: 1280px; margin: 0 auto; padding: 32px 24px; } + +.gallery { margin-bottom: 40px; } +.gallery-main { position: relative; border-radius: var(--radius-lg); overflow: hidden; height: 460px; } +.gallery-main img { width: 100%; height: 100%; object-fit: cover; } +.gallery-back { + position: absolute; top: 20px; left: 20px; + background: rgba(0,0,0,0.5); color: var(--white); + padding: 8px 16px; border-radius: 8px; font-size: 0.9rem; font-weight: 600; + backdrop-filter: blur(4px); transition: background 0.2s; +} +.gallery-back:hover { background: rgba(0,0,0,0.75); } +.gallery-thumbs { display: flex; gap: 10px; margin-top: 12px; } +.thumb { height: 80px; width: 120px; object-fit: cover; border-radius: 8px; cursor: pointer; border: 2px solid transparent; transition: border-color 0.2s; } +.thumb.active { border-color: var(--primary); } + +.details-layout { display: grid; grid-template-columns: 1fr 360px; gap: 40px; align-items: flex-start; } + +.details-header { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 24px; gap: 20px; } +.details-type-badge { + display: inline-block; background: var(--bg-warm); color: var(--primary); + font-size: 0.78rem; font-weight: 700; text-transform: uppercase; + letter-spacing: 0.06em; padding: 4px 12px; border-radius: 999px; margin-bottom: 10px; +} +.details-title { font-family: var(--font-display); font-size: 2rem; font-weight: 800; margin-bottom: 8px; } +.details-location { color: var(--text-muted); font-size: 0.95rem; } +.details-rating-wrap { text-align: right; white-space: nowrap; } +.details-rating { font-family: var(--font-display); font-size: 1.4rem; font-weight: 700; color: var(--primary); } +.details-reviews { display: block; font-size: 0.85rem; color: var(--text-muted); } + +.details-highlights { display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; margin-bottom: 36px; } +.highlight { + display: flex; flex-direction: column; align-items: center; gap: 6px; + padding: 16px; border-radius: var(--radius); background: var(--bg-warm); + font-size: 0.85rem; font-weight: 600; text-align: center; +} +.highlight span:first-child { font-size: 1.4rem; } + +.details-section { margin-bottom: 36px; } +.details-section h2 { font-family: var(--font-display); font-size: 1.25rem; font-weight: 700; margin-bottom: 14px; border-bottom: 2px solid var(--border); padding-bottom: 10px; } +.details-section p { color: var(--text-muted); line-height: 1.8; } + +.amenities-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; } +.amenity-item { padding: 10px 14px; background: var(--bg-warm); border-radius: 8px; font-size: 0.875rem; font-weight: 500; color: var(--text); } + +.policy-list { list-style: none; display: flex; flex-direction: column; gap: 10px; } +.policy-list li { font-size: 0.9rem; color: var(--text-muted); padding: 10px 14px; background: var(--bg-warm); border-radius: 8px; } + +/* Booking Card */ +.booking-card { + background: var(--white); border-radius: var(--radius-lg); + padding: 28px; box-shadow: var(--shadow-lg); + border: 2px solid var(--border); position: sticky; top: 88px; +} +.booking-card h2 { font-family: var(--font-display); font-size: 1.3rem; font-weight: 700; margin-bottom: 12px; } +.booking-price { display: flex; align-items: baseline; gap: 6px; margin-bottom: 24px; } +.bp-amount { font-family: var(--font-display); font-size: 1.8rem; font-weight: 800; color: var(--primary); } +.bp-unit { font-size: 0.9rem; color: var(--text-muted); } + +.booking-form { display: flex; flex-direction: column; gap: 16px; } +.form-group { display: flex; flex-direction: column; gap: 6px; } +.form-group label { font-size: 0.85rem; font-weight: 600; color: var(--text); display: flex; justify-content: space-between; } +.form-input { + padding: 10px 14px; border: 1.5px solid var(--border); border-radius: 8px; + font-size: 0.9rem; color: var(--text); transition: border-color 0.2s; + background: var(--bg); font-family: var(--font-body); +} +.form-input:focus { border-color: var(--primary); background: var(--white); } +.form-textarea { min-height: 90px; resize: vertical; } + +.booking-summary { background: var(--bg-warm); border-radius: 10px; padding: 16px; } +.bs-row { display: flex; justify-content: space-between; font-size: 0.875rem; margin-bottom: 8px; color: var(--text-muted); } +.bs-total { font-weight: 700; color: var(--text); font-size: 1rem; margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--border); margin-bottom: 0; } + +.book-now-btn { + padding: 14px; background: var(--primary); color: var(--white); + border-radius: 10px; font-size: 1rem; font-weight: 700; + transition: background 0.2s, transform 0.15s; letter-spacing: 0.02em; +} +.book-now-btn:hover { background: var(--primary-dark); transform: translateY(-1px); } +.login-hint { text-align: center; font-size: 0.8rem; color: var(--text-muted); margin-top: -8px; } + +/* ===================== AUTH PAGES ===================== */ +.auth-page { display: flex; min-height: calc(100vh - 72px); } + +.auth-visual { + width: 45%; background: linear-gradient(135deg, var(--primary) 0%, var(--primary-dark) 100%); + display: flex; align-items: center; justify-content: center; + padding: 60px; color: var(--white); position: sticky; top: 72px; height: calc(100vh - 72px); +} +.auth-visual-content { max-width: 360px; } +.auth-logo { + display: flex; align-items: center; gap: 10px; + font-family: var(--font-display); font-size: 1.8rem; font-weight: 800; + margin-bottom: 40px; +} +.auth-logo span:nth-child(2) span { color: var(--gold-light); } +.auth-visual h2 { font-family: var(--font-display); font-size: 2.2rem; font-weight: 800; margin-bottom: 16px; } +.auth-visual p { opacity: 0.85; font-size: 1rem; line-height: 1.75; } +.auth-decorations { font-size: 2.5rem; display: flex; gap: 20px; margin-top: 40px; } + +.auth-form-side { + flex: 1; display: flex; align-items: center; justify-content: center; + padding: 60px 40px; background: var(--bg); +} +.auth-form-wrap { width: 100%; max-width: 460px; } + +.auth-title { font-family: var(--font-display); font-size: 2rem; font-weight: 800; margin-bottom: 8px; } +.auth-subtitle { color: var(--text-muted); font-size: 0.95rem; margin-bottom: 28px; } +.auth-subtitle a { color: var(--primary); font-weight: 600; } + +.auth-error { background: #fff0f3; border: 1.5px solid #ffb3c1; color: var(--primary); border-radius: 8px; padding: 12px 16px; font-size: 0.9rem; margin-bottom: 20px; } +.auth-form { display: flex; flex-direction: column; gap: 18px; } + +.form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; } + +.forgot-link { color: var(--primary); font-size: 0.8rem; font-weight: 500; } + +.auth-submit-btn { + padding: 14px; background: var(--primary); color: var(--white); + border-radius: 10px; font-size: 1rem; font-weight: 700; + transition: background 0.2s; letter-spacing: 0.02em; margin-top: 4px; +} +.auth-submit-btn:hover:not(:disabled) { background: var(--primary-dark); } +.auth-submit-btn:disabled { opacity: 0.6; cursor: not-allowed; } + +.auth-divider { text-align: center; position: relative; margin: 24px 0; } +.auth-divider::before { content: ''; position: absolute; top: 50%; left: 0; right: 0; height: 1px; background: var(--border); } +.auth-divider span { position: relative; background: var(--bg); padding: 0 16px; font-size: 0.85rem; color: var(--text-muted); } + +.social-auth { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; } +.social-auth-btn { + padding: 12px; border: 1.5px solid var(--border); border-radius: 10px; + font-size: 0.9rem; font-weight: 600; background: var(--white); + transition: border-color 0.2s; color: var(--text); +} +.social-auth-btn:hover { border-color: var(--primary); } + +.terms-label { font-size: 0.85rem; } +.terms-label a { color: var(--primary); } + +/* ===================== BOOKING PAGE ===================== */ +.booking-page { max-width: 1100px; margin: 0 auto; padding: 40px 24px; } +.booking-layout { display: grid; grid-template-columns: 1fr 340px; gap: 40px; align-items: flex-start; } + +.booking-steps { display: flex; align-items: center; margin-bottom: 36px; } +.step { font-size: 0.9rem; font-weight: 600; color: var(--text-muted); padding: 8px 0; } +.step.active { color: var(--primary); } +.step-line { flex: 1; height: 2px; background: var(--border); margin: 0 12px; } + +.booking-details-form, .booking-payment-form, .booking-confirm-form { display: flex; flex-direction: column; gap: 18px; } +.booking-details-form h2, .booking-payment-form h2, .booking-confirm-form h2 { + font-family: var(--font-display); font-size: 1.4rem; font-weight: 700; margin-bottom: 4px; +} + +.payment-note { color: var(--text-muted); font-size: 0.9rem; } +.advance-amount { font-family: var(--font-display); font-size: 2rem; font-weight: 800; color: var(--primary); } +.advance-amount span { font-size: 1rem; color: var(--text-muted); font-family: var(--font-body); } +.payment-methods { display: flex; flex-direction: column; gap: 10px; } +.payment-option { display: flex; align-items: center; gap: 10px; cursor: pointer; padding: 12px 14px; border-radius: 10px; border: 1.5px solid var(--border); font-size: 0.9rem; font-weight: 500; transition: border-color 0.2s; } +.payment-option:hover { border-color: var(--primary); } +.payment-option input { accent-color: var(--primary); } +.upi-input { display: flex; flex-direction: column; gap: 6px; } +.upi-input label { font-size: 0.85rem; font-weight: 600; } + +.step-buttons { display: flex; gap: 12px; } +.btn-primary { padding: 12px 28px; background: var(--primary); color: var(--white); border-radius: 10px; font-weight: 700; transition: background 0.2s; } +.btn-primary:hover { background: var(--primary-dark); } +.btn-secondary { padding: 12px 28px; border: 1.5px solid var(--border); border-radius: 10px; font-weight: 600; background: var(--white); color: var(--text); transition: all 0.2s; } +.btn-secondary:hover { border-color: var(--primary); color: var(--primary); } + +.confirm-details { background: var(--bg-warm); border-radius: 12px; padding: 20px; } +.cd-row { display: flex; justify-content: space-between; font-size: 0.9rem; margin-bottom: 10px; } +.cd-row span:last-child { font-weight: 600; } +.cd-total { font-size: 1rem; font-weight: 800; color: var(--primary); padding-top: 10px; border-top: 1px solid var(--border); margin-bottom: 0; } + +/* Booking Summary Side */ +.booking-summary-side { + background: var(--white); border-radius: var(--radius-lg); + padding: 24px; box-shadow: var(--shadow); position: sticky; top: 88px; +} +.booking-summary-side h3 { font-family: var(--font-display); font-size: 1.1rem; font-weight: 700; margin-bottom: 16px; } +.summary-img { width: 100%; height: 160px; object-fit: cover; border-radius: 10px; margin-bottom: 14px; } +.booking-summary-side h4 { font-family: var(--font-display); font-size: 1rem; font-weight: 700; margin-bottom: 4px; } +.booking-summary-side p { font-size: 0.85rem; color: var(--text-muted); margin-bottom: 16px; } +.summary-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; margin-bottom: 20px; } +.sg-item { display: flex; flex-direction: column; gap: 2px; font-size: 0.82rem; } +.sg-item span { color: var(--text-muted); } +.sg-item strong { font-weight: 700; color: var(--text); font-size: 0.9rem; } +.summary-price-breakdown { background: var(--bg-warm); border-radius: 10px; padding: 14px; } +.spb-row { display: flex; justify-content: space-between; font-size: 0.85rem; margin-bottom: 8px; color: var(--text-muted); } +.spb-total { font-weight: 700; color: var(--text); border-top: 1px solid var(--border); padding-top: 8px; margin-top: 4px; } +.spb-advance { color: var(--primary); font-weight: 700; font-size: 0.95rem; } + +/* ===================== BOOKING SUCCESS ===================== */ +.booking-success { display: flex; align-items: center; justify-content: center; padding: 80px 24px; } +.success-card { + background: var(--white); border-radius: var(--radius-lg); + padding: 48px 40px; text-align: center; max-width: 480px; width: 100%; + box-shadow: var(--shadow-lg); +} +.success-icon { font-size: 4rem; margin-bottom: 20px; display: block; } +.success-card h1 { font-family: var(--font-display); font-size: 2rem; font-weight: 800; margin-bottom: 12px; } +.success-card p { color: var(--text-muted); line-height: 1.75; margin-bottom: 20px; } +.booking-ref { background: var(--bg-warm); border-radius: 8px; padding: 12px 20px; font-size: 0.9rem; color: var(--text-muted); margin-bottom: 24px; } +.booking-ref strong { color: var(--primary); } +.success-details { background: var(--bg-warm); border-radius: 12px; padding: 20px; margin-bottom: 28px; } +.sd-row { display: flex; justify-content: space-between; font-size: 0.9rem; margin-bottom: 8px; } +.sd-row span:last-child { font-weight: 600; } +.success-actions { display: flex; gap: 12px; justify-content: center; } + +/* ===================== FOOTER ===================== */ +.footer { + background: #0f0a08; color: rgba(255,255,255,0.75); + padding: 64px 0 0; +} +.footer-top { + max-width: 1280px; margin: 0 auto; + display: grid; grid-template-columns: 1.5fr 1fr 1fr 1fr 1fr; + gap: 48px; padding: 0 24px 48px; + border-bottom: 1px solid rgba(255,255,255,0.08); +} +.footer-logo { + display: flex; align-items: center; gap: 8px; + font-family: var(--font-display); font-size: 1.3rem; font-weight: 700; + color: var(--white); margin-bottom: 16px; +} +.footer-tagline { font-size: 0.88rem; line-height: 1.75; color: rgba(255,255,255,0.55); margin-bottom: 24px; } +.footer-socials { display: flex; gap: 12px; } +.social-icon { + width: 38px; height: 38px; border-radius: 50%; + background: rgba(255,255,255,0.08); border: 1px solid rgba(255,255,255,0.1); + display: flex; align-items: center; justify-content: center; + font-size: 1rem; text-decoration: none; transition: background 0.2s; +} +.social-icon:hover { background: var(--primary); } + +.footer-links-group h4 { color: var(--white); font-size: 0.9rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; margin-bottom: 20px; } +.footer-links-group a { display: block; font-size: 0.875rem; color: rgba(255,255,255,0.55); margin-bottom: 10px; transition: color 0.2s; } +.footer-links-group a:hover { color: var(--gold-light); } + +.footer-bottom { + max-width: 1280px; margin: 0 auto; + padding: 20px 24px; + display: flex; justify-content: space-between; + font-size: 0.8rem; color: rgba(255,255,255,0.35); +} + +/* ===================== RESPONSIVE ===================== */ +@media (max-width: 1100px) { + .categories-grid { grid-template-columns: repeat(3, 1fr); } + .venues-grid { grid-template-columns: repeat(2, 1fr); } + .features-grid { grid-template-columns: repeat(2, 1fr); } + .footer-top { grid-template-columns: 1fr 1fr; gap: 32px; } +} + +@media (max-width: 900px) { + .nav-links { display: none; } + .mobile-toggle { display: block; } + .auth-visual { display: none; } + .auth-form-side { padding: 40px 24px; } + .details-layout { grid-template-columns: 1fr; } + .booking-layout { grid-template-columns: 1fr; } + .booking-summary-side { order: -1; position: static; } + .venues-layout { flex-direction: column; } + .filters-sidebar { width: 100%; position: static; } + .testimonials-grid { grid-template-columns: 1fr; } +} + +@media (max-width: 640px) { + .hero-title { font-size: 2rem; } + .search-bar { flex-direction: column; border-radius: var(--radius); } + .search-input-wrap, .search-select { border-right: none; border-bottom: 1px solid var(--border); } + .venues-grid { grid-template-columns: 1fr; } + .features-grid { grid-template-columns: 1fr; } + .categories-grid { grid-template-columns: repeat(2, 1fr); } + .details-highlights { grid-template-columns: repeat(2, 1fr); } + .hero-stats { gap: 16px; } + .stat-divider { display: none; } + .footer-top { grid-template-columns: 1fr; gap: 24px; } + .footer-bottom { flex-direction: column; gap: 6px; text-align: center; } + .form-row { grid-template-columns: 1fr; } + .booking-steps { font-size: 0.8rem; } +} + +/* ===================== QUICK CATEGORY PILLS ===================== */ +.quick-cats { + background: var(--white); + border-bottom: 1px solid var(--border); + padding: 0 24px; + position: sticky; top: 72px; z-index: 90; + box-shadow: 0 2px 8px rgba(0,0,0,0.04); +} +.quick-cats-inner { + max-width: 1280px; margin: 0 auto; + display: flex; gap: 10px; overflow-x: auto; + padding: 14px 0; + scrollbar-width: none; +} +.quick-cats-inner::-webkit-scrollbar { display: none; } +.quick-cat-pill { + display: flex; align-items: center; gap: 7px; + padding: 8px 20px; border-radius: 999px; + border: 1.5px solid var(--border); background: var(--bg); + font-size: 0.88rem; font-weight: 600; white-space: nowrap; + color: var(--text); transition: all 0.2s; cursor: pointer; +} +.quick-cat-pill:hover { border-color: var(--primary); background: var(--primary); color: var(--white); } + +/* ===================== CATEGORY ROWS (HOME) ===================== */ +.all-cat-rows { + max-width: 1380px; margin: 0 auto; + display: flex; flex-direction: column; gap: 0; + padding: 0 0 48px; +} + +.cat-row { + padding: 48px 32px 0; + border-bottom: 1px solid var(--border); + padding-bottom: 48px; +} +.cat-row:last-child { border-bottom: none; } + +.cat-row-header { + display: flex; align-items: center; justify-content: space-between; + margin-bottom: 24px; flex-wrap: wrap; gap: 12px; +} +.cat-row-title { + display: flex; align-items: center; gap: 14px; +} +.cat-row-icon { font-size: 2rem; } +.cat-row-title h2 { + font-family: var(--font-display); font-size: 1.5rem; font-weight: 700; margin: 0; +} +.cat-row-title p { color: var(--text-muted); font-size: 0.85rem; margin: 4px 0 0; } + +.cat-row-actions { display: flex; align-items: center; gap: 12px; } + +.scroll-btns { display: flex; gap: 6px; } +.scroll-btn { + width: 36px; height: 36px; border-radius: 50%; + border: 1.5px solid var(--border); background: var(--white); + font-size: 1.3rem; line-height: 1; display: flex; align-items: center; justify-content: center; + transition: all 0.2s; color: var(--text); +} +.scroll-btn:hover { border-color: var(--primary); background: var(--primary); color: var(--white); } + +.view-all-btn { + padding: 9px 20px; border-radius: 8px; + border: 1.5px solid var(--primary); color: var(--primary); + background: transparent; font-size: 0.88rem; font-weight: 700; + transition: all 0.2s; white-space: nowrap; +} +.view-all-btn:hover { background: var(--primary); color: var(--white); } + +/* Horizontal Scroll Track */ +.cat-scroll-wrap { position: relative; } +.cat-scroll-track { + display: flex; gap: 20px; + overflow-x: auto; scroll-snap-type: x mandatory; + padding-bottom: 12px; + scrollbar-width: thin; + scrollbar-color: var(--border) transparent; +} +.cat-scroll-track::-webkit-scrollbar { height: 5px; } +.cat-scroll-track::-webkit-scrollbar-track { background: transparent; } +.cat-scroll-track::-webkit-scrollbar-thumb { background: var(--border); border-radius: 999px; } + +.cat-scroll-item { + flex: 0 0 300px; scroll-snap-align: start; +} + +/* View More Card */ +.view-more-card { + height: 100%; min-height: 380px; + border: 2px dashed var(--border); border-radius: var(--radius-lg); + display: flex; flex-direction: column; align-items: center; justify-content: center; + gap: 10px; cursor: pointer; background: var(--bg-warm); + transition: all 0.25s; +} +.view-more-card:hover { border-color: var(--primary); background: var(--white); transform: translateY(-4px); box-shadow: var(--shadow-lg); } +.view-more-icon { font-size: 2.5rem; } +.view-more-num { font-family: var(--font-display); font-size: 2rem; font-weight: 800; color: var(--primary); } +.view-more-text { font-size: 0.9rem; font-weight: 600; color: var(--text-muted); text-align: center; padding: 0 20px; } +.view-more-arrow { font-size: 1.5rem; color: var(--primary); } + +/* ===================== TOP FILTER BAR (VENUES PAGE) ===================== */ +.top-filter-bar { + background: var(--white); + border-bottom: 1px solid var(--border); + position: sticky; top: 72px; z-index: 80; + box-shadow: 0 2px 8px rgba(0,0,0,0.04); +} +.top-filter-inner { + max-width: 1280px; margin: 0 auto; + display: flex; align-items: center; gap: 12px; + padding: 12px 24px; overflow-x: auto; + scrollbar-width: none; +} +.top-filter-inner::-webkit-scrollbar { display: none; } + +/* Type pills inside filter bar */ +.type-pills-scroll { + display: flex; gap: 8px; flex-shrink: 0; +} +.type-pill { + padding: 7px 18px; border-radius: 999px; + border: 1.5px solid var(--border); background: var(--bg); + font-size: 0.85rem; font-weight: 600; white-space: nowrap; + color: var(--text); transition: all 0.2s; +} +.type-pill:hover { border-color: var(--primary); color: var(--primary); } +.type-pill.active { background: var(--primary); color: var(--white); border-color: var(--primary); } + +.filter-bar-divider { width: 1px; height: 28px; background: var(--border); flex-shrink: 0; } + +.inline-sort-select { + padding: 8px 14px; border: 1.5px solid var(--border); border-radius: 8px; + font-size: 0.85rem; background: var(--white); cursor: pointer; + font-family: var(--font-body); color: var(--text); white-space: nowrap; flex-shrink: 0; +} + +.price-quick { + display: flex; align-items: center; gap: 10px; flex-shrink: 0; + background: var(--bg-warm); border: 1.5px solid var(--border); + border-radius: 8px; padding: 6px 14px; +} +.price-quick-label { font-size: 0.82rem; font-weight: 700; color: var(--primary); white-space: nowrap; } +.price-quick-range { width: 90px; accent-color: var(--primary); cursor: pointer; } + +.more-filters-btn { + display: flex; align-items: center; gap: 7px; + padding: 8px 18px; border-radius: 8px; + border: 1.5px solid var(--border); background: var(--white); + font-size: 0.85rem; font-weight: 700; color: var(--text); + white-space: nowrap; transition: all 0.2s; flex-shrink: 0; +} +.more-filters-btn:hover, .more-filters-btn.active { border-color: var(--primary); color: var(--primary); background: #fff0f3; } +.filter-badge { + background: var(--primary); color: var(--white); + font-size: 0.7rem; font-weight: 800; + width: 18px; height: 18px; border-radius: 50%; + display: inline-flex; align-items: center; justify-content: center; +} + +.clear-inline-btn { + padding: 8px 14px; border-radius: 8px; + border: 1.5px solid var(--border); background: none; + font-size: 0.82rem; font-weight: 600; color: var(--text-muted); + transition: all 0.2s; flex-shrink: 0; +} +.clear-inline-btn:hover { color: var(--primary); border-color: var(--primary); } + +/* Active Filter Chips */ +.active-chips { + max-width: 1280px; margin: 0 auto; + padding: 10px 24px; display: flex; flex-wrap: wrap; gap: 8px; +} +.chip { + display: inline-flex; align-items: center; gap: 6px; + background: #fff0f3; border: 1px solid #ffb3c1; + color: var(--primary); border-radius: 999px; + font-size: 0.8rem; font-weight: 600; padding: 4px 12px; +} +.chip button { background: none; border: none; color: var(--primary); cursor: pointer; font-size: 0.75rem; padding: 0; line-height: 1; } + +/* ===================== VENUES LAYOUT NEW ===================== */ +.venues-layout-new { + max-width: 1280px; margin: 0 auto; + padding: 28px 24px; position: relative; +} +.venues-main-new { width: 100%; } +.venues-main-new .results-count { font-size: 0.95rem; color: var(--text-muted); margin-bottom: 20px; } +.venues-main-new .results-count strong { color: var(--text); font-size: 1.05rem; } + +/* ===================== FILTER DRAWER (SLIDE-IN SIDEBAR) ===================== */ +.filter-drawer { + position: fixed; top: 0; right: -360px; width: 340px; height: 100vh; + background: var(--white); z-index: 1001; + box-shadow: -4px 0 32px rgba(0,0,0,0.15); + transition: right 0.3s cubic-bezier(0.4, 0, 0.2, 1); + display: flex; flex-direction: column; + overflow-y: auto; +} +.filter-drawer.open { right: 0; } + +.drawer-header { + display: flex; align-items: center; justify-content: space-between; + padding: 20px 24px; border-bottom: 1px solid var(--border); + position: sticky; top: 0; background: var(--white); z-index: 1; +} +.drawer-header h3 { font-family: var(--font-display); font-size: 1.2rem; font-weight: 700; } +.drawer-close { + width: 32px; height: 32px; border-radius: 50%; + border: 1.5px solid var(--border); background: none; + font-size: 1rem; display: flex; align-items: center; justify-content: center; + transition: all 0.2s; +} +.drawer-close:hover { background: var(--primary); color: var(--white); border-color: var(--primary); } + +.filter-drawer .filter-group { padding: 20px 24px; border-bottom: 1px solid var(--border); } +.filter-drawer .filter-label { font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); margin-bottom: 12px; display: block; } +.filter-drawer .filter-type-btn { + display: block; width: 100%; text-align: left; + padding: 9px 14px; border-radius: 8px; font-size: 0.9rem; + background: none; color: var(--text); transition: all 0.15s; + margin-bottom: 4px; border: 1.5px solid transparent; +} +.filter-drawer .filter-type-btn:hover { background: var(--bg-warm); } +.filter-drawer .filter-type-btn.active { background: var(--primary); color: var(--white); border-color: var(--primary); } + +.amenity-check-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; } +.amenity-check { + display: flex; align-items: center; gap: 8px; + padding: 9px 12px; border-radius: 8px; border: 1.5px solid var(--border); + font-size: 0.85rem; font-weight: 500; cursor: pointer; + transition: all 0.15s; +} +.amenity-check input { accent-color: var(--primary); } +.amenity-check.checked { border-color: var(--primary); background: #fff0f3; color: var(--primary); } + +.drawer-footer { + padding: 20px 24px; display: flex; gap: 12px; + position: sticky; bottom: 0; background: var(--white); + border-top: 1px solid var(--border); +} +.drawer-footer .clear-filters-btn { + flex: 1; padding: 12px; border-radius: 10px; + border: 1.5px solid var(--border); background: none; + font-size: 0.9rem; color: var(--text-muted); +} +.apply-btn { + flex: 2; padding: 12px; border-radius: 10px; + background: var(--primary); color: var(--white); + font-size: 0.9rem; font-weight: 700; border: none; + transition: background 0.2s; +} +.apply-btn:hover { background: var(--primary-dark); } + +.drawer-overlay { + position: fixed; inset: 0; background: rgba(0,0,0,0.4); + z-index: 1000; backdrop-filter: blur(2px); +} + +/* ===================== VENUE PANEL ===================== */ +.vp-root { + display: flex; min-height: 100vh; + background: #f4f1ec; + font-family: var(--font-body); +} + +/* ── Sidebar ── */ +.vp-sidebar { + width: 240px; flex-shrink: 0; + background: #0f0a08; + display: flex; flex-direction: column; + position: fixed; top: 0; left: 0; height: 100vh; + z-index: 200; transition: transform 0.3s ease; +} +.vp-sidebar-logo { + display: flex; align-items: center; gap: 10px; + padding: 24px 20px 20px; + font-family: var(--font-display); font-size: 1.3rem; font-weight: 800; + color: var(--white); border-bottom: 1px solid rgba(255,255,255,0.08); +} +.vp-sidebar-logo span:first-child { font-size: 1.4rem; } +.vp-sidebar-logo span:last-child span { color: var(--gold-light); } + +.vp-nav { flex: 1; padding: 16px 12px; display: flex; flex-direction: column; gap: 4px; } +.vp-nav-item { + display: flex; align-items: center; gap: 12px; + padding: 11px 14px; border-radius: 10px; + border: none; background: none; color: rgba(255,255,255,0.55); + font-size: 0.9rem; font-weight: 600; font-family: var(--font-body); + cursor: pointer; text-align: left; transition: all 0.2s; +} +.vp-nav-item:hover { background: rgba(255,255,255,0.07); color: var(--white); } +.vp-nav-item.active { background: var(--primary); color: var(--white); } +.vp-nav-icon { font-size: 1.1rem; flex-shrink: 0; } + +.vp-sidebar-footer { padding: 16px 12px 20px; border-top: 1px solid rgba(255,255,255,0.08); } +.vp-owner-chip { display: flex; align-items: center; gap: 10px; } +.vp-owner-avatar { + width: 36px; height: 36px; border-radius: 50%; + background: var(--primary); color: var(--white); + display: flex; align-items: center; justify-content: center; + font-weight: 800; font-size: 1rem; flex-shrink: 0; +} +.vp-owner-name { font-size: 0.88rem; font-weight: 700; color: var(--white); } +.vp-owner-role { font-size: 0.75rem; color: rgba(255,255,255,0.45); } + +.vp-sidebar-overlay { position: fixed; inset: 0; background: rgba(0,0,0,0.5); z-index: 199; } + +/* ── Main ── */ +.vp-main { + flex: 1; margin-left: 240px; + display: flex; flex-direction: column; min-height: 100vh; +} +.vp-topbar { + background: var(--white); border-bottom: 1px solid var(--border); + padding: 16px 28px; display: flex; align-items: center; + justify-content: space-between; position: sticky; top: 0; z-index: 90; + box-shadow: 0 2px 8px rgba(0,0,0,0.04); +} +.vp-page-title { font-family: var(--font-display); font-size: 1.3rem; font-weight: 700; } +.vp-hamburger { display: none; background: none; border: none; font-size: 1.4rem; cursor: pointer; padding: 4px; } +.vp-page-content { padding: 28px; flex: 1; } + +/* ── Stat Cards ── */ +.vp-stats-row { display: grid; grid-template-columns: repeat(4, 1fr); gap: 16px; margin-bottom: 28px; } +.vp-stat-card { + background: var(--white); border-radius: var(--radius-lg); + padding: 20px; display: flex; align-items: center; gap: 16px; + box-shadow: var(--shadow); +} +.vp-stat-icon { + width: 48px; height: 48px; border-radius: 12px; + display: flex; align-items: center; justify-content: center; + font-size: 1.4rem; flex-shrink: 0; +} +.vp-stat-body { display: flex; flex-direction: column; } +.vp-stat-value { font-size: 1.6rem; font-weight: 800; line-height: 1; } +.vp-stat-label { font-size: 0.82rem; font-weight: 600; color: var(--text-muted); margin-top: 4px; } +.vp-stat-sub { font-size: 0.75rem; color: var(--text-muted); margin-top: 2px; } + +/* ── Dashboard Grid ── */ +.vp-dash-grid { display: grid; grid-template-columns: 1.6fr 1fr; gap: 20px; } +.vp-card { + background: var(--white); border-radius: var(--radius-lg); + padding: 24px; box-shadow: var(--shadow); +} +.vp-card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 18px; } +.vp-card-header h3 { font-family: var(--font-display); font-size: 1.05rem; font-weight: 700; } +.vp-link-btn { background: none; border: none; color: var(--primary); font-size: 0.85rem; font-weight: 700; cursor: pointer; } + +/* ── Table ── */ +.vp-table { width: 100%; border-collapse: collapse; font-size: 0.875rem; } +.vp-table th { text-align: left; padding: 8px 12px; font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); border-bottom: 1px solid var(--border); } +.vp-table td { padding: 12px 12px; border-bottom: 1px solid #f5f0ea; } +.vp-table tr:last-child td { border-bottom: none; } +.vp-table tr:hover td { background: var(--bg-warm); } +.vp-td-muted { color: var(--text-muted); } +.vp-table-full { min-width: 700px; } +.vp-code { background: var(--bg-warm); padding: 2px 7px; border-radius: 5px; font-size: 0.78rem; font-family: monospace; color: var(--primary); } + +/* ── Venue Quick List ── */ +.vp-venue-quick-list { display: flex; flex-direction: column; gap: 12px; } +.vp-venue-quick-item { display: flex; align-items: center; gap: 12px; padding: 10px; border-radius: 10px; transition: background 0.15s; } +.vp-venue-quick-item:hover { background: var(--bg-warm); } +.vp-venue-quick-img { width: 52px; height: 44px; border-radius: 8px; object-fit: cover; flex-shrink: 0; } +.vp-venue-quick-info { flex: 1; min-width: 0; } +.vp-venue-quick-name { font-weight: 700; font-size: 0.88rem; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } +.vp-venue-quick-meta { font-size: 0.78rem; color: var(--text-muted); margin-top: 2px; } + +/* ── Venue Row Cards ── */ +.vp-venues-list { display: flex; flex-direction: column; gap: 16px; } +.vp-venue-row-card { + background: var(--white); border-radius: var(--radius-lg); + display: flex; gap: 20px; padding: 20px; + box-shadow: var(--shadow); transition: box-shadow 0.2s; +} +.vp-venue-row-card:hover { box-shadow: var(--shadow-lg); } +.vp-venue-row-img { width: 160px; height: 120px; object-fit: cover; border-radius: 10px; flex-shrink: 0; } +.vp-venue-row-info { flex: 1; min-width: 0; } +.vp-venue-row-top { display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 8px; gap: 12px; } +.vp-venue-row-name { font-family: var(--font-display); font-size: 1.1rem; font-weight: 700; } +.vp-venue-row-meta { font-size: 0.82rem; color: var(--text-muted); margin-top: 4px; } +.vp-venue-row-desc { font-size: 0.85rem; color: var(--text-muted); line-height: 1.6; margin-bottom: 12px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; } +.vp-venue-row-stats { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; font-size: 0.82rem; color: var(--text-muted); font-weight: 500; } +.vp-venue-row-amenities { display: flex; gap: 6px; flex-wrap: wrap; } +.vp-tag { background: var(--bg-warm); padding: 3px 10px; border-radius: 999px; font-size: 0.75rem; font-weight: 500; color: var(--text-muted); } + +.vp-venue-row-actions { display: flex; flex-direction: column; gap: 8px; justify-content: center; flex-shrink: 0; } +.vp-action-btn { + padding: 8px 18px; border-radius: 8px; font-size: 0.85rem; font-weight: 700; + border: none; cursor: pointer; transition: all 0.18s; font-family: var(--font-body); + white-space: nowrap; +} +.vp-action-btn.edit { background: var(--bg-warm); color: var(--primary); border: 1.5px solid var(--border); } +.vp-action-btn.edit:hover { background: var(--primary); color: var(--white); border-color: var(--primary); } +.vp-action-btn.delete { background: #fff0f3; color: var(--primary); border: 1.5px solid #ffb3c1; } +.vp-action-btn.delete:hover { background: var(--primary); color: var(--white); border-color: var(--primary); } + +/* ── Bookings Filter Tabs ── */ +.vp-bookings-filter { display: flex; gap: 8px; margin-bottom: 16px; } +.vp-filter-tab { + padding: 8px 18px; border-radius: 999px; font-size: 0.85rem; font-weight: 600; + border: 1.5px solid var(--border); background: var(--white); cursor: pointer; + transition: all 0.18s; color: var(--text); +} +.vp-filter-tab:hover, .vp-filter-tab.active { background: var(--primary); color: var(--white); border-color: var(--primary); } + +/* ── Empty State ── */ +.vp-empty { text-align: center; padding: 80px 24px; background: var(--white); border-radius: var(--radius-lg); box-shadow: var(--shadow); } +.vp-empty span { font-size: 3.5rem; display: block; margin-bottom: 16px; } +.vp-empty h3 { font-family: var(--font-display); font-size: 1.4rem; margin-bottom: 8px; } +.vp-empty p { color: var(--text-muted); margin-bottom: 24px; } + +/* ── Modal ── */ +.vp-modal-overlay { + position: fixed; inset: 0; background: rgba(0,0,0,0.55); + z-index: 500; display: flex; align-items: center; justify-content: center; + padding: 20px; backdrop-filter: blur(3px); +} +.vp-modal { + background: var(--white); border-radius: var(--radius-lg); + width: 100%; max-width: 680px; max-height: 90vh; + display: flex; flex-direction: column; + box-shadow: 0 24px 60px rgba(0,0,0,0.25); + animation: modalPop 0.25s cubic-bezier(0.34,1.56,0.64,1); +} +.vp-modal-sm { max-width: 440px; } +@keyframes modalPop { from { opacity: 0; transform: scale(0.92) translateY(20px); } to { opacity: 1; transform: none; } } + +.vp-modal-header { + display: flex; justify-content: space-between; align-items: flex-start; + padding: 24px 28px 0; +} +.vp-modal-header h2 { font-family: var(--font-display); font-size: 1.3rem; font-weight: 700; } +.vp-modal-header p { color: var(--text-muted); font-size: 0.85rem; margin-top: 4px; } +.vp-modal-close { + width: 32px; height: 32px; border-radius: 50%; border: 1.5px solid var(--border); + background: none; font-size: 0.9rem; cursor: pointer; flex-shrink: 0; + display: flex; align-items: center; justify-content: center; transition: all 0.2s; +} +.vp-modal-close:hover { background: var(--primary); color: var(--white); border-color: var(--primary); } + +.vp-modal-tabs { display: flex; gap: 0; padding: 16px 28px 0; border-bottom: 1px solid var(--border); margin-top: 16px; } +.vp-modal-tab { + padding: 10px 20px; background: none; border: none; + font-size: 0.88rem; font-weight: 600; cursor: pointer; + color: var(--text-muted); border-bottom: 2.5px solid transparent; + margin-bottom: -1px; transition: all 0.2s; font-family: var(--font-body); +} +.vp-modal-tab:hover { color: var(--primary); } +.vp-modal-tab.active { color: var(--primary); border-bottom-color: var(--primary); } + +.vp-modal-body { padding: 24px 28px; overflow-y: auto; flex: 1; } +.vp-modal-footer { + padding: 16px 28px; border-top: 1px solid var(--border); + display: flex; justify-content: space-between; align-items: center; +} + +/* ── Form Styles ── */ +.vp-form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; } +.vp-form-group { display: flex; flex-direction: column; gap: 6px; } +.vp-form-group label { font-size: 0.82rem; font-weight: 700; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.04em; } +.vp-span2 { grid-column: span 2; } +.vp-input { + padding: 10px 14px; border: 1.5px solid var(--border); border-radius: 8px; + font-size: 0.9rem; color: var(--text); font-family: var(--font-body); + background: var(--bg); transition: border-color 0.2s; +} +.vp-input:focus { border-color: var(--primary); background: var(--white); outline: none; } +.vp-textarea { min-height: 100px; resize: vertical; } +.vp-img-preview { width: 100%; height: 140px; object-fit: cover; border-radius: 8px; margin-top: 8px; } + +/* Amenity Grid */ +.vp-amenity-hint { font-size: 0.85rem; color: var(--text-muted); margin-bottom: 14px; } +.vp-amenity-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; } +.vp-amenity-chip { + display: flex; align-items: center; gap: 8px; + padding: 9px 12px; border-radius: 8px; border: 1.5px solid var(--border); + font-size: 0.85rem; font-weight: 500; cursor: pointer; transition: all 0.15s; + user-select: none; +} +.vp-amenity-chip input { accent-color: var(--primary); } +.vp-amenity-chip.selected { background: #fff0f3; border-color: var(--primary); color: var(--primary); font-weight: 700; } +.vp-amenity-count { margin-top: 14px; font-size: 0.82rem; color: var(--text-muted); } + +/* ── Buttons ── */ +.vp-btn-primary { + padding: 10px 24px; background: var(--primary); color: var(--white); + border: none; border-radius: 8px; font-size: 0.9rem; font-weight: 700; + cursor: pointer; transition: background 0.2s; font-family: var(--font-body); + white-space: nowrap; +} +.vp-btn-primary:hover { background: var(--primary-dark); } +.vp-btn-ghost { + padding: 10px 20px; background: none; border: 1.5px solid var(--border); + border-radius: 8px; font-size: 0.9rem; font-weight: 600; + color: var(--text-muted); cursor: pointer; transition: all 0.2s; font-family: var(--font-body); +} +.vp-btn-ghost:hover { border-color: var(--primary); color: var(--primary); } +.vp-btn-danger { + padding: 10px 24px; background: var(--primary); color: var(--white); + border: none; border-radius: 8px; font-size: 0.9rem; font-weight: 700; + cursor: pointer; font-family: var(--font-body); +} + +/* ── Profile ── */ +.vp-section-content { background: var(--white); border-radius: var(--radius-lg); padding: 28px; box-shadow: var(--shadow); } +.vp-profile-layout { display: grid; grid-template-columns: 220px 1fr; gap: 40px; } +.vp-profile-avatar-side { display: flex; flex-direction: column; align-items: center; padding-top: 8px; } +.vp-avatar-big { + width: 100px; height: 100px; border-radius: 50%; + background: var(--primary); color: var(--white); + display: flex; align-items: center; justify-content: center; + font-family: var(--font-display); font-size: 2.8rem; font-weight: 800; + box-shadow: 0 4px 20px rgba(139,26,46,0.3); +} +.vp-profile-badge { + margin-top: 14px; background: #e6f9f0; color: #1a7a4a; + padding: 5px 14px; border-radius: 999px; font-size: 0.78rem; font-weight: 700; +} +.vp-profile-stats-mini { + display: flex; gap: 16px; margin-top: 20px; + padding-top: 20px; border-top: 1px solid var(--border); width: 100%; + justify-content: center; +} +.vp-profile-stats-mini div { display: flex; flex-direction: column; align-items: center; } +.vp-profile-stats-mini strong { font-size: 1.1rem; font-weight: 800; color: var(--primary); } +.vp-profile-stats-mini span { font-size: 0.72rem; color: var(--text-muted); margin-top: 2px; } +.vp-section-title-row { margin-bottom: 18px; } +.vp-section-title-row h3 { font-family: var(--font-display); font-size: 1.1rem; font-weight: 700; border-bottom: 2px solid var(--border); padding-bottom: 10px; } + +.vp-save-toast { + background: #e6f9f0; color: #1a7a4a; padding: 8px 18px; + border-radius: 999px; font-size: 0.85rem; font-weight: 700; + margin-right: 12px; animation: fadeIn 0.2s; +} + +/* ── Toast ── */ +.vp-toast { + position: fixed; bottom: 28px; right: 28px; + background: #1a1a1a; color: var(--white); + padding: 14px 24px; border-radius: 10px; + font-size: 0.9rem; font-weight: 600; + box-shadow: 0 8px 24px rgba(0,0,0,0.2); + z-index: 9999; animation: slideUp 0.3s ease; +} +.vp-toast-error { background: var(--primary); } +@keyframes slideUp { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: none; } } +@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } + +/* ── Responsive ── */ +@media (max-width: 1024px) { + .vp-stats-row { grid-template-columns: repeat(2, 1fr); } + .vp-dash-grid { grid-template-columns: 1fr; } +} + +@media (max-width: 900px) { + .cat-scroll-item { flex: 0 0 260px; } + .cat-row { padding: 32px 16px; } + .cat-row-title h2 { font-size: 1.2rem; } + .scroll-btns { display: none; } + .top-filter-inner { padding: 10px 16px; } + .price-quick { display: none; } + .vp-sidebar { transform: translateX(-100%); } + .vp-sidebar.open { transform: none; } + .vp-main { margin-left: 0; } + .vp-hamburger { display: block; } + .vp-venue-row-card { flex-direction: column; } + .vp-venue-row-img { width: 100%; height: 180px; } + .vp-venue-row-actions { flex-direction: row; } + .vp-profile-layout { grid-template-columns: 1fr; } + .vp-profile-avatar-side { flex-direction: row; gap: 20px; align-items: flex-start; } +} +@media (max-width: 640px) { + .cat-scroll-item { flex: 0 0 240px; } + .filter-drawer { width: 100%; right: -100%; } + .type-pill { font-size: 0.78rem; padding: 6px 14px; } + .all-cat-rows { padding-bottom: 32px; } + .vp-page-content { padding: 16px; } + .vp-stats-row { grid-template-columns: 1fr 1fr; } + .vp-form-grid { grid-template-columns: 1fr; } + .vp-span2 { grid-column: span 1; } + .vp-amenity-grid { grid-template-columns: repeat(2, 1fr); } + .vp-modal { margin: 10px; max-height: 95vh; } + .vp-modal-tabs { overflow-x: auto; } +} \ No newline at end of file diff --git a/Front-end/src/App.jsx b/Front-end/src/App.jsx new file mode 100644 index 000000000..4df7a24b8 --- /dev/null +++ b/Front-end/src/App.jsx @@ -0,0 +1,31 @@ +import { BrowserRouter, useLocation } from "react-router-dom"; +import { AuthProvider } from "./context/AuthContext"; +import AppRoutes from "./routes/AppRoutes"; +import Navbar from "./components/Navbar"; +import Footer from "./components/Footer"; +import "./App.css"; + +function Layout() { + const { pathname } = useLocation(); + const isVenuePanel = pathname.startsWith("/venueOwner"); + + return ( +
+ +
+ +
+ {!isVenuePanel &&
+ ); +} + +export default function App() { + return ( + + + + + + ); +} \ No newline at end of file diff --git a/Front-end/src/assets/BMV.png b/Front-end/src/assets/BMV.png new file mode 100644 index 000000000..e50bee01a Binary files /dev/null and b/Front-end/src/assets/BMV.png differ diff --git a/Front-end/src/components/Footer.jsx b/Front-end/src/components/Footer.jsx new file mode 100644 index 000000000..560904e24 --- /dev/null +++ b/Front-end/src/components/Footer.jsx @@ -0,0 +1,64 @@ +import { Link } from "react-router-dom"; + +export default function Footer() { + return ( + + ); +} \ No newline at end of file diff --git a/Front-end/src/components/Navbar.jsx b/Front-end/src/components/Navbar.jsx new file mode 100644 index 000000000..203e41825 --- /dev/null +++ b/Front-end/src/components/Navbar.jsx @@ -0,0 +1,121 @@ +import { useState, useRef, useEffect } from "react"; +import { Link, useNavigate } from "react-router-dom"; +import { useAuth } from "../context/AuthContext"; +import BMV from "../assets/BMV.png" + +const CITIES = [ + "Mumbai", "Delhi", "Bengaluru", "Hyderabad", "Chennai", + "Kolkata", "Pune", "Ahmedabad", "Jaipur", "Surat" +]; + +export default function Navbar() { + const { user, logout } = useAuth(); + const navigate = useNavigate(); + const [city, setCity] = useState("Bengaluru"); + const [showCityDropdown, setShowCityDropdown] = useState(false); + const [showUserMenu, setShowUserMenu] = useState(false); + const [mobileMenuOpen, setMobileMenuOpen] = useState(false); + const [role,setPage] = useState("Login"); + const cityRef = useRef(null); + + useEffect( ()=> { + const handleClickOutside = (event) => { + if (cityRef.current && !cityRef.current.contains(event.target)) { + setShowCityDropdown(false); + } + }; + document.addEventListener("mousedown",handleClickOutside); + return () => { + document.removeEventListener("mousedown",handleClickOutside); + }; + }, []); + + return ( + + ); +} \ No newline at end of file diff --git a/Front-end/src/components/SearchBar.jsx b/Front-end/src/components/SearchBar.jsx new file mode 100644 index 000000000..f479d60d7 --- /dev/null +++ b/Front-end/src/components/SearchBar.jsx @@ -0,0 +1,51 @@ +import { useState } from "react"; +import { useNavigate } from "react-router-dom"; + +export default function SearchBar({ large = false }) { + const [query, setQuery] = useState(""); + const [eventType, setEventType] = useState(""); + const [guests, setGuests] = useState(""); + const navigate = useNavigate(); + + const handleSearch = (e) => { + e.preventDefault(); + const params = new URLSearchParams(); + if (query) params.set("q", query); + if (eventType) params.set("type", eventType); + if (guests) params.set("guests", guests); + navigate(`/venues?${params.toString()}`); + }; + + return ( +
+
+ 🔍 + setQuery(e.target.value)} + className="search-input" + /> +
+ + + +
+ ); +} \ No newline at end of file diff --git a/Front-end/src/components/VenueCard.jsx b/Front-end/src/components/VenueCard.jsx new file mode 100644 index 000000000..7f4409589 --- /dev/null +++ b/Front-end/src/components/VenueCard.jsx @@ -0,0 +1,36 @@ +import { useNavigate } from "react-router-dom"; + +export default function VenueCard({ venue }) { + const navigate = useNavigate(); + + return ( +
navigate(`/venues/${venue.id}`)}> +
+ {venue.name} +
{venue.type}
+ {venue.featured &&
⭐ Featured
} +
+
+

{venue.name}

+

📍 {venue.location}, {venue.city}

+
+ 👥 Up to {venue.capacity} + ⭐ {venue.rating} ({venue.reviews}) +
+
+ {venue.amenities?.slice(0, 3).map(a => ( + {a} + ))} +
+
+
+ Starting from + ₹{venue.price?.toLocaleString()} + /day +
+ +
+
+
+ ); +} \ No newline at end of file diff --git a/Front-end/src/context/AuthContext.jsx b/Front-end/src/context/AuthContext.jsx new file mode 100644 index 000000000..0ea62336a --- /dev/null +++ b/Front-end/src/context/AuthContext.jsx @@ -0,0 +1,30 @@ +import { createContext, useContext, useState } from "react"; + +const AuthContext = createContext(null); + +export function AuthProvider({ children }) { + const [user, setUser] = useState(() => { + const saved = localStorage.getItem("bmv_user"); + return saved ? JSON.parse(saved) : null; + }); + + const login = (userData) => { + setUser(userData); + localStorage.setItem("bmv_user", JSON.stringify(userData)); + }; + + const logout = () => { + setUser(null); + localStorage.removeItem("bmv_user"); + }; + + return ( + + {children} + + ); +} + +export function useAuth() { + return useContext(AuthContext); +} \ No newline at end of file diff --git a/Front-end/src/css/Admin.css b/Front-end/src/css/Admin.css new file mode 100644 index 000000000..1aa7aabae --- /dev/null +++ b/Front-end/src/css/Admin.css @@ -0,0 +1,468 @@ +@import url('https://fonts.googleapis.com/css2?family=Syne:wght@400;600;700;800&family=JetBrains+Mono:wght@400;500&display=swap'); + +/* ── Root Variables ── */ +:root { + --bg: #fbfbfb; + --surface: #ffffff; + --surface-2: #d6d6d6; + --surface-3: #1f2330; + --border: #252935; + --border-bright: #323849; + + --accent: #f0b429; + --accent-dim: rgba(240, 180, 41, 0.12); + --accent-glow: rgba(240, 180, 41, 0.25); + + --text: #000000; + --text-muted: #000000; + --text-dim: #000000; + + --green: #22c55e; + --green-bg: rgba(34, 197, 94, 0.1); + --red: #ef4444; + --red-bg: rgba(239, 68, 68, 0.1); + --yellow: #f0b429; + --yellow-bg: rgba(240, 180, 41, 0.1); + --blue: #3b82f6; + --blue-bg: rgba(255, 255, 255, 0.1); + + --sidebar-w: 240px; + --radius: 10px; + --font-display: 'Syne', sans-serif; + --font-mono: 'JetBrains Mono', monospace; +} + +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } + +body { + background: var(--bg); + color: var(--text); + font-family: var(--font-display); + -webkit-font-smoothing: antialiased; +} + +/* ── Layout ── */ +.admin-root { + display: flex; + min-height: 100vh; +} + +/* ── Sidebar ── */ +.sidebar { + width: var(--sidebar-w); + background: var(--surface); + border-right: 1px solid var(--border); + display: flex; + flex-direction: column; + position: sticky; + top: 0; + height: 100vh; + flex-shrink: 0; +} + +.sidebar__brand { + display: flex; + align-items: center; + gap: 10px; + padding: 24px 20px 16px; + font-size: 16px; + font-weight: 800; + letter-spacing: -0.3px; + color: var(--text); + border-bottom: 1px solid var(--border); +} + +.brand-icon { + font-size: 22px; + color: var(--accent); + line-height: 1; +} + +.brand-name { + font-size: 14px; + font-weight: 800; + letter-spacing: 0.5px; +} + +.sidebar__label { + font-family: var(--font-mono); + font-size: 9px; + letter-spacing: 2px; + color: var(--text-muted); + padding: 18px 20px 10px; + text-transform: uppercase; +} + +.sidebar__nav { + display: flex; + flex-direction: column; + gap: 2px; + padding: 0 10px; + flex: 1; +} + +.nav-item { + position: relative; + display: flex; + align-items: center; + gap: 12px; + padding: 11px 12px; + background: none; + border: none; + border-radius: 8px; + color: var(--text-muted); + font-family: var(--font-display); + font-size: 13px; + font-weight: 600; + cursor: pointer; + transition: all 0.15s ease; + width: 100%; + text-align: left; +} + +.nav-item:hover { + color: var(--text); + background: var(--surface-2); +} + +.nav-item--active { + color: var(--accent); + background: var(--accent-dim); +} + +.nav-item__icon { font-size: 15px; } +.nav-item__label { flex: 1; } + +.nav-item__bar { + position: absolute; + right: 0; + top: 50%; + transform: translateY(-50%); + width: 3px; + height: 60%; + background: var(--accent); + border-radius: 3px 0 0 3px; +} + +.sidebar__footer { + padding: 16px; + border-top: 1px solid var(--border); +} + +.admin-badge { + display: flex; + align-items: center; + gap: 10px; +} + +.admin-avatar { + width: 34px; + height: 34px; + background: var(--accent); + color: #000; + font-weight: 800; + font-size: 14px; + border-radius: 8px; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.admin-name { + font-size: 12px; + font-weight: 700; + color: var(--text); +} + +.admin-role { + font-size: 10px; + font-family: var(--font-mono); + color: var(--text-muted); + margin-top: 1px; +} + +/* ── Main ── */ +.main { + flex: 1; + display: flex; + flex-direction: column; + background: var(--bg); + min-width: 0; +} + +/* ── Topbar ── */ +.topbar { + display: flex; + align-items: center; + justify-content: space-between; + padding: 28px 32px 0; + gap: 16px; + flex-wrap: wrap; +} + +.page-title { + font-size: 26px; + font-weight: 800; + letter-spacing: -0.8px; + color: var(--text); +} + +.page-sub { + font-size: 13px; + color: var(--text-muted); + margin-top: 3px; + font-weight: 400; +} + +.topbar__actions { + display: flex; + gap: 10px; +} + +.btn-primary { + padding: 9px 18px; + background: var(--accent); + color: #000; + border: none; + border-radius: 8px; + font-family: var(--font-display); + font-size: 13px; + font-weight: 700; + cursor: pointer; + transition: opacity 0.15s; +} + +.btn-primary:hover { opacity: 0.85; } + +.btn-ghost { + padding: 9px 18px; + background: var(--surface-2); + color: var(--text-dim); + border: 1px solid var(--border); + border-radius: 8px; + font-family: var(--font-display); + font-size: 13px; + font-weight: 600; + cursor: pointer; + transition: all 0.15s; +} + +.btn-ghost:hover { + border-color: var(--border-bright); + color: var(--text); +} + +/* ── Stats Grid ── */ +.stats-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 16px; + padding: 24px 32px 0; +} + +.stat-card { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 20px; + transition: border-color 0.2s; +} + +.stat-card:hover { border-color: var(--border-bright); } + +.stat-card__top { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 12px; +} + +.stat-icon { font-size: 20px; } + +.stat-delta { + font-family: var(--font-mono); + font-size: 11px; + font-weight: 500; + padding: 2px 7px; + border-radius: 100px; +} + +.delta--up { color: var(--green); background: var(--green-bg); } +.delta--down { color: var(--red); background: var(--red-bg); } + +.stat-value { + font-size: 24px; + font-weight: 800; + letter-spacing: -0.8px; + color: var(--text); + margin-bottom: 4px; +} + +.stat-label { + font-size: 12px; + color: var(--text-muted); + font-weight: 400; +} + +/* ── Search ── */ +.search-bar-wrap { + display: flex; + align-items: center; + gap: 10px; + padding: 20px 32px 0; +} + +.search-icon { font-size: 14px; color: var(--text-muted); } + +.search-input { + background: var(--surface); + border: 1px solid var(--border); + border-radius: 8px; + padding: 9px 16px; + color: var(--text); + font-family: var(--font-display); + font-size: 13px; + width: 300px; + outline: none; + transition: border-color 0.15s; +} + +.search-input::placeholder { color: var(--text-muted); } +.search-input:focus { border-color: var(--accent); } + +/* ── Content Section ── */ +.content-section { + padding: 20px 32px 32px; + flex: 1; +} + +/* ── Table ── */ +.table-wrap { + background: var(--surface); + border: 1px solid var(--border); + border-radius: var(--radius); + overflow: auto; +} + +.data-table { + width: 100%; + border-collapse: collapse; + font-size: 13px; +} + +.data-table thead tr { + border-bottom: 1px solid var(--border); +} + +.data-table th { + font-family: var(--font-mono); + font-size: 10px; + letter-spacing: 1.5px; + text-transform: uppercase; + color: var(--text-muted); + font-weight: 500; + padding: 14px 18px; + text-align: left; + white-space: nowrap; +} + +.data-table td { + padding: 14px 18px; + color: var(--text-dim); + border-bottom: 1px solid var(--border); + vertical-align: middle; + white-space: nowrap; +} + +.data-table tbody tr:last-child td { border-bottom: none; } + +.data-table tbody tr { + transition: background 0.1s; +} + +.data-table tbody tr:hover { + background: var(--surface-2); +} + +.bold { color: var(--text) !important; font-weight: 600; } +.muted { color: var(--text-muted) !important; font-family: var(--font-mono); font-size: 12px; } +.revenue { color: var(--green) !important; font-weight: 700; font-family: var(--font-mono); } + +/* ── Badges ── */ +.badge { + font-family: var(--font-mono); + font-size: 10px; + font-weight: 500; + letter-spacing: 0.8px; + text-transform: uppercase; + padding: 3px 9px; + border-radius: 100px; + display: inline-block; +} + +.badge--pending { color: var(--yellow); background: var(--yellow-bg); } +.badge--approved, .badge--active, .badge--verified { color: var(--green); background: var(--green-bg); } +.badge--rejected, .badge--suspended { color: var(--red); background: var(--red-bg); } + +/* ── Tags ── */ +.tag { + background: var(--surface-3); + border: 1px solid var(--border); + color: var(--text-dim); + font-size: 11px; + font-weight: 600; + padding: 3px 9px; + border-radius: 6px; + white-space: nowrap; +} + +/* ── Action Buttons ── */ +.action-btns { display: flex; gap: 6px; } + +.btn-action { + width: 30px; + height: 30px; + border-radius: 7px; + border: 1px solid var(--border); + background: var(--surface-2); + font-size: 13px; + cursor: pointer; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.15s; + color: var(--text-dim); + font-family: var(--font-display); +} + +.btn-action:hover { border-color: var(--border-bright); } + +.btn-action--approve:hover { background: var(--green-bg); border-color: var(--green); color: var(--green); } +.btn-action--reject:hover { background: var(--red-bg); border-color: var(--red); color: var(--red); } +.btn-action--view { width: auto; padding: 0 10px; font-size: 11px; font-weight: 600; } +.btn-action--view:hover { background: var(--blue-bg); border-color: var(--blue); color: var(--blue); } + +/* ── Toggles ── */ +.toggle { + font-family: var(--font-mono); + font-size: 10px; + font-weight: 600; + letter-spacing: 1px; + padding: 3px 9px; + border-radius: 5px; +} + +.toggle--on { color: var(--green); background: var(--green-bg); } +.toggle--off { color: var(--text-muted); background: var(--surface-3); } + +/* ── Responsive ── */ +@media (max-width: 1100px) { + .stats-grid { grid-template-columns: repeat(2, 1fr); } +} + +@media (max-width: 768px) { + .sidebar { display: none; } + .topbar, .stats-grid, .search-bar-wrap, .content-section { padding-left: 16px; padding-right: 16px; } + .stats-grid { grid-template-columns: repeat(2, 1fr); } +} \ No newline at end of file diff --git a/Front-end/src/index.css b/Front-end/src/index.css new file mode 100644 index 000000000..e69de29bb diff --git a/Front-end/src/main.jsx b/Front-end/src/main.jsx new file mode 100644 index 000000000..de3343ea2 --- /dev/null +++ b/Front-end/src/main.jsx @@ -0,0 +1,9 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import App from './App.jsx' + +createRoot(document.getElementById('root')).render( + + + , +) \ No newline at end of file diff --git a/Front-end/src/pages/Admin.jsx b/Front-end/src/pages/Admin.jsx new file mode 100644 index 000000000..efde4b32b --- /dev/null +++ b/Front-end/src/pages/Admin.jsx @@ -0,0 +1,267 @@ +import { useState } from "react"; +import "../css/Admin.css"; + +const MOCK_DATA = { + requests: [ + { id: 1, venue: "The Grand Hall", owner: "Arjun Mehta", type: "New Listing", date: "2025-06-01", status: "pending" }, + { id: 2, venue: "Skyline Terrace", owner: "Priya Nair", type: "Edit Request", date: "2025-06-02", status: "pending" }, + { id: 3, venue: "Bloom Gardens", owner: "Karan Singh", type: "New Listing", date: "2025-05-30", status: "approved" }, + { id: 4, venue: "The Loft", owner: "Meena Iyer", type: "Takedown", date: "2025-05-28", status: "rejected" }, + ], + users: [ + { id: 1, name: "Rahul Verma", email: "rahul@email.com", joined: "2025-01-14", bookings: 12, status: "active" }, + { id: 2, name: "Sneha Pillai", email: "sneha@email.com", joined: "2025-02-20", bookings: 5, status: "active" }, + { id: 3, name: "Dev Kapoor", email: "dev@email.com", joined: "2024-11-10", bookings: 0, status: "suspended" }, + { id: 4, name: "Aisha Khan", email: "aisha@email.com", joined: "2025-04-03", bookings: 8, status: "active" }, + ], + venueOwners: [ + { id: 1, name: "Arjun Mehta", email: "arjun@venues.com", venues: 3, revenue: "₹2,40,000", status: "verified" }, + { id: 2, name: "Priya Nair", email: "priya@venues.com", venues: 1, revenue: "₹80,000", status: "pending" }, + { id: 3, name: "Karan Singh", email: "karan@venues.com", venues: 5, revenue: "₹6,10,000", status: "verified" }, + { id: 4, name: "Meena Iyer", email: "meena@venues.com", venues: 2, revenue: "₹1,20,000", status: "suspended" }, + ], + permissions: [ + { id: 1, role: "Super Admin", users: 1, canApprove: true, canDelete: true, canManageRoles: true }, + { id: 2, role: "Moderator", users: 4, canApprove: true, canDelete: false, canManageRoles: false }, + { id: 3, role: "Support", users: 8, canApprove: false, canDelete: false, canManageRoles: false }, + { id: 4, role: "Finance", users: 2, canApprove: false, canDelete: false, canManageRoles: false }, + ], +}; + +const STATS = [ + { label: "Total Users", value: "1,284", delta: "+12%", icon: "👤" }, + { label: "Active Venues", value: "347", delta: "+5%", icon: "🏛" }, + { label: "Pending Requests", value: "24", delta: "-3", icon: "📋" }, + { label: "Revenue This Month", value: "₹18.4L", delta: "+22%", icon: "💰" }, +]; + +const TABS = [ + { id: "requests", label: "Requests", icon: "📋" }, + { id: "users", label: "Users", icon: "👤" }, + { id: "venueOwners", label: "Venue Owners", icon: "🏛" }, + { id: "permissions", label: "Permissions", icon: "🔐" }, +]; + +const StatusBadge = ({ status }) => ( + {status} +); + +const Toggle = ({ on }) => ( + + {on ? "YES" : "NO"} + +); + +function RequestsTable({ data }) { + return ( +
+ + + + + + + + {data.map((r) => ( + + + + + + + + + + ))} + +
#VenueOwnerTypeDateStatusActions
{r.id}{r.venue}{r.owner}{r.type}{r.date} +
+ + +
+
+
+ ); +} + +function UsersTable({ data }) { + return ( +
+ + + + + + + + {data.map((u) => ( + + + + + + + + + + ))} + +
#NameEmailJoinedBookingsStatusActions
{u.id}{u.name}{u.email}{u.joined}{u.bookings} +
+ + +
+
+
+ ); +} + +function VenueOwnersTable({ data }) { + return ( +
+ + + + + + + + {data.map((v) => ( + + + + + + + + + + ))} + +
#NameEmailVenuesRevenueStatusActions
{v.id}{v.name}{v.email}{v.venues}{v.revenue} +
+ + +
+
+
+ ); +} + +function PermissionsTable({ data }) { + return ( +
+ + + + + + + + {data.map((p) => ( + + + + + + + + + ))} + +
RoleUsersApproveDeleteManage RolesActions
{p.role}{p.users} + +
+
+ ); +} + +export default function AdminPanel() { + const [activeTab, setActiveTab] = useState("requests"); + + const renderContent = () => { + switch (activeTab) { + case "requests": return ; + case "users": return ; + case "venueOwners": return ; + case "permissions": return ; + default: return null; + } + }; + + return ( +
+ {/* Sidebar */} + + + {/* Main */} +
+
+
+

+ {TABS.find((t) => t.id === activeTab)?.label} +

+

Manage and monitor all {TABS.find((t) => t.id === activeTab)?.label.toLowerCase()}

+
+
+ + +
+
+ + {/* Stats */} + {/*
+ {STATS.map((s) => ( +
+
+ {s.icon} + {s.delta} +
+
{s.value}
+
{s.label}
+
+ ))} +
*/} + + {/* Search bar */} +
+ 🔍 + t.id === activeTab)?.label.toLowerCase()}...`} /> +
+ + {/* Table */} +
+ {renderContent()} +
+
+
+ ); +} \ No newline at end of file diff --git a/Front-end/src/pages/Booking.jsx b/Front-end/src/pages/Booking.jsx new file mode 100644 index 000000000..33ffe7c0e --- /dev/null +++ b/Front-end/src/pages/Booking.jsx @@ -0,0 +1,155 @@ +import { useState } from "react"; +import { useLocation, useNavigate } from "react-router-dom"; +import { useAuth } from "../context/AuthContext"; + +export default function Booking() { + const { state } = useLocation(); + const navigate = useNavigate(); + const { user } = useAuth(); + const [step, setStep] = useState(1); + const [confirmed, setConfirmed] = useState(false); + const [form, setForm] = useState({ name: user?.name || "", email: user?.email || "", phone: "", notes: "" }); + + if (!state?.venue) return
No booking details found.
; + + const { venue, date, guests, eventType } = state; + const total = Math.round(venue.price * 1.05); + const advance = Math.round(total * 0.5); + + const set = (k) => (e) => setForm(f => ({ ...f, [k]: e.target.value })); + + const handleConfirm = (e) => { + e.preventDefault(); + setConfirmed(true); + }; + + if (confirmed) { + return ( +
+
+
🎉
+

Booking Confirmed!

+

Your venue has been successfully booked. Check your email for confirmation details.

+
Booking ID: BMV{Date.now().toString().slice(-8)}
+
+
Venue{venue.name}
+
Date{date || "TBD"}
+
Guests{guests}
+
Advance Paid₹{advance.toLocaleString()}
+
+
+ + +
+
+
+ ); + } + + return ( +
+
+ {/* Left: Form */} +
+
+
= 1 ? "active" : ""}`}>1. Details
+
+
= 2 ? "active" : ""}`}>2. Payment
+
+
= 3 ? "active" : ""}`}>3. Confirm
+
+ + {step === 1 && ( +
setStep(2)}> +

Your Details

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