DIY — Repair Manual Landing
A dense, utilitarian landing page for FIXWELL, a fictional repair-manual community, built in the spirit of device-first repair wikis. It pairs a prominent live-filtering search field with device category tiles, colour-coded repairability score chips, a nine-step featured guide strip, a dark right-to-repair advocacy band with scroll-triggered stat counters, and a parts-store cross-sell row wired to an add-to-cart toast. Clean white surfaces, teal-blue primary, fix-it green accents, thin borders instead of heavy shadows.
MCP
Code
:root{
--white:#ffffff;
--steel:#f2f5f7;
--steel-2:#e7edf1;
--teal:#0f7fa8;
--teal-d:#0a6285;
--teal-soft:#e2f2f8;
--green:#3fa34d;
--green-soft:#e6f4e8;
--ink:#12212b;
--ink-2:#33454f;
--muted:#66787f;
--line:rgba(18,33,43,0.12);
--line-2:rgba(18,33,43,0.22);
--warn:#d98a2b;
--danger:#d4503e;
--r-sm:6px; --r-md:12px; --r-lg:18px;
--sh:0 1px 2px rgba(18,33,43,.06);
--sh-2:0 8px 24px rgba(18,33,43,.10);
}
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
margin:0;background:var(--white);color:var(--ink);
font-family:Inter,system-ui,sans-serif;line-height:1.5;
-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
}
h1,h2,h3,h4,p,dl,dd{margin:0}
ul,ol{margin:0;padding:0;list-style:none}
a{color:inherit;text-decoration:none}
button{font:inherit;color:inherit}
img,svg{max-width:100%}
.mono{font-family:"JetBrains Mono",ui-monospace,monospace}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.skip{position:absolute;left:-999px;top:0;z-index:99;background:var(--teal);color:#fff;padding:.7rem 1rem;border-radius:0 0 var(--r-sm) 0}
.skip:focus{left:0}
:focus-visible{outline:3px solid var(--teal);outline-offset:2px;border-radius:4px}
.wrap{width:min(1180px,100% - 2.5rem);margin-inline:auto}
/* ---------- header ---------- */
.hdr{position:sticky;top:0;z-index:40;background:rgba(255,255,255,.92);backdrop-filter:blur(10px);border-bottom:1px solid var(--line)}
.hdr.scrolled{box-shadow:0 1px 12px rgba(18,33,43,.09)}
.hdr-in{display:flex;align-items:center;gap:1.5rem;height:64px}
.brand{display:flex;align-items:center;gap:.55rem}
.brand-mark{display:grid;place-items:center;width:34px;height:34px;border-radius:9px;background:var(--teal);color:#fff}
.brand-txt{font-weight:800;font-size:1.15rem;letter-spacing:-.02em}
.brand-txt span{color:var(--teal)}
.nav{display:flex;gap:.25rem;margin-left:.75rem}
.nav a{padding:.5rem .8rem;border-radius:var(--r-sm);font-size:.92rem;font-weight:600;color:var(--ink-2)}
.nav a:hover{background:var(--steel);color:var(--teal-d)}
.nav a.is-active{color:var(--teal-d);background:var(--teal-soft)}
.hdr-right{margin-left:auto;display:flex;align-items:center;gap:.6rem}
.cart{display:flex;align-items:center;gap:.45rem;padding:.45rem .75rem;border:1px solid var(--line-2);border-radius:999px;background:#fff;cursor:pointer;transition:.15s}
.cart:hover{border-color:var(--teal);color:var(--teal-d)}
.cart-n{font-family:"JetBrains Mono",monospace;font-size:.76rem;font-weight:700;min-width:20px;height:20px;display:grid;place-items:center;border-radius:999px;background:var(--steel-2);padding:0 .35rem}
.cart.has .cart-n{background:var(--green);color:#fff}
.cart.pop{animation:pop .35s ease}
@keyframes pop{50%{transform:scale(1.13)}}
.btn-menu{display:none;flex-direction:column;gap:4px;width:38px;height:34px;justify-content:center;align-items:center;background:#fff;border:1px solid var(--line-2);border-radius:var(--r-sm);cursor:pointer}
.btn-menu span{width:16px;height:2px;background:var(--ink);border-radius:2px;transition:.2s}
.btn-menu[aria-expanded="true"] span:nth-child(1){transform:translateY(6px) rotate(45deg)}
.btn-menu[aria-expanded="true"] span:nth-child(2){opacity:0}
.btn-menu[aria-expanded="true"] span:nth-child(3){transform:translateY(-6px) rotate(-45deg)}
.nav-m{display:none;flex-direction:column;border-top:1px solid var(--line);background:#fff;padding:.4rem 1.25rem .8rem}
.nav-m a{padding:.7rem .2rem;font-weight:600;border-bottom:1px solid var(--line)}
/* ---------- hero ---------- */
.hero{
padding:clamp(3rem,7vw,5.5rem) 0 clamp(2.5rem,5vw,3.5rem);
background:
radial-gradient(900px 380px at 50% -10%,var(--teal-soft),transparent 70%),
linear-gradient(var(--white),var(--steel));
border-bottom:1px solid var(--line);
}
.hero-in{text-align:center;max-width:820px}
.eyebrow{font-family:"JetBrains Mono",monospace;font-size:.74rem;letter-spacing:.09em;text-transform:uppercase;color:var(--teal-d);margin-bottom:1rem}
.hero h1{font-size:clamp(2.1rem,5.4vw,3.5rem);line-height:1.08;letter-spacing:-.035em;font-weight:800}
.hero h1 em{font-style:normal;color:var(--teal)}
.lede{margin:1rem auto 0;max-width:60ch;color:var(--ink-2);font-size:1.03rem}
.search{margin-top:1.9rem;position:relative}
.search-box{display:flex;align-items:center;gap:.6rem;background:#fff;border:2px solid var(--ink);border-radius:var(--r-md);padding:.5rem .5rem .5rem .9rem;box-shadow:var(--sh-2);transition:border-color .15s}
.search-box:focus-within{border-color:var(--teal)}
.search-box svg{color:var(--muted);flex:none}
#q{flex:1;min-width:0;border:0;outline:none;background:none;font-size:1rem;padding:.55rem 0;color:var(--ink)}
#q::placeholder{color:var(--muted)}
.kbd{font-family:"JetBrains Mono",monospace;font-size:.7rem;border:1px solid var(--line-2);border-bottom-width:2px;border-radius:5px;padding:.1rem .4rem;color:var(--muted)}
.btn-search{background:var(--teal);color:#fff;border:0;border-radius:var(--r-sm);padding:.62rem 1.15rem;font-weight:700;cursor:pointer;transition:.15s}
.btn-search:hover{background:var(--teal-d)}
.btn-search:active{transform:translateY(1px)}
.sugg{position:absolute;left:0;right:0;top:calc(100% + .45rem);background:#fff;border:1px solid var(--line-2);border-radius:var(--r-md);box-shadow:var(--sh-2);overflow:hidden;text-align:left;z-index:30;max-height:330px;overflow-y:auto}
.sugg li{display:flex;align-items:center;gap:.7rem;padding:.62rem .85rem;cursor:pointer;border-bottom:1px solid var(--line)}
.sugg li:last-child{border-bottom:0}
.sugg li:hover,.sugg li[aria-selected="true"]{background:var(--teal-soft)}
.sugg .s-ico{width:30px;height:30px;flex:none;display:grid;place-items:center;border-radius:7px;background:var(--steel);font-family:"JetBrains Mono",monospace;font-size:.66rem;font-weight:700;color:var(--teal-d)}
.sugg .s-name{font-weight:600;font-size:.93rem}
.sugg .s-name mark{background:#fff2b8;color:inherit;border-radius:3px;padding:0 1px}
.sugg .s-sub{font-size:.76rem;color:var(--muted)}
.sugg .s-score{margin-left:auto;font-family:"JetBrains Mono",monospace;font-size:.72rem;font-weight:700;padding:.15rem .45rem;border-radius:999px;border:1px solid var(--line-2)}
.sugg .s-empty{color:var(--muted);cursor:default;justify-content:center;font-size:.9rem}
.search-hints{margin-top:.85rem;font-size:.83rem;color:var(--muted);display:flex;flex-wrap:wrap;gap:.4rem;justify-content:center;align-items:center}
.chip-h{background:#fff;border:1px solid var(--line-2);border-radius:999px;padding:.24rem .7rem;font-size:.8rem;cursor:pointer;transition:.15s}
.chip-h:hover{border-color:var(--teal);color:var(--teal-d);background:var(--teal-soft)}
/* ---------- sections ---------- */
.sec{padding:clamp(2.6rem,5vw,4rem) 0}
.sec-alt{background:var(--steel);border-block:1px solid var(--line)}
.sec-head{display:flex;flex-wrap:wrap;align-items:baseline;gap:.6rem 1rem;margin-bottom:1.4rem}
.sec-head h2{font-size:clamp(1.35rem,2.6vw,1.75rem);letter-spacing:-.02em;font-weight:800}
.sec-sub{color:var(--muted);font-size:.92rem}
.link-more{margin-left:auto;font-weight:600;font-size:.88rem;color:var(--teal-d)}
.link-more:hover{text-decoration:underline}
/* categories */
.cats{display:grid;grid-template-columns:repeat(6,1fr);gap:.85rem}
.cat{display:flex;flex-direction:column;align-items:center;gap:.5rem;padding:1.25rem .6rem 1rem;border:1px solid var(--line-2);border-radius:var(--r-md);background:#fff;text-align:center;transition:.18s}
.cat:hover{border-color:var(--teal);transform:translateY(-3px);box-shadow:var(--sh-2)}
.cat-ico{width:46px;height:46px;display:grid;place-items:center;border-radius:11px;background:var(--teal-soft);color:var(--teal-d);transition:.18s}
.cat-ico svg{width:26px;height:26px}
.cat:hover .cat-ico{background:var(--teal);color:#fff}
.cat-n{font-weight:700;font-size:.95rem}
.cat-c{font-family:"JetBrains Mono",monospace;font-size:.72rem;color:var(--muted)}
/* devices */
.devs{display:grid;grid-template-columns:repeat(4,1fr);gap:1rem}
.dev{display:flex;flex-direction:column;gap:.7rem;background:#fff;border:1px solid var(--line-2);border-radius:var(--r-md);padding:1rem;transition:.18s}
.dev:hover{border-color:var(--teal);box-shadow:var(--sh-2)}
.dev-art{height:96px;border-radius:var(--r-sm);background:linear-gradient(150deg,var(--steel-2),#fff);display:grid;place-items:center;border:1px solid var(--line)}
.dev-art svg{width:52px;height:52px;color:var(--ink-2);opacity:.75}
.dev-top{display:flex;align-items:flex-start;gap:.6rem}
.dev-name{font-weight:700;font-size:.98rem;line-height:1.25}
.dev-cat{font-family:"JetBrains Mono",monospace;font-size:.7rem;color:var(--muted);text-transform:uppercase;letter-spacing:.05em}
.score{margin-left:auto;flex:none;font-family:"JetBrains Mono",monospace;font-weight:700;font-size:.9rem;width:38px;height:38px;display:grid;place-items:center;border-radius:10px;color:#fff}
.score.good{background:var(--green)}
.score.mid{background:var(--warn)}
.score.bad{background:var(--danger)}
.dev-foot{display:flex;align-items:center;justify-content:space-between;border-top:1px solid var(--line);padding-top:.6rem;font-size:.82rem;color:var(--muted)}
.dev-foot b{font-family:"JetBrains Mono",monospace;color:var(--ink);font-weight:700}
.dev-go{font-weight:600;color:var(--teal-d)}
.dev:hover .dev-go{text-decoration:underline}
/* featured */
.feat{display:grid;grid-template-columns:1.05fr 1fr;gap:1.75rem;border:1px solid var(--line-2);border-radius:var(--r-lg);padding:1.5rem;background:linear-gradient(180deg,#fff,var(--steel))}
.tag{display:inline-block;font-family:"JetBrains Mono",monospace;font-size:.7rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;background:var(--green-soft);color:#276e31;padding:.25rem .55rem;border-radius:999px}
.feat h3{font-size:clamp(1.25rem,2.4vw,1.6rem);letter-spacing:-.02em;margin:.7rem 0 .6rem;font-weight:800}
.feat-info p{color:var(--ink-2);font-size:.95rem}
.meta{display:grid;grid-template-columns:repeat(4,auto);gap:1.2rem;margin:1.1rem 0;justify-content:start}
.meta dt{font-family:"JetBrains Mono",monospace;font-size:.68rem;text-transform:uppercase;letter-spacing:.07em;color:var(--muted)}
.meta dd{font-weight:700;font-size:.98rem;margin-top:.15rem}
.feat-cta{display:flex;gap:.6rem;flex-wrap:wrap}
.btn{border:0;border-radius:var(--r-sm);padding:.7rem 1.2rem;font-weight:700;cursor:pointer;transition:.15s}
.btn:active{transform:translateY(1px)}
.btn-p{background:var(--teal);color:#fff}
.btn-p:hover{background:var(--teal-d)}
.btn-g{background:#fff;color:var(--ink);border:1px solid var(--line-2)}
.btn-g:hover{border-color:var(--teal);color:var(--teal-d)}
.btn-a{background:var(--green);color:#fff;padding:.8rem 1.5rem}
.btn-a:hover{background:#358a41}
.steps{display:grid;grid-template-columns:repeat(3,1fr);gap:.7rem;align-content:start}
.step{background:#fff;border:1px solid var(--line-2);border-radius:var(--r-sm);padding:.55rem;cursor:pointer;transition:.16s}
.step:hover,.step.on{border-color:var(--teal);box-shadow:var(--sh-2)}
.step-thumb{height:62px;border-radius:4px;display:grid;place-items:center;background:var(--steel);border:1px solid var(--line);margin-bottom:.4rem}
.step-thumb svg{width:34px;height:34px;color:var(--teal-d)}
.step-n{font-family:"JetBrains Mono",monospace;font-size:.66rem;font-weight:700;color:var(--teal-d)}
.step-t{font-size:.78rem;font-weight:600;line-height:1.3}
/* advocacy */
.adv{
background:
linear-gradient(rgba(10,34,45,.9),rgba(10,34,45,.96)),
repeating-linear-gradient(0deg,rgba(140,190,210,.12) 0 1px,transparent 1px 8px),
repeating-linear-gradient(90deg,rgba(140,190,210,.12) 0 1px,transparent 1px 8px),
#0a222d;
color:#eaf4f8;padding:clamp(3rem,6vw,4.5rem) 0;text-align:center;
}
.adv-in{max-width:880px}
.adv-eyebrow{font-family:"JetBrains Mono",monospace;font-size:.74rem;letter-spacing:.14em;text-transform:uppercase;color:#6fd08c}
.adv h2{font-size:clamp(1.9rem,4.6vw,3rem);letter-spacing:-.03em;margin:.6rem 0 .8rem;font-weight:800}
.adv-lede{color:#b6ccd6;max-width:62ch;margin-inline:auto}
.stats{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;margin:2.2rem 0 1.8rem}
.stats li{padding:1.2rem .8rem;border:1px solid rgba(180,220,235,.2);border-radius:var(--r-md);background:rgba(255,255,255,.04)}
.stat-n{display:block;font-family:"JetBrains Mono",monospace;font-size:clamp(1.6rem,3.6vw,2.3rem);font-weight:700;color:#fff;letter-spacing:-.02em}
.stat-l{display:block;margin-top:.3rem;font-size:.85rem;color:#a9c2cd}
/* parts */
.prods{display:grid;grid-template-columns:repeat(4,1fr);gap:1rem}
.prod{display:flex;flex-direction:column;border:1px solid var(--line-2);border-radius:var(--r-md);overflow:hidden;background:#fff;transition:.18s}
.prod:hover{border-color:var(--teal);box-shadow:var(--sh-2)}
.prod-art{height:118px;display:grid;place-items:center;background:linear-gradient(160deg,var(--teal-soft),#fff);border-bottom:1px solid var(--line);position:relative}
.prod-art svg{width:56px;height:56px;color:var(--teal-d)}
.prod-badge{position:absolute;top:.55rem;left:.55rem;font-family:"JetBrains Mono",monospace;font-size:.64rem;font-weight:700;text-transform:uppercase;letter-spacing:.05em;background:var(--ink);color:#fff;padding:.18rem .45rem;border-radius:4px}
.prod-body{padding:.85rem;display:flex;flex-direction:column;gap:.35rem;flex:1}
.prod-name{font-weight:700;font-size:.94rem;line-height:1.3}
.prod-sku{font-family:"JetBrains Mono",monospace;font-size:.7rem;color:var(--muted)}
.prod-foot{margin-top:auto;padding-top:.7rem;display:flex;align-items:center;gap:.5rem}
.price{font-family:"JetBrains Mono",monospace;font-weight:700;font-size:1rem;background:var(--steel);border:1px solid var(--line-2);border-radius:999px;padding:.2rem .6rem}
.btn-add{margin-left:auto;background:var(--green);color:#fff;border:0;border-radius:var(--r-sm);padding:.45rem .8rem;font-size:.83rem;font-weight:700;cursor:pointer;transition:.15s}
.btn-add:hover{background:#358a41}
.btn-add:active{transform:translateY(1px)}
/* footer */
.ftr{background:var(--steel);border-top:1px solid var(--line);padding:2.6rem 0 1.4rem}
.ftr-in{display:grid;grid-template-columns:1.6fr repeat(4,1fr);gap:1.6rem}
.ftr-brand p{margin-top:.6rem;color:var(--muted);font-size:.88rem;max-width:34ch}
.ftr-col h4{font-family:"JetBrains Mono",monospace;font-size:.72rem;text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin-bottom:.6rem}
.ftr-col a{display:block;padding:.22rem 0;font-size:.9rem;color:var(--ink-2)}
.ftr-col a:hover{color:var(--teal-d);text-decoration:underline}
.ftr-bot{margin-top:2rem;padding-top:1rem;border-top:1px solid var(--line-2);display:flex;flex-wrap:wrap;gap:.5rem 1rem;justify-content:space-between;font-size:.8rem;color:var(--muted)}
/* toast */
.toast-wrap{position:fixed;right:1rem;bottom:1rem;z-index:80;display:flex;flex-direction:column;gap:.5rem;align-items:flex-end}
.toast{display:flex;align-items:center;gap:.55rem;background:var(--ink);color:#fff;padding:.7rem 1rem;border-radius:var(--r-sm);font-size:.88rem;box-shadow:var(--sh-2);animation:tin .25s ease both}
.toast .dot{width:8px;height:8px;border-radius:999px;background:var(--green);flex:none}
.toast.out{animation:tout .25s ease both}
@keyframes tin{from{opacity:0;transform:translateY(10px)}}
@keyframes tout{to{opacity:0;transform:translateY(8px)}}
/* reveal */
.reveal{opacity:0;transform:translateY(14px)}
.reveal.in{opacity:1;transform:none;transition:opacity .5s ease,transform .5s ease}
/* ---------- responsive ---------- */
@media (max-width:1020px){
.cats{grid-template-columns:repeat(3,1fr)}
.devs,.prods{grid-template-columns:repeat(2,1fr)}
.feat{grid-template-columns:1fr}
.ftr-in{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:760px){
.nav{display:none}
.btn-menu{display:flex}
.nav-m.open{display:flex}
}
@media (max-width:520px){
.wrap{width:min(1180px,100% - 1.75rem)}
.hero{padding-top:2.2rem}
.search-box{flex-wrap:wrap;padding:.5rem}
.kbd{display:none}
#q{flex:1 1 60%;padding-left:.2rem}
.btn-search{flex:1 1 100%;order:3}
.search-hints{justify-content:flex-start}
.cats{grid-template-columns:repeat(2,1fr)}
.devs,.prods{grid-template-columns:1fr}
.steps{grid-template-columns:repeat(2,1fr)}
.stats{grid-template-columns:1fr}
.meta{grid-template-columns:repeat(2,auto);gap:.8rem 1.4rem}
.ftr-in{grid-template-columns:1fr}
.toast-wrap{left:1rem;right:1rem;align-items:stretch}
}
@media (prefers-reduced-motion:reduce){
*{animation-duration:.01ms !important;transition-duration:.01ms !important}
.reveal{opacity:1;transform:none}
}/* FIXWELL — fictional repair-manual landing. Vanilla JS only. */
(function () {
"use strict";
/* ---------------- data ---------------- */
var DEVICES = [
{ name: "Nimbus 12", cat: "Phone", abbr: "PH", score: 7, guides: 64 },
{ name: "Nimbus 12 Ultra", cat: "Phone", abbr: "PH", score: 5, guides: 41 },
{ name: "Nimbus 9 Mini", cat: "Phone", abbr: "PH", score: 8, guides: 52 },
{ name: "Corvid X3", cat: "Phone", abbr: "PH", score: 4, guides: 29 },
{ name: "Lumen Book Air", cat: "Laptop", abbr: "LT", score: 6, guides: 38 },
{ name: "Lumen Book Pro 16", cat: "Laptop", abbr: "LT", score: 3, guides: 47 },
{ name: "Fernpad 11", cat: "Tablet", abbr: "TB", score: 5, guides: 22 },
{ name: "Fernpad Studio", cat: "Tablet", abbr: "TB", score: 2, guides: 18 },
{ name: "Orbit Station 5", cat: "Console", abbr: "CS", score: 7, guides: 33 },
{ name: "Orbit Handheld", cat: "Console", abbr: "CS", score: 9, guides: 26 },
{ name: "Hearth 400 Washer", cat: "Appliance", abbr: "AP", score: 9, guides: 31 },
{ name: "Hearth Dishwasher D2", cat: "Appliance", abbr: "AP", score: 8, guides: 24 },
{ name: "Kettleworks Grinder", cat: "Appliance", abbr: "AP", score: 10, guides: 12 },
{ name: "Drift Pro Buds", cat: "Headphones", abbr: "HP", score: 2, guides: 15 },
{ name: "Drift Over-Ear 3", cat: "Headphones", abbr: "HP", score: 6, guides: 19 },
{ name: "Solstice Watch S2", cat: "Wearable", abbr: "WR", score: 3, guides: 11 }
];
var FEATURED = [
{ name: "Nimbus 12", cat: "Phone", score: 7, guides: 64, fixes: "8,412", art: "phone" },
{ name: "Lumen Book Pro 16", cat: "Laptop", score: 3, guides: 47, fixes: "6,905", art: "laptop" },
{ name: "Hearth 400 Washer", cat: "Appliance", score: 9, guides: 31, fixes: "5,238", art: "washer" },
{ name: "Drift Pro Buds", cat: "Headphones", score: 2, guides: 15, fixes: "4,117", art: "buds" }
];
var STEPS = [
{ t: "Power down & discharge", ico: "power" },
{ t: "Heat the rear adhesive", ico: "heat" },
{ t: "Lift with suction handle", ico: "suction" },
{ t: "Remove 4× T3 screws", ico: "screw" },
{ t: "Disconnect the battery", ico: "plug" },
{ t: "Pull adhesive tabs", ico: "tab" },
{ t: "Seat the new cell", ico: "battery" },
{ t: "Reconnect & test", ico: "plug" },
{ t: "Re-seal and calibrate", ico: "check" }
];
var PRODUCTS = [
{ name: "Fixwell 64-Bit Driver Kit", sku: "FW-TK-064", price: "39.95", badge: "Best seller", art: "kit" },
{ name: "Nimbus 12 Battery + Adhesive", sku: "FW-BT-N12", price: "28.50", badge: "Genuine cell", art: "battery" },
{ name: "Anti-Static Spudger Set (6)", sku: "FW-SP-006", price: "11.20", badge: "Lifetime", art: "spudger" },
{ name: "Suction Handle Pro", sku: "FW-SH-002", price: "16.75", badge: "New", art: "suction" }
];
/* ---------------- svg icons ---------------- */
var S = function (d, extra) {
return '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" ' +
'stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' + d + (extra || "") + "</svg>";
};
var ART = {
phone: S('<rect x="6" y="2" width="12" height="20" rx="2.5"/><path d="M10 5.5h4"/>'),
laptop: S('<rect x="3" y="4" width="18" height="12" rx="2"/><path d="M1.5 19.5h21"/>'),
washer: S('<rect x="4" y="2.5" width="16" height="19" rx="2"/><circle cx="12" cy="14" r="4.2"/><path d="M7.2 6h2.2"/>'),
buds: S('<path d="M8 4a4 4 0 0 1 4 4v6a3 3 0 1 1-6 0V9"/><circle cx="17" cy="8" r="3.2"/><path d="M17 11.2V17a3 3 0 0 1-3 3"/>'),
kit: S('<rect x="2.5" y="7.5" width="19" height="12" rx="2"/><path d="M8.5 7.5V6a2 2 0 0 1 2-2h3a2 2 0 0 1 2 2v1.5M2.5 13h19M11 13v2.5h2V13"/>'),
battery: S('<rect x="2.5" y="7" width="16" height="10" rx="2"/><path d="M21.5 10.5v3M6 12h6"/>'),
spudger: S('<path d="M3 20l9-9M12 11l6.5-6.5a2 2 0 0 1 3 2.6L15 14M12 11l3 3"/>'),
suction: S('<path d="M4.5 9.5h15L17 15H7z"/><path d="M12 15v5M9.5 20h5M4.5 9.5a7.5 7.5 0 0 1 15 0"/>'),
power: S('<path d="M12 3v9"/><path d="M6.5 6.8a8 8 0 1 0 11 0"/>'),
heat: S('<path d="M12 3c3 3.5 1 5 2.5 7S18 13 18 15a6 6 0 0 1-12 0c0-2.5 2-4 3-6"/>'),
screw: S('<circle cx="12" cy="12" r="8"/><path d="M9 9l6 6M15 9l-6 6"/>'),
plug: S('<path d="M9 3v6M15 3v6M6 9h12v3a6 6 0 0 1-12 0zM12 18v3"/>'),
tab: S('<path d="M4 8h13a3 3 0 0 1 0 6H7"/><path d="M7 11l-3 3 3 3"/>'),
check: S('<circle cx="12" cy="12" r="8.5"/><path d="M8.3 12.3l2.6 2.6 4.8-5.3"/>')
};
/* ---------------- helpers ---------------- */
var $ = function (s, r) { return (r || document).querySelector(s); };
var esc = function (s) {
return String(s).replace(/[&<>"']/g, function (c) {
return { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[c];
});
};
var scoreClass = function (n) { return n >= 7 ? "good" : n >= 4 ? "mid" : "bad"; };
var toastWrap = $("#toasts");
function toast(msg) {
var el = document.createElement("div");
el.className = "toast";
el.setAttribute("role", "status");
el.innerHTML = '<span class="dot"></span><span></span>';
el.lastChild.textContent = msg;
toastWrap.appendChild(el);
setTimeout(function () {
el.classList.add("out");
setTimeout(function () { el.remove(); }, 260);
}, 2400);
}
/* ---------------- header ---------------- */
var hdr = $("#hdr");
window.addEventListener("scroll", function () {
hdr.classList.toggle("scrolled", window.scrollY > 8);
}, { passive: true });
var menuBtn = $("#menu-btn"), navM = $("#nav-m");
menuBtn.addEventListener("click", function () {
var open = menuBtn.getAttribute("aria-expanded") === "true";
menuBtn.setAttribute("aria-expanded", String(!open));
navM.classList.toggle("open", !open);
navM.hidden = open;
});
navM.addEventListener("click", function (e) {
if (e.target.tagName === "A") {
menuBtn.setAttribute("aria-expanded", "false");
navM.classList.remove("open"); navM.hidden = true;
}
});
/* ---------------- cart ---------------- */
var cart = $("#cart"), cartN = $("#cart-n"), count = 0;
function addToCart(name) {
count++;
cartN.textContent = String(count);
cart.classList.add("has", "pop");
cart.setAttribute("aria-label", "Cart, " + count + (count === 1 ? " item" : " items"));
setTimeout(function () { cart.classList.remove("pop"); }, 360);
toast("Added to cart — " + name);
}
cart.addEventListener("click", function () {
toast(count ? count + " item(s) in your cart" : "Your cart is empty");
});
/* ---------------- search + suggestions ---------------- */
var q = $("#q"), sugg = $("#sugg"), active = -1, current = [];
function closeSugg() {
sugg.hidden = true; sugg.innerHTML = ""; active = -1; current = [];
q.setAttribute("aria-expanded", "false");
}
function highlight(name, term) {
var i = name.toLowerCase().indexOf(term.toLowerCase());
if (i < 0 || !term) return esc(name);
return esc(name.slice(0, i)) + "<mark>" + esc(name.slice(i, i + term.length)) + "</mark>" + esc(name.slice(i + term.length));
}
function render(term) {
var t = term.trim().toLowerCase();
if (!t) { closeSugg(); return; }
current = DEVICES.filter(function (d) {
return d.name.toLowerCase().indexOf(t) > -1 || d.cat.toLowerCase().indexOf(t) > -1;
}).slice(0, 7);
if (!current.length) {
sugg.innerHTML = '<li class="s-empty" role="option" aria-disabled="true">No device matches “' + esc(term) + '” — request a guide</li>';
} else {
sugg.innerHTML = current.map(function (d, i) {
return '<li role="option" id="opt-' + i + '" aria-selected="false" data-i="' + i + '">' +
'<span class="s-ico">' + d.abbr + "</span>" +
"<span><span class=\"s-name\">" + highlight(d.name, term) + "</span><br>" +
'<span class="s-sub">' + esc(d.cat) + " · " + d.guides + " guides</span></span>" +
'<span class="s-score mono">' + d.score + "/10</span></li>";
}).join("");
}
sugg.hidden = false;
q.setAttribute("aria-expanded", "true");
active = -1;
q.removeAttribute("aria-activedescendant");
}
function setActive(i) {
var items = sugg.querySelectorAll("li[data-i]");
if (!items.length) return;
if (active > -1 && items[active]) items[active].setAttribute("aria-selected", "false");
active = (i + items.length) % items.length;
items[active].setAttribute("aria-selected", "true");
items[active].scrollIntoView({ block: "nearest" });
q.setAttribute("aria-activedescendant", "opt-" + active);
}
function pick(i) {
var d = current[i];
if (!d) return;
q.value = d.name;
closeSugg();
toast("Opening " + d.name + " — " + d.guides + " guides");
}
q.addEventListener("input", function () { render(q.value); });
q.addEventListener("focus", function () { if (q.value.trim()) render(q.value); });
q.addEventListener("keydown", function (e) {
if (e.key === "ArrowDown") { e.preventDefault(); if (sugg.hidden) render(q.value); else setActive(active + 1); }
else if (e.key === "ArrowUp") { e.preventDefault(); setActive(active - 1); }
else if (e.key === "Enter") {
if (!sugg.hidden && active > -1) { e.preventDefault(); pick(active); }
else { doSearch(); }
} else if (e.key === "Escape") { closeSugg(); }
});
sugg.addEventListener("mousedown", function (e) {
var li = e.target.closest("li[data-i]");
if (li) { e.preventDefault(); pick(Number(li.dataset.i)); }
});
document.addEventListener("click", function (e) {
if (!e.target.closest(".search")) closeSugg();
});
function doSearch() {
var v = q.value.trim();
closeSugg();
toast(v ? 'Searching manuals for “' + v + '”' : "Type a device name to search");
}
$("#go").addEventListener("click", doSearch);
Array.prototype.forEach.call(document.querySelectorAll(".chip-h"), function (c) {
c.addEventListener("click", function () {
q.value = c.textContent;
q.focus();
render(q.value);
});
});
document.addEventListener("keydown", function (e) {
if (e.key === "/" && document.activeElement !== q && !/^(INPUT|TEXTAREA)$/.test(document.activeElement.tagName)) {
e.preventDefault(); q.focus(); q.select();
}
});
/* ---------------- render lists ---------------- */
$("#devs").innerHTML = FEATURED.map(function (d) {
return '<li class="dev reveal"><div class="dev-art">' + ART[d.art] + "</div>" +
'<div class="dev-top"><span><span class="dev-name">' + esc(d.name) + '</span><br>' +
'<span class="dev-cat">' + esc(d.cat) + "</span></span>" +
'<span class="score ' + scoreClass(d.score) + '" title="Repairability ' + d.score + ' of 10">' + d.score + "</span></div>" +
'<div class="dev-foot"><span><b>' + d.guides + "</b> guides · <b>" + d.fixes + "</b> fixes</span>" +
'<span class="dev-go">Open →</span></div></li>';
}).join("");
$("#steps").innerHTML = STEPS.map(function (s, i) {
return '<li class="step reveal" tabindex="0" role="button" data-step="' + (i + 1) + '">' +
'<div class="step-thumb">' + ART[s.ico] + "</div>" +
'<div class="step-n">STEP ' + String(i + 1).padStart(2, "0") + "</div>" +
'<div class="step-t">' + esc(s.t) + "</div></li>";
}).join("");
$("#steps").addEventListener("click", function (e) {
var st = e.target.closest(".step"); if (st) selectStep(st);
});
$("#steps").addEventListener("keydown", function (e) {
if (e.key === "Enter" || e.key === " ") {
var st = e.target.closest(".step");
if (st) { e.preventDefault(); selectStep(st); }
}
});
function selectStep(st) {
Array.prototype.forEach.call($("#steps").children, function (c) { c.classList.remove("on"); });
st.classList.add("on");
toast("Step " + st.dataset.step + " of 9 — " + STEPS[st.dataset.step - 1].t);
}
$("#prods").innerHTML = PRODUCTS.map(function (p) {
return '<li class="prod reveal"><div class="prod-art"><span class="prod-badge">' + esc(p.badge) + "</span>" +
ART[p.art] + "</div>" +
'<div class="prod-body"><span class="prod-name">' + esc(p.name) + "</span>" +
'<span class="prod-sku">' + esc(p.sku) + "</span>" +
'<div class="prod-foot"><span class="price">$' + p.price + "</span>" +
'<button class="btn-add" type="button" data-name="' + esc(p.name) + '">Add to cart</button></div></div></li>';
}).join("");
$("#prods").addEventListener("click", function (e) {
var b = e.target.closest(".btn-add");
if (b) addToCart(b.dataset.name);
});
Array.prototype.forEach.call(document.querySelectorAll("[data-toast]"), function (b) {
b.addEventListener("click", function () { toast(b.dataset.toast); });
});
/* ---------------- reveal + counters ---------------- */
var reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches;
function countUp(el) {
var to = Number(el.dataset.to), sfx = el.dataset.suffix || "", dur = 1400, t0 = null;
if (reduce) { el.textContent = to.toLocaleString("en-US") + sfx; return; }
function frame(ts) {
if (t0 === null) t0 = ts;
var p = Math.min((ts - t0) / dur, 1);
var e = 1 - Math.pow(1 - p, 3);
el.textContent = Math.round(to * e).toLocaleString("en-US") + sfx;
if (p < 1) requestAnimationFrame(frame);
}
requestAnimationFrame(frame);
}
if ("IntersectionObserver" in window) {
var io = new IntersectionObserver(function (entries) {
entries.forEach(function (en) {
if (!en.isIntersecting) return;
en.target.classList.add("in");
if (en.target.classList.contains("stat-n")) countUp(en.target);
io.unobserve(en.target);
});
}, { threshold: 0.25, rootMargin: "0px 0px -40px 0px" });
document.querySelectorAll(".reveal").forEach(function (el, i) {
el.style.transitionDelay = (i % 6) * 55 + "ms";
io.observe(el);
});
document.querySelectorAll(".stat-n").forEach(function (el) { io.observe(el); });
} else {
document.querySelectorAll(".reveal").forEach(function (el) { el.classList.add("in"); });
document.querySelectorAll(".stat-n").forEach(countUp);
}
})();<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>FIXWELL — Repair Manuals for Everything</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=JetBrains+Mono:wght@400;600;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="style.css" />
</head>
<body>
<a class="skip" href="#main">Skip to content</a>
<header class="hdr" id="hdr">
<div class="wrap hdr-in">
<a class="brand" href="#" aria-label="FIXWELL home">
<span class="brand-mark" aria-hidden="true">
<svg viewBox="0 0 32 32" width="28" height="28" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round">
<path d="M21.5 4.5a7 7 0 0 0-8.2 9.1L4.6 22.3a2.4 2.4 0 0 0 3.4 3.4l8.7-8.7a7 7 0 0 0 9.1-8.2l-4 4-3.6-1-1-3.6z"/>
</svg>
</span>
<span class="brand-txt">FIX<span>WELL</span></span>
</a>
<nav class="nav" aria-label="Main">
<a href="#categories" class="is-active">Guides</a>
<a href="#parts">Parts</a>
<a href="#advocacy">Community</a>
<a href="#parts">Store</a>
</nav>
<div class="hdr-right">
<button class="cart" id="cart" type="button" aria-label="Cart, 0 items">
<svg viewBox="0 0 24 24" width="17" height="17" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
<circle cx="9" cy="20" r="1.4"/><circle cx="18" cy="20" r="1.4"/>
<path d="M2 3h3l2.4 12h11.2L21 7H6"/>
</svg>
<span class="cart-n" id="cart-n">0</span>
</button>
<button class="btn-menu" id="menu-btn" type="button" aria-expanded="false" aria-controls="nav-m" aria-label="Open menu">
<span></span><span></span><span></span>
</button>
</div>
</div>
<nav class="nav-m" id="nav-m" aria-label="Mobile" hidden>
<a href="#categories">Guides</a><a href="#parts">Parts</a><a href="#advocacy">Community</a><a href="#parts">Store</a>
</nav>
</header>
<main id="main">
<!-- HERO -->
<section class="hero">
<div class="wrap hero-in">
<p class="eyebrow">12,480 free manuals · 61 languages · community-written</p>
<h1>Fix it yourself.<br /><em>Someone already wrote the guide.</em></h1>
<p class="lede">Step-by-step teardown manuals, tool lists and genuine parts for the devices you already own. Written and peer-reviewed by 84,000 fixers.</p>
<div class="search" role="search">
<label class="sr" for="q">Search repair guides</label>
<div class="search-box">
<svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" aria-hidden="true">
<circle cx="11" cy="11" r="7"/><path d="M20 20l-3.6-3.6"/>
</svg>
<input id="q" type="text" autocomplete="off" role="combobox" aria-expanded="false"
aria-controls="sugg" aria-autocomplete="list"
placeholder="Try "Nimbus 12 battery" or "dishwasher pump"" />
<kbd class="kbd">/</kbd>
<button class="btn-search" type="button" id="go">Search</button>
</div>
<ul class="sugg" id="sugg" role="listbox" aria-label="Device suggestions" hidden></ul>
<p class="search-hints">Popular: <button class="chip-h" type="button">Nimbus 12</button><button class="chip-h" type="button">Lumen Book Air</button><button class="chip-h" type="button">Drift Pro Buds</button><button class="chip-h" type="button">Hearth 400 Washer</button></p>
</div>
</div>
</section>
<!-- CATEGORIES -->
<section class="sec" id="categories">
<div class="wrap">
<div class="sec-head">
<h2>Browse by device</h2>
<a class="link-more" href="#">All 42 categories →</a>
</div>
<ul class="cats">
<li><a class="cat" href="#">
<span class="cat-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="6" y="2" width="12" height="20" rx="2.5"/><path d="M10 5.5h4M10.5 18.8h3"/></svg></span>
<span class="cat-n">Phone</span><span class="cat-c">3,182 guides</span></a></li>
<li><a class="cat" href="#">
<span class="cat-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="4" width="18" height="12" rx="2"/><path d="M1.5 19.5h21M9.5 16.5h5"/></svg></span>
<span class="cat-n">Laptop</span><span class="cat-c">2,047 guides</span></a></li>
<li><a class="cat" href="#">
<span class="cat-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="2.5" width="16" height="19" rx="2.4"/><path d="M10.6 18.6h2.8"/></svg></span>
<span class="cat-n">Tablet</span><span class="cat-c">946 guides</span></a></li>
<li><a class="cat" href="#">
<span class="cat-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M7.5 7h9a4.5 4.5 0 0 1 4.4 3.6l1 5A3 3 0 0 1 19 19c-1.2 0-1.9-.7-2.6-1.5l-.9-1.1H8.5l-.9 1.1C6.9 18.3 6.2 19 5 19a3 3 0 0 1-2.9-3.4l1-5A4.5 4.5 0 0 1 7.5 7z"/><path d="M6.4 12h2.4M7.6 10.8v2.4M15.4 11.4h.01M17.4 13h.01"/></svg></span>
<span class="cat-n">Console</span><span class="cat-c">612 guides</span></a></li>
<li><a class="cat" href="#">
<span class="cat-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><rect x="4" y="2.5" width="16" height="19" rx="2"/><circle cx="12" cy="14" r="4.2"/><path d="M7.2 6h2.2M16.4 6h.01"/></svg></span>
<span class="cat-n">Appliance</span><span class="cat-c">1,455 guides</span></a></li>
<li><a class="cat" href="#">
<span class="cat-ico" aria-hidden="true"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"><path d="M4 15v-3a8 8 0 0 1 16 0v3"/><rect x="2.5" y="14.5" width="4.5" height="6.5" rx="2"/><rect x="17" y="14.5" width="4.5" height="6.5" rx="2"/></svg></span>
<span class="cat-n">Headphones</span><span class="cat-c">738 guides</span></a></li>
</ul>
</div>
</section>
<!-- MOST FIXED -->
<section class="sec sec-alt" id="most-fixed">
<div class="wrap">
<div class="sec-head">
<h2>Most-fixed devices this month</h2>
<p class="sec-sub">Repairability scored 1–10 by our teardown team.</p>
</div>
<ul class="devs" id="devs"></ul>
</div>
</section>
<!-- FEATURED GUIDE -->
<section class="sec" id="featured">
<div class="wrap">
<div class="sec-head"><h2>Featured guide</h2><a class="link-more" href="#">Browse editors' picks →</a></div>
<article class="feat">
<div class="feat-info">
<span class="tag">Battery replacement</span>
<h3>Nimbus 12 — Battery Swap in 9 Steps</h3>
<p>Adhesive-backed cell, no soldering. You will need a suction handle, a plastic spudger and 20 minutes of patience. Screws are grouped by length in the step notes so nothing ends up in the wrong hole.</p>
<dl class="meta">
<div><dt>Time</dt><dd>25–40 min</dd></div>
<div><dt>Difficulty</dt><dd>Moderate</dd></div>
<div><dt>Steps</dt><dd>9</dd></div>
<div><dt>Success</dt><dd>96%</dd></div>
</dl>
<div class="feat-cta">
<button class="btn btn-p" type="button" data-toast="Guide opened — step 1 of 9">Start guide</button>
<button class="btn btn-g" type="button" data-toast="Saved to your toolbox">Save</button>
</div>
</div>
<ol class="steps" id="steps" aria-label="Guide steps preview"></ol>
</article>
</div>
</section>
<!-- ADVOCACY -->
<section class="adv" id="advocacy">
<div class="wrap adv-in">
<p class="adv-eyebrow">Right to repair</p>
<h2>Repair is freedom.</h2>
<p class="adv-lede">Every manual we publish is free, forever. Manufacturers glue things shut — we write the guide that opens them again, and we fight for the parts and schematics to stay public.</p>
<ul class="stats" id="stats">
<li><span class="stat-n" data-to="12480" data-suffix="">0</span><span class="stat-l">Free manuals published</span></li>
<li><span class="stat-n" data-to="84300" data-suffix="+">0</span><span class="stat-l">Community fixers</span></li>
<li><span class="stat-n" data-to="19" data-suffix="M kg">0</span><span class="stat-l">E-waste kept out of landfill</span></li>
</ul>
<button class="btn btn-a" type="button" data-toast="Thanks — you're on the advocacy list">Join the campaign</button>
</div>
</section>
<!-- PARTS -->
<section class="sec" id="parts">
<div class="wrap">
<div class="sec-head"><h2>Parts & tools that actually fit</h2><p class="sec-sub">Tested against the guides. Lifetime warranty on hand tools.</p></div>
<ul class="prods" id="prods"></ul>
</div>
</section>
</main>
<footer class="ftr">
<div class="wrap ftr-in">
<div class="ftr-brand">
<span class="brand-txt">FIX<span>WELL</span></span>
<p>A fictional repair-manual community. Open manuals, honest parts, no glue.</p>
</div>
<div class="ftr-col"><h4>Fix</h4><a href="#">Guides</a><a href="#">Teardowns</a><a href="#">Repairability scores</a><a href="#">Troubleshooting</a></div>
<div class="ftr-col"><h4>Shop</h4><a href="#">Toolkits</a><a href="#">Batteries</a><a href="#">Screens</a><a href="#">Gift cards</a></div>
<div class="ftr-col"><h4>Community</h4><a href="#">Answers forum</a><a href="#">Write a guide</a><a href="#">Repair cafés</a><a href="#">Translators</a></div>
<div class="ftr-col"><h4>About</h4><a href="#">Our mission</a><a href="#">Right to repair</a><a href="#">Press kit</a><a href="#">Contact</a></div>
</div>
<div class="wrap ftr-bot">
<p>© 2026 FIXWELL Collective — fictional brand, demo interface.</p>
<p class="mono">CC BY-NC-SA · Manuals free forever</p>
</div>
</footer>
<div class="toast-wrap" id="toasts" aria-live="polite" aria-atomic="false"></div>
<script src="script.js"></script>
</body>
</html>Repair Manual Landing
FIXWELL is a fictional community of fixers, and this page is its front door. A sticky translucent
header carries the wordmark, four nav links and a cart chip that counts up as you shop. The hero
puts one thing first: a big bordered search field. Type into it and a dropdown of matching devices
appears live, filtered from a fictional catalogue of sixteen products, with the matched substring
highlighted, the device category and guide count underneath, and a repairability chip on the right.
It is a real combobox — arrow keys move the selection, Enter picks it, Escape closes it, and
pressing / anywhere on the page jumps focus into the field.
Below the fold the information architecture goes device-first: six category tiles with hand-drawn SVG line-art icons and guide counts, then a “most-fixed devices this month” row where each card carries a 1–10 repairability score chip coloured green, amber or red. A featured guide splits into a metadata column (time, difficulty, steps, success rate) and a nine-thumbnail step strip; each thumbnail is a keyboard-operable button that selects the step and fires a toast.
The dark advocacy band is the emotional centre — “Repair is freedom” over a fine blueprint grid, with three stat counters that ease from zero to their final value the first time they scroll into view. The parts row closes with price chips and add-to-cart buttons that increment the header cart, pop its badge and stack a toast in the corner. Everything is CSS or inline SVG; no images, no libraries, no network calls.
How this look is built
The archetype here is the iFixit-style repair wiki — search-led, dense, score-driven — but the
construction is entirely modern. CSS Grid carries every row (repeat(6,1fr) tiles, repeat(4,1fr)
device and product cards) and collapses through three breakpoints down to a single column at 360px,
so no float clearfixes or percentage-width columns are needed. The blueprint texture on the dark
band is two repeating-linear-gradient layers stacked under a translucent overlay instead of a
tiled PNG, which means it stays crisp at any DPI and costs zero requests. position: sticky on the
header replaces the old scroll-listener-plus-fixed-clone trick; the only scroll handler left is a
passive one-liner that toggles a shadow class. Reveal animations and the stat counters share one
IntersectionObserver rather than polling getBoundingClientRect() in a scroll loop, so the
counters fire exactly once, at the right moment, and unobserve themselves — and a
prefers-reduced-motion branch snaps them straight to the final number.
Illustrative UI only — always follow real safety guidance when working with tools, electronics, or repairs.