├── .DS_Store ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── documentation_update.yml │ └── feature_request.yml ├── PULL_REQUEST_TEMPLATE.md ├── auto_assign.yml ├── holopin.yml ├── pr-title-checker.json └── workflows │ ├── action.yml │ ├── assign.yml │ ├── auto-comment-on-pr-merge.yml │ ├── auto-label-issues.yml │ ├── build-html-pages │ ├── close all issues │ ├── close-old-issue.yml │ ├── codeql.yml │ ├── greetings.yml │ ├── pr-checker.yml │ └── pr-title-checker.yml ├── .idea ├── .gitignore ├── Retro.iml ├── modules.xml └── vcs.xml ├── .vscode └── settings.json ├── CODE_OF_CONDUCT.md ├── Contributing.md ├── Coverpage.html ├── Css-files ├── about.css ├── content.css ├── contributor.css ├── coverpage.css ├── feedback.css ├── forgotpass1.css ├── login-register.css ├── menu.css ├── navbarstyles.css ├── popup.css └── style.css ├── Favicon image ├── 31Y4VOw6STS._AC_SY580_.jpg ├── 60658ce0a6734f66d2b84740_1617267936777.jpg ├── check-mark.png ├── credit.avif ├── favicon-16x16.png ├── favicon-192x192.png ├── favicon-32x32.png ├── favicon-512x512.png ├── favicon.ico ├── french-style-antique-black-dressing-table-set-500x500.webp ├── google-pay-logo-2020.svg ├── hero02_aa0c3ccb-58f4-4368-b1e6-8c96cbefc872_1024x1024.webp ├── il_fullxfull.4810524436_b94v.webp ├── im.png ├── images (1).jpg ├── images (2).jpg ├── images (3).jpg ├── images (4).jpg ├── images (5).jpg ├── images (6).jpg ├── images (7).jpg ├── images (8).jpg ├── images.jpg ├── phonepe-icon.svg ├── still-image-old-camera-equipment-600nw-2097355165.webp └── vintage-radio-receiver-antique-wooden-260nw-1420023938.webp ├── Html-files ├── Electronic.html ├── about.html ├── blog.html ├── booknow.html ├── cart.html ├── cart.js ├── contact.html ├── contributor.html ├── contributor.js ├── faviconimage.png ├── feedback.html ├── forgot-pass.html ├── logged.html ├── login.html ├── menu.html ├── menu.js ├── museums.html ├── payment2.html ├── reviews.html ├── scriptlogin.js ├── scriptsignup.js ├── services.html ├── signed.html ├── signup.html └── wishlist.html ├── Images ├── Login.png ├── Loginsave.png ├── RETRO.png ├── acsa.html ├── biryani.jpg ├── booking.png ├── candy.jpg ├── customer-service.png ├── download-on-the-app-store.png ├── ecommerce.png ├── get_it_on_google_play_store.png ├── plate_mismatch.jpg ├── popup.jpg ├── signup.png └── train-3803_256.gif ├── LICENSE.txt ├── README.md ├── RETRO.png ├── about.png ├── backend ├── .gitignore ├── app.js ├── config │ └── databaseConfig.js ├── controller │ └── authController.js ├── index.js ├── middleware │ └── jwtAuth.js ├── model │ └── userSchema.js ├── package-lock.json ├── package.json └── router │ └── authRoute.js ├── cart.js ├── codeforcloseofallissues.py ├── collaborative_filtering.py ├── collection.png ├── content_based_filtering.py ├── dark-mode ├── dark-mode.css └── dark-mode.js ├── data_collection.py ├── favicon.ico ├── gssoc24.png ├── hacktoberfest.png ├── home.png ├── index.html ├── layer.png ├── manifest.json ├── menu.js ├── moon.png ├── mountain.png ├── package-lock.json ├── recommendation.py ├── script ├── coverpage.js ├── feedback.js └── popup.js ├── service-worker.js ├── stars.png ├── style.css ├── trees.png ├── visi.css └── visi.js /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/.DS_Store -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.yml: -------------------------------------------------------------------------------- 1 | name: Bug report 🐞 2 | description: File a bug report 3 | title: "🐞[bug]: " 4 | body: 5 | - type: checkboxes 6 | id: existing-issue 7 | attributes: 8 | label: Is there an existing issue for this? 9 | description: Please search to see if an issue already exists for the bug you encountered. 10 | options: 11 | - label: I have searched the existing issues 12 | required: true 13 | - type: textarea 14 | id: what-happened 15 | attributes: 16 | label: Describe the bug 17 | description: A concise description of what you are experiencing. 18 | placeholder: Tell us what you see! 19 | validations: 20 | required: true 21 | - type: textarea 22 | id: expected-behaviour 23 | attributes: 24 | label: Expected behavior 25 | description: A clear and concise description of what you expected to happen. 26 | validations: 27 | required: true 28 | - type: textarea 29 | id: screenshots 30 | attributes: 31 | label: Add ScreenShots 32 | description: Add sufficient ScreenShots to explain your issue. 33 | - type: dropdown 34 | id: browsers 35 | attributes: 36 | label: What browsers are you seeing the problem on? 37 | multiple: true 38 | options: 39 | - Firefox 40 | - Chrome 41 | - Safari 42 | - Microsoft Edge 43 | - type: checkboxes 44 | id: terms 45 | attributes: 46 | label: Record 47 | options: 48 | - label: "I have read the Contributing Guidelines" 49 | required: true 50 | - label: "I'm a SWOC contributor" 51 | required: true 52 | - label: "I have starred the repository" 53 | required: true 54 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/documentation_update.yml: -------------------------------------------------------------------------------- 1 | name: 📝 Documentation Update 2 | description: Improve Documentation 3 | title: "📝[documentation Update]: " 4 | body: 5 | - type: checkboxes 6 | id: existing-issue 7 | attributes: 8 | label: Is there an existing issue for this? 9 | description: Please search to see if an issue already exists for the updates you want to make. 10 | options: 11 | - label: I have searched the existing issues 12 | required: true 13 | - type: textarea 14 | id: issue-description 15 | attributes: 16 | label: Issue Description 17 | description: Please provide a clear description of the documentation update you are suggesting. 18 | placeholder: Describe the improvement or correction you'd like to see in the documentation. 19 | validations: 20 | required: true 21 | - type: textarea 22 | id: suggested-change 23 | attributes: 24 | label: Suggested Change 25 | description: Provide details of the proposed change to the documentation. 26 | placeholder: Explain how the documentation should be updated or corrected. 27 | validations: 28 | required: true 29 | - type: textarea 30 | id: rationale 31 | attributes: 32 | label: Rationale 33 | description: Why is this documentation update necessary or beneficial? 34 | placeholder: Explain the importance or reasoning behind the suggested change. 35 | validations: 36 | required: False 37 | - type: dropdown 38 | id: urgency 39 | attributes: 40 | label: Urgency 41 | description: How urgently do you believe this documentation update is needed? 42 | options: 43 | - High 44 | - Medium 45 | - Low 46 | default: 0 47 | validations: 48 | required: true 49 | - type: checkboxes 50 | id: terms 51 | attributes: 52 | label: Record 53 | options: 54 | - label: "I have read the Contributing Guidelines" 55 | required: true 56 | - label: "I'm a SWOC contributor" 57 | required: true 58 | - label: "I have starred the repository" 59 | required: true 60 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.yml: -------------------------------------------------------------------------------- 1 | name: ✨ Feature Request 2 | description: Suggest a feature 3 | title: "✨[feature Request]: " 4 | body: 5 | - type: checkboxes 6 | id: existing-issue 7 | attributes: 8 | label: Is there an existing issue for this? 9 | description: Please search to see if an issue already exists for this feature. 10 | options: 11 | - label: I have searched the existing issues 12 | required: true 13 | - type: textarea 14 | id: feature-description 15 | attributes: 16 | label: Feature Description 17 | description: Please provide a detailed description of the feature you are requesting. 18 | placeholder: Describe the new feature or enhancement you'd like to see. 19 | validations: 20 | required: true 21 | - type: textarea 22 | id: use-case 23 | attributes: 24 | label: Use Case 25 | description: How would this feature enhance your use of the project? 26 | placeholder: Describe a specific use case or scenario where this feature would be beneficial. 27 | validations: 28 | required: true 29 | - type: textarea 30 | id: benefits 31 | attributes: 32 | label: Benefits 33 | description: What benefits would this feature bring to the project or community? 34 | placeholder: Explain the advantages of implementing this feature. 35 | - type: textarea 36 | id: screenShots 37 | attributes: 38 | label: Add ScreenShots 39 | description: If any... 40 | - type: dropdown 41 | id: priority 42 | attributes: 43 | label: Priority 44 | description: How important is this feature to you? 45 | options: 46 | - High 47 | - Medium 48 | - Low 49 | default: 0 50 | validations: 51 | required: true 52 | - type: checkboxes 53 | id: terms 54 | attributes: 55 | label: Record 56 | options: 57 | - label: "I have read the Contributing Guidelines" 58 | required: true 59 | - label: "I'm a SWOC contributor" 60 | required: true 61 | - label: "I have starred the repository" 62 | required: true 63 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 2 | ## Description 3 | 4 | 5 | 6 | ## Related Issues 7 | 8 | 9 | - Closes # 10 | 11 | ## Type of PR 12 | 13 | - [ ] () 14 | 15 | ## Screenshots / videos (if applicable) 16 | 17 | 18 | 19 | ## Checklist 20 | 21 | - [ ] I have gone through the [contributing guide](https://github.com/Anjaliavv51/Retro) 22 | - [ ] I have updated my branch and synced it with project `main` branch before making this PR 23 | - [ ] I have performed a self-review of my code 24 | - [ ] I have tested the changes thoroughly before submitting this pull request. 25 | - [ ] I have provided relevant issue numbers, screenshots, and videos after making the changes. 26 | - [ ] I have commented my code, particularly in hard-to-understand areas. 27 | 28 | 29 | ## Additional context: 30 | 31 | -------------------------------------------------------------------------------- /.github/auto_assign.yml: -------------------------------------------------------------------------------- 1 | addReviewers: true 2 | 3 | addAssignees: false 4 | 5 | reviewers: 6 | - Anjaliavv51 7 | 8 | numberOfReviewers: 1 9 | -------------------------------------------------------------------------------- /.github/holopin.yml: -------------------------------------------------------------------------------- 1 | organization: holopin 2 | holobytes: 3 | - evolvingStickerId: clbvdkq7n864908li0yfj5jnj 4 | alias: holobyte 5 | icon: avocado 6 | -------------------------------------------------------------------------------- /.github/pr-title-checker.json: -------------------------------------------------------------------------------- 1 | { 2 | "LABEL": { 3 | "name": "title needs formatting", 4 | "color": "F9D0C4" 5 | }, 6 | "CHECKS": { 7 | "prefixes": [ 8 | "build: ", 9 | "chore: ", 10 | "docs: ", 11 | "feat: ", 12 | "fix: ", 13 | "perf: ", 14 | "refactor: ", 15 | "revert: ", 16 | "style: ", 17 | "test: " 18 | ] 19 | }, 20 | "MESSAGES": { 21 | "success": "Everything is great. Status: 200", 22 | "failure": "PR title does not conform to the required format. Please use one of the specified prefixes followed by a colon and a space. Status: 400", 23 | "notice": "" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /.github/workflows/action.yml: -------------------------------------------------------------------------------- 1 | name: 'Auto Assign' 2 | on: 3 | pull_request: 4 | types: [opened, ready_for_review] 5 | 6 | jobs: 7 | add-reviews: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: kentaro-m/auto-assign-action@v2.0.0 11 | with: 12 | configuration-path: '.github/auto_assign.yml' 13 | -------------------------------------------------------------------------------- /.github/workflows/assign.yml: -------------------------------------------------------------------------------- 1 | name: Assign Issue to Creator 2 | 3 | on: 4 | issue_comment: 5 | types: [created] 6 | 7 | jobs: 8 | assign-issue: 9 | runs-on: ubuntu-latest 10 | if: contains(github.event.comment.body, '/assign') 11 | steps: 12 | - name: Check commenter permissions 13 | id: check-permissions 14 | uses: actions/github-script@v6 15 | with: 16 | github-token: ${{secrets.GITHUB_TOKEN}} 17 | script: | 18 | const { owner, repo } = context.repo; 19 | const commenter = context.payload.comment.user.login; 20 | 21 | const { data: repoPermission } = await github.rest.repos.getCollaboratorPermissionLevel({ 22 | owner, 23 | repo, 24 | username: commenter, 25 | }); 26 | 27 | const allowedPermissions = ['admin', 'maintain', 'write']; 28 | const hasPermission = allowedPermissions.includes(repoPermission.permission); 29 | 30 | console.log(`Commenter ${commenter} has permission: ${hasPermission}`); 31 | return hasPermission; 32 | 33 | - name: Assign issue to creator 34 | if: steps.check-permissions.outputs.result == 'true' 35 | uses: actions/github-script@v6 36 | with: 37 | github-token: ${{secrets.GITHUB_TOKEN}} 38 | script: | 39 | const { owner, repo } = context.repo; 40 | const issue_number = context.issue.number; 41 | 42 | const { data: issue } = await github.rest.issues.get({ 43 | owner, 44 | repo, 45 | issue_number, 46 | }); 47 | 48 | const creator = issue.user.login; 49 | 50 | await github.rest.issues.addAssignees({ 51 | owner, 52 | repo, 53 | issue_number, 54 | assignees: [creator], 55 | }); 56 | 57 | console.log(`Assigned issue #${issue_number} to creator ${creator}`); -------------------------------------------------------------------------------- /.github/workflows/auto-comment-on-pr-merge.yml: -------------------------------------------------------------------------------- 1 | name: Auto Comment on PR Merge 2 | 3 | on: 4 | pull_request_target: 5 | types: [closed] 6 | 7 | permissions: 8 | issues: write 9 | pull-requests: write 10 | 11 | jobs: 12 | comment: 13 | if: github.event.pull_request.merged == true 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: Add Comment to Merged PR 18 | run: | 19 | COMMENT=$(cat < { 31 | await github.rest.issues.addLabels({ 32 | owner: context.repo.owner, 33 | repo: context.repo.repo, 34 | issue_number: issue.number, 35 | labels: [label] 36 | }); 37 | }; 38 | if (issueBody.includes('documentation') || issueTitle.includes('doc') || issueBody.includes('readme')) { 39 | await addLabel('documentation'); 40 | } 41 | 42 | if (issueBody.includes('feature') || issueBody.includes('enhancement') || issueTitle.includes('add') || issueTitle.includes('implement')) { 43 | await addLabel('enhancement'); 44 | 45 | } 46 | if (issueBody.includes('bug') || issueBody.includes('fix') || issueTitle.includes('fix') || issueTitle.includes('resolve')) { 47 | await addLabel('bug'); 48 | } 49 | -------------------------------------------------------------------------------- /.github/workflows/build-html-pages: -------------------------------------------------------------------------------- 1 | name: Deploy static content to Pages 2 | 3 | on: 4 | push: 5 | branches: ["main"] 6 | workflow_dispatch: 7 | 8 | permissions: 9 | contents: read 10 | pages: write 11 | id-token: write 12 | 13 | concurrency: 14 | group: "pages" 15 | cancel-in-progress: false 16 | 17 | jobs: 18 | deploy: 19 | environment: 20 | name: github-pages 21 | url: ${{ steps.deployment.outputs.page_url }} 22 | runs-on: ubuntu-latest 23 | steps: 24 | - name: Checkout 25 | uses: actions/checkout@v4 26 | - name: Setup Pages 27 | uses: actions/configure-pages@v5 28 | - name: Upload artifact 29 | uses: actions/upload-pages-artifact@v3 30 | with: 31 | # Upload entire repository 32 | path: '.' 33 | - name: Deploy to GitHub Pages 34 | id: deployment 35 | uses: actions/deploy-pages@v4 36 | -------------------------------------------------------------------------------- /.github/workflows/close all issues: -------------------------------------------------------------------------------- 1 | name: Close All Open Issues 2 | 3 | on: 4 | workflow_dispatch: 5 | 6 | jobs: 7 | close_issues: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Checkout code 11 | uses: actions/checkout@v3 12 | 13 | - name: Close open issues 14 | uses: actions/github-script@v6 15 | with: 16 | github-token: ${{ secrets.GITHUB_TOKEN }} 17 | script: | 18 | const { owner, repo } = context.repo; 19 | const issues = await github.rest.issues.listForRepo({ 20 | owner, 21 | repo, 22 | state: 'open' // Only fetch open issues 23 | }); 24 | for (const issue of issues.data) { 25 | await github.rest.issues.update({ 26 | owner, 27 | repo, 28 | issue_number: issue.number, 29 | state: 'closed' 30 | }); 31 | console.log(`Issue #${issue.number} closed.`); 32 | } -------------------------------------------------------------------------------- /.github/workflows/close-old-issue.yml: -------------------------------------------------------------------------------- 1 | name: Close All Issues 2 | 3 | on: 4 | workflow_dispatch: # Allows the workflow to be triggered manually 5 | 6 | permissions: 7 | issues: write # Explicitly grant write permission to issues 8 | 9 | jobs: 10 | close_issues: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - name: Debug Context 15 | uses: actions/github-script@v6 16 | with: 17 | script: | 18 | console.log(`Repository: ${context.repo.owner}/${context.repo.repo}`); 19 | console.log(`Workflow triggered by: ${context.actor}`); 20 | 21 | - name: Fetch and close all open issues 22 | uses: actions/github-script@v6 23 | with: 24 | script: | 25 | const issues = await github.paginate(github.rest.issues.listForRepo, { 26 | owner: context.repo.owner, 27 | repo: context.repo.repo, 28 | state: 'open' // Fetch only open issues 29 | }); 30 | 31 | if (issues.length === 0) { 32 | console.log("No open issues to close."); 33 | } else { 34 | console.log(`Found ${issues.length} open issues.`); 35 | } 36 | 37 | for (const issue of issues) { 38 | if (!issue.pull_request) { // Ensure it’s an issue, not a pull request 39 | await github.rest.issues.update({ 40 | owner: context.repo.owner, 41 | repo: context.repo.repo, 42 | issue_number: issue.number, 43 | state: 'closed' 44 | }); 45 | console.log(`Closed issue #${issue.number}: ${issue.title}`); 46 | } else { 47 | console.log(`Skipped pull request #${issue.number}`); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /.github/workflows/codeql.yml: -------------------------------------------------------------------------------- 1 | name: "CodeQL" 2 | 3 | on: 4 | push: 5 | branches: [ "main" ] 6 | pull_request: 7 | branches: [ "main" ] 8 | schedule: 9 | - cron: '20 12 * * 3' 10 | 11 | jobs: 12 | analyze: 13 | name: Analyze (${{ matrix.language }}) 14 | # Runner size impacts CodeQL analysis time. To learn more, please see: 15 | # - https://gh.io/recommended-hardware-resources-for-running-codeql 16 | # - https://gh.io/supported-runners-and-hardware-resources 17 | # - https://gh.io/using-larger-runners (GitHub.com only) 18 | # Consider using larger runners or machines with greater resources for possible analysis time improvements. 19 | runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} 20 | timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }} 21 | permissions: 22 | # required for all workflows 23 | security-events: write 24 | 25 | # required to fetch internal or private CodeQL packs 26 | packages: read 27 | 28 | # only required for workflows in private repositories 29 | actions: read 30 | contents: read 31 | 32 | strategy: 33 | fail-fast: false 34 | matrix: 35 | include: 36 | - language: javascript-typescript 37 | build-mode: none 38 | # CodeQL supports the following values keywords for 'language': 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' 39 | # Use `c-cpp` to analyze code written in C, C++ or both 40 | # Use 'java-kotlin' to analyze code written in Java, Kotlin or both 41 | # Use 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both 42 | # To learn more about changing the languages that are analyzed or customizing the build mode for your analysis, 43 | # see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning. 44 | # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how 45 | # your codebase is analyzed, see https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/codeql-code-scanning-for-compiled-languages 46 | steps: 47 | - name: Checkout repository 48 | uses: actions/checkout@v4 49 | 50 | # Initializes the CodeQL tools for scanning. 51 | - name: Initialize CodeQL 52 | uses: github/codeql-action/init@v3 53 | with: 54 | languages: ${{ matrix.language }} 55 | build-mode: ${{ matrix.build-mode }} 56 | # If you wish to specify custom queries, you can do so here or in a config file. 57 | # By default, queries listed here will override any specified in a config file. 58 | # Prefix the list here with "+" to use these queries and those in the config file. 59 | 60 | # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs 61 | # queries: security-extended,security-and-quality 62 | 63 | - name: Perform CodeQL Analysis 64 | uses: github/codeql-action/analyze@v3 65 | with: 66 | category: "/language:${{matrix.language}}" 67 | -------------------------------------------------------------------------------- /.github/workflows/greetings.yml: -------------------------------------------------------------------------------- 1 | name: 'Greetings' 2 | 3 | on: 4 | issues: 5 | types: [opened] 6 | pull_request_target: 7 | types: [opened] 8 | permissions: 9 | issues: write 10 | pull-requests: write 11 | 12 | jobs: 13 | welcome: 14 | runs-on: ubuntu-latest 15 | steps: 16 | - uses: actions/checkout@v1 17 | - uses: EddieHubCommunity/gh-action-community/src/welcome@main 18 | with: 19 | github-token: ${{ secrets.GITHUB_TOKEN }} 20 | issue-message: "Hi there! Thanks for opening this issue @${{ github.actor }}!. We appreciate your contribution to this open-source project. We aim to respond or assign your issue as soon as possible.If belong's to SWOC program role ur self as Contributor in OS lead site Link : https://www.oslead.xyz/usertype , so that ur points will be assigned to the leaderboard. 21 | New to Open Source Contribution check out the below YT video , Happy Coding🚀💻🐛 22 | 🔗 Link : https://www.youtube.com/watch?v=3afUKB3guZA" 23 | pr-message: "Great job, @${{ github.actor }}! 🎉 Thank you for submitting your pull request. Your contribution is valuable and we appreciate your efforts to improve our project.We will promptly review your changes and offer feedback. Keep up the excellent work!" 24 | -------------------------------------------------------------------------------- /.github/workflows/pr-checker.yml: -------------------------------------------------------------------------------- 1 | name: PR Issue Checker 2 | 3 | on: 4 | pull_request: 5 | types: [opened, edited] 6 | 7 | jobs: 8 | check_pr_description: 9 | runs-on: ubuntu-latest 10 | 11 | steps: 12 | - name: Checkout code 13 | uses: actions/checkout@v2 14 | 15 | - name: Check PR Description 16 | id: check_pr_description 17 | run: | 18 | PR_DESCRIPTION="${{ github.event.pull_request.body }}" 19 | if [[ -z "$PR_DESCRIPTION" ]]; then 20 | echo "PR description is missing." 21 | exit 1 22 | fi 23 | 24 | # Allow any text before # 25 | if [[ ! "$PR_DESCRIPTION" =~ .*\ #[0-9]+ ]]; then 26 | echo "The PR description should include the issue number assigned to you.⚠️" 27 | echo "##[error]An issue reference like 'Fixed #' must be included in the description." 28 | exit 1 29 | fi 30 | 31 | echo "PR description is valid." 32 | 33 | - name: Output result 34 | run: echo "All checks passed." -------------------------------------------------------------------------------- /.github/workflows/pr-title-checker.yml: -------------------------------------------------------------------------------- 1 | name: 'PR Title Checker' 2 | on: 3 | pull_request_target: 4 | types: 5 | - opened 6 | - edited 7 | - synchronize 8 | - labeled 9 | - unlabeled 10 | 11 | jobs: 12 | check: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: thehanimo/pr-title-checker@v1.3.7 16 | with: 17 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 18 | pass_on_octokit_error: false 19 | configuration_path: '.github/pr-title-checker.json' 20 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Editor-based HTTP Client requests 5 | /httpRequests/ 6 | -------------------------------------------------------------------------------- /.idea/Retro.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "liveServer.settings.port": 5504, 3 | "IDX.aI.enableInlineCompletion": true, 4 | "IDX.aI.enableCodebaseIndexing": true 5 | } 6 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community includes: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | a representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | . 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /Contributing.md: -------------------------------------------------------------------------------- 1 | # Contributing to Retro 2 | 3 | We’re excited that you want to contribute to Retro! The following is a set of guidelines to help you contribute effectively and ensure consistency within the project. 4 | 5 | ## How to Contribute 6 | 7 | ### 1. Fork the Repository 8 | Click on the "Fork" button at the top of the repository’s GitHub page. This will create a copy of the repository in your GitHub account. 9 | 10 | ### 2. Clone the Forked Repository 11 | Clone the forked repository to your local machine using the command below: 12 | 13 | ```bash 14 | git clone https://github.com//Retro 15 | ``` 16 | 17 | ### 3. Add Remote Upstream 18 | Add a remote upstream to keep your fork updated with the original repository: 19 | 20 | ```bash 21 | git remote add upstream https://github.com/original-owner-username/Retro 22 | ``` 23 | 24 | ### 4. Create a New Branch 25 | Before making changes, create a new branch for your work: 26 | 27 | ```bash 28 | git checkout -b 29 | ``` 30 | 31 | ### 5. Make Your Changes 32 | Make the necessary changes to the codebase. 33 | 34 | ### 6. Stage Your Changes 35 | Once you’ve made your changes, stage them for commit: 36 | 37 | ```bash 38 | git add ... 39 | ``` 40 | 41 | ### 7. Commit Your Changes 42 | Commit your changes with a descriptive message: 43 | 44 | ```bash 45 | git commit -m "A meaningful message describing the change" 46 | ``` 47 | 48 | ### 8. Push Your Changes 49 | Push your changes to your forked repository: 50 | 51 | ```bash 52 | git push origin 53 | ``` 54 | 55 | ### 9. Create a Pull Request (PR) 56 | Go to your forked repository on GitHub. You should see a prompt to create a pull request. Compare the changes and create the PR. Ensure to fill in details about the changes you’ve made. 57 | 58 | --- 59 | 60 | ## Guidelines 61 | 62 | ### Reporting Bugs 63 | If you encounter any bugs, feel free to report them. Please ensure you include: 64 | - A clear and descriptive title. 65 | - A description of the issue and how to reproduce it. 66 | - Expected behavior vs. actual behavior. 67 | - Any error messages or logs that might help. 68 | 69 | ### Suggesting Features or Enhancements 70 | We welcome new ideas and suggestions! To propose a new feature: 71 | - Open an issue with a feature request label. 72 | - Provide a clear description of the feature and how it improves the project. 73 | 74 | ### Submitting Code 75 | - Keep your pull requests focused on a single change to make reviews easier. 76 | - Follow the project’s code style. 77 | - Ensure your code is properly tested before submitting. 78 | 79 | ### Commit Message Format 80 | - Use meaningful and descriptive commit messages. 81 | - Use the imperative mood (e.g., "Add feature" instead of "Added feature"). 82 | 83 | ## Development Setup 84 | 85 | To set up a local development environment: 86 | 1. Fork and clone the repository (as mentioned above). 87 | 2. Follow the installation steps in the README to get the project running locally. 88 | 89 | --- 90 | 91 | Thank you for contributing to Retro! We appreciate your time and effort in helping us improve the project. 92 | -------------------------------------------------------------------------------- /Coverpage.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Animated Title and Explore Button 7 | 8 | 9 | 10 | 11 |
12 | Welcome to
13 | 14 | 15 | 16 | Retro World 17 | 18 | 19 | 20 | 21 |
22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Css-files/about.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0px; 3 | padding: 0px; 4 | } 5 | p{ 6 | color: hsl(208, 7%,46%); 7 | } 8 | body { 9 | background-color:black; 10 | background-attachment: fixed; 11 | } 12 | 13 | .head_container:before { 14 | content: ""; 15 | position: absolute; 16 | height: 238px; 17 | width: 100%; 18 | opacity: 0.4; 19 | z-index: -1; 20 | 21 | } 22 | 23 | .head_container_about{ 24 | height:300px; 25 | } 26 | .head_container_about:before { 27 | background-color: hsl(20, 43%, 93%); 28 | background-blend-mode: multiply; 29 | height: 2750px; 30 | width: 2750px; 31 | content: ""; 32 | position: absolute; 33 | height: 300px; 34 | width: 100%; 35 | opacity: 0.4; 36 | z-index: -1; 37 | 38 | } 39 | 40 | .navbar { 41 | padding: 8px 10px; 42 | } 43 | .navbar ul { 44 | overflow: hidden; 45 | } 46 | 47 | .navbar li { 48 | float: left; 49 | list-style: none; 50 | padding: 8px 20px; 51 | } 52 | .navbar li:hover { 53 | opacity: 0.7; 54 | } 55 | 56 | .navbar li a { 57 | padding: 3px 3px; 58 | text-decoration: none; 59 | color: white; 60 | font-size: 1.3rem; 61 | } 62 | .navbarbg { 63 | padding: 8px 0; 64 | background-color: hsl(20, 43%, 93%); 65 | text-align: left; 66 | } 67 | 68 | .navbarbg ul { 69 | display: inline-block; 70 | padding-left: 0; 71 | } 72 | 73 | .navbarbg li { 74 | display: inline-block; 75 | list-style: none; 76 | margin: 0 10px; 77 | } 78 | 79 | .navbarbg li a { 80 | padding: 5px 10px; 81 | text-decoration: none; 82 | color: white; 83 | font-size: 1.3rem; 84 | } 85 | 86 | .navbarbg li:hover { 87 | opacity: 0.7; 88 | } 89 | 90 | 91 | .menu_container { 92 | padding: 55px 70px 30px 70px; 93 | background-color: hsl(20, 43%, 93%); 94 | } 95 | .menu_container h2 { 96 | font-family: Georgia; 97 | font-size: 2rem; 98 | color:rgb(138, 37, 37); 99 | padding-left: 50px; 100 | } 101 | .mainhead { 102 | text-align: center; 103 | padding-top: 30px; 104 | /* padding-bottom: 50px; */ 105 | } 106 | .mainhead h1 { 107 | font-family: Georgia; 108 | font-size: 3rem; 109 | color: white; 110 | padding-bottom: 20px; 111 | } 112 | .head_container_about .mainhead { 113 | text-align: center; 114 | padding-top: 30px; 115 | /* padding-bottom: 210px; */ 116 | } 117 | .but{ 118 | background-color: transparent; 119 | border: none; 120 | } 121 | .but a { 122 | text-decoration: none; 123 | font-size: 1.1rem; 124 | background-color: brown; 125 | color: white; 126 | border: 3px solid rgb(255, 255, 255); 127 | padding: 10px; 128 | border-radius: 10px; 129 | display: inline-block; 130 | 131 | transition: transform 0.3s ease, background-color 0.3s ease, color 0.3s ease; /* Smooth transition */ 132 | } 133 | .but a:hover{ 134 | background-color: #ffffff; 135 | color: brown; 136 | border: 3px solid rgb(165, 42, 42); 137 | transform: scale(1.01); 138 | animation: bounce 0.5s; 139 | } 140 | input[type="submit"] { 141 | background-color: brown; 142 | color: #ffffff !important; 143 | border: 3px solid rgb(255, 255, 255); 144 | padding: 20px 10px !important; 145 | border-radius: 10px; 146 | transition: transform 0.3s ease, background-color 0.3s ease, color 0.3s ease; 147 | } 148 | 149 | input[type="submit"]:hover { 150 | background-color: #ffffff; 151 | color: brown !important; 152 | border: 3px solid rgb(165, 42, 42); 153 | transform: scale(1.01); 154 | animation: bounce 0.5s; 155 | } 156 | 157 | 158 | .butt { 159 | text-decoration: none; 160 | background-color: brown; 161 | border: 3px solid rgb(255, 255, 255); 162 | padding: 15px; 163 | border-radius: 15px; 164 | display: inline-block; 165 | color: white; 166 | transition: transform 0.3s ease, background-color 0.3s ease, color 0.3s ease; /* Smooth transition */ 167 | } 168 | 169 | .butt:hover { 170 | background-color: #ffffff; 171 | color: brown !important; 172 | border: 3px solid rgb(165, 42, 42); 173 | transform: scale(1.01); 174 | animation: bounce 0.5s; 175 | } 176 | @keyframes bounce { 177 | 0%, 100% { 178 | transform: translateY(0); 179 | } 180 | 50% { 181 | transform: translateY(-10px); 182 | } 183 | } 184 | 185 | .menu_items { 186 | display: flex; 187 | justify-content: center; 188 | } 189 | 190 | .menu_items .items { 191 | background-color: #f2f2f2; 192 | box-shadow: 0 0 10px rgba(224, 224, 252, 0.678); 193 | border: 1px solid rgb(186, 186, 201); 194 | padding: 40px; 195 | margin: 5px; 196 | height: 310px; 197 | width: 230px; 198 | border-radius: 10px; 199 | text-align: center; 200 | font-family: "Bree Serif", serif; 201 | } 202 | 203 | .menu_items .items img { 204 | justify-content: center; 205 | height: 190px; 206 | width: 230px; 207 | } 208 | 209 | .menu_items .items h3 { 210 | font-size: 1.1rem; 211 | margin-top: 10px; 212 | } 213 | 214 | .menu_items .items p { 215 | margin-bottom: 20px; 216 | } 217 | 218 | .first_cont { 219 | display: flex; 220 | justify-content: center; 221 | } 222 | 223 | .first_cont .items { 224 | background-color: hsl(20, 43%, 93%); 225 | border: 3px solid rgba(138, 37, 37); 226 | box-shadow: 0 0 20px rgba(138, 37, 37, 0.5); 227 | padding: 25px 10px; 228 | margin: 15px; 229 | height: 270px; 230 | width: 230px; 231 | border-radius: 10px; 232 | text-align: center; 233 | font-family: "Bree Serif", serif; 234 | } 235 | 236 | .first_cont .items img { 237 | justify-content: center; 238 | height: 160px; 239 | width: 200px; 240 | 241 | } 242 | 243 | .first_cont .items h3 { 244 | font-size: 1.2rem; 245 | margin: 10px ; 246 | } 247 | 248 | .first_cont .items p { 249 | margin-bottom: 20px; 250 | } 251 | 252 | /* service */ 253 | .about_container { 254 | background-color: transparent; 255 | background-blend-mode:lighten; 256 | background-repeat: no-repeat; 257 | background-size: cover; 258 | padding: 50px 100px; 259 | } 260 | 261 | .about_container p{ 262 | margin-bottom: 50px; 263 | margin-top: 20px; 264 | } 265 | 266 | div.deals { 267 | display: flex; 268 | border-radius: 15px; 269 | padding:15px 30px; 270 | margin:20px 50px; 271 | text-decoration: none; 272 | background-color: brown; 273 | border: 3px solid rgb(255, 255, 255); 274 | color: white !important; 275 | transition: transform 0.3s ease, background-color 0.3s ease, color 0.3s ease; /* Smooth transition */ 276 | } 277 | div.deals:hover{ 278 | background-color: #ffffff; 279 | color: brown !important; 280 | border: 3px solid rgb(165, 42, 42); 281 | transform: scale(1.01); 282 | animation: bounce 0.5s; 283 | } 284 | .deals p a{ 285 | color: white !important; 286 | } 287 | .deals p a:hover{ 288 | color: brown !important; 289 | } 290 | 291 | .deals p{ 292 | font-size: 1.1rem; 293 | padding-top: 2px; 294 | font-family: "Bree Serif", serif; 295 | } 296 | .deals i{ 297 | margin: 0px 10px; 298 | padding: 0px 10px; 299 | font-size: 2rem; 300 | } 301 | 302 | .section__title{ 303 | text-align: center; 304 | font-size: 2rem; 305 | color:rgb(58, 58, 66); 306 | } 307 | 308 | /* footer */ 309 | .foot-panel2{ 310 | background-color: transparent; 311 | color:white; 312 | height: 300px; 313 | display: flex; 314 | justify-content: space-evenly; 315 | } 316 | 317 | .footer-colums{ 318 | margin-top: 20px; 319 | } 320 | 321 | .footer-colums p{ 322 | font-weight: 700; 323 | } 324 | 325 | .footer-colums a{ 326 | display: block; 327 | font-size: 0.85rem; 328 | margin-top: 10px; 329 | color: #dddddd; 330 | } 331 | 332 | .follow-us{ 333 | margin-bottom: 20px; 334 | } 335 | 336 | .social-icons a { 337 | font-size: 1rem; 338 | padding: 7px; 339 | margin: 7px 6px 0 8px; 340 | text-decoration: none; 341 | /* color: white; */ 342 | } 343 | 344 | .fa-facebook{ 345 | color: hsl(203, 30%, 26%); 346 | font-size: 1rem; 347 | padding: 8px; 348 | margin: 15px; 349 | } 350 | 351 | .fa-facebook:hover { 352 | transform: scale(1.5); 353 | color:#3B5998; 354 | transition: transform 0.2s ease, color 0.2s ease; 355 | } 356 | 357 | .fa-instagram{ 358 | color: hsl(203, 30%, 26%); 359 | font-size: 1rem; 360 | padding: 8px; 361 | margin: 15px; 362 | } 363 | .fa-instagram:hover { 364 | transform: scale(1.5); 365 | color:#D62976; 366 | transition: transform 0.2s ease, color 0.2s ease; 367 | } 368 | .fa-x-twitter{ 369 | color: hsl(203, 30%, 26%); 370 | font-size: 1rem; 371 | padding: 8px; 372 | margin: 15px; 373 | } 374 | .fa-x-twitter:hover { 375 | color:black; 376 | transform: scale(1.5); 377 | transition: transform 0.2s ease, color 0.2s ease; 378 | } 379 | .fa-youtube { 380 | color: hsl(203, 30%, 26%); 381 | font-size: 1rem; 382 | padding: 8px; 383 | margin: 15px; 384 | } 385 | 386 | .fa-youtube:hover { 387 | transform: scale(1.5); 388 | color: #FF0000; 389 | transition: transform 0.2s ease, color 0.2s ease; 390 | } 391 | 392 | .fa-snapchat { 393 | color: hsl(203, 30%, 26%); 394 | font-size: 1rem; 395 | padding: 8px; 396 | margin: 15px; 397 | } 398 | .fa-snapchat:hover { 399 | transform: scale(1.5); 400 | color: #FFFC00; 401 | transition: transform 0.2s ease, color 0.2s ease; 402 | } 403 | 404 | .foot_panel4{ 405 | background-color: transparent; 406 | /* color:hsl(203, 30%, 26%); */ 407 | height: 160px; 408 | /* font-size: 0.9rem; */ 409 | text-align: center; 410 | /* margin-bottom: 8px; */ 411 | } 412 | 413 | 414 | 415 | .pages{ 416 | padding-top: 25px; 417 | } 418 | 419 | .copyright{ 420 | padding-top: 10px; 421 | } 422 | 423 | form { 424 | /*padding-top: 20px;*/ 425 | display: grid; 426 | /*padding-bottom: 100px;*/ 427 | } 428 | 429 | label { 430 | font-weight: bold; 431 | } 432 | 433 | input, 434 | textarea { 435 | height:30px; 436 | width: 120%; 437 | padding: 2.5px; 438 | box-sizing: border-box; 439 | border-radius: 2px; 440 | } 441 | 442 | #butt{ 443 | background-color: brown; 444 | color: white !important; 445 | padding: 3px; 446 | border: 1px solid white; 447 | border-radius: 4px; 448 | cursor: pointer; 449 | } 450 | 451 | #butt :hover { 452 | background-color: rgb(196, 89, 89); 453 | } 454 | 455 | 456 | .cart-section{ 457 | padding: 55px 70px 30px 70px; 458 | background-color: transparent; 459 | display: flex; 460 | justify-content: center; 461 | flex-wrap: wrap; 462 | } 463 | 464 | .cart{ 465 | width: 80%; 466 | background-color: transparent; 467 | text-align: center; 468 | font-family: "Bree Serif", serif; 469 | font-size: 1.2rem; 470 | display: flex; 471 | justify-content: center; 472 | padding: 5%; 473 | } 474 | 475 | .cart table,th,td{ 476 | text-align: center; 477 | border: 2px solid black; 478 | width: 75%; 479 | } 480 | 481 | #bill{ 482 | color: rgb(196, 74, 74); 483 | } 484 | .star-button { 485 | background: none; 486 | border: none; 487 | cursor: pointer; 488 | color: #ccc; 489 | font-size: 15px; 490 | padding: 0; 491 | } 492 | 493 | .star-button:hover, 494 | .star-button:focus { 495 | color: #f1c40f; 496 | outline: none; 497 | } 498 | 499 | .star-button.rated { 500 | color: #f1c40f; 501 | } 502 | .menu_items .items { 503 | position: relative; 504 | } 505 | 506 | 507 | .form-control { 508 | border-radius: 15px; /* Adjust the border radius */ 509 | padding-left: 40px; /* Space for the icon */ 510 | } 511 | 512 | .input-icon { 513 | position: relative; 514 | } 515 | .input-icon i { 516 | position: absolute; 517 | left: 10px; /* Positioning the icon */ 518 | top: 50%; 519 | transform: translateY(-50%); /* Center the icon vertically */ 520 | color: gray; /* Icon color */ 521 | } 522 | .input-icon input, 523 | .input-icon textarea { 524 | padding-left: 30px; /* Adjust padding to create space for the icon */ 525 | } 526 | 527 | #contactForm { 528 | display: flex; 529 | flex-direction: column; 530 | justify-content: center; 531 | align-items: center; 532 | width: 20rem; 533 | height: max-content; 534 | } 535 | 536 | #contactForm input, 537 | #contactForm textarea { 538 | width: 100%; 539 | padding: 20px; 540 | margin: 5px; 541 | border-radius: 10px; 542 | border: none; 543 | } 544 | 545 | 546 | 547 | #contactForm h3 { 548 | height: 30px; 549 | color: #141414; 550 | } 551 | #contactForm textarea { 552 | height: 100px; 553 | resize: none; 554 | } 555 | 556 | #contactForm button { 557 | padding: 10px 20px; 558 | background-color:rgb(196, 74, 74); 559 | color:rgb(15, 14, 14); 560 | border: none; 561 | border-radius: 5px; 562 | cursor: pointer; 563 | margin-top: 5px; 564 | } 565 | 566 | 567 | -------------------------------------------------------------------------------- /Css-files/contributor.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: "Poppins"; 3 | color: #333; 4 | display: flex; 5 | justify-content: center; 6 | align-items: center; 7 | min-height: 100vh; 8 | margin: 0; 9 | } 10 | 11 | .container { 12 | text-align: center; 13 | } 14 | 15 | .title { 16 | display: inline-block; 17 | font-size: 3em; 18 | margin-bottom: 20px; 19 | padding: 10px; 20 | color: #bb0111; 21 | text-shadow: 1px 1px 2px rgb(220, 181, 187), 22 | 0 0 1em rgba(216, 130, 200, 0.617), 0 0 0.2em rgba(237, 233, 238, 0.623); 23 | /* border-radius: 20px; */ 24 | /* background-color: rgba(209, 209, 255, 0.8); */ 25 | } 26 | 27 | .contributors-grid { 28 | display: flex; 29 | flex-wrap: wrap; 30 | gap: 20px; 31 | justify-content: center; 32 | padding: 20px; 33 | gap: 40px; 34 | } 35 | 36 | .contributor-card { 37 | width: 300px; 38 | position: relative; 39 | overflow: hidden; 40 | max-width: calc(55% - 16px); 41 | display: flex; 42 | flex-direction: column; 43 | align-items: center; 44 | background-color: #f9e2f9; 45 | /* border: 1px solid #00ebdf; */ 46 | border-radius: 8px; 47 | box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); 48 | padding: 16px; 49 | transition: transform 0.5s ease-in-out, box-shadow 0.3s ease; 50 | text-decoration: none; 51 | color: inherit; 52 | /* margin-bottom: 16px; */ 53 | } 54 | 55 | .contributor-card:hover { 56 | transform: scale(1.02); 57 | box-shadow: 1px 1px 23px rgba(11, 9, 11, 0.915); 58 | border: none; 59 | cursor: pointer; 60 | } 61 | 62 | .contributor-card::before { 63 | content: ""; 64 | position: absolute; 65 | top: 0; 66 | left: 0; 67 | width: 100%; 68 | height: 100%; 69 | background: linear-gradient(132deg, brown 50%, rgb(206, 203, 203) 51%); 70 | /* background: linear-gradient(130deg, #3b89ff 50%, #eef6ff 50%); */ 71 | transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out; 72 | transform: translate(-100%, -100%); 73 | opacity: 0; 74 | z-index: -1; 75 | } 76 | 77 | .contributor-card:hover::before { 78 | transform: translate(0, 0); 79 | opacity: 1; 80 | } 81 | 82 | .contributor-card img { 83 | border-radius: 50%; 84 | width: 100px; 85 | height: 100px; 86 | object-fit: cover; 87 | margin-bottom: 10px; 88 | transition: box-shadow 0.3s ease-in-out, border 0.1s ease-in-out; 89 | } 90 | 91 | .contributor-card:hover img { 92 | border: 2px solid rgb(255, 234, 0); 93 | box-shadow: -1px 2px 27px rgb(0, 217, 255); 94 | } 95 | 96 | /* 97 | .contributor-card h2 { 98 | margin: 0 0 10px; 99 | } */ 100 | /* 101 | .contributor-card p { 102 | } */ 103 | 104 | .contributor-card h2 { 105 | font-size: 1.2em; 106 | color: #040404; 107 | position: relative; 108 | z-index: 1; 109 | transition: text-shadow 0.3s ease-in-out, color 0.3s ease-in-out; 110 | } 111 | 112 | .contributor-card p { 113 | font-size: 1.2em; 114 | color: #040404; 115 | position: relative; 116 | z-index: 1; 117 | transition: text-shadow 0.3s ease-in-out, color 0.3s ease-in-out; 118 | margin: 0 0 10px; 119 | } 120 | 121 | .contributor-card:hover h2 { 122 | text-shadow: 1px 1px 2px rgb(0, 108, 108), 0 0 0.2em rgb(0, 14, 108), 123 | 0 0 0.8em rgb(0, 14, 108); 124 | color: white; 125 | } 126 | 127 | .contributor-card:hover p { 128 | text-shadow: 1px 1px 2px rgba(4, 0, 127, 0.715), 0 0 0.2em rgb(5, 18, 168), 129 | 0 0 0.3em rgb(134, 136, 250); 130 | color: white; 131 | 132 | /* font-weight: 400; */ 133 | } 134 | 135 | /* dark mode */ 136 | /* Toggle button styles */ 137 | .toggle-container { 138 | position: fixed; /* Change this as needed for positioning */ 139 | top: 25px; 140 | right: 40px; 141 | } 142 | 143 | .toggle { 144 | appearance: none; 145 | outline: none; 146 | cursor: pointer; 147 | width: 100%; 148 | height: 100%; 149 | box-shadow: inset calc(var(--size) * 0.33) calc(var(--size) * -0.25) 0; 150 | border-radius: 999px; 151 | color: hsl(240, 100%, 95%); 152 | transition: all 500ms; 153 | position: absolute; 154 | top: 0; 155 | left: 0; 156 | } 157 | 158 | .toggle:checked { 159 | background-color: #333; 160 | } 161 | .toggle:checked:before { 162 | transform: translateX(25px); 163 | } 164 | 165 | body { 166 | background-color: #f8f9fa; 167 | color: #212529; 168 | } 169 | 170 | .nav-container { 171 | background-color: #ffffff; 172 | } 173 | 174 | .footer { 175 | background-color: #ffffff; 176 | color: #212529; 177 | } 178 | 179 | /* Dark mode styles */ 180 | body.dark-mode { 181 | background-color: #333; 182 | color: #ffffff; 183 | } 184 | 185 | body.dark-mode .nav-container { 186 | background-color: #343a40; 187 | } 188 | 189 | body.dark-mode .footer { 190 | background-color: #343a40; 191 | color: #ffffff; 192 | } 193 | #toggle { 194 | display: inline-block; 195 | border-radius: 50px; 196 | transition: all 0.4s ease-in-out; 197 | padding: 10px 10px; 198 | background-color: transparent; 199 | border: 2px solid #c6c9d8bf; 200 | color: #c6c9d8bf; 201 | font-weight: 600; 202 | font-size: 14px; 203 | letter-spacing: 2px; 204 | text-decoration: none; 205 | } 206 | .toggle-container { 207 | --size: 2rem; 208 | width: var(--size); 209 | height: var(--size); 210 | } 211 | 212 | .toggle { 213 | appearance: none; 214 | outline: none; 215 | cursor: pointer; 216 | width: 100%; 217 | height: 100%; 218 | box-shadow: inset calc(var(--size) * 0.33) calc(var(--size) * -0.25) 0; 219 | border-radius: 999px; 220 | color: hsl(240, 100%, 95%); 221 | transition: all 500ms; 222 | position: absolute; 223 | top: 25px; 224 | right: 0; 225 | 226 | &:checked { 227 | --ray-size: calc(var(--size) * -0.4); 228 | --offset-orthogonal: calc(var(--size) * 0.65); 229 | --offset-diagonal: calc(var(--size) * 0.45); 230 | transform: scale(0.75); 231 | color: hsl(40, 100%, 50%); 232 | box-shadow: inset 0 0 0 var(--size), 233 | calc(var(--offset-orthogonal) * -1) 0 0 var(--ray-size), 234 | var(--offset-orthogonal) 0 0 var(--ray-size), 235 | 0 calc(var(--offset-orthogonal) * -1) 0 var(--ray-size), 236 | 0 var(--offset-orthogonal) 0 var(--ray-size), 237 | calc(var(--offset-diagonal) * -1) calc(var(--offset-diagonal) * -1) 0 238 | var(--ray-size), 239 | var(--offset-diagonal) var(--offset-diagonal) 0 var(--ray-size), 240 | calc(var(--offset-diagonal) * -1) var(--offset-diagonal) 0 var(--ray-size), 241 | var(--offset-diagonal) calc(var(--offset-diagonal) * -1) 0 var(--ray-size); 242 | } 243 | } 244 | 245 | /* Apply fade-down animation to the toggle container */ 246 | .toggle-container[data-aos="fade-down"] { 247 | transition: opacity 500ms ease-in-out; 248 | opacity: 0; 249 | } 250 | 251 | .toggle-container[data-aos="fade-down"].aos-animate { 252 | opacity: 1; 253 | } 254 | body.dark-mode .contributor-card { 255 | background: #0e1525; 256 | } 257 | body.dark-mode .contributor-card p { 258 | color: white; 259 | } 260 | body.dark-mode .contributor-card h2 { 261 | color: white; 262 | } 263 | -------------------------------------------------------------------------------- /Css-files/coverpage.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | } 6 | 7 | body, 8 | html { 9 | height: 100%; 10 | font-family: 'Arial', sans-serif; 11 | } 12 | 13 | .container { 14 | background-image: url('../images/RETRO.png'); 15 | background-size: cover; 16 | background-position: center; 17 | height: 100%; 18 | display: flex; 19 | flex-direction: column; 20 | justify-content: center; 21 | align-items: center; 22 | text-align: center; 23 | position: relative; 24 | /* Ensure container can position children absolutely */ 25 | } 26 | 27 | .explore-btn { 28 | margin-left: 35%; 29 | margin-top: 20px; 30 | padding: 15px 30px; 31 | font-size: 1.6rem; 32 | color: rgb(115, 45, 45); 33 | background-color: #ff6347; 34 | border: none; 35 | border-radius: 15px; 36 | cursor: pointer; 37 | transition: all 0.3s ease-in-out; 38 | animation: pulse 1.5s infinite; 39 | font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif; 40 | } 41 | 42 | .explore-btn:hover { 43 | background-color: #ff4500; 44 | transform: scale(1.1); 45 | } 46 | 47 | @keyframes pulse { 48 | 0% { 49 | transform: scale(1); 50 | } 51 | 52 | 50% { 53 | transform: scale(1.05); 54 | } 55 | 56 | 100% { 57 | transform: scale(1); 58 | } 59 | } 60 | 61 | /* SVG Styles */ 62 | svg { 63 | margin-left: 35%; 64 | font-family: Algerian; 65 | width: 100%; 66 | height: auto; 67 | /* Maintain aspect ratio */ 68 | max-width: 600px; 69 | /* Limit size */ 70 | } 71 | 72 | svg text { 73 | animation: stroke 5s infinite alternate; 74 | stroke-width: 2; 75 | stroke: #582f0e; 76 | font-size: 100px; 77 | } 78 | 79 | @keyframes stroke { 80 | 0% { 81 | fill: rgba(72, 138, 204, 0); 82 | stroke: #582f0e; 83 | stroke-dashoffset: 25%; 84 | stroke-dasharray: 0 50%; 85 | stroke-width: 2; 86 | } 87 | 88 | 70% { 89 | fill: rgba(72, 138, 204, 0); 90 | stroke: rgb(253, 137, 137); 91 | } 92 | 93 | 80% { 94 | fill: rgba(72, 138, 204, 0); 95 | stroke: #582f0e; 96 | stroke-width: 3; 97 | } 98 | 99 | 100% { 100 | fill: #582f0e; 101 | stroke: rgb(0, 0, 0); 102 | stroke-dashoffset: -25%; 103 | stroke-dasharray: 50% 0; 104 | stroke-width: 0; 105 | } 106 | } 107 | 108 | @media screen and (max-width: 1095.54px) { 109 | svg text { 110 | font-size: 100px; 111 | /* Adjust font size for smaller screens */ 112 | 113 | } 114 | } 115 | 116 | .small-text { 117 | font-size: 1.5rem; 118 | /* Smaller font size for "Welcome to" */ 119 | color: rgb(136, 9, 9); 120 | text-transform: uppercase; 121 | text-decoration-thickness: 50px; 122 | font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif; 123 | display: block; 124 | margin-top: 70px; 125 | margin-left: 35%; 126 | } -------------------------------------------------------------------------------- /Css-files/feedback.css: -------------------------------------------------------------------------------- 1 | body { 2 | background: #f6c7c3; 3 | display: flex; 4 | justify-content: center; 5 | align-items: center; 6 | height: 100vh; 7 | } 8 | 9 | .feedback-form { 10 | background: #fff; 11 | font-family:Georgia, 'Times New Roman', Times, serif; 12 | padding: 20px; 13 | border-radius: 8px; 14 | box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); 15 | width: 400px; 16 | } 17 | 18 | .rating { 19 | display: flex; 20 | gap: 5px; 21 | cursor: pointer; 22 | } 23 | 24 | .rating i { 25 | font-size: 1.5rem; 26 | color: #ccc; 27 | } 28 | 29 | .rating i.active { 30 | color: #f39c12; 31 | } 32 | 33 | .submit-btn { 34 | background-color: rgb(138, 37, 37); 35 | color: white; 36 | border: none; 37 | } 38 | 39 | .submit-btn:hover { 40 | background-color:rgb(125, 23, 23); 41 | color: white; 42 | } 43 | 44 | -------------------------------------------------------------------------------- /Css-files/forgotpass1.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Noto+Sans:wght@400;700&display=swap'); 2 | @import url('https://fonts.googleapis.com/css2?family=Philosopher:ital,wght@0,400;0,700;1,400;1,700&display=swap'); 3 | @import url('https://fonts.googleapis.com/css2?family=Philosopher:ital,wght@0,400;0,700;1,400;1,700&family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap'); 4 | 5 | body { 6 | margin: 0; 7 | font-family: 'Noto Sans', sans-serif; 8 | overflow: hidden; 9 | display: flex; 10 | justify-content: center; 11 | align-items: center; 12 | height: 100vh; 13 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1600 800'%3E%3Cg %3E%3Cpath fill='%23ffb9b0' d='M486 705.8c-109.3-21.8-223.4-32.2-335.3-19.4C99.5 692.1 49 703 0 719.8V800h843.8c-115.9-33.2-230.8-68.1-347.6-92.2C492.8 707.1 489.4 706.5 486 705.8z'/%3E%3Cpath fill='%23ffc1b7' d='M1600 0H0v719.8c49-16.8 99.5-27.8 150.7-33.5c111.9-12.7 226-2.4 335.3 19.4c3.4 0.7 6.8 1.4 10.2 2c116.8 24 231.7 59 347.6 92.2H1600V0z'/%3E%3Cpath fill='%23ffc8bf' d='M478.4 581c3.2 0.8 6.4 1.7 9.5 2.5c196.2 52.5 388.7 133.5 593.5 176.6c174.2 36.6 349.5 29.2 518.6-10.2V0H0v574.9c52.3-17.6 106.5-27.7 161.1-30.9C268.4 537.4 375.7 554.2 478.4 581z'/%3E%3Cpath fill='%23ffcfc6' d='M0 0v429.4c55.6-18.4 113.5-27.3 171.4-27.7c102.8-0.8 203.2 22.7 299.3 54.5c3 1 5.9 2 8.9 3c183.6 62 365.7 146.1 562.4 192.1c198.8 51.8 403.4 40.8 597.3-14.8V0H0z'/%3E%3Cpath fill='%23FFD6CE' d='M181.8 259.4c98.2 6 191.9 35.2 281.3 72.1c2.8 1.1 5.5 2.3 8.3 3.4c171 71.6 342.7 158.5 531.3 207.7c198.8 51.8 403.4 40.8 597.3-14.8V0H0v283.2C59 263.6 120.6 255.7 181.8 259.4z'/%3E%3Cpath fill='%23ffdcd4' d='M1600 0H0v136.3c62.3-20.9 127.7-27.5 192.2-19.2c93.6 12.1 180.5 47.7 263.3 89.6c2.6 1.3 5.1 2.6 7.7 3.9c158.4 81.1 319.7 170.9 500.3 223.2c210.5 61 430.8 49 636.6-16.6V0z'/%3E%3Cpath fill='%23ffe1d9' d='M454.9 86.3C600.7 177 751.6 269.3 924.1 325c208.6 67.4 431.3 60.8 637.9-5.3c12.8-4.1 25.4-8.4 38.1-12.9V0H288.1c56 21.3 108.7 50.6 159.7 82C450.2 83.4 452.5 84.9 454.9 86.3z'/%3E%3Cpath fill='%23ffe6df' d='M1600 0H498c118.1 85.8 243.5 164.5 386.8 216.2c191.8 69.2 400 74.7 595 21.1c40.8-11.2 81.1-25.2 120.3-41.7V0z'/%3E%3Cpath fill='%23ffebe4' d='M1397.5 154.8c47.2-10.6 93.6-25.3 138.6-43.8c21.7-8.9 43-18.8 63.9-29.5V0H643.4c62.9 41.7 129.7 78.2 202.1 107.4C1020.4 178.1 1214.2 196.1 1397.5 154.8z'/%3E%3Cpath fill='%23FFF0EA' d='M1315.3 72.4c75.3-12.6 148.9-37.1 216.8-72.4h-723C966.8 71 1144.7 101 1315.3 72.4z'/%3E%3C/g%3E%3C/svg%3E"); 14 | background-size: cover; 15 | } 16 | .circle { 17 | z-index: 998; 18 | width: 20px; 19 | height: 20px; 20 | border-radius: 50%; 21 | pointer-events: none; 22 | animation: colors 5s infinite; 23 | position: fixed; 24 | transform: translate(-50%, -50%); 25 | } 26 | .card-forgot { 27 | width: 60%; 28 | display: flex; 29 | justify-content: center; 30 | align-items: center; 31 | flex-direction: column; 32 | padding: 30px 35px; 33 | border-radius: 20px; 34 | box-shadow: 0px 10px 40px rgba(0, 0, 0, 0.15); 35 | background: rgba(236, 236, 236, 0.8); 36 | backdrop-filter: blur(10px); /* Soft background blur effect */ 37 | animation: fadeIn 2s ease-in-out; 38 | } 39 | 40 | @keyframes fadeIn { 41 | 0% { 42 | opacity: 0; 43 | transform: translateY(30px); 44 | } 45 | 100% { 46 | opacity: 1; 47 | transform: translateY(0); 48 | } 49 | } 50 | .card-forgot h1 { 51 | color: hsl(203, 30%,26%); 52 | font-family: "Philosopher", sans-serif; 53 | text-transform: uppercase; 54 | text-align: center; 55 | } 56 | 57 | .home-btn { 58 | position: absolute; 59 | top: 32px; 60 | font-family: "Philosopher", sans-serif; 61 | left: 30px; 62 | } 63 | 64 | .home-btn a { 65 | font-size: 30px; 66 | text-decoration: none; 67 | color: rgb(134, 78, 112); 68 | position: relative; 69 | transition: color 0.3s ease; /* Smooth color transition */ 70 | } 71 | 72 | .home-btn a:hover { 73 | color: rgb(141, 108, 108); /* Darken color on hover */ 74 | } 75 | 76 | .home-btn a::after { 77 | content: ''; 78 | position: absolute; 79 | width: 100%; 80 | height: 1.5px; 81 | bottom: -5px; 82 | left: 0; 83 | background-color: transparent; 84 | transition: background-color 0.3s ease; /* Smooth transition */ 85 | } 86 | 87 | .home-btn a:hover::after { 88 | background-color: rgb(141, 108, 108); 89 | } 90 | .textfield { 91 | width: 100%; 92 | margin-bottom: 15px; 93 | } 94 | 95 | .textfield > input { 96 | width: 100%; 97 | height: 45px; 98 | border-radius: 15px; 99 | border: 1px solid #b38484; 100 | padding-left: 10px; 101 | outline: none; 102 | transition: border 0.3s ease; /* Smooth border transition */ 103 | } 104 | 105 | .textfield > input:focus { 106 | border: 2px solid #a76666; /* Highlight border on focus */ 107 | } 108 | .btn-reset { 109 | width: 100%; 110 | padding: 10px 0; 111 | border: none; 112 | background-color: #e55d5d; 113 | color: #fff; 114 | font-size: 18px; 115 | font-weight: bold; 116 | border-radius: 10px; 117 | cursor: pointer; 118 | transition: background-color 0.3s ease; 119 | } 120 | 121 | .btn-reset:hover { 122 | background-color: #ff4a4a; 123 | } 124 | 125 | .error-message { 126 | color: red; 127 | font-family: "Poppins", sans-serif; 128 | margin-top: 10px; 129 | } 130 | .switch-link { 131 | text-align: center; 132 | margin-top: 20px; 133 | font-family: "Poppins", sans-serif; 134 | } 135 | 136 | .switch-link a { 137 | color: hsl(0, 100%, 50%); 138 | text-decoration: none; 139 | font-weight: bold; 140 | transition: color 0.3s ease; 141 | } 142 | 143 | .switch-link a:hover { 144 | color: hsl(203, 30%, 26%); 145 | } -------------------------------------------------------------------------------- /Css-files/login-register.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Noto+Sans:wght@400;700&display=swap'); 2 | 3 | body { 4 | margin: 0; 5 | font-family: 'Noto Sans', sans-serif; 6 | overflow: hidden; 7 | display: flex; 8 | justify-content: center; 9 | align-items: center; 10 | height: 100vh; 11 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1600 800'%3E%3Cg %3E%3Cpath fill='%23ffb9b0' d='M486 705.8c-109.3-21.8-223.4-32.2-335.3-19.4C99.5 692.1 49 703 0 719.8V800h843.8c-115.9-33.2-230.8-68.1-347.6-92.2C492.8 707.1 489.4 706.5 486 705.8z'/%3E%3Cpath fill='%23ffc1b7' d='M1600 0H0v719.8c49-16.8 99.5-27.8 150.7-33.5c111.9-12.7 226-2.4 335.3 19.4c3.4 0.7 6.8 1.4 10.2 2c116.8 24 231.7 59 347.6 92.2H1600V0z'/%3E%3Cpath fill='%23ffc8bf' d='M478.4 581c3.2 0.8 6.4 1.7 9.5 2.5c196.2 52.5 388.7 133.5 593.5 176.6c174.2 36.6 349.5 29.2 518.6-10.2V0H0v574.9c52.3-17.6 106.5-27.7 161.1-30.9C268.4 537.4 375.7 554.2 478.4 581z'/%3E%3Cpath fill='%23ffcfc6' d='M0 0v429.4c55.6-18.4 113.5-27.3 171.4-27.7c102.8-0.8 203.2 22.7 299.3 54.5c3 1 5.9 2 8.9 3c183.6 62 365.7 146.1 562.4 192.1c198.8 51.8 403.4 40.8 597.3-14.8V0H0z'/%3E%3Cpath fill='%23FFD6CE' d='M181.8 259.4c98.2 6 191.9 35.2 281.3 72.1c2.8 1.1 5.5 2.3 8.3 3.4c171 71.6 342.7 158.5 531.3 207.7c198.8 51.8 403.4 40.8 597.3-14.8V0H0v283.2C59 263.6 120.6 255.7 181.8 259.4z'/%3E%3Cpath fill='%23ffdcd4' d='M1600 0H0v136.3c62.3-20.9 127.7-27.5 192.2-19.2c93.6 12.1 180.5 47.7 263.3 89.6c2.6 1.3 5.1 2.6 7.7 3.9c158.4 81.1 319.7 170.9 500.3 223.2c210.5 61 430.8 49 636.6-16.6V0z'/%3E%3Cpath fill='%23ffe1d9' d='M454.9 86.3C600.7 177 751.6 269.3 924.1 325c208.6 67.4 431.3 60.8 637.9-5.3c12.8-4.1 25.4-8.4 38.1-12.9V0H288.1c56 21.3 108.7 50.6 159.7 82C450.2 83.4 452.5 84.9 454.9 86.3z'/%3E%3Cpath fill='%23ffe6df' d='M1600 0H498c118.1 85.8 243.5 164.5 386.8 216.2c191.8 69.2 400 74.7 595 21.1c40.8-11.2 81.1-25.2 120.3-41.7V0z'/%3E%3Cpath fill='%23ffebe4' d='M1397.5 154.8c47.2-10.6 93.6-25.3 138.6-43.8c21.7-8.9 43-18.8 63.9-29.5V0H643.4c62.9 41.7 129.7 78.2 202.1 107.4C1020.4 178.1 1214.2 196.1 1397.5 154.8z'/%3E%3Cpath fill='%23FFF0EA' d='M1315.3 72.4c75.3-12.6 148.9-37.1 216.8-72.4h-723C966.8 71 1144.7 101 1315.3 72.4z'/%3E%3C/g%3E%3C/svg%3E"); 12 | background-size: cover; 13 | } 14 | 15 | .main-login { 16 | width: 100vw; 17 | height: 100vh; 18 | display: flex; 19 | justify-content: center; 20 | align-items: center; 21 | gap: 2rem; /* Add spacing between sections */ 22 | } 23 | 24 | .left-login { 25 | width: 50vw; 26 | height: 100vh; 27 | display: flex; 28 | justify-content: center; 29 | align-items: center; 30 | flex-direction: column; 31 | position: relative; 32 | } 33 | 34 | .home-btn { 35 | position: absolute; 36 | top: 32px; 37 | left: 30px; 38 | } 39 | 40 | .home-btn a { 41 | font-size: 30px; 42 | text-decoration: none; 43 | color: rgb(134, 78, 112); 44 | position: relative; 45 | transition: color 0.3s ease; /* Smooth color transition */ 46 | } 47 | 48 | .home-btn a:hover { 49 | color: rgb(141, 108, 108); /* Darken color on hover */ 50 | } 51 | 52 | .home-btn a::after { 53 | content: ''; 54 | position: absolute; 55 | width: 100%; 56 | height: 1.5px; 57 | bottom: -5px; 58 | left: 0; 59 | background-color: transparent; 60 | transition: background-color 0.3s ease; /* Smooth transition */ 61 | } 62 | 63 | .home-btn a:hover::after { 64 | background-color: rgb(141, 108, 108); 65 | } 66 | 67 | .left-login > h1 { 68 | color: #e13838; 69 | font-size: 2.5vw; 70 | text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.1); /* Soft text shadow */ 71 | } 72 | 73 | .left-login-image { 74 | width: 40vw; 75 | animation: float 6s ease-in-out infinite; 76 | } 77 | 78 | @keyframes float { 79 | 0%, 100% { 80 | transform: translateY(0); 81 | } 82 | 50% { 83 | transform: translateY(-10px); 84 | } 85 | } 86 | 87 | .right-login { 88 | width: 50vw; 89 | height: 100vh; 90 | display: flex; 91 | justify-content: center; 92 | align-items: center; 93 | animation: fadeIn 2s ease-in-out; 94 | } 95 | 96 | @keyframes fadeIn { 97 | 0% { 98 | opacity: 0; 99 | transform: translateY(30px); 100 | } 101 | 100% { 102 | opacity: 1; 103 | transform: translateY(0); 104 | } 105 | } 106 | 107 | .card-login { 108 | width: 60%; 109 | display: flex; 110 | justify-content: center; 111 | align-items: center; 112 | flex-direction: column; 113 | padding: 30px 35px; 114 | border-radius: 20px; 115 | box-shadow: 0px 10px 40px rgba(0, 0, 0, 0.15); 116 | background: rgba(236, 236, 236, 0.8); 117 | backdrop-filter: blur(10px); /* Soft background blur effect */ 118 | } 119 | 120 | .card-login > h1 { 121 | color: #de6c6c; 122 | font-size: 2.2vw; 123 | margin-bottom: 20px; 124 | } 125 | 126 | .textfield { 127 | width: 100%; 128 | margin-bottom: 15px; 129 | } 130 | 131 | .textfield > input { 132 | width: 95%; 133 | height: 45px; 134 | border-radius: 15px; 135 | border: 1px solid #b38484; 136 | padding-left: 10px; 137 | outline: none; 138 | transition: border 0.3s ease; /* Smooth border transition */ 139 | } 140 | 141 | .textfield > input:focus { 142 | border: 2px solid #a76666; /* Highlight border on focus */ 143 | } 144 | 145 | .btn-login, 146 | #google-login { 147 | width: 100%; 148 | height: 45px; 149 | border-radius: 15px; 150 | border: none; 151 | margin: 10px; /*Margin added so that they do not overlap*/ 152 | background-color: #be367a; 153 | color: rgb(190, 135, 135); 154 | font-size: 16px; 155 | cursor: pointer; 156 | transition: background-color 0.3s ease, transform 0.3s ease; /* Smooth transitions for hover and active states */ 157 | } 158 | 159 | .btn-login:hover, 160 | #google-login:hover { 161 | background-color: #c3709a; /* Darker shade on hover */ 162 | transform: translateY(-3px); /* Lift effect on hover */ 163 | } 164 | 165 | .btn-login:active, 166 | #google-login:active { 167 | transform: translateY(1px); /* Slight press effect */ 168 | } 169 | 170 | /* Accessibility: Adding focus styles for inputs and buttons */ 171 | .textfield > input:focus { 172 | outline: 2px solid #a45b5b; /* Red outline for focused input */ 173 | } 174 | 175 | .btn-login:focus, 176 | #google-login:focus { 177 | outline: 2px solid #bc8a8a; /* Red outline for focused button */ 178 | } 179 | 180 | /* Loading state for buttons */ 181 | .loading { 182 | pointer-events: none; /* Prevent interactions */ 183 | opacity: 0.6; /* Slightly fade the button */ 184 | } 185 | -------------------------------------------------------------------------------- /Css-files/menu.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Nunito:wght@200;300;400;600;700&display=swap'); 2 | 3 | :root{ 4 | --green: rgb(139, 36, 36);; 5 | --black: rgb(139, 36, 36);; 6 | --light-color:#666; 7 | --box-shadow:0 .5rem 1.5rem rgba(0,0,0,.1); 8 | } 9 | 10 | *{ 11 | font-family: 'Nunito', sans-serif; 12 | margin:0; padding:0; 13 | box-sizing: border-box; 14 | text-decoration: none; 15 | outline: none; border:none; 16 | text-transform: capitalize; 17 | transition: all .2s linear; 18 | } 19 | 20 | html{ 21 | font-size: 62.5%; 22 | overflow-x: hidden; 23 | scroll-padding-top: 5.5rem; 24 | scroll-behavior: smooth; 25 | } 26 | 27 | section{ 28 | padding:2rem 9%; 29 | } 30 | 31 | section:nth-child(even){ 32 | background:#eee; 33 | } 34 | 35 | .sub-heading{ 36 | text-align: center; 37 | color:var(--green); 38 | font-size: 2.5rem; 39 | padding-top: 1rem; 40 | margin-bottom: 10px; 41 | } 42 | 43 | .heading{ 44 | text-align: center; 45 | color:var(--black); 46 | font-size: 3rem; 47 | padding-bottom: 2rem; 48 | text-transform: uppercase; 49 | } 50 | 51 | .btn{ 52 | text-decoration: none; 53 | background-color: brown; 54 | border: 3px solid rgb(255, 255, 255); 55 | padding: 15px 5px; 56 | border-radius: 15px; 57 | display: inline-block; 58 | color: white; 59 | transition: transform 0.3s ease, background-color 0.3s ease, color 0.3s ease; /* Smooth transition */ 60 | } 61 | 62 | .btn:hover{ 63 | background-color: #ffffff; 64 | color: brown !important; 65 | border: 3px solid rgb(165, 42, 42); 66 | transform: scale(1.01); 67 | animation: bounce 0.5s; 68 | } 69 | 70 | 71 | .menu .box-container{ 72 | display: grid; 73 | grid-template-columns: repeat(auto-fit, minmax(30rem, 1fr)); 74 | gap:1.5rem; 75 | } 76 | 77 | .menu .box-container .box{ 78 | background: #fff; 79 | border:.1rem solid rgba(0,0,0,.2); 80 | border-radius: .5rem; 81 | box-shadow: var(--box-shadow); 82 | } 83 | 84 | .menu .box-container .box .image{ 85 | height: 25rem; 86 | width: 100%; 87 | padding:1.5rem; 88 | overflow: hidden; 89 | position: relative; 90 | } 91 | 92 | .menu .box-container .box .image img{ 93 | height: 100%; 94 | width: 100%; 95 | border-radius: .5rem; 96 | object-fit: cover; 97 | } 98 | 99 | .menu .box-container .box .image .fa-heart{ 100 | position: absolute; 101 | top:2.5rem; right: 2.5rem; 102 | height: 5rem; 103 | width: 5rem; 104 | line-height: 5rem; 105 | text-align: center; 106 | font-size: 2rem; 107 | background: #fff; 108 | border-radius: 50%; 109 | color:var(--black); 110 | } 111 | 112 | .menu .box-container .box .image .fa-heart:hover{ 113 | background-color: var(--green); 114 | color:#fff; 115 | } 116 | 117 | .menu .box-container .box .content{ 118 | padding:2rem; 119 | padding-top: 0; 120 | } 121 | .menu .box-container .box:hover{ 122 | scale: 1.04; 123 | box-shadow: solid 1px rgb(139, 36, 36); 124 | border-color: rgb(139, 36, 36); 125 | } 126 | .menu .box-container .box .content .stars{ 127 | padding-bottom: 1rem; 128 | } 129 | 130 | .menu .box-container .box .content .stars i{ 131 | font-size: 1.7rem; 132 | color:var(--green); 133 | } 134 | 135 | .menu .box-container .box .content h3{ 136 | color:var(--black); 137 | font-size: 2.5rem; 138 | } 139 | 140 | .menu .box-container .box .content p{ 141 | color:var(--light-color); 142 | font-size: 1.6rem; 143 | padding:.5rem 0; 144 | line-height: 1.5; 145 | } 146 | 147 | .menu .box-container .box .content .price{ 148 | color:var(--green); 149 | margin-left: 1rem; 150 | font-size: 2.5rem; 151 | } 152 | body{ 153 | background-attachment: fixed; 154 | } 155 | -------------------------------------------------------------------------------- /Css-files/navbarstyles.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: 'Philosopher', sans-serif; 3 | margin: 0; 4 | padding: 0; 5 | } 6 | 7 | /* Navbar styles */ 8 | .navbar { 9 | background-color: rgba(255, 255, 245, 0.8); 10 | padding: 1rem; 11 | display: flex; 12 | width: 100%; 13 | justify-content: space-between; 14 | margin: 10px 1px!important; 15 | border-radius: 20px; 16 | } 17 | 18 | .nav-right { 19 | margin-left: auto; 20 | /* Pushes the login/signup to the right side */ 21 | display: flex; 22 | gap: 15px; 23 | /* Space between login and signup */ 24 | } 25 | 26 | .ms-auto { 27 | margin-left: auto; 28 | /* Pushes to the right */ 29 | } 30 | 31 | .navbar-brand { 32 | font-size: 1.5rem; 33 | color: black; 34 | font-weight: bold; 35 | transition: transform 0.3s ease; 36 | } 37 | 38 | .navbar-brand:hover { 39 | transform: scale(1.6); 40 | } 41 | 42 | .navbar-nav .nav-item { 43 | margin-right: 15px; 44 | } 45 | 46 | .nav-link { 47 | color: black; 48 | font-size: 1rem; 49 | font-family: var(--ff-philosopher); 50 | text-decoration: none; 51 | /* Remove default underline */ 52 | position: relative; 53 | transition: all 0.3s ease; 54 | } 55 | 56 | .nav-item.dropdown .nav-link { 57 | text-decoration: none; 58 | /* No underline for dropdown toggle */ 59 | } 60 | 61 | .nav-link:hover { 62 | text-decoration: none; 63 | /* Prevent default underline on hover */ 64 | } 65 | 66 | .nav-link::after { 67 | content: ''; 68 | position: absolute; 69 | left: 0; 70 | bottom: -5px; 71 | width: 0%; 72 | height: 3.5px; 73 | /* Thicker underline */ 74 | background: transparent; 75 | transition: all 0.3s ease-in-out; 76 | box-shadow: 77 | 0 0 30px rgba(255, 159, 128, 1), 78 | /* Initial glow effect with bright peach color */ 79 | 0 0 60px rgba(255, 159, 128, 1); 80 | /* Increased glow effect */ 81 | } 82 | 83 | .nav-link:hover::after { 84 | background: rgba(243, 187, 183, 1); 85 | width: 100%; 86 | box-shadow: 0 0 20px rgba(243, 187, 183, 1); 87 | } 88 | 89 | .nav-btn { 90 | background: none; 91 | border: none; 92 | font-size: 1rem; 93 | cursor: pointer; 94 | color: black; 95 | text-decoration: none; 96 | position: relative; 97 | } 98 | 99 | .nav-btn:hover { 100 | color: #d2691e; 101 | } 102 | 103 | .nav-btn::after { 104 | content: ''; 105 | position: absolute; 106 | left: 0; 107 | bottom: -5px; 108 | width: 0%; 109 | height: 2px; 110 | background: #ffb6c1; 111 | /* Adjust to match background color */ 112 | transition: all 0.3s ease-in-out; 113 | box-shadow: 0 20px #ffb6c1; 114 | /* Glow effect */ 115 | } 116 | 117 | .nav-link:hover::after { 118 | background: rgba(255, 159, 128, 1); 119 | width: 100%; 120 | box-shadow: 121 | 0 0 25px rgba(255, 159, 128, 1), 122 | 0 0 50px rgba(255, 159, 128, 1); 123 | /* Glow effect with bright peach color */ 124 | } 125 | 126 | .nav-link:hover, 127 | .nav-btn:hover { 128 | color: hwb(327 21% 3%) !important; 129 | } 130 | 131 | .dropdown-menu { 132 | background-color: #ffe5e5; 133 | border: none; 134 | } 135 | 136 | .dropdown-item { 137 | /*color: black;*/ 138 | font-family: var(--ff-philosopher); 139 | } 140 | 141 | .dropdown-item:hover { 142 | background-color: #f0c0a0; 143 | color: #d2691e; 144 | } 145 | 146 | /* Mobile Styles */ 147 | @media (max-width: 768px) { 148 | .navbar-brand { 149 | margin-left: 10px; 150 | } 151 | 152 | .navbar-nav { 153 | text-align: center; 154 | } 155 | 156 | .navbar-toggler { 157 | border: none; 158 | } 159 | 160 | .navbar-toggler-icon { 161 | color: black; 162 | } 163 | 164 | .nav-item { 165 | margin-bottom: 1rem; 166 | } 167 | } -------------------------------------------------------------------------------- /Css-files/popup.css: -------------------------------------------------------------------------------- 1 | 2 | /* Styling for the pop-up */ 3 | .popup { 4 | display: none; 5 | position: fixed; 6 | top: 0; 7 | left: 0; 8 | width: 100%; 9 | height: 100%; 10 | background-color: rgba(0, 0, 0, 0.7); 11 | justify-content: center; 12 | align-items: center; 13 | z-index: 1000; 14 | } 15 | 16 | .popup-content { 17 | display: flex; 18 | flex-wrap: wrap; 19 | background-color: #feaea5; 20 | border-radius: 10px; 21 | max-width: 800px; 22 | height: 450px; 23 | overflow: hidden; 24 | position: relative; 25 | box-shadow: 0 0 15px rgba(0, 0, 0, 0.2); 26 | overflow-y: scroll; 27 | width: 90%; 28 | } 29 | 30 | .popuplogo{ 31 | position: absolute; 32 | top: 0; 33 | right: 12px; 34 | /* height: 50px; */ 35 | margin: 0; 36 | padding: 0.2rem .6rem; 37 | border-radius: 10px; 38 | background-color: #feaea5; 39 | } 40 | /* .popuplogo b{ 41 | margin: 0; 42 | } */ 43 | 44 | .popup-left img { 45 | width: 100%; 46 | height: 100%; 47 | object-fit: cover; 48 | } 49 | .popup-left { 50 | flex-grow: 1; 51 | width: 50%; 52 | min-width: 250px; 53 | } 54 | .popup-right { 55 | padding: 20px; 56 | width: 50%; 57 | display: flex; 58 | flex-direction: column; 59 | align-items: center; 60 | justify-content: center; 61 | flex-grow: 1; 62 | text-align: center; 63 | /* min-width: 300px; */ 64 | } 65 | 66 | .popup h1 { 67 | font-size: 31px; 68 | color: #8B4513; 69 | margin-bottom: 10px; 70 | margin-top: 45px; 71 | padding-top: 10px; 72 | } 73 | 74 | #h2{ 75 | font-size: 18px; 76 | margin-bottom: 16px; 77 | font-weight: bold; 78 | } 79 | 80 | /* h2 { 81 | font-size: 24px; 82 | margin-bottom: 10px; 83 | color: #4B3B2A; 84 | } */ 85 | 86 | .popup-right p{ 87 | margin-bottom: 26px; 88 | color: #4B3B2A; 89 | margin-bottom: 30px; 90 | } 91 | 92 | input[type="email"] { 93 | width: 100%; 94 | padding: 18px; 95 | padding-bottom: 20px; 96 | margin-bottom: 10px; 97 | border: 1px solid #8B4513; 98 | border-radius: 5px; 99 | font-size: 14px; 100 | } 101 | 102 | #emailForm{ 103 | padding-top: 0px; 104 | padding-bottom: 0px; 105 | } 106 | 107 | .signup-btn { 108 | width: 100%; 109 | padding: 10px 0; 110 | background-color: #8B4513; 111 | color: white; 112 | border: none; 113 | border-radius: 5px; 114 | cursor: pointer; 115 | font-size: 13px; 116 | } 117 | 118 | .signup-btn:hover { 119 | background-color: #6f3920; 120 | font-size: 13.2px; 121 | } 122 | 123 | .no-thanks { 124 | display: block; 125 | margin-top: 14px; 126 | color: #4B3B2A; 127 | text-decoration: none; 128 | margin-bottom: 40px; 129 | } 130 | 131 | .no-thanks:hover { 132 | text-decoration: underline; 133 | color: #381d0a; 134 | } 135 | 136 | .terms { 137 | margin-top: 15px; 138 | font-size: 10px; 139 | color: #4B3B2A; 140 | } 141 | 142 | .terms a { 143 | color: #8B4513; 144 | } 145 | -------------------------------------------------------------------------------- /Favicon image/31Y4VOw6STS._AC_SY580_.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/31Y4VOw6STS._AC_SY580_.jpg -------------------------------------------------------------------------------- /Favicon image/60658ce0a6734f66d2b84740_1617267936777.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/60658ce0a6734f66d2b84740_1617267936777.jpg -------------------------------------------------------------------------------- /Favicon image/check-mark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/check-mark.png -------------------------------------------------------------------------------- /Favicon image/credit.avif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/credit.avif -------------------------------------------------------------------------------- /Favicon image/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/favicon-16x16.png -------------------------------------------------------------------------------- /Favicon image/favicon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/favicon-192x192.png -------------------------------------------------------------------------------- /Favicon image/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/favicon-32x32.png -------------------------------------------------------------------------------- /Favicon image/favicon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/favicon-512x512.png -------------------------------------------------------------------------------- /Favicon image/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/favicon.ico -------------------------------------------------------------------------------- /Favicon image/french-style-antique-black-dressing-table-set-500x500.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/french-style-antique-black-dressing-table-set-500x500.webp -------------------------------------------------------------------------------- /Favicon image/google-pay-logo-2020.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Favicon image/hero02_aa0c3ccb-58f4-4368-b1e6-8c96cbefc872_1024x1024.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/hero02_aa0c3ccb-58f4-4368-b1e6-8c96cbefc872_1024x1024.webp -------------------------------------------------------------------------------- /Favicon image/il_fullxfull.4810524436_b94v.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/il_fullxfull.4810524436_b94v.webp -------------------------------------------------------------------------------- /Favicon image/im.png: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Favicon image/images (1).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/images (1).jpg -------------------------------------------------------------------------------- /Favicon image/images (2).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/images (2).jpg -------------------------------------------------------------------------------- /Favicon image/images (3).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/images (3).jpg -------------------------------------------------------------------------------- /Favicon image/images (4).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/images (4).jpg -------------------------------------------------------------------------------- /Favicon image/images (5).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/images (5).jpg -------------------------------------------------------------------------------- /Favicon image/images (6).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/images (6).jpg -------------------------------------------------------------------------------- /Favicon image/images (7).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/images (7).jpg -------------------------------------------------------------------------------- /Favicon image/images (8).jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/images (8).jpg -------------------------------------------------------------------------------- /Favicon image/images.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/images.jpg -------------------------------------------------------------------------------- /Favicon image/phonepe-icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Favicon image/still-image-old-camera-equipment-600nw-2097355165.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/still-image-old-camera-equipment-600nw-2097355165.webp -------------------------------------------------------------------------------- /Favicon image/vintage-radio-receiver-antique-wooden-260nw-1420023938.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Favicon image/vintage-radio-receiver-antique-wooden-260nw-1420023938.webp -------------------------------------------------------------------------------- /Html-files/booknow.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Retro 7 | 8 | 105 | 106 | 107 |
108 |

Retro

109 |

Celebrating Vintage Elegance

110 |
111 |
112 |
113 |

Our Services

114 |

At Retro, we specialize in preserving the charm of the past through our collection of vintage items. Our services include:

115 |
    116 |
  • Restoration of vintage vehicles
  • 117 |
  • Curated collections of antique weapons
  • 118 |
  • Sales of classic cars and motorcycles
  • 119 |
  • Historical artifact procurement
  • 120 |
  • Expert appraisals and valuations
  • 121 |
  • Vintage furniture sales and restoration
  • 122 |
  • Antique jewelry collection
  • 123 |
  • Classic book sales
  • 124 |
  • Retro fashion and accessories
  • 125 |
  • Vintage electronics and gadgets
  • 126 |
127 |
128 | 181 |
182 |
183 |

© Retro. All Rights Reserved.

184 |
185 | 189 | 195 | 201 |
202 | 203 | 204 | 205 | 206 | -------------------------------------------------------------------------------- /Html-files/cart.js: -------------------------------------------------------------------------------- 1 | document.addEventListener('DOMContentLoaded', () => { 2 | loadCartFromLocalStorage(); 3 | updateBadgeCount(); // Update badge on load 4 | if (document.getElementById('cart-items')) { 5 | document.getElementById('cart-items').addEventListener('click', (event) => { 6 | if (event.target.classList.contains('increase-quantity')) { 7 | updateQuantity(event.target, 1); 8 | } else if (event.target.classList.contains('decrease-quantity')) { 9 | updateQuantity(event.target, -1); 10 | } 11 | updateCart(); // Update total price when quantity changes 12 | }); 13 | } 14 | 15 | const cartTable = document.getElementById('cart-table'); 16 | 17 | // Function to update the total individual price and bill 18 | function updateCart() { 19 | const cartItems = document.querySelectorAll('.cart-item'); 20 | let totalAmount = 0; 21 | 22 | cartItems.forEach(item => { 23 | const price = parseFloat(item.dataset.productPrice); 24 | const quantityElement = item.querySelector('.quantity'); 25 | const quantity = parseInt(quantityElement.textContent, 10); 26 | const totalIndividualPrice = price * quantity; 27 | 28 | // Add or update the total individual price column 29 | let totalCell = item.querySelector('.total-individual-price'); 30 | if (!totalCell) { 31 | totalCell = document.createElement('td'); 32 | totalCell.classList.add('total-individual-price'); 33 | item.appendChild(totalCell); 34 | } 35 | totalCell.textContent = `$${totalIndividualPrice.toFixed(2)}`; 36 | 37 | totalAmount += totalIndividualPrice; 38 | }); 39 | 40 | // Update the cart total 41 | document.getElementById('cart-total').textContent = `Total: $${totalAmount.toFixed(2)}`; 42 | } 43 | 44 | // Initial update on page load 45 | updateCart(); 46 | }); 47 | 48 | function loadCartFromLocalStorage() { 49 | const cartItems = JSON.parse(localStorage.getItem('cartItems')) || []; 50 | const cartItemsContainer = document.getElementById('cart-items'); 51 | if (cartItemsContainer) { 52 | cartItemsContainer.innerHTML = ''; // Clear existing items 53 | 54 | cartItems.forEach(item => { 55 | const cartItemRow = document.createElement('tr'); 56 | cartItemRow.className = 'cart-item'; 57 | cartItemRow.setAttribute('data-product-id', item.id); 58 | cartItemRow.setAttribute('data-product-price', item.price); 59 | cartItemRow.innerHTML = ` 60 | ${item.name} 61 | $${item.price.toFixed(2)} 62 | ${item.quantity} 63 | 64 | 65 | 66 | 67 | `; 68 | cartItemsContainer.appendChild(cartItemRow); 69 | }); 70 | 71 | updateTotal(); 72 | } 73 | } 74 | 75 | function updateQuantity(button, change) { 76 | const cartItemRow = button.parentElement.parentElement; 77 | const quantityElement = cartItemRow.querySelector('.quantity'); 78 | const newQuantity = parseInt(quantityElement.textContent) + change; 79 | if (newQuantity > 0) { 80 | quantityElement.textContent = newQuantity; 81 | } else { 82 | cartItemRow.remove(); 83 | } 84 | updateTotal(); 85 | saveCartToLocalStorage(); 86 | } 87 | 88 | function updateTotal() { 89 | const cartItems = document.querySelectorAll('.cart-item'); 90 | let total = 0; 91 | cartItems.forEach(item => { 92 | const price = parseFloat(item.getAttribute('data-product-price')); 93 | const quantity = parseInt(item.querySelector('.quantity').textContent); 94 | total += price * quantity; 95 | }); 96 | document.getElementById('cart-total').textContent = `Total: $${total.toFixed(2)}`; 97 | } 98 | 99 | function saveCartToLocalStorage() { 100 | const cartItems = []; 101 | document.querySelectorAll('.cart-item').forEach(item => { 102 | cartItems.push({ 103 | id: item.getAttribute('data-product-id'), 104 | name: item.querySelector('td').textContent, // Fetch the item name from the first 105 | price: parseFloat(item.getAttribute('data-product-price')), 106 | quantity: parseInt(item.querySelector('.quantity').textContent) 107 | }); 108 | }); 109 | localStorage.setItem('cartItems', JSON.stringify(cartItems)); 110 | updateBadgeCount(); // Update badge count after saving 111 | } 112 | 113 | // Function to generate a random coupon code 114 | const generateCouponCode = () => { 115 | const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; 116 | let couponCode = ''; 117 | for (let i = 0; i < 8; i++) { 118 | couponCode += characters.charAt(Math.floor(Math.random() * characters.length)); 119 | } 120 | return couponCode; 121 | }; 122 | 123 | // Check if it's the user's first order and apply discount 124 | const applyFirstTimeDiscount = () => { 125 | let couponCode = localStorage.getItem('couponCode'); 126 | if (!couponCode) { 127 | couponCode = generateCouponCode(); 128 | localStorage.setItem('couponCode', couponCode); 129 | } 130 | if (document.getElementById('couponCode')) { 131 | document.getElementById('couponCode').innerHTML = `Use coupon code ${couponCode} for 30% off!`; 132 | alert(`Congratulations! Your coupon code is ${couponCode}. You've received a 30% discount on your first order.`); 133 | } 134 | }; 135 | 136 | window.onload = applyFirstTimeDiscount; 137 | 138 | function updateBadgeCount() { 139 | const cartItems = JSON.parse(localStorage.getItem('cartItems')) || []; 140 | const totalQuantity = cartItems.reduce((total, item) => total + item.quantity, 0); 141 | document.getElementById('badgeCount').innerText = totalQuantity; 142 | } 143 | -------------------------------------------------------------------------------- /Html-files/contributor.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Contributors 7 | 8 | 15 | 19 | 23 | 27 | 28 | 55 | 56 | 57 |
58 |
59 | 60 |
61 |

Our Contributors

62 |
63 |
64 | 67 | 93 | 94 | 105 | 106 |
107 | 108 | 109 | 110 | 111 | -------------------------------------------------------------------------------- /Html-files/contributor.js: -------------------------------------------------------------------------------- 1 | document.addEventListener("DOMContentLoaded", () => { 2 | const contributorsContainer = document.getElementById("contributors"); 3 | 4 | async function fetchContributors() { 5 | try { 6 | const response = await fetch( 7 | `https://api.github.com/repos/Anjaliavv51/Retro/contributors` 8 | ); 9 | const contributors = await response.json(); 10 | 11 | contributorsContainer.innerHTML = ""; 12 | contributors.forEach((contributor) => { 13 | const contributorCard = document.createElement("div"); 14 | contributorCard.className = "contributor-card"; 15 | 16 | contributorCard.innerHTML = ` 17 | 18 | ${contributor.login} 19 | 20 |

${contributor.login}

21 |

Contributions: ${contributor.contributions}

22 | `; 23 | 24 | contributorsContainer.appendChild(contributorCard); 25 | }); 26 | } catch (error) { 27 | console.error("Error fetching contributors:", error); 28 | } 29 | } 30 | 31 | fetchContributors(); 32 | }); 33 | 34 | // Dark mode (remains unchanged) 35 | document.addEventListener("DOMContentLoaded", () => { 36 | const toggleCheckbox = document.getElementById("themeToggle"); 37 | const body = document.body; 38 | 39 | if (localStorage.getItem("dark-mode") === "enabled") { 40 | body.classList.add("dark-mode"); 41 | toggleCheckbox.checked = true; 42 | } else { 43 | toggleCheckbox.checked = false; 44 | } 45 | 46 | toggleCheckbox.addEventListener("change", () => { 47 | if (toggleCheckbox.checked) { 48 | body.classList.add("dark-mode"); 49 | localStorage.setItem("dark-mode", "enabled"); 50 | } else { 51 | body.classList.remove("dark-mode"); 52 | localStorage.setItem("dark-mode", "disabled"); 53 | } 54 | }); 55 | }); 56 | -------------------------------------------------------------------------------- /Html-files/faviconimage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Html-files/faviconimage.png -------------------------------------------------------------------------------- /Html-files/feedback.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Retro 7 | 8 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 |
24 | 25 | Back to home 26 | 27 | 28 |
29 | 30 |
31 |
32 |
33 | Share your thoughts with us. 34 |
35 | would love to hear from you. 36 |
37 |
38 | 79 |
80 |
81 |
82 | 83 | 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /Html-files/forgot-pass.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Retro - Forgot Password 10 | 11 | 12 | 13 | 14 |
15 |
16 |

Forgot Password

17 |
18 |
19 | 20 | 21 |
22 | 23 |

24 |
25 | 26 |
27 |
28 |
29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /Html-files/logged.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Retro 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 65 | 66 | 67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |







90 |

Loged in!


91 |
92 | 158 | 164 | 170 |
171 | 172 | 173 | 174 | 175 | -------------------------------------------------------------------------------- /Html-files/menu.js: -------------------------------------------------------------------------------- 1 | 2 | function rateItem(button, rating) { 3 | const starButtons = button.parentElement.querySelectorAll('.star-button'); 4 | 5 | starButtons.forEach((starButton, index) => { 6 | if (index < rating) { 7 | starButton.classList.add('rated'); 8 | } else { 9 | starButton.classList.remove('rated'); 10 | } 11 | }); 12 | } 13 | 14 | document.querySelectorAll('.add-to-cart-button').forEach(button => { 15 | button.addEventListener('click', function() { 16 | const productId = this.getAttribute('data-product-id'); 17 | const productName = this.getAttribute('data-product-name'); 18 | const productPrice = parseFloat(this.getAttribute('data-product-price')); 19 | 20 | let cartItems = JSON.parse(localStorage.getItem('cartItems')) || []; 21 | 22 | // Check if the item already exists in the cart 23 | const existingItemIndex = cartItems.findIndex(item => item.id === productId); 24 | if (existingItemIndex !== -1) { 25 | // If it exists, increment the quantity 26 | cartItems[existingItemIndex].quantity += 1; 27 | } else { 28 | // If it does not exist, add new item 29 | cartItems.push({ 30 | id: productId, 31 | name: productName, 32 | price: productPrice, 33 | quantity: 1 34 | }); 35 | } 36 | 37 | // Save updated cart to localStorage 38 | localStorage.setItem('cartItems', JSON.stringify(cartItems)); 39 | 40 | addedToCartDisplay(productId) ; 41 | 42 | // Optionally, you can show a message or confirmation 43 | //alert(`Item has been added to the cart successfully.`); 44 | }); 45 | }); 46 | 47 | const addedMessageTimeouts = {} ; 48 | 49 | function addedToCartDisplay(productId){ 50 | let matchingProductId ; 51 | document.querySelectorAll(`.js-added-to-cart`).forEach((item) => { 52 | const currentProductId = item.dataset.productId ; 53 | if(currentProductId === productId){ 54 | matchingProductId = productId ; 55 | item.classList.add('js-display-added-to-cart') ; 56 | } 57 | }); 58 | const prevTimeoutId = addedMessageTimeouts[matchingProductId] ; 59 | if(prevTimeoutId){ 60 | clearTimeout(prevTimeoutId) ; 61 | } 62 | 63 | const timeoutId = setTimeout(()=> { 64 | document.querySelectorAll(`.js-added-to-cart`).forEach((item) => { 65 | const currentProductId = item.dataset.productId ; 66 | if(currentProductId === productId){ 67 | matchingProductId = productId ; 68 | item.classList.remove('js-display-added-to-cart') ; 69 | } 70 | }); 71 | },2000); 72 | 73 | addedMessageTimeouts[matchingProductId] = timeoutId ; 74 | 75 | } 76 | 77 | -------------------------------------------------------------------------------- /Html-files/scriptlogin.js: -------------------------------------------------------------------------------- 1 | import { initializeApp } from "https://www.gstatic.com/firebasejs/10.11.1/firebase-app.js"; 2 | import { getAuth, GoogleAuthProvider, signInWithPopup } from "https://www.gstatic.com/firebasejs/10.11.1/firebase-auth.js"; 3 | 4 | const firebaseConfig = { 5 | apiKey: "AIzaSyDx_FcoL3XJryt6BInhOaDsMKiSmxzrYBI", 6 | authDomain: "fir-7f3dd.firebaseapp.com", 7 | projectId: "fir-7f3dd", 8 | storageBucket: "fir-7f3dd.appspot.com", 9 | messagingSenderId: "467011865433", 10 | appId: "1:467011865433:web:e23be9d0cc3496bb961a48" 11 | }; 12 | 13 | const app = initializeApp(firebaseConfig); 14 | const auth = getAuth(app); 15 | auth.languageCode = 'en'; 16 | 17 | const provider = new GoogleAuthProvider(); 18 | 19 | const googleLogin = document.getElementById("google-login"); 20 | googleLogin.addEventListener("click", function(){ 21 | signInWithPopup(auth, provider) 22 | .then((result) => { 23 | const credential = GoogleAuthProvider.credentialFromResult(result); 24 | const user = result.user; 25 | console.log(user); 26 | window.location.href = "logged.html"; 27 | }).catch((error) => { 28 | const errorCode = error.code; 29 | const errorMessage = error.message; 30 | }); 31 | }); -------------------------------------------------------------------------------- /Html-files/scriptsignup.js: -------------------------------------------------------------------------------- 1 | import { initializeApp } from "https://www.gstatic.com/firebasejs/10.11.1/firebase-app.js"; 2 | import { getAuth, GoogleAuthProvider, signInWithPopup } from "https://www.gstatic.com/firebasejs/10.11.1/firebase-auth.js"; 3 | 4 | const firebaseConfig = { 5 | apiKey: "AIzaSyDx_FcoL3XJryt6BInhOaDsMKiSmxzrYBI", 6 | authDomain: "fir-7f3dd.firebaseapp.com", 7 | projectId: "fir-7f3dd", 8 | storageBucket: "fir-7f3dd.appspot.com", 9 | messagingSenderId: "467011865433", 10 | appId: "1:467011865433:web:e23be9d0cc3496bb961a48" 11 | }; 12 | 13 | const app = initializeApp(firebaseConfig); 14 | const auth = getAuth(app); 15 | auth.languageCode = 'en'; 16 | 17 | const provider = new GoogleAuthProvider(); 18 | 19 | document.getElementById("google-login").addEventListener("click", function() { 20 | signInWithPopup(auth, provider) 21 | .then((result) => { 22 | const credential = GoogleAuthProvider.credentialFromResult(result); 23 | const user = result.user; 24 | console.log(user); 25 | window.location.href = "signed.html"; 26 | }).catch((error) => { 27 | console.error("Error during Google sign-in:", error); 28 | }); 29 | }); 30 | 31 | document.getElementById("signup-form").addEventListener("submit", function(event) { 32 | event.preventDefault(); // Prevent form from submitting the default way 33 | const name = document.getElementById("name").value; 34 | const email = document.getElementById("email").value; 35 | const password = document.getElementById("password").value; 36 | 37 | const nameError = document.getElementById("name-error"); 38 | const passwordError = document.getElementById("password-error"); 39 | const emailError = document.getElementById("email-error"); 40 | 41 | // Reset error messages 42 | nameError.textContent = ""; 43 | passwordError.textContent = ""; 44 | emailError.textContent = ""; 45 | 46 | // Regex to prevent <, >, ", or / in the name and password 47 | const spcharexp = /[<>"/]/; 48 | 49 | let valid = true; // A flag to track validation status 50 | 51 | // Name validation 52 | if (spcharexp.test(name)) { 53 | nameError.textContent = "Name cannot contain <, >, \", or /"; 54 | valid = false; 55 | } 56 | 57 | // Password validation 58 | if (spcharexp.test(password)) { 59 | passwordError.textContent = "Password cannot contain <, >, \", or /"; 60 | valid = false; 61 | } 62 | 63 | if (validateForm(name, email, password) && valid) { 64 | // Simulate a successful registration (Replace with actual Firebase sign-up logic) 65 | console.log("Form submitted with:", { name, email, password }); 66 | window.location.href = "../Html-files/signed.html"; 67 | } 68 | }); 69 | 70 | function validateForm(name, email, password) { 71 | if (name === "" || email === "" || password === "") { 72 | alert("All fields are required!"); 73 | return false; 74 | } 75 | if (!validateEmail(email)) { 76 | alert("Please enter a valid email address."); 77 | return false; 78 | } 79 | if (password.length < 8) { 80 | alert("Password must be at least 8 characters long."); 81 | return false; 82 | } 83 | return true; 84 | } 85 | 86 | function validateEmail(email) { 87 | const re = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; 88 | return re.test(email); 89 | } -------------------------------------------------------------------------------- /Html-files/signed.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Retro 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 73 | 74 | 75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 | 98 |







99 |

Signed in!


100 |
101 | 166 | 172 | 178 |
179 | 180 | 181 | 182 | 183 | -------------------------------------------------------------------------------- /Images/Login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/Login.png -------------------------------------------------------------------------------- /Images/Loginsave.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/Loginsave.png -------------------------------------------------------------------------------- /Images/RETRO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/RETRO.png -------------------------------------------------------------------------------- /Images/acsa.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Images/biryani.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/biryani.jpg -------------------------------------------------------------------------------- /Images/booking.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/booking.png -------------------------------------------------------------------------------- /Images/candy.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/candy.jpg -------------------------------------------------------------------------------- /Images/customer-service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/customer-service.png -------------------------------------------------------------------------------- /Images/download-on-the-app-store.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/download-on-the-app-store.png -------------------------------------------------------------------------------- /Images/ecommerce.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/ecommerce.png -------------------------------------------------------------------------------- /Images/get_it_on_google_play_store.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/get_it_on_google_play_store.png -------------------------------------------------------------------------------- /Images/plate_mismatch.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/plate_mismatch.jpg -------------------------------------------------------------------------------- /Images/popup.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/popup.jpg -------------------------------------------------------------------------------- /Images/signup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/signup.png -------------------------------------------------------------------------------- /Images/train-3803_256.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/Images/train-3803_256.gif -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Lakshmi Pavananjali 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 | 5 | #

Retro

6 | 7 |

An online platform providing items of vintage collections!

8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 |
Stars🍴 Forks Issues Open PRs Closed PRs
StarsForksIssuesOpen Pull RequestsClosed Pull Requests
31 |
32 | 33 | # 🎥Demo 34 | 35 | https://github.com/user-attachments/assets/9fbd2c41-09e1-4843-88d5-5ee2e64de43d 36 | 37 | 38 | # Table of Contents 39 | 40 | 1. [Featured In](#featured-in) 41 | 2. [About Us](#about-us) 42 | 3. [Tech Stack](#tech-stack) 43 | 4. [Installation Instructions](#installation-instructions) 44 | 5. [Contributing](#contributing) 45 | 6. [Website Preview](#website-preview) 46 | 7. [Our Contributors](#our-contributors) 47 | 8. [Stargazers](#stargazers) 48 | 9. [Forkers](#forkers) 49 | 10. [Code of Conduct](#code-of-conduct) 50 | 11. [License](#license) 51 | 52 | 53 | 54 | ## RocketFeatured In [![Open Source Love svg1](https://badges.frapsoft.com/os/v1/open-source.svg?v=103)](https://github.com/ellerbrock/open-source-badges/) 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 |
Event LogoEvent NameEvent Description
SWOCSocial Winter of Code Season-5 (SWOC) 2024-2025

Social Winter Of Code is the 2 month long open source program, with the aim to introduce more and more people to the world of Open source. In this program all the selected participants will get a chance to work on various exciting projects under the guidance of experienced Mentors.

GSSoC 24GirlScript Summer of Code 2024'EXTDGirlScript Summer of Code is a three-month-long Open Source Program conducted every summer by GirlScript Foundation. It is an initiative to bring more beginners to Open-Source Software Development.
Hacktoberfest 2024Hacktoberfest 2024Hacktoberfest is a month-long celebration of open source software run by DigitalOcean, GitHub, and Twilio. It encourages contributions to open source projects and promotes a global community of developers.
79 | 80 | ## RocketAbout Us 81 |

82 | Welcome to RETRO! 🌕✨ We invite you to explore the vintage look, a unique journey through timeless designs and aesthetics. Our platform celebrates the elegance of the past, blending classic styles with modern usability to create a seamless, visually stunning experience. 83 | 84 | At Retro, we believe that beauty lies in the details, and our website reflects a passion for vintage-inspired design that transports you to a world where nostalgia meets innovation. Whether you're here for inspiration, design exploration, or simply to immerse yourself in a vintage ambiance, we aim to make your experience truly special. 85 | 86 | Discover the charm of the past and embrace a sophisticated, artistic vibe that never goes out of style. Join us, and let's relive the beauty of the bygone eras, one step at a time! 🌸🕰️ 87 | 88 | It is an online platform which enables you to get information about your vintage collections and to place the orders.

89 | 90 | ##

High VoltageTech Stack

91 | HTML5

HTML5 structures the website's content, enabling modern multimedia support and semantic layout.


JavaScript

JavaScript adds interactivity, making the site dynamic with features like form validation and real-time content updates.


Bootstrap

Bootstrap provides a responsive framework with pre-built components for consistent design across devices.


CSS3

CSS3 styles the website, enhancing its appearance and ensuring an adaptive layout.


92 | 93 |

94 | 95 | ##

RocketInstallation Instructions

96 | 97 | Follow the steps below to set up and run the project locally: 98 | 99 | ## 1. Clone the Repository 100 | Clone the repository to your local machine using the following command: 101 | ```bash 102 | git clone https://github.com/Anjaliavv51/Retro.git 103 | ``` 104 | 105 | ## 2. Run the Frontend 106 | The frontend is a static application. To run it: 107 | 1. Navigate to the frontend folder (if applicable) or locate the `index.html` file in the project root. 108 | 2. Open the `index.html` file in your browser. 109 | 110 | 111 | ## 3. Run the Backend 112 | 113 | ### 1. Prerequisites 114 | Before running the backend, ensure the following software is installed on your machine: 115 | - **Node.js**: Install a compatible version for the project. [Download Node.js](https://nodejs.org/) 116 | - **Git**: Version control system. [Download Git](https://git-scm.com/) 117 | - **pnpm**: A fast, disk-efficient Node.js package manager. 118 | 119 | Install pnpm globally using npm: 120 | ```bash 121 | npm install -g pnpm 122 | ``` 123 | 124 | Verify the installation by checking the version: 125 | ```bash 126 | pnpm --version 127 | ``` 128 | 129 | 130 | ### 2. Navigate to Backend 131 | Change your directory to the backend folder: 132 | ```bash 133 | cd backend 134 | ``` 135 | 136 | 137 | ### 3. Create a `.env` File 138 | In the `backend` folder, create a `.env` file to store environment variables: 139 | ```bash 140 | touch .env 141 | ``` 142 | 143 | 144 | ### 4. Configure Environment Variables 145 | Add the following variables to the `.env` file: 146 | ```env 147 | PORT=3000 148 | MONGODB_URL=ADD YOUR MONGODB ATLAS DRIVER CONNECTION STRING 149 | SECRET=INPUT YOUR SECRET KEY. SAMPLE: MYSECRET123 150 | ``` 151 | 152 | ### 5. MongoDB URL Setup 153 | To get the MongoDB URL, follow these steps: 154 | 1. **Login to MongoDB Atlas**: [MongoDB Atlas Login](https://account.mongodb.com/account/login?nds=true) 155 | 2. **Create a New Project**: 156 | - In your MongoDB Atlas account, create a new project. 157 | 3. **Create a New Cluster**: 158 | - Under the newly created project, create a new cluster. 159 | 4. **Create a New Database**: 160 | - Inside the cluster, create a new database named `retro_db`. 161 | 5. **Get the Connection String**: 162 | - Click on the cluster, select **Connect**, and retrieve the connection string. 163 | - Replace `` and `` with your MongoDB Atlas credentials. 164 | Example: 165 | ```bash 166 | mongodb+srv://:@cluster....mongodb.net/retro_db 167 | ``` 168 | 169 | 170 | ## **4. Start the Backend** 171 | 1. Install dependencies using `pnpm`: 172 | ```bash 173 | pnpm install 174 | ``` 175 | 2. Start the backend server: 176 | ```bash 177 | pnpm start 178 | ``` 179 | 3. The backend should now be running on `http://localhost:3000`. 180 | 181 |
182 | 183 | ## Contributing 184 | 185 | >⚠️Before contributing to this project, be sure to read and adhere to the [Contributing Guidelines](https://github.com/Anjaliavv51/Retro/blob/main/Contributing.md). 186 | 187 | Thank you for considering contributing to [Retro](https://github.com/Anjaliavv51/Retro). We welcome and appreciate contributions from the community! 188 | 189 | If you find a bug, have a feature request, or would like to contribute in any way, feel free to open an issue or submit a pull request. Whether you're enhancing the technical documentaion or adding a new feature, your efforts are valued, and together we can make this project even better. Thank you for considering contributing to [Retro](https://github.com/Anjaliavv51/Retro)! 190 | 191 |
192 | 193 | ## Website Preview📸 194 |
195 | 196 | 197 | 198 | 199 | 🌐 **Visit our website:** [Retro](https://rococo-mooncake-0d89f7.netlify.app/) 200 |
201 | 202 | ##

Our Contributors Red Heart

203 |

Thank you for contributing to our repository

204 | 205 | 206 | 207 | 208 | ## Stargazers 209 | 210 |
211 | 212 | [![Stargazers repo roster for @Anjaliavv51/Retro](https://reporoster.com/stars/Anjaliavv51/Retro)](https://github.com/Anjaliavv51/Retro/stargazers) 213 | 214 |
215 | 216 | ## Forkers 217 | 218 | [![Forkers repo roster for @Anjaliavv51/Retro](https://reporoster.com/forks/Anjaliavv51/Retro)](https://github.com/Anjaliavv51/Retro/network/members) 219 | 220 | # Code of Conduct 221 | We are committed to fostering a welcoming and inclusive environment for everyone. All contributors and participants are expected to uphold the following values: 222 | 223 | - Be respectful of different viewpoints and experiences. 224 | - Show empathy toward others. 225 | - Use inclusive language. 226 | 227 | Please read and follow our [Code of Conduct](CODE_OF_CONDUCT.md) to foster an inclusive community. 228 | If anyone violates these standards, they may be banned from the community. 229 | 230 | ## License 📜 231 | 232 | This project is licensed under the MIT License. For more details, see the [LICENSE](LICENSE.txt) file. 233 | 234 |
239 | 240 |
241 |

242 | If you find this project helpful, please consider giving it a star!

243 |

244 | -------------------------------------------------------------------------------- /RETRO.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/RETRO.png -------------------------------------------------------------------------------- /about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/about.png -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env -------------------------------------------------------------------------------- /backend/app.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | 4 | const authRouter = require('./router/authRoute.js'); 5 | const databaseconnect = require('./config/databaseConfig.js'); 6 | const cookieParser = require('cookie-parser'); 7 | const cors = require('cors'); 8 | const csrf = require('csurf'); 9 | const rateLimit = require('express-rate-limit'); 10 | 11 | // Initialize CSRF Protection 12 | const csrfProtect = csrf({ cookie: true }); 13 | 14 | // Define a rate limiter 15 | const limiter = rateLimit({ 16 | windowMs: 15 * 60 * 1000, // 15 minutes 17 | max: 100, // Limit each IP to 100 requests per windowMs 18 | message: 'Too many requests from this IP, please try again later.', 19 | }); 20 | 21 | // Connect to DB 22 | databaseconnect(); 23 | 24 | // Middleware 25 | app.use(express.json()); 26 | app.use(cookieParser()); 27 | app.use(cors({ origin: [process.env.CLIENT_URL], credentials: true })); 28 | 29 | // Expose CSRF token to client 30 | app.get('/csrf-token', csrfProtect, (req, res) => { 31 | res.json({ csrfToken: req.csrfToken() }); 32 | }); 33 | 34 | // Auth routes 35 | app.use('/api/auth', csrfProtect, limiter, authRouter); 36 | 37 | // Global error handler 38 | app.use((err, req, res, next) => { 39 | if (err.code === 'EBADCSRFTOKEN') { 40 | res.status(403).json({ error: 'Invalid CSRF token' }); 41 | } else { 42 | res.status(500).json({ error: 'Something went wrong' }); 43 | } 44 | }); 45 | 46 | module.exports = app; 47 | -------------------------------------------------------------------------------- /backend/config/databaseConfig.js: -------------------------------------------------------------------------------- 1 | const mongoose = require("mongoose"); 2 | require('dotenv').config(); 3 | const MONGODB_URL = 4 | process.env.MONGODB_URL || "mongodb://localhost:27017/my_database"; 5 | 6 | // mongoDb database connection 7 | const databaseconnect = () => { 8 | mongoose 9 | .connect(MONGODB_URL) 10 | .then((conn) => console.log(`connected to DB: ${conn.connection.host}`)) 11 | .catch((err) => console.log(err.message)); 12 | }; 13 | 14 | module.exports = databaseconnect; 15 | -------------------------------------------------------------------------------- /backend/controller/authController.js: -------------------------------------------------------------------------------- 1 | const userModel = require('../model/userSchema.js'); 2 | const bcrypt = require('bcrypt'); 3 | 4 | const emailValidator = require('email-validator'); 5 | 6 | /****************************************************** 7 | * @SIGNUP 8 | * @route /api/auth/signup 9 | * @method POST 10 | * @description singUp function for creating new user 11 | * @body name, email, password, confirmPassword 12 | * @returns User Object 13 | ******************************************************/ 14 | 15 | const signUp = async (req, res, next) => { 16 | const { name, email, password, confirmPassword } = req.body; 17 | // console.log(name, email, password, confirmPassword); 18 | /// every field is required 19 | if (!name || !email || !password || !confirmPassword) { 20 | return res.status(400).json({ 21 | success: false, 22 | message: 'Every field is required', 23 | }); 24 | } 25 | 26 | //validate email using npm package "email-validator" 27 | const validEmail = emailValidator.validate(email); 28 | if (!validEmail) { 29 | return res.status(400).json({ 30 | success: false, 31 | message: 'Please provide a valid email address 📩', 32 | }); 33 | } 34 | 35 | try { 36 | /// send password not match err if password !== confirmPassword 37 | if (password !== confirmPassword) { 38 | return res.status(400).json({ 39 | success: false, 40 | message: 'password and confirm Password does not match ❌', 41 | }); 42 | } 43 | 44 | const userInfo = new userModel(req.body); 45 | 46 | // userSchema "pre" middleware functions for "save" will hash the password using bcrypt 47 | // before saving the data into the database 48 | const result = await userInfo.save(); 49 | return res.status(200).json({ 50 | success: true, 51 | message: 'Registered successfully', 52 | data: result, 53 | }); 54 | } catch (error) { 55 | /// send the message of the email is not unique. 56 | if (error.code === 11000) { 57 | return res.status(400).json({ 58 | success: false, 59 | message: `Account already exist with the provided email ${email} 😒`, 60 | }); 61 | } 62 | 63 | return res.status(400).json({ 64 | message: error.message, 65 | }); 66 | } 67 | }; 68 | 69 | /****************************************************** 70 | * @SIGNIN 71 | * @route /api/auth/signin 72 | * @method POST 73 | * @description verify user and send cookie with jwt token 74 | * @body email , password 75 | * @returns User Object , cookie 76 | ******************************************************/ 77 | 78 | const signIn = async (req, res, next) => { 79 | const { email, password } = req.body; 80 | // console.log(email,password) 81 | 82 | // send response with error message if email or password is missing 83 | if (!email || !password) { 84 | return res.status(400).json({ 85 | success: false, 86 | message: 'email and password are required', 87 | }); 88 | } 89 | 90 | try { 91 | // check user exist or not 92 | const user = await userModel 93 | .findOne({ 94 | email, 95 | }) 96 | .select('+password'); 97 | 98 | // If user is null or the password is incorrect return response with error message 99 | if (!user || !(await bcrypt.compare(password, user.password))) { 100 | // bcrypt.compare returns boolean value 101 | return res.status(400).json({ 102 | success: false, 103 | message: 'invalid credentials', 104 | }); 105 | } 106 | 107 | // Create jwt token using userSchema method( jwtToken() ) 108 | const token = user.jwtToken(); 109 | user.password = undefined; 110 | 111 | const cookieOption = { 112 | secure: true, 113 | maxAge: 24 * 60 * 60 * 1000, //24hr 114 | httpOnly: true, // not able to modify the cookie in client side 115 | }; 116 | 117 | res.cookie('token', token, cookieOption); 118 | res.status(200).json({ 119 | success: true, 120 | message: 'Login successful', 121 | data: user, 122 | token, 123 | }); 124 | } catch (error) { 125 | return res.status(400).json({ 126 | success: false, 127 | message: error.message, 128 | }); 129 | } 130 | }; 131 | 132 | /****************************************************** 133 | * @LOGOUT 134 | * @route /api/auth/logout 135 | * @method GET 136 | * @description Remove the token form cookie 137 | * @returns logout message and cookie without token 138 | ******************************************************/ 139 | 140 | const logout = async (req, res, next) => { 141 | try { 142 | const cookieOption = { 143 | expires: new Date(Date.now()), // current expiry date 144 | httpOnly: true, // cookie cannot be modified in client-side JS 145 | secure: process.env.NODE_ENV === 'production', // secure cookie if in production 146 | sameSite: 'None', // allows cross-site cookie sharing if needed 147 | }; 148 | 149 | // Remove the token from the cookie by setting it to null 150 | res.cookie('token', null, cookieOption); 151 | 152 | return res.status(200).json({ 153 | success: true, 154 | message: 'Logged out successfully', 155 | }); 156 | } catch (error) { 157 | res.status(400).json({ 158 | success: false, 159 | message: error.message, 160 | }); 161 | } 162 | }; 163 | 164 | /****************************************************** 165 | * @GETUSER 166 | * @route /api/auth/user 167 | * @method GET 168 | * @description retrieve user data from mongoDb if user is valid(jwt auth) 169 | * @returns User Object 170 | ******************************************************/ 171 | 172 | const getUser = async (req, res, next) => { 173 | try { 174 | // Assuming that `req.user.id` has been set in the jwtAuth middleware 175 | const userId = req.user.id; 176 | 177 | // Find the user by ID from the database (ensure you're using the correct model) 178 | const user = await userModel.findById(userId); 179 | 180 | if (!user) { 181 | return res.status(404).json({ 182 | success: false, 183 | message: 'User not found', 184 | }); 185 | } 186 | 187 | return res.status(200).json({ 188 | success: true, 189 | data: user, 190 | }); 191 | } catch (error) { 192 | return res.status(400).json({ 193 | success: false, 194 | message: error.message, 195 | }); 196 | } 197 | }; 198 | 199 | module.exports = { 200 | signUp, 201 | signIn, 202 | getUser, 203 | logout, 204 | }; 205 | -------------------------------------------------------------------------------- /backend/index.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); 2 | const PORT = process.env.PORT || 5000; 3 | 4 | 5 | const app = require('./app.js'); 6 | app.listen(PORT,()=>{ 7 | console.log(`server is listening at http://localhost:${PORT}`); 8 | }) -------------------------------------------------------------------------------- /backend/middleware/jwtAuth.js: -------------------------------------------------------------------------------- 1 | const JWT = require('jsonwebtoken'); 2 | 3 | // Middleware to check for a valid JWT token 4 | const jwtAuth = (req, res, next) => { 5 | // Check if the token is in the cookies or the Authorization header 6 | const token = req.cookies?.token || req.headers?.authorization?.split(' ')[1]; // Bearer 7 | 8 | if (!token) { 9 | return res.status(400).json({ 10 | success: false, 11 | message: 'Not authorized, no token provided', 12 | }); 13 | } 14 | 15 | try { 16 | // Verify the token using the secret key 17 | const payload = JWT.verify(token, process.env.SECRET); 18 | 19 | // Attach the payload data to the request object (i.e., user data) 20 | req.user = { id: payload.id, email: payload.email }; 21 | 22 | next(); 23 | } catch (error) { 24 | return res.status(400).json({ 25 | success: false, 26 | message: 'Token verification failed: ' + error.message, 27 | }); 28 | } 29 | }; 30 | 31 | module.exports = jwtAuth; 32 | -------------------------------------------------------------------------------- /backend/model/userSchema.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose'); 2 | const { Schema } = mongoose; 3 | const crypto = require('crypto'); 4 | const bcrypt = require('bcrypt'); 5 | const JWT = require('jsonwebtoken'); 6 | 7 | const userSchema = new Schema( 8 | { 9 | name: { 10 | type: String, 11 | require: [true, 'user name is Required'], 12 | 13 | trim: true, 14 | }, 15 | email: { 16 | type: String, 17 | required: [true, 'user email is required'], 18 | unique: true, 19 | lowercase: true, 20 | unique: [true, 'already registered'], 21 | }, 22 | password: { 23 | type: String, 24 | select: false, 25 | }, 26 | forgotPasswordToken: { 27 | type: String, 28 | }, 29 | forgotPasswordExpiryDate: { 30 | type: Date, 31 | }, 32 | }, 33 | { timestamps: true } 34 | ); 35 | 36 | // Hash password before saving to the database 37 | userSchema.pre('save', async function (next) { 38 | // If password is not modified then do not hash it 39 | if (!this.isModified('password')) return next(); 40 | this.password = await bcrypt.hash(this.password, 10); 41 | return next(); 42 | }); 43 | 44 | // FIXME: Check if these methods are working as expected 45 | userSchema.methods = { 46 | //method for generating the jwt token 47 | jwtToken() { 48 | return JWT.sign( 49 | { id: this._id, email: this.email }, 50 | process.env.SECRET, 51 | { expiresIn: '24h' } // 24 hours 52 | ); 53 | }, 54 | 55 | //userSchema method for generating and return forgotPassword token 56 | getForgotPasswordToken() { 57 | const forgotToken = crypto.randomBytes(20).toString('hex'); 58 | //step 1 - save to DB 59 | this.forgotPasswordToken = crypto 60 | .createHash('sha256') 61 | .update(forgotToken) 62 | .digest('hex'); 63 | 64 | /// forgot password expiry date 65 | this.forgotPasswordExpiryDate = Date.now() + 20 * 60 * 1000; // 20min 66 | 67 | //step 2 - return values to user 68 | return forgotToken; 69 | }, 70 | }; 71 | 72 | const userModel = mongoose.model('user', userSchema); 73 | module.exports = userModel; 74 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backend", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "nodemon /backend/index.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "backend": "file:", 15 | "bcrypt": "^5.1.1", 16 | "cookie-parser": "^1.4.6", 17 | "cors": "^2.8.5", 18 | "csurf": "^1.11.0", 19 | "dotenv": "^16.4.5", 20 | "email-validator": "^2.0.4", 21 | "express": "^4.21.2", 22 | "express-rate-limit": "^7.5.0", 23 | "jsonwebtoken": "^9.0.2", 24 | "mongoose": "^8.9.3", 25 | "nodemon": "^3.1.5" 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /backend/router/authRoute.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const authRouter = express.Router(); 3 | const jwtAuth = require('../middleware/jwtAuth.js'); 4 | 5 | const { 6 | signUp, 7 | signIn, 8 | forgotPassword, 9 | resetPassword, 10 | getUser, 11 | logout, 12 | } = require('../controller/authController.js'); 13 | 14 | authRouter.post('/signup', signUp); 15 | authRouter.post('/signin', signIn); 16 | authRouter.post('/logout', jwtAuth, logout); 17 | authRouter.get('/user', jwtAuth, getUser); 18 | 19 | module.exports = authRouter; 20 | -------------------------------------------------------------------------------- /cart.js: -------------------------------------------------------------------------------- 1 | function addItemToCart() { 2 | var itemName = localStorage.getItem('itemName'); 3 | var itemPrice = localStorage.getItem('itemPrice'); 4 | addToCart(itemName, itemPrice); 5 | } 6 | 7 | const addToCart = function(name, price){ 8 | let cartItems = localStorage.getItem('cartItems'); 9 | cartItems = cartItems ? JSON.parse(cartItems) : []; 10 | if(name==null && price==null) return; 11 | const existingItem = cartItems.find(item => item.name === name); 12 | if (!existingItem) { 13 | cartItems.push({ name, price }); 14 | localStorage.setItem('cartItems', JSON.stringify(cartItems)); 15 | console.log(cartItems); 16 | } 17 | 18 | updateCartDisplay(); 19 | calculateBill(); 20 | 21 | } 22 | 23 | const updateCartDisplay = function() { 24 | const cartBody = document.querySelector(".items"); 25 | cartBody.innerHTML = ''; 26 | let cartItems = localStorage.getItem('cartItems'); 27 | cartItems = cartItems ? JSON.parse(cartItems) : []; 28 | 29 | cartItems.forEach(item => { 30 | const cartRow = document.createElement("tr"); 31 | const cartItemName = document.createElement("td"); 32 | const cartItemPrice = document.createElement("td"); 33 | cartItemName.innerText = item.name; 34 | cartItemPrice.innerText = item.price; 35 | cartItemPrice.classList.add("price"); 36 | cartRow.appendChild(cartItemName); 37 | cartRow.appendChild(cartItemPrice); 38 | cartBody.appendChild(cartRow); 39 | }); 40 | } 41 | 42 | 43 | // calculate total bill amount 44 | let total = 0; 45 | const calculateBill = ()=>{ 46 | itemPrices = document.querySelectorAll(".price"); 47 | for (p of itemPrices){ 48 | if (p!=null){ 49 | console.log(p.innerText); 50 | total += parseFloat(p.innerText.replace('$','')); 51 | } 52 | } 53 | 54 | console.log(total); 55 | if(total!=0 && !isNaN(total)){ 56 | document.getElementById("bill").innerText = "$" + total.toFixed(2) 57 | } 58 | 59 | } 60 | 61 | document.addEventListener('DOMContentLoaded', function () { 62 | addItemToCart(); 63 | }); 64 | 65 | let orderBtn = document.querySelector(".butt"); 66 | orderBtn.addEventListener("click", ()=>{ 67 | if(total==0){ 68 | alert("Please add something in the cart to place the order"); 69 | } 70 | else{ 71 | 72 | alert("Order placed!"); 73 | } 74 | }) 75 | 76 | // Prioritizing Image Loading 77 | 101 | 102 | -------------------------------------------------------------------------------- /codeforcloseofallissues.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | # Replace these with your details 4 | #GITHUB_TOKEN = "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" 5 | REPO_OWNER = "Anjaliavv51" 6 | REPO_NAME = "Retro" 7 | 8 | # GitHub API URL 9 | API_URL = f"https://api.github.com/repos/Anjaliavv51/Retro/issues" 10 | 11 | # Set up headers for authentication 12 | headers = { 13 | "Authorization": f"token {GITHUB_TOKEN}", 14 | "Accept": "application/vnd.github+json" 15 | } 16 | 17 | # Fetch open issues 18 | response = requests.get(API_URL, headers=headers, params={"state": "open"}) 19 | if response.status_code == 200: 20 | issues = response.json() 21 | for issue in issues: 22 | issue_number = issue["number"] 23 | close_url = f"{API_URL}/{issue_number}" 24 | close_response = requests.patch(close_url, headers=headers, json={"state": "closed"}) 25 | if close_response.status_code == 200: 26 | print(f"Issue #{issue_number} closed.") 27 | else: 28 | print(f"Failed to close issue #{issue_number}: {close_response.status_code}") 29 | else: 30 | print(f"Failed to fetch issues: {response.status_code}") 31 | -------------------------------------------------------------------------------- /collaborative_filtering.py: -------------------------------------------------------------------------------- 1 | from surprise import Dataset, Reader, SVD 2 | from surprise.model_selection import train_test_split, accuracy 3 | 4 | # Load data from database 5 | data = cursor.execute('SELECT user_id, item_id, interaction_type FROM user_interactions').fetchall() 6 | 7 | # Convert to Surprise dataset 8 | reader = Reader(rating_scale=(1, 5)) 9 | dataset = Dataset.load_from_df(pd.DataFrame(data, columns=['user_id', 'item_id', 'interaction_type']), reader) 10 | 11 | # Train-test split 12 | trainset, testset = train_test_split(dataset, test_size=0.25) 13 | 14 | # Train model 15 | algo = SVD() 16 | algo.fit(trainset) 17 | 18 | # Test model 19 | predictions = algo.test(testset) 20 | accuracy.rmse(predictions) 21 | -------------------------------------------------------------------------------- /collection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/collection.png -------------------------------------------------------------------------------- /content_based_filtering.py: -------------------------------------------------------------------------------- 1 | from sklearn.feature_extraction.text import TfidfVectorizer 2 | from sklearn.metrics.pairwise import linear_kernel 3 | 4 | # Example item descriptions 5 | items = [ 6 | {'id': 101, 'description': 'Vintage camera from the 1950s'}, 7 | {'id': 102, 'description': 'Classic vinyl record'}, 8 | {'id': 103, 'description': 'Retro gaming console'} 9 | ] 10 | 11 | # Create TF-IDF matrix 12 | tfidf = TfidfVectorizer(stop_words='english') 13 | tfidf_matrix = tfidf.fit_transform([item['description'] for item in items]) 14 | 15 | # Compute cosine similarity 16 | cosine_sim = linear_kernel(tfidf_matrix, tfidf_matrix) 17 | 18 | # Function to get recommendations 19 | def get_recommendations(item_id, cosine_sim=cosine_sim): 20 | idx = next(index for (index, d) in enumerate(items) if d["id"] == item_id) 21 | sim_scores = list(enumerate(cosine_sim[idx])) 22 | sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True) 23 | sim_scores = sim_scores[1:4] 24 | item_indices = [i[0] for i in sim_scores] 25 | return [items[i]['id'] for i in item_indices] 26 | 27 | # Example usage 28 | print(get_recommendations(101)) 29 | -------------------------------------------------------------------------------- /dark-mode/dark-mode.css: -------------------------------------------------------------------------------- 1 | .navbar { 2 | transition: background-color 0.3s, color 0.3s; 3 | } 4 | 5 | .navbar .navbar-brand, 6 | .navbar .nav-link { 7 | font-family: var(--ff-philosopher); 8 | color: black; 9 | } 10 | 11 | .navbar .nav-link:hover { 12 | color: #007bff; 13 | } 14 | 15 | 16 | .dark-mode { 17 | } 18 | 19 | .dark-mode .navbar .navbar-brand, 20 | .dark-mode .navbar .nav-link { 21 | color: white !important; 22 | } 23 | 24 | 25 | #darkModeToggle { 26 | display: flex; 27 | align-items: center; 28 | background-color: #f8f9fa; 29 | color: black; 30 | border: none; 31 | border-radius: 5px; 32 | padding: 8px 12px; 33 | transition: background-color 0.3s, color 0.3s; 34 | } 35 | 36 | #darkModeToggle:hover { 37 | background-color: #e2e6ea; 38 | } 39 | 40 | #darkModeToggle .fas { 41 | margin-right: 5px; 42 | font-size: 20px; 43 | } 44 | 45 | .dark-mode #darkModeToggle { 46 | background-color: #495057; 47 | color: white !important; 48 | } 49 | 50 | .dark-mode #darkModeToggle:hover { 51 | background-color: #6c757d; 52 | ; 53 | } 54 | 55 | .dark-mode #darkModeToggle .fas { 56 | color: #f8f9fa; 57 | } 58 | 59 | 60 | .fas { 61 | transition: color 0.3s; 62 | } 63 | 64 | .dark-overlay { 65 | position: absolute; 66 | width: 100%; 67 | height: 100%; 68 | background: rgba(0, 0, 0, 0); /* Transparent in light mode */ 69 | transition: background 0.3s ease-in-out; 70 | } 71 | 72 | /* Dark mode */ 73 | .dark-mode .dark-overlay { 74 | background: rgba(0, 0, 0, 0.5); /* Darkens background */ 75 | } 76 | 77 | .dark-mode .intro_container img { 78 | filter: brightness(0.5) contrast(1.2); /* Darkens image */ 79 | } 80 | 81 | .dark-mode .intro_container { 82 | background: linear-gradient(to bottom, #3a3a3a, #121212); /* Darker theme */ 83 | } 84 | 85 | body.dark-mode { 86 | background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 1600 800'%3E%3Cg %3E%3Cpath fill='%231E1E1E' d='M486 705.8c-109.3-21.8-223.4-32.2-335.3-19.4C99.5 692.1 49 703 0 719.8V800h843.8c-115.9-33.2-230.8-68.1-347.6-92.2C492.8 707.1 489.4 706.5 486 705.8z'/%3E%3Cpath fill='%23252525' d='M1600 0H0v719.8c49-16.8 99.5-27.8 150.7-33.5c111.9-12.7 226-2.4 335.3 19.4c3.4 0.7 6.8 1.4 10.2 2c116.8 24 231.7 59 347.6 92.2H1600V0z'/%3E%3Cpath fill='%232B2B2B' d='M478.4 581c3.2 0.8 6.4 1.7 9.5 2.5c196.2 52.5 388.7 133.5 593.5 176.6c174.2 36.6 349.5 29.2 518.6-10.2V0H0v574.9c52.3-17.6 106.5-27.7 161.1-30.9C268.4 537.4 375.7 554.2 478.4 581z'/%3E%3Cpath fill='%23333333' d='M0 0v429.4c55.6-18.4 113.5-27.3 171.4-27.7c102.8-0.8 203.2 22.7 299.3 54.5c3 1 5.9 2 8.9 3c183.6 62 365.7 146.1 562.4 192.1c186.7 43.7 376.3 34.4 557.9-12.6V0H0z'/%3E%3Cpath fill='%233A3A3A' d='M181.8 259.4c98.2 6 191.9 35.2 281.3 72.1c2.8 1.1 5.5 2.3 8.3 3.4c171 71.6 342.7 158.5 531.3 207.7c198.8 51.8 403.4 40.8 597.3-14.8V0H0v283.2C59 263.6 120.6 255.7 181.8 259.4z'/%3E%3Cpath fill='%23404040' d='M1600 0H0v136.3c62.3-20.9 127.7-27.5 192.2-19.2c93.6 12.1 180.5 47.7 263.3 89.6c2.6 1.3 5.1 2.6 7.7 3.9c158.4 81.1 319.7 170.9 500.3 223.2c210.5 61 430.8 49 636.6-16.6V0z'/%3E%3Cpath fill='%23484848' d='M454.9 86.3C600.7 177 751.6 269.3 924.1 325c208.6 67.4 431.3 60.8 637.9-5.3c12.8-4.1 25.4-8.4 38.1-12.9V0H288.1c56 21.3 108.7 50.6 159.7 82C450.2 83.4 452.5 84.9 454.9 86.3z'/%3E%3Cpath fill='%23505050' d='M1600 0H498c118.1 85.8 243.5 164.5 386.8 216.2c191.8 69.2 400 74.7 595 21.1c40.8-11.2 81.1-25.2 120.3-41.7V0z'/%3E%3Cpath fill='%235A5A5A' d='M1397.5 154.8c47.2-10.6 93.6-25.3 138.6-43.8c21.7-8.9 43-18.8 63.9-29.5V0H643.4c62.9 41.7 129.7 78.2 202.1 107.4C1020.4 178.1 1214.2 196.1 1397.5 154.8z'/%3E%3Cpath fill='%23646464' d='M1315.3 72.4c75.3-12.6 148.9-37.1 216.8-72.4h-723C966.8 71 1144.7 101 1315.3 72.4z'/%3E%3C/g%3E%3C/svg%3E"); 87 | background-size: cover; 88 | background-attachment: fixed; 89 | } 90 | 91 | 92 | .dark-mode .intro-container{ 93 | background: linear-gradient(to bottom, #3a3a3a, #121212); 94 | } 95 | 96 | 97 | /* navbar */ 98 | .dark-mode .navbar{ 99 | background-color: #343a40; 100 | } 101 | 102 | .dark-mode .navbar .nav-link:hover { 103 | color: #61dafb !important; 104 | } 105 | 106 | 107 | /* popup */ 108 | 109 | .dark-mode .popup-content{ 110 | background-color: #343a40; 111 | } 112 | 113 | .dark-mode .popup-right{ 114 | color: white; 115 | } 116 | 117 | .dark-mode .popup-right h1{ 118 | color: white; 119 | } 120 | 121 | .dark-mode .popup-right p{ 122 | color: #b0b0b0; 123 | } 124 | 125 | .dark-mode .popup-content a{ 126 | background-color: #343a40; 127 | color: white; 128 | } 129 | 130 | .dark-mode .popup-content b{ 131 | background-color: #343a40; 132 | color: #b0b0b0; 133 | } 134 | 135 | .dark-mode .popup-content b:hover{ 136 | text-decoration: #5d5252 underline; 137 | } 138 | 139 | 140 | /* about us */ 141 | 142 | .dark-mode .move{ 143 | background-color: #5e6262; 144 | } 145 | 146 | .dark-mode #marque{ 147 | background-color: #5e6262; 148 | border: none; 149 | } 150 | 151 | 152 | 153 | /* about -> box */ 154 | .dark-mode p{ 155 | color: white; 156 | } 157 | 158 | .dark-mode .h-secondary{ 159 | color: #b0b0b0; 160 | } 161 | 162 | /* service */ 163 | 164 | .dark-mode #service{ 165 | background-color: #110702; 166 | } 167 | 168 | .dark-mode #service h1{ 169 | color: #beba9d; 170 | } 171 | 172 | .dark-mode .service_item{ 173 | background-color: #775b3b; 174 | color: white; 175 | } 176 | .dark-mode .service_item .items{ 177 | background-color: #6f7276; 178 | color: white; 179 | } 180 | .dark-mode .service_item h2{ 181 | color: white; 182 | } 183 | 184 | /* menu */ 185 | 186 | .dark-mode #menu{ 187 | background-color: #110702; 188 | } 189 | 190 | .dark-mode #menu h1{ 191 | color: #beba9d !important; 192 | } 193 | 194 | .dark-mode .menu_items .items{ 195 | background-color: #32241d; 196 | color: white; 197 | } 198 | .dark-mode .menu_items .items h3{ 199 | color: white !important; 200 | } 201 | .dark-mode .menu_items .items p{ 202 | color: #b0b0b0 !important; 203 | } 204 | 205 | /* faq */ 206 | 207 | .dark-mode .faq{ 208 | color: white !important; 209 | } 210 | 211 | .dark-mode .faq-container{ 212 | background-color: #110702; 213 | } 214 | 215 | 216 | /* footer */ 217 | 218 | .dark-mode .app_download{ 219 | background-color: #110702 !important; 220 | } 221 | 222 | 223 | .dark-mode .footer{ 224 | background-color: #110702 !important; 225 | } 226 | 227 | .dark-mode .app_download h2{ 228 | color: #beba9d !important; 229 | } 230 | .dark-mode .app_download h4{ 231 | color: #beba9d !important; 232 | } 233 | .dark-mode .app_download P{ 234 | color: white !important; 235 | } 236 | 237 | 238 | .dark-mode .foot-panel2{ 239 | background-color: #110702 !important; 240 | } 241 | 242 | .dark-mode .foot-panel2 p{ 243 | color: #beba9d !important; 244 | } 245 | .dark-mode .foot-panel2 h3{ 246 | color: #beba9d !important; 247 | } 248 | .dark-mode .foot-panel2 a{ 249 | color: white !important; 250 | } 251 | 252 | 253 | .dark-mode .foot_panel4 h4{ 254 | color: #beba9d !important; 255 | } 256 | .dark-mode .foot_panel4 a{ 257 | color: white !important; 258 | } 259 | 260 | .dark-mode .footer-button{ 261 | background-color: #110702 !important; 262 | } 263 | 264 | 265 | 266 | /* copyright */ 267 | 268 | .dark-mode .copyright{ 269 | color: white !important; 270 | background-color: #110702 !important; 271 | } 272 | 273 | .dark-mode .copyright a{ 274 | color: #007bff !important; 275 | } 276 | 277 | 278 | .dark-mode #preloader{ 279 | background-color: #343a40; 280 | } 281 | .dark-mode #loader{ 282 | background-color: #343a40; 283 | } 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | /* about.html */ 293 | 294 | 295 | .dark-mode .mainhead span{ 296 | color: white; 297 | } 298 | 299 | .dark-mode .about1{ 300 | color: white; 301 | text-align: center; 302 | padding-top: 5rem; 303 | } 304 | 305 | .dark-mode .about2 h2{ 306 | color: #b0b0b0 !important; 307 | } 308 | .dark-mode .about2 p{ 309 | color: white !important; 310 | } 311 | .dark-mode .about3 h2{ 312 | color: #b0b0b0 !important; 313 | } 314 | .dark-mode .about3 p{ 315 | color: white !important; 316 | } 317 | 318 | .dark-mode .about_container{ 319 | background-color: transparent !important; 320 | } 321 | 322 | .dark-mode #abouthtml{ 323 | background-color: #110702; 324 | } 325 | .dark-mode #abouthtml h3{ 326 | color: #beba9d !important; 327 | } 328 | .dark-mode #abouthtml a{ 329 | color: white !important; 330 | } 331 | .dark-mode #abouthtml p{ 332 | color: white !important; 333 | } 334 | 335 | .dark-mode .abouthtml a{ 336 | color: #007bff !important; 337 | } 338 | 339 | 340 | 341 | 342 | 343 | /* menu html */ 344 | 345 | .dark-mode .mainhead h1{ 346 | color: #beba9d !important; 347 | } 348 | 349 | .dark-mode .menu_container{ 350 | background-color: #110702; 351 | } 352 | 353 | .dark-mode footer{ 354 | background-color: #110702 !important; 355 | } 356 | 357 | 358 | 359 | 360 | 361 | /* services html */ 362 | 363 | .dark-mode .service_container h2{ 364 | color: #beba9d !important; 365 | } 366 | 367 | .dark-mode .first_cont .items{ 368 | background-color: #775b3b; 369 | color: white !important; 370 | } 371 | .dark-mode .first_cont .items h3{ 372 | color: white !important; 373 | } 374 | 375 | 376 | 377 | /* contact html */ 378 | 379 | .dark-mode .contact-section h1{ 380 | color: #b0b0b0 !important; 381 | } 382 | 383 | .dark-mode .contact-section label{ 384 | color: white !important; 385 | } 386 | 387 | .dark-mode footer p{ 388 | background-color: #110702 !important; 389 | color: white !important; 390 | } 391 | 392 | 393 | 394 | 395 | /* cart html */ 396 | 397 | .dark-mode .cart-section{ 398 | color: white !important; 399 | } 400 | 401 | .dark-mode #cart-table td{ 402 | color: white !important; 403 | } -------------------------------------------------------------------------------- /dark-mode/dark-mode.js: -------------------------------------------------------------------------------- 1 | // Function to enable dark mode 2 | function enableDarkMode() { 3 | document.body.classList.add('dark-mode'); 4 | 5 | const body = document.querySelector('body'); 6 | if (body) body.classList.add('dark-mode') 7 | 8 | const toggleIcon = document.getElementById('toggleIcon'); 9 | const toggleText = document.getElementById('toggleText'); 10 | 11 | if (toggleIcon) { 12 | toggleIcon.classList.remove('fa-sun'); 13 | toggleIcon.classList.add('fa-moon'); 14 | } 15 | if (toggleText) toggleText.textContent = ' Dark Mode'; 16 | 17 | localStorage.setItem('dark-mode', 'enabled'); // Save preference 18 | } 19 | 20 | // Function to disable dark mode 21 | function disableDarkMode() { 22 | document.body.classList.remove('dark-mode'); 23 | 24 | const body = document.querySelector('body'); 25 | if (body) body.classList.remove('dark-mode'); 26 | 27 | const toggleIcon = document.getElementById('toggleIcon'); 28 | const toggleText = document.getElementById('toggleText'); 29 | 30 | if (toggleIcon) { 31 | toggleIcon.classList.remove('fa-moon'); 32 | toggleIcon.classList.add('fa-sun'); 33 | } 34 | if (toggleText) toggleText.textContent = ' Light Mode'; 35 | 36 | localStorage.setItem('dark-mode', 'disabled'); // Save preference 37 | } 38 | 39 | // Apply saved dark mode preference on page load 40 | if (localStorage.getItem('dark-mode') === 'enabled') { 41 | enableDarkMode(); 42 | } 43 | 44 | // Dark Mode Toggle Event 45 | const darkModeToggle = document.getElementById('darkModeToggle'); 46 | if (darkModeToggle) { 47 | darkModeToggle.addEventListener('click', () => { 48 | if (document.body.classList.contains('dark-mode')) { 49 | disableDarkMode(); 50 | } else { 51 | enableDarkMode(); 52 | } 53 | }); 54 | } 55 | -------------------------------------------------------------------------------- /data_collection.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | import sqlite3 3 | 4 | # Connect to SQLite database 5 | conn = sqlite3.connect('user_data.db') 6 | cursor = conn.cursor() 7 | 8 | # Create table 9 | cursor.execute(''' 10 | CREATE TABLE IF NOT EXISTS user_interactions ( 11 | user_id INTEGER, 12 | item_id INTEGER, 13 | interaction_type TEXT, 14 | timestamp DATETIME 15 | ) 16 | ''') 17 | 18 | # Function to log interaction 19 | def log_interaction(user_id, item_id, interaction_type): 20 | timestamp = datetime.now() 21 | cursor.execute(''' 22 | INSERT INTO user_interactions (user_id, item_id, interaction_type, timestamp) 23 | VALUES (?, ?, ?, ?) 24 | ''', (user_id, item_id, interaction_type, timestamp)) 25 | conn.commit() 26 | 27 | # Example usage 28 | log_interaction(1, 101, 'click') 29 | log_interaction(1, 102, 'view') 30 | log_interaction(2, 101, 'purchase') 31 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/favicon.ico -------------------------------------------------------------------------------- /gssoc24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/gssoc24.png -------------------------------------------------------------------------------- /hacktoberfest.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/hacktoberfest.png -------------------------------------------------------------------------------- /home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/home.png -------------------------------------------------------------------------------- /layer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/layer.png -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Retro", 3 | "short_name": "Retro", 4 | "description": "An online platform providing items of vintage collections!", 5 | "start_url": "/index.html", 6 | "display": "standalone", 7 | "background_color": "#F5EBE5", 8 | "theme_color": "#000000", 9 | "icons": [ 10 | { 11 | "src": "/Favicon image/favicon-192x192.png", 12 | "sizes": "192x192", 13 | "type": "image/png" 14 | }, 15 | { 16 | "src": "/Favicon image/favicon-512x512.png", 17 | "sizes": "512x512", 18 | "type": "image/png" 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /menu.js: -------------------------------------------------------------------------------- 1 | // adding items from menu to cart 2 | document.addEventListener('DOMContentLoaded', function () { 3 | var menuContainers = document.querySelectorAll('.menu_container'); 4 | menuContainers.forEach(function (container) { 5 | container.addEventListener('click', function (event) { 6 | if (event.target.classList.contains('butt')) { 7 | var item = event.target.closest('.items'); 8 | var itemName = item.querySelector('h3').textContent; 9 | var itemPrice = item.querySelector('p').textContent; 10 | alert("Item added to cart successfully"); 11 | 12 | // Retrieve existing cart items from localStorage 13 | var cartItems = JSON.parse(localStorage.getItem('cartItems')) || []; 14 | 15 | // Add new item to the cart array 16 | var newItem = { name: itemName, price: itemPrice }; 17 | cartItems.push(newItem); 18 | 19 | // Save updated cart back to localStorage 20 | localStorage.setItem('cartItems', JSON.stringify(cartItems)); 21 | 22 | window.location.href = "cart.html"; 23 | } 24 | }); 25 | 26 | }); 27 | }); -------------------------------------------------------------------------------- /moon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/moon.png -------------------------------------------------------------------------------- /mountain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/mountain.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Retro", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": {} 6 | } 7 | -------------------------------------------------------------------------------- /recommendation.py: -------------------------------------------------------------------------------- 1 | import pandas as pd 2 | from sklearn.metrics.pairwise import cosine_similarity 3 | import numpy as np 4 | 5 | def load_data(): 6 | # Load interaction data 7 | data = pd.read_csv('user_interactions.csv') 8 | return data 9 | 10 | def build_model(data): 11 | # Create user-item interaction matrix 12 | user_item_matrix = data.pivot_table(index='user_id', columns='item_id', values='interaction', aggfunc='count', fill_value=0) 13 | 14 | # Compute cosine similarity between users 15 | user_similarity = cosine_similarity(user_item_matrix) 16 | 17 | return user_item_matrix, user_similarity 18 | 19 | def recommend_items(user_id, user_item_matrix, user_similarity, num_recommendations=5): 20 | user_idx = user_item_matrix.index.get_loc(user_id) 21 | similar_users = list(enumerate(user_similarity[user_idx])) 22 | similar_users = sorted(similar_users, key=lambda x: x[1], reverse=True) 23 | 24 | recommendations = [] 25 | for user, score in similar_users: 26 | if user != user_idx: 27 | similar_user_items = user_item_matrix.iloc 28 | -------------------------------------------------------------------------------- /script/coverpage.js: -------------------------------------------------------------------------------- 1 | function explore() { 2 | alert("Let's explore the Retro World!"); 3 | // Redirect to index.html 4 | window.location.href = "index.html"; 5 | } 6 | 7 | window.embeddedChatbotConfig = { 8 | chatbotId: "dGlQ5bP-F7GodLWzgrVAx", 9 | domain: "www.chatbase.co" 10 | } 11 | 12 | window.gtranslateSettings = { "default_language": "en", "detect_browser_language": true, "wrapper_selector": ".gtranslate_wrapper" } -------------------------------------------------------------------------------- /script/feedback.js: -------------------------------------------------------------------------------- 1 | const stars = document.querySelectorAll('#rating i'); 2 | const submitButton = document.getElementById('submitFeedback'); 3 | 4 | let selectedRating = 0; 5 | 6 | // Handle star rating click 7 | stars.forEach((star, index) => { 8 | star.addEventListener('click', () => { 9 | selectedRating = index + 1; 10 | updateStars(selectedRating); 11 | }); 12 | }); 13 | 14 | function updateStars(rating) { 15 | stars.forEach((star, index) => { 16 | if (index < rating) { 17 | star.classList.add('active'); 18 | } else { 19 | star.classList.remove('active'); 20 | } 21 | }); 22 | } 23 | 24 | // Handle submit button click 25 | submitButton.addEventListener('click', () => { 26 | const feedbackType = document.getElementById('feedbackType').value; 27 | const comments = document.getElementById('comments').value; 28 | const fileUpload = document.getElementById('fileUpload').files[0]; 29 | 30 | if (!feedbackType || !selectedRating || !comments) { 31 | alert('Please fill in all required fields.'); 32 | return; 33 | } 34 | 35 | alert('Feedback submitted successfully!'); 36 | console.log({ 37 | feedbackType, 38 | selectedRating, 39 | comments, 40 | file: fileUpload ? fileUpload.name : 'No file uploaded' 41 | }); 42 | }); -------------------------------------------------------------------------------- /script/popup.js: -------------------------------------------------------------------------------- 1 | // Show the pop-up automatically when the page loads 2 | window.onload = function() { 3 | document.getElementById('popup').style.display = 'flex'; 4 | }; 5 | 6 | // Close the pop-up when the user clicks the close button 7 | document.querySelector('.close-btn').addEventListener('click', function() { 8 | document.getElementById('popup').style.display = 'none'; 9 | }); 10 | 11 | document.querySelector('.popuplogo').addEventListener('click', function(event) { 12 | // Redirect to the login page 13 | window.location.href = 'Html-files/signup.html'; // Change to your actual login page URL 14 | }); 15 | 16 | //email validation using a more comprehensive regex 17 | function validateEmail(email) { 18 | const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; 19 | return regex.test(email); 20 | } 21 | 22 | // Handle form submission 23 | document.getElementById('emailForm').addEventListener('submit', function(event) { 24 | event.preventDefault(); 25 | 26 | const email = document.getElementById('popup-email').value; 27 | 28 | // Check if the email is valid 29 | if (validateEmail(email)) { 30 | // Hide the pop-up first, then show the alert after 0.1 seconds 31 | document.getElementById('popup').style.display = 'none'; // Close the pop-up 32 | 33 | setTimeout(function() { 34 | alert(`Thank you! A 30% discount code has been sent to ${email}`); 35 | }, 100); // Delay of 100ms (0.1 seconds) 36 | } else { 37 | alert('Please enter a valid email address.'); 38 | } 39 | }); 40 | 41 | // Handle "No thanks" link 42 | document.querySelector('.no-thanks').addEventListener('click', function(event) { 43 | event.preventDefault(); 44 | document.getElementById('popup').style.display = 'none'; 45 | }); 46 | -------------------------------------------------------------------------------- /service-worker.js: -------------------------------------------------------------------------------- 1 | const CACHE_NAME = 'my-pwa-cache-v1'; 2 | const urlsToCache = [ 3 | '/', 4 | '/index.html', 5 | '/style.css', 6 | '/manifest.json', 7 | '/Favicon image/favicon-192x192.png', 8 | '/Favicon image/favicon-512x512.png' 9 | ]; 10 | 11 | self.addEventListener('install', (event) => { 12 | event.waitUntil( 13 | caches.open(CACHE_NAME) 14 | .then((cache) => { 15 | return cache.addAll(urlsToCache); 16 | }) 17 | ); 18 | }); 19 | 20 | self.addEventListener('fetch', (event) => { 21 | event.respondWith( 22 | caches.match(event.request) 23 | .then((response) => { 24 | return response || fetch(event.request); 25 | }) 26 | ); 27 | }); 28 | 29 | self.addEventListener('activate', (event) => { 30 | const cacheWhitelist = [CACHE_NAME]; 31 | event.waitUntil( 32 | caches.keys().then((cacheNames) => { 33 | return Promise.all( 34 | cacheNames.map((cacheName) => { 35 | if (!cacheWhitelist.includes(cacheName)) { 36 | return caches.delete(cacheName); 37 | } 38 | }) 39 | ); 40 | }) 41 | ); 42 | }); 43 | -------------------------------------------------------------------------------- /stars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/stars.png -------------------------------------------------------------------------------- /trees.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Anjaliavv51/Retro/f5af80591c6ae5cb876ef81c5c149822c544af97/trees.png -------------------------------------------------------------------------------- /visi.css: -------------------------------------------------------------------------------- 1 | .visitor-counter { 2 | 3 | position: fixed; 4 | bottom: 20px; /* Distance from the bottom */ 5 | right: 90px; /* Distance from the right */ 6 | z-index: 9999; /* Ensure it appears above other content */ 7 | background-color: rgb(255 214 206); /* Slightly opaque background for better visibility */ 8 | height: 60px; 9 | width: 100px; 10 | color: #333; /* Darker text for better contrast */ 11 | font-weight: 700; 12 | font-size: 18px; 13 | text-align: center; 14 | display: flex; 15 | flex-direction: column; 16 | justify-content: center; 17 | align-items: center; 18 | border-radius: 12px; /* Softer corners */ 19 | backdrop-filter: blur(10px); /* Increased blur for a modern touch */ 20 | box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15), /* Slightly more pronounced shadow */ 21 | 0 2px 4px rgba(0, 0, 0, 0.1); 22 | z-index: 1000; 23 | transition: all 0.3s ease; /* Smooth transition for hover effect */ 24 | 25 | } 26 | 27 | .visitor-counter:hover { 28 | 29 | transform: scale(1.05); /* Slightly enlarge on hover */ 30 | box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2); /* Enhance shadow on hover */ 31 | 32 | } 33 | 34 | .visitor-counter div:first-child { 35 | 36 | margin-bottom: -5px; 37 | font-size: 14px; /* Adjusted for clarity */ 38 | letter-spacing: 1px; /* Increased spacing for readability */ 39 | 40 | } 41 | 42 | .website-counter { 43 | 44 | font-size: 24px; 45 | font-family: 'Arial', sans-serif; /* Consistent font family */ 46 | 47 | } 48 | 49 | @media screen and (max-width: 768px) { 50 | 51 | .visitor-counter { 52 | 53 | height: 100px; 54 | width: 100px; 55 | font-size: 16px; 56 | 57 | } 58 | 59 | .website-counter { 60 | 61 | font-size: 20px; 62 | 63 | } 64 | 65 | } 66 | 67 | @media screen and (max-width: 480px) { 68 | 69 | .visitor-counter { 70 | 71 | height: 80px; 72 | width: 80px; 73 | font-size: 14px; 74 | 75 | } 76 | 77 | .website-counter { 78 | 79 | font-size: 18px; 80 | 81 | } 82 | 83 | } 84 | 85 | .dark-mode .visitor-counter div { 86 | 87 | color: #f0f0f0; /* Lighter text for dark mode */ 88 | 89 | } 90 | 91 | .dark-mode .visitor-counter .website-counter { 92 | 93 | color: #f0f0f0; /* Lighter color for consistency */ 94 | 95 | } 96 | 97 | .dark-mode .visitor-counter { 98 | 99 | background-color: rgba(0, 0, 0, 0.7); /* Darker background for dark mode */ 100 | box-shadow: 0 6px 12px rgba(255, 255, 255, 0.1), 101 | 0 2px 4px rgba(255, 255, 255, 0.05); 102 | 103 | } 104 | 105 | -------------------------------------------------------------------------------- /visi.js: -------------------------------------------------------------------------------- 1 | // Function to get the count from localStorage or initialize it 2 | function getVisitorCount() { 3 | 4 | return localStorage.getItem('visitorCount') || 0; 5 | 6 | } 7 | 8 | 9 | // Function to increment and save the count 10 | function incrementVisitorCount() { 11 | 12 | let count = parseInt(getVisitorCount()) + 1; 13 | localStorage.setItem('visitorCount', count); 14 | 15 | return count; 16 | } 17 | 18 | 19 | // Function to display the count 20 | function displayVisitorCount() { 21 | 22 | const counterElement = document.querySelector('.website-counter'); 23 | const count = incrementVisitorCount(); 24 | counterElement.textContent = count; 25 | 26 | } 27 | 28 | // Call the display function when the page loads 29 | document.addEventListener('DOMContentLoaded', displayVisitorCount); 30 | 31 | --------------------------------------------------------------------------------