Clinic — Insurance & Pricing
A reassuring insurance and pricing page for a fictional clinic. A searchable accepted-insurers grid renders ten payers as colored initial chips, a self-pay pricing table lists common services with durations and a Standard / Care Member toggle that recalculates prices live at minus fifteen percent, a single-open FAQ accordion answers billing questions, and a Check your coverage card validates a plan and member ID before a simulated submit. Vanilla JS, calm clinical copy.
MCP
程式碼
:root {
--teal: #129c93;
--teal-d: #0c7a73;
--teal-700: #0a655f;
--teal-50: #e7f5f3;
--coral: #ff7a66;
--coral-soft: #ffe6df;
--ink: #16322f;
--ink-2: #3a534f;
--muted: #6b827e;
--bg: #f1f7f6;
--white: #ffffff;
--line: rgba(16, 50, 47, 0.1);
--line-2: rgba(16, 50, 47, 0.18);
--ok: #2f9e6f;
--warn: #d98a2b;
--danger: #d4503e;
--font: "Inter", system-ui, -apple-system, sans-serif;
--r-sm: 8px;
--r-md: 14px;
--r-lg: 20px;
--shadow-1: 0 1px 2px rgba(16, 50, 47, 0.05), 0 4px 14px rgba(16, 50, 47, 0.06);
--shadow-2: 0 16px 40px rgba(12, 122, 115, 0.16);
}
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
font-family: var(--font);
background: var(--bg);
color: var(--ink);
-webkit-font-smoothing: antialiased;
line-height: 1.5;
}
:focus-visible {
outline: 2px solid var(--teal);
outline-offset: 2px;
border-radius: 4px;
}
/* ── Layout ── */
.page {
max-width: 760px;
margin: 0 auto;
padding: 40px 20px 72px;
display: flex;
flex-direction: column;
gap: 24px;
}
/* ── Hero ── */
.hero {
display: flex;
flex-direction: column;
gap: 12px;
}
.eyebrow {
font-size: 0.78rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--teal-d);
}
.hero h1 {
font-size: 2.1rem;
font-weight: 800;
letter-spacing: -0.03em;
line-height: 1.1;
}
.lede {
font-size: 1.02rem;
color: var(--ink-2);
max-width: 56ch;
}
.hero-meta {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin-top: 6px;
}
.pill {
display: inline-flex;
align-items: center;
gap: 8px;
background: var(--white);
border: 1px solid var(--line);
border-radius: 999px;
padding: 7px 14px;
font-size: 0.82rem;
font-weight: 600;
color: var(--ink-2);
box-shadow: var(--shadow-1);
}
.pill .dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: var(--ok);
flex-shrink: 0;
}
/* ── Block (card section) ── */
.block {
background: var(--white);
border: 1px solid var(--line);
border-radius: var(--r-lg);
padding: 26px;
box-shadow: var(--shadow-1);
display: flex;
flex-direction: column;
gap: 18px;
}
.block-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
flex-wrap: wrap;
}
.block-head h2 {
font-size: 1.22rem;
font-weight: 700;
letter-spacing: -0.02em;
}
.sub {
font-size: 0.88rem;
color: var(--muted);
margin-top: 3px;
max-width: 44ch;
}
/* ── Payer search ── */
.search {
position: relative;
flex-shrink: 0;
}
.search-ico {
position: absolute;
left: 12px;
top: 50%;
transform: translateY(-50%);
width: 18px;
height: 18px;
color: var(--muted);
pointer-events: none;
}
.search input {
font: inherit;
font-size: 0.88rem;
width: 220px;
max-width: 100%;
padding: 10px 14px 10px 38px;
border: 1px solid var(--line-2);
border-radius: 999px;
background: var(--bg);
color: var(--ink);
transition: border-color 0.15s, background 0.15s, box-shadow 0.15s;
}
.search input::placeholder {
color: var(--muted);
}
.search input:focus {
outline: none;
background: var(--white);
border-color: var(--teal);
box-shadow: 0 0 0 3px rgba(18, 156, 147, 0.14);
}
/* ── Payer grid ── */
.payers {
list-style: none;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
gap: 12px;
}
.payer {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 14px;
border: 1px solid var(--line);
border-radius: var(--r-md);
background: #fafdfc;
transition: border-color 0.15s, transform 0.12s, box-shadow 0.15s;
}
.payer:hover {
border-color: var(--teal);
box-shadow: var(--shadow-1);
transform: translateY(-1px);
}
.payer[hidden] {
display: none;
}
.logo {
width: 40px;
height: 40px;
flex-shrink: 0;
border-radius: 10px;
display: grid;
place-items: center;
font-size: 0.84rem;
font-weight: 800;
letter-spacing: 0.02em;
color: #fff;
background: var(--c, var(--teal-d));
box-shadow: inset 0 -2px 6px rgba(0, 0, 0, 0.14);
}
.payer-name {
font-size: 0.9rem;
font-weight: 600;
color: var(--ink);
min-width: 0;
}
.no-match {
font-size: 0.9rem;
color: var(--ink-2);
background: var(--teal-50);
border: 1px solid rgba(18, 156, 147, 0.22);
border-radius: var(--r-sm);
padding: 12px 14px;
}
.no-match[hidden] {
display: none;
}
.fine {
font-size: 0.82rem;
color: var(--muted);
}
/* ── Pricing segmented toggle ── */
.seg {
display: inline-flex;
gap: 4px;
background: var(--bg);
border: 1px solid var(--line);
border-radius: 999px;
padding: 4px;
flex-shrink: 0;
}
.seg-btn {
border: none;
background: transparent;
border-radius: 999px;
padding: 8px 14px;
font: inherit;
font-weight: 600;
font-size: 0.84rem;
color: var(--muted);
cursor: pointer;
display: inline-flex;
align-items: center;
gap: 7px;
transition: background 0.15s, color 0.15s;
}
.seg-btn:hover {
color: var(--ink-2);
}
.seg-btn.is-active {
background: var(--teal-d);
color: #fff;
}
.seg-save {
font-size: 0.7rem;
font-weight: 700;
padding: 2px 7px;
border-radius: 999px;
background: var(--coral-soft);
color: #c4503a;
}
.seg-btn.is-active .seg-save {
background: rgba(255, 255, 255, 0.22);
color: #fff;
}
/* ── Pricing table ── */
.table {
display: flex;
flex-direction: column;
border: 1px solid var(--line);
border-radius: var(--r-md);
overflow: hidden;
}
.trow {
display: grid;
grid-template-columns: 1fr 130px 130px;
gap: 14px;
align-items: center;
padding: 16px 18px;
border-bottom: 1px solid var(--line);
}
.trow:last-child {
border-bottom: none;
}
.trow:not(.thead):hover {
background: #fafdfc;
}
.thead {
background: var(--teal-50);
font-size: 0.74rem;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.05em;
color: var(--teal-700);
}
.svc strong {
display: block;
font-size: 0.96rem;
font-weight: 700;
color: var(--ink);
}
.svc em {
display: block;
font-style: normal;
font-size: 0.82rem;
color: var(--muted);
margin-top: 2px;
}
.dur {
font-size: 0.86rem;
color: var(--ink-2);
font-weight: 500;
}
.ta-right {
text-align: right;
}
.price {
font-size: 1.06rem;
font-weight: 800;
color: var(--teal-d);
font-variant-numeric: tabular-nums;
transition: color 0.2s;
}
.price.is-member {
color: var(--coral);
}
/* ── Coverage CTA ── */
.cta {
background: linear-gradient(150deg, var(--teal-d), var(--teal-700));
color: #fff;
border-radius: var(--r-lg);
padding: 30px;
display: grid;
grid-template-columns: 1fr 320px;
gap: 28px;
align-items: center;
box-shadow: var(--shadow-2);
}
.cta-text h2 {
font-size: 1.4rem;
font-weight: 800;
letter-spacing: -0.02em;
}
.cta-text p {
margin-top: 8px;
font-size: 0.94rem;
color: rgba(255, 255, 255, 0.86);
max-width: 40ch;
}
.cta-form {
display: flex;
flex-direction: column;
gap: 12px;
}
.field {
display: flex;
flex-direction: column;
gap: 6px;
}
.field span {
font-size: 0.78rem;
font-weight: 600;
color: rgba(255, 255, 255, 0.88);
}
.field input {
font: inherit;
font-size: 0.9rem;
padding: 11px 14px;
border: 1px solid rgba(255, 255, 255, 0.28);
border-radius: var(--r-sm);
background: rgba(255, 255, 255, 0.12);
color: #fff;
transition: border-color 0.15s, background 0.15s, box-shadow 0.15s;
}
.field input::placeholder {
color: rgba(255, 255, 255, 0.6);
}
.field input:focus {
outline: none;
background: rgba(255, 255, 255, 0.18);
border-color: #fff;
box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.18);
}
.field.invalid input {
border-color: var(--coral);
box-shadow: 0 0 0 3px rgba(255, 122, 102, 0.28);
}
/* ── Buttons ── */
.btn {
border: none;
border-radius: var(--r-sm);
padding: 12px 18px;
font: inherit;
font-weight: 700;
font-size: 0.9rem;
cursor: pointer;
transition: transform 0.12s, background 0.15s, color 0.15s, box-shadow 0.15s;
}
.btn:active {
transform: translateY(1px);
}
.btn.solid {
background: var(--white);
color: var(--teal-d);
box-shadow: 0 4px 14px rgba(0, 0, 0, 0.16);
}
.btn.solid:hover {
background: var(--teal-50);
}
.btn.solid:disabled {
opacity: 0.7;
cursor: progress;
}
/* ── FAQ accordion ── */
.faq {
display: flex;
flex-direction: column;
border: 1px solid var(--line);
border-radius: var(--r-md);
overflow: hidden;
}
.faq-item {
border-bottom: 1px solid var(--line);
}
.faq-item:last-child {
border-bottom: none;
}
.faq-q {
width: 100%;
border: none;
background: var(--white);
font: inherit;
font-weight: 600;
font-size: 0.96rem;
color: var(--ink);
text-align: left;
padding: 18px 20px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
cursor: pointer;
transition: background 0.15s, color 0.15s;
}
.faq-q:hover {
background: #fafdfc;
color: var(--teal-d);
}
.faq-q[aria-expanded="true"] {
color: var(--teal-d);
}
.chev {
width: 20px;
height: 20px;
flex-shrink: 0;
color: var(--muted);
transition: transform 0.22s ease, color 0.15s;
}
.faq-q[aria-expanded="true"] .chev {
transform: rotate(180deg);
color: var(--teal-d);
}
.faq-a {
overflow: hidden;
max-height: 0;
transition: max-height 0.26s ease;
}
.faq-a p {
padding: 0 20px 18px;
font-size: 0.9rem;
color: var(--ink-2);
max-width: 62ch;
}
/* ── Toast ── */
.toast {
position: fixed;
left: 50%;
bottom: 26px;
transform: translateX(-50%);
background: var(--ink);
color: #fff;
padding: 13px 20px;
border-radius: 12px;
font-size: 0.9rem;
font-weight: 500;
box-shadow: var(--shadow-2);
z-index: 50;
max-width: 90vw;
}
.toast[hidden] {
display: none;
}
/* ── Responsive ── */
@media (max-width: 520px) {
.page {
padding: 28px 16px 56px;
gap: 18px;
}
.hero h1 {
font-size: 1.7rem;
}
.block {
padding: 20px 18px;
}
.block-head {
flex-direction: column;
}
.search input {
width: 100%;
}
.payers {
grid-template-columns: 1fr 1fr;
}
.trow {
grid-template-columns: 1fr auto;
gap: 4px 12px;
}
.dur {
grid-row: 2;
grid-column: 1;
}
.price {
grid-row: 1 / span 2;
grid-column: 2;
align-self: center;
}
.thead {
display: none;
}
.cta {
grid-template-columns: 1fr;
padding: 24px 20px;
}
}
@media (max-width: 360px) {
.payers {
grid-template-columns: 1fr;
}
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
transition: none !important;
}
}// ── Toast ──────────────────────────────────────────────────────────────────
const toast = document.getElementById("toast");
function showToast(msg) {
toast.textContent = msg;
toast.hidden = false;
clearTimeout(showToast._t);
showToast._t = setTimeout(() => (toast.hidden = true), 2800);
}
// ── Payer search filter ──────────────────────────────────────────────────────
const search = document.getElementById("payer-search");
const payers = Array.from(document.querySelectorAll("#payer-grid .payer"));
const payerEmpty = document.getElementById("payer-empty");
search.addEventListener("input", () => {
const q = search.value.trim().toLowerCase();
let shown = 0;
payers.forEach((p) => {
const match = p.dataset.name.toLowerCase().includes(q);
p.hidden = !match;
if (match) shown++;
});
payerEmpty.hidden = shown !== 0;
});
// ── Self-pay pricing toggle (Standard vs Care Member −15%) ────────────────────
const segBtns = Array.from(document.querySelectorAll(".seg-btn"));
const priceCells = Array.from(document.querySelectorAll(".trow[data-base]"));
const MEMBER_RATE = 0.85; // −15%
function renderPrices(cycle) {
const member = cycle === "member";
priceCells.forEach((row) => {
const base = Number(row.dataset.base);
const cell = row.querySelector("[data-price]");
const value = member ? Math.round(base * MEMBER_RATE) : base;
cell.textContent = "$" + value;
cell.classList.toggle("is-member", member);
});
}
segBtns.forEach((btn) => {
btn.addEventListener("click", () => {
segBtns.forEach((b) => {
const active = b === btn;
b.classList.toggle("is-active", active);
b.setAttribute("aria-pressed", String(active));
});
renderPrices(btn.dataset.cycle);
if (btn.dataset.cycle === "member") {
showToast("Care Member rates applied — save 15% on self-pay services.");
}
});
});
// ── FAQ accordion (single-open) ──────────────────────────────────────────────
const faqButtons = Array.from(document.querySelectorAll(".faq-q"));
function closePanel(btn) {
const panel = document.getElementById(btn.getAttribute("aria-controls"));
btn.setAttribute("aria-expanded", "false");
panel.style.maxHeight = "0px";
}
function openPanel(btn) {
const panel = document.getElementById(btn.getAttribute("aria-controls"));
btn.setAttribute("aria-expanded", "true");
panel.style.maxHeight = panel.scrollHeight + "px";
}
faqButtons.forEach((btn) => {
btn.addEventListener("click", () => {
const isOpen = btn.getAttribute("aria-expanded") === "true";
faqButtons.forEach((other) => {
if (other !== btn) closePanel(other);
});
if (isOpen) closePanel(btn);
else openPanel(btn);
});
});
// Keep an open panel sized correctly when the viewport changes.
window.addEventListener("resize", () => {
faqButtons.forEach((btn) => {
if (btn.getAttribute("aria-expanded") === "true") {
const panel = document.getElementById(btn.getAttribute("aria-controls"));
panel.style.maxHeight = panel.scrollHeight + "px";
}
});
});
// ── Coverage check form ──────────────────────────────────────────────────────
const form = document.getElementById("coverage-form");
const planInput = document.getElementById("cv-plan");
const idInput = document.getElementById("cv-id");
[planInput, idInput].forEach((input) => {
input.addEventListener("input", () => {
input.closest(".field").classList.remove("invalid");
});
});
form.addEventListener("submit", (e) => {
e.preventDefault();
let valid = true;
[planInput, idInput].forEach((input) => {
const ok = input.value.trim().length > 0;
input.closest(".field").classList.toggle("invalid", !ok);
if (!ok) valid = false;
});
if (!valid) {
showToast("Add your plan and member ID so we can verify coverage.");
(planInput.value.trim() ? idInput : planInput).focus();
return;
}
const submitBtn = form.querySelector('button[type="submit"]');
const planName = planInput.value.trim();
submitBtn.disabled = true;
submitBtn.textContent = "Checking…";
showToast("Submitting your details to our billing team…");
setTimeout(() => {
submitBtn.disabled = false;
submitBtn.textContent = "Check coverage";
form.reset();
showToast(`Thanks — we'll confirm your ${planName} coverage within one business day.`);
}, 1400);
});<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap"
/>
<link rel="stylesheet" href="style.css" />
<title>Insurance & Pricing · Northpoint Clinic</title>
</head>
<body>
<main class="page">
<!-- ── Hero ── -->
<header class="hero">
<p class="eyebrow">Billing & coverage</p>
<h1>Insurance & pricing</h1>
<p class="lede">
We work with most major plans and keep self-pay rates simple and
published. No surprise bills — if anything is unclear, our billing
team is happy to walk you through it before your visit.
</p>
<div class="hero-meta">
<span class="pill"><span class="dot"></span> In-network with 10+ payers</span>
<span class="pill"><span class="dot"></span> Transparent self-pay rates</span>
</div>
</header>
<!-- ── Accepted insurers ── -->
<section class="block" aria-labelledby="payers-h">
<div class="block-head">
<div>
<h2 id="payers-h">Accepted insurers</h2>
<p class="sub">
Plans we’re currently in-network with at Northpoint Clinic.
</p>
</div>
<div class="search">
<svg viewBox="0 0 24 24" aria-hidden="true" class="search-ico">
<path
d="M21 21l-4.3-4.3M11 18a7 7 0 1 1 0-14 7 7 0 0 1 0 14Z"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
/>
</svg>
<input
type="search"
id="payer-search"
placeholder="Find your plan…"
aria-label="Search accepted insurers"
/>
</div>
</div>
<ul class="payers" id="payer-grid" role="list">
<li class="payer" data-name="Aetna Health">
<span class="logo" style="--c: #7b2d8e" aria-hidden="true">AE</span>
<span class="payer-name">Aetna Health</span>
</li>
<li class="payer" data-name="BlueCross Meridian">
<span class="logo" style="--c: #1769b5" aria-hidden="true">BC</span>
<span class="payer-name">BlueCross Meridian</span>
</li>
<li class="payer" data-name="Cigna Care">
<span class="logo" style="--c: #f08a24" aria-hidden="true">CI</span>
<span class="payer-name">Cigna Care</span>
</li>
<li class="payer" data-name="UnitedWell">
<span class="logo" style="--c: #2f6fce" aria-hidden="true">UW</span>
<span class="payer-name">UnitedWell</span>
</li>
<li class="payer" data-name="Humana Plus">
<span class="logo" style="--c: #5aa02c" aria-hidden="true">HP</span>
<span class="payer-name">Humana Plus</span>
</li>
<li class="payer" data-name="Kaiser Grove">
<span class="logo" style="--c: #0a7d72" aria-hidden="true">KG</span>
<span class="payer-name">Kaiser Grove</span>
</li>
<li class="payer" data-name="Oscar Bright">
<span class="logo" style="--c: #e0533d" aria-hidden="true">OB</span>
<span class="payer-name">Oscar Bright</span>
</li>
<li class="payer" data-name="Anthem Ridge">
<span class="logo" style="--c: #3056a8" aria-hidden="true">AR</span>
<span class="payer-name">Anthem Ridge</span>
</li>
<li class="payer" data-name="MediShare Co-op">
<span class="logo" style="--c: #8a6d2f" aria-hidden="true">MS</span>
<span class="payer-name">MediShare Co-op</span>
</li>
<li class="payer" data-name="StatePlan Medicaid">
<span class="logo" style="--c: #4b5563" aria-hidden="true">SP</span>
<span class="payer-name">StatePlan Medicaid</span>
</li>
</ul>
<p class="no-match" id="payer-empty" hidden>
We couldn’t find that plan in the list. Use
<strong>Check your coverage</strong> below and we’ll verify it
for you.
</p>
<p class="fine">
Don’t see your plan? Many out-of-network visits are still
partially reimbursable — ask us for a superbill.
</p>
</section>
<!-- ── Self-pay pricing ── -->
<section class="block" aria-labelledby="pricing-h">
<div class="block-head">
<div>
<h2 id="pricing-h">Self-pay pricing</h2>
<p class="sub">
Flat rates for patients paying without insurance. Prices shown per
service.
</p>
</div>
<div class="seg" role="group" aria-label="Billing frequency">
<button class="seg-btn is-active" data-cycle="standard">
Standard
</button>
<button class="seg-btn" data-cycle="member">
Care Member <span class="seg-save">−15%</span>
</button>
</div>
</div>
<div class="table" role="table" aria-label="Self-pay pricing">
<div class="trow thead" role="row">
<span role="columnheader">Service</span>
<span role="columnheader">Typical duration</span>
<span role="columnheader" class="ta-right">Self-pay price</span>
</div>
<div class="trow" role="row" data-base="89">
<span role="cell" class="svc">
<strong>Office visit</strong>
<em>New or returning patient, in person</em>
</span>
<span role="cell" class="dur">20–30 min</span>
<span role="cell" class="price ta-right" data-price>$89</span>
</div>
<div class="trow" role="row" data-base="59">
<span role="cell" class="svc">
<strong>Telehealth visit</strong>
<em>Video consult with a clinician</em>
</span>
<span role="cell" class="dur">15–20 min</span>
<span role="cell" class="price ta-right" data-price>$59</span>
</div>
<div class="trow" role="row" data-base="45">
<span role="cell" class="svc">
<strong>Basic lab panel</strong>
<em>Blood draw & standard chemistry</em>
</span>
<span role="cell" class="dur">10 min</span>
<span role="cell" class="price ta-right" data-price>$45</span>
</div>
<div class="trow" role="row" data-base="35">
<span role="cell" class="svc">
<strong>Vaccination</strong>
<em>Flu, Tdap & routine immunizations</em>
</span>
<span role="cell" class="dur">10 min</span>
<span role="cell" class="price ta-right" data-price>$35</span>
</div>
<div class="trow" role="row" data-base="129">
<span role="cell" class="svc">
<strong>Annual physical</strong>
<em>Comprehensive wellness exam</em>
</span>
<span role="cell" class="dur">40–45 min</span>
<span role="cell" class="price ta-right" data-price>$129</span>
</div>
</div>
<p class="fine">
Labs sent to outside reference labs may carry separate charges. A
good-faith estimate is available on request.
</p>
</section>
<!-- ── Coverage CTA ── -->
<section class="cta" aria-labelledby="cta-h">
<div class="cta-text">
<h2 id="cta-h">Check your coverage</h2>
<p>
Tell us your plan and we’ll confirm your in-network status and
estimated visit cost — usually within one business day, before you
ever sit in the waiting room.
</p>
</div>
<form class="cta-form" id="coverage-form" novalidate>
<label class="field">
<span>Insurance plan</span>
<input
type="text"
id="cv-plan"
name="plan"
placeholder="e.g. BlueCross Meridian"
autocomplete="off"
required
/>
</label>
<label class="field">
<span>Member ID</span>
<input
type="text"
id="cv-id"
name="member"
placeholder="Member ID on your card"
autocomplete="off"
required
/>
</label>
<button type="submit" class="btn solid">Check coverage</button>
</form>
</section>
<!-- ── FAQ accordion ── -->
<section class="block" aria-labelledby="faq-h">
<div class="block-head">
<div>
<h2 id="faq-h">Billing questions</h2>
<p class="sub">Straight answers to what patients ask us most.</p>
</div>
</div>
<div class="faq" id="faq">
<div class="faq-item">
<button
class="faq-q"
id="faq-btn-1"
aria-expanded="false"
aria-controls="faq-p-1"
>
<span>When will I be billed for my visit?</span>
<svg class="chev" viewBox="0 0 24 24" aria-hidden="true">
<path
d="M6 9l6 6 6-6"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</button>
<div class="faq-a" id="faq-p-1" role="region" aria-labelledby="faq-btn-1">
<p>
For insured visits, we bill your payer first and only send you a
statement once your claim is processed — typically two to four
weeks later. Self-pay patients are charged at checkout.
</p>
</div>
</div>
<div class="faq-item">
<button
class="faq-q"
id="faq-btn-2"
aria-expanded="false"
aria-controls="faq-p-2"
>
<span>Do you offer payment plans?</span>
<svg class="chev" viewBox="0 0 24 24" aria-hidden="true">
<path
d="M6 9l6 6 6-6"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</button>
<div class="faq-a" id="faq-p-2" role="region" aria-labelledby="faq-btn-2">
<p>
Yes. Balances over $150 can be split into interest-free monthly
installments. Set one up online or call our billing line and
we’ll find a plan that fits your budget.
</p>
</div>
</div>
<div class="faq-item">
<button
class="faq-q"
id="faq-btn-3"
aria-expanded="false"
aria-controls="faq-p-3"
>
<span>What if my insurance denies a claim?</span>
<svg class="chev" viewBox="0 0 24 24" aria-hidden="true">
<path
d="M6 9l6 6 6-6"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</button>
<div class="faq-a" id="faq-p-3" role="region" aria-labelledby="faq-btn-3">
<p>
Denials are common and often resolved with a quick correction.
Our team re-files on your behalf and keeps you updated — you
won’t owe the disputed amount while an appeal is in
progress.
</p>
</div>
</div>
<div class="faq-item">
<button
class="faq-q"
id="faq-btn-4"
aria-expanded="false"
aria-controls="faq-p-4"
>
<span>Can I use an HSA or FSA card?</span>
<svg class="chev" viewBox="0 0 24 24" aria-hidden="true">
<path
d="M6 9l6 6 6-6"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</button>
<div class="faq-a" id="faq-p-4" role="region" aria-labelledby="faq-btn-4">
<p>
Absolutely. We accept HSA and FSA cards for all eligible
services, and can provide an itemized receipt for your records
or reimbursement.
</p>
</div>
</div>
<div class="faq-item">
<button
class="faq-q"
id="faq-btn-5"
aria-expanded="false"
aria-controls="faq-p-5"
>
<span>Who can I talk to about a bill?</span>
<svg class="chev" viewBox="0 0 24 24" aria-hidden="true">
<path
d="M6 9l6 6 6-6"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
/>
</svg>
</button>
<div class="faq-a" id="faq-p-5" role="region" aria-labelledby="faq-btn-5">
<p>
Our patient billing advocate, Dr. Lena Okafor’s front-desk
team, is available Monday–Friday, 8am–5pm. Reach them through
your patient portal or the number on your statement.
</p>
</div>
</div>
</div>
</section>
</main>
<div class="toast" id="toast" hidden role="status" aria-live="polite"></div>
<script src="script.js"></script>
</body>
</html>Insurance & Pricing
A calm, transparent billing page for Northpoint Clinic. It opens with a hero that sets expectations — in-network with major payers, published self-pay rates, no surprise bills — then lays out three reassuring sections. The accepted-insurers grid shows ten payers as colored initial chips with a type-ahead search that filters as you type and surfaces a gentle out-of-network note when nothing matches.
The self-pay pricing table lists common services — office visit, telehealth, a basic lab panel, vaccinations and an annual physical — each with a typical duration and price. A segmented Standard / Care Member toggle recalculates every price live at a 15% member discount and tints the figures coral, with a toast confirming the change. Below it, a teal Check your coverage card validates the plan and member ID fields, shows inline errors, and runs a simulated submit with a brief loading state and confirmation toast.
Finally, a single-open FAQ accordion answers the questions patients ask most — billing timing, payment plans, denied claims, HSA/FSA cards and who to call — animating each panel open while closing the others. Everything is keyboard usable, ARIA-wired and built with vanilla JS.
Illustrative UI only — not intended for real medical use.