DIY — Maker Profile
A designer profile page for a fictional 3D-printing community, built on a deep slate palette with filament-orange and cyan accents. It pairs a gradient cover band and isometric SVG avatar plate with a mono stat strip, four switchable panes for models, makes, collections and about, sortable isometric render tiles with like counters, hexagonal achievement medallions with tooltips, printer spec cards, a slicer settings table and a sticky activity rail with tip support.
MCP
Code
:root{
--bg:#151a21;
--bg-2:#11151b;
--card:#1e242d;
--card-2:#232b35;
--orange:#ff7a1a;
--orange-d:#d95f0c;
--orange-soft:rgba(255,122,26,.14);
--cyan:#22c8d8;
--cyan-soft:rgba(34,200,216,.14);
--text:#e8edf3;
--text-2:#b3bdc9;
--muted:#7f8b99;
--line:rgba(232,237,243,.10);
--line-2:rgba(232,237,243,.18);
--ok:#3ecf8e;
--warn:#e0a13a;
--r-sm:6px; --r-md:12px; --r-lg:18px;
--sh-1:0 1px 2px rgba(0,0,0,.4);
--sh-2:0 8px 24px rgba(0,0,0,.35);
--sh-3:0 18px 48px rgba(0,0,0,.45);
}
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{
margin:0;
background:var(--bg);
color:var(--text);
font-family:Inter,system-ui,sans-serif;
line-height:1.5;
-webkit-font-smoothing:antialiased;
text-rendering:optimizeLegibility;
}
h1,h2,h3,h4{margin:0;line-height:1.2;letter-spacing:-.01em}
p{margin:0}
ul,ol{margin:0;padding:0;list-style:none}
a{color:inherit;text-decoration:none}
button,select{font:inherit;color:inherit}
.mono{font-family:"JetBrains Mono",ui-monospace,monospace}
.wrap{width:min(1240px,100% - 40px);margin-inline:auto}
.sr-only{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
:focus-visible{outline:2px solid var(--cyan);outline-offset:2px;border-radius:4px}
.skip{position:absolute;left:-999px;top:8px;background:var(--orange);color:#12171e;padding:8px 14px;border-radius:var(--r-sm);font-weight:700;z-index:60}
.skip:focus{left:16px}
/* ---------- topbar ---------- */
.topbar{position:sticky;top:0;z-index:40;background:rgba(17,21,27,.86);backdrop-filter:blur(12px);border-bottom:1px solid var(--line)}
.topbar-in{display:flex;align-items:center;gap:24px;height:60px}
.brand{display:flex;align-items:center;gap:10px}
.brand-mark{display:grid;place-items:center}
.brand-name{font-weight:800;letter-spacing:.14em;font-size:14px}
.topnav{display:flex;gap:20px;margin-left:8px}
.topnav a{font-size:14px;color:var(--text-2);font-weight:500;padding:6px 2px;border-bottom:2px solid transparent;transition:color .16s,border-color .16s}
.topnav a:hover{color:var(--text);border-color:var(--orange)}
.pill{margin-left:auto;font-size:11px;color:var(--muted);border:1px solid var(--line);padding:5px 10px;border-radius:999px}
/* ---------- cover ---------- */
.cover{position:relative;margin-bottom:26px}
.cover-band{position:relative;height:210px;overflow:hidden;background:
radial-gradient(1200px 400px at 15% 120%, rgba(255,122,26,.35), transparent 60%),
radial-gradient(900px 400px at 85% -20%, rgba(34,200,216,.30), transparent 60%),
linear-gradient(120deg,#1a212b,#12171e);
border-bottom:1px solid var(--line);
}
.cover-mesh{position:absolute;inset:0;
background-image:linear-gradient(rgba(232,237,243,.05) 1px,transparent 1px),
linear-gradient(90deg,rgba(232,237,243,.05) 1px,transparent 1px);
background-size:26px 26px;
mask-image:linear-gradient(180deg,rgba(0,0,0,.9),transparent);
}
.cover-blob{position:absolute;border-radius:50%;filter:blur(50px);opacity:.55}
.b1{width:280px;height:280px;left:8%;top:-90px;background:var(--orange)}
.b2{width:240px;height:240px;right:12%;top:40px;background:var(--cyan)}
.cover-in{position:relative;display:grid;grid-template-columns:auto 1fr auto;gap:20px;align-items:end;margin-top:-64px}
.avatar-plate{position:relative;width:132px;height:132px;border-radius:24px;overflow:visible;
background:linear-gradient(140deg,var(--card-2),var(--card));
border:1px solid var(--line-2);box-shadow:var(--sh-3);padding:6px}
.avatar-plate svg{width:100%;height:100%;border-radius:18px;display:block}
.online{position:absolute;right:-4px;bottom:-4px;width:22px;height:22px;border-radius:50%;background:var(--ok);border:4px solid var(--bg)}
.ident{padding-bottom:4px;min-width:0}
.dname{font-size:30px;font-weight:800;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.verified{font-size:13px;width:22px;height:22px;border-radius:50%;background:var(--cyan);color:#0d1116;display:grid;place-items:center;font-weight:700}
.handle{font-size:13px;color:var(--cyan);margin-top:4px}
.meta{display:flex;flex-wrap:wrap;gap:8px;font-size:13px;color:var(--muted);margin-top:8px}
.tagline{margin-top:8px;color:var(--text-2);font-size:14px;max-width:56ch}
.cover-actions{display:flex;gap:10px;padding-bottom:6px}
.btn{border:1px solid var(--line-2);background:var(--card);color:var(--text);padding:10px 18px;border-radius:999px;font-weight:600;font-size:14px;cursor:pointer;display:inline-flex;align-items:center;gap:8px;transition:transform .12s,background .16s,border-color .16s,box-shadow .16s}
.btn:hover{transform:translateY(-1px);border-color:var(--line-2);box-shadow:var(--sh-2)}
.btn:active{transform:translateY(0)}
.btn-primary{background:linear-gradient(140deg,var(--orange),var(--orange-d));border-color:transparent;color:#17110a}
.btn-primary:hover{filter:brightness(1.06)}
.btn-primary[aria-pressed="true"]{background:transparent;color:var(--text);border-color:var(--orange);filter:none}
.btn-ghost:hover{background:var(--card-2)}
.btn-icon{padding:10px 12px}
.btn-ico{font-weight:800}
.w-full{width:100%;justify-content:center}
/* ---------- stats ---------- */
.stats{display:grid;grid-template-columns:repeat(5,1fr);gap:1px;background:var(--line);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;margin-top:26px}
.stats li{background:var(--card);padding:18px 16px;display:flex;flex-direction:column;gap:4px;transition:background .16s}
.stats li:hover{background:var(--card-2)}
.s-val{font-size:22px;font-weight:700;color:var(--orange)}
.stats li:nth-child(even) .s-val{color:var(--cyan)}
.s-key{font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:.08em}
/* ---------- layout ---------- */
.layout{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:28px;margin-top:28px;padding-bottom:60px}
.col-main{min-width:0}
.tabs-head{display:flex;align-items:center;gap:16px;flex-wrap:wrap;border-bottom:1px solid var(--line);margin-bottom:22px}
.tabs{display:flex;gap:4px;flex-wrap:wrap}
.tab{background:none;border:0;padding:12px 14px;font-weight:600;font-size:14px;color:var(--muted);cursor:pointer;border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .16s,border-color .16s}
.tab:hover{color:var(--text)}
.tab.is-active{color:var(--text);border-color:var(--orange)}
.tab .count{font-size:11px;color:var(--muted);margin-left:4px}
.sortwrap{margin-left:auto;padding-bottom:8px}
.sel{background:var(--card);border:1px solid var(--line-2);border-radius:999px;padding:8px 14px;font-size:12px;cursor:pointer}
.pane{display:none;animation:fade .22s ease both}
.pane.is-active{display:block}
@keyframes fade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
/* ---------- models ---------- */
.grid-models{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:18px}
.tile{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);overflow:hidden;transition:transform .18s,border-color .18s,box-shadow .18s}
.tile:hover{transform:translateY(-3px);border-color:rgba(255,122,26,.45);box-shadow:var(--sh-2)}
.render{position:relative;aspect-ratio:10/7;display:grid;place-items:center;
background:radial-gradient(circle at 50% 40%, rgba(34,200,216,.16), transparent 62%),
radial-gradient(circle at 30% 90%, rgba(255,122,26,.16), transparent 60%),
#12171e;
border-bottom:1px solid var(--line)}
.render::after{content:"";position:absolute;inset:0;
background-image:linear-gradient(rgba(232,237,243,.045) 1px,transparent 1px),linear-gradient(90deg,rgba(232,237,243,.045) 1px,transparent 1px);
background-size:16px 16px;pointer-events:none}
.render svg{width:82%;height:auto;position:relative;z-index:1;transition:transform .3s cubic-bezier(.2,.8,.3,1)}
.tile:hover .render svg{transform:translateY(-4px) scale(1.05)}
.badge-time{position:absolute;right:10px;bottom:10px;z-index:2;font-size:11px;background:rgba(17,21,27,.85);border:1px solid var(--line-2);padding:3px 8px;border-radius:999px;color:var(--text-2)}
.tile-body{padding:14px 16px 16px}
.tile-body h3{font-size:15px;font-weight:700}
.tile-sub{font-size:11px;color:var(--muted);margin-top:5px}
.tile-stats{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:12px;font-size:12px;color:var(--text-2)}
.like{background:none;border:0;cursor:pointer;font-family:inherit;font-size:12px;color:var(--text-2);padding:4px 8px;border-radius:999px;transition:color .16s,background .16s}
.like:hover{background:var(--orange-soft);color:var(--orange)}
.like[aria-pressed="true"]{color:var(--orange);background:var(--orange-soft)}
.loadmore{display:block;margin:24px auto 0;background:var(--card);border:1px dashed var(--line-2);color:var(--text-2);padding:12px 26px;border-radius:999px;cursor:pointer;font-weight:600;font-size:14px;transition:color .16s,border-color .16s}
.loadmore:hover{color:var(--orange);border-color:var(--orange)}
/* ---------- makes ---------- */
.makes{display:flex;flex-direction:column;gap:14px}
.make{display:grid;grid-template-columns:120px 1fr;gap:16px;background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);padding:14px;transition:border-color .18s,transform .18s}
.make:hover{border-color:rgba(34,200,216,.45);transform:translateY(-2px)}
.make-thumb{border-radius:var(--r-md);background:radial-gradient(circle at 50% 45%, rgba(255,122,26,.18), transparent 65%),#12171e;display:grid;place-items:center;border:1px solid var(--line)}
.make-thumb svg{width:86%}
.make-body h3{font-size:15px}
.make-note{font-size:13px;color:var(--text-2);margin-top:6px}
.make-foot{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:12px;font-size:12px;color:var(--muted)}
.credit{background:var(--cyan-soft);color:var(--cyan);padding:4px 10px;border-radius:999px;font-size:12px}
.credit strong{font-weight:700}
.chip{border:1px solid var(--line-2);padding:3px 9px;border-radius:999px;font-size:11px;color:var(--text-2)}
.date{margin-left:auto;font-size:11px}
/* ---------- collections ---------- */
.folders{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:16px}
.folder{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);padding:20px;display:block;transition:transform .18s,border-color .18s}
.folder:hover{transform:translateY(-3px);border-color:rgba(255,122,26,.45)}
.f-ico{display:block;width:46px;height:34px;border-radius:4px 10px 10px 10px;background:linear-gradient(140deg,var(--orange),var(--orange-d));position:relative;margin-bottom:14px}
.f-ico::before{content:"";position:absolute;top:-6px;left:0;width:20px;height:8px;border-radius:4px 4px 0 0;background:var(--orange-d)}
.f-ico.alt{background:linear-gradient(140deg,var(--cyan),#12909c)}
.f-ico.alt::before{background:#12909c}
.folder h3{font-size:15px}
.folder p{font-size:11px;color:var(--muted);margin-top:6px}
/* ---------- about ---------- */
.about{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);padding:26px}
.about h2{font-size:19px}
.about h3{font-size:14px;text-transform:uppercase;letter-spacing:.1em;color:var(--cyan);margin-top:28px}
.about p{color:var(--text-2);font-size:14px;margin-top:12px;max-width:70ch}
.printers{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:14px;margin-top:14px}
.printer{background:var(--card-2);border:1px solid var(--line);border-radius:var(--r-md);padding:16px}
.p-tag{display:inline-block;font-size:10px;letter-spacing:.1em;background:var(--orange-soft);color:var(--orange);padding:3px 8px;border-radius:999px}
.printer h4{font-size:14px;margin-top:10px}
.printer dl{margin:12px 0 0;font-size:11px;display:flex;flex-direction:column;gap:6px}
.printer dl div{display:flex;justify-content:space-between;gap:10px;border-bottom:1px dashed var(--line);padding-bottom:5px}
.printer dt{color:var(--muted)}
.printer dd{margin:0;color:var(--text-2);text-align:right}
.settings{width:100%;border-collapse:collapse;margin-top:14px;font-size:12px}
.settings th,.settings td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--line)}
.settings th{color:var(--muted);font-weight:500;width:34%}
.settings td:last-child{color:var(--muted)}
.settings tr:hover td,.settings tr:hover th{background:var(--card-2)}
/* ---------- side rail ---------- */
.col-side{display:flex;flex-direction:column;gap:18px;position:sticky;top:80px;align-self:start}
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--r-lg);padding:20px}
.card-h{font-size:12px;text-transform:uppercase;letter-spacing:.12em;color:var(--muted);margin-bottom:16px}
.badges{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
.badge{background:none;border:0;padding:0;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:6px}
.b-face{width:52px;height:52px;display:grid;place-items:center;font-weight:800;font-size:14px;color:#17110a;
clip-path:polygon(50% 0,93% 25%,93% 75%,50% 100%,7% 75%,7% 25%);
background:linear-gradient(140deg,var(--orange),var(--orange-d));transition:transform .18s,filter .18s}
.badge:nth-child(even) .b-face{background:linear-gradient(140deg,var(--cyan),#12909c);color:#08282c}
.badge:hover .b-face{transform:translateY(-3px) rotate(-4deg);filter:brightness(1.1)}
.b-name{font-size:9px;letter-spacing:.08em;color:var(--muted)}
.badge.locked .b-face{background:linear-gradient(140deg,#3a434e,#2a313a);color:#697585}
.badge.locked{opacity:.55}
.badge.locked:hover{opacity:.8}
.timeline{position:relative;padding-left:18px}
.timeline::before{content:"";position:absolute;left:4px;top:6px;bottom:6px;width:1px;background:var(--line-2)}
.timeline li{position:relative;padding:0 0 16px 0}
.timeline li:last-child{padding-bottom:0}
.dot{position:absolute;left:-18px;top:6px;width:9px;height:9px;border-radius:50%;background:var(--orange);box-shadow:0 0 0 3px rgba(255,122,26,.16)}
.dot.cy{background:var(--cyan);box-shadow:0 0 0 3px rgba(34,200,216,.16)}
.timeline p{font-size:13px;color:var(--text-2)}
.timeline strong{color:var(--text);font-weight:600}
.timeline time{font-size:11px;color:var(--muted)}
.support .s-copy{font-size:13px;color:var(--text-2)}
.tipgrid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin:14px 0}
.tip{background:var(--card-2);border:1px solid var(--line-2);border-radius:var(--r-md);padding:10px 0;cursor:pointer;font-weight:600;font-size:14px;transition:border-color .16s,color .16s,background .16s}
.tip:hover{border-color:var(--orange);color:var(--orange)}
.tip.is-sel{background:var(--orange-soft);border-color:var(--orange);color:var(--orange)}
/* ---------- foot / tooltip / toast ---------- */
.foot{border-top:1px solid var(--line);padding:26px 0;background:var(--bg-2)}
.foot p{font-size:11px;color:var(--muted)}
.tooltip{position:fixed;z-index:70;max-width:220px;background:#0e1218;border:1px solid var(--line-2);color:var(--text-2);font-size:12px;padding:8px 11px;border-radius:var(--r-sm);box-shadow:var(--sh-2);pointer-events:none}
.toasts{position:fixed;right:18px;bottom:18px;z-index:80;display:flex;flex-direction:column;gap:10px}
.toast{background:var(--card-2);border:1px solid var(--line-2);border-left:3px solid var(--orange);color:var(--text);font-size:13px;padding:11px 16px;border-radius:var(--r-md);box-shadow:var(--sh-3);animation:slidein .24s cubic-bezier(.2,.8,.3,1) both}
.toast.out{animation:slideout .22s ease forwards}
.toast.cy{border-left-color:var(--cyan)}
@keyframes slidein{from{opacity:0;transform:translateX(20px)}to{opacity:1;transform:none}}
@keyframes slideout{to{opacity:0;transform:translateX(20px)}}
/* ---------- responsive ---------- */
@media (max-width:1040px){
.layout{grid-template-columns:1fr}
.col-side{position:static}
.badges{grid-template-columns:repeat(6,1fr)}
}
@media (max-width:820px){
.cover-in{grid-template-columns:auto 1fr;gap:16px}
.cover-actions{grid-column:1/-1}
.stats{grid-template-columns:repeat(2,1fr)}
.stats li:last-child{grid-column:1/-1}
}
@media (max-width:520px){
.wrap{width:calc(100% - 24px)}
.topnav{display:none}
.cover-band{height:150px}
.cover-in{grid-template-columns:1fr;margin-top:-52px}
.avatar-plate{width:96px;height:96px;border-radius:20px}
.dname{font-size:22px}
.stats{grid-template-columns:1fr 1fr}
.stats li{padding:14px 12px}
.s-val{font-size:18px}
.cover-actions{flex-wrap:wrap}
.btn{flex:1 1 auto;justify-content:center}
.btn-icon{flex:0 0 auto}
.tabs-head{gap:8px}
.tab{padding:10px 8px;font-size:13px}
.sortwrap{margin-left:0;width:100%}
.sel{width:100%}
.grid-models{grid-template-columns:1fr}
.make{grid-template-columns:1fr}
.make-thumb{height:120px}
.badges{grid-template-columns:repeat(3,1fr)}
.about{padding:18px}
.settings th{width:40%}
.settings td:last-child{display:none}
.date{margin-left:0}
}
@media (prefers-reduced-motion:reduce){
*{animation-duration:.01ms !important;transition-duration:.01ms !important}
}(function () {
"use strict";
/* ---------------- toast helper ---------------- */
var toastHost = document.getElementById("toasts");
function toast(msg, variant) {
var el = document.createElement("div");
el.className = "toast" + (variant ? " " + variant : "");
el.setAttribute("role", "status");
el.textContent = msg;
toastHost.appendChild(el);
setTimeout(function () {
el.classList.add("out");
setTimeout(function () { el.remove(); }, 240);
}, 2800);
}
var nf = new Intl.NumberFormat("en-US");
/* ---------------- follow toggle ---------------- */
var BASE_FOLLOWERS = 12408;
var followBtn = document.getElementById("followBtn");
var followLabel = document.getElementById("followLabel");
var followerCount = document.getElementById("followerCount");
var following = false;
function renderFollowers() {
followerCount.textContent = nf.format(BASE_FOLLOWERS + (following ? 1 : 0)) + " followers";
}
followBtn.addEventListener("click", function () {
following = !following;
followBtn.setAttribute("aria-pressed", String(following));
followLabel.textContent = following ? "Following" : "Follow";
followBtn.querySelector(".btn-ico").textContent = following ? "✓" : "+";
renderFollowers();
toast(following ? "Following nozzlecraft — new models will appear in your feed." : "Unfollowed nozzlecraft.", following ? "" : "cy");
});
renderFollowers();
/* ---------------- share ---------------- */
document.getElementById("shareBtn").addEventListener("click", function () {
var link = "spoolyard.example/@nozzlecraft";
if (navigator.clipboard && navigator.clipboard.writeText) {
navigator.clipboard.writeText(link).then(
function () { toast("Profile link copied: " + link, "cy"); },
function () { toast("Profile link: " + link, "cy"); }
);
} else {
toast("Profile link: " + link, "cy");
}
});
/* ---------------- tips ---------------- */
var tipAmount = 5;
var tipButtons = Array.prototype.slice.call(document.querySelectorAll(".tip"));
tipButtons.forEach(function (btn) {
btn.addEventListener("click", function () {
tipButtons.forEach(function (b) { b.classList.remove("is-sel"); b.removeAttribute("aria-pressed"); });
btn.classList.add("is-sel");
btn.setAttribute("aria-pressed", "true");
tipAmount = Number(btn.dataset.amt);
});
});
function sendTip() {
toast("Thanks! A €" + tipAmount + " tip is on its way to nozzlecraft.");
}
document.getElementById("tipSend").addEventListener("click", sendTip);
document.getElementById("tipBtn").addEventListener("click", function () {
document.querySelector(".support").scrollIntoView({ behavior: "smooth", block: "center" });
sendTip();
});
/* ---------------- tabs ---------------- */
var tabs = Array.prototype.slice.call(document.querySelectorAll(".tab"));
var sortWrap = document.getElementById("sortWrap");
function activate(tab, focus) {
tabs.forEach(function (t) {
var on = t === tab;
t.classList.toggle("is-active", on);
t.setAttribute("aria-selected", String(on));
t.tabIndex = on ? 0 : -1;
var pane = document.getElementById(t.getAttribute("aria-controls"));
pane.classList.toggle("is-active", on);
pane.hidden = !on;
});
sortWrap.style.visibility = tab.id === "tab-models" ? "visible" : "hidden";
if (focus) tab.focus();
}
tabs.forEach(function (tab, i) {
tab.addEventListener("click", function () { activate(tab); });
tab.addEventListener("keydown", function (e) {
var d = e.key === "ArrowRight" ? 1 : e.key === "ArrowLeft" ? -1 : 0;
if (d) {
e.preventDefault();
activate(tabs[(i + d + tabs.length) % tabs.length], true);
} else if (e.key === "Home") {
e.preventDefault(); activate(tabs[0], true);
} else if (e.key === "End") {
e.preventDefault(); activate(tabs[tabs.length - 1], true);
}
});
});
/* ---------------- sorting ---------------- */
var grid = document.getElementById("modelGrid");
var sortSel = document.getElementById("sortSel");
sortSel.addEventListener("change", function () {
var mode = sortSel.value;
var tiles = Array.prototype.slice.call(grid.children);
tiles.sort(function (a, b) {
if (mode === "recent") return Number(b.dataset.date) - Number(a.dataset.date);
if (mode === "downloads") return Number(b.dataset.dl) - Number(a.dataset.dl);
if (mode === "fastest") return Number(a.dataset.time) - Number(b.dataset.time);
return Number(b.dataset.pop) - Number(a.dataset.pop);
});
tiles.forEach(function (t) { grid.appendChild(t); });
toast("Sorted by " + sortSel.options[sortSel.selectedIndex].text.toLowerCase() + ".", "cy");
});
/* ---------------- likes ---------------- */
grid.addEventListener("click", function (e) {
var btn = e.target.closest(".like");
if (!btn) return;
var span = btn.querySelector("span");
var n = Number(span.textContent.replace(/,/g, ""));
var on = btn.getAttribute("aria-pressed") === "true";
btn.setAttribute("aria-pressed", String(!on));
span.textContent = nf.format(on ? n - 1 : n + 1);
if (!on) {
btn.animate(
[{ transform: "scale(1)" }, { transform: "scale(1.24)" }, { transform: "scale(1)" }],
{ duration: 280, easing: "cubic-bezier(.2,.8,.3,1)" }
);
}
});
/* ---------------- load more ---------------- */
var loadMore = document.getElementById("loadMore");
var loaded = false;
loadMore.addEventListener("click", function () {
if (loaded) { toast("You have reached the end of this maker's catalogue."); return; }
loaded = true;
loadMore.textContent = "Loading…";
setTimeout(function () {
var extras = [
["Tolerance Test Comb", "3,204", "21,880", "22m", 55, 20260410, 21880, 22],
["Magnetic Tool Wall Tiles", "5,610", "74,300", "3h 05m", 78, 20260318, 74300, 185],
["TPU Foot Damper Set", "1,987", "29,455", "55m", 61, 20260226, 29455, 55]
];
extras.forEach(function (x) {
var art = document.createElement("article");
art.className = "tile";
art.dataset.pop = x[4]; art.dataset.date = x[5]; art.dataset.dl = x[6]; art.dataset.time = x[7];
art.innerHTML =
'<div class="render"><svg viewBox="0 0 200 140" aria-hidden="true"><g transform="translate(100 76)">' +
'<path d="M0-32 46-6 0 20-46-6z" fill="#22c8d8" opacity=".18"/>' +
'<path d="M-46-6 0 20v20L-46 14z" fill="#ff7a1a" opacity=".5"/>' +
'<path d="M46-6 0 20v20L46 14z" fill="#ff7a1a" opacity=".8"/>' +
'<path d="M0-32 46-6 0 20-46-6z" fill="none" stroke="#22c8d8" stroke-width="1.4"/>' +
'</g></svg><span class="badge-time mono">' + x[3] + "</span></div>" +
'<div class="tile-body"><h3>' + x[0] + '</h3><p class="tile-sub mono">STL · 3MF</p>' +
'<div class="tile-stats mono"><button class="like" aria-pressed="false" aria-label="Like ' + x[0] + '">♥ <span>' + x[1] + "</span></button>" +
"<span>↓ " + x[2] + "</span></div></div>";
grid.appendChild(art);
});
loadMore.textContent = "That's everything for now";
toast("Loaded 3 more models (" + grid.children.length + " shown).", "cy");
}, 520);
});
/* ---------------- badge tooltips ---------------- */
var tip = document.getElementById("tooltip");
function showTip(el) {
tip.textContent = el.dataset.tip;
tip.hidden = false;
var r = el.getBoundingClientRect();
var t = tip.getBoundingClientRect();
var left = Math.min(Math.max(8, r.left + r.width / 2 - t.width / 2), window.innerWidth - t.width - 8);
var top = r.top - t.height - 10;
if (top < 8) top = r.bottom + 10;
tip.style.left = left + "px";
tip.style.top = top + "px";
}
function hideTip() { tip.hidden = true; }
document.querySelectorAll(".badge").forEach(function (b) {
b.addEventListener("mouseenter", function () { showTip(b); });
b.addEventListener("mouseleave", hideTip);
b.addEventListener("focus", function () { showTip(b); });
b.addEventListener("blur", hideTip);
b.addEventListener("click", function () { toast(b.dataset.tip, b.classList.contains("locked") ? "cy" : ""); });
});
window.addEventListener("scroll", hideTip, { passive: true });
/* ---------------- reveal on scroll ---------------- */
if ("IntersectionObserver" in window && !window.matchMedia("(prefers-reduced-motion: reduce)").matches) {
var io = new IntersectionObserver(function (entries) {
entries.forEach(function (en) {
if (!en.isIntersecting) return;
en.target.animate(
[{ opacity: 0, transform: "translateY(12px)" }, { opacity: 1, transform: "none" }],
{ duration: 380, easing: "cubic-bezier(.2,.8,.3,1)", fill: "both" }
);
io.unobserve(en.target);
});
}, { threshold: 0.12 });
document.querySelectorAll(".tile, .make, .folder, .card").forEach(function (el) { io.observe(el); });
}
})();<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>nozzlecraft — SPOOLYARD Maker Profile</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 profile content</a>
<header class="topbar">
<div class="wrap topbar-in">
<a class="brand" href="#main" aria-label="SPOOLYARD home">
<span class="brand-mark" aria-hidden="true">
<svg viewBox="0 0 32 32" width="26" height="26">
<defs>
<linearGradient id="bm" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#ff7a1a"/><stop offset="1" stop-color="#22c8d8"/>
</linearGradient>
</defs>
<path d="M16 2 29 9.5v13L16 30 3 22.5v-13z" fill="none" stroke="url(#bm)" stroke-width="2.2" stroke-linejoin="round"/>
<path d="M16 9.5 23 13.5v8L16 25.5 9 21.5v-8z" fill="none" stroke="#ff7a1a" stroke-width="1.6" stroke-linejoin="round" opacity=".8"/>
<circle cx="16" cy="17.5" r="2.4" fill="#22c8d8"/>
</svg>
</span>
<span class="brand-name">SPOOLYARD</span>
</a>
<nav class="topnav" aria-label="Primary">
<a href="#main">Models</a>
<a href="#main">Contests</a>
<a href="#main">Makers</a>
</nav>
<span class="pill mono" aria-hidden="true">v2.4 · community build</span>
</div>
</header>
<main id="main">
<!-- COVER -->
<section class="cover" aria-label="Profile header">
<div class="cover-band" aria-hidden="true">
<span class="cover-blob b1"></span>
<span class="cover-blob b2"></span>
<span class="cover-mesh"></span>
</div>
<div class="wrap cover-in">
<div class="avatar-plate">
<svg viewBox="0 0 120 120" role="img" aria-label="Isometric nozzle avatar">
<defs>
<linearGradient id="av" x1="0" y1="0" x2="1" y2="1">
<stop offset="0" stop-color="#ff7a1a"/><stop offset="1" stop-color="#c9410a"/>
</linearGradient>
</defs>
<rect width="120" height="120" rx="20" fill="#12171e"/>
<g transform="translate(60 64)">
<path d="M0-34 34-14 0 6-34-14z" fill="#22c8d8" opacity=".22"/>
<path d="M-34-14 0 6v30L-34 16z" fill="url(#av)" opacity=".65"/>
<path d="M34-14 0 6v30L34 16z" fill="#ff7a1a" opacity=".85"/>
<path d="M0-34 34-14 0 6-34-14z" fill="none" stroke="#22c8d8" stroke-width="1.6"/>
</g>
</svg>
<span class="online" title="Active today" aria-label="Active today"></span>
</div>
<div class="ident">
<h1 class="dname">nozzlecraft <span class="verified" title="Verified designer" aria-label="Verified designer">✔</span></h1>
<p class="handle mono">@nozzlecraft · she/they</p>
<p class="meta">
<span>📍 Ghent, Belgium</span>
<span aria-hidden="true">·</span>
<span>Joined <time datetime="2021-03-11">March 2021</time></span>
<span aria-hidden="true">·</span>
<span class="mono" id="followerCount">12,408 followers</span>
</p>
<p class="tagline">Functional prints, printer upgrades and absurdly over-engineered cable clips.</p>
</div>
<div class="cover-actions">
<button class="btn btn-primary" id="followBtn" aria-pressed="false">
<span class="btn-ico" aria-hidden="true">+</span><span id="followLabel">Follow</span>
</button>
<button class="btn btn-ghost" id="tipBtn">☕ Support</button>
<button class="btn btn-icon" id="shareBtn" aria-label="Copy profile link" title="Copy profile link">🔗</button>
</div>
</div>
</section>
<!-- STATS -->
<section class="wrap" aria-label="Profile statistics">
<ul class="stats">
<li><span class="s-val mono">148</span><span class="s-key">models published</span></li>
<li><span class="s-val mono">1.92M</span><span class="s-key">total downloads</span></li>
<li><span class="s-val mono">86,430</span><span class="s-key">likes received</span></li>
<li><span class="s-val mono">5,271</span><span class="s-key">makes by others</span></li>
<li><span class="s-val mono">312,900</span><span class="s-key">community points</span></li>
</ul>
</section>
<div class="wrap layout">
<!-- LEFT COLUMN -->
<div class="col-main">
<div class="tabs-head">
<div class="tabs" role="tablist" aria-label="Profile sections">
<button class="tab is-active" role="tab" id="tab-models" aria-controls="pane-models" aria-selected="true">Models <span class="mono count">148</span></button>
<button class="tab" role="tab" id="tab-makes" aria-controls="pane-makes" aria-selected="false" tabindex="-1">Makes <span class="mono count">63</span></button>
<button class="tab" role="tab" id="tab-collections" aria-controls="pane-collections" aria-selected="false" tabindex="-1">Collections <span class="mono count">9</span></button>
<button class="tab" role="tab" id="tab-about" aria-controls="pane-about" aria-selected="false" tabindex="-1">About</button>
</div>
<label class="sortwrap" id="sortWrap">
<span class="sr-only">Sort models</span>
<select id="sortSel" class="sel mono">
<option value="popular">Most popular</option>
<option value="recent">Newest first</option>
<option value="downloads">Most downloaded</option>
<option value="fastest">Fastest to print</option>
</select>
</label>
</div>
<!-- MODELS -->
<section class="pane is-active" id="pane-models" role="tabpanel" aria-labelledby="tab-models">
<div class="grid-models" id="modelGrid">
<article class="tile" data-pop="98" data-date="20260714" data-dl="184200" data-time="132">
<div class="render" data-plate="hex">
<svg viewBox="0 0 200 140" aria-hidden="true">
<g transform="translate(100 78)">
<path d="M0-42 52-12 0 18-52-12z" fill="#22c8d8" opacity=".18"/>
<path d="M-52-12 0 18v26L-52 14z" fill="#ff7a1a" opacity=".55"/>
<path d="M52-12 0 18v26L52 14z" fill="#ff7a1a" opacity=".85"/>
<path d="M0-42 52-12 0 18-52-12z" fill="none" stroke="#22c8d8" stroke-width="1.4"/>
<path d="M-26-27 26 3M26-27-26 3" stroke="#0f1319" stroke-width="1.2" opacity=".5"/>
</g>
</svg>
<span class="badge-time mono">2h 12m</span>
</div>
<div class="tile-body">
<h3>Hexcell Modular Wall Rack</h3>
<p class="tile-sub mono">STL · 3MF · STEP</p>
<div class="tile-stats mono">
<button class="like" aria-pressed="false" aria-label="Like Hexcell Modular Wall Rack">♥ <span>9,241</span></button>
<span>↓ 184,200</span>
</div>
</div>
</article>
<article class="tile" data-pop="92" data-date="20260628" data-dl="97140" data-time="48">
<div class="render" data-plate="clip">
<svg viewBox="0 0 200 140" aria-hidden="true">
<g transform="translate(100 76)">
<path d="M0-34 46-8 0 18-46-8z" fill="#22c8d8" opacity=".16"/>
<path d="M-46-8 0 18v20L-46 12z" fill="#22c8d8" opacity=".5"/>
<path d="M46-8 0 18v20L46 12z" fill="#22c8d8" opacity=".8"/>
<circle cx="0" cy="-8" r="11" fill="#151a21"/>
<path d="M0-34 46-8 0 18-46-8z" fill="none" stroke="#ff7a1a" stroke-width="1.4"/>
</g>
</svg>
<span class="badge-time mono">48m</span>
</div>
<div class="tile-body">
<h3>Snapfit Cable Clip Family</h3>
<p class="tile-sub mono">STL · 3MF</p>
<div class="tile-stats mono">
<button class="like" aria-pressed="false" aria-label="Like Snapfit Cable Clip Family">♥ <span>6,802</span></button>
<span>↓ 97,140</span>
</div>
</div>
</article>
<article class="tile" data-pop="88" data-date="20260719" data-dl="52380" data-time="410">
<div class="render" data-plate="gear">
<svg viewBox="0 0 200 140" aria-hidden="true">
<g transform="translate(100 76)">
<path d="M0-36 48-10 0 16-48-10z" fill="#ff7a1a" opacity=".2"/>
<path d="M-48-10 0 16v22L-48 12z" fill="#ff7a1a" opacity=".5"/>
<path d="M48-10 0 16v22L48 12z" fill="#ff7a1a" opacity=".8"/>
<g stroke="#22c8d8" stroke-width="1.5" fill="none">
<ellipse cx="0" cy="-10" rx="26" ry="14"/>
<ellipse cx="0" cy="-10" rx="10" ry="5.4"/>
</g>
</g>
</svg>
<span class="badge-time mono">6h 50m</span>
</div>
<div class="tile-body">
<h3>Cycloidal Reducer Demo Kit</h3>
<p class="tile-sub mono">STL · STEP · F3D</p>
<div class="tile-stats mono">
<button class="like" aria-pressed="false" aria-label="Like Cycloidal Reducer Demo Kit">♥ <span>11,905</span></button>
<span>↓ 52,380</span>
</div>
</div>
</article>
<article class="tile" data-pop="74" data-date="20260602" data-dl="66910" data-time="95">
<div class="render" data-plate="box">
<svg viewBox="0 0 200 140" aria-hidden="true">
<g transform="translate(100 76)">
<path d="M0-30 50-2 0 26-50-2z" fill="#22c8d8" opacity=".16"/>
<path d="M-50-2 0 26v18L-50 16z" fill="#ff7a1a" opacity=".4"/>
<path d="M50-2 0 26v18L50 16z" fill="#ff7a1a" opacity=".7"/>
<path d="M-26-16 24-16M-34-9 32-9" stroke="#22c8d8" stroke-width="1.3" opacity=".7"/>
<path d="M0-30 50-2 0 26-50-2z" fill="none" stroke="#22c8d8" stroke-width="1.4"/>
</g>
</svg>
<span class="badge-time mono">1h 35m</span>
</div>
<div class="tile-body">
<h3>Gridded Drawer Insert Set</h3>
<p class="tile-sub mono">STL · 3MF</p>
<div class="tile-stats mono">
<button class="like" aria-pressed="false" aria-label="Like Gridded Drawer Insert Set">♥ <span>4,118</span></button>
<span>↓ 66,910</span>
</div>
</div>
</article>
<article class="tile" data-pop="81" data-date="20260521" data-dl="120440" data-time="255">
<div class="render" data-plate="lamp">
<svg viewBox="0 0 200 140" aria-hidden="true">
<g transform="translate(100 78)">
<path d="M0-40 40-16 0 8-40-16z" fill="#ff7a1a" opacity=".25"/>
<path d="M-40-16 0 8v28L-40 12z" fill="#22c8d8" opacity=".45"/>
<path d="M40-16 0 8v28L40 12z" fill="#22c8d8" opacity=".7"/>
<path d="M-20-28 20-28M-30-22 30-22M-10-34 10-34" stroke="#ff7a1a" stroke-width="1.4" opacity=".8"/>
</g>
</svg>
<span class="badge-time mono">4h 15m</span>
</div>
<div class="tile-body">
<h3>Vase-Mode Ribbed Lantern</h3>
<p class="tile-sub mono">3MF · profile included</p>
<div class="tile-stats mono">
<button class="like" aria-pressed="false" aria-label="Like Vase-Mode Ribbed Lantern">♥ <span>7,530</span></button>
<span>↓ 120,440</span>
</div>
</div>
</article>
<article class="tile" data-pop="69" data-date="20260430" data-dl="38220" data-time="70">
<div class="render" data-plate="tool">
<svg viewBox="0 0 200 140" aria-hidden="true">
<g transform="translate(100 76)">
<path d="M0-32 46-6 0 20-46-6z" fill="#22c8d8" opacity=".14"/>
<path d="M-46-6 0 20v20L-46 14z" fill="#ff7a1a" opacity=".45"/>
<path d="M46-6 0 20v20L46 14z" fill="#ff7a1a" opacity=".75"/>
<path d="M-18-14 18-14 8-2-8-2z" fill="#151a21" stroke="#22c8d8" stroke-width="1.3"/>
</g>
</svg>
<span class="badge-time mono">1h 10m</span>
</div>
<div class="tile-body">
<h3>Bed-Level Probe Jig v3</h3>
<p class="tile-sub mono">STL · STEP</p>
<div class="tile-stats mono">
<button class="like" aria-pressed="false" aria-label="Like Bed-Level Probe Jig v3">♥ <span>2,946</span></button>
<span>↓ 38,220</span>
</div>
</div>
</article>
</div>
<button class="loadmore" id="loadMore">Load 12 more models</button>
</section>
<!-- MAKES -->
<section class="pane" id="pane-makes" role="tabpanel" aria-labelledby="tab-makes" hidden>
<div class="makes">
<article class="make">
<div class="make-thumb" aria-hidden="true">
<svg viewBox="0 0 120 100"><g transform="translate(60 56)">
<path d="M0-30 40-6 0 18-40-6z" fill="#22c8d8" opacity=".2"/>
<path d="M-40-6 0 18v20L-40 14z" fill="#ff7a1a" opacity=".5"/>
<path d="M40-6 0 18v20L40 14z" fill="#ff7a1a" opacity=".8"/></g></svg>
</div>
<div class="make-body">
<h3>Desk Riser Bracket — printed in PETG-CF</h3>
<p class="make-note">Scaled to 108% and swapped to a 0.6 nozzle. Zero warping on a cold plate with a brim of 6 lines.</p>
<div class="make-foot">
<span class="credit">Design by <strong>hexforge_ana</strong></span>
<span class="chip mono">PETG-CF</span>
<span class="chip mono">0.6 nozzle</span>
<span class="date mono">12 Jul 2026</span>
</div>
</div>
</article>
<article class="make">
<div class="make-thumb" aria-hidden="true">
<svg viewBox="0 0 120 100"><g transform="translate(60 56)">
<path d="M0-28 38-6 0 16-38-6z" fill="#ff7a1a" opacity=".25"/>
<path d="M-38-6 0 16v18L-38 12z" fill="#22c8d8" opacity=".5"/>
<path d="M38-6 0 16v18L38 12z" fill="#22c8d8" opacity=".8"/></g></svg>
</div>
<div class="make-body">
<h3>Articulated Desk Dragon</h3>
<p class="make-note">Printed supportless in dual-tone silk. Print-in-place joints needed 0.22 mm clearance on this machine.</p>
<div class="make-foot">
<span class="credit">Design by <strong>mira_prints</strong></span>
<span class="chip mono">Silk PLA</span>
<span class="chip mono">0.16 mm</span>
<span class="date mono">30 Jun 2026</span>
</div>
</div>
</article>
<article class="make">
<div class="make-thumb" aria-hidden="true">
<svg viewBox="0 0 120 100"><g transform="translate(60 56)">
<path d="M0-26 36-4 0 18-36-4z" fill="#22c8d8" opacity=".2"/>
<path d="M-36-4 0 18v16L-36 10z" fill="#ff7a1a" opacity=".45"/>
<path d="M36-4 0 18v16L36 10z" fill="#ff7a1a" opacity=".75"/></g></svg>
</div>
<div class="make-body">
<h3>Filament Dry Box Lid Port</h3>
<p class="make-note">Remixed the grommet to fit 4 mm PTFE. Added a captive-nut pocket so the fitting stays put.</p>
<div class="make-foot">
<span class="credit">Design by <strong>tundra_lab</strong></span>
<span class="chip mono">ASA</span>
<span class="chip mono">enclosed</span>
<span class="date mono">18 Jun 2026</span>
</div>
</div>
</article>
</div>
</section>
<!-- COLLECTIONS -->
<section class="pane" id="pane-collections" role="tabpanel" aria-labelledby="tab-collections" hidden>
<div class="folders">
<a class="folder" href="#pane-collections"><span class="f-ico" aria-hidden="true"></span><h3>Printer Upgrades</h3><p class="mono">32 models · 411k downloads</p></a>
<a class="folder" href="#pane-collections"><span class="f-ico alt" aria-hidden="true"></span><h3>Workshop Organisation</h3><p class="mono">27 models · 288k downloads</p></a>
<a class="folder" href="#pane-collections"><span class="f-ico" aria-hidden="true"></span><h3>Mechanism Studies</h3><p class="mono">18 models · 96k downloads</p></a>
<a class="folder" href="#pane-collections"><span class="f-ico alt" aria-hidden="true"></span><h3>Vase Mode Only</h3><p class="mono">21 models · 173k downloads</p></a>
<a class="folder" href="#pane-collections"><span class="f-ico" aria-hidden="true"></span><h3>Bench Test Prints</h3><p class="mono">14 models · 62k downloads</p></a>
<a class="folder" href="#pane-collections"><span class="f-ico alt" aria-hidden="true"></span><h3>Garden & Outdoor</h3><p class="mono">11 models · 44k downloads</p></a>
</div>
</section>
<!-- ABOUT -->
<section class="pane" id="pane-about" role="tabpanel" aria-labelledby="tab-about" hidden>
<div class="about">
<h2>About</h2>
<p>I design parts that earn their filament. Most of what I publish started as something broken in my own workshop — a bracket that snapped, a drawer that swallowed screwdrivers, a printer that needed one more sensor mount than the vendor shipped.</p>
<p>Every model is released with a printed-and-verified profile, tolerance notes and, where it matters, the parametric source file. If a part needs a specific clearance to work, that number is in the description, not hidden in a comment thread.</p>
<h3>Printers owned</h3>
<div class="printers">
<div class="printer">
<span class="p-tag mono">CORE-XY</span>
<h4>Meridian X1 Carbon-Frame</h4>
<dl class="mono">
<div><dt>Nozzle</dt><dd>0.4 mm hardened</dd></div>
<div><dt>Volume</dt><dd>256 × 256 × 256</dd></div>
<div><dt>Materials</dt><dd>PLA · PETG · ABS · CF</dd></div>
</dl>
</div>
<div class="printer">
<span class="p-tag mono">BEDSLINGER</span>
<h4>Trellis 300 Mk4</h4>
<dl class="mono">
<div><dt>Nozzle</dt><dd>0.6 mm brass</dd></div>
<div><dt>Volume</dt><dd>300 × 300 × 340</dd></div>
<div><dt>Materials</dt><dd>PLA · PETG · TPU</dd></div>
</dl>
</div>
<div class="printer">
<span class="p-tag mono">RESIN</span>
<h4>Lumen 8K Mono</h4>
<dl class="mono">
<div><dt>Layer</dt><dd>0.03 mm</dd></div>
<div><dt>Volume</dt><dd>218 × 123 × 230</dd></div>
<div><dt>Materials</dt><dd>Standard · ABS-like</dd></div>
</dl>
</div>
</div>
<h3>Preferred slicer settings</h3>
<table class="settings mono">
<caption class="sr-only">Default slicer profile used for published models</caption>
<tbody>
<tr><th scope="row">Layer height</th><td>0.20 mm</td><td>0.16 mm for visual parts</td></tr>
<tr><th scope="row">Walls</th><td>4 perimeters</td><td>5 on load-bearing parts</td></tr>
<tr><th scope="row">Infill</th><td>25% gyroid</td><td>40% cubic for brackets</td></tr>
<tr><th scope="row">Speed</th><td>180 mm/s</td><td>60 mm/s outer wall</td></tr>
<tr><th scope="row">Temps</th><td>215 / 60 °C</td><td>PLA, 2 h dried</td></tr>
<tr><th scope="row">Seam</th><td>Rear aligned</td><td>Scarf joint on curves</td></tr>
</tbody>
</table>
</div>
</section>
</div>
<!-- RIGHT RAIL -->
<aside class="col-side" aria-label="Achievements and activity">
<section class="card">
<h2 class="card-h">Achievements</h2>
<ul class="badges" id="badgeRail">
<li><button class="badge" data-tip="Published 100+ models with verified print profiles."><span class="b-face">100</span><span class="b-name mono">CENTURION</span></button></li>
<li><button class="badge" data-tip="A model of yours crossed one million downloads."><span class="b-face">1M</span><span class="b-name mono">MILLION</span></button></li>
<li><button class="badge" data-tip="Answered 500 questions in model comment threads."><span class="b-face">?</span><span class="b-name mono">HELPER</span></button></li>
<li><button class="badge" data-tip="Won a monthly community design contest."><span class="b-face">★</span><span class="b-name mono">WINNER</span></button></li>
<li><button class="badge locked" data-tip="Locked — publish a model in 12 consecutive months."><span class="b-face">12</span><span class="b-name mono">STREAK</span></button></li>
<li><button class="badge locked" data-tip="Locked — receive 10,000 makes from other printers."><span class="b-face">10K</span><span class="b-name mono">FORGE</span></button></li>
</ul>
</section>
<section class="card">
<h2 class="card-h">Recent activity</h2>
<ol class="timeline">
<li><span class="dot" aria-hidden="true"></span><p><strong>Published</strong> Hexcell Modular Wall Rack</p><time class="mono" datetime="2026-07-14">14 Jul</time></li>
<li><span class="dot cy" aria-hidden="true"></span><p><strong>Made</strong> Desk Riser Bracket by hexforge_ana</p><time class="mono" datetime="2026-07-12">12 Jul</time></li>
<li><span class="dot" aria-hidden="true"></span><p><strong>Updated</strong> Cycloidal Reducer Demo Kit to v1.4</p><time class="mono" datetime="2026-07-08">08 Jul</time></li>
<li><span class="dot cy" aria-hidden="true"></span><p><strong>Earned</strong> the WINNER badge — July contest</p><time class="mono" datetime="2026-07-02">02 Jul</time></li>
<li><span class="dot" aria-hidden="true"></span><p><strong>Commented</strong> on Filament Dry Box Lid Port</p><time class="mono" datetime="2026-06-27">27 Jun</time></li>
</ol>
</section>
<section class="card support">
<h2 class="card-h">Support this maker</h2>
<p class="s-copy">Every model here is free. Tips keep the test prints coming.</p>
<div class="tipgrid" role="group" aria-label="Tip amount">
<button class="tip" data-amt="3">€3</button>
<button class="tip is-sel" data-amt="5" aria-pressed="true">€5</button>
<button class="tip" data-amt="12">€12</button>
</div>
<button class="btn btn-primary w-full" id="tipSend">Send tip</button>
</section>
</aside>
</div>
</main>
<footer class="foot">
<div class="wrap">
<p class="mono">SPOOLYARD · fictional community platform · all makers and models are invented for demonstration</p>
</div>
</footer>
<div class="tooltip" id="tooltip" role="tooltip" hidden></div>
<div class="toasts" id="toasts" aria-live="polite" aria-atomic="false"></div>
<script src="script.js"></script>
</body>
</html>Maker Profile
SPOOLYARD is an invented 3D-model community, and this is the public profile of one of its designers, nozzlecraft. The page opens with a gradient cover band — blurred orange and cyan blobs behind a masked mesh grid — with an isometric SVG avatar plate overlapping its lower edge. Identity, location, join date and live follower count sit beside it, next to a follow toggle, a support button and a copy-link action. Directly beneath, a five-cell stat strip reports models published, downloads, likes, makes by others and community points in JetBrains Mono, so the numbers read as instrumentation rather than marketing.
The body is a tab set. Models is a responsive grid of isometric render tiles on radial-gradient plates, each with a print-time badge, a download count and a like button that increments and pulses on press; a sort select reorders the grid by popularity, date, downloads or print time, and a load-more button appends three further tiles. Makes lists prints this designer made from other people’s models, each carrying a credit chip back to the original designer plus material and layer chips. Collections shows folder cards with model and download counts, and About holds bio prose, three printer spec cards with mono definition lists, and a preferred-slicer-settings table.
The right rail is sticky. Achievement medallions are hexagonal clip-path shapes that tilt on hover and expose a positioned tooltip explaining exactly how each one was earned — locked badges are dimmed and greyed but still keyboard-reachable and still explain their unlock condition. Below them a dotted activity timeline lists recent publishes, makes and badge unlocks, and a tip card lets you pick an amount and fire a toast. Tabs support arrow, Home and End keys, focus is always visible, and everything collapses to a single column below 520px.
How this look is built
The layout is written in the spirit of maker-community profile pages like Printables, but every technique here is modern CSS rather than the float-and-sprite approach those layouts once required. A single two-column grid with position:sticky on the rail replaces the old sidebar-clone hacks; grid-template-columns:repeat(auto-fill,minmax(240px,1fr)) makes the model grid reflow without a single breakpoint; the cover texture is pure layered radial-gradient plus a repeating linear-gradient mesh faded out with mask-image, so there are no image requests at all; every render plate is inline SVG, which stays crisp at any density and can be recoloured with the same custom properties as the rest of the page. Badge medallions use clip-path instead of PNG sprites, panes swap by toggling hidden on real role="tabpanel" elements so the tab set is accessible by default, and entrance animation is delegated to IntersectionObserver + the Web Animations API — no scroll-event thrash, and the whole thing is short-circuited by a prefers-reduced-motion check.
Illustrative UI only — always follow real safety guidance when working with tools, electronics, or repairs.