LMS — Completion Certificate
A polished e-learning completion certificate page with a framed parchment-style award showing the learner name, course title, completion date, instructor signature, official seal and a scannable verification QR. A side panel offers download-to-PDF, print, share-link and add-to-LinkedIn actions, a copyable credential code, earned-skill badges and credential metadata. Built with semantic HTML, CSS variables, print styles and small vanilla-JS interactions, optionally toggling a calm study mode.
MCP
Code
:root {
--brand: #5b5bd6;
--brand-d: #4444c2;
--brand-50: #eeeefc;
--accent: #13b981;
--amber: #f59e0b;
--ink: #1a1a2e;
--ink-2: #44465f;
--muted: #6b6e87;
--bg: #f7f7fb;
--surface: #ffffff;
--line: rgba(26, 26, 46, 0.1);
--ok: #13b981;
--danger: #e05656;
--gold: #b8902c;
--gold-2: #e7c558;
--r-sm: 8px;
--r-md: 14px;
--r-lg: 20px;
--shadow-sm: 0 1px 2px rgba(26, 26, 46, 0.06), 0 1px 3px rgba(26, 26, 46, 0.08);
--shadow-md: 0 6px 20px rgba(26, 26, 46, 0.1);
--shadow-lg: 0 18px 50px rgba(26, 26, 46, 0.16);
}
* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
margin: 0;
font-family: "Inter", system-ui, -apple-system, sans-serif;
color: var(--ink);
background:
radial-gradient(1100px 460px at 84% -10%, rgba(91, 91, 214, 0.1), transparent 60%),
radial-gradient(900px 420px at -10% 5%, rgba(19, 185, 129, 0.08), transparent 60%),
var(--bg);
line-height: 1.5;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.sr-only {
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: -48px;
background: var(--brand);
color: #fff;
padding: 10px 16px;
border-radius: var(--r-sm);
z-index: 50;
transition: top 0.18s ease;
text-decoration: none;
font-weight: 600;
}
.skip-link:focus { top: 12px; }
/* ---------- Topbar ---------- */
.topbar {
position: sticky;
top: 0;
z-index: 30;
display: flex;
align-items: center;
gap: 18px;
padding: 14px clamp(16px, 4vw, 40px);
background: rgba(255, 255, 255, 0.86);
backdrop-filter: saturate(160%) blur(12px);
border-bottom: 1px solid var(--line);
}
.topbar__brand { display: flex; align-items: center; gap: 10px; }
.logo {
display: grid; place-items: center;
width: 34px; height: 34px;
border-radius: 10px;
background: linear-gradient(140deg, var(--brand), var(--brand-d));
color: #fff; font-size: 18px;
box-shadow: var(--shadow-sm);
}
.logo-text { font-weight: 800; letter-spacing: -0.01em; }
.logo-text em { font-style: normal; color: var(--brand); font-weight: 700; }
.topbar__nav { display: flex; gap: 4px; margin-left: 8px; }
.nav-link {
padding: 8px 14px;
border-radius: 999px;
color: var(--ink-2);
text-decoration: none;
font-weight: 500;
font-size: 14px;
transition: background 0.15s, color 0.15s;
}
.nav-link:hover { background: var(--brand-50); color: var(--brand-d); }
.nav-link--active { background: var(--brand-50); color: var(--brand-d); font-weight: 600; }
.study-toggle {
margin-left: auto;
display: inline-flex;
align-items: center;
gap: 9px;
padding: 8px 14px;
border: 1px solid var(--line);
border-radius: 999px;
background: var(--surface);
color: var(--ink-2);
font: inherit;
font-size: 14px;
font-weight: 600;
cursor: pointer;
transition: border-color 0.15s, box-shadow 0.15s;
}
.study-toggle:hover { border-color: var(--brand); box-shadow: var(--shadow-sm); }
.study-toggle__dot {
width: 14px; height: 14px;
border-radius: 50%;
background: var(--amber);
box-shadow: inset 0 0 0 2px rgba(255, 255, 255, 0.7);
transition: background 0.2s;
}
/* ---------- Page ---------- */
.page {
max-width: 1140px;
margin: 0 auto;
padding: clamp(24px, 4vw, 48px) clamp(16px, 4vw, 40px) 64px;
}
.hero { text-align: center; margin-bottom: 30px; }
.hero__badge {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 6px 14px;
border-radius: 999px;
background: rgba(19, 185, 129, 0.12);
color: #0c7a55;
font-weight: 700;
font-size: 13px;
letter-spacing: 0.01em;
}
.check {
display: grid; place-items: center;
width: 18px; height: 18px;
border-radius: 50%;
background: var(--accent);
color: #fff;
font-size: 12px;
}
.hero__title {
font-family: "Fraunces", Georgia, serif;
font-weight: 600;
font-size: clamp(28px, 5vw, 42px);
margin: 14px 0 8px;
letter-spacing: -0.02em;
}
.hero__sub {
max-width: 560px;
margin: 0 auto 16px;
color: var(--ink-2);
font-size: clamp(15px, 2vw, 16.5px);
}
.hero__sub strong { color: var(--ink); }
.hero__meta { display: flex; flex-wrap: wrap; gap: 8px; justify-content: center; }
.pill {
display: inline-flex;
align-items: center;
padding: 5px 12px;
border-radius: 999px;
font-size: 12.5px;
font-weight: 600;
background: var(--surface);
border: 1px solid var(--line);
color: var(--ink-2);
}
.pill--level { background: var(--brand-50); color: var(--brand-d); border-color: transparent; }
.pill--ok { background: rgba(19, 185, 129, 0.12); color: #0c7a55; border-color: transparent; }
/* ---------- Layout ---------- */
.layout {
display: grid;
grid-template-columns: minmax(0, 1.6fr) minmax(280px, 1fr);
gap: clamp(20px, 3vw, 32px);
align-items: start;
}
/* ---------- Certificate ---------- */
.cert-wrap { perspective: 1400px; }
.cert {
position: relative;
border-radius: var(--r-lg);
background:
linear-gradient(160deg, #fffdf7, #fbf6ec 60%, #f6efe0);
box-shadow: var(--shadow-lg);
padding: 10px;
overflow: hidden;
transition: transform 0.25s ease;
}
.cert::before {
content: "";
position: absolute;
inset: 0;
background:
radial-gradient(600px 240px at 20% 0%, rgba(184, 144, 44, 0.08), transparent 70%),
repeating-linear-gradient(135deg, rgba(184, 144, 44, 0.04) 0 2px, transparent 2px 9px);
pointer-events: none;
}
.cert:hover { transform: translateY(-3px); }
.cert__border {
position: relative;
border: 2px solid rgba(184, 144, 44, 0.5);
border-radius: 14px;
padding: clamp(26px, 5vw, 48px) clamp(20px, 5vw, 52px) clamp(22px, 4vw, 40px);
text-align: center;
}
.cert__border::after {
content: "";
position: absolute;
inset: 7px;
border: 1px solid rgba(184, 144, 44, 0.3);
border-radius: 10px;
pointer-events: none;
}
.cert__corner {
position: absolute;
width: 30px; height: 30px;
border: 0 solid var(--gold);
}
.cert__corner--tl { top: 14px; left: 14px; border-top-width: 2px; border-left-width: 2px; border-top-left-radius: 6px; }
.cert__corner--tr { top: 14px; right: 14px; border-top-width: 2px; border-right-width: 2px; border-top-right-radius: 6px; }
.cert__corner--bl { bottom: 14px; left: 14px; border-bottom-width: 2px; border-left-width: 2px; border-bottom-left-radius: 6px; }
.cert__corner--br { bottom: 14px; right: 14px; border-bottom-width: 2px; border-right-width: 2px; border-bottom-right-radius: 6px; }
.cert__seal {
position: absolute;
top: clamp(20px, 4vw, 40px);
right: clamp(20px, 4vw, 44px);
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
z-index: 2;
}
.cert__seal-ring {
width: 60px; height: 60px;
border-radius: 50%;
display: grid; place-items: center;
background: radial-gradient(circle at 35% 30%, var(--gold-2), var(--gold));
box-shadow: 0 4px 14px rgba(184, 144, 44, 0.4), inset 0 0 0 4px rgba(255, 255, 255, 0.35);
color: #fff;
}
.cert__seal-star { font-size: 26px; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.2); }
.cert__seal-text {
font-size: 9px;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--gold);
}
.cert__head { margin-bottom: 18px; }
.cert__logo {
font-weight: 800;
font-size: 15px;
color: var(--brand-d);
letter-spacing: 0.01em;
}
.cert__eyebrow {
margin: 10px 0 0;
font-size: 12px;
letter-spacing: 0.34em;
text-transform: uppercase;
color: var(--gold);
font-weight: 700;
}
.cert__intro { margin: 6px 0; color: var(--muted); font-size: 14px; }
.cert__name {
font-family: "Fraunces", Georgia, serif;
font-weight: 700;
font-size: clamp(28px, 6vw, 46px);
margin: 4px 0 6px;
color: var(--ink);
letter-spacing: -0.01em;
}
.cert__body { margin: 4px 0; color: var(--muted); font-size: 14px; }
.cert__course {
font-family: "Fraunces", Georgia, serif;
font-weight: 600;
font-size: clamp(19px, 3.5vw, 26px);
margin: 6px 0 14px;
color: var(--brand-d);
}
.cert__detail {
max-width: 460px;
margin: 0 auto 26px;
color: var(--ink-2);
font-size: 14px;
}
.cert__detail strong { color: var(--ink); }
.cert__foot {
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: 20px;
margin-top: 8px;
flex-wrap: wrap;
}
.cert__sign, .cert__date {
flex: 1 1 140px;
min-width: 130px;
display: flex;
flex-direction: column;
align-items: center;
}
.cert__signature {
font-family: "Fraunces", Georgia, serif;
font-style: italic;
font-size: 24px;
color: var(--ink);
}
.cert__date-val { font-weight: 600; font-size: 15px; padding-bottom: 4px; }
.cert__sign-line {
width: 100%;
max-width: 170px;
height: 1px;
background: rgba(26, 26, 46, 0.28);
margin: 4px 0 6px;
}
.cert__sign-role { font-size: 11px; color: var(--muted); }
.cert__verify {
flex: 0 0 auto;
display: flex;
flex-direction: column;
align-items: center;
gap: 6px;
}
.cert__qr {
width: 64px; height: 64px;
border-radius: 6px;
background: #fff;
border: 1px solid var(--line);
padding: 5px;
display: grid;
grid-template-columns: repeat(11, 1fr);
grid-template-rows: repeat(11, 1fr);
gap: 1px;
}
.cert__qr i { background: var(--ink); border-radius: 1px; }
.cert__qr-cap { font-size: 10px; color: var(--muted); letter-spacing: 0.04em; }
/* ---------- Side ---------- */
.side { display: flex; flex-direction: column; gap: 16px; position: sticky; top: 84px; }
.card {
background: var(--surface);
border: 1px solid var(--line);
border-radius: var(--r-md);
padding: 18px;
box-shadow: var(--shadow-sm);
}
.card__title {
margin: 0 0 12px;
font-size: 14px;
font-weight: 700;
letter-spacing: 0.01em;
}
.card__hint { margin: -4px 0 12px; font-size: 13px; color: var(--muted); }
.actions { display: grid; gap: 9px; }
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
padding: 11px 14px;
border-radius: var(--r-sm);
border: 1px solid var(--line);
background: var(--surface);
color: var(--ink);
font: inherit;
font-weight: 600;
font-size: 14px;
cursor: pointer;
transition: transform 0.12s, box-shadow 0.15s, border-color 0.15s, background 0.15s;
}
.btn:hover { border-color: var(--brand); box-shadow: var(--shadow-sm); }
.btn:active { transform: translateY(1px) scale(0.99); }
.btn:focus-visible { outline: 3px solid rgba(91, 91, 214, 0.4); outline-offset: 2px; }
.btn--primary {
background: linear-gradient(135deg, var(--brand), var(--brand-d));
color: #fff;
border-color: transparent;
box-shadow: 0 6px 16px rgba(91, 91, 214, 0.3);
}
.btn--primary:hover { box-shadow: 0 10px 22px rgba(91, 91, 214, 0.4); }
.btn--linkedin {
background: #0a66c2;
color: #fff;
border-color: transparent;
}
.btn--linkedin:hover { background: #0959aa; }
.li {
display: grid; place-items: center;
width: 18px; height: 18px;
background: #fff;
color: #0a66c2;
border-radius: 3px;
font-size: 11px;
font-weight: 800;
line-height: 1;
}
.verify-row {
display: flex;
gap: 8px;
align-items: stretch;
}
.verify-code {
flex: 1;
display: flex;
align-items: center;
padding: 10px 12px;
background: var(--bg);
border: 1px dashed var(--line);
border-radius: var(--r-sm);
font-family: "SFMono-Regular", ui-monospace, Menlo, monospace;
font-size: 13.5px;
font-weight: 600;
letter-spacing: 0.03em;
color: var(--brand-d);
}
.copy-btn {
padding: 0 14px;
border-radius: var(--r-sm);
border: 1px solid var(--brand);
background: var(--brand-50);
color: var(--brand-d);
font: inherit;
font-weight: 700;
font-size: 13px;
cursor: pointer;
transition: background 0.15s, transform 0.12s;
}
.copy-btn:hover { background: #e2e2fb; }
.copy-btn:active { transform: scale(0.96); }
.copy-btn.is-copied { background: var(--accent); color: #fff; border-color: var(--accent); }
.verify-url {
display: inline-block;
margin-top: 10px;
font-size: 12.5px;
color: var(--muted);
text-decoration: none;
word-break: break-all;
}
.verify-url:hover { color: var(--brand); text-decoration: underline; }
.skills { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.skill {
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
padding: 9px 12px;
background: var(--bg);
border-radius: var(--r-sm);
font-size: 13.5px;
font-weight: 500;
}
.skill__lvl {
font-size: 11.5px;
font-weight: 700;
color: var(--accent);
background: rgba(19, 185, 129, 0.12);
padding: 3px 9px;
border-radius: 999px;
}
.card--meta { background: var(--bg); }
.meta-list { margin: 0; display: grid; gap: 10px; }
.meta-list > div { display: flex; justify-content: space-between; gap: 12px; font-size: 13px; }
.meta-list dt { color: var(--muted); margin: 0; }
.meta-list dd { margin: 0; font-weight: 600; text-align: right; }
/* ---------- Toast ---------- */
.toast-host {
position: fixed;
left: 50%;
bottom: 24px;
transform: translateX(-50%);
display: flex;
flex-direction: column;
gap: 10px;
z-index: 60;
pointer-events: none;
width: min(360px, calc(100vw - 32px));
}
.toast {
display: flex;
align-items: center;
gap: 10px;
padding: 12px 16px;
background: var(--ink);
color: #fff;
border-radius: var(--r-md);
box-shadow: var(--shadow-lg);
font-size: 14px;
font-weight: 500;
opacity: 0;
transform: translateY(14px) scale(0.98);
transition: opacity 0.25s ease, transform 0.25s ease;
}
.toast.show { opacity: 1; transform: translateY(0) scale(1); }
.toast__ico {
display: grid; place-items: center;
width: 22px; height: 22px;
border-radius: 50%;
background: var(--accent);
color: #fff;
font-size: 13px;
flex: 0 0 auto;
}
.toast--info .toast__ico { background: var(--brand); }
/* ---------- Study (dark) mode ---------- */
body.study {
--ink: #eef0fb;
--ink-2: #c2c5e0;
--muted: #8b8fb0;
--bg: #14141f;
--surface: #1c1c2b;
--line: rgba(255, 255, 255, 0.1);
--brand-50: rgba(91, 91, 214, 0.2);
background:
radial-gradient(1100px 460px at 84% -10%, rgba(91, 91, 214, 0.22), transparent 60%),
radial-gradient(900px 420px at -10% 5%, rgba(19, 185, 129, 0.12), transparent 60%),
var(--bg);
}
body.study .topbar { background: rgba(20, 20, 31, 0.82); }
body.study .study-toggle__dot { background: var(--brand); }
body.study .pill { background: var(--surface); }
/* certificate stays light parchment in study mode by design */
/* ---------- Responsive ---------- */
@media (max-width: 880px) {
.layout { grid-template-columns: 1fr; }
.side { position: static; }
}
@media (max-width: 520px) {
.topbar__nav { display: none; }
.study-toggle__label { display: none; }
.cert__seal { position: static; flex-direction: row; margin: 0 auto 14px; }
.cert__foot { flex-direction: column; align-items: center; gap: 18px; }
.cert__verify { order: -1; }
}
/* ---------- Print ---------- */
@media print {
.topbar, .hero, .side, .skip-link, .toast-host { display: none !important; }
body { background: #fff; }
.page { padding: 0; max-width: none; }
.layout { display: block; }
.cert { box-shadow: none; }
.cert:hover { transform: none; }
@page { margin: 12mm; }
}(function () {
"use strict";
/* ---------- Toast helper ---------- */
var host = document.getElementById("toastHost");
function toast(msg, kind) {
var el = document.createElement("div");
el.className = "toast" + (kind === "info" ? " toast--info" : "");
var ico = document.createElement("span");
ico.className = "toast__ico";
ico.setAttribute("aria-hidden", "true");
ico.textContent = kind === "info" ? "i" : "✓";
var txt = document.createElement("span");
txt.textContent = msg;
el.appendChild(ico);
el.appendChild(txt);
host.appendChild(el);
requestAnimationFrame(function () { el.classList.add("show"); });
setTimeout(function () {
el.classList.remove("show");
setTimeout(function () { el.remove(); }, 280);
}, 2600);
}
/* ---------- Faux QR (deterministic from code) ---------- */
function buildQR(seed) {
var box = document.getElementById("qr");
if (!box) return;
var n = 0;
for (var i = 0; i < seed.length; i++) n = (n * 31 + seed.charCodeAt(i)) >>> 0;
var cells = 121; // 11 x 11
var rng = n || 1;
for (var c = 0; c < cells; c++) {
rng = (rng * 1103515245 + 12345) & 0x7fffffff;
var on = (rng >> 8) & 1;
// force the three finder-pattern corners on for a QR look
var row = Math.floor(c / 11), col = c % 11;
var finder =
(row < 3 && col < 3) ||
(row < 3 && col > 7) ||
(row > 7 && col < 3);
if (finder) on = (row === 0 || row === 2 || row === 8 || row === 10 || col === 0 || col === 2 || col === 8 || col === 10 || (row === 1 && col === 1) || (row === 1 && col === 9) || (row === 9 && col === 1)) ? 1 : 0;
var cell = document.createElement("i");
if (on) cell.style.background = "var(--ink)";
else cell.style.background = "transparent";
box.appendChild(cell);
}
}
/* ---------- Actions ---------- */
var code = document.getElementById("verifyCode").textContent.trim();
buildQR(code);
var downloadBtn = document.getElementById("downloadBtn");
if (downloadBtn) {
downloadBtn.addEventListener("click", function () {
var orig = downloadBtn.innerHTML;
downloadBtn.disabled = true;
downloadBtn.innerHTML = "Preparing…";
setTimeout(function () {
downloadBtn.disabled = false;
downloadBtn.innerHTML = orig;
toast("Certificate saved as Brightpath-UXW-Certificate.pdf");
}, 950);
});
}
var printBtn = document.getElementById("printBtn");
if (printBtn) {
printBtn.addEventListener("click", function () {
toast("Opening print dialog…", "info");
setTimeout(function () { window.print(); }, 300);
});
}
var shareBtn = document.getElementById("shareBtn");
if (shareBtn) {
shareBtn.addEventListener("click", function () {
var url = "https://verify.brightpath.academy/9F4K2A";
if (navigator.share) {
navigator.share({
title: "My UX Writing certificate",
text: "I completed Foundations of UX Writing on Brightpath Academy!",
url: url
}).then(function () {
toast("Shared!");
}).catch(function () { /* user cancelled */ });
} else if (navigator.clipboard) {
navigator.clipboard.writeText(url).then(function () {
toast("Share link copied to clipboard");
}).catch(function () {
toast("Share link: " + url, "info");
});
} else {
toast("Share link: " + url, "info");
}
});
}
var linkedinBtn = document.getElementById("linkedinBtn");
if (linkedinBtn) {
linkedinBtn.addEventListener("click", function () {
toast("Opening LinkedIn — Add to profile", "info");
// Demo: would open LinkedIn "Add certification" pre-filled flow.
});
}
/* ---------- Copy verification code ---------- */
var copyBtn = document.getElementById("copyBtn");
if (copyBtn) {
copyBtn.addEventListener("click", function () {
function done() {
copyBtn.classList.add("is-copied");
var prev = copyBtn.textContent;
copyBtn.textContent = "Copied";
toast("Verification code copied: " + code);
setTimeout(function () {
copyBtn.classList.remove("is-copied");
copyBtn.textContent = prev;
}, 1600);
}
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(code).then(done).catch(fallback);
} else {
fallback();
}
function fallback() {
var ta = document.createElement("textarea");
ta.value = code;
ta.style.position = "fixed";
ta.style.opacity = "0";
document.body.appendChild(ta);
ta.select();
try { document.execCommand("copy"); done(); }
catch (e) { toast("Copy failed — code: " + code, "info"); }
ta.remove();
}
});
}
/* ---------- Study mode toggle ---------- */
var themeBtn = document.getElementById("themeBtn");
if (themeBtn) {
themeBtn.addEventListener("click", function () {
var on = document.body.classList.toggle("study");
themeBtn.setAttribute("aria-pressed", on ? "true" : "false");
toast(on ? "Study mode on" : "Study mode off", "info");
});
}
})();<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Certificate of Completion — Foundations of UX Writing</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&family=Fraunces:opsz,[email protected],500;9..144,600;9..144,700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<a class="skip-link" href="#cert">Skip to certificate</a>
<header class="topbar">
<div class="topbar__brand">
<span class="logo" aria-hidden="true">◧</span>
<span class="logo-text">Brightpath <em>Academy</em></span>
</div>
<nav class="topbar__nav" aria-label="Primary">
<a href="#" class="nav-link">Dashboard</a>
<a href="#" class="nav-link">My Courses</a>
<a href="#" class="nav-link nav-link--active" aria-current="page">Certificates</a>
</nav>
<button class="study-toggle" id="themeBtn" type="button" aria-pressed="false">
<span class="study-toggle__dot"></span>
<span class="study-toggle__label">Study mode</span>
</button>
</header>
<main class="page">
<section class="hero">
<div class="hero__badge">
<span class="check" aria-hidden="true">✓</span>
Course completed
</div>
<h1 class="hero__title">Congratulations, Mara!</h1>
<p class="hero__sub">You finished <strong>Foundations of UX Writing</strong> with a final score of 94%. Your certificate is ready to download and share.</p>
<div class="hero__meta">
<span class="pill pill--level">Intermediate</span>
<span class="pill pill--ok">100% complete</span>
<span class="pill">8 lessons · 6h 20m</span>
</div>
</section>
<div class="layout">
<!-- Certificate -->
<section class="cert-wrap" aria-labelledby="cert-head">
<h2 id="cert-head" class="sr-only">Your completion certificate</h2>
<article class="cert" id="cert">
<div class="cert__border">
<div class="cert__corner cert__corner--tl" aria-hidden="true"></div>
<div class="cert__corner cert__corner--tr" aria-hidden="true"></div>
<div class="cert__corner cert__corner--bl" aria-hidden="true"></div>
<div class="cert__corner cert__corner--br" aria-hidden="true"></div>
<div class="cert__seal" aria-hidden="true">
<div class="cert__seal-ring">
<span class="cert__seal-star">★</span>
</div>
<span class="cert__seal-text">Brightpath · Certified</span>
</div>
<header class="cert__head">
<span class="cert__logo">◧ Brightpath Academy</span>
<p class="cert__eyebrow">Certificate of Completion</p>
</header>
<p class="cert__intro">This certifies that</p>
<p class="cert__name" id="recipientName">Mara Velásquez</p>
<p class="cert__body">
has successfully completed the online course
</p>
<p class="cert__course">Foundations of UX Writing</p>
<p class="cert__detail">
comprising <strong>8 lessons</strong> and <strong>6h 20m</strong> of guided study,
passing the final assessment with a score of <strong>94%</strong>.
</p>
<footer class="cert__foot">
<div class="cert__sign">
<span class="cert__signature">D. Okonkwo</span>
<span class="cert__sign-line"></span>
<span class="cert__sign-role">Dele Okonkwo · Head of Curriculum</span>
</div>
<div class="cert__date">
<span class="cert__date-val">June 16, 2026</span>
<span class="cert__sign-line"></span>
<span class="cert__sign-role">Date of completion</span>
</div>
<div class="cert__verify">
<div class="cert__qr" id="qr" role="img" aria-label="QR verification code"></div>
<span class="cert__qr-cap">Scan to verify</span>
</div>
</footer>
</div>
</article>
</section>
<!-- Side panel -->
<aside class="side" aria-label="Certificate actions and details">
<div class="card">
<h3 class="card__title">Share & save</h3>
<div class="actions">
<button class="btn btn--primary" id="downloadBtn" type="button">
<span aria-hidden="true">⬇</span> Download PDF
</button>
<button class="btn" id="printBtn" type="button">
<span aria-hidden="true">🖨</span> Print
</button>
<button class="btn" id="shareBtn" type="button">
<span aria-hidden="true">↗</span> Share link
</button>
<button class="btn btn--linkedin" id="linkedinBtn" type="button">
<span class="li" aria-hidden="true">in</span> Add to LinkedIn
</button>
</div>
</div>
<div class="card">
<h3 class="card__title">Verification</h3>
<p class="card__hint">Anyone can confirm this certificate is authentic using the code below.</p>
<div class="verify-row">
<code class="verify-code" id="verifyCode">BPATH-UXW-9F4K2A</code>
<button class="copy-btn" id="copyBtn" type="button" aria-label="Copy verification code">Copy</button>
</div>
<a class="verify-url" href="#" id="verifyUrl">verify.brightpath.academy/9F4K2A</a>
</div>
<div class="card">
<h3 class="card__title">Skills you earned</h3>
<ul class="skills">
<li class="skill"><span>Microcopy & tone</span><span class="skill__lvl">Advanced</span></li>
<li class="skill"><span>Content patterns</span><span class="skill__lvl">Proficient</span></li>
<li class="skill"><span>Error messaging</span><span class="skill__lvl">Proficient</span></li>
<li class="skill"><span>Accessibility writing</span><span class="skill__lvl">Solid</span></li>
</ul>
</div>
<div class="card card--meta">
<dl class="meta-list">
<div><dt>Credential ID</dt><dd id="credId">BPATH-UXW-9F4K2A</dd></div>
<div><dt>Issued</dt><dd>June 16, 2026</dd></div>
<div><dt>Expires</dt><dd>No expiry</dd></div>
<div><dt>Instructor</dt><dd>Dele Okonkwo</dd></div>
</dl>
</div>
</aside>
</div>
</main>
<div class="toast-host" id="toastHost" aria-live="polite" aria-atomic="true"></div>
<script src="script.js"></script>
</body>
</html>Completion Certificate
A celebratory certificate page for an online course. The centerpiece is a framed, parchment-style award with gold corners and an embossed seal, presenting the learner’s name in a serif display face, the course title, lesson count and study hours, the final score, an instructor signature, the completion date, and a generated QR block for verification. A success badge and difficulty/progress pills sit above the certificate to reinforce the achievement.
The side panel groups everything a learner wants next: a primary download-to-PDF button, plus print, share-link and add-to-LinkedIn actions, a dashed verification code with a one-tap copy button, the public verify URL, a list of earned-skill badges, and a credential metadata block. Print styles strip the chrome so only the certificate prints cleanly on a single page.
Interactions are vanilla JS: download shows a brief preparing state then a confirmation toast, copy writes the credential code to the clipboard with a green confirmation, share uses the Web Share API with a clipboard fallback, print opens the dialog, and a study-mode toggle dims the surrounding UI while keeping the certificate readable. The QR pattern is rendered deterministically from the credential code, and a small toast() helper drives all the feedback.
Illustrative UI only — fictional courses, not a real learning platform.