# Project export: EATtoMEET

This document was generated by HackStack to give an AI agent context about a hackathon project. Sections are labeled with their provenance; content marked as truncated was cut to keep this document small.

## Project metadata

- Hackathon: TreeHacks 2024
- Tagline: You won't MEET until you EAT
- Devpost: https://devpost.com/software/eattomeet
- GitHub: https://github.com/annajyang/eattomeet
- Video: https://www.youtube.com/embed/5Exdfm_E5GA?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Team: 1 GitHub contributor(s) — Anna Yang (43 commits)

## Devpost submission (written by the team)

### Inspiration

After entering into the hectic lifestyles of higher education and employment, how often do we reconnect with our parents and grandparents? How often do we visit the place we used to call “home”? As we reach the halfway point of our freshman year in college, we realize how we neglect the responsibility to actively communicate with our family members. Over 22% of Americans 65 and older are isolated and have a lack of support from family members, leading to a life marked with disconnection and loneliness, increasing their chances of Alzheimer's, dementia, and depression. As global fertility rates decline, senior populations increase rapidly while younger generations shrink. Mental health saves lives. Yet, there is little-to-no spotlight on the declining mental health of senior citizens, who face struggles with illnesses that come with age, declining quality of life, and social isolation. Recognizing these impacts on the elderly, we were inspired to build our web application, EATtoMEET, to address this problem head-on. Our mission is to create an inclusive platform that goes beyond technology—it’s about filling empty hearts; it’s about filling empty mouths with delicious meals and thoughtful conversations; it’s about filling the responsibility of caring for the senior population. It starts with one shared meal.

### What it does

EATtoMEET simplifies the dining experience: Users input responses such as food preferences and interests for personalized restaurant recommendations. They can then explore detailed restaurant information which contains ratings, photos, and the address, which is obtained from web scraping popular restaurant review sites, including YeIp. Within the site, users can join a personalized chat room in order to meet with similarly inclined users. In these rooms, members can view profiles, chat, and coordinate meet-ups at chosen restaurants.

### How we built it

We created a detailed prototype of the web application on Figma, in which we were able to obtain features (dimensions, position, color, style of font, etc.) of objects which included buttons, photos, and text. One benefit of Figma is it exports the scale of your design, making it easier for us to implement variables when building the web application. We wrote our code in Visual Code Studio using CSS (frontend), HTML(frontend), and JavaScript (backend). With CSS and HTML, we implemented the design from Figma into code, taking advantage of the web developer feature of Figma to see the correct dimensions and positions of each element. The JavaScript was used for more advanced features in the website and smoother UI, like the slow scroll on the home page when going to "about" and transferring the data from the starting form into the profile page. Using GitHub, we were able to do version control and collaborate with each other.

### Challenges we ran into

For most of us, this was our very first hackathon and some of the team had just started learning how to code. Among the four of us, we had no web design or web development experience prior to TreeHacks. Thus, we struggled to transform our complex idea into a finalized product. However, with the help of our amazing sponsors, mentors, workshops, and the power of YouTube tutorials, we successfully navigated our obstacles to create a functioning web application that addressed our purpose for EATtoMEET. ## Accomplishments we are proud of Once the hacking period began, our meticulous brainstorming allowed us to create a solid game plan and delegate tasks which highlighted individual team members strengths. This efficient task delegation facilitated organized and successful project execution with the allotted time we were given. On the technical side, we learned a lot of new techniques to make our web app more aesthetic and functional by tinkering around with JavaScript commands we recently learned!

### What we learned

Anna and Tracy used CSS, JavaScript, and HTML for the first time and with a plethora of tutorial videos from YouTube, they navigated their way through the obstacles which ultimately made a final product of our web application. Hannah used Figma for the first time in which she designed the whole website using her research on senior friendly web app features. Vivian, in turn, honed her skills in persuasive communication, writing a script to pitch our idea and product to potential judges. She also went to multiple workshops to acquire different software applications for us to use for our product. Amidst the sleepless nights, the fast paced work environment, and sore wrists, our bond deepened as we laughed off our silly syntax errors and small little successes. At the end, it was our shared commitment to crafting an accessible platform for seniors and addressing the urgency to create support services for our elderly citizens that united us.

### What's next

To expand EATtoMEET and promote intergenerational connection, we hope that younger users are also interested in joining the service and meeting new friendly faces beyond the demographics they usually spend time with. Through partnerships with educational institutions, we aim to bridge the generational gap, creating a vibrant community where diverse age groups can share meaningful experiences through the joy of shared meals. This expansion will enrich the platform, promoting a culture of inclusivity and understanding among users of all ages. We plan to collect and integrate a larger database that is able to store factors like the answers of users (interests, location, etc.), their compatibility with previous EATtoMEET members, a better gauge of their palates based on restaurants they enjoyed. Building this database gives us the starting point to launch more complex algorithms and better group matches, which will get the elderly users of EATtoMEET excited for their next social event!

## README (from the GitHub repository)

# This is the code for EATtoMEET, our project for Treehacks24

## Detected evidence (automated analysis)

Indexed codebase: 18 recognized source files, 43 KB.
- CSS (language) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code

## Codebase structure (from repository index)

### Files (18 of 18)

```
chefchus.css
chefchus.html
form_scripts.js
form_styles.css
form.html
gc_scripts.js
gc.css
gc.html
index_scripts.js
index.css
index.html
johndoe.css
johndoe.html
myprofile.css
myprofile.html
README.md
restaurants.css
restaurants.html
```

### Dependencies

No dependency index available.

### Recent commits (newest first)

- about section
- fixed popup for form
- update links to about
- index.css
- merge index and index2
- Merge branch 'main' of https://github.com/annajyang/eattomeet
- copy of index
- about section
- updated site icon
- font change
- readme
- linking profile in group chat
- john doe page final
- complete myprofile page
- update profile links
- Merge branch 'main' of https://github.com/annajyang/eattomeet
- js for profile form
- back button for gc and merge resolved
- back button for gc
- gc working

## Key source files (fetched from GitHub, selected and truncated for size)

### index_scripts.js

```javascript
document.addEventListener('DOMContentLoaded', function() {
    const links = document.querySelectorAll('a[href^="#"]');
    
    links.forEach(link => {
      link.addEventListener('click', function(e) {
        e.preventDefault();
        
        const targetId = this.getAttribute('href');
        const targetElement = document.querySelector(targetId);
        
        if (targetElement) {
          const offset = targetElement.offsetTop;
          window.scrollTo({
            top: offset,
            behavior: 'smooth'
          });
        }
      });
    });
  });
  
```

### gc.html

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Group Chat</title>
    <link rel="stylesheet" href="gc.css">
    <link rel="icon" type="image/x-icon" href="imgs/favicon.ico">
</head>
<body>
    <div class="chat-container">
        <div class="chat-header">
            <div class="back-button">
                <a href="chefchus.html">&larr;</a>
            </div>
            <h1>Chef Chu's Meet Group</h1>
        </div>
        <div class="chat-messages" id="chatMessages">
            <!-- Pre-existing messages from others -->
            
  

            <!-- More pre-existing messages can be added here -->
        </div>
        <div class="chat-form">
            <input type="text" id="chatInput" placeholder="Type a message...">
            <button onclick="sendMessage()">Send Message</button>
        </div>
    </div>
    <script src="gc_scripts.js"></script>
</body>
</html>

```

### restaurants.html

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>EATtoMEET Restaurants</title>
    <link href="restaurants.css" rel="stylesheet">
    <link rel="icon" type="image/x-icon" href="imgs/favicon.ico">
</head>
<body>
    <div class="navbar">
        <div class="logo">EATtoMEET</div>
        <div class="menu">
            <a href="index.html">HOME</a>
            <a href="index.html#about">ABOUT</a>
            <a href="myprofile.html">PROFILE</a>
        </div>
    </div>
    <div class="title">RECOMMENDED RESTAURANTS</div>
    <div class="gallery">
        <div class="location">
            <a href="chefchus.html"><img src="imgs/chefchus.svg" alt="Chef Chu's"></a>
        </div>
        <div class="location">
            <a href="/"><img src="imgs/pizzablvd.svg" alt="Pizza Boulevard"></a>
        </div>
        <div class="location">
            <a href="/"><img src="imgs/tacolicious.svg" alt="Tacolicious"></a>
        </div>
        <div class="location">
            <a href="/"><img src="imgs/indochine.svg" alt="Indochine"></a>
        </div>
        <div class="location">
            <a href="/"><img src="imgs/sushihouse.svg" alt="Sushi House"></a>
        </div>
        <div class="location">
            <a href="/"><img src="imgs/bistromaxine.svg" alt="Bistro Maxine"></a>
        </div>
    </div>
</body>
</html>
```

### form_scripts.js

```javascript
document.getElementById('profileForm').addEventListener('submit', function(event) {
    event.preventDefault(); // Prevent form submission
  
    // Get form values
    const name = document.getElementById('preferred_name').value;
    const zip_code = document.getElementById('zip_code').value;
    const age = document.getElementById('age').value;
    const food_preferences = document.getElementById('food_preferences').value;
    const interests = document.getElementById('interests').value;

  
    // Redirect to profile page with query parameters
    window.location.href = `myprofile.html?name=${name}&zip_code=${zip_code}&age=${age}&food_preferences=${food_preferences}&interests=${interests}`;
});


document.addEventListener('DOMContentLoaded', function() {
    // Parse query parameters
    const queryParams = new URLSearchParams(window.location.search);
  
    // Get individual parameters
    const name = queryParams.get('preferred_name');
    const zip_code = queryParams.get('zip_code');
    const age = queryParams.get('age');
    const food_preferences = queryParams.get('food_preferences');
    const interests = queryParams.get('interests');
  
    // Display profile data
    const profileDataElement = document.getElementById('profileData');
    profileDataElement.innerHTML = `
      <p><strong>Name:</strong> ${preferred_name}</p>
      <p><strong>Age:</strong> ${age}</p>
      <p><strong>Zip Code:</strong> ${zip_code}</p>
      <p><strong>Food Preferences:</strong> ${food_preferences}</p>
      <p><strong>Interests:</strong> ${interests}</p>
    `;
});
```

### index.html

```html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 
    <meta http-equiv="X-UA-Compatible"
    content="ie=edge">
    <link href="index.css" rel="stylesheet">
    <link rel="icon" type="image/x-icon" href="imgs/favicon.ico">
    <title>EATtoMEET</title>
</head>
<body>
    <div class="background">
        <div class="navbar">
            <div class="logo">EATtoMEET</div>
            <div class="menu">
                <a href="/">HOME</a>
                <a href="#about">ABOUT</a>
                <a href="myprofile.html">PROFILE</a>
            </div>
        </div>
        <section class="home-main-section">
            <h1 class="main-logo">EATtoMEET</h1>
            <button class="signup-button">
                <a href="form.html">CLICK HERE TO ENTER</a>
            </button>
        </section>
    </div>
    <main id="about">
        <section class="home-main-section">
            <div class="spacer"></div>
            <div class="header">ABOUT EATtoMEET</div>
            <div class="container">
                <img src="imgs/about.svg">
            </div>
            <div class="gallery">
                <div class="image">
                  <img src="imgs/homepage1.svg">
                </div>
                <div class="image">
                  <img src="imgs/homepage2.svg">
                </div>
                <div class="image">
                  <img src="imgs/homepage3.svg">
                </div>
              </div>
        </section>
    </main>
    <script src="index_scripts.js"></script>
</body>
</html>
```

### chefchus.html

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link href="chefchus.css" rel="stylesheet">
    <link rel="icon" type="image/x-icon" href="imgs/favicon.ico">
</head>
<body>
    <div class="navbar">
        <div class="logo">EATtoMEET</div>
        <div class="menu">
            <a href="index.html">HOME</a>
            <a href="index.html#about">ABOUT</a>
            <a href="myprofile.html">PROFILE</a>
        </div>
    </div>
    <div class="padding">
        <div class="restaurant-gallery"></div>
            <img src="imgs/chefchusgallery.svg" alt="A photo gallery of Chef Chu's food">
        </div>
        <div class="title-container">
            <div class="title" style="display:inLine; white-space: nowrap;">Chef Chu's</div>
            <div class="image" style="display:inLine">
                <img src="imgs/fourstars.svg" alt="Chef Chu's is rated 4 stars">
            </div>
        </div>
        <div class="address-container" style="white-space:nowrap"></div>
            <div class="image" style="display:inLine">
                <img src="imgs/pinmap.svg" alt="pin icon">
            </div>
            <div class="text" style="display:inLine; white-space:nowrap;">1067 N San Antonio Rd #1300, Los Altos, CA 94022</div>
            <button class="join-button" style="display:inLine">
                <a href="gc.html">JOIN A GROUP</a>
            </button>
        </div>
        <div class="button-container"></div>
            <button class="button" style="display:inLine">
                <a href="http://www.chefchu.com/menu/" target=”_blank”>MENU</a>
            </button>
            <button class="button" style="display:inLine">
                <a href="http://www.chefchu.com/" target=”_blank”>WEBSITE</a>
            </button>
        </div>
        <div>
            <p class="text" style="margin-left: 2rem;">Local favorite for Chinese food staples and Chef Chu's specialty signature dishes.</p>
        </div>
    </div>
</body>
</html>
```

### restaurants.css

```css
@font-face{
    font-family: 'Noto Sans';
    src:url("fonts/NotoSans-VariableFont_wdth,wght.ttf");
}
@font-face{
    font-family: 'Yuji Syuku';
    src:url("fonts/YujiSyuku-Regular.ttf");
}

*,  *::before,  *::after {
    box-sizing: content-box;
    max-width:100%;
    overflow-x: scroll;
}

body {
    margin: 0;
    padding: 0;
    height: 100vh;
    font-family: 'Noto Sans', sans-serif;
    background-color: #3A312B;
    background-position: center;
    background-size: cover;
}

.logo {
    font-family: 'Yuji Syuku', sans-serif;
    font-size: x-large;
    font-weight: bold;
}

header {
    background: #907A6B;
    mix-blend-mode: plus-darker;
    color: inherit;
    margin: 0;
    padding: 0;
    width: 100%;
}

.brand-logo {
    display: flex;
    align-items: center;
    font-size: 1.25em;
    color: inherit;
    text-decoration: none;
    font-weight: bold;
    padding: 1rem;
}

.navbar {
    font-family: 'Yuji Syuku', sans-serif;
    font-weight: bold; /* 700 is also commonly used for bold */
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 20px;
    background-color: rgba(0,0,0,0.5); /* Translucent navbar */
    color: white;
}

.title {
    display: flex;
    flex-direction: column;
    justify-content: center;
    flex-shrink: 0;
    color: #FFF;
    text-align: center;
    -webkit-text-stroke-width: 4;
    -webkit-text-stroke-color: #FFFEFE;
    font-family: "Noto Sans";
    font-size: 5rem;
    font-style: normal;
    font-weight: 400;
    line-height: normal;
    padding: 5rem;
}

.gallery {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    padding: 4rem;
    position: relative;
    top: -15vh;
}
  
.location {
    flex-basis: calc(33.33% - 1rem); /* Adjust as needed */
    margin-bottom: 20px;
}
  
.location img {
    max-width: 100%;
    height: auto;
    display: block;
    margin-bottom: 1rem;
    width: 30rem;
    height: auto;
}

.menu a {
    margin: 0 10px;
    color: white;
    text-decoration: none;
}

.main-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
    height: 140px;
    color: inherit;
}

.container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 40px;
}
```

### johndoe.html

```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="johndoe.css" rel="stylesheet">
    <link rel="icon" type="image/x-icon" href="imgs/favicon.ico">
    <title>EATtoMEET John Doe</title>
</head>
<body>
    <div class="navbar">
        <div class="logo">EATtoMEET</div>
        <div class="menu">
            <a href="index.html">HOME</a>
            <a href="index.html#about">ABOUT</a>
            <a href="myprofile.html">PROFILE</a>
        </div>
    </div>
    <div class="back-button">
        <a href="gc.html">&larr;</a>
    </div>
    <div class="profile-container">
        <div class="top-container">
            <div class="image-container">
                <img src="imgs/johndoe.svg" alt="john doe pfp" class="img">
            </div>
            <div class="text-container">
                <span class="title">John Doe</span><br>
                <span class="profile-label">Age:</span>
                <span>88</span>
            </div>
        </div>
    
        <div class="gallery">
            <div class="profile-card">
                <div class="profile-icon">
                  <img src="imgs/locationicon.svg" alt="Location Icon">
                </div>
                <div>
                  <h2>Location</h2>
                  <div class="content">94020</div>
                </div>
            </div>
            <div class="profile-card">
                <div class="profile-icon">
                  <img src="imgs/meetsicon.svg" alt="Meets Icon">
                </div>
                <div>
                  <h2>Meets</h2>
                  <div class="content">3</div>
                </div>
            </div>
            <div class="profile-card">
                <div class="profile-icon">
                  <img src="imgs/yearsicon.svg" alt="Calendar Icon">
                </div>
                <div>
                  <h2>Year Joined</h2>
                  <div class="content">2024</div>
                </div>
            </div>
            <div class="profile-card">
                <div class="profile-icon">
                  <img src="imgs/interestsicon.svg" alt="interests Icon">
                </div>
                <div>
                  <h2>Interests</h2>
                  <span class="content">Dancing, Traveling, Food</span>
                </div>
            </div>
        </div>
    </div>
</body>
</html>
```

### form_styles.css

```css
@font-face{
    font-family: 'Noto Sans';
    src:url("fonts/NotoSans-VariableFont_wdth,wght.ttf");
}
@font-face{
    font-family: 'Yuji Syuku';
    src:url("fonts/YujiSyuku-Regular.ttf");
}


*,  *::before,  *::after {
    box-sizing: content-box;
    max-width:100%;
    overflow-x: scroll;
}
.form-container input, .form-container button {
    font-family: 'Noto Sans', sans-serif;
    font-size: medium;
}

.form-container {
    border: 1px solid red;
    width: 100%;
    max-width: 400px;
    margin: 50px auto;
    padding: 20px;
    box-shadow: 0 0 10px rgba(0,0,0,0.5);
    border-radius: 8px;
    background-color: rgba(255, 255, 255, 0.6); /* semi-transparent white */
    backdrop-filter: blur(15px); /* this adds the blur effect */
    border: 1px solid rgba(255, 255, 255, 0.3); /* optional: adds a faint border for better definition */
}

body {
    margin: 0; /* Reset default margin */
    padding: 0;
    height: 100vh;
    font-family: 'Noto Sans', sans-serif;
    background: url("imgs/homebackground.svg") lightgray 50% / cover no-repeat;
    background-position: center;
    background-size: cover;
    /* mix-blend-mode, backdrop-filter here will not affect elements on top */
}

.navbar {
    font-family: "Noto Sans";
    font-weight: bold; /* 700 is also commonly used for bold */
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 20px;
    background-color: rgba(0,0,0,0.5); /* Translucent navbar */
    color: white;
}

.menu a {
    margin: 0 10px;
    color: white;
    text-decoration: none;
}

form h2 {
    color: #333;
    text-align: center;
}

form input {
    width: 100%;
    padding: 10px;
    margin: 10px 0;
    border: 1px solid #f9feff;
    border-radius: 4px;
    font-weight: 550;
}
form input:hover {
    background-color:rgb(243, 243, 243);
}

.logo {
    font-family: "Noto Sans";
    font-size: x-large;
    font-weight: bolder; /* 700 is also commonly used for bold */
}

form button {
    width: 100%;
    padding: 10px;
    margin: 10px 0;
    border: none;
    border-radius: 4px;
    background-color: #a00500;
    font-family: "Noto Sans";
    font-weight: bold;
    color: white;
    cursor: pointer;
}

form button:hover {
    font-family: "Noto Sans";
    font-weight: bold;
    background-color: #c20600;
}

.signin-link {
    font-family: 'Noto Sans', sans-serif;
    color: #333;
    font-weight: 550;
    text-align: center;
}

.signin-link a {
    font-family: 'Noto Sans', sans-serif;
    color: #a00500;
    font-weight: bold;
    text-decoration: none;
}

/* Responsive adjustments */
@media (max-width: 600px) {
    .navbar {
        flex-direction: column;
    }
}
```

### johndoe.css

```css
@font-face{
    font-family: 'Noto Sans';
    src:url("fonts/NotoSans-VariableFont_wdth,wght.ttf");
}
@font-face{
    font-family: 'Yuji Syuku';
    src:url("fonts/YujiSyuku-Regular.ttf");
}

*,  *::before,  *::after {
    box-sizing: content-box;
    max-width:100%;
    overflow-x: scroll;
}

body {
    margin: 0;
    padding: 0;
    height: 100vh;
    font-family: 'Noto Sans', sans-serif;
    background-color: #3A312B;
    background-position: center;
    background-size: cover;
}

.img {
    width: 90%;
}

.title {
    color: #FFF;
    font-family: "Noto Sans";
    font-size: 5.5rem;
    font-style: bold;
    font-weight: 400;
    line-height: normal;
    margin-left: 3rem;
}

.logo {
    font-family: 'Noto Sans', sans-serif;
    font-size: x-large;
    font-weight: bold;
}

header {
    background: #907A6B;
    mix-blend-mode: plus-darker;
    color: inherit;
    margin: 0;
    padding: 0;
    width: 100%;
}

.brand-logo {
    display: flex;
    align-items: center;
    font-size: 1.25em;
    color: inherit;
    text-decoration: none;
    font-weight: bold;
    padding: 1rem;
}

.navbar {
    font-family: 'Noto Sans', sans-serif;
    font-weight: bold; /* 700 is also commonly used for bold */
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 20px;
    background-color: rgba(0,0,0,0.5); /* Translucent navbar */
    color: white;
}

.menu a {
    margin: 0 10px;
    color: white;
    text-decoration: none;
}

.profile-container {
    height: auto;
    overflow: hidden;
    margin-top: 1rem;
    margin-left: 2rem;
    font-size: 2rem;
}

.top-container {
    color: white;
    position: relative;
    display: flex;
    align-items: center;
}
  
.image-container {
    flex-shrink: 0;
}
  
.text-container {
    position: absolute;
    left: 30rem;
    top: 50%;
    padding: 1rem;
    transform: translateY(-50%);
    text-align: center;
}

.text-container span {
    text-align: left;
}

.gallery {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    padding: 1rem;
    position: relative;
}

.profile-card {
    flex-basis: calc(20% - 1rem); /* Adjust as needed */
    background-color: white;
    color: black;
    text-align: center;
    padding: 1.2rem;
    margin-right: 1rem;
    border-radius: 3rem;
    box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
    flex-direction: column;
}
  
.profile-icon img {
    height: 6rem;
    width: auto;
    margin-bottom: 0;
}

h2 {
    font-family: "Noto Sans";
    color:black;
}

.content {
    text-align: center;
    color: black;
    font-family: "Noto Sans";
    font-size: 1.5rem;
}

.back-button a {
    margin-left: 1rem;
    font-size: 2rem;
    text-decoration: none;
    color: white;
    padding: 5px;
    display: flex;
    align-items: center;
}
```

[7 more indexed source files omitted to keep this export small. The full file list is in the Codebase structure section above.]