# Project export: EverCare

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 2025
- Tagline: AI-powered voice-based health companion designed for seniors
- Devpost: https://devpost.com/software/wellnest-a32yt4
- GitHub: https://github.com/ksantoso2/EverCare
- Demo: https://www.canva.com/design/DAGfOS53Yjo/XSIQnfjRvW0U3Q195A5g_g/edit?utm_content=DAGfOS53Yjo&utm_campaign=designshare&utm_medium=link2&utm_source=sharebutton
- Video: https://www.youtube.com/embed/GxjZDOy9Mpk?enablejsapi=1&hl=en_US&rel=0&start=&version=3&wmode=transparent
- Team: 3 GitHub contributor(s) — ksantoso2 (20 commits), Chau Vu (16 commits), Ashley Hung (6 commits)

## Devpost submission (written by the team)

### Inspiration

Having witnessed firsthand the challenges that one of our teammates' grandparents faces living alone, we became acutely aware of the difficulties involved in maintaining their health and well-being. Elders like them struggle with remembering daily health updates, deciding when to seek medical attention, and navigating modern technology. This experience deeply inspired us to create Evercare—an app designed not only to simplify health tracking and make it accessible for elders with speech-to-text capabilities but also to provide peace of mind for both seniors and their families. By offering an AI-powered 100% speech-to-text system, Evercare allows seniors to effortlessly record their health updates, which can be easily shared with doctors. This data exchange helps medical professionals assess conditions more accurately and efficiently, improving care and ensuring that both seniors and their families feel more connected and supported in managing health. Our goal is to make it easier for seniors to manage their health, reduce stress, and foster a sense of security in their daily lives.

### What it does

Users can describe their symptoms to a conversational AI agent, which then processes and delivers personalized responses based on a user’s background information and previous entries. These responses help the user better understand patterns in their health and flag issues that may require a visit to a healthcare provider. The responses are converted to speech using text-to-speech software in the backend, allowing users to hear them aloud. Users can access their previous conversations with the AI agent, allowing them to review past discussions and track their symptoms over time.

### How we built it

Perplexity Sonar for generating personalized advice and flagging issues that may warrant medical attention. Perplexity Sonar for generating personalized advice and flagging issues that may warrant medical attention. OpenAI API for speech to text using whisper OpenAI API for speech to text using whisper ElevenLabs API for natural-sounding text-to-speech ElevenLabs API for natural-sounding text-to-speech React js frontend, Python backend using Flask React js frontend, Python backend using Flask

### Challenges we ran into

In our original plan we intended to use the FARM approach. However, we ran into issues with integration with our current implementation In our original plan we intended to use the FARM approach. However, we ran into issues with integration with our current implementation We wanted to use Terra API to collect health vitals to use in conjunction with the AI health agent, but realized we needed to focus more energy to perfect fewer tasks, including improving the chatbot and UX. We wanted to use Terra API to collect health vitals to use in conjunction with the AI health agent, but realized we needed to focus more energy to perfect fewer tasks, including improving the chatbot and UX.

### What we learned

Prompt engineering Prompt engineering Working with generative ai Working with generative ai POST/GET APIs POST/GET APIs Webhooks Webhooks

### What's next

Live health data from wearable devices (apple watches, oura rings, …) Live health data from wearable devices (apple watches, oura rings, …) Keeping track of medications and possible side effects / interactions Keeping track of medications and possible side effects / interactions Integrate with the sources provided in Perplexity responses to give users external resources that may be relevant to their health concerns. Integrate with the sources provided in Perplexity responses to give users external resources that may be relevant to their health concerns.

## README (from the GitHub repository)

# EverCare

Having witnessed firsthand the challenges that one of our teammates' grandparents faces living alone, we became acutely aware of the difficulties involved in maintaining their health and well-being. Elders like them struggle with remembering daily health updates, deciding when to seek medical attention, and navigating modern technology. This experience deeply inspired us to create EverCare—an app designed not only to simplify health tracking and make it accessible for elders with speech-to-text capabilities but also to provide peace of mind for both seniors and their families. By offering an AI-powered 100% speech-to-text system, EverCare allows seniors to effortlessly record their health updates, which can be easily shared with doctors. This data exchange helps medical professionals assess conditions more accurately and efficiently, improving care and ensuring that both seniors and their families feel more connected and supported in managing health. Our goal is to make it easier for seniors to manage their health, reduce stress, and foster a sense of security in their daily lives.


## To run backend: 

1. Create a virtual environment and install requirements

```
cd backend
python3 -m venv venv
source venv/bin/activate # on MacOS
pip install -r requirements.txt
```

2. Start server

```
python3 server.py
```

## To run frontend

```
cd frontend
npm install
npm start
```

View the website on http://localhost:3000/ 

## Detected evidence (automated analysis)

Indexed codebase: 15 recognized source files, 44 KB.
- CSS (language) — detected in the code
- Flask (technology) — detected in the code
- HTML (language) — detected in the code
- JavaScript (language) — detected in the code
- OpenAI (technology) — detected in the code
- Python (language) — detected in the code
- React (technology) — detected in the code

## Codebase structure (from repository index)

### Files (21 of 21)

```
backend/.gitignore
backend/requirements.txt
backend/server.py
frontend/.gitignore
frontend/package.json
frontend/public/index.html
frontend/public/manifest.json
frontend/public/robots.txt
frontend/README.md
frontend/src/App.css
frontend/src/App.js
frontend/src/ChatPage.css
frontend/src/ChatPage.js
frontend/src/CreateUser.js
frontend/src/index.js
frontend/src/MainPage.js
frontend/src/MyRecords.css
frontend/src/MyRecords.js
frontend/src/reportWebVitals.js
frontend/src/setupTests.js
README.md
```

### Dependencies

- backend/requirements.txt: annotated-types@==0.7.0, anyio@==4.8.0, blinker@==1.9.0, bson@==0.5.10, certifi@==2025.1.31, charset-normalizer@==3.4.1, click@==8.1.8, DateTime@==5.5, distro@==1.9.0, dnspython@==2.7.0, elevenlabs@==1.51.0, Flask@==3.1.0, Flask-Cors@==5.0.0, h11@==0.14.0, httpcore@==1.0.7, httpx@==0.28.1, idna@==3.10, itsdangerous@==2.2.0, Jinja2@==3.1.5, jiter@==0.8.2, MarkupSafe@==3.0.2, openai@==1.63.0, pydantic@==2.10.6, pydantic_core@==2.27.2, pymongo@==3.12.1, python-dateutil@==2.9.0.post0, python-dotenv@==1.0.1, pytz@==2025.1, requests@==2.32.3, setuptools@==75.8.0, six@==1.17.0, sniffio@==1.3.1, tqdm@==4.67.1, typing_extensions@==4.12.2, urllib3@==2.3.0, uuid@==1.30, websockets@==14.2, Werkzeug@==3.1.3, zope.interface@==7.2
- frontend/package.json: @testing-library/dom@^10.4.0, @testing-library/jest-dom@^6.6.3, @testing-library/react@^16.2.0, @testing-library/user-event@^13.5.0, font-awesome@^4.7.0, papaparse@^5.5.2, react@^19.0.0, react-dom@^19.0.0, react-icons@^5.4.0, react-router-dom@^6.29.0, react-scripts@5.0.1, web-vitals@^2.1.4

### Recent commits (newest first)

- gitignore fix
- last fix
- evercare
- rename
- change popup content
- added more animations
- add animations
- remove doctor for now
- add popup
- change width chat
- frontend fixes
- fix readme
- update readme
- fix
- fix + prompt
- fix backend
- fix datetime
- prompting + delete users
- added text-to-speech and frontend
- Delete backend/venv3.10 directory

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

### backend/requirements.txt

```
annotated-types==0.7.0
anyio==4.8.0
blinker==1.9.0
bson==0.5.10
certifi==2025.1.31
charset-normalizer==3.4.1
click==8.1.8
DateTime==5.5
distro==1.9.0
dnspython==2.7.0
elevenlabs==1.51.0
Flask==3.1.0
Flask-Cors==5.0.0
h11==0.14.0
httpcore==1.0.7
httpx==0.28.1
idna==3.10
itsdangerous==2.2.0
Jinja2==3.1.5
jiter==0.8.2
MarkupSafe==3.0.2
openai==1.63.0
pydantic==2.10.6
pydantic_core==2.27.2
pymongo==3.12.1
python-dateutil==2.9.0.post0
python-dotenv==1.0.1
pytz==2025.1
requests==2.32.3
setuptools==75.8.0
six==1.17.0
sniffio==1.3.1
tqdm==4.67.1
typing_extensions==4.12.2
urllib3==2.3.0
uuid==1.30
websockets==14.2
Werkzeug==3.1.3
zope.interface==7.2

```

### frontend/package.json

```
{
  "name": "frontend",
  "version": "0.1.0",
  "private": true,
  "proxy": "http://localhost:5000",
  "dependencies": {
    "@testing-library/dom": "^10.4.0",
    "@testing-library/jest-dom": "^6.6.3",
    "@testing-library/react": "^16.2.0",
    "@testing-library/user-event": "^13.5.0",
    "font-awesome": "^4.7.0",
    "papaparse": "^5.5.2",
    "react": "^19.0.0",
    "react-dom": "^19.0.0",
    "react-icons": "^5.4.0",
    "react-router-dom": "^6.29.0",
    "react-scripts": "5.0.1",
    "web-vitals": "^2.1.4"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

```

### backend/server.py

```python
import os
from flask import Flask, request, jsonify
from flask_cors import CORS
from pymongo import MongoClient
from bson import ObjectId
import openai
from werkzeug.utils import secure_filename
import tempfile
from dotenv import load_dotenv
import uuid
import requests
from datetime import datetime
from dotenv import load_dotenv
from elevenlabs.client import ElevenLabs

load_dotenv()

# Set up API keys
openai.api_key = os.getenv('OPENAI_API_KEY')
openai_client = openai.OpenAI()

perplexity_api_key = os.getenv('PERPLEXITY_API_KEY')
perplexity_url = "https://api.perplexity.ai/chat/completions"


app = Flask(__name__)
CORS(app)  # Enable CORS for frontend requests

# MongoDB setup
client = MongoClient("mongodb://localhost:27017/")
db = client["demo"]
users = db["users"]
entries = db["entries"]

# Allowed file extensions for audio upload
ALLOWED_EXTENSIONS = {"wav", "mp3", "ogg", "webm"}

# Function to check allowed file extensions
def allowed_file(filename):
    return "." in filename and filename.rsplit(".", 1)[1].lower() in ALLOWED_EXTENSIONS

ELEVEN_LABS_API_KEY = os.getenv('ELEVEN_LABS_API_KEY')
ELEVEN_LABS_VOICE_ID = os.getenv('ELEVEN_LABS_VOICE_ID')

AUDIO_DIR = "static/audio"
os.makedirs(AUDIO_DIR, exist_ok=True)

# Create user
@app.route("/users", methods=["POST"])
def add_user():
    try:
        data = request.json
        result = users.insert_one(data)
        return jsonify({"message": "User added", "user_id": str(result.inserted_id)}), 201
    except Exception as e:
        return jsonify({"error": str(e)}), 400

# Get all users
@app.route("/users", methods=["GET"])
def get_users():
    try:
        user_list = []
        for user in users.find():
            user_list.append({"_id": str(user["_id"]), "name": user.get("name", "N/A"), "age": user.get("age", "N/A"), "username": user.get("username", "N/A")})
        return jsonify(user_list), 200
    except Exception as e:
        return jsonify({"error": str(e)}), 400
    
# Get user by username
@app.route("/users/<username>", methods=["GET"])
def get_user(username): 
    try:
        user = users.find_one({"username": username})
        if user is None:
            return jsonify({"message": "User not found"}), 404

        user['_id'] = str(user['_id'])

        return jsonify(user), 200

    except Exception as e:
        return jsonify({"error": str(e)}), 


@app.route("/users/<username>", methods=["PATCH"])
def update_user(username):
    try:
        data = request.json
        update = {}
        for field in data:
            update[field] = data[field]

        result = users.update_one({"username": username}, {"$set": update})
        if result.matched_count == 1:
            return jsonify({"message": "User updated successfully."}), 200
        else:
            return jsonify({"message": "User not found."}), 404
    except Exception as e:
        return jsonify({"error": str(e)}), 400
    

@app.route("/users/<username>", methods=["DELETE"])
def delete_user(username):
    try:
        result = users.delete_one({"username": username})
        if result.deleted_count == 1:
            return jsonify({"message": f"User with username {username} was deleted successfully."}), 200
        else:
            return jsonify({"message": f"User with username {username} not found."}), 404
    except Exception as e:
        return jsonify({"error": str(e)}),

@app.route("/users", methods=["DELETE"])
def delete_all_users():
    try:
        result = users.delete_many({})  # Deletes all documents in the collection
        return jsonify({"message": f"Deleted {result.deleted_count} users."}), 200
    except Exception as e:
        return jsonify({"error": str(e)}), 500


# Add entry
@app.route("/entries", methods=["POST"])
def add_entry():
    try:
        data = request.json
        username = data.get("username")
        entry = data.get("entry")
        current_datetime = datetime.now()
        date = current_datetime.strftime("%m-%d-%Y")
        time = current_datetime.strftime("%H:%M")

        if not username or not entry:
            return jsonify({"error": "Username and entry are required"}), 400

        entries.insert_one({"username": username, "date": date, "time": time, "entry": entry})
        return jsonify({"message": "Entry added"}), 201
    except Exception as e:
        app.logger.error(e)
        return jsonify({"error": str(e)}), 400
    
@app.route("/entries", methods=["DELETE"])
def delete_all_entries():
    try:
        result = entries.delete_many({})  # Delete all documents in the 'entries' collection
        return jsonify({"message": "Deleted all entries", "deleted_count": result.deleted_count}), 200
    except Exception as e:
        return jsonify({"error": str(e)}), 500


# Get entries for a user
@app.route("/entries/<username>", methods=["GET"])
def get_user_entries(username):
    try:
        user_entries = list(entries.find({"username": username}, {"_id": 0}))
        return jsonify(user_entries), 200
    except Exception as e:
        return jsonify({"error": str(e)}), 400

# Get all entries
@app.route("/entries", methods=["GET"])
def get_entries():
    try:
        cursor = entries.find()
        entries_list = []
        for entry in cursor:
            entry['_id'] = str(entry['_id'])
            entries_list.append({
                "username": entry.get("username", "N/A"),
                "entry": entry.get("entry", "N/A"),
                "date": entry.get("date", "N/A"),
                "time": entry.get("time", "N/A"),
                "_id": entry['_id']
            })
        return jsonify(entries_list), 200
    except Exception as e:
        return jsonify({"error": str(e)}), 500

# Transcribing audio inputs
@app.route("/transcribe", methods=["POST"])
def transcribe_audio():
    if "audio" not in request.files:
        return jsonify({"error": "No audio file provided"}), 400
    
    audio_file = request.files["audio"]
    username = request.form.get("username")  

    if not username:
   
[truncated — 3620 more characters]
```

### frontend/src/index.js

```javascript
import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import reportWebVitals from './reportWebVitals';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();

```

### frontend/src/App.js

```javascript
import React from "react";
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
import CreateUser from "./CreateUser";
import ChatPage from "./ChatPage";
import "./App.css";
import MainPage from "./MainPage";
import MyRecords from "./MyRecords";


function App() {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<CreateUser />} />
        <Route path="/chat" element={<ChatPage />} />
        <Route path="/mainpage" element={<MainPage />} />
        <Route path="/myrecords" element={<MyRecords />} />

      </Routes>
    </Router>
  );
}

export default App;
```

### frontend/src/setupTests.js

```javascript
// jest-dom adds custom jest matchers for asserting on DOM nodes.
// allows you to do things like:
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom';

```

### frontend/src/reportWebVitals.js

```javascript
const reportWebVitals = onPerfEntry => {
  if (onPerfEntry && onPerfEntry instanceof Function) {
    import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
      getCLS(onPerfEntry);
      getFID(onPerfEntry);
      getFCP(onPerfEntry);
      getLCP(onPerfEntry);
      getTTFB(onPerfEntry);
    });
  }
};

export default reportWebVitals;

```

### frontend/src/MyRecords.css

```css
.my-records-container {
    text-align: center;
    padding-top: 5rem;
}

.record-list {
    margin: auto;
    width: 50%;
    text-align: left;
}

.record-item {
    margin-bottom: 20px;
    padding-bottom: 10px;
}

.date-header {
    font-size: 1.5rem;
    margin-top: 20px;
    margin-bottom: 10px;
    color: #333;
    border-top: 1px solid #ccc;
    padding-top: 10px;
}

.record-item {
    margin-bottom: 20px;
    padding-bottom: 10px;
}

.button {
    padding: 8px 16px;
    color: #fff;
    border: none;
    border-radius: 20px;
    cursor: pointer;
    font-size: 14px;
    font-weight: bold;
    margin-right: 10px;
}

.button-vitals {
    background-color: #F1745A;
}

.button-chat {
    background-color: #AF5676;
}

.button-home {
    background-color: #dc3545;
    margin-top: 20px;
}

.popup-overlay {
    position: fixed;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: rgba(0, 0, 0, 0.5);
    display: flex;
    justify-content: center;
    align-items: center;
    z-index: 1000;
  }
  
  .popup-content {
    background: white;
    padding: 20px;
    border-radius: 8px;
    max-width: 500px;
    width: 90%;
    position: relative;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
  }
  
  .popup-title {
    font-size: 1.5rem;
    font-weight: bold;
    margin-bottom: 1rem;
    color: #333;
  }
  
  .popup-details {
    margin: 1rem 0;
  }
  
  .popup-record {
    background: #f5f5f5;
    padding: 1rem;
    border-radius: 4px;
    margin: 0.5rem 0;
  }
  
  .popup-actions {
    display: flex;
    justify-content: flex-end;
    gap: 10px;
    margin-top: 1rem;
  }
  
  .popup-button {
    padding: 8px 16px;
    border-radius: 4px;
    border: none;
    cursor: pointer;
    font-weight: 500;
  }
  
  .popup-button.cancel {
    background-color: #e0e0e0;
    color: #333;
  }
  
  .popup-button.share {
    background-color: #AF5676;
    color: white;
  }
  
  .popup-button:hover {
    opacity: 0.9;
  }
```

### frontend/public/index.html

```html
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <meta
      name="description"
      content="Web site created using create-react-app"
    />
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
    <!--
      manifest.json provides metadata used when your web app is installed on a
      user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
    -->
    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
    <link
    rel="stylesheet"
    href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css"
    <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible+Next:ital,wght@0,200..800;1,200..800&display=swap" rel="stylesheet">
    <!--
      Notice the use of %PUBLIC_URL% in the tags above.
      It will be replaced with the URL of the `public` folder during the build.
      Only files inside the `public` folder can be referenced from the HTML.

      Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
      work correctly both with client-side routing and a non-root public URL.
      Learn how to configure a non-root public URL by running `npm run build`.
    -->
    <title>React App</title>
  </head>
  <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <!--
      This HTML file is a template.
      If you open it directly in the browser, you will see an empty page.

      You can add webfonts, meta tags, or analytics to this file.
      The build step will place the bundled scripts into the <body> tag.

      To begin the development, run `npm start` or `yarn start`.
      To create a production bundle, use `npm run build` or `yarn build`.
    -->
  </body>
</html>

```

### frontend/src/App.css

```css
* {
  font-family: "Atkinson Hyperlegible Next", serif;
  font-optical-sizing: auto;
  font-style: normal;
}
h1, h2, h3, h4, h5, h6 {
  font-size: 2em; /* Increases heading size */
}

p {
  font-size: 1.5em; /* Increases paragraph text size */
}

a {
  font-size: 1.1em; /* Increases link size */
}

base, #root {
  font-family: 'Inter', sans-serif;
  /* text-align: center; */
  background-color: #FBF6EA !important;
  padding-bottom: 250px;
}

input, textarea {
  border: none;
  outline: none;
  width: 100%;
  padding: 12px;
  font-size: 16px;
  background-color: transparent;
  border-bottom: 2px solid #ccc; /* Thin bottom line */
  transition: border-color 0.3s ease-in-out;
}

button {
  font-size: 1.5rem;
}

.btn-green {
  background-color: #5f6864 !important; /* Green background */
  padding-top: 20px !important;
  padding-bottom: 20px !important;
  color: white; /* White text color */
  padding: 8px;
  border: none;
  border-radius: 30px !important;
  cursor: pointer;
  transition: background-color 0.3s ease;
}

.btn-green:hover {
  background-color: #218838 !important; /* Darker green on hover */
}

.btn-orange {
  background-color: #f17453 !important; /* Green background */
  color: white; /* White text color */
  padding: 8px;
  border: none;
  border-radius: 30px !important;
  cursor: pointer;
  transition: background-color 0.3s ease;
}

.btn-orange:hover {
  background-color: #d25b00 !important; /* Darker green on hover */
}

input:focus, textarea:focus {
  border-bottom: 2px solid #ff8800; /* Highlight color on focus */
}

.App-logo {
  height: 40vmin;
  pointer-events: none;
}

@media (prefers-reduced-motion: no-preference) {
  .App-logo {
    animation: App-logo-spin infinite 20s linear;
  }
}

.App-header {
  background-color: #282c34;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  font-size: calc(10px + 2vmin);
}

.App-link {
  color: #61dafb;
}

@keyframes App-logo-spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

.user-chat-box {
  background-color: #D9D9D9;
  width: 25%;
  padding: 20px;
  border: none;
  border-radius: 30px !important;
}

.tts-box {
  background-color: #D9D9D9;
  width: 60%;
  padding: 20px;
  border: none;
  border-radius: 30px !important;
}

.generate-btn {
  background-color: #AF5676;
  color: white; 
  padding: 8px;
  border: none;
  border-radius: 30px !important;
  cursor: pointer;
  transition: background-color 0.3s ease;
}

.generate-btn:hover {
  background-color: #651733 !important; 
}

.conversation-box {
  margin-top: 20px;
  display: flex;
  justify-content: space-around;
  
}


```

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