DIY — PCB Traces Background
A full-bleed animated printed-circuit background drawn entirely in SVG and CSS. Copper traces are routed in the classic 45-degree style across a solder-mask surface with ringed vias, pads and two IC footprints, while current pulses walk the nets using stroke-dasharray offsets staggered at different speeds. Controls cover trace density, four colorways, pulse speed, glow, pause and a readability scrim, with reduced-motion respected by default and a live copyable snippet panel.
MCP
Code
/* ============================================================
DIY — PCB Traces Background
Kellerman Circuitworks · Stealthis
============================================================ */
:root {
/* DIY baseline */
--blueprint: #0f2a4a;
--blueprint-d: #0a1e36;
--blueprint-l: #16385f;
--grid: rgba(140, 180, 220, 0.14);
--grid-major: rgba(140, 180, 220, 0.26);
--orange: #ff6b35;
--orange-d: #e0521f;
--orange-soft: #ffe3d6;
--kraft: #d9c7a7;
--kraft-l: #efe6d4;
--ink: #1c2733;
--ink-2: #3d4a57;
--muted: #6b7885;
--bg: #f4f1ea;
--white: #ffffff;
--line: rgba(28, 39, 51, 0.12);
--line-2: rgba(28, 39, 51, 0.2);
--ok: #2f9e6f;
--warn: #d98a2b;
--danger: #d4503e;
--r-sm: 6px;
--r-md: 12px;
--r-lg: 18px;
--sh-sm: 0 1px 2px rgba(6, 14, 24, 0.28);
--sh-md: 0 10px 26px rgba(4, 10, 18, 0.34);
--sh-lg: 0 24px 60px rgba(3, 8, 16, 0.46);
/* Board colorway (overridden per data-colorway) */
--mask-a: #0a3320;
--mask-b: #05130c;
--copper: #c9973f;
--copper-dim: rgba(201, 151, 63, 0.5);
--pulse: #7dfab4;
--silk: rgba(226, 240, 232, 0.72);
--sheen: rgba(255, 214, 140, 0.1);
--pulse-dur: 6s;
--scrim-op: 1;
}
body[data-colorway="black"] {
--mask-a: #1c1c1e;
--mask-b: #08080a;
--copper: #e8c46a;
--copper-dim: rgba(232, 196, 106, 0.42);
--pulse: #ffe9a8;
--silk: rgba(240, 236, 226, 0.7);
--sheen: rgba(255, 226, 150, 0.12);
}
body[data-colorway="navy"] {
--mask-a: #0f2a4a;
--mask-b: #06111f;
--copper: #4f7fae;
--copper-dim: rgba(120, 170, 215, 0.4);
--pulse: #63e6ff;
--silk: rgba(214, 232, 248, 0.72);
--sheen: rgba(120, 200, 255, 0.1);
}
body[data-colorway="purple"] {
--mask-a: #3a1d5c;
--mask-b: #170a26;
--copper: #d8b25e;
--copper-dim: rgba(216, 178, 94, 0.44);
--pulse: #ff9df0;
--silk: rgba(238, 226, 250, 0.74);
--sheen: rgba(226, 150, 255, 0.12);
}
body[data-scrim="off"] { --scrim-op: 0; }
*, *::before, *::after { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
margin: 0;
min-height: 100vh;
font-family: Inter, system-ui, -apple-system, "Segoe UI", sans-serif;
line-height: 1.5;
color: #eaf1ee;
background: var(--mask-b);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
transition: background 0.5s ease;
}
.mono { font-family: "JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, monospace; }
:focus-visible {
outline: 2px solid var(--orange);
outline-offset: 2px;
border-radius: var(--r-sm);
}
/* ============================================================
BOARD BACKGROUND
============================================================ */
.board {
position: fixed;
inset: 0;
z-index: 0;
overflow: hidden;
background:
radial-gradient(120% 90% at 22% 8%, color-mix(in srgb, var(--mask-a) 92%, white 8%) 0%, transparent 62%),
linear-gradient(155deg, var(--mask-a) 0%, var(--mask-b) 78%);
transition: background 0.5s ease;
}
/* Fine solder-mask weave: 8px grid + 80px major lines */
.board__mask {
position: absolute;
inset: -10%;
background-image:
linear-gradient(to right, var(--grid) 1px, transparent 1px),
linear-gradient(to bottom, var(--grid) 1px, transparent 1px),
linear-gradient(to right, var(--grid-major) 1px, transparent 1px),
linear-gradient(to bottom, var(--grid-major) 1px, transparent 1px);
background-size: 8px 8px, 8px 8px, 80px 80px, 80px 80px;
opacity: 0.55;
-webkit-mask-image: radial-gradient(105% 85% at 50% 40%, #000 45%, transparent 100%);
mask-image: radial-gradient(105% 85% at 50% 40%, #000 45%, transparent 100%);
}
/* Faint copper sheen sweep */
.board__sheen {
position: absolute;
inset: -20%;
background:
radial-gradient(46% 34% at 18% 22%, var(--sheen) 0%, transparent 70%),
radial-gradient(52% 40% at 84% 76%, var(--sheen) 0%, transparent 72%),
linear-gradient(115deg, transparent 38%, rgba(255, 255, 255, 0.045) 50%, transparent 62%);
mix-blend-mode: screen;
pointer-events: none;
}
.board__svg { position: absolute; inset: 0; width: 100%; height: 100%; }
.board__scrim {
position: absolute;
inset: 0;
pointer-events: none;
opacity: var(--scrim-op);
transition: opacity 0.35s ease;
background:
radial-gradient(80% 60% at 50% 34%, rgba(4, 10, 16, 0.68) 0%, rgba(4, 10, 16, 0.34) 55%, transparent 100%),
linear-gradient(to bottom, rgba(4, 10, 16, 0.5), rgba(4, 10, 16, 0.2) 40%, rgba(4, 10, 16, 0.62));
}
/* --- SVG net styling --- */
.layer-traces path {
fill: none;
stroke: var(--copper-dim);
stroke-width: 1.6;
stroke-linecap: round;
stroke-linejoin: round;
}
.layer-traces path.is-fat { stroke-width: 3.2; }
.layer-pulses path {
fill: none;
stroke: var(--pulse);
stroke-width: 2.2;
stroke-linecap: round;
opacity: 0.9;
animation: flow var(--dur, 6s) linear infinite;
animation-delay: var(--delay, 0s);
}
body[data-glow="on"] .layer-pulses { filter: url(#pulseGlow); }
body[data-paused="1"] .layer-pulses path { animation-play-state: paused; }
@keyframes flow { to { stroke-dashoffset: var(--to, -1200); } }
.via circle.ring { fill: none; stroke: var(--copper); stroke-width: 2; opacity: 0.85; }
.via circle.hole { fill: var(--mask-b); opacity: 0.9; }
.pad { fill: var(--copper); opacity: 0.8; }
.ic rect.body { fill: rgba(8, 12, 16, 0.7); stroke: var(--silk); stroke-width: 1; }
.ic rect.pin { fill: var(--copper); opacity: 0.75; }
.ic text {
font-family: "JetBrains Mono", monospace;
font-size: 9px;
fill: var(--silk);
letter-spacing: 0.06em;
}
.silk { stroke: var(--silk); fill: none; stroke-width: 1; opacity: 0.4; }
.flare {
fill: var(--pulse);
filter: url(#viaFlare);
animation: flare 700ms ease-out forwards;
pointer-events: none;
}
@keyframes flare {
0% { opacity: 0.85; transform: scale(0.4); }
100% { opacity: 0; transform: scale(3.2); }
}
/* ============================================================
CONTENT
============================================================ */
.wrap {
position: relative;
z-index: 2;
max-width: 980px;
margin: 0 auto;
padding: 34px 22px 60px;
display: grid;
gap: 22px;
}
.masthead {
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
flex-wrap: wrap;
}
.brand { display: flex; align-items: center; gap: 12px; }
.brand__chip {
display: grid;
place-items: center;
width: 42px; height: 42px;
border-radius: var(--r-md);
background: linear-gradient(150deg, var(--orange), var(--orange-d));
color: #fff;
box-shadow: var(--sh-md);
}
.brand__txt { display: grid; line-height: 1.25; }
.brand__txt strong { font-size: 15px; font-weight: 700; letter-spacing: -0.01em; }
.brand__txt em {
font-style: normal;
font-size: 12px;
color: rgba(234, 241, 238, 0.62);
}
.rev {
font-family: "JetBrains Mono", monospace;
font-size: 11px;
font-weight: 600;
letter-spacing: 0.1em;
color: var(--orange-soft);
padding: 6px 11px;
border: 1px solid rgba(255, 107, 53, 0.42);
border-radius: 999px;
background: rgba(255, 107, 53, 0.1);
}
.card {
background: rgba(10, 18, 26, 0.62);
backdrop-filter: blur(10px) saturate(1.1);
-webkit-backdrop-filter: blur(10px) saturate(1.1);
border: 1px solid rgba(255, 255, 255, 0.11);
border-radius: var(--r-lg);
padding: 26px;
box-shadow: var(--sh-lg);
}
.card__flag { display: flex; gap: 8px; flex-wrap: wrap; margin-bottom: 14px; }
.badge {
font-family: "JetBrains Mono", monospace;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.09em;
text-transform: uppercase;
padding: 4px 9px;
border-radius: var(--r-sm);
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 255, 255, 0.14);
color: rgba(234, 241, 238, 0.85);
}
.badge--ok {
background: rgba(47, 158, 111, 0.18);
border-color: rgba(47, 158, 111, 0.5);
color: #8ff0c4;
}
.card--hero h1 {
margin: 0 0 10px;
font-size: clamp(26px, 4.6vw, 40px);
font-weight: 800;
letter-spacing: -0.025em;
line-height: 1.12;
}
.lede { margin: 0; font-size: 16px; color: rgba(234, 241, 238, 0.8); max-width: 62ch; }
.specs {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 1px;
margin: 22px 0 0;
background: rgba(255, 255, 255, 0.1);
border: 1px solid rgba(255, 255, 255, 0.1);
border-radius: var(--r-md);
overflow: hidden;
}
.specs > div { background: rgba(6, 12, 18, 0.62); padding: 12px 14px; }
.specs dt {
font-size: 10px;
letter-spacing: 0.1em;
text-transform: uppercase;
color: rgba(234, 241, 238, 0.5);
}
.specs dd {
margin: 4px 0 0;
font-family: "JetBrains Mono", monospace;
font-size: 13px;
font-weight: 600;
color: var(--orange-soft);
}
.grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 16px; }
.card--note {
padding: 20px;
transition: transform 0.22s ease, border-color 0.22s ease, box-shadow 0.22s ease;
}
.card--note:hover {
transform: translateY(-4px);
border-color: rgba(255, 107, 53, 0.45);
box-shadow: 0 26px 54px rgba(0, 0, 0, 0.5);
}
.card--note h2 {
margin: 0 0 8px;
font-size: 15px;
font-weight: 700;
display: flex;
align-items: center;
gap: 8px;
letter-spacing: -0.01em;
}
.card--note p { margin: 0 0 14px; font-size: 13.5px; color: rgba(234, 241, 238, 0.72); }
.dot { width: 8px; height: 8px; border-radius: 50%; flex: none; }
.dot--ok { background: var(--ok); box-shadow: 0 0 0 3px rgba(47, 158, 111, 0.2); }
.dot--warn { background: var(--warn); box-shadow: 0 0 0 3px rgba(217, 138, 43, 0.2); }
.dot--danger { background: var(--danger); box-shadow: 0 0 0 3px rgba(212, 80, 62, 0.2); }
.tagline {
font-family: "JetBrains Mono", monospace;
font-size: 10px;
letter-spacing: 0.12em;
color: rgba(234, 241, 238, 0.42);
}
/* ============================================================
CONTROL PANEL
============================================================ */
.panel {
background: linear-gradient(170deg, rgba(239, 230, 212, 0.97), rgba(217, 199, 167, 0.94));
color: var(--ink);
border-radius: var(--r-lg);
border: 1px solid rgba(28, 39, 51, 0.16);
box-shadow: var(--sh-lg);
overflow: hidden;
}
.panel__head {
padding: 18px 22px;
border-bottom: 1px dashed var(--line-2);
background: repeating-linear-gradient(45deg, rgba(255,107,53,0.05) 0 8px, transparent 8px 16px);
}
.panel__head h2 { margin: 0; font-size: 16px; font-weight: 800; letter-spacing: -0.01em; }
.panel__sub { margin: 4px 0 0; font-size: 12.5px; color: var(--ink-2); }
.panel__body {
padding: 20px 22px 22px;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 20px;
}
.field { border: 0; margin: 0; padding: 0; min-width: 0; }
.field--wide, .field--toggles { grid-column: 1 / -1; }
.field legend {
padding: 0 0 9px;
font-family: "JetBrains Mono", monospace;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.12em;
text-transform: uppercase;
color: var(--muted);
}
.seg {
display: flex;
background: rgba(255, 255, 255, 0.75);
border: 1px solid var(--line-2);
border-radius: var(--r-md);
padding: 4px;
gap: 4px;
}
.seg__btn {
flex: 1;
appearance: none;
border: 0;
background: transparent;
font: inherit;
font-size: 13px;
font-weight: 600;
color: var(--ink-2);
padding: 8px 6px;
border-radius: var(--r-sm);
cursor: pointer;
transition: background 0.18s ease, color 0.18s ease, transform 0.12s ease;
}
.seg__btn:hover { background: rgba(28, 39, 51, 0.07); }
.seg__btn:active { transform: scale(0.97); }
.seg__btn.is-on {
background: var(--ink);
color: var(--kraft-l);
box-shadow: var(--sh-sm);
}
.swatches { display: flex; flex-wrap: wrap; gap: 8px; }
.sw {
appearance: none;
display: inline-flex;
align-items: center;
gap: 8px;
font: inherit;
font-size: 12.5px;
font-weight: 600;
color: var(--ink-2);
background: rgba(255, 255, 255, 0.75);
border: 1px solid var(--line-2);
border-radius: 999px;
padding: 6px 12px 6px 7px;
cursor: pointer;
transition: border-color 0.18s ease, background 0.18s ease, transform 0.12s ease;
}
.sw:hover { background: #fff; transform: translateY(-1px); }
.sw i {
width: 16px; height: 16px;
border-radius: 50%;
border: 1px solid rgba(0, 0, 0, 0.35);
flex: none;
}
.sw--green i { background: linear-gradient(140deg, #0a3320 45%, #c9973f 100%); }
.sw--black i { background: linear-gradient(140deg, #1c1c1e 45%, #e8c46a 100%); }
.sw--navy i { background: linear-gradient(140deg, #0f2a4a 45%, #63e6ff 100%); }
.sw--purple i { background: linear-gradient(140deg, #3a1d5c 45%, #ff9df0 100%); }
.sw.is-on {
border-color: var(--orange);
background: var(--orange-soft);
color: var(--ink);
box-shadow: 0 0 0 3px rgba(255, 107, 53, 0.18);
}
.slider { display: flex; align-items: center; gap: 14px; }
.slider input[type="range"] {
flex: 1;
appearance: none;
-webkit-appearance: none;
height: 6px;
border-radius: 999px;
background: linear-gradient(90deg, var(--orange), var(--orange-d));
cursor: pointer;
}
.slider input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
width: 20px; height: 20px;
border-radius: 50%;
background: var(--white);
border: 3px solid var(--ink);
box-shadow: var(--sh-sm);
cursor: grab;
}
.slider input[type="range"]::-moz-range-thumb {
width: 16px; height: 16px;
border-radius: 50%;
background: var(--white);
border: 3px solid var(--ink);
}
.slider output {
min-width: 62px;
text-align: right;
font-size: 13px;
font-weight: 700;
color: var(--ink);
}
.field--toggles {
display: flex;
align-items: center;
gap: 18px;
flex-wrap: wrap;
padding-top: 4px;
border-top: 1px dashed var(--line-2);
}
.tog { display: inline-flex; align-items: center; gap: 9px; cursor: pointer; font-size: 13px; font-weight: 600; color: var(--ink-2); }
.tog input { position: absolute; opacity: 0; width: 0; height: 0; }
.tog__ui {
width: 42px; height: 24px;
border-radius: 999px;
background: rgba(28, 39, 51, 0.24);
position: relative;
transition: background 0.2s ease;
flex: none;
}
.tog__ui::after {
content: "";
position: absolute;
top: 3px; left: 3px;
width: 18px; height: 18px;
border-radius: 50%;
background: var(--white);
box-shadow: var(--sh-sm);
transition: transform 0.2s ease;
}
.tog input:checked + .tog__ui { background: var(--ok); }
.tog input:checked + .tog__ui::after { transform: translateX(18px); }
.tog input:focus-visible + .tog__ui { outline: 2px solid var(--orange); outline-offset: 2px; }
.btn {
appearance: none;
font: inherit;
font-size: 13px;
font-weight: 700;
cursor: pointer;
border-radius: var(--r-md);
padding: 9px 16px;
border: 1px solid var(--ink);
background: var(--ink);
color: var(--kraft-l);
display: inline-flex;
align-items: center;
gap: 8px;
transition: transform 0.12s ease, background 0.18s ease, box-shadow 0.18s ease;
box-shadow: var(--sh-sm);
}
.btn:hover { background: var(--ink-2); }
.btn:active { transform: translateY(1px); }
.btn--pause[aria-pressed="true"] {
background: var(--orange);
border-color: var(--orange-d);
color: #fff;
}
.btn__ico { font-size: 10px; letter-spacing: 1px; }
/* ============================================================
SNIPPET
============================================================ */
.snip {
background: rgba(6, 12, 18, 0.78);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.12);
border-radius: var(--r-lg);
overflow: hidden;
box-shadow: var(--sh-lg);
}
.snip__bar {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 14px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
flex-wrap: wrap;
}
.snip__bar h2 { margin: 0; font-size: 13px; font-weight: 700; letter-spacing: -0.01em; }
.snip__tabs { display: flex; gap: 4px; margin-left: auto; }
.snip__tab {
appearance: none;
font: inherit;
font-family: "JetBrains Mono", monospace;
font-size: 11px;
font-weight: 700;
letter-spacing: 0.08em;
padding: 6px 11px;
border-radius: var(--r-sm);
border: 1px solid rgba(255, 255, 255, 0.14);
background: transparent;
color: rgba(234, 241, 238, 0.68);
cursor: pointer;
transition: background 0.18s ease, color 0.18s ease;
}
.snip__tab:hover { background: rgba(255, 255, 255, 0.08); }
.snip__tab.is-on { background: var(--orange); border-color: var(--orange-d); color: #fff; }
.btn--copy { padding: 6px 14px; background: rgba(255, 255, 255, 0.1); border-color: rgba(255, 255, 255, 0.2); color: #eaf1ee; }
.btn--copy:hover { background: rgba(255, 255, 255, 0.18); }
.snip__code {
margin: 0;
padding: 16px;
overflow-x: auto;
font-family: "JetBrains Mono", monospace;
font-size: 12px;
line-height: 1.65;
color: #cfe6da;
white-space: pre;
tab-size: 2;
}
.foot {
display: flex;
justify-content: space-between;
gap: 12px;
flex-wrap: wrap;
font-size: 11.5px;
color: rgba(234, 241, 238, 0.5);
padding-top: 4px;
}
.foot .mono { letter-spacing: 0.1em; }
/* ============================================================
TOAST
============================================================ */
.toast {
position: fixed;
left: 50%;
bottom: 26px;
z-index: 30;
transform: translate(-50%, 22px);
opacity: 0;
pointer-events: none;
background: var(--ink);
color: var(--kraft-l);
font-size: 13px;
font-weight: 600;
padding: 10px 18px;
border-radius: 999px;
box-shadow: var(--sh-lg);
border: 1px solid rgba(255, 255, 255, 0.16);
transition: opacity 0.25s ease, transform 0.25s ease;
max-width: min(90vw, 420px);
text-align: center;
}
.toast.is-on { opacity: 1; transform: translate(-50%, 0); }
/* ============================================================
RESPONSIVE
============================================================ */
@media (max-width: 820px) {
.grid { grid-template-columns: 1fr; }
.specs { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 520px) {
.wrap { padding: 22px 14px 44px; gap: 16px; }
.card { padding: 18px; border-radius: var(--r-md); }
.card--hero h1 { font-size: 24px; }
.lede { font-size: 14.5px; }
.specs { grid-template-columns: 1fr 1fr; }
.panel__body { grid-template-columns: 1fr; padding: 16px; gap: 16px; }
.panel__head { padding: 14px 16px; }
.field--toggles { align-items: flex-start; flex-direction: column; gap: 12px; }
.seg__btn { font-size: 12px; padding: 8px 4px; }
.sw { font-size: 11.5px; padding: 5px 10px 5px 6px; }
.slider { flex-wrap: wrap; }
.snip__bar { padding: 10px; }
.snip__tabs { margin-left: 0; }
.btn--copy { margin-left: auto; }
.snip__code { font-size: 11px; padding: 12px; }
.rev { font-size: 10px; }
}
/* ============================================================
REDUCED MOTION
============================================================ */
@media (prefers-reduced-motion: reduce) {
.layer-pulses path { animation: none; stroke-dasharray: none; opacity: 0.35; }
.flare { animation: none; opacity: 0; }
.card--note:hover { transform: none; }
.toast { transition: opacity 0.01ms; }
* { scroll-behavior: auto; }
}/* ============================================================
DIY — PCB Traces Background
Kellerman Circuitworks · vanilla JS, no libraries
============================================================ */
(function () {
"use strict";
var NS = "http://www.w3.org/2000/svg";
var W = 1200, H = 800;
var body = document.body;
var svg = document.getElementById("traces");
var gTraces = document.getElementById("layer-traces");
var gPulses = document.getElementById("layer-pulses");
var gParts = document.getElementById("layer-parts");
var gVias = document.getElementById("layer-vias");
var gFlares = document.getElementById("layer-flares");
var motionNote = document.getElementById("motionNote");
var reduceQuery = window.matchMedia("(prefers-reduced-motion: reduce)");
var state = {
density: "medium",
colorway: "green",
speed: 100, // percent
glow: true,
scrim: true,
paused: reduceQuery.matches,
tab: "css"
};
var vias = []; // {x,y} in viewBox units — used for hover flare
/* ---------- tiny deterministic PRNG (mulberry32) ---------- */
function rng(seed) {
return function () {
seed |= 0; seed = (seed + 0x6d2b79f5) | 0;
var t = Math.imul(seed ^ (seed >>> 15), 1 | seed);
t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
};
}
function el(name, attrs, parent) {
var n = document.createElementNS(NS, name);
for (var k in attrs) { if (attrs.hasOwnProperty(k)) n.setAttribute(k, attrs[k]); }
if (parent) parent.appendChild(n);
return n;
}
/* ---------- 45° router ----------
Walks from a start point in the four cardinal directions plus the
four diagonals, snapping every segment to a multiple of 20 units so
the net reads like real autorouted copper. */
function routePath(rand, startX, startY, hops, dirBias) {
var x = startX, y = startY;
var d = "M " + x + " " + y;
var dirs = [
[1, 0], [0, 1], [1, 1], [1, -1],
[-1, 0], [0, -1], [-1, 1], [-1, -1]
];
for (var i = 0; i < hops; i++) {
var pick = dirs[Math.floor(rand() * (i % 3 === 0 ? 4 : 8))];
var len = 40 + Math.floor(rand() * 7) * 20;
var nx = x + pick[0] * len * dirBias;
var ny = y + pick[1] * len;
// keep inside the board with a small bleed
nx = Math.max(-40, Math.min(W + 40, nx));
ny = Math.max(-40, Math.min(H + 40, ny));
if (nx === x && ny === y) continue;
d += " L " + Math.round(nx) + " " + Math.round(ny);
x = nx; y = ny;
}
return { d: d, end: [x, y] };
}
function buildIC(cx, cy, w, h, pins, label) {
var g = el("g", { "class": "ic" }, gParts);
el("rect", { "class": "body", x: cx - w / 2, y: cy - h / 2, width: w, height: h, rx: 3 }, g);
var step = h / (pins + 1);
for (var i = 1; i <= pins; i++) {
var py = cy - h / 2 + step * i;
el("rect", { "class": "pin", x: cx - w / 2 - 9, y: py - 2.5, width: 9, height: 5, rx: 1 }, g);
el("rect", { "class": "pin", x: cx + w / 2, y: py - 2.5, width: 9, height: 5, rx: 1 }, g);
}
el("circle", { "class": "pin", cx: cx - w / 2 + 8, cy: cy - h / 2 + 8, r: 2.6 }, g);
var t = el("text", { x: cx, y: cy + 3, "text-anchor": "middle" }, g);
t.textContent = label;
el("rect", { "class": "silk", x: cx - w / 2 - 12, y: cy - h / 2 - 6, width: w + 24, height: h + 12, rx: 4 }, gParts);
}
function buildVia(x, y, r) {
var g = el("g", { "class": "via" }, gVias);
el("circle", { "class": "ring", cx: x, cy: y, r: r }, g);
el("circle", { "class": "hole", cx: x, cy: y, r: Math.max(1.4, r - 2.6) }, g);
vias.push({ x: x, y: y });
}
/* ---------- net builder ---------- */
var DENSITY = {
sparse: { traces: 12, pulses: 3, vias: 10, seed: 1207 },
medium: { traces: 26, pulses: 6, vias: 22, seed: 4821 },
dense: { traces: 46, pulses: 10, vias: 40, seed: 9310 }
};
function clear(node) { while (node.firstChild) node.removeChild(node.firstChild); }
function buildNet() {
clear(gTraces); clear(gPulses); clear(gParts); clear(gVias); clear(gFlares);
vias.length = 0;
var cfg = DENSITY[state.density];
var rand = rng(cfg.seed);
var paths = [];
for (var i = 0; i < cfg.traces; i++) {
var edge = i % 4;
var sx, sy;
if (edge === 0) { sx = -20; sy = Math.round(rand() * H / 20) * 20; }
else if (edge === 1) { sx = W + 20; sy = Math.round(rand() * H / 20) * 20; }
else if (edge === 2) { sx = Math.round(rand() * W / 20) * 20; sy = -20; }
else { sx = Math.round(rand() * W / 20) * 20; sy = H + 20; }
var bias = (edge === 1) ? -1 : 1;
var r = routePath(rand, sx, sy, 5 + Math.floor(rand() * 6), bias);
var p = el("path", { d: r.d }, gTraces);
if (rand() > 0.78) p.setAttribute("class", "is-fat");
paths.push({ node: p, d: r.d, end: r.end });
}
// Footprints — two SOIC-ish packages, deterministic placement
buildIC(330, 250, 92, 116, 8, "KX-1180");
buildIC(860, 545, 78, 96, 6, "TL-4C");
// Pads on a few trace endings
for (var j = 0; j < paths.length; j += 3) {
var e = paths[j].end;
if (e[0] > 10 && e[0] < W - 10 && e[1] > 10 && e[1] < H - 10) {
el("rect", { "class": "pad", x: e[0] - 5, y: e[1] - 3, width: 10, height: 6, rx: 1.5 }, gVias);
}
}
// Vias
for (var v = 0; v < cfg.vias; v++) {
var src = paths[Math.floor(rand() * paths.length)];
var pt;
try {
var L = src.node.getTotalLength();
pt = src.node.getPointAtLength(L * (0.15 + rand() * 0.7));
} catch (err) {
pt = { x: rand() * W, y: rand() * H };
}
if (pt.x < 0 || pt.x > W || pt.y < 0 || pt.y > H) continue;
buildVia(Math.round(pt.x), Math.round(pt.y), rand() > 0.8 ? 6 : 4.5);
}
// Pulses — duplicated highlight paths with dasharray/dashoffset
var chosen = [];
for (var c = 0; c < cfg.pulses; c++) {
chosen.push(paths[Math.floor(rand() * paths.length)]);
}
chosen.forEach(function (src, idx) {
var hp = el("path", { d: src.d }, gPulses);
var len = 400;
try { len = Math.max(120, src.node.getTotalLength()); } catch (e2) { /* jsdom */ }
var dashOn = Math.max(28, Math.min(90, len * 0.14));
hp.setAttribute("stroke-dasharray", dashOn + " " + Math.round(len));
hp.style.setProperty("--to", "-" + Math.round(len + dashOn) + "px");
hp.style.setProperty("--dur", (3.4 + idx * 0.9).toFixed(2) + "s");
hp.style.setProperty("--delay", (-idx * 1.3).toFixed(2) + "s");
hp.setAttribute("stroke-dashoffset", "0");
});
applySpeed();
}
/* ---------- speed ---------- */
function applySpeed() {
var factor = 100 / state.speed;
Array.prototype.forEach.call(gPulses.children, function (p, i) {
var base = 3.4 + i * 0.9;
p.style.setProperty("--dur", (base * factor).toFixed(2) + "s");
});
}
/* ---------- via hover flare ---------- */
var lastFlare = 0;
function onMove(ev) {
if (state.paused || reduceQuery.matches) return;
var now = Date.now();
if (now - lastFlare < 140) return;
var rect = svg.getBoundingClientRect();
if (!rect.width) return;
// viewBox uses slice; approximate with uniform scale on the larger ratio
var scale = Math.max(rect.width / W, rect.height / H);
var offX = (rect.width - W * scale) / 2;
var offY = (rect.height - H * scale) / 2;
var vx = (ev.clientX - rect.left - offX) / scale;
var vy = (ev.clientY - rect.top - offY) / scale;
for (var i = 0; i < vias.length; i++) {
var dx = vias[i].x - vx, dy = vias[i].y - vy;
if (dx * dx + dy * dy < 2600) {
lastFlare = now;
flare(vias[i].x, vias[i].y);
break;
}
}
}
function flare(x, y) {
var c = el("circle", { "class": "flare", cx: x, cy: y, r: 5 }, gFlares);
c.style.transformOrigin = x + "px " + y + "px";
setTimeout(function () { if (c.parentNode) c.parentNode.removeChild(c); }, 750);
}
/* ---------- toast ---------- */
var toastEl = document.getElementById("toast");
var toastTimer = null;
function toast(msg) {
toastEl.textContent = msg;
toastEl.classList.add("is-on");
clearTimeout(toastTimer);
toastTimer = setTimeout(function () { toastEl.classList.remove("is-on"); }, 2000);
}
/* ---------- snippet ---------- */
var COLOR_TOKENS = {
green: { mask: "#0a3320", deep: "#05130c", copper: "#c9973f", pulse: "#7dfab4" },
black: { mask: "#1c1c1e", deep: "#08080a", copper: "#e8c46a", pulse: "#ffe9a8" },
navy: { mask: "#0f2a4a", deep: "#06111f", copper: "#4f7fae", pulse: "#63e6ff" },
purple: { mask: "#3a1d5c", deep: "#170a26", copper: "#d8b25e", pulse: "#ff9df0" }
};
function snippet() {
var t = COLOR_TOKENS[state.colorway];
var dur = (3.4 * (100 / state.speed)).toFixed(2);
if (state.tab === "css") {
return [
":root {",
" --mask-a: " + t.mask + ";",
" --mask-b: " + t.deep + ";",
" --copper: " + t.copper + ";",
" --pulse: " + t.pulse + ";",
"}",
"",
".board {",
" background:",
" radial-gradient(120% 90% at 22% 8%, #ffffff14 0%, transparent 62%),",
" linear-gradient(155deg, var(--mask-a), var(--mask-b) 78%);",
"}",
"",
"/* fine 8px weave + 80px major grid */",
".board__mask {",
" background-image:",
" linear-gradient(to right, var(--grid) 1px, transparent 1px),",
" linear-gradient(to bottom, var(--grid) 1px, transparent 1px),",
" linear-gradient(to right, var(--grid-major) 1px, transparent 1px),",
" linear-gradient(to bottom, var(--grid-major) 1px, transparent 1px);",
" background-size: 8px 8px, 8px 8px, 80px 80px, 80px 80px;",
" mask-image: radial-gradient(105% 85% at 50% 40%, #000 45%, transparent);",
"}",
"",
".layer-pulses path {",
" stroke: var(--pulse);",
" animation: flow " + dur + "s linear infinite;",
(state.glow ? " filter: url(#pulseGlow);" : " /* glow off */"),
(state.paused ? " animation-play-state: paused;" : " animation-play-state: running;"),
"}",
"@keyframes flow { to { stroke-dashoffset: var(--to); } }",
"",
"@media (prefers-reduced-motion: reduce) {",
" .layer-pulses path { animation: none; stroke-dasharray: none; }",
"}"
].join("\n");
}
return [
'<svg viewBox="0 0 1200 800" preserveAspectRatio="xMidYMid slice">',
" <defs>",
' <filter id="pulseGlow" x="-40%" y="-40%" width="180%" height="180%">',
' <feGaussianBlur stdDeviation="3.2" result="b"/>',
" <feMerge><feMergeNode in=\"b\"/><feMergeNode in=\"SourceGraphic\"/></feMerge>",
" </filter>",
" </defs>",
"",
" <!-- copper: 45-degree routing only -->",
' <path d="M -20 240 L 120 240 L 220 340 L 220 460 L 340 580"',
' fill="none" stroke="' + t.copper + '" stroke-width="1.6"/>',
"",
" <!-- current pulse: same geometry, dashed + offset-animated -->",
' <path d="M -20 240 L 120 240 L 220 340 L 220 460 L 340 580"',
' fill="none" stroke="' + t.pulse + '" stroke-width="2.2"',
' stroke-dasharray="64 620" stroke-dashoffset="0"',
' style="--to:-684px; animation: flow ' + dur + 's linear infinite"/>',
"",
" <!-- via: ring + drilled hole -->",
' <g class="via">',
' <circle cx="220" cy="340" r="4.5" fill="none" stroke="' + t.copper + '" stroke-width="2"/>',
' <circle cx="220" cy="340" r="2" fill="' + t.deep + '"/>',
" </g>",
"</svg>",
"",
"<!-- density: " + state.density + " · " + DENSITY[state.density].traces + " nets, " +
DENSITY[state.density].pulses + " pulses -->"
].join("\n");
}
var codeEl = document.getElementById("code");
function renderSnippet() { codeEl.textContent = snippet(); }
/* ---------- wiring ---------- */
document.querySelectorAll("[data-density]").forEach(function (btn) {
if (btn === body) return;
btn.addEventListener("click", function () {
state.density = btn.getAttribute("data-density");
body.setAttribute("data-density", state.density);
document.querySelectorAll(".seg__btn").forEach(function (b) {
var on = b === btn;
b.classList.toggle("is-on", on);
b.setAttribute("aria-checked", on ? "true" : "false");
});
buildNet();
renderSnippet();
toast("Density: " + state.density + " — " + DENSITY[state.density].traces + " nets routed");
});
});
document.querySelectorAll(".sw").forEach(function (btn) {
btn.addEventListener("click", function () {
state.colorway = btn.getAttribute("data-colorway");
body.setAttribute("data-colorway", state.colorway);
document.querySelectorAll(".sw").forEach(function (b) {
var on = b === btn;
b.classList.toggle("is-on", on);
b.setAttribute("aria-checked", on ? "true" : "false");
});
renderSnippet();
toast("Colorway: " + btn.textContent.trim());
});
});
var speed = document.getElementById("speed");
var speedOut = document.getElementById("speedOut");
speed.addEventListener("input", function () {
state.speed = parseInt(speed.value, 10);
speedOut.textContent = state.speed + "%";
applySpeed();
renderSnippet();
});
var glow = document.getElementById("glow");
glow.addEventListener("change", function () {
state.glow = glow.checked;
body.setAttribute("data-glow", state.glow ? "on" : "off");
renderSnippet();
toast(state.glow ? "Pulse glow on" : "Pulse glow off");
});
var scrim = document.getElementById("scrim");
scrim.addEventListener("change", function () {
state.scrim = scrim.checked;
body.setAttribute("data-scrim", state.scrim ? "on" : "off");
toast(state.scrim ? "Readability scrim on" : "Scrim off — raw board");
});
var pause = document.getElementById("pause");
var pauseLbl = document.getElementById("pauseLbl");
function setPaused(p, quiet) {
state.paused = p;
body.setAttribute("data-paused", p ? "1" : "0");
pause.setAttribute("aria-pressed", p ? "true" : "false");
pauseLbl.textContent = p ? "Resume pulses" : "Pause pulses";
pause.querySelector(".btn__ico").textContent = p ? "▶" : "❚❚";
renderSnippet();
if (!quiet) toast(p ? "Pulses paused" : "Pulses running");
}
pause.addEventListener("click", function () { setPaused(!state.paused); });
document.querySelectorAll(".snip__tab").forEach(function (tab) {
tab.addEventListener("click", function () {
state.tab = tab.getAttribute("data-tab");
document.querySelectorAll(".snip__tab").forEach(function (t) {
var on = t === tab;
t.classList.toggle("is-on", on);
t.setAttribute("aria-selected", on ? "true" : "false");
});
renderSnippet();
});
});
document.getElementById("copy").addEventListener("click", function () {
var text = codeEl.textContent;
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(text).then(
function () { toast("Snippet copied to clipboard"); },
function () { fallbackCopy(text); }
);
} else {
fallbackCopy(text);
}
});
function fallbackCopy(text) {
var ta = document.createElement("textarea");
ta.value = text;
ta.setAttribute("readonly", "");
ta.style.position = "fixed";
ta.style.opacity = "0";
document.body.appendChild(ta);
ta.select();
try { document.execCommand("copy"); toast("Snippet copied"); }
catch (e) { toast("Copy failed — select the code manually"); }
document.body.removeChild(ta);
}
/* keyboard: arrow keys move between radio-style buttons */
function arrowNav(container, selector) {
container.addEventListener("keydown", function (ev) {
if (ev.key !== "ArrowRight" && ev.key !== "ArrowLeft") return;
var items = Array.prototype.slice.call(container.querySelectorAll(selector));
var i = items.indexOf(document.activeElement);
if (i < 0) return;
ev.preventDefault();
var next = items[(i + (ev.key === "ArrowRight" ? 1 : items.length - 1)) % items.length];
next.focus();
next.click();
});
}
arrowNav(document.querySelector(".seg"), ".seg__btn");
arrowNav(document.querySelector(".swatches"), ".sw");
window.addEventListener("pointermove", onMove, { passive: true });
/* ---------- reduced motion ---------- */
function syncMotion() {
if (reduceQuery.matches) {
setPaused(true, true);
motionNote.textContent =
"Reduced motion is on in your system settings, so pulses start paused. Press Resume to run them anyway.";
} else {
motionNote.textContent = "Pulses are running. Adjust density, colorway and speed below.";
}
}
if (reduceQuery.addEventListener) reduceQuery.addEventListener("change", syncMotion);
else if (reduceQuery.addListener) reduceQuery.addListener(syncMotion);
/* ---------- boot ---------- */
buildNet();
setPaused(state.paused, true);
syncMotion();
renderSnippet();
})();<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Kellerman Circuitworks — PCB Traces Background</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 data-colorway="green" data-density="medium" data-glow="on" data-scrim="on">
<!-- ============ BACKGROUND LAYER ============ -->
<div class="board" id="board" aria-hidden="true">
<div class="board__mask"></div>
<div class="board__sheen"></div>
<svg class="board__svg" id="traces" viewBox="0 0 1200 800" preserveAspectRatio="xMidYMid slice" role="presentation">
<defs>
<filter id="pulseGlow" x="-40%" y="-40%" width="180%" height="180%">
<feGaussianBlur stdDeviation="3.2" result="b" />
<feMerge><feMergeNode in="b" /><feMergeNode in="SourceGraphic" /></feMerge>
</filter>
<filter id="viaFlare" x="-120%" y="-120%" width="340%" height="340%">
<feGaussianBlur stdDeviation="5" result="b" />
<feMerge><feMergeNode in="b" /><feMergeNode in="SourceGraphic" /></feMerge>
</filter>
</defs>
<g id="layer-traces" class="layer-traces"></g>
<g id="layer-pulses" class="layer-pulses"></g>
<g id="layer-parts" class="layer-parts"></g>
<g id="layer-vias" class="layer-vias"></g>
<g id="layer-flares" class="layer-flares"></g>
</svg>
<div class="board__scrim"></div>
</div>
<!-- ============ CONTENT ============ -->
<main class="wrap">
<header class="masthead">
<div class="brand">
<span class="brand__chip" aria-hidden="true">
<svg viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round">
<rect x="6" y="6" width="12" height="12" rx="2" />
<path d="M12 2v4M12 18v4M2 12h4M18 12h4M4.9 4.9l2.9 2.9M16.2 16.2l2.9 2.9M19.1 4.9l-2.9 2.9M7.8 16.2l-2.9 2.9" />
</svg>
</span>
<span class="brand__txt">
<strong>Kellerman Circuitworks</strong>
<em>Bench notes & board files</em>
</span>
</div>
<span class="rev" title="Board revision">REV C · 2L · 1.6MM</span>
</header>
<section class="card card--hero">
<div class="card__flag">
<span class="badge badge--ok">Panelized</span>
<span class="badge">DRC clean</span>
</div>
<h1>Routing a 45° two-layer board without losing your mind</h1>
<p class="lede">Everything behind this text is a live SVG net: copper traces, ringed vias, two SOIC footprints and a stream of current pulses walking the routes. Nothing is an image file — it draws itself, and it stays out of the way of the words.</p>
<dl class="specs">
<div><dt>Trace / space</dt><dd>0.25 / 0.25 mm</dd></div>
<div><dt>Copper</dt><dd>1 oz (35 µm)</dd></div>
<div><dt>Via drill</dt><dd>0.30 mm</dd></div>
<div><dt>Finish</dt><dd>ENIG</dd></div>
</dl>
</section>
<section class="grid">
<article class="card card--note">
<h2><span class="dot dot--ok"></span>Keep return paths short</h2>
<p>A signal always comes home. If the plane under a trace is split, the return current detours around the gap and the loop area explodes. Route the slot, or move the trace.</p>
<span class="tagline">NOTE 01 · EMC</span>
</article>
<article class="card card--note">
<h2><span class="dot dot--warn"></span>Stitch your vias</h2>
<p>Ground vias every quarter wavelength along a board edge stop it behaving like a slot antenna. Cheap on a two-layer board, invisible on the BOM.</p>
<span class="tagline">NOTE 02 · GND</span>
</article>
<article class="card card--note">
<h2><span class="dot dot--danger"></span>Never route under a crystal</h2>
<p>The keep-out under an oscillator is not decoration. One stray clock trace and your 12 MHz reference starts wandering with temperature.</p>
<span class="tagline">NOTE 03 · CLK</span>
</article>
</section>
<!-- ============ CONTROL PANEL ============ -->
<section class="panel" aria-labelledby="panel-h">
<div class="panel__head">
<h2 id="panel-h">Background controls</h2>
<p class="panel__sub" id="motionNote">Pulses are running. Adjust density, colorway and speed below.</p>
</div>
<div class="panel__body">
<fieldset class="field">
<legend>Trace density</legend>
<div class="seg" role="radiogroup" aria-label="Trace density">
<button type="button" class="seg__btn" role="radio" aria-checked="false" data-density="sparse">Sparse</button>
<button type="button" class="seg__btn is-on" role="radio" aria-checked="true" data-density="medium">Medium</button>
<button type="button" class="seg__btn" role="radio" aria-checked="false" data-density="dense">Dense</button>
</div>
</fieldset>
<fieldset class="field">
<legend>Colorway</legend>
<div class="swatches" role="radiogroup" aria-label="Colorway">
<button type="button" class="sw sw--green is-on" role="radio" aria-checked="true" data-colorway="green"><i></i><span>Classic green</span></button>
<button type="button" class="sw sw--black" role="radio" aria-checked="false" data-colorway="black"><i></i><span>Matte / gold</span></button>
<button type="button" class="sw sw--navy" role="radio" aria-checked="false" data-colorway="navy"><i></i><span>Navy / cyan</span></button>
<button type="button" class="sw sw--purple" role="radio" aria-checked="false" data-colorway="purple"><i></i><span>Purple OSH</span></button>
</div>
</fieldset>
<fieldset class="field field--wide">
<legend>Pulse speed</legend>
<div class="slider">
<input type="range" id="speed" min="25" max="250" step="5" value="100"
aria-label="Pulse speed percentage" aria-describedby="speedOut" />
<output id="speedOut" class="mono">100%</output>
</div>
</fieldset>
<div class="field field--toggles">
<label class="tog">
<input type="checkbox" id="glow" checked />
<span class="tog__ui" aria-hidden="true"></span>
<span class="tog__lbl">Pulse glow</span>
</label>
<label class="tog">
<input type="checkbox" id="scrim" checked />
<span class="tog__ui" aria-hidden="true"></span>
<span class="tog__lbl">Readability scrim</span>
</label>
<button type="button" class="btn btn--pause" id="pause" aria-pressed="false">
<span class="btn__ico" aria-hidden="true">❚❚</span><span id="pauseLbl">Pause pulses</span>
</button>
</div>
</div>
</section>
<!-- ============ SNIPPET ============ -->
<section class="snip" aria-labelledby="snip-h">
<div class="snip__bar">
<h2 id="snip-h">Live snippet</h2>
<div class="snip__tabs" role="tablist" aria-label="Snippet language">
<button type="button" class="snip__tab is-on" role="tab" aria-selected="true" data-tab="css">CSS</button>
<button type="button" class="snip__tab" role="tab" aria-selected="false" data-tab="svg">SVG</button>
</div>
<button type="button" class="btn btn--copy" id="copy">Copy</button>
</div>
<pre class="snip__code"><code id="code"></code></pre>
</section>
<footer class="foot">
<span class="mono">KCW-2418-REVC</span>
<span>Fictional board files. Illustrative UI only.</span>
</footer>
</main>
<div class="toast" id="toast" role="status" aria-live="polite"></div>
<script src="script.js"></script>
</body>
</html>PCB Traces Background
A fixed, full-bleed board sits behind the page: a solder-mask gradient, a fine 8 px weave with an 80 px major grid, a soft copper sheen, and an SVG net of traces routed only in horizontal, vertical and 45-degree segments. Ringed vias, rectangular pads and two labelled footprints — KX-1180 and TL-4C — are placed on the same net that the router generated, so nothing looks pasted on. The whole layer is procedural and seeded, so a given density always produces the same board.
Current pulses are duplicate copies of a handful of trace paths, dashed and offset-animated so a bright segment travels the route. Each pulse gets its own duration and a negative delay, which spreads them apart without any timers. The control panel — a kraft-paper card floating over the board — swaps density (sparse / medium / dense rebuild the net), switches between classic green, matte black with gold, navy with cyan and a purple OSH-style mask, scrubs pulse speed from 25% to 250%, toggles the glow filter, and pauses everything.
Moving the pointer near a via makes it flare: the script maps client coordinates back into viewBox space and looks for a via within range, then drops a short-lived blurred circle. A demo content card and three routing notes float above to prove text stays legible, and the readability scrim toggle lets you see exactly how much work that dark radial layer is doing. The snippet panel mirrors the current settings in both CSS and SVG form with a copy button.
How this look is built
The board is three stacked layers instead of one image: a linear-gradient solder mask, a .board__mask element whose four repeating gradients plus background-size: 8px 8px, 8px 8px, 80px 80px, 80px 80px give the fine-and-major grid in a single paint, and a mask-image radial that fades the grid out at the edges so it never fights the text. The traces themselves are SVG paths built by a small seeded router; the pulses reuse the exact same d strings with stroke-dasharray and a @keyframes step on stroke-dashoffset driven by a --to custom property computed from getTotalLength(). That beats the old approach of animating a masked gradient sprite: the dash animation runs on one property the compositor handles cheaply, speed changes are just a CSS variable rewrite rather than a rebuild, and pausing is a single animation-play-state flip from a data-paused attribute on <body>. Watch the glow — feGaussianBlur on the pulse group is the one genuinely expensive part, so it is a toggle and it is applied to the group rather than per path. Under prefers-reduced-motion: reduce the pulses are stopped and the dashes removed by CSS, the script boots in the paused state, and the panel says so in plain language with a Resume button for anyone who wants motion anyway.
Illustrative UI only — always follow real safety guidance when working with tools, electronics, or repairs.