Banking — Account Funded
A trust-first onboarding success screen for a fintech account opening. A celebratory navy hero with a check seal and canvas confetti confirms the opening deposit cleared, then reveals the new account number with one-tap copy and a tappable virtual debit card whose digits unmask on demand. A three-step next-action checklist drives direct deposit, card ordering, and referrals with a live progress bar, and ships as self-contained vanilla HTML, CSS, and JavaScript.
MCP
Code
:root {
--navy: #0e1b3a;
--navy-2: #16264d;
--ink: #0e1726;
--ink-2: #3a4660;
--muted: #697089;
--accent: #3b6ef6;
--accent-d: #2a55cc;
--accent-50: #eaf0ff;
--teal: #0fb5a6;
--violet: #7c5cff;
--bg: #f5f7fb;
--surface: #ffffff;
--line: rgba(14, 27, 58, 0.10);
--line-2: rgba(14, 27, 58, 0.18);
--ok: #1f9d62;
--warn: #d9982b;
--danger: #d4493e;
--credit: #1f9d62;
--debit: #0e1726;
--r-sm: 8px;
--r-md: 14px;
--r-lg: 20px;
--shadow-sm: 0 1px 2px rgba(14, 27, 58, 0.06), 0 1px 3px rgba(14, 27, 58, 0.05);
--shadow-md: 0 8px 24px rgba(14, 27, 58, 0.10), 0 2px 6px rgba(14, 27, 58, 0.06);
--shadow-lg: 0 24px 60px rgba(14, 27, 58, 0.18);
}
* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
margin: 0;
min-height: 100vh;
font-family: "Inter", system-ui, -apple-system, sans-serif;
line-height: 1.5;
color: var(--ink);
background:
radial-gradient(1200px 600px at 50% -200px, #e9eefc 0%, transparent 70%),
var(--bg);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-variant-numeric: tabular-nums;
}
#confetti {
position: fixed;
inset: 0;
width: 100%;
height: 100%;
pointer-events: none;
z-index: 50;
}
.shell {
max-width: 520px;
margin: 0 auto;
padding: 32px 18px 56px;
}
/* ---- card shell ---- */
.card {
background: var(--surface);
border: 1px solid var(--line);
border-radius: var(--r-lg);
box-shadow: var(--shadow-lg);
overflow: hidden;
}
/* ---- hero ---- */
.hero {
position: relative;
padding: 38px 26px 32px;
text-align: center;
color: #fff;
background:
radial-gradient(420px 200px at 50% -40px, rgba(124, 92, 255, 0.45), transparent 70%),
linear-gradient(160deg, var(--navy) 0%, var(--navy-2) 60%, #1d3470 100%);
}
.seal {
width: 64px;
height: 64px;
margin: 0 auto 16px;
display: grid;
place-items: center;
border-radius: 50%;
color: #fff;
background: linear-gradient(150deg, var(--ok), #2bbd7e);
box-shadow: 0 10px 24px rgba(31, 157, 98, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.4);
animation: pop 0.5s cubic-bezier(0.18, 1.4, 0.4, 1) both;
}
@keyframes pop {
0% { transform: scale(0.3); opacity: 0; }
100% { transform: scale(1); opacity: 1; }
}
.eyebrow {
margin: 0 0 4px;
font-size: 12px;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
color: #a9c0ff;
}
.hero h1 {
margin: 0 0 10px;
font-size: 26px;
font-weight: 800;
letter-spacing: -0.02em;
}
.lede {
margin: 0 auto;
max-width: 380px;
font-size: 15px;
color: rgba(255, 255, 255, 0.82);
}
.lede .credit { color: #6ff0b4; font-weight: 700; }
.ghost-btn {
margin-top: 18px;
font: inherit;
font-size: 13px;
font-weight: 600;
color: #fff;
background: rgba(255, 255, 255, 0.10);
border: 1px solid rgba(255, 255, 255, 0.22);
border-radius: 999px;
padding: 8px 16px;
cursor: pointer;
transition: background 0.15s, transform 0.1s;
}
.ghost-btn:hover { background: rgba(255, 255, 255, 0.18); }
.ghost-btn:active { transform: translateY(1px); }
/* ---- body ---- */
.body { padding: 22px 22px 26px; display: grid; gap: 18px; }
.acct-label {
display: block;
font-size: 11px;
font-weight: 600;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--muted);
margin-bottom: 4px;
}
.account-strip {
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 14px;
padding: 16px;
border: 1px solid var(--line);
border-radius: var(--r-md);
background: linear-gradient(180deg, #fbfcff, #f4f7fd);
}
.acct-num {
display: flex;
align-items: center;
gap: 8px;
}
.acct-num .num {
font-size: 16px;
font-weight: 700;
letter-spacing: 0.04em;
color: var(--ink);
}
.copy-btn {
display: grid;
place-items: center;
width: 30px;
height: 30px;
border-radius: var(--r-sm);
border: 1px solid var(--line-2);
background: var(--surface);
color: var(--accent);
cursor: pointer;
transition: background 0.15s, color 0.15s, border-color 0.15s;
}
.copy-btn:hover { background: var(--accent-50); border-color: var(--accent); }
.copy-btn.copied { background: var(--ok); border-color: var(--ok); color: #fff; }
.acct-meta {
display: block;
margin-top: 6px;
font-size: 12px;
color: var(--muted);
}
.balance { text-align: right; }
.bal-num {
display: block;
font-size: 22px;
font-weight: 800;
letter-spacing: -0.01em;
color: var(--ink);
}
.pill {
display: inline-flex;
align-items: center;
gap: 5px;
margin-top: 6px;
font-size: 11px;
font-weight: 700;
padding: 3px 9px;
border-radius: 999px;
}
.pill.ok { background: rgba(31, 157, 98, 0.12); color: var(--ok); }
.pill .dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; }
/* ---- virtual card ---- */
.vcard {
position: relative;
margin: 0;
padding: 18px;
border-radius: var(--r-md);
color: #fff;
background:
radial-gradient(300px 160px at 110% -20%, rgba(124, 92, 255, 0.55), transparent 60%),
radial-gradient(260px 160px at -10% 120%, rgba(15, 181, 166, 0.45), transparent 60%),
linear-gradient(135deg, #142a5c, #0e1b3a 70%);
box-shadow: var(--shadow-md);
overflow: hidden;
}
.vcard::after {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(115deg, transparent 40%, rgba(255, 255, 255, 0.10) 50%, transparent 60%);
}
.vcard-top {
display: flex;
justify-content: space-between;
align-items: center;
}
.brand { font-size: 15px; font-weight: 800; letter-spacing: 0.02em; }
.vbadge {
display: inline-flex;
align-items: center;
gap: 4px;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.04em;
text-transform: uppercase;
padding: 3px 8px;
border-radius: 999px;
background: rgba(255, 255, 255, 0.14);
}
.chip {
width: 42px;
height: 30px;
margin: 18px 0 14px;
border-radius: 6px;
background: linear-gradient(135deg, #f4d58a, #c79a3e);
box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.15);
position: relative;
}
.chip::before {
content: "";
position: absolute;
inset: 6px 10px;
border: 1px solid rgba(0, 0, 0, 0.22);
border-radius: 3px;
}
.vcard-number {
font-size: 18px;
font-weight: 600;
letter-spacing: 0.16em;
margin-bottom: 16px;
font-variant-numeric: tabular-nums;
}
.vcard-foot {
display: flex;
align-items: flex-end;
gap: 22px;
}
.vlabel {
display: block;
font-size: 9px;
letter-spacing: 0.08em;
text-transform: uppercase;
color: rgba(255, 255, 255, 0.6);
margin-bottom: 2px;
}
.vval { font-size: 13px; font-weight: 600; letter-spacing: 0.03em; }
.vlogo {
margin-left: auto;
display: flex;
align-items: center;
}
.vlogo span { width: 26px; height: 26px; border-radius: 50%; }
.vlogo .m1 { background: #eb5e3d; }
.vlogo .m2 { background: #f4a623; margin-left: -11px; mix-blend-mode: screen; }
.reveal-btn {
position: relative;
z-index: 1;
margin-top: 16px;
width: 100%;
font: inherit;
font-size: 13px;
font-weight: 600;
color: #fff;
background: rgba(255, 255, 255, 0.12);
border: 1px solid rgba(255, 255, 255, 0.24);
border-radius: var(--r-sm);
padding: 9px;
cursor: pointer;
transition: background 0.15s;
}
.reveal-btn:hover { background: rgba(255, 255, 255, 0.2); }
/* ---- checklist ---- */
.checklist {
border: 1px solid var(--line);
border-radius: var(--r-md);
padding: 16px;
}
.checklist-head {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
}
.checklist-head h2 { margin: 0; font-size: 15px; font-weight: 700; }
.progress-tag {
font-size: 12px;
font-weight: 600;
color: var(--accent-d);
background: var(--accent-50);
padding: 3px 9px;
border-radius: 999px;
}
.bar {
height: 6px;
border-radius: 999px;
background: var(--line);
overflow: hidden;
margin-bottom: 12px;
}
.bar span {
display: block;
height: 100%;
width: 0%;
border-radius: 999px;
background: linear-gradient(90deg, var(--accent), var(--teal));
transition: width 0.4s cubic-bezier(0.22, 1, 0.36, 1);
}
.steps { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.step {
display: flex;
align-items: center;
gap: 12px;
padding: 10px;
border-radius: var(--r-sm);
border: 1px solid transparent;
transition: background 0.15s, border-color 0.15s;
}
.step:hover { background: #f7f9fd; border-color: var(--line); }
.check {
flex: none;
width: 24px;
height: 24px;
border-radius: 7px;
border: 2px solid var(--line-2);
background: var(--surface);
cursor: pointer;
position: relative;
transition: background 0.15s, border-color 0.15s, transform 0.1s;
}
.check::after {
content: "";
position: absolute;
left: 7px;
top: 3px;
width: 5px;
height: 10px;
border: solid #fff;
border-width: 0 2.5px 2.5px 0;
transform: rotate(45deg) scale(0);
transition: transform 0.18s cubic-bezier(0.18, 1.4, 0.4, 1);
}
.check:hover { border-color: var(--accent); }
.check[aria-checked="true"] {
background: var(--ok);
border-color: var(--ok);
}
.check[aria-checked="true"]::after { transform: rotate(45deg) scale(1); }
.check:active { transform: scale(0.92); }
.step-body { display: flex; flex-direction: column; flex: 1; min-width: 0; }
.step-title { font-size: 14px; font-weight: 600; color: var(--ink); }
.step-sub { font-size: 12px; color: var(--muted); }
.step.done .step-title { color: var(--muted); text-decoration: line-through; }
.step.done .step-sub { opacity: 0.7; }
.step-cta {
flex: none;
font-size: 13px;
font-weight: 600;
color: var(--accent);
}
.step.done .step-cta { visibility: hidden; }
/* ---- actions ---- */
.actions { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.primary, .secondary {
font: inherit;
font-size: 14px;
font-weight: 600;
border-radius: var(--r-md);
padding: 13px;
cursor: pointer;
transition: transform 0.1s, box-shadow 0.15s, background 0.15s, border-color 0.15s;
}
.primary {
color: #fff;
border: none;
background: linear-gradient(180deg, var(--accent), var(--accent-d));
box-shadow: 0 6px 16px rgba(59, 110, 246, 0.35);
}
.primary:hover { box-shadow: 0 8px 22px rgba(59, 110, 246, 0.45); }
.secondary {
color: var(--accent-d);
background: var(--surface);
border: 1px solid var(--line-2);
}
.secondary:hover { background: var(--accent-50); border-color: var(--accent); }
.primary:active, .secondary:active { transform: translateY(1px); }
.secure-note {
display: flex;
align-items: center;
justify-content: center;
gap: 6px;
margin: 2px 0 0;
font-size: 12px;
color: var(--muted);
}
.secure-note svg { color: var(--ok); }
/* ---- focus ---- */
button:focus-visible {
outline: 3px solid rgba(59, 110, 246, 0.45);
outline-offset: 2px;
}
/* ---- toast ---- */
.toast-wrap {
position: fixed;
left: 50%;
bottom: 22px;
transform: translateX(-50%);
display: grid;
gap: 8px;
z-index: 60;
width: max-content;
max-width: calc(100vw - 32px);
}
.toast {
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
font-weight: 600;
color: #fff;
background: var(--ink);
padding: 10px 16px;
border-radius: 999px;
box-shadow: var(--shadow-md);
opacity: 0;
transform: translateY(12px);
animation: toast-in 0.25s forwards;
}
.toast.out { animation: toast-out 0.25s forwards; }
.toast .tdot { width: 8px; height: 8px; border-radius: 50%; background: var(--teal); flex: none; }
@keyframes toast-in { to { opacity: 1; transform: translateY(0); } }
@keyframes toast-out { to { opacity: 0; transform: translateY(12px); } }
@media (prefers-reduced-motion: reduce) {
* { animation-duration: 0.01ms !important; transition-duration: 0.01ms !important; }
}
/* ---- responsive ---- */
@media (max-width: 520px) {
.shell { padding: 18px 12px 44px; }
.hero { padding: 30px 20px 26px; }
.hero h1 { font-size: 23px; }
.account-strip { flex-direction: column; }
.balance { text-align: left; }
.actions { grid-template-columns: 1fr; }
.vcard-foot { gap: 14px; }
}(function () {
"use strict";
/* ---------- toast helper ---------- */
var toastWrap = document.getElementById("toast-wrap");
function toast(msg) {
var el = document.createElement("div");
el.className = "toast";
el.innerHTML = '<span class="tdot" aria-hidden="true"></span><span></span>';
el.querySelector("span:last-child").textContent = msg;
toastWrap.appendChild(el);
setTimeout(function () {
el.classList.add("out");
setTimeout(function () { el.remove(); }, 260);
}, 2400);
}
/* ---------- confetti ---------- */
var canvas = document.getElementById("confetti");
var ctx = canvas.getContext("2d");
var pieces = [];
var rafId = null;
var colors = ["#3b6ef6", "#0fb5a6", "#7c5cff", "#1f9d62", "#f4a623", "#eb5e3d"];
var prefersReduced = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
function sizeCanvas() {
var dpr = window.devicePixelRatio || 1;
canvas.width = window.innerWidth * dpr;
canvas.height = window.innerHeight * dpr;
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
}
sizeCanvas();
window.addEventListener("resize", sizeCanvas);
function burst(count) {
if (prefersReduced) return;
var w = window.innerWidth;
for (var i = 0; i < count; i++) {
pieces.push({
x: w / 2 + (Math.random() - 0.5) * 120,
y: window.innerHeight * 0.28,
vx: (Math.random() - 0.5) * 9,
vy: -8 - Math.random() * 7,
size: 5 + Math.random() * 6,
rot: Math.random() * Math.PI,
vrot: (Math.random() - 0.5) * 0.3,
color: colors[(Math.random() * colors.length) | 0],
shape: Math.random() > 0.5 ? "rect" : "circ",
life: 1
});
}
if (!rafId) rafId = requestAnimationFrame(tick);
}
function tick() {
ctx.clearRect(0, 0, window.innerWidth, window.innerHeight);
for (var i = pieces.length - 1; i >= 0; i--) {
var p = pieces[i];
p.vy += 0.28;
p.vx *= 0.99;
p.x += p.vx;
p.y += p.vy;
p.rot += p.vrot;
if (p.y > window.innerHeight + 30) { pieces.splice(i, 1); continue; }
ctx.save();
ctx.translate(p.x, p.y);
ctx.rotate(p.rot);
ctx.fillStyle = p.color;
if (p.shape === "rect") {
ctx.fillRect(-p.size / 2, -p.size / 2, p.size, p.size * 0.6);
} else {
ctx.beginPath();
ctx.arc(0, 0, p.size / 2, 0, Math.PI * 2);
ctx.fill();
}
ctx.restore();
}
if (pieces.length) {
rafId = requestAnimationFrame(tick);
} else {
ctx.clearRect(0, 0, window.innerWidth, window.innerHeight);
rafId = null;
}
}
// Initial celebration on load
window.requestAnimationFrame(function () { burst(140); });
document.getElementById("celebrate").addEventListener("click", function () {
burst(120);
});
/* ---------- copy account number ---------- */
var copyBtn = document.getElementById("copy-acct");
var ACCT_FULL = "4821 0073"; // illustrative, fictional
copyBtn.addEventListener("click", function () {
var text = "Northbridge Everyday Checking •••• " + ACCT_FULL + " · Routing 021000089";
var done = function () {
copyBtn.classList.add("copied");
copyBtn.setAttribute("aria-label", "Account number copied");
toast("Account number copied");
setTimeout(function () {
copyBtn.classList.remove("copied");
copyBtn.setAttribute("aria-label", "Copy account number");
}, 1600);
};
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(done, fallback);
} else {
fallback();
}
function fallback() {
var ta = document.createElement("textarea");
ta.value = text;
ta.style.position = "fixed";
ta.style.opacity = "0";
document.body.appendChild(ta);
ta.select();
try { document.execCommand("copy"); } catch (e) {}
ta.remove();
done();
}
});
/* ---------- reveal card ---------- */
var revealBtn = document.getElementById("reveal-card");
var vnum = document.getElementById("vcard-number");
var MASKED = "5412 •••• •••• 7290";
var FULL = "5412 8830 1147 7290";
var revealed = false;
var revealTimer = null;
revealBtn.addEventListener("click", function () {
revealed = !revealed;
revealBtn.setAttribute("aria-pressed", String(revealed));
if (revealed) {
vnum.textContent = FULL;
revealBtn.textContent = "Hide card details";
toast("Card details revealed — auto-hides in 12s");
clearTimeout(revealTimer);
revealTimer = setTimeout(function () {
if (revealed) revealBtn.click();
}, 12000);
} else {
vnum.textContent = MASKED;
revealBtn.textContent = "Reveal card details";
clearTimeout(revealTimer);
}
});
/* ---------- checklist ---------- */
var steps = Array.prototype.slice.call(document.querySelectorAll(".step"));
var checks = Array.prototype.slice.call(document.querySelectorAll(".check"));
var doneCount = document.getElementById("done-count");
var barFill = document.getElementById("bar-fill");
var ctaLabels = ["Direct deposit set up", "Card on the way", "Invite sent"];
function refresh() {
var n = checks.filter(function (c) { return c.getAttribute("aria-checked") === "true"; }).length;
doneCount.textContent = n;
barFill.style.width = (n / checks.length * 100) + "%";
if (n === checks.length) {
burst(110);
toast("All set — welcome aboard!");
}
}
function toggle(idx) {
var c = checks[idx];
var on = c.getAttribute("aria-checked") === "true";
c.setAttribute("aria-checked", String(!on));
steps[idx].classList.toggle("done", !on);
if (!on) toast(ctaLabels[idx]);
refresh();
}
checks.forEach(function (c, i) {
c.addEventListener("click", function () { toggle(i); });
c.addEventListener("keydown", function (e) {
if (e.key === " " || e.key === "Enter") {
e.preventDefault();
toggle(i);
}
});
});
/* ---------- footer actions ---------- */
document.getElementById("go-dashboard").addEventListener("click", function () {
toast("Opening your dashboard…");
});
document.getElementById("add-funds").addEventListener("click", function () {
toast("Add funds — transfer flow coming up");
});
})();<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Banking — Account Funded</title>
<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" />
</head>
<body>
<canvas id="confetti" aria-hidden="true"></canvas>
<main class="shell">
<section class="card success" aria-labelledby="hero-title">
<header class="hero">
<div class="seal" aria-hidden="true">
<svg viewBox="0 0 24 24" width="34" height="34" fill="none" stroke="currentColor" stroke-width="2.4" stroke-linecap="round" stroke-linejoin="round">
<path d="M20 6 9 17l-5-5" />
</svg>
</div>
<p class="eyebrow">Account funded</p>
<h1 id="hero-title">You’re all set, Mara.</h1>
<p class="lede">Your opening deposit of <strong class="credit">+$250.00</strong> cleared. Northbridge Everyday Checking is live and ready to spend.</p>
<button class="ghost-btn celebrate" id="celebrate" type="button">
<span aria-hidden="true">✦</span> Celebrate again
</button>
</header>
<div class="body">
<div class="account-strip">
<div class="acct">
<span class="acct-label">Account number</span>
<div class="acct-num">
<span class="num" id="acct-num">•••• •••• 4821 0073</span>
<button class="copy-btn" id="copy-acct" type="button" aria-label="Copy account number">
<svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="9" y="9" width="11" height="11" rx="2"/><path d="M5 15V5a2 2 0 0 1 2-2h10"/></svg>
</button>
</div>
<span class="acct-meta">Routing 021000089 · USD</span>
</div>
<div class="balance">
<span class="acct-label">Available balance</span>
<span class="bal-num">$250.00</span>
<span class="pill ok"><span class="dot" aria-hidden="true"></span> Cleared</span>
</div>
</div>
<figure class="vcard" aria-label="Virtual debit card preview">
<div class="vcard-top">
<span class="brand">Northbridge</span>
<span class="vbadge"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2.4"><rect x="5" y="11" width="14" height="9" rx="2"/><path d="M8 11V8a4 4 0 0 1 8 0v3"/></svg> Virtual</span>
</div>
<div class="chip" aria-hidden="true"></div>
<div class="vcard-number" id="vcard-number">5412 •••• •••• 7290</div>
<div class="vcard-foot">
<div>
<span class="vlabel">Card holder</span>
<span class="vval">MARA OKONKWO</span>
</div>
<div>
<span class="vlabel">Expires</span>
<span class="vval">08/30</span>
</div>
<div class="vlogo" aria-hidden="true">
<span class="m1"></span><span class="m2"></span>
</div>
</div>
<button class="reveal-btn" id="reveal-card" type="button" aria-pressed="false">Reveal card details</button>
</figure>
<section class="checklist" aria-labelledby="next-title">
<div class="checklist-head">
<h2 id="next-title">Finish setting up</h2>
<span class="progress-tag"><span id="done-count">0</span>/3 done</span>
</div>
<div class="bar" aria-hidden="true"><span id="bar-fill"></span></div>
<ul class="steps" id="steps">
<li class="step">
<button class="check" type="button" role="checkbox" aria-checked="false" aria-label="Set up direct deposit"></button>
<div class="step-body">
<span class="step-title">Set up direct deposit</span>
<span class="step-sub">Get paid up to 2 days early</span>
</div>
<span class="step-cta" aria-hidden="true">Start →</span>
</li>
<li class="step">
<button class="check" type="button" role="checkbox" aria-checked="false" aria-label="Order your physical card"></button>
<div class="step-body">
<span class="step-title">Order your physical card</span>
<span class="step-sub">Free metal card, arrives in 5 days</span>
</div>
<span class="step-cta" aria-hidden="true">Order →</span>
</li>
<li class="step">
<button class="check" type="button" role="checkbox" aria-checked="false" aria-label="Invite a friend"></button>
<div class="step-body">
<span class="step-title">Invite a friend</span>
<span class="step-sub">You both earn $25 when they fund</span>
</div>
<span class="step-cta" aria-hidden="true">Invite →</span>
</li>
</ul>
</section>
<div class="actions">
<button class="primary" id="go-dashboard" type="button">Go to dashboard</button>
<button class="secondary" id="add-funds" type="button">Add more funds</button>
</div>
<p class="secure-note">
<svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2.2"><rect x="5" y="11" width="14" height="9" rx="2"/><path d="M8 11V8a4 4 0 0 1 8 0v3"/></svg>
Bank-grade encryption · FDIC insured up to $250,000
</p>
</div>
</section>
</main>
<div class="toast-wrap" id="toast-wrap" aria-live="polite" aria-atomic="true"></div>
<script src="script.js"></script>
</body>
</html>Account Funded
A welcome moment for a freshly funded bank account. A deep navy hero opens with a popping green check seal, an “Account funded” eyebrow, and a personalised headline, while canvas confetti bursts on load and again from a Celebrate again button. The lede confirms the cleared opening deposit in tabular figures with the credit amount in green, setting the trust-first, dense-but-calm fintech tone.
Below the hero sits the practical detail: a masked account number with a copy button that writes the full reference to the clipboard and flips to a green confirmed state, a routing number and currency, and an available balance with a Cleared status pill. A virtual debit card preview renders a chip, gradient sheen, holder name, and expiry, and a Reveal card details toggle unmasks the full PAN before auto-hiding after twelve seconds for safety.
The next-step checklist turns the screen into an onboarding hub. Three keyboard-accessible checkboxes — set up direct deposit, order the physical card, and invite a friend — drive a gradient progress bar and a live done counter, fire a confirming toast on each tap, and trigger one more confetti burst when all three complete. Everything is vanilla JS with a small toast() helper, respects reduced-motion, and collapses cleanly to a single column down to 360px.
Illustrative UI only — not real banking software or financial advice.