Initial commit: Miami Alumni Chicagoland Business Directory

A single-page static site listing 11 alumni-owned businesses
in the Chicagoland area, built with Miami University (OH) red/white
color scheme. Responsive grid layout with search and industry filters.
This commit is contained in:
Ozzy (AI Assistant) 2026-07-27 18:22:38 +00:00
commit 4bf85a13b8
2 changed files with 649 additions and 0 deletions

273
index.html Normal file
View file

@ -0,0 +1,273 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Miami Alumni Chicagoland Business Directory</title>
<meta name="description" content="A directory of businesses owned by Miami University (OH) alumni in the Chicagoland area.">
<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=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="style.css">
<link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='4' fill='%23C41E3A'/%3E%3Ctext x='16' y='22' font-family='Georgia,serif' font-size='22' font-weight='bold' fill='white' text-anchor='middle'%3EM%3C/text%3E%3C/svg%3E">
</head>
<body>
<!-- ===== Header ===== -->
<header class="site-header">
<h1>Miami Alumni<br>Chicagoland Business Directory</h1>
<p class="subtitle">Supporting Miami University alumniowned businesses in the greater Chicago area</p>
<span class="miami-badge">Love &amp; Honor 🤍❤️</span>
</header>
<!-- ===== Filter Bar ===== -->
<nav class="filter-bar" role="navigation" aria-label="Filter businesses">
<div class="filter-bar-inner">
<div class="stats">
<strong id="totalCount">11</strong> businesses
</div>
<div class="search-wrapper">
<input type="text" id="searchInput" placeholder="Search by name, industry, or location…" aria-label="Search businesses">
</div>
<div class="industry-filters" id="industryFilters">
<button class="industry-btn active" data-filter="all">All</button>
</div>
</div>
</nav>
<!-- ===== Directory Grid ===== -->
<main>
<div class="directory-grid" id="directoryGrid"></div>
</main>
<!-- ===== Footer ===== -->
<footer class="site-footer">
<div>Miami University Alumni Chicagoland Chapter</div>
<div><a href="https://www.miamialum.org" target="_blank" rel="noopener">miamialum.org</a></div>
<div class="footer-love">Made with Love &amp; Honor for the Miami community</div>
</footer>
<!-- ===== Data & Script ===== -->
<script>
// ─── Business Data ────────────────────────────────────────────────
// Sorted alphabetically by company name
const businesses = [
{
company: "Centered Therapy Chicago",
alumni: "Bianka Hardin",
role: "Owner",
industry: "Mental Health Care",
location: "Chicago, IL",
address: "1507 W. Lawrence, Chicago, IL",
description: "Mental health practice providing individual, couples, and family therapy services.",
phone: "(773) 569-1426",
email: null,
website: null
},
{
company: "Chicago Pelvic Health and Wellness",
alumni: "Jana Fronda",
role: "Owner/Founder",
industry: "Health Wellness and Fitness",
location: "Wheaton, IL",
address: "301 S County Farm Rd Suite H, Wheaton, IL",
description: "Specialized pelvic floor physical therapy clinic dedicated to women's health and wellness.",
phone: "(773) 219-2749",
email: null,
website: null
},
{
company: "Garrett Consulting",
alumni: "Steve Garrett",
role: "Owner/Founder",
industry: "Human Resources",
location: "Chicago, IL",
address: "5442 N Ashland Ave Apt 1, Chicago, IL",
description: "Leadership development consulting since the late 1980s — executive coaching, leadership training, and assessments.",
phone: "(312) 208-0636",
email: null,
website: null
},
{
company: "GLP Capital Partners",
alumni: "Britton Leigh",
role: "Partner",
industry: "Investment Management",
location: "Chicago, IL",
address: "10 S. Wacker, Chicago, IL",
description: "Global alternative asset manager specializing in logistics, self-storage, and data center assets.",
phone: null,
email: null,
website: null
},
{
company: "John Tyler Carlson State Farm Agency",
alumni: "John Carlson",
role: "Owner/Founder",
industry: "Insurance",
location: "Evanston, IL",
address: "829 Main St, Evanston, IL",
description: "State Farm Agency providing insurance and financial services to the Evanston community.",
phone: "(847) 869-2336",
email: null,
website: null
},
{
company: "The Lakefront Restaurant",
alumni: "Emily LeFevers",
role: "Owner",
industry: "Food &amp; Beverages",
location: "Chicago, IL",
address: "2401 N Lake Shore Dr, Chicago, IL (Theater on the Lake building)",
description: "Upscale tavern with indoor/outdoor seating offering a premier lakeside dining experience.",
phone: "(312) 414-1313",
email: null,
website: null
},
{
company: "Millennium Hall",
alumni: "Brendan Greenlee",
role: "Owner",
industry: "Food &amp; Beverages",
location: "Chicago, IL",
address: "11 N Michigan Ave, Chicago, IL (underneath Cloud Gate)",
description: "Collective eatery offering diverse food options in the heart of Millennium Park.",
phone: null,
email: null,
website: null
},
{
company: "Morgan Stanley Wealth Management",
alumni: "James Lamoree",
role: "Private Wealth Advisor",
industry: "Financial Services",
location: "Chicago, IL",
address: "227 W. Monroe St, Chicago, IL",
description: "Private wealth management and financial advisory services for individuals and families.",
phone: null,
email: null,
website: null
},
{
company: "New York Life Insurance and NYLIFE Securities",
alumni: "Mary Beth Velzy",
role: "Owner",
industry: "Financial Services",
location: "Chicago, IL",
address: "500 W. Madison St Suite 1725, Chicago, IL",
description: "Female-owned practice serving professionals and businesses with insurance and securities solutions.",
phone: "(312) 493-7216",
email: null,
website: null
},
{
company: "Renee Davis Consulting",
alumni: "Renee Davis",
role: "Owner/Founder",
industry: "Nonprofit Organization Management",
location: "Western Springs, IL",
address: "4310 Lawn Avenue, Western Springs, IL",
description: "Consulting and coaching for nonprofit leaders and fundraisers to maximize their impact.",
phone: "(312) 231-9712",
email: null,
website: null
},
{
company: "Ruggaard &amp; Associates, LLC",
alumni: "Ryan Ruggaard",
role: "Owner/Partner",
industry: "Investment Management",
location: "Chicago, IL",
address: "171 N Aberdeen St Suite 400, Chicago, IL",
description: "Registered investment advisor serving 300+ clients across 35 states. Contact Ryan at ryan@ruggaard.net or Randy at randy@ruggaard.net.",
phone: "(330) 487-5888",
email: null,
website: null
}
];
// ─── Render ───────────────────────────────────────────────────────
const grid = document.getElementById('directoryGrid');
const searchInput = document.getElementById('searchInput');
const industryFilterBar = document.getElementById('industryFilters');
const totalCount = document.getElementById('totalCount');
// Collect unique industries
const allIndustries = [...new Set(businesses.map(b => b.industry))].sort();
allIndustries.forEach(ind => {
const btn = document.createElement('button');
btn.className = 'industry-btn';
btn.dataset.filter = ind;
btn.textContent = ind;
industryFilterBar.appendChild(btn);
});
let activeFilter = 'all';
let activeSearch = '';
function render() {
const filtered = businesses.filter(b => {
const matchIndustry = activeFilter === 'all' || b.industry === activeFilter;
if (!matchIndustry) return false;
if (!activeSearch) return true;
const q = activeSearch.toLowerCase();
return b.company.toLowerCase().includes(q) ||
b.alumni.toLowerCase().includes(q) ||
b.industry.toLowerCase().includes(q) ||
b.location.toLowerCase().includes(q) ||
b.description.toLowerCase().includes(q);
});
totalCount.textContent = businesses.length;
if (filtered.length === 0) {
grid.innerHTML = `<div class="no-results">
<h3>No businesses found</h3>
<p>Try adjusting your search or filter.</p>
</div>`;
return;
}
grid.innerHTML = filtered.map(b => `
<article class="business-card">
<div class="card-accent"></div>
<div class="card-body">
<h2 class="card-company">${b.company}</h2>
<div class="card-alumni">${b.alumni} — ${b.role}</div>
<div class="card-tags">
<span class="card-tag industry">${b.industry}</span>
<span class="card-tag location">${b.location}</span>
</div>
<p class="card-description">${b.description}</p>
<div class="card-contact">
<div class="contact-item">📍 ${b.address}</div>
${b.phone ? `<div class="contact-item">📞 <a href="tel:${b.phone.replace(/[^0-9]/g, '')}">${b.phone}</a></div>` : ''}
${b.email ? `<div class="contact-item">✉️ <a href="mailto:${b.email}">${b.email}</a></div>` : ''}
${b.website ? `<div class="contact-item">🌐 <a href="${b.website}" target="_blank" rel="noopener">${b.website.replace(/^https?:\/\//, '')}</a></div>` : ''}
</div>
</div>
</article>
`).join('');
}
// ─── Event Listeners ──────────────────────────────────────────────
searchInput.addEventListener('input', e => {
activeSearch = e.target.value;
render();
});
industryFilterBar.addEventListener('click', e => {
const btn = e.target.closest('.industry-btn');
if (!btn) return;
industryFilterBar.querySelectorAll('.industry-btn').forEach(b => b.classList.remove('active'));
btn.classList.add('active');
activeFilter = btn.dataset.filter;
render();
});
// ─── Initial Render ───────────────────────────────────────────────
render();
</script>
</body>
</html>

376
style.css Normal file
View file

@ -0,0 +1,376 @@
/* ===== Miami University (OH) Alumni Business Directory ===== */
/* Color scheme: Miami Red #C41E3A, White, Cream background */
:root {
--miami-red: #C41E3A;
--miami-red-dark: #9E182E;
--miami-red-light: #E84C65;
--white: #FFFFFF;
--cream: #F8F5F0;
--light-gray: #EAE7E0;
--medium-gray: #8A8580;
--dark-gray: #3A3530;
--text: #2A2520;
--shadow: 0 2px 12px rgba(0, 0, 0, 0.08);
--shadow-hover: 0 6px 24px rgba(196, 30, 58, 0.12);
--radius: 12px;
--max-width: 1280px;
}
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
scroll-behavior: smooth;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
background-color: var(--cream);
color: var(--text);
line-height: 1.6;
min-height: 100vh;
}
/* ===== Header ===== */
.site-header {
background: linear-gradient(135deg, var(--miami-red) 0%, var(--miami-red-dark) 100%);
color: var(--white);
padding: 3rem 1.5rem 2.5rem;
text-align: center;
position: relative;
overflow: hidden;
}
.site-header::before {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: radial-gradient(circle at 30% 50%, rgba(255,255,255,0.05) 0%, transparent 50%);
pointer-events: none;
}
.site-header h1 {
font-size: 2.25rem;
font-weight: 700;
letter-spacing: -0.02em;
margin-bottom: 0.5rem;
position: relative;
}
.site-header .subtitle {
font-size: 1.1rem;
opacity: 0.9;
font-weight: 400;
position: relative;
}
.site-header .miami-badge {
display: inline-block;
margin-top: 1rem;
padding: 0.35rem 1.25rem;
border: 2px solid rgba(255,255,255,0.35);
border-radius: 100px;
font-size: 0.85rem;
font-weight: 600;
letter-spacing: 0.05em;
text-transform: uppercase;
position: relative;
}
/* ===== Navigation / Filters ===== */
.filter-bar {
background: var(--white);
border-bottom: 1px solid var(--light-gray);
padding: 1rem 1.5rem;
position: sticky;
top: 0;
z-index: 100;
}
.filter-bar-inner {
max-width: var(--max-width);
margin: 0 auto;
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.filter-bar .stats {
font-size: 0.9rem;
color: var(--medium-gray);
font-weight: 500;
}
.filter-bar .stats strong {
color: var(--miami-red);
}
.filter-bar .search-wrapper {
flex: 1;
max-width: 400px;
min-width: 200px;
}
.filter-bar input[type="text"] {
width: 100%;
padding: 0.6rem 1rem 0.6rem 2.5rem;
border: 2px solid var(--light-gray);
border-radius: 8px;
font-size: 0.9rem;
font-family: inherit;
background: var(--cream) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%238A8580' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'/%3E%3C/svg%3E") 0.8rem center no-repeat;
transition: border-color 0.2s;
}
.filter-bar input[type="text"]:focus {
outline: none;
border-color: var(--miami-red);
background-color: var(--white);
}
.filter-bar .industry-filters {
display: flex;
gap: 0.4rem;
flex-wrap: wrap;
}
.filter-bar .industry-btn {
padding: 0.4rem 0.8rem;
border: 1.5px solid var(--light-gray);
border-radius: 6px;
background: var(--white);
font-size: 0.78rem;
font-family: inherit;
font-weight: 500;
color: var(--medium-gray);
cursor: pointer;
transition: all 0.15s;
}
.filter-bar .industry-btn:hover {
border-color: var(--miami-red-light);
color: var(--miami-red);
}
.filter-bar .industry-btn.active {
background: var(--miami-red);
border-color: var(--miami-red);
color: var(--white);
}
/* ===== Main Content ===== */
main {
max-width: var(--max-width);
margin: 0 auto;
padding: 2rem 1.5rem 4rem;
}
.directory-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(360px, 1fr));
gap: 1.5rem;
}
/* ===== Business Card ===== */
.business-card {
background: var(--white);
border-radius: var(--radius);
box-shadow: var(--shadow);
transition: transform 0.2s ease, box-shadow 0.2s ease;
overflow: hidden;
display: flex;
flex-direction: column;
}
.business-card:hover {
transform: translateY(-3px);
box-shadow: var(--shadow-hover);
}
.card-accent {
height: 4px;
background: linear-gradient(90deg, var(--miami-red), var(--miami-red-light));
}
.card-body {
padding: 1.5rem;
flex: 1;
display: flex;
flex-direction: column;
}
.card-company {
font-size: 1.2rem;
font-weight: 700;
color: var(--dark-gray);
margin-bottom: 0.3rem;
line-height: 1.3;
}
.card-alumni {
font-size: 0.9rem;
color: var(--miami-red);
font-weight: 600;
margin-bottom: 0.75rem;
display: flex;
align-items: center;
gap: 0.4rem;
}
.card-alumni::before {
content: '🎓';
font-size: 0.85rem;
}
.card-tags {
display: flex;
gap: 0.4rem;
margin-bottom: 0.75rem;
flex-wrap: wrap;
}
.card-tag {
display: inline-block;
padding: 0.2rem 0.6rem;
border-radius: 4px;
font-size: 0.75rem;
font-weight: 600;
letter-spacing: 0.02em;
}
.card-tag.industry {
background: #FFF0F2;
color: var(--miami-red);
}
.card-tag.location {
background: #EDE9E2;
color: #6B655E;
}
.card-description {
font-size: 0.9rem;
color: #5A5550;
line-height: 1.55;
margin-bottom: 1rem;
flex: 1;
}
.card-contact {
border-top: 1px solid var(--light-gray);
padding-top: 0.85rem;
margin-top: auto;
}
.card-contact .contact-item {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.85rem;
color: var(--medium-gray);
margin-bottom: 0.3rem;
}
.card-contact .contact-item:last-child {
margin-bottom: 0;
}
.card-contact a {
color: var(--miami-red);
text-decoration: none;
font-weight: 500;
transition: color 0.15s;
}
.card-contact a:hover {
color: var(--miami-red-dark);
text-decoration: underline;
}
/* ===== Empty State ===== */
.no-results {
grid-column: 1 / -1;
text-align: center;
padding: 3rem;
color: var(--medium-gray);
}
.no-results h3 {
font-size: 1.2rem;
margin-bottom: 0.5rem;
color: var(--dark-gray);
}
/* ===== Footer ===== */
.site-footer {
background: var(--dark-gray);
color: rgba(255,255,255,0.7);
text-align: center;
padding: 2rem 1.5rem;
font-size: 0.85rem;
line-height: 1.8;
}
.site-footer a {
color: var(--miami-red-light);
text-decoration: none;
}
.site-footer a:hover {
text-decoration: underline;
}
.site-footer .footer-love {
margin-top: 0.5rem;
font-size: 0.8rem;
opacity: 0.6;
}
/* ===== Responsive ===== */
@media (max-width: 768px) {
.site-header h1 {
font-size: 1.6rem;
}
.site-header {
padding: 2rem 1rem 1.75rem;
}
.directory-grid {
grid-template-columns: 1fr;
gap: 1rem;
}
.filter-bar-inner {
flex-direction: column;
align-items: stretch;
}
.filter-bar .search-wrapper {
max-width: none;
}
.filter-bar .industry-filters {
justify-content: center;
}
main {
padding: 1rem 1rem 3rem;
}
}
@media (min-width: 769px) and (max-width: 1024px) {
.directory-grid {
grid-template-columns: repeat(2, 1fr);
}
}
/* Print styles */
@media print {
.filter-bar { display: none; }
.business-card { break-inside: avoid; box-shadow: none; border: 1px solid #ccc; }
.site-header { break-after: avoid; padding: 1rem; }
}