Gym — Big-Box Chain Gym Landing
A bright, mass-market big-box chain gym landing page with a friendly hero, a clear join-for-19-a-month call to action and a find-a-club-near-you search. It includes an amenities grid, a three-tier membership row, a filterable locations strip, member testimonials and an FAQ accordion. Built with accessible semantic HTML, a clean red-and-steel light theme and dependency-free vanilla JavaScript for the navigation, location filtering, plan selection and accordion interactions.
MCP
コード
:root {
--bg: #ffffff;
--surface: #f4f5f7;
--surface-2: #eceef1;
--ink: #15181d;
--ink-2: #444a52;
--muted: #6b727b;
--red: #e11d2a;
--red-d: #bf1623;
--steel: #2b3340;
--steel-2: #3f4a5a;
--line: rgba(20, 24, 29, 0.1);
--line-2: rgba(20, 24, 29, 0.18);
--green: #16a34a;
--r-sm: 8px;
--r-md: 14px;
--r-lg: 20px;
--shadow-sm: 0 1px 2px rgba(20, 24, 29, 0.06), 0 1px 3px rgba(20, 24, 29, 0.08);
--shadow-md: 0 6px 16px rgba(20, 24, 29, 0.1);
--shadow-lg: 0 20px 50px rgba(20, 24, 29, 0.16);
}
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body {
margin: 0;
font-family: "Inter", system-ui, -apple-system, sans-serif;
background: var(--bg);
color: var(--ink);
line-height: 1.5;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
h1, h2, h3, h4 { margin: 0; line-height: 1.1; letter-spacing: -0.02em; }
p { margin: 0; }
a { color: inherit; text-decoration: none; }
ul { margin: 0; padding: 0; list-style: none; }
img { max-width: 100%; display: block; }
.wrap { width: min(1180px, 100% - 40px); margin-inline: auto; }
.visually-hidden {
position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px;
overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0;
}
.skip-link {
position: absolute; left: 12px; top: -60px; z-index: 200;
background: var(--ink); color: #fff; padding: 10px 16px; border-radius: var(--r-sm);
transition: top 0.2s;
}
.skip-link:focus { top: 12px; }
:focus-visible { outline: 3px solid var(--red); outline-offset: 2px; border-radius: 4px; }
/* Buttons */
.btn {
--pad-y: 11px; --pad-x: 18px;
display: inline-flex; align-items: center; justify-content: center; gap: 8px;
font-family: inherit; font-weight: 800; font-size: 0.95rem;
padding: var(--pad-y) var(--pad-x); border-radius: 999px; border: 2px solid transparent;
cursor: pointer; transition: transform 0.12s ease, background 0.18s, box-shadow 0.18s, color 0.18s;
white-space: nowrap; line-height: 1;
}
.btn:active { transform: translateY(1px) scale(0.99); }
.btn-lg { --pad-y: 16px; --pad-x: 28px; font-size: 1.05rem; }
.btn-block { width: 100%; }
.btn-primary { background: var(--red); color: #fff; box-shadow: 0 6px 16px rgba(225, 29, 42, 0.28); }
.btn-primary:hover { background: var(--red-d); box-shadow: 0 10px 24px rgba(225, 29, 42, 0.36); }
.btn-dark { background: var(--steel); color: #fff; }
.btn-dark:hover { background: var(--steel-2); }
.btn-outline { background: #fff; color: var(--ink); border-color: var(--line-2); }
.btn-outline:hover { border-color: var(--ink); background: var(--surface); }
.btn-ghost { background: transparent; color: var(--ink); }
.btn-ghost:hover { background: var(--surface); }
.badge {
display: inline-flex; align-items: center; font-size: 0.72rem; font-weight: 800;
text-transform: uppercase; letter-spacing: 0.04em; padding: 4px 10px; border-radius: 999px;
}
.badge-red { background: rgba(225, 29, 42, 0.12); color: var(--red-d); }
.badge-green { background: rgba(22, 163, 74, 0.12); color: var(--green); }
.badge-grey { background: var(--surface-2); color: var(--muted); }
/* Header */
.site-header {
position: sticky; top: 0; z-index: 100;
background: rgba(255, 255, 255, 0.9); backdrop-filter: blur(10px);
border-bottom: 1px solid var(--line);
}
.header-inner { display: flex; align-items: center; gap: 24px; height: 68px; }
.brand { display: flex; align-items: center; gap: 10px; font-weight: 900; font-size: 1.2rem; }
.brand-mark {
display: grid; place-items: center; width: 34px; height: 34px; border-radius: 9px;
background: var(--red); color: #fff; font-weight: 900; font-size: 0.85rem; letter-spacing: -0.03em;
}
.brand-word { letter-spacing: -0.03em; }
.primary-nav { display: flex; gap: 6px; margin-left: 12px; }
.primary-nav a {
font-weight: 600; font-size: 0.95rem; color: var(--ink-2); padding: 8px 12px; border-radius: var(--r-sm);
transition: background 0.15s, color 0.15s;
}
.primary-nav a:hover { background: var(--surface); color: var(--ink); }
.header-actions { display: flex; align-items: center; gap: 10px; margin-left: auto; }
.nav-toggle {
display: none; flex-direction: column; gap: 5px; width: 44px; height: 44px;
border: 1px solid var(--line); background: #fff; border-radius: var(--r-sm); cursor: pointer;
align-items: center; justify-content: center;
}
.nav-toggle span { width: 20px; height: 2px; background: var(--ink); border-radius: 2px; transition: 0.2s; }
.nav-toggle[aria-expanded="true"] span:nth-child(1) { transform: translateY(7px) rotate(45deg); }
.nav-toggle[aria-expanded="true"] span:nth-child(2) { opacity: 0; }
.nav-toggle[aria-expanded="true"] span:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }
/* Hero */
.hero {
background:
radial-gradient(900px 500px at 85% -10%, rgba(225, 29, 42, 0.08), transparent 60%),
linear-gradient(180deg, #fff, var(--surface));
padding: 64px 0 72px;
}
.hero-grid { display: grid; grid-template-columns: 1.15fr 0.85fr; gap: 56px; align-items: center; }
.eyebrow {
text-transform: uppercase; letter-spacing: 0.12em; font-weight: 800; font-size: 0.78rem;
color: var(--red); margin-bottom: 14px;
}
.hero h1 { font-size: clamp(2.6rem, 5.5vw, 4.4rem); font-weight: 900; letter-spacing: -0.035em; }
.hero h1 .hl { color: var(--red); }
.hero h1 .per { font-size: 0.45em; color: var(--muted); font-weight: 800; }
.lede { margin-top: 18px; font-size: 1.12rem; color: var(--ink-2); max-width: 40ch; }
.hero-cta { display: flex; gap: 12px; margin-top: 26px; flex-wrap: wrap; }
.club-search {
margin-top: 26px; display: flex; gap: 10px; background: #fff; padding: 8px;
border: 1px solid var(--line); border-radius: 999px; box-shadow: var(--shadow-sm); max-width: 560px;
}
.search-field { display: flex; align-items: center; gap: 8px; flex: 1; padding-left: 12px; }
.search-field .pin { width: 20px; height: 20px; fill: var(--muted); flex: none; }
.search-field input {
flex: 1; border: none; background: transparent; font: inherit; font-size: 1rem; color: var(--ink);
padding: 10px 4px;
}
.search-field input:focus { outline: none; }
.trust-row { display: flex; gap: 28px; margin-top: 26px; flex-wrap: wrap; }
.trust-row li { color: var(--muted); font-size: 0.9rem; font-weight: 600; }
.trust-row strong { display: block; color: var(--ink); font-size: 1.5rem; font-weight: 900; letter-spacing: -0.02em; }
/* Hero visual */
.hero-visual { position: relative; min-height: 360px; }
.hero-card {
position: absolute; background: #fff; border: 1px solid var(--line); border-radius: var(--r-lg);
padding: 20px; box-shadow: var(--shadow-lg); display: flex; flex-direction: column; gap: 4px;
}
.hero-card-a { top: 0; right: 0; width: 270px; }
.hero-card-b {
bottom: 12px; left: 0; width: 150px; align-items: flex-start;
background: var(--steel); color: #fff; border-color: transparent;
}
.hero-card-c { bottom: 88px; right: 30px; width: 230px; }
.hc-eyebrow { font-size: 0.72rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); }
.hc-title { font-size: 1.15rem; font-weight: 900; }
.hc-sub { font-size: 0.85rem; color: var(--ink-2); }
.hero-card-a .badge { align-self: flex-start; margin-top: 8px; }
.hc-stat { font-size: 2.2rem; font-weight: 900; letter-spacing: -0.03em; }
.hc-label { font-size: 0.85rem; opacity: 0.8; font-weight: 600; }
/* Logos */
.logos { border-bottom: 1px solid var(--line); padding: 26px 0; background: #fff; }
.logos-inner { display: flex; align-items: center; gap: 32px; flex-wrap: wrap; }
.logos-inner > span { font-size: 0.78rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.1em; color: var(--muted); }
.logos-inner ul { display: flex; gap: 32px; flex-wrap: wrap; }
.logos-inner li { font-weight: 900; letter-spacing: 0.04em; color: var(--ink-2); opacity: 0.6; font-size: 0.95rem; }
/* Sections */
.section { padding: 72px 0; }
.section-alt { background: var(--surface); }
.section-head { text-align: center; max-width: 640px; margin: 0 auto 44px; }
.section-head-left { text-align: left; margin-inline: 0; }
.section-head h2 { font-size: clamp(1.9rem, 3.5vw, 2.7rem); font-weight: 900; }
.section-sub { margin-top: 12px; color: var(--ink-2); font-size: 1.05rem; }
/* Amenities */
.amenity-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; }
.amenity {
background: #fff; border: 1px solid var(--line); border-radius: var(--r-lg); padding: 26px;
transition: transform 0.18s, box-shadow 0.18s, border-color 0.18s;
}
.amenity:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); border-color: var(--line-2); }
.amenity-icon {
display: grid; place-items: center; width: 52px; height: 52px; border-radius: var(--r-md);
background: rgba(225, 29, 42, 0.08); font-size: 1.5rem; margin-bottom: 14px;
}
.amenity h3 { font-size: 1.2rem; font-weight: 800; margin-bottom: 6px; }
.amenity p { color: var(--ink-2); font-size: 0.95rem; }
/* Plans */
.plan-row { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; align-items: stretch; }
.plan {
position: relative; background: #fff; border: 1px solid var(--line); border-radius: var(--r-lg);
padding: 30px 26px; display: flex; flex-direction: column;
transition: transform 0.18s, box-shadow 0.18s;
}
.plan:hover { transform: translateY(-4px); box-shadow: var(--shadow-md); }
.plan-featured { border: 2px solid var(--red); box-shadow: var(--shadow-lg); }
.plan-badge {
position: absolute; top: -13px; left: 50%; transform: translateX(-50%);
background: var(--red); color: #fff; font-size: 0.72rem; font-weight: 800; text-transform: uppercase;
letter-spacing: 0.06em; padding: 6px 14px; border-radius: 999px;
}
.plan-name { font-size: 1.1rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.04em; color: var(--steel); }
.plan-price { margin: 12px 0 4px; display: flex; align-items: baseline; gap: 4px; }
.plan-price .amt { font-size: 3rem; font-weight: 900; letter-spacing: -0.04em; }
.plan-price .cyc { color: var(--muted); font-weight: 700; }
.plan-tag { color: var(--ink-2); margin-bottom: 20px; font-size: 0.95rem; }
.plan-feats { display: flex; flex-direction: column; gap: 11px; margin-bottom: 24px; flex: 1; }
.plan-feats li { position: relative; padding-left: 28px; color: var(--ink-2); font-size: 0.95rem; }
.plan-feats li::before {
content: "✓"; position: absolute; left: 0; top: -1px; width: 20px; height: 20px; border-radius: 50%;
background: rgba(22, 163, 74, 0.14); color: var(--green); font-weight: 900; font-size: 0.75rem;
display: grid; place-items: center;
}
/* Locations */
.loc-search { max-width: 520px; margin: 0 auto 28px; }
.loc-search input {
width: 100%; font: inherit; font-size: 1rem; padding: 14px 18px; border-radius: 999px;
border: 1px solid var(--line-2); background: #fff; box-shadow: var(--shadow-sm);
}
.loc-search input:focus { outline: none; border-color: var(--red); box-shadow: 0 0 0 3px rgba(225, 29, 42, 0.15); }
.loc-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; }
.loc-card {
background: #fff; border: 1px solid var(--line); border-radius: var(--r-md); padding: 20px;
transition: transform 0.18s, box-shadow 0.18s;
}
.loc-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); }
.loc-head { display: flex; justify-content: space-between; align-items: center; gap: 10px; margin-bottom: 6px; }
.loc-head h3 { font-size: 1.05rem; font-weight: 800; }
.loc-addr { color: var(--ink-2); font-size: 0.9rem; margin-bottom: 12px; }
.loc-tags { display: flex; gap: 6px; flex-wrap: wrap; }
.loc-tags li { font-size: 0.75rem; font-weight: 700; color: var(--steel-2); background: var(--surface); padding: 4px 10px; border-radius: 999px; }
.loc-empty { text-align: center; color: var(--muted); margin-top: 28px; font-weight: 600; }
/* Reviews */
.review-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 18px; }
.review {
margin: 0; background: #fff; border: 1px solid var(--line); border-radius: var(--r-lg); padding: 28px;
display: flex; flex-direction: column; gap: 14px;
}
.stars { color: #f5a623; font-size: 1.1rem; letter-spacing: 2px; }
.review blockquote { margin: 0; font-size: 1.02rem; color: var(--ink); font-weight: 500; }
.review figcaption { display: flex; flex-direction: column; }
.rv-name { font-weight: 800; }
.rv-meta { color: var(--muted); font-size: 0.85rem; }
/* FAQ */
.faq-wrap { max-width: 820px; }
.faq-list { display: flex; flex-direction: column; gap: 12px; margin-top: 8px; }
.faq-item { border: 1px solid var(--line); border-radius: var(--r-md); background: #fff; overflow: hidden; }
.faq-q {
width: 100%; display: flex; justify-content: space-between; align-items: center; gap: 16px;
background: none; border: none; font: inherit; font-weight: 700; font-size: 1.05rem; color: var(--ink);
text-align: left; padding: 20px 22px; cursor: pointer;
}
.faq-q:hover { background: var(--surface); }
.faq-icon { position: relative; width: 18px; height: 18px; flex: none; }
.faq-icon::before, .faq-icon::after {
content: ""; position: absolute; background: var(--red); border-radius: 2px;
top: 50%; left: 50%; transform: translate(-50%, -50%); transition: transform 0.22s;
}
.faq-icon::before { width: 18px; height: 2.5px; }
.faq-icon::after { width: 2.5px; height: 18px; }
.faq-q[aria-expanded="true"] .faq-icon::after { transform: translate(-50%, -50%) scaleY(0); }
.faq-a { max-height: 0; overflow: hidden; transition: max-height 0.28s ease; }
.faq-a p { padding: 0 22px 22px; color: var(--ink-2); }
/* Join CTA */
.join-cta { background: var(--steel); color: #fff; padding: 56px 0; }
.join-inner { display: flex; align-items: center; justify-content: space-between; gap: 28px; flex-wrap: wrap; }
.join-inner h2 { font-size: clamp(1.7rem, 3vw, 2.4rem); font-weight: 900; }
.join-inner p { color: rgba(255, 255, 255, 0.7); margin-top: 8px; font-size: 1.05rem; }
/* Footer */
.site-footer { background: var(--bg); border-top: 1px solid var(--line); padding-top: 48px; }
.footer-inner { display: flex; justify-content: space-between; gap: 40px; flex-wrap: wrap; padding-bottom: 36px; }
.footer-brand { max-width: 260px; }
.footer-brand p { color: var(--ink-2); margin-top: 12px; font-size: 0.95rem; }
.footer-cols { display: flex; gap: 56px; flex-wrap: wrap; }
.footer-cols h4 { font-size: 0.8rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); margin-bottom: 12px; }
.footer-cols a { display: block; color: var(--ink-2); padding: 5px 0; font-size: 0.95rem; }
.footer-cols a:hover { color: var(--ink); }
.footer-bottom { border-top: 1px solid var(--line); padding: 20px 0; }
.footer-bottom p { color: var(--muted); font-size: 0.85rem; }
/* Toast */
.toast {
position: fixed; bottom: 24px; left: 50%; transform: translateX(-50%) translateY(20px);
background: var(--ink); color: #fff; padding: 14px 22px; border-radius: 999px; font-weight: 700;
box-shadow: var(--shadow-lg); opacity: 0; pointer-events: none; transition: opacity 0.25s, transform 0.25s;
z-index: 300; max-width: calc(100% - 40px); text-align: center;
}
.toast.show { opacity: 1; transform: translateX(-50%) translateY(0); }
/* Responsive */
@media (max-width: 960px) {
.hero-grid { grid-template-columns: 1fr; gap: 40px; }
.hero-visual { min-height: 320px; max-width: 420px; }
.amenity-grid, .plan-row, .loc-grid, .review-grid { grid-template-columns: repeat(2, 1fr); }
.plan-featured { transform: none; }
}
@media (max-width: 760px) {
.primary-nav, .header-actions .btn-ghost { display: none; }
.nav-toggle { display: flex; }
.primary-nav {
position: absolute; top: 68px; left: 0; right: 0; flex-direction: column; gap: 2px;
background: #fff; border-bottom: 1px solid var(--line); padding: 12px 20px;
box-shadow: var(--shadow-md); transform: translateY(-8px); opacity: 0; pointer-events: none;
transition: opacity 0.2s, transform 0.2s;
}
.primary-nav.open { opacity: 1; transform: translateY(0); pointer-events: auto; }
.primary-nav a { padding: 12px; }
}
@media (max-width: 520px) {
.wrap { width: 100% - 32px; width: calc(100% - 32px); }
.hero { padding: 40px 0 48px; }
.hero h1 { font-size: 2.4rem; }
.lede { font-size: 1rem; }
.club-search { flex-direction: column; border-radius: var(--r-lg); }
.club-search .btn { width: 100%; }
.search-field { padding: 4px 12px; }
.btn-lg { --pad-y: 14px; width: 100%; }
.hero-cta { flex-direction: column; }
.trust-row { gap: 20px; }
.section { padding: 48px 0; }
.amenity-grid, .plan-row, .loc-grid, .review-grid { grid-template-columns: 1fr; }
.hero-visual { display: none; }
.join-inner { flex-direction: column; align-items: flex-start; }
.join-inner .btn { width: 100%; }
.footer-cols { gap: 32px; }
}(function () {
"use strict";
/* ---- Toast helper ---- */
var toastEl = document.getElementById("toast");
var toastTimer;
function toast(msg) {
if (!toastEl) return;
toastEl.textContent = msg;
toastEl.classList.add("show");
clearTimeout(toastTimer);
toastTimer = setTimeout(function () {
toastEl.classList.remove("show");
}, 2800);
}
/* ---- Mobile nav toggle ---- */
var navToggle = document.getElementById("navToggle");
var primaryNav = document.getElementById("primaryNav");
if (navToggle && primaryNav) {
navToggle.addEventListener("click", function () {
var open = primaryNav.classList.toggle("open");
navToggle.setAttribute("aria-expanded", open ? "true" : "false");
});
// Close after tapping a link
primaryNav.addEventListener("click", function (e) {
if (e.target.tagName === "A") {
primaryNav.classList.remove("open");
navToggle.setAttribute("aria-expanded", "false");
}
});
}
/* ---- Hero club search ---- */
var heroSearch = document.getElementById("heroSearch");
var heroZip = document.getElementById("heroZip");
var locInput = document.getElementById("locInput");
if (heroSearch) {
heroSearch.addEventListener("submit", function (e) {
e.preventDefault();
var q = (heroZip && heroZip.value.trim()) || "";
var locations = document.getElementById("locations");
if (locInput) locInput.value = q;
filterLocations(q);
if (locations) locations.scrollIntoView({ behavior: "smooth" });
toast(q ? "Showing clubs near “" + q + "”" : "Showing all clubs near you");
});
}
/* ---- Locations filter ---- */
var cards = Array.prototype.slice.call(document.querySelectorAll(".loc-card"));
var locEmpty = document.getElementById("locEmpty");
function filterLocations(query) {
var q = query.trim().toLowerCase();
var visible = 0;
cards.forEach(function (card) {
var hay = (card.getAttribute("data-loc") || "") + " " + card.textContent.toLowerCase();
var match = q === "" || hay.indexOf(q) !== -1;
card.style.display = match ? "" : "none";
if (match) visible++;
});
if (locEmpty) locEmpty.hidden = visible !== 0;
}
if (locInput) {
locInput.addEventListener("input", function () {
filterLocations(locInput.value);
});
}
/* ---- Plan selection ---- */
document.querySelectorAll("[data-plan]").forEach(function (btn) {
btn.addEventListener("click", function () {
var plan = btn.getAttribute("data-plan");
var price = btn.getAttribute("data-price");
toast(plan + " plan selected — " + price + ". First month free!");
});
});
/* ---- FAQ accordion ---- */
var faqList = document.getElementById("faqList");
if (faqList) {
var questions = Array.prototype.slice.call(faqList.querySelectorAll(".faq-q"));
questions.forEach(function (q) {
var answer = q.nextElementSibling;
q.addEventListener("click", function () {
var isOpen = q.getAttribute("aria-expanded") === "true";
// Close all others (single-open accordion)
questions.forEach(function (other) {
if (other !== q) {
other.setAttribute("aria-expanded", "false");
other.nextElementSibling.style.maxHeight = null;
}
});
if (isOpen) {
q.setAttribute("aria-expanded", "false");
answer.style.maxHeight = null;
} else {
q.setAttribute("aria-expanded", "true");
answer.style.maxHeight = answer.scrollHeight + "px";
}
});
});
}
})();<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>FlexNation — Join for $19/mo</title>
<meta name="description" content="FlexNation big-box chain gym. Cardio, free weights, classes, pool, sauna and 24/7 access. Join for $19/mo. Find a club near you." />
<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;900&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
<!-- Header / Nav -->
<header class="site-header" id="top">
<div class="wrap header-inner">
<a class="brand" href="#top" aria-label="FlexNation home">
<span class="brand-mark" aria-hidden="true">FN</span>
<span class="brand-word">FlexNation</span>
</a>
<nav class="primary-nav" id="primaryNav" aria-label="Primary">
<a href="#amenities">Amenities</a>
<a href="#plans">Membership</a>
<a href="#locations">Locations</a>
<a href="#reviews">Reviews</a>
<a href="#faq">FAQ</a>
</nav>
<div class="header-actions">
<a class="btn btn-ghost" href="#plans">Log in</a>
<a class="btn btn-primary" href="#plans">Join now</a>
<button class="nav-toggle" id="navToggle" aria-expanded="false" aria-controls="primaryNav" aria-label="Toggle menu">
<span></span><span></span><span></span>
</button>
</div>
</div>
</header>
<main id="main">
<!-- Hero -->
<section class="hero">
<div class="wrap hero-grid">
<div class="hero-copy">
<p class="eyebrow">No commitment plans</p>
<h1>Stronger starts at <span class="hl">$19</span><span class="per">/mo</span></h1>
<p class="lede">Over 1,200 clubs nationwide with everything you need — cardio decks, mountains of free weights, group classes, pools, saunas and 24/7 access. No judgment. Just gains.</p>
<div class="hero-cta">
<a class="btn btn-primary btn-lg" href="#plans">Join for $19/mo</a>
<a class="btn btn-outline btn-lg" href="#amenities">Take a tour</a>
</div>
<form class="club-search" id="heroSearch" role="search" aria-label="Find a club near you">
<label for="heroZip" class="visually-hidden">Enter your ZIP or city</label>
<div class="search-field">
<svg viewBox="0 0 24 24" aria-hidden="true" class="pin"><path d="M12 2a7 7 0 0 0-7 7c0 5 7 13 7 13s7-8 7-13a7 7 0 0 0-7-7Zm0 9.5A2.5 2.5 0 1 1 12 6.5a2.5 2.5 0 0 1 0 5Z"/></svg>
<input type="search" id="heroZip" placeholder="ZIP code or city" autocomplete="postal-code" />
</div>
<button class="btn btn-dark" type="submit">Find a club near you</button>
</form>
<ul class="trust-row">
<li><strong>1,200+</strong> clubs</li>
<li><strong>4.8★</strong> avg rating</li>
<li><strong>3M+</strong> members</li>
</ul>
</div>
<div class="hero-visual" aria-hidden="true">
<div class="hero-card hero-card-a">
<span class="hc-eyebrow">Today at FlexNation</span>
<strong class="hc-title">HIIT & Burn</strong>
<span class="hc-sub">6:00 PM · Studio 2 · 8 spots left</span>
<span class="badge badge-red">Trending</span>
</div>
<div class="hero-card hero-card-b">
<span class="hc-stat">24/7</span>
<span class="hc-label">Open access</span>
</div>
<div class="hero-card hero-card-c">
<span class="hc-eyebrow">Member since</span>
<strong class="hc-title">2019 · Gold tier</strong>
<span class="hc-sub">412 visits this year</span>
</div>
</div>
</div>
</section>
<!-- Logos strip -->
<section class="logos" aria-label="As featured in">
<div class="wrap logos-inner">
<span>As seen in</span>
<ul>
<li>HEALTHLINE</li>
<li>FIT TODAY</li>
<li>THE DAILY REP</li>
<li>WELLWIRE</li>
<li>ACTIVE MAG</li>
</ul>
</div>
</section>
<!-- Amenities -->
<section class="section" id="amenities">
<div class="wrap">
<header class="section-head">
<p class="eyebrow">Everything included</p>
<h2>Amenities at every club</h2>
<p class="section-sub">One membership, the whole floor. No upsells to use the basics.</p>
</header>
<div class="amenity-grid">
<article class="amenity">
<span class="amenity-icon" aria-hidden="true">🏃</span>
<h3>Cardio deck</h3>
<p>Treadmills, bikes, ellipticals and rowers with built-in entertainment screens.</p>
</article>
<article class="amenity">
<span class="amenity-icon" aria-hidden="true">🏋️</span>
<h3>Free weights</h3>
<p>Dumbbells to 120 lbs, racks, platforms and benches that never run out.</p>
</article>
<article class="amenity">
<span class="amenity-icon" aria-hidden="true">🤸</span>
<h3>Group classes</h3>
<p>Yoga, spin, HIIT and strength — 60+ free sessions every week.</p>
</article>
<article class="amenity">
<span class="amenity-icon" aria-hidden="true">🏊</span>
<h3>Pool</h3>
<p>Heated lap lanes plus open-swim hours at select premium clubs.</p>
</article>
<article class="amenity">
<span class="amenity-icon" aria-hidden="true">🧖</span>
<h3>Sauna & spa</h3>
<p>Dry saunas, steam rooms and recovery massage chairs to unwind.</p>
</article>
<article class="amenity">
<span class="amenity-icon" aria-hidden="true">🔑</span>
<h3>24/7 access</h3>
<p>Tap your app and train any hour — early bird or night owl welcome.</p>
</article>
</div>
</div>
</section>
<!-- Plans -->
<section class="section section-alt" id="plans">
<div class="wrap">
<header class="section-head">
<p class="eyebrow">Simple pricing</p>
<h2>Pick your plan</h2>
<p class="section-sub">No contracts. Cancel anytime. First month free when you join online.</p>
</header>
<div class="plan-row">
<article class="plan">
<h3 class="plan-name">Basic</h3>
<p class="plan-price"><span class="amt">$19</span><span class="cyc">/mo</span></p>
<p class="plan-tag">Your home club, all the essentials.</p>
<ul class="plan-feats">
<li>Access to 1 home club</li>
<li>All cardio & free weights</li>
<li>Free fitness orientation</li>
<li>FlexNation app</li>
</ul>
<button class="btn btn-outline btn-block" data-plan="Basic" data-price="$19/mo">Choose Basic</button>
</article>
<article class="plan plan-featured">
<span class="plan-badge">Most popular</span>
<h3 class="plan-name">Plus</h3>
<p class="plan-price"><span class="amt">$34</span><span class="cyc">/mo</span></p>
<p class="plan-tag">Train anywhere in the network.</p>
<ul class="plan-feats">
<li>Access to all 1,200+ clubs</li>
<li>Unlimited group classes</li>
<li>Bring a guest free</li>
<li>Pool & sauna access</li>
</ul>
<button class="btn btn-primary btn-block" data-plan="Plus" data-price="$34/mo">Choose Plus</button>
</article>
<article class="plan">
<h3 class="plan-name">Premium</h3>
<p class="plan-price"><span class="amt">$54</span><span class="cyc">/mo</span></p>
<p class="plan-tag">The full recovery & coaching suite.</p>
<ul class="plan-feats">
<li>Everything in Plus</li>
<li>2 personal training sessions/mo</li>
<li>Spa & massage chairs</li>
<li>Priority class booking</li>
</ul>
<button class="btn btn-outline btn-block" data-plan="Premium" data-price="$54/mo">Choose Premium</button>
</article>
</div>
</div>
</section>
<!-- Locations -->
<section class="section" id="locations">
<div class="wrap">
<header class="section-head">
<p class="eyebrow">Near you</p>
<h2>Find your club</h2>
<p class="section-sub">Filter by city or ZIP to see hours and amenities.</p>
</header>
<form class="loc-search" id="locSearch" role="search">
<label for="locInput" class="visually-hidden">Filter clubs</label>
<input type="search" id="locInput" placeholder="Filter by city, ZIP or club name…" />
</form>
<ul class="loc-grid" id="locGrid">
<li class="loc-card" data-loc="riverside austin 78701 24/7 pool">
<div class="loc-head"><h3>FlexNation Riverside</h3><span class="badge badge-green">Open now</span></div>
<p class="loc-addr">410 Riverside Dr · Austin, TX 78701</p>
<ul class="loc-tags"><li>24/7</li><li>Pool</li><li>Classes</li></ul>
</li>
<li class="loc-card" data-loc="midtown austin 78704 sauna classes">
<div class="loc-head"><h3>FlexNation Midtown</h3><span class="badge badge-green">Open now</span></div>
<p class="loc-addr">88 Congress Ave · Austin, TX 78704</p>
<ul class="loc-tags"><li>Sauna</li><li>Classes</li><li>Free weights</li></ul>
</li>
<li class="loc-card" data-loc="northgate dallas 75201 24/7 spa">
<div class="loc-head"><h3>FlexNation Northgate</h3><span class="badge badge-grey">Opens 5 AM</span></div>
<p class="loc-addr">1200 Elm St · Dallas, TX 75201</p>
<ul class="loc-tags"><li>24/7</li><li>Spa</li><li>Pool</li></ul>
</li>
<li class="loc-card" data-loc="lakewood houston 77002 pool classes">
<div class="loc-head"><h3>FlexNation Lakewood</h3><span class="badge badge-green">Open now</span></div>
<p class="loc-addr">555 Main St · Houston, TX 77002</p>
<ul class="loc-tags"><li>Pool</li><li>Classes</li><li>Cardio</li></ul>
</li>
<li class="loc-card" data-loc="summit denver 80202 24/7 sauna">
<div class="loc-head"><h3>FlexNation Summit</h3><span class="badge badge-green">Open now</span></div>
<p class="loc-addr">300 16th St · Denver, CO 80202</p>
<ul class="loc-tags"><li>24/7</li><li>Sauna</li><li>Free weights</li></ul>
</li>
<li class="loc-card" data-loc="harbor seattle 98101 pool spa">
<div class="loc-head"><h3>FlexNation Harbor</h3><span class="badge badge-grey">Opens 5 AM</span></div>
<p class="loc-addr">720 Pike St · Seattle, WA 98101</p>
<ul class="loc-tags"><li>Pool</li><li>Spa</li><li>Classes</li></ul>
</li>
</ul>
<p class="loc-empty" id="locEmpty" hidden>No clubs match that search. Try a nearby city or ZIP.</p>
</div>
</section>
<!-- Reviews -->
<section class="section section-alt" id="reviews">
<div class="wrap">
<header class="section-head">
<p class="eyebrow">Member love</p>
<h2>Real members, real results</h2>
</header>
<div class="review-grid">
<figure class="review">
<div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
<blockquote>The classes alone are worth it. I dropped 22 lbs in six months and actually look forward to leg day now.</blockquote>
<figcaption><span class="rv-name">Marisol Vega</span><span class="rv-meta">Member · Austin</span></figcaption>
</figure>
<figure class="review">
<div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
<blockquote>24/7 access fits my night-shift schedule perfectly. The Plus plan lets me hit any club when I travel for work.</blockquote>
<figcaption><span class="rv-name">Derek Osei</span><span class="rv-meta">Member · Dallas</span></figcaption>
</figure>
<figure class="review">
<div class="stars" aria-label="5 out of 5 stars">★★★★★</div>
<blockquote>Clean, friendly, never crowded at off-hours. The sauna after a swim is my favorite part of the week.</blockquote>
<figcaption><span class="rv-name">Priya Raman</span><span class="rv-meta">Member · Seattle</span></figcaption>
</figure>
</div>
</div>
</section>
<!-- FAQ -->
<section class="section" id="faq">
<div class="wrap faq-wrap">
<header class="section-head section-head-left">
<p class="eyebrow">Good to know</p>
<h2>Frequently asked questions</h2>
</header>
<div class="faq-list" id="faqList">
<div class="faq-item">
<button class="faq-q" aria-expanded="false">
<span>Is there a contract or cancellation fee?</span>
<span class="faq-icon" aria-hidden="true"></span>
</button>
<div class="faq-a"><p>No contracts and no cancellation fees. Manage or cancel your membership anytime from the FlexNation app.</p></div>
</div>
<div class="faq-item">
<button class="faq-q" aria-expanded="false">
<span>Can I freeze my membership?</span>
<span class="faq-icon" aria-hidden="true"></span>
</button>
<div class="faq-a"><p>Yes. You can freeze for up to 3 months per year at no charge for travel, injury or any other reason.</p></div>
</div>
<div class="faq-item">
<button class="faq-q" aria-expanded="false">
<span>Which clubs can I visit on each plan?</span>
<span class="faq-icon" aria-hidden="true"></span>
</button>
<div class="faq-a"><p>Basic includes your home club. Plus and Premium unlock all 1,200+ FlexNation clubs nationwide.</p></div>
</div>
<div class="faq-item">
<button class="faq-q" aria-expanded="false">
<span>Do you offer a free trial?</span>
<span class="faq-icon" aria-hidden="true"></span>
</button>
<div class="faq-a"><p>Absolutely — your first month is free when you join online, and you can grab a free day pass at any club to try us out first.</p></div>
</div>
</div>
</div>
</section>
<!-- Final CTA -->
<section class="join-cta">
<div class="wrap join-inner">
<div>
<h2>Your first month is on us.</h2>
<p>Join online in under two minutes. No contracts, cancel anytime.</p>
</div>
<a class="btn btn-primary btn-lg" href="#plans">Join for $19/mo</a>
</div>
</section>
</main>
<footer class="site-footer">
<div class="wrap footer-inner">
<div class="footer-brand">
<span class="brand-mark" aria-hidden="true">FN</span>
<p>FlexNation — Stronger together since 2009.</p>
</div>
<nav class="footer-cols" aria-label="Footer">
<div><h4>Gym</h4><a href="#amenities">Amenities</a><a href="#plans">Membership</a><a href="#locations">Locations</a></div>
<div><h4>Company</h4><a href="#reviews">Reviews</a><a href="#faq">FAQ</a><a href="#top">Careers</a></div>
<div><h4>Support</h4><a href="#faq">Help center</a><a href="#top">Contact</a><a href="#top">App</a></div>
</nav>
</div>
<div class="wrap footer-bottom"><p>© 2026 FlexNation. Fictional demo. All rights reserved.</p></div>
</footer>
<div class="toast" id="toast" role="status" aria-live="polite"></div>
<script src="script.js"></script>
</body>
</html>Big-Box Chain Gym Landing
A broad-appeal landing page for a fictional national gym chain, FlexNation, designed to feel clean, bright and trustworthy rather than edgy. The hero leads with a big “Join for $19/mo” call to action and a pill-shaped “Find a club near you” search, backed by trust stats and a floating stack of preview cards. Below it sit an amenities grid (cardio, free weights, classes, pool, sauna and 24/7 access), a three-tier membership row with a highlighted “Most popular” plan, a filterable locations strip, member testimonials and an FAQ accordion that closes with a final join CTA.
The interface uses an approachable red-and-steel palette on a light background, chunky Inter 700/800 headings, large tap-friendly buttons and consistent rounded cards with subtle hover lift. It is keyboard-navigable with visible focus rings, ARIA-labeled regions and live-region toasts, and it stays usable down to roughly 360px wide via a dedicated mobile layout and collapsible nav.
All interactions are dependency-free vanilla JavaScript: the hero search hands its query to the locations filter and smooth-scrolls there, the locations strip filters in real time by city, ZIP or amenity, the plan buttons confirm a selection through a toast, and the FAQ behaves as a single-open accordion with animated height transitions.