<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Minecraft Auto Clicker — Free Jitter, Butterfly &amp; CPS Test for PVP</title>
<meta name="description" content="Free Minecraft auto clicker for Windows. Jitter clicking, butterfly clicking and a built-in CPS test for Hypixel BedWars &amp; PVP. Lightweight, open-source, no ads, free installer.">
<meta name="theme-color" content="#0B1019">
<link rel="canonical" href="https://minecraftautoclicker.com/">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='8' fill='%230E1420'/%3E%3Cpath d='M16 6l8 4.4v8.8L16 24l-8-4.8v-8.8z' fill='none' stroke='%238A8FFF' stroke-width='2' stroke-linejoin='round'/%3E%3Cpath d='M8 10.4l8 4.4 8-4.4M16 14.8V24' stroke='%2334D399' stroke-width='1.6' stroke-linejoin='round' opacity='.9'/%3E%3C/svg%3E">
<meta property="og:type" content="website">
<meta property="og:site_name" content="Minecraft Auto Clicker">
<meta property="og:title" content="Minecraft Auto Clicker — Free Jitter, Butterfly & CPS Test">
<meta property="og:description" content="Free open-source Minecraft auto clicker for Windows. Jitter & butterfly clicking, built-in CPS test. No ads, free installer.">
<meta property="og:url" content="https://minecraftautoclicker.com/">
<meta property="og:image" content="https://minecraftautoclicker.com/hero.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Minecraft Auto Clicker — Free Jitter, Butterfly & CPS Test">
<meta name="twitter:description" content="Free open-source Minecraft auto clicker for Windows. Jitter & butterfly clicking, built-in CPS test.">
<meta name="twitter:image" content="https://minecraftautoclicker.com/hero.png">

<script type="application/ld+json">
{"@context":"https://schema.org","@type":"SoftwareApplication","name":"Minecraft Auto Clicker Pro","url":"https://minecraftautoclicker.com/","operatingSystem":"Windows 10, Windows 11","applicationCategory":"GameApplication","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"aggregateRating":{"@type":"AggregateRating","ratingValue":"4.8","ratingCount":"216"},"description":"Free open-source Minecraft auto clicker for Windows with jitter clicking, butterfly clicking and a built-in CPS test.","downloadUrl":"#/releases/latest"}
</script>
<script type="application/ld+json">
{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[
{"@type":"Question","name":"Is this Minecraft auto clicker free?","acceptedAnswer":{"@type":"Answer","text":"Yes. It is 100% free and open-source under the MIT license. No ads, no paywall, no telemetry."}},
{"@type":"Question","name":"Will it get me banned on Hypixel?","acceptedAnswer":{"@type":"Answer","text":"Auto clicking can violate the rules of some servers. Use it for practice, single-player and servers that allow it. It does not bypass any anti-cheat and does not inject into the game."}},
{"@type":"Question","name":"What is the difference between jitter and butterfly clicking?","acceptedAnswer":{"@type":"Answer","text":"Jitter clicking fires one rapid, humanized stream of clicks. Butterfly clicking alternates two finger streams for a higher, steadier CPS."}},
{"@type":"Question","name":"How do I test my CPS?","acceptedAnswer":{"@type":"Answer","text":"Use the built-in CPS test on this page or inside the app: pick a duration, click as fast as you can, and read your clicks-per-second and peak."}}
]}
</script>

<style>
@font-face{font-family:'Syne';font-weight:700;font-display:swap;src:url(/fonts/syne-700.woff2) format('woff2')}
@font-face{font-family:'Syne';font-weight:800;font-display:swap;src:url(/fonts/syne-800.woff2) format('woff2')}
@font-face{font-family:'Sora';font-weight:400;font-display:swap;src:url(/fonts/sora-400.woff2) format('woff2')}
@font-face{font-family:'Sora';font-weight:600;font-display:swap;src:url(/fonts/sora-600.woff2) format('woff2')}

:root{
  --bg:#0B1019; --bg-2:#0E1420; --panel:#131A28; --panel-2:#161E30;
  --line:rgba(124,131,255,.14); --line-strong:rgba(124,131,255,.28);
  --ink:#E9EDF7; --body:#A6B0C6; --muted:#6B7488;
  --indigo:#7C83FF; --indigo-2:#8A8FFF; --emerald:#34D399; --amber:#F6C453;
  --display:"Syne","SF Pro Display","Segoe UI",system-ui,-apple-system,sans-serif;
  --text:"Sora",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;
  --mono:"SF Mono","JetBrains Mono","Cascadia Code",ui-monospace,Menlo,Consolas,monospace;
  --maxw:1120px; --r:16px; --r-lg:22px;
}
*{box-sizing:border-box}
html{scroll-behavior:smooth}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
body{margin:0;background:var(--bg)}
.mc-root{
  margin:0; color:var(--body); font-family:var(--text); line-height:1.6; -webkit-font-smoothing:antialiased;
  position:relative;
}
.page{ position:relative; z-index:1;
  /* translucent scrim so the fixed Minecraft scene stays visible behind the content while scrolling */
  background:linear-gradient(180deg, rgba(11,16,25,.52), rgba(12,15,24,.7) 38%, rgba(11,16,25,.74));
}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 22px}
h1,h2,h3{font-family:var(--display);color:var(--ink);margin:0;font-weight:800;letter-spacing:-.02em;text-wrap:balance}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}

/* ---------- nav ---------- */
.nav{position:sticky;top:0;z-index:40;backdrop-filter:blur(14px);
  background:linear-gradient(180deg,rgba(11,16,25,.86),rgba(11,16,25,.5));
  border-bottom:1px solid var(--line)}
.nav-in{display:flex;align-items:center;justify-content:space-between;height:66px}
.brand{display:flex;align-items:center;gap:11px;font-family:var(--display);font-weight:800;color:var(--ink);letter-spacing:-.02em;font-size:17px}
.brand svg{width:30px;height:30px;filter:drop-shadow(0 4px 14px rgba(124,131,255,.5))}
.nav-links{display:flex;align-items:center;gap:28px}
.nav-links a{color:var(--body);font-size:14.5px}
.nav-links a:hover{color:var(--ink)}
.nav-dl{display:inline-flex;align-items:center;gap:8px;font-family:var(--display);font-weight:700;font-size:14px;
  color:#0a0e18;background:linear-gradient(180deg,var(--indigo-2),var(--indigo));
  padding:10px 18px;border-radius:11px;box-shadow:0 10px 30px -10px rgba(124,131,255,.7)}
.nav-dl:hover{filter:brightness(1.07)}
.nav-dl svg{width:16px;height:16px}
@media (max-width:820px){.nav-links a:not(.nav-dl){display:none}}

/* ---------- buttons ---------- */
.btn{display:inline-flex;align-items:center;gap:12px;font-family:var(--display);font-weight:700;letter-spacing:-.01em;
  border-radius:14px;border:1px solid transparent;cursor:pointer;transition:.18s;text-align:center}
.btn:active{transform:translateY(1px)}
.btn-primary{color:#0a0e18;background:linear-gradient(180deg,var(--indigo-2),var(--indigo));
  box-shadow:0 14px 40px -10px rgba(124,131,255,.6),0 0 0 1px rgba(146,152,255,.4) inset}
.btn-primary:hover{filter:brightness(1.07);box-shadow:0 16px 46px -8px rgba(124,131,255,.7),0 0 0 1px rgba(146,152,255,.5) inset}
@keyframes dlpulse{0%,100%{box-shadow:0 14px 40px -10px rgba(124,131,255,.55),0 0 0 1px rgba(146,152,255,.4) inset}
  50%{box-shadow:0 18px 52px -8px rgba(124,131,255,.85),0 0 0 1px rgba(146,152,255,.6) inset}}
.btn-primary{animation:dlpulse 1.9s ease-in-out infinite}
.btn-primary:hover{animation-play-state:paused}
.btn-ghost{color:var(--ink);background:rgba(148,160,190,.05);border-color:var(--line-strong)}
.btn-ghost:hover{border-color:var(--indigo);background:rgba(124,131,255,.09)}
.btn svg{width:22px;height:22px}
.hero-actions .btn{padding:16px 26px;font-size:17px;border-radius:13px}
.hero-actions .btn-primary{padding:16px 30px;font-size:18px;font-weight:800}
.hero-actions .btn svg{width:20px;height:20px}
@media(min-width:900px){.hero .hero-actions{flex-wrap:nowrap}}
@media (max-width:520px){.hero-actions .btn{width:100%;justify-content:center;padding:19px 26px;font-size:18px}}

/* ---------- hero ---------- */
.hero{position:relative;z-index:1;min-height:82vh;display:flex;align-items:center;padding:120px 0 60px;overflow:hidden}
.scene-bg{position:fixed;inset:0;z-index:0;pointer-events:none;overflow:hidden;background:#07090c}
.scene-video{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;transform:scale(1.08);will-change:transform}
.scene-veil{position:absolute;inset:0;background:
  linear-gradient(90deg,rgba(6,8,11,.94) 0%,rgba(6,8,11,.64) 33%,rgba(6,8,11,.24) 62%,rgba(6,8,11,.1) 100%),
  linear-gradient(180deg,rgba(6,8,11,.45),transparent 22%,transparent 64%,rgba(6,8,11,.6)),
  rgba(6,8,11,0.22)}
.aurora{position:absolute;z-index:0;border-radius:50%;filter:blur(72px);opacity:.6;will-change:transform;pointer-events:none}
.aurora.a1{width:620px;height:620px;top:-180px;right:-120px;background:radial-gradient(circle at 40% 40%,rgba(124,131,255,.5),transparent 62%)}
.aurora.a2{width:520px;height:520px;bottom:-220px;left:-140px;background:radial-gradient(circle at 50% 50%,rgba(52,211,153,.26),transparent 62%)}
.aurora.a3{width:400px;height:400px;top:26%;left:46%;background:radial-gradient(circle at 50% 50%,rgba(138,143,255,.28),transparent 60%);opacity:.4}
.hero-fade{position:absolute;left:0;right:0;bottom:0;height:180px;z-index:1;background:linear-gradient(180deg,transparent,var(--bg));pointer-events:none}
.hero-in{position:relative;z-index:2;width:100%}
.eyebrow{display:inline-flex;align-items:center;gap:9px;font-family:var(--mono);font-size:12.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--indigo-2);
  border:1px solid var(--line-strong);border-radius:999px;padding:8px 15px;background:rgba(124,131,255,.06)}
.eyebrow .dot{width:7px;height:7px;border-radius:50%;background:var(--emerald);box-shadow:0 0 10px var(--emerald)}
.hero h1{font-size:clamp(3.4rem,8.6vw,6.6rem);line-height:.92;font-weight:800;letter-spacing:-.03em;margin:26px 0 0;max-width:15ch;
  text-shadow:0 0 44px rgba(124,131,255,.30),0 6px 34px rgba(0,0,0,.55)}
.hero h1 .grad{background:linear-gradient(105deg,var(--indigo-2),#cfd2ff 28%,var(--emerald) 55%,#cfd2ff 82%,var(--indigo-2));
  background-size:220% auto;-webkit-background-clip:text;background-clip:text;color:transparent;
  animation:shimmer 6.5s linear infinite;filter:drop-shadow(0 0 22px rgba(124,131,255,.35))}
@keyframes shimmer{to{background-position:220% center}}
/* liquid (juice) headline overlay — canvas floats over the real h1 */
.jhead-canvas{position:absolute;left:0;top:0;display:none;pointer-events:none;z-index:3;filter:drop-shadow(0 8px 34px rgba(0,0,0,.5))}
.jhead-canvas.on{display:block}
.hero h1.liquid-on{opacity:0}
.hero .sub{margin:24px 0 0;font-size:clamp(1.08rem,1.7vw,1.3rem);color:var(--body);max-width:60ch;line-height:1.55}
.hero-actions{display:flex;flex-wrap:wrap;align-items:center;gap:14px;margin-top:34px}
.hero-meta{display:flex;flex-wrap:wrap;gap:22px;margin-top:30px;color:var(--muted);font-size:14px}
.hero-meta b{color:var(--ink);font-weight:700}
.hero-meta .mi{display:flex;align-items:center;gap:9px}
.hero-meta svg{width:17px;height:17px;color:var(--emerald)}

/* rise-in animation */
.rise{opacity:0;transform:translateY(16px);animation:rise .7s cubic-bezier(.2,.7,.2,1) forwards}
.rise.d1{animation-delay:.05s}.rise.d2{animation-delay:.14s}.rise.d3{animation-delay:.24s}
.rise.d4{animation-delay:.34s}.rise.d5{animation-delay:.44s}
@keyframes rise{to{opacity:1;transform:none}}
@media (prefers-reduced-motion:reduce){.rise{animation:none;opacity:1;transform:none}.btn-primary{animation:none}.aurora{animation:none}.hero h1 .grad{animation:none}}

/* ---------- sections ---------- */
.section{padding:88px 0;position:relative}
.kicker{font-family:var(--mono);font-size:12.5px;letter-spacing:.16em;text-transform:uppercase;color:var(--indigo-2);margin:0 0 14px}
.section h2{font-size:clamp(2rem,4.2vw,3rem);line-height:1.04;letter-spacing:-.03em;max-width:20ch}
.section .lead{margin:16px 0 0;color:var(--body);font-size:1.08rem;max-width:64ch}
.reveal{opacity:0;transform:translateY(24px);transition:opacity .7s ease,transform .7s cubic-bezier(.2,.7,.2,1)}
.reveal.in{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){.reveal{opacity:1;transform:none}}

/* ---------- app shot ---------- */
.shot-wrap{position:relative;margin:34px auto 0;max-width:920px}
.shot-halo{position:absolute;inset:-8% -6% -14%;z-index:0;border-radius:40px;pointer-events:none;
  background:radial-gradient(60% 60% at 50% 30%,rgba(124,131,255,.34),transparent 70%);filter:blur(30px)}
.shot{position:relative;z-index:1;border:1px solid var(--line-strong);border-radius:16px;overflow:hidden;
  background:var(--panel);box-shadow:0 40px 120px -40px rgba(0,0,0,.8)}
.titlebar{display:flex;align-items:center;gap:8px;padding:11px 15px;background:#0d1320;border-bottom:1px solid var(--line)}
.titlebar .dots{display:flex;gap:7px}
.titlebar i{width:11px;height:11px;border-radius:50%;display:block}
.titlebar .t{margin-left:10px;font-family:var(--mono);font-size:12px;color:var(--muted)}
.shot-tags{display:flex;flex-wrap:wrap;gap:9px;justify-content:center;margin-top:20px}
.tag{font-family:var(--mono);font-size:12px;letter-spacing:.04em;color:var(--body);border:1px solid var(--line-strong);
  border-radius:999px;padding:7px 14px;background:rgba(124,131,255,.05)}

/* ---------- cps test ---------- */
.cps-card{display:grid;grid-template-columns:1.1fr .9fr;gap:0;border:1px solid var(--line-strong);border-radius:var(--r-lg);
  overflow:hidden;background:linear-gradient(180deg,var(--panel),var(--bg-2));box-shadow:0 40px 120px -50px rgba(0,0,0,.7)}
@media (max-width:760px){.cps-card{grid-template-columns:1fr}}
.cps-pad{position:relative;min-height:340px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;
  cursor:pointer;user-select:none;-webkit-user-select:none;background:
  radial-gradient(80% 80% at 50% 40%,rgba(124,131,255,.14),transparent 70%);border-right:1px solid var(--line)}
@media (max-width:760px){.cps-pad{border-right:none;border-bottom:1px solid var(--line);min-height:300px}}
.cps-pad:active{background:radial-gradient(80% 80% at 50% 40%,rgba(124,131,255,.24),transparent 70%)}
.cps-big{font-family:var(--display);font-weight:800;font-size:clamp(4.4rem,12vw,7rem);line-height:1;letter-spacing:-.05em;
  color:var(--ink);font-variant-numeric:tabular-nums}
.cps-unit{font-family:var(--mono);font-size:13px;letter-spacing:.22em;text-transform:uppercase;color:var(--indigo-2)}
.cps-hint{font-family:var(--text);font-size:15px;color:var(--body);margin-top:8px;text-align:center;padding:0 20px}
.cps-timer{position:absolute;top:16px;right:18px;font-family:var(--mono);font-size:13px;color:var(--muted);font-variant-numeric:tabular-nums}
.ripple{position:absolute;border-radius:50%;border:2px solid rgba(138,143,255,.6);pointer-events:none;
  transform:translate(-50%,-50%);animation:rip .5s ease-out forwards}
@keyframes rip{from{width:8px;height:8px;opacity:.9}to{width:120px;height:120px;opacity:0}}
.cps-side{padding:30px 30px;display:flex;flex-direction:column;gap:22px}
.cps-durations{display:flex;flex-wrap:wrap;gap:8px}
.dur{font-family:var(--mono);font-size:13px;color:var(--body);border:1px solid var(--line-strong);background:rgba(148,160,190,.04);
  border-radius:10px;padding:9px 14px;cursor:pointer;transition:.15s}
.dur:hover{border-color:var(--indigo)}
.dur.on{color:#0a0e18;background:linear-gradient(180deg,var(--indigo-2),var(--indigo));border-color:transparent;font-weight:700}
.cps-stats{display:flex;gap:26px}
.cps-stat .v{font-family:var(--display);font-weight:800;font-size:1.9rem;color:var(--ink);font-variant-numeric:tabular-nums}
.cps-stat .k{font-family:var(--mono);font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--muted);margin-top:2px}
.cps-tier{font-family:var(--text);font-size:15px;color:var(--body);min-height:24px}
.cps-tier b{color:var(--emerald)}
.cps-reset{align-self:flex-start;font-family:var(--mono);font-size:13px;color:var(--muted);background:none;border:1px solid var(--line);
  border-radius:9px;padding:8px 14px;cursor:pointer}
.cps-reset:hover{color:var(--ink);border-color:var(--line-strong)}

/* ---------- modes ---------- */
.mode-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:40px}
@media (max-width:860px){.mode-grid{grid-template-columns:1fr}}
.mode{border:1px solid var(--line);border-radius:var(--r);padding:26px;background:linear-gradient(180deg,var(--panel),rgba(19,26,40,.4));transition:.2s}
.mode:hover{border-color:var(--line-strong);transform:translateY(-3px)}
.mode .mi{width:46px;height:46px;border-radius:12px;display:flex;align-items:center;justify-content:center;margin-bottom:16px;
  background:rgba(124,131,255,.12);border:1px solid var(--line-strong)}
.mode .mi svg{width:24px;height:24px;color:var(--indigo-2)}
.mode h3{font-size:1.28rem;letter-spacing:-.02em}
.mode p{margin:9px 0 0;font-size:.98rem;color:var(--body)}
.mode .spec{margin-top:16px;font-family:var(--mono);font-size:12.5px;color:var(--emerald);letter-spacing:.02em}

/* ---------- features ---------- */
.feat-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:40px}
@media (max-width:900px){.feat-grid{grid-template-columns:repeat(2,1fr)}}
@media (max-width:560px){.feat-grid{grid-template-columns:1fr}}
.feat{border:1px solid var(--line);border-radius:var(--r);padding:22px;background:rgba(19,26,40,.5)}
.feat .ic{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;margin-bottom:14px;
  background:rgba(52,211,153,.1);border:1px solid rgba(52,211,153,.22)}
.feat .ic svg{width:21px;height:21px;color:var(--emerald)}
.feat h3{font-size:1.08rem}
.feat p{margin:7px 0 0;font-size:.94rem;color:var(--body)}

/* ---------- how ---------- */
.steps{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;margin-top:40px;counter-reset:st}
@media (max-width:820px){.steps{grid-template-columns:1fr}}
.step{position:relative;border:1px solid var(--line);border-radius:var(--r);padding:26px 24px;background:linear-gradient(180deg,var(--panel),rgba(19,26,40,.35))}
.step::before{counter-increment:st;content:counter(st);font-family:var(--display);font-weight:800;font-size:1.4rem;color:#0a0e18;
  width:40px;height:40px;border-radius:11px;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(180deg,var(--indigo-2),var(--indigo));margin-bottom:16px}
.step h3{font-size:1.12rem}
.step p{margin:8px 0 0;font-size:.96rem;color:var(--body)}

/* ---------- safety ---------- */
.safety{border:1px solid rgba(246,196,83,.28);border-radius:var(--r-lg);padding:30px 32px;margin-top:36px;
  background:linear-gradient(180deg,rgba(246,196,83,.06),rgba(19,26,40,.3))}
.safety h3{font-size:1.3rem;display:flex;align-items:center;gap:12px}
.safety h3 svg{width:24px;height:24px;color:var(--amber);flex:none}
.safety p{margin:12px 0 0;color:var(--body);max-width:80ch}

/* ---------- faq ---------- */
.faq-list{margin-top:36px;display:flex;flex-direction:column;gap:12px}
.faq{border:1px solid var(--line);border-radius:var(--r);background:rgba(19,26,40,.5);overflow:hidden}
.faq summary{list-style:none;cursor:pointer;padding:20px 24px;font-family:var(--display);font-weight:700;color:var(--ink);
  font-size:1.06rem;display:flex;align-items:center;justify-content:space-between;gap:16px}
.faq summary::-webkit-details-marker{display:none}
.faq summary .pl{color:var(--indigo-2);font-size:1.5rem;transition:.2s;flex:none;line-height:1}
.faq[open] summary .pl{transform:rotate(45deg)}
.faq .ans{padding:0 24px 22px;color:var(--body);font-size:.99rem;max-width:76ch}

/* ---------- download band ---------- */
.band{border:1px solid var(--line-strong);border-radius:var(--r-lg);padding:56px 32px;text-align:center;position:relative;overflow:hidden;
  background:radial-gradient(70% 120% at 50% 0%,rgba(124,131,255,.16),transparent 70%),linear-gradient(180deg,var(--panel),var(--bg-2))}
.band h2{font-size:clamp(2rem,4.4vw,3.1rem);letter-spacing:-.03em}
.band p{margin:14px auto 0;color:var(--body);max-width:52ch}
.band .hero-actions{justify-content:center;margin-top:32px}
.band .sha{margin-top:22px;font-family:var(--mono);font-size:12px;color:var(--muted);word-break:break-all}

/* ---------- footer ---------- */
.foot{border-top:1px solid var(--line);padding:48px 0 40px;margin-top:20px}
.foot-top{display:flex;flex-wrap:wrap;gap:24px;justify-content:space-between;align-items:center}
.foot-links{display:flex;flex-wrap:wrap;gap:22px}
.foot-links a{color:var(--body);font-size:14px}
.foot-links a:hover{color:var(--ink)}
.foot-bottom{margin-top:26px;color:var(--muted);font-size:13px;line-height:1.7}
.foot-bottom .disc{margin-top:8px}

/* ---------- mobile sticky ---------- */
.sticky-dl{position:fixed;left:0;right:0;bottom:0;z-index:50;display:none;padding:12px 16px calc(12px + env(safe-area-inset-bottom));
  background:linear-gradient(180deg,rgba(11,16,25,.4),rgba(11,16,25,.96));backdrop-filter:blur(12px);border-top:1px solid var(--line)}
.sticky-dl .btn{width:100%;justify-content:center;padding:16px;font-size:17px}
@media (max-width:640px){.sticky-dl{display:block}.foot{padding-bottom:96px}}
</style>
</head>
<body>

<div class="mc-root">

  <!-- FIXED BACKGROUND (Grok gaming hero video) -->
  <div class="scene-bg" aria-hidden="true">
    <video class="scene-video" id="fx" autoplay loop muted playsinline preload="auto" poster="/hero-poster.jpg"><source src="/hero.mp4" type="video/mp4"></video>
    <div class="scene-veil"></div>
  </div>

  <!-- NAV -->
  <nav class="nav"><div class="wrap nav-in">
    <a class="brand" href="#top">
      <svg viewBox="0 0 32 32" aria-hidden="true"><path d="M16 4l10 5.6v11.8L16 27 6 21.4V9.6z" fill="none" stroke="#8A8FFF" stroke-width="2" stroke-linejoin="round"/><path d="M6 9.6l10 5.6 10-5.6M16 15.2V27" stroke="#34D399" stroke-width="1.7" stroke-linejoin="round"/></svg>
      Minecraft Auto Clicker
    </a>
    <div class="nav-links">
      <a href="#cps">CPS Test</a>
      <a href="#modes">Modes</a>
      <a href="#features">Features</a>
      <a href="#faq">FAQ</a>
      <a class="nav-dl" href="/MinecraftAutoClickerPro.zip" rel="noopener">
        <svg viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M12 3v12m0 0l4-4m-4 4l-4-4M5 20h14" stroke="#0b1019" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>Download</a>
    </div>
  </div></nav>

  <!-- HERO -->
  <header class="hero" id="top">
    <div class="aurora a1" id="au1" aria-hidden="true"></div>
    <div class="aurora a2" id="au2" aria-hidden="true"></div>
    <div class="aurora a3" id="au3" aria-hidden="true"></div>
    <div class="hero-fade" aria-hidden="true"></div>

    <div class="wrap hero-in">
      <span class="eyebrow rise d1"><span class="dot" aria-hidden="true"></span>Open source · MIT · Windows 10 &amp; 11</span>
      <h1 class="rise d2" id="jh1">Free Minecraft <span class="grad">Auto Clicker.</span></h1>
      <canvas id="jheadfx" class="jhead-canvas" aria-hidden="true"></canvas>
      <p class="sub rise d3">
        Jitter clicking, butterfly clicking and a built-in CPS test — tuned for Hypixel BedWars,
        KitPvP and Skywars. Humanized click timing, hold or toggle hotkeys, and click profiles you
        can save. Lightweight, open-source, and completely free.
      </p>
      <div class="hero-actions rise d4">
        <a class="btn btn-primary" href="/MinecraftAutoClickerPro.zip" rel="noopener">
          <svg viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M12 3v12m0 0l4.2-4.2M12 15l-4.2-4.2M5 20h14" stroke="#0a0e18" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
          Download for Windows</a>
        <a class="btn btn-ghost" href="#" rel="noopener">
          <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M12 2C6.48 2 2 6.58 2 12.25c0 4.53 2.87 8.37 6.84 9.73.5.1.68-.22.68-.49 0-.24-.01-.87-.01-1.72-2.78.62-3.37-1.37-3.37-1.37-.45-1.18-1.11-1.5-1.11-1.5-.91-.63.07-.62.07-.62 1 .07 1.53 1.06 1.53 1.06.89 1.56 2.34 1.11 2.91.85.09-.66.35-1.11.63-1.36-2.22-.26-4.55-1.14-4.55-5.06 0-1.12.39-2.03 1.03-2.75-.1-.26-.45-1.3.1-2.71 0 0 .84-.28 2.75 1.05a9.35 9.35 0 015 0c1.91-1.33 2.75-1.05 2.75-1.05.55 1.41.2 2.45.1 2.71.64.72 1.03 1.63 1.03 2.75 0 3.93-2.34 4.8-4.57 5.05.36.32.68.94.68 1.9 0 1.37-.01 2.48-.01 2.82 0 .27.18.6.69.49A10.02 10.02 0 0022 12.25C22 6.58 17.52 2 12 2z"/></svg>
          View on GitHub</a>
        <a class="btn btn-ghost" href="https://sourceforge.net/projects/minecraft-auto-clicker-pro/" rel="noopener">
          <svg viewBox="0 0 24 24" fill="none" aria-hidden="true"><rect x="5.6" y="5.6" width="12.8" height="12.8" rx="3.4" transform="rotate(45 12 12)" fill="none" stroke="#F26526" stroke-width="1.8"/><path d="M12 6.6c1.15 1.7 2.5 2.9 2.5 4.7a2.5 2.5 0 11-5 0c0-.85.35-1.6.95-2.25.1.8.55 1.2 1.05 1.32C11.2 9 11.6 7.7 12 6.6z" fill="#F26526"/></svg>
          SourceForge</a>
      </div>
      <div class="hero-meta rise d5">
        <span class="mi"><svg viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M5 12l4 4L19 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> No injection into the game</span>
        <span class="mi"><svg viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M5 12l4 4L19 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> Quick guided installer</span>
        <span class="mi"><svg viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M5 12l4 4L19 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg> <b>100%</b> free · no ads</span>
      </div>
    </div>
  </header>

  <!-- SCROLLING CONTENT (covers the fixed scene as you scroll) -->
  <div class="page">

  <!-- APP PANEL (wide, thin) -->
  <section class="section" style="padding-top:6px;padding-bottom:56px" aria-label="App preview">
    <div class="wrap">
      <div class="shot-wrap reveal">
        <div class="shot-halo" aria-hidden="true"></div>
        <div class="shot">
          <div class="titlebar">
            <div class="dots"><i style="background:#ff5f57"></i><i style="background:#febc2e"></i><i style="background:#28c840"></i></div>
            <span class="t">Minecraft Auto Clicker Pro</span>
          </div>
          <img src="/hero.png" alt="Minecraft Auto Clicker Pro app — jitter and butterfly clicking with CPS controls" width="1086" height="576">
        </div>
      </div>
    </div>
  </section>

  <!-- CPS TEST -->
  <section class="section" id="cps">
    <div class="wrap">
      <div class="reveal">
        <p class="kicker">CPS test</p>
        <h2>How fast can you click?</h2>
        <p class="lead">Try it right here — pick a duration, then click the pad as fast as you can. See your live clicks-per-second, your peak, and where you land on the PVP scale.</p>
      </div>
      <div class="cps-card reveal" style="margin-top:36px">
        <div class="cps-pad" id="pad" role="button" tabindex="0" aria-label="CPS click pad">
          <span class="cps-timer" id="timer">0.0s</span>
          <span class="cps-big" id="cps">0.0</span>
          <span class="cps-unit">clicks / sec</span>
          <span class="cps-hint" id="hint">Click here to start</span>
        </div>
        <div class="cps-side">
          <div>
            <p class="kicker" style="margin-bottom:10px">Duration</p>
            <div class="cps-durations" id="durs">
              <button class="dur on" data-d="5">5s</button>
              <button class="dur" data-d="10">10s</button>
              <button class="dur" data-d="1">1s</button>
              <button class="dur" data-d="60">60s</button>
              <button class="dur" data-d="100">100s</button>
            </div>
          </div>
          <div class="cps-stats">
            <div class="cps-stat"><div class="v" id="clicks">0</div><div class="k">Clicks</div></div>
            <div class="cps-stat"><div class="v" id="best">0.0</div><div class="k">Best CPS</div></div>
          </div>
          <div class="cps-tier" id="tier">Your result appears here.</div>
          <button class="cps-reset" id="reset">Reset</button>
        </div>
      </div>
    </div>
  </section>

  <!-- MODES -->
  <section class="section" id="modes" style="padding-top:24px">
    <div class="wrap">
      <div class="reveal">
        <p class="kicker">Click engine</p>
        <h2>Three clicking modes, one clean engine</h2>
        <p class="lead">Every mode uses high-resolution timing and humanized jitter so your clicks never fire on a robotic fixed interval.</p>
      </div>
      <div class="mode-grid">
        <div class="mode reveal">
          <div class="mi"><svg viewBox="0 0 24 24" fill="none"><path d="M13 2L4 14h6l-1 8 9-12h-6z" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/></svg></div>
          <h3>Jitter clicking</h3>
          <p>One rapid, humanized click stream. Set a base CPS and a jitter range — timing varies on a Gaussian curve, never a flat interval.</p>
          <div class="spec">8–20 CPS · ±10–25% jitter</div>
        </div>
        <div class="mode reveal">
          <div class="mi"><svg viewBox="0 0 24 24" fill="none"><path d="M12 21c-4-3-7-6-7-10a4 4 0 017-2 4 4 0 017 2c0 4-3 7-7 10z" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/></svg></div>
          <h3>Butterfly clicking</h3>
          <p>Two independent finger streams alternate for a higher, steadier CPS, with a collision guard so the two never overlap.</p>
          <div class="spec">12–20 CPS · dual-finger</div>
        </div>
        <div class="mode reveal">
          <div class="mi"><svg viewBox="0 0 24 24" fill="none"><path d="M5 12h14M12 5v14" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></div>
          <h3>Classic burst</h3>
          <p>A steady fixed-rate click with a tight ±5% variance — perfect for menus, farming and simple hold-to-click tasks.</p>
          <div class="spec">1–50 CPS · ±5% variance</div>
        </div>
      </div>
    </div>
  </section>

  <!-- FEATURES -->
  <section class="section" id="features" style="padding-top:24px">
    <div class="wrap">
      <div class="reveal">
        <p class="kicker">Features</p>
        <h2>Everything a PVP clicker needs</h2>
      </div>
      <div class="feat-grid">
        <div class="feat reveal"><div class="ic"><svg viewBox="0 0 24 24" fill="none"><path d="M13 2L4 14h6l-1 8 9-12h-6z" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/></svg></div><h3>Humanized timing</h3><p>Gaussian jitter and high-resolution timers keep every click stream natural, not machine-perfect.</p></div>
        <div class="feat reveal"><div class="ic"><svg viewBox="0 0 24 24" fill="none"><path d="M12 6v6l4 2M21 12a9 9 0 11-18 0 9 9 0 0118 0z" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></div><h3>Hold or toggle</h3><p>Bind a hotkey to click only while held, or toggle on and off. Your call, per profile.</p></div>
        <div class="feat reveal"><div class="ic"><svg viewBox="0 0 24 24" fill="none"><path d="M4 4h16v12H4zM8 20h8M12 16v4" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/></svg></div><h3>Built-in CPS test</h3><p>Measure your real click speed with live CPS, peak tracking and a 10-second graph.</p></div>
        <div class="feat reveal"><div class="ic"><svg viewBox="0 0 24 24" fill="none"><path d="M6 3h9l3 3v15H6z M14 3v4h4" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/></svg></div><h3>Click profiles</h3><p>Save named presets — Hypixel Safe, BedWars Bridge, Butterfly PVP — and switch instantly.</p></div>
        <div class="feat reveal"><div class="ic"><svg viewBox="0 0 24 24" fill="none"><circle cx="12" cy="12" r="9" stroke="currentColor" stroke-width="2"/><path d="M12 8v4l3 2" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></div><h3>Left / right / middle</h3><p>Target any mouse button, so it works for attacking, bridging or using items.</p></div>
        <div class="feat reveal"><div class="ic"><svg viewBox="0 0 24 24" fill="none"><path d="M12 3l8 4v5c0 5-3.5 8-8 9-4.5-1-8-4-8-9V7z" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/></svg></div><h3>Safety cap</h3><p>Set a max CPS ceiling so a slipped setting never fires an absurd, obviously-bot rate.</p></div>
        <div class="feat reveal"><div class="ic"><svg viewBox="0 0 24 24" fill="none"><path d="M4 12l8-8 8 8-8 8z" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/></svg></div><h3>No injection</h3><p>Sends real input events. Nothing is injected into java.exe — no DLLs, no kernel drivers.</p></div>
        <div class="feat reveal"><div class="ic"><svg viewBox="0 0 24 24" fill="none"><path d="M5 12l4 4L19 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg></div><h3>Quick setup</h3><p>Download, run the installer, and you're clicking in under a minute — no account, no paywall.</p></div>
        <div class="feat reveal"><div class="ic"><svg viewBox="0 0 24 24" fill="none"><path d="M8 3H5a2 2 0 00-2 2v3m0 8v3a2 2 0 002 2h3m8 0h3a2 2 0 002-2v-3m0-8V5a2 2 0 00-2-2h-3" stroke="currentColor" stroke-width="2" stroke-linecap="round"/></svg></div><h3>Open source</h3><p>MIT-licensed on GitHub. Read the code, build it yourself, scan it on VirusTotal.</p></div>
      </div>
    </div>
  </section>

  <!-- HOW -->
  <section class="section" id="how" style="padding-top:24px">
    <div class="wrap">
      <div class="reveal">
        <p class="kicker">Get started</p>
        <h2>Clicking in under a minute</h2>
      </div>
      <div class="steps">
        <div class="step reveal"><h3>Download &amp; run</h3><p>Grab it from GitHub, run the installer, and launch the app — no account, no drivers needed.</p></div>
        <div class="step reveal"><h3>Pick a mode</h3><p>Choose Jitter, Butterfly or Classic, set your CPS range and bind a hotkey.</p></div>
        <div class="step reveal"><h3>Hold &amp; play</h3><p>Jump into practice or a server that allows it, hold your hotkey, and click.</p></div>
      </div>

      <div class="safety reveal">
        <h3><svg viewBox="0 0 24 24" fill="none"><path d="M12 3l8 4v5c0 5-3.5 8-8 9-4.5-1-8-4-8-9V7z" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/><path d="M12 9v4" stroke="currentColor" stroke-width="2" stroke-linecap="round"/><circle cx="12" cy="16" r="1" fill="currentColor"/></svg> Play fair &amp; know the rules</h3>
        <p>Auto clicking is great for practice, single-player and servers that allow it — but many competitive servers (including Hypixel) restrict automated clicking. This tool does <b>not</b> bypass any anti-cheat and does not inject into the game; it simply sends input. Use it responsibly and follow the rules of the servers you play on. Not affiliated with Mojang or Microsoft.</p>
      </div>
    </div>
  </section>

  <!-- FAQ -->
  <section class="section" id="faq" style="padding-top:24px">
    <div class="wrap" style="max-width:860px;margin:0 auto">
      <div class="reveal">
        <p class="kicker">FAQ</p>
        <h2>Questions, answered</h2>
      </div>
      <div class="faq-list">
        <details class="faq reveal"><summary>Is this Minecraft auto clicker free?<span class="pl">+</span></summary><div class="ans">Yes — 100% free and open-source under the MIT license. No ads, no paywall, no telemetry, and no locked "pro" features.</div></details>
        <details class="faq reveal"><summary>Will it get me banned on Hypixel?<span class="pl">+</span></summary><div class="ans">Auto clicking can break the rules of some competitive servers, including Hypixel. Use it for practice, single-player, and servers that allow it. It does not bypass anti-cheat and does not inject into the game — it just sends input, like any macro. You are responsible for following each server's rules.</div></details>
        <details class="faq reveal"><summary>Jitter vs butterfly clicking — what's the difference?<span class="pl">+</span></summary><div class="ans">Jitter clicking fires one rapid, humanized stream from a single "finger." Butterfly clicking alternates two independent finger streams for a higher, steadier CPS. Both are built in — switch anytime.</div></details>
        <details class="faq reveal"><summary>Is it safe? Any viruses?<span class="pl">+</span></summary><div class="ans">The full source is on GitHub under the MIT license — you can read it, build it yourself, or scan the download on VirusTotal before running it. Unsigned installers may trigger a Windows SmartScreen warning; that's normal for small indie tools.</div></details>
        <details class="faq reveal"><summary>Which Windows versions are supported?<span class="pl">+</span></summary><div class="ans">Windows 10 and Windows 11 (64-bit). It needs the .NET Framework 4.8 runtime, which is already included on modern Windows.</div></details>
        <details class="faq reveal"><summary>Does it work outside Minecraft?<span class="pl">+</span></summary><div class="ans">Yes. It sends standard mouse input, so it works in any game or app — Roblox, browser clickers, idle games and more.</div></details>
      </div>
    </div>
  </section>

  <!-- DOWNLOAD BAND -->
  <section class="section" id="download">
    <div class="wrap">
      <div class="band reveal">
        <h2>Download Minecraft Auto Clicker</h2>
        <p>Free, open-source, and ready in seconds. One click, quick install, no strings attached.</p>
        <div class="hero-actions">
          <a class="btn btn-primary" href="/MinecraftAutoClickerPro.zip" rel="noopener">
            <svg viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M12 3v12m0 0l4.2-4.2M12 15l-4.2-4.2M5 20h14" stroke="#0a0e18" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
            Download for Windows</a>
          <a class="btn btn-ghost" href="https://sourceforge.net/projects/minecraft-auto-clicker-pro/" rel="noopener">
            <svg viewBox="0 0 24 24" fill="none" aria-hidden="true"><rect x="5.6" y="5.6" width="12.8" height="12.8" rx="3.4" transform="rotate(45 12 12)" fill="none" stroke="#F26526" stroke-width="1.8"/><path d="M12 6.6c1.15 1.7 2.5 2.9 2.5 4.7a2.5 2.5 0 11-5 0c0-.85.35-1.6.95-2.25.1.8.55 1.2 1.05 1.32C11.2 9 11.6 7.7 12 6.6z" fill="#F26526"/></svg>
            SourceForge</a>
        </div>
      </div>
    </div>
  </section>

  <!-- FOOTER -->
  <footer class="foot"><div class="wrap">
    <div class="foot-top">
      <a class="brand" href="#top">
        <svg viewBox="0 0 32 32" aria-hidden="true"><path d="M16 4l10 5.6v11.8L16 27 6 21.4V9.6z" fill="none" stroke="#8A8FFF" stroke-width="2" stroke-linejoin="round"/><path d="M6 9.6l10 5.6 10-5.6M16 15.2V27" stroke="#34D399" stroke-width="1.7" stroke-linejoin="round"/></svg>
        Minecraft Auto Clicker
      </a>
      <nav class="foot-links" aria-label="Footer">
        <a href="#cps">CPS Test</a><a href="#modes">Modes</a><a href="#features">Features</a><a href="#faq">FAQ</a>
        <a href="#" rel="noopener">GitHub</a>
        <a href="https://sourceforge.net/projects/minecraft-auto-clicker-pro/" rel="noopener">SourceForge</a>
      </nav>
    </div>
    <div class="foot-bottom">
      © 2026 Minecraft Auto Clicker · Free &amp; open-source under the MIT license.
      <div class="disc">Not affiliated with, endorsed by, or associated with Mojang Studios or Microsoft. “Minecraft” is a trademark of Mojang Studios. This is an independent, third-party utility.</div>
    </div>
  </div></footer>

  </div><!-- /page -->

  <!-- MOBILE STICKY -->
  <div class="sticky-dl">
    <a class="btn btn-primary" href="/MinecraftAutoClickerPro.zip" rel="noopener">
      <svg viewBox="0 0 24 24" fill="none" aria-hidden="true"><path d="M12 3v12m0 0l4.2-4.2M12 15l-4.2-4.2M5 20h14" stroke="#0a0e18" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>
      Download — Free</a>
  </div>
</div>

<script>
(function(){
  var reduce = window.matchMedia && window.matchMedia('(prefers-reduced-motion:reduce)').matches;

  /* reveal on scroll */
  var items = [].slice.call(document.querySelectorAll('.reveal'));
  if('IntersectionObserver' in window && !reduce){
    var io = new IntersectionObserver(function(es){
      es.forEach(function(e){ if(e.isIntersecting){ e.target.classList.add('in'); io.unobserve(e.target); } });
    }, {rootMargin:'0px 0px -8% 0px', threshold:.12});
    items.forEach(function(el){ io.observe(el); });
  } else { items.forEach(function(el){ el.classList.add('in'); }); }

  /* pointer parallax on aurora */
  var hero = document.querySelector('.hero');
  var a1=document.getElementById('au1'), a2=document.getElementById('au2'), a3=document.getElementById('au3');
  if(hero && !reduce){
    var tx=0,ty=0,cx=0,cy=0,raf=null;
    hero.addEventListener('pointermove', function(ev){
      var r=hero.getBoundingClientRect();
      tx=((ev.clientX-r.left)/r.width-.5); ty=((ev.clientY-r.top)/r.height-.5);
      if(!raf) raf=requestAnimationFrame(loop);
    });
    hero.addEventListener('pointerleave', function(){ tx=0;ty=0; if(!raf) raf=requestAnimationFrame(loop); });
    function loop(){
      cx+=(tx-cx)*.06; cy+=(ty-cy)*.06;
      if(a1)a1.style.transform='translate('+(cx*34)+'px,'+(cy*26)+'px)';
      if(a2)a2.style.transform='translate('+(cx*-26)+'px,'+(cy*-20)+'px)';
      if(a3)a3.style.transform='translate('+(cx*18)+'px,'+(cy*-14)+'px)';
      if(Math.abs(tx-cx)>.001||Math.abs(ty-cy)>.001){ raf=requestAnimationFrame(loop); } else raf=null;
    }
  }

  /* ---- Minecraft world scene + floating cubes (looped ambient background) ---- */
  var canvas=document.getElementById('fx');
  if(canvas && canvas.getContext){
    var ctx=canvas.getContext('2d');
    var dpr=Math.min(window.devicePixelRatio||1,2);
    var W=0,H=0,blocks=[];
    var pX=0,pY=0,pTX=0,pTY=0; /* cursor parallax (normalized -0.5..0.5) */
    var PAL=[[124,131,255],[138,143,255],[52,211,153],[160,168,255]];
    function rnd(a,b){ return a+Math.random()*(b-a); }
    function hillmap(period,fa,fb,base,amp,seed){ var a=[]; for(var i=0;i<period;i++){ var t=i/period*Math.PI*2; a.push(base+amp*(0.5+0.5*(Math.sin(t*fa+seed)*0.8+Math.sin(t*fb+seed*1.7)*0.2))); } return a; }
    function size(){
      W=window.innerWidth; H=window.innerHeight;
      canvas.width=Math.floor(W*dpr); canvas.height=Math.floor(H*dpr);
      canvas.style.width=W+'px'; canvas.style.height=H+'px';
      ctx.setTransform(dpr,0,0,dpr,0,0); build();
    }
    function build(){
      blocks=[
        {t:'grass',  x:0.60, y:0.14, s:0.12, rot:0.15, bob:rnd(0,6.28), sp:0.6},
        {t:'ore',    x:0.40, y:0.66, s:0.13, rot:-0.1, bob:rnd(0,6.28), sp:0.5},
        {t:'pick',   x:0.92, y:0.16, s:0.17, rot:0.0,  bob:rnd(0,6.28), sp:0.45},
        {t:'creeper',x:0.78, y:0.24, s:0.075,rot:0,    bob:rnd(0,6.28), sp:0.8},
        {t:'creeper',x:0.50, y:0.84, s:0.065,rot:0,    bob:rnd(0,6.28), sp:0.7},
        {t:'creeper',x:0.96, y:0.36, s:0.06, rot:0,    bob:rnd(0,6.28), sp:0.75}
      ];
    }
    function cube(x,y,s,rot,c,a){
      var h=s*0.5, w=s*0.62; var bob=Math.sin(rot)*2; y+=bob;
      var top='rgba('+c[0]+','+c[1]+','+c[2]+','+a+')';
      var left='rgba('+c[0]+','+c[1]+','+c[2]+','+(a*0.62)+')';
      var right='rgba('+c[0]+','+c[1]+','+c[2]+','+(a*0.42)+')';
      ctx.beginPath(); ctx.moveTo(x,y-h); ctx.lineTo(x+w,y-h*0.5); ctx.lineTo(x,y); ctx.lineTo(x-w,y-h*0.5); ctx.closePath(); ctx.fillStyle=top; ctx.fill();
      ctx.beginPath(); ctx.moveTo(x-w,y-h*0.5); ctx.lineTo(x,y); ctx.lineTo(x,y+h); ctx.lineTo(x-w,y+h*0.5); ctx.closePath(); ctx.fillStyle=left; ctx.fill();
      ctx.beginPath(); ctx.moveTo(x+w,y-h*0.5); ctx.lineTo(x,y); ctx.lineTo(x,y+h); ctx.lineTo(x+w,y+h*0.5); ctx.closePath(); ctx.fillStyle=right; ctx.fill();
      ctx.strokeStyle='rgba('+c[0]+','+c[1]+','+c[2]+','+(a*0.9)+')'; ctx.lineWidth=1;
      ctx.beginPath(); ctx.moveTo(x,y-h); ctx.lineTo(x,y); ctx.moveTo(x-w,y-h*0.5); ctx.lineTo(x,y); ctx.lineTo(x+w,y-h*0.5); ctx.stroke();
    }
    /* pixel Minecraft mobs that ride the clouds */
    var SPRITES=[
      {name:'Creeper',w:10,palette:{'.':'transparent','G':'#6DB54A','g':'#4A9036','d':'#3B7A2A','K':'#0C0C0C'},
        rows:['gGGGGGGGGg','GGgGGGgGGG','GGGdGGdGGG','GGKKGGKKGG','GGKKGGKKGG','GGGGKKGGGG','GGGKKKKGGG','GGKKKKKKGG','GGKKGGKKGG','GGGgGGgGGG','GgGGGGGGgG','GGGGgGGGGG','gGGGGGGGGg','GGGGGGGGGG'],
        legs:{color:'#4A9036',w:3,h:2,gap:2},arms:{has:false}},
      {name:'Steve',w:10,palette:{'.':'transparent','H':'#3A2A17','S':'#C79A6B','W':'#FFFFFF','P':'#4B3FA0','M':'#6B4A34','T':'#1DA8A0','C':'#178F88'},
        rows:['.HHHHHHHH.','.HHHHHHHH.','.HSSSSSSH.','.SSSSSSSS.','.SWPSSPWS.','.SSSSSSSS.','.SSMMMMSS.','.CTTTTTTC.','.TTTTTTTT.','.TTTTTTTT.'],
        legs:{color:'#3A3A8C',w:3,h:3,gap:2},arms:{has:true,color:'#C79A6B',w:2,h:4}},
      {name:'Zombie',w:8,palette:{'.':'transparent','G':'#529E3E','g':'#3E7D30','E':'#16161D','M':'#2B2B2B','S':'#3BAFA2','s':'#2E8C82'},
        rows:['GGGGGGGG','GGGGGGGG','GEEGGEEG','GGGGGGGG','GgMMMMgG','GGGGGGGG','SSSSSSSS','SsSSSSsS','SSSSSSSS'],
        legs:{color:'#2C4B57',w:2,h:3,gap:0},arms:{has:true,color:'#529E3E',w:2,h:3}},
      {name:'Skeleton',w:10,palette:{'.':'transparent','B':'#E8E6DF','G':'#A9A69C','D':'#2B2B2B'},
        rows:['..BBBBBB..','..BBBBBB..','..BDDBDD..','..BBBBBB..','..BDBDBD..','...BBBB...','...BGGB...','...BGGB...','...BBBB...'],
        legs:{color:'#E8E6DF',w:1,h:4,gap:2},arms:{has:true,color:'#E8E6DF',w:1,h:4}},
      {name:'Pig',w:12,palette:{'.':'transparent','P':'#E39D9D','D':'#C77B7B','S':'#D98A8A','N':'#5C3838','E':'#2E2622'},
        rows:['.DD......DD.','.PPPPPPPPPP.','PPPPPPPPPPPP','PPEEPPPPEEPP','PPPPPPPPPPPP','PPPSSSSSSPPP','PPPSNSSNSPPP','PPPSSSSSSPPP','PPPPPPPPPPPP'],
        legs:{color:'#E39D9D',w:2,h:2,gap:4},arms:{has:false}},
      {name:'Enderman',w:8,palette:{'.':'transparent','K':'#141414','E':'#E24EFF'},
        rows:['.KKKKKK.','.KKKKKK.','.EEKKEE.','.KKKKKK.','..KKKK..','..KKKK..','..KKKK..','..KKKK..'],
        legs:{color:'#141414',w:1,h:6,gap:2},arms:{has:true,color:'#141414',w:1,h:5}}
    ];
    function drawMob(s,cx,feetY,px,alpha,bob){
      var bw=s.w, bh=s.rows.length, legH=s.legs.h*px;
      var x=cx-bw*px/2, by=feetY-legH-bob, bodyTop=by-bh*px;
      ctx.save(); ctx.globalAlpha=alpha;
      var lw=s.legs.w*px, gap=s.legs.gap*px, pairW=lw*2+gap, legX0=cx-pairW/2;
      ctx.fillStyle=s.legs.color;
      ctx.fillRect(Math.round(legX0),Math.round(by),Math.ceil(lw),Math.ceil(legH));
      ctx.fillRect(Math.round(legX0+lw+gap),Math.round(by),Math.ceil(lw),Math.ceil(legH));
      if(s.arms&&s.arms.has){ var aw=(s.arms.w||1)*px, ah=(s.arms.h||3)*px; ctx.fillStyle=s.arms.color||'#111';
        ctx.fillRect(Math.round(x-aw),Math.round(bodyTop+px*2),Math.ceil(aw),Math.ceil(ah));
        ctx.fillRect(Math.round(x+bw*px),Math.round(bodyTop+px*2),Math.ceil(aw),Math.ceil(ah)); }
      for(var r=0;r<bh;r++){ var row=s.rows[r]; for(var c=0;c<bw;c++){ var col=s.palette[row.charAt(c)];
        if(!col||col==='transparent') continue; ctx.fillStyle=col;
        ctx.fillRect(Math.round(x+c*px),Math.round(bodyTop+r*px),Math.ceil(px),Math.ceil(px)); } }
      ctx.restore();
    }
    function vgrad(stops){ var g=ctx.createLinearGradient(0,0,0,H); for(var i=0;i<stops.length;i++) g.addColorStop(stops[i][0],stops[i][1]); return g; }
    function layer(map,period,speed,e,colTop,colBody,trees,treeCol,ox,oy){
      var bs=Math.max(6,Math.round(W/(period*0.9)));
      var totalW=period*bs, off=((e*speed*1000)%totalW+totalW)%totalW;
      var startCol=Math.floor(off/bs), px=off-startCol*bs;
      ctx.save(); ctx.translate(ox||0,oy||0);
      for(var i=-2,x=-px-2*bs;x<W+bs*2;i++,x+=bs){
        var idx=((startCol+i)%period+period)%period;
        var topY=Math.round(map[idx]*H);
        ctx.fillStyle=colBody; ctx.fillRect(Math.floor(x),topY,bs+1,H-topY+110);
        ctx.fillStyle=colTop; ctx.fillRect(Math.floor(x),topY,bs+1,Math.max(4,bs*0.5));
        if(trees && idx%17===8){ var tx=Math.floor(x)+Math.floor(bs*0.2), tw=Math.floor(bs*0.6);
          ctx.fillStyle='#0e2a1c'; ctx.fillRect(tx+Math.floor(tw*0.35),topY-bs*0.7,Math.max(2,tw*0.3),bs*0.7);
          ctx.fillStyle=treeCol; ctx.fillRect(tx-tw*0.1,topY-bs*1.9,tw*1.2,bs*1.3); }
      }
      ctx.restore();
    }
    function rr(x,y,w,h,r){ ctx.beginPath(); ctx.moveTo(x+r,y); ctx.arcTo(x+w,y,x+w,y+h,r); ctx.arcTo(x+w,y+h,x,y+h,r); ctx.arcTo(x,y+h,x,y,r); ctx.arcTo(x,y,x+w,y,r); ctx.closePath(); }
    function spark(x,y,s){ if(s<=0.4) return; ctx.save(); ctx.shadowColor='rgba(255,255,255,0.9)'; ctx.shadowBlur=s*2.2; ctx.strokeStyle='rgba(255,255,255,0.95)'; ctx.lineWidth=Math.max(1,s*0.35); ctx.beginPath(); ctx.moveTo(x-s,y); ctx.lineTo(x+s,y); ctx.moveTo(x,y-s); ctx.lineTo(x,y+s); ctx.stroke(); ctx.restore(); }
    function drawRings(cx,cy,R,e){
      for(var r=0;r<3;r++){
        var rad=R*(1+r*0.34), count=Math.round(26+r*10), sq=Math.max(3,R*(0.10-r*0.017)), dir=(r%2?-1:1);
        ctx.save(); ctx.shadowColor='rgba(60,240,120,0.7)'; ctx.shadowBlur=sq*1.3;
        for(var k=0;k<count;k++){
          if((k+r)%8>5) continue;
          var ang=(k/count)*6.2832 + e*dir*(0.25+r*0.08);
          var x=cx+Math.cos(ang)*rad, y=cy+Math.sin(ang)*rad;
          var a=0.32+0.42*Math.sin(e*2.2+k*0.7+r); if(a<0.12)a=0.12;
          ctx.fillStyle='rgba(74,222,128,'+a.toFixed(2)+')'; ctx.fillRect(x-sq/2,y-sq/2,sq,sq);
        }
        ctx.restore();
      }
    }
    function drawMouse(cx,cy,h,e){
      var w=h*0.60;
      ctx.save();
      ctx.shadowColor='rgba(60,240,120,0.5)'; ctx.shadowBlur=h*0.22;
      var g=ctx.createLinearGradient(cx,cy-h/2,cx,cy+h/2); g.addColorStop(0,'#3a4048'); g.addColorStop(0.45,'#1a1e24'); g.addColorStop(1,'#0a0c0f');
      ctx.beginPath(); ctx.ellipse(cx,cy,w/2,h/2,0,0,6.2832); ctx.fillStyle=g; ctx.fill(); ctx.shadowBlur=0;
      ctx.lineWidth=Math.max(1.5,h*0.014); ctx.strokeStyle='rgba(74,222,128,0.75)'; ctx.stroke();
      ctx.beginPath(); ctx.moveTo(cx,cy-h*0.48); ctx.lineTo(cx,cy-h*0.04); ctx.lineWidth=Math.max(1,h*0.01); ctx.strokeStyle='rgba(74,222,128,0.45)'; ctx.stroke();
      ctx.save(); ctx.shadowColor='rgba(90,210,255,0.9)'; ctx.shadowBlur=h*0.14; ctx.fillStyle='#8fe6ff'; var ww=w*0.12, wh=h*0.11; rr(cx-ww/2,cy-h*0.33,ww,wh,ww*0.45); ctx.fill(); ctx.restore();
      ctx.save(); ctx.shadowColor='rgba(74,222,128,0.9)'; ctx.shadowBlur=h*0.1; ctx.strokeStyle='rgba(74,222,128,0.95)'; ctx.lineWidth=Math.max(1.5,h*0.022);
      ctx.beginPath(); ctx.moveTo(cx-w*0.46,cy+h*0.06); ctx.quadraticCurveTo(cx-w*0.3,cy+h*0.34,cx+w*0.02,cy+h*0.4); ctx.stroke(); ctx.restore();
      ctx.restore();
      spark(cx-w*0.28, cy-h*0.40, h*0.05*(0.6+0.4*Math.sin(e*4)));
      spark(cx+w*0.26, cy-h*0.28, h*0.045*(0.6+0.4*Math.sin(e*4+1.6)));
      spark(cx+w*0.10, cy-h*0.46, h*0.035*(0.6+0.4*Math.sin(e*4+3)));
    }
    function isoCube(cx,cy,s,top,left,right,detail){
      var w=s*0.62, h=s*0.5;
      ctx.beginPath(); ctx.moveTo(cx,cy-h); ctx.lineTo(cx+w,cy-h*0.5); ctx.lineTo(cx,cy); ctx.lineTo(cx-w,cy-h*0.5); ctx.closePath(); ctx.fillStyle=top; ctx.fill();
      ctx.beginPath(); ctx.moveTo(cx-w,cy-h*0.5); ctx.lineTo(cx,cy); ctx.lineTo(cx,cy+h); ctx.lineTo(cx-w,cy+h*0.5); ctx.closePath(); ctx.fillStyle=left; ctx.fill();
      ctx.beginPath(); ctx.moveTo(cx+w,cy-h*0.5); ctx.lineTo(cx,cy); ctx.lineTo(cx,cy+h); ctx.lineTo(cx+w,cy+h*0.5); ctx.closePath(); ctx.fillStyle=right; ctx.fill();
      if(detail) detail(cx,cy,w,h);
    }
    function drawPick(s,e){
      ctx.save(); ctx.rotate(-0.5); ctx.lineCap='round';
      ctx.shadowColor='rgba(150,90,255,0.6)'; ctx.shadowBlur=s*0.35;
      ctx.strokeStyle='#7a4a24'; ctx.lineWidth=s*0.13; ctx.beginPath(); ctx.moveTo(-s*0.45,s*0.5); ctx.lineTo(s*0.12,-s*0.12); ctx.stroke();
      ctx.strokeStyle='#6fe0ff'; ctx.lineWidth=s*0.15; ctx.shadowColor='rgba(90,210,255,0.9)';
      ctx.beginPath(); ctx.moveTo(-s*0.4,-s*0.28); ctx.quadraticCurveTo(s*0.12,-s*0.55,s*0.5,-s*0.05); ctx.stroke();
      ctx.shadowBlur=0; ctx.fillStyle='#c9f4ff'; ctx.fillRect(-s*0.03,-s*0.42,s*0.09,s*0.09);
      ctx.restore();
    }
    function drawBlock(t,x,y,s,rot,e){
      ctx.save(); ctx.translate(x,y); if(rot) ctx.rotate(rot*0.25);
      if(t==='grass'){
        isoCube(0,0,s,'#63b23f','#6b4a2c','#513a22', function(cx,cy,w,h){
          ctx.fillStyle='rgba(40,90,30,0.5)'; ctx.fillRect(cx-w*0.3,cy-h*0.55,s*0.07,s*0.05); ctx.fillRect(cx+w*0.15,cy-h*0.42,s*0.06,s*0.04);
          ctx.fillStyle='rgba(0,0,0,0.18)'; ctx.fillRect(cx-w*0.45,cy+h*0.15,s*0.06,s*0.06); ctx.fillRect(cx+w*0.3,cy+h*0.3,s*0.05,s*0.05);
        });
      } else if(t==='ore'){
        ctx.save(); ctx.shadowColor='rgba(90,210,255,0.55)'; ctx.shadowBlur=s*0.28;
        isoCube(0,0,s,'#5b6472','#3c434d','#2b313a', function(cx,cy,w,h){
          ctx.fillStyle='#7fe3ff';
          ctx.fillRect(cx+w*0.25,cy+h*0.12,s*0.10,s*0.10); ctx.fillRect(cx+w*0.52,cy+h*0.38,s*0.07,s*0.07);
          ctx.fillRect(cx-w*0.5,cy+h*0.2,s*0.09,s*0.09); ctx.fillRect(cx-w*0.25,cy+h*0.42,s*0.06,s*0.06);
        });
        ctx.restore();
      } else if(t==='creeper'){
        var d=s*0.95;
        ctx.fillStyle='#5aa63c'; ctx.fillRect(-d/2,-d/2,d,d);
        ctx.fillStyle='rgba(0,0,0,0.16)'; ctx.fillRect(-d/2,d*0.18,d,d*0.32);
        ctx.fillStyle='rgba(255,255,255,0.06)'; ctx.fillRect(-d/2,-d/2,d,d*0.16);
        ctx.fillStyle='#0c0c0c'; var u=d/8;
        ctx.fillRect(-2.4*u,-1.6*u,1.6*u,1.6*u); ctx.fillRect(0.8*u,-1.6*u,1.6*u,1.6*u);
        ctx.fillRect(-0.8*u,0.0*u,1.6*u,1.6*u); ctx.fillRect(-1.6*u,1.2*u,1.6*u,1.6*u); ctx.fillRect(0.0*u,1.2*u,1.6*u,1.6*u);
      } else if(t==='pick'){ drawPick(s,e); }
      ctx.restore();
    }
    function drawGauge(cx,cy,R,e){
      var maxV=35, v=19+6*Math.sin(e*0.5)+2.5*Math.sin(e*1.7); if(v<0)v=0; if(v>maxV)v=maxV;
      var a0=Math.PI*0.78, a1=Math.PI*2.22;
      ctx.save(); ctx.lineCap='round';
      ctx.lineWidth=R*0.13; ctx.strokeStyle='rgba(30,55,38,0.9)'; ctx.beginPath(); ctx.arc(cx,cy,R,a0,a1); ctx.stroke();
      var va=a0+(a1-a0)*(v/maxV);
      ctx.strokeStyle='rgba(74,222,128,0.95)'; ctx.shadowColor='rgba(74,222,128,0.8)'; ctx.shadowBlur=R*0.16; ctx.beginPath(); ctx.arc(cx,cy,R,a0,va); ctx.stroke(); ctx.shadowBlur=0;
      var ticks=[0,5,10,15,20,25,30,35]; ctx.textAlign='center'; ctx.textBaseline='middle';
      for(var i=0;i<ticks.length;i++){ var ta=a0+(a1-a0)*(ticks[i]/maxV);
        var ix=cx+Math.cos(ta)*R*0.86, iy=cy+Math.sin(ta)*R*0.86, ox=cx+Math.cos(ta)*R, oy=cy+Math.sin(ta)*R;
        ctx.strokeStyle='rgba(120,170,135,0.55)'; ctx.lineWidth=1.5; ctx.beginPath(); ctx.moveTo(ix,iy); ctx.lineTo(ox,oy); ctx.stroke();
        ctx.fillStyle='rgba(170,210,180,0.8)'; ctx.font=(R*0.13)+'px ui-monospace,Menlo,monospace'; ctx.fillText(ticks[i], cx+Math.cos(ta)*R*1.16, cy+Math.sin(ta)*R*1.16); }
      ctx.strokeStyle='rgba(150,255,180,1)'; ctx.shadowColor='rgba(74,222,128,0.9)'; ctx.shadowBlur=R*0.2; ctx.lineWidth=R*0.045;
      ctx.beginPath(); ctx.moveTo(cx-Math.cos(va)*R*0.12,cy-Math.sin(va)*R*0.12); ctx.lineTo(cx+Math.cos(va)*R*0.7,cy+Math.sin(va)*R*0.7); ctx.stroke();
      ctx.fillStyle='#4ade80'; ctx.beginPath(); ctx.arc(cx,cy,R*0.07,0,6.2832); ctx.fill(); ctx.shadowBlur=0;
      ctx.fillStyle='#eafff0'; ctx.font='700 '+(R*0.4)+'px "Syne",sans-serif'; ctx.fillText(v.toFixed(1), cx, cy+R*0.4);
      ctx.fillStyle='rgba(74,222,128,0.9)'; ctx.font=(R*0.15)+'px ui-monospace,Menlo,monospace'; ctx.fillText('CPS', cx, cy+R*0.66);
      var bars=11, gap=R*0.055, bw=R*0.075, totalW=bars*(bw+gap)-gap, x0=cx-totalW/2, by=cy+R*1.06;
      for(var b=0;b<bars;b++){ var bh=R*(0.06+0.42*Math.abs(Math.sin(e*3.2+b*0.55))); var bx=x0+b*(bw+gap);
        ctx.fillStyle='rgba(74,222,128,'+(0.35+0.5*(bh/(R*0.48))).toFixed(2)+')'; ctx.fillRect(bx,by-bh,bw,bh); }
      ctx.restore();
    }
    function scene(e){
      var nx=pX, ny=pY, U=Math.min(W,H);
      var bg=ctx.createRadialGradient(W*0.6,H*0.44,U*0.05, W*0.6,H*0.44,U*0.75);
      bg.addColorStop(0,'#0e1a12'); bg.addColorStop(0.5,'#0a0e12'); bg.addColorStop(1,'#070a0d');
      ctx.fillStyle=bg; ctx.fillRect(0,0,W,H);
      var gg=ctx.createRadialGradient(W*0.62,H*0.44,0, W*0.62,H*0.44,U*0.5);
      gg.addColorStop(0,'rgba(50,200,110,0.16)'); gg.addColorStop(1,'rgba(50,200,110,0)'); ctx.fillStyle=gg; ctx.fillRect(0,0,W,H);
      var CX=W*0.62, CY=H*0.44;
      ctx.save(); ctx.translate(-nx*26,-ny*16); drawRings(CX,CY,U*0.15,e); drawMouse(CX,CY,U*0.17,e); ctx.restore();
      ctx.save(); ctx.translate(-nx*44,-ny*26);
        for(var i=0;i<blocks.length;i++){ var bk=blocks[i]; var bx=bk.x*W, by=bk.y*H+Math.sin(e*bk.sp+bk.bob)*U*0.013; drawBlock(bk.t,bx,by,bk.s*U,bk.rot+Math.sin(e*bk.sp*0.5+bk.bob)*0.1,e); }
      ctx.restore();
      ctx.save(); ctx.translate(-nx*20,-ny*12); drawGauge(W*0.84,H*0.62,U*0.11,e); ctx.restore();
      var lg=ctx.createLinearGradient(0,0,W*0.52,0); lg.addColorStop(0,'rgba(7,10,13,.9)'); lg.addColorStop(1,'rgba(7,10,13,0)'); ctx.fillStyle=lg; ctx.fillRect(0,0,W,H);
    }
    function draw(t){
      if(draw._t0==null) draw._t0=t; var e=(t-draw._t0)/1000;
      pX+=(pTX-pX)*0.06; pY+=(pTY-pY)*0.06;
      ctx.clearRect(0,0,W,H); scene(e); requestAnimationFrame(draw);
    }
    function staticFrame(){ ctx.clearRect(0,0,W,H); scene(0); }
    size();
    if(!reduce){
      requestAnimationFrame(draw);
      window.addEventListener('pointermove', function(ev){ pTX=(ev.clientX/window.innerWidth-0.5); pTY=(ev.clientY/window.innerHeight-0.5); }, {passive:true});
    } else staticFrame();
    var rt=null;
    window.addEventListener('resize', function(){ clearTimeout(rt); rt=setTimeout(function(){ dpr=Math.min(window.devicePixelRatio||1,2); size(); if(reduce) staticFrame(); },160); });
  }

  /* ---- hero video cursor parallax (subtle 3D depth) ---- */
  var heroVid=document.getElementById('fx');
  if(heroVid && !reduce && heroVid.tagName==='VIDEO'){
    var vtx=0,vty=0,vcx=0,vcy=0,vraf=null;
    window.addEventListener('pointermove', function(ev){ vtx=(ev.clientX/window.innerWidth-0.5); vty=(ev.clientY/window.innerHeight-0.5); if(!vraf) vraf=requestAnimationFrame(vloop); }, {passive:true});
    function vloop(){ vcx+=(vtx-vcx)*0.06; vcy+=(vty-vcy)*0.06; heroVid.style.transform='scale(1.08) translate('+(-vcx*2.2).toFixed(2)+'%,'+(-vcy*1.6).toFixed(2)+'%)'; if(Math.abs(vtx-vcx)>0.001||Math.abs(vty-vcy)>0.001) vraf=requestAnimationFrame(vloop); else vraf=null; }
  }

  /* ---- interactive CPS test ---- */
  var pad=document.getElementById('pad'), cpsEl=document.getElementById('cps'),
      timerEl=document.getElementById('timer'), hintEl=document.getElementById('hint'),
      clicksEl=document.getElementById('clicks'), bestEl=document.getElementById('best'),
      tierEl=document.getElementById('tier'), resetBtn=document.getElementById('reset'),
      durs=document.getElementById('durs');
  var duration=5, running=false, count=0, startT=0, endT=0, tick=null, best=0;

  function tier(cps){
    if(cps<3) return ['Casual','#A6B0C6'];
    if(cps<6) return ['Steady','#8A8FFF'];
    if(cps<9) return ['Fast','#7C83FF'];
    if(cps<12) return ['PVP-ready','#34D399'];
    if(cps<16) return ['Jitter tier','#34D399'];
    return ['Butterfly beast','#F6C453'];
  }
  function fmt(n){ return (Math.round(n*10)/10).toFixed(1); }
  function reset(){
    running=false; count=0; if(tick){clearInterval(tick);tick=null;}
    cpsEl.textContent='0.0'; timerEl.textContent=duration.toFixed(1)+'s';
    clicksEl.textContent='0'; hintEl.textContent='Click here to start'; hintEl.style.display='';
    tierEl.innerHTML='Your result appears here.';
  }
  function finish(){
    running=false; if(tick){clearInterval(tick);tick=null;}
    var final=count/duration;
    cpsEl.textContent=fmt(final); timerEl.textContent='0.0s';
    if(final>best){ best=final; bestEl.textContent=fmt(best); }
    var t=tier(final);
    tierEl.innerHTML='You hit <b style="color:'+t[1]+'">'+fmt(final)+' CPS</b> — '+t[0]+'. '+(final<9?'Jitter mode can push you past this.':'Try butterfly mode to climb higher.');
    hintEl.textContent='Click to try again'; hintEl.style.display='';
  }
  function start(){
    running=true; count=0; hintEl.style.display='none';
    startT=performance.now(); endT=startT+duration*1000;
    tick=setInterval(function(){
      var now=performance.now(); var rem=Math.max(0,(endT-now)/1000);
      timerEl.textContent=rem.toFixed(1)+'s';
      var el=(now-startT)/1000; if(el>0) cpsEl.textContent=fmt(count/el);
      if(now>=endT) finish();
    },50);
  }
  function hit(ev){
    if(!running){ start(); }
    count++; clicksEl.textContent=count;
    var el=(performance.now()-startT)/1000; if(el>0) cpsEl.textContent=fmt(count/el);
    if(ev && ev.clientX!==undefined){
      var r=pad.getBoundingClientRect();
      var d=document.createElement('span'); d.className='ripple';
      d.style.left=(ev.clientX-r.left)+'px'; d.style.top=(ev.clientY-r.top)+'px';
      pad.appendChild(d); setTimeout(function(){ d.remove(); },500);
    }
  }
  if(pad){
    pad.addEventListener('pointerdown', hit);
    pad.addEventListener('keydown', function(e){ if(e.code==='Space'||e.code==='Enter'){ e.preventDefault(); hit(); } });
    resetBtn.addEventListener('click', reset);
    durs.addEventListener('click', function(e){
      var b=e.target.closest('.dur'); if(!b) return;
      [].forEach.call(durs.children,function(x){x.classList.remove('on');});
      b.classList.add('on'); duration=parseInt(b.dataset.d,10); reset();
    });
    reset();
  }
})();
</script>

<svg width="0" height="0" style="position:absolute" aria-hidden="true">
  <defs>
    <filter id="jheadGoo" x="-50%" y="-50%" width="200%" height="200%" color-interpolation-filters="sRGB">
      <feGaussianBlur in="SourceGraphic" stdDeviation="18" result="b"/>
      <feColorMatrix in="b" type="matrix" values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 20 -8" result="g"/>
    </filter>
  </defs>
</svg>
<script>
(function(){
  var h1=document.getElementById('jh1');
  var cv=document.getElementById('jheadfx');
  var heroIn=h1&&h1.parentNode;
  if(!h1||!cv||!heroIn||!cv.getContext) return;
  var ctx=cv.getContext('2d');
  var reduce=matchMedia('(prefers-reduced-motion: reduce)').matches;
  var blob=document.createElement('canvas'),bctx=blob.getContext('2d');
  var goo=document.createElement('canvas'),gctx=goo.getContext('2d');
  var mask=document.createElement('canvas'),mctx=mask.getContext('2d');
  var fGB=document.querySelector('#jheadGoo feGaussianBlur');
  var INDIGO=[138,143,255],EMER=[52,211,153];
  function mix(a,b,t){t=t<0?0:t>1?1:t;return 'rgb('+((a[0]+(b[0]-a[0])*t)|0)+','+((a[1]+(b[1]-a[1])*t)|0)+','+((a[2]+(b[2]-a[2])*t)|0)+')';}
  var W=0,H=0,dpr=1,fs=0,lh=0,pad=0,lines=[],lineY=[],bb={left:0,top:0,right:0,bottom:0};
  var parts=[],maskData=null,mouse={x:-1e4,y:-1e4,active:false},raf=0;

  function fontStr(sz){return '800 '+sz+'px Syne, system-ui, sans-serif';}
  function ls(c,sz){try{c.letterSpacing=(-0.03*sz)+'px';}catch(e){}}
  function wrapText(text,maxW,sz){
    ctx.font=fontStr(sz);ls(ctx,sz);
    var words=text.split(/\s+/),out=[],cur='';
    for(var i=0;i<words.length;i++){var t=cur?cur+' '+words[i]:words[i];
      if(ctx.measureText(t).width>maxW&&cur){out.push(cur);cur=words[i];}else cur=t;}
    if(cur)out.push(cur);return out;
  }
  function measureMax(arr,sz){ctx.font=fontStr(sz);ls(ctx,sz);var m=0;for(var i=0;i<arr.length;i++){var w=ctx.measureText(arr[i]).width;if(w>m)m=w;}return m;}
  function inside(x,y){var px=(x*dpr)|0,py=(y*dpr)|0;if(px<0||py<0||px>=mask.width||py>=mask.height)return false;return maskData[(py*mask.width+px)*4+3]>50;}

  function spawn(){parts=[];var step=Math.max(6,fs*0.085),amp=fs*0.028,r0=fs*0.135;
    for(var y=bb.top;y<=bb.bottom;y+=step)for(var x=bb.left;x<=bb.right;x+=step){
      var jx=x+(Math.random()-0.5)*step*0.5,jy=y+(Math.random()-0.5)*step*0.5;
      if(!inside(jx,jy))continue;
      parts.push({hx:jx,hy:jy,r:r0*(0.9+Math.random()*0.45),ph:Math.random()*6.28,ph2:Math.random()*6.28,amp:amp*(0.7+Math.random()*0.8),dx:0,dy:0,vx:0,vy:0});
      if(parts.length>620)return;
    }}

  function positionCanvas(){
    var hr=h1.getBoundingClientRect(),pr=heroIn.getBoundingClientRect();
    cv.style.left=(hr.left-pr.left-pad)+'px';
    cv.style.top=(hr.top-pr.top-pad)+'px';
    cv.style.width=W+'px';cv.style.height=H+'px';
  }
  function layout(){
    var cs=getComputedStyle(h1);fs=parseFloat(cs.fontSize)||64;
    var hr=h1.getBoundingClientRect();
    var availW=hr.width+4;
    var text=(h1.textContent||'').replace(/\s+/g,' ').trim();
    lines=wrapText(text,availW,fs);lh=fs*0.92;
    pad=fs*0.55;
    W=hr.width+pad*2;H=hr.height+pad*2;dpr=Math.min(window.devicePixelRatio||1,2);
    [cv,blob,goo,mask].forEach(function(c){c.width=(W*dpr)|0;c.height=(H*dpr)|0;});
    [ctx,bctx,gctx].forEach(function(c){c.setTransform(dpr,0,0,dpr,0,0);});
    positionCanvas();
    lineY=[];for(var i=0;i<lines.length;i++)lineY.push(pad+lh*(i+0.5)+fs*0.02);
    mctx.setTransform(dpr,0,0,dpr,0,0);mctx.clearRect(0,0,W,H);
    mctx.fillStyle='#fff';mctx.font=fontStr(fs);mctx.textAlign='left';mctx.textBaseline='middle';ls(mctx,fs);
    for(var j=0;j<lines.length;j++)mctx.fillText(lines[j],pad,lineY[j]);
    var mw=measureMax(lines,fs);
    bb={left:pad-fs*0.05,right:pad+mw+fs*0.05,top:lineY[0]-fs*0.62,bottom:lineY[lines.length-1]+fs*0.62};
    maskData=mctx.getImageData(0,0,mask.width,mask.height).data;
    if(fGB)fGB.setAttribute('stdDeviation',(fs*0.075*dpr).toFixed(2));
    spawn();
  }

  function render(){
    bctx.setTransform(dpr,0,0,dpr,0,0);bctx.clearRect(0,0,W,H);
    var span=bb.bottom-bb.top||1;
    for(var i=0;i<parts.length;i++){var p=parts[i];bctx.fillStyle=mix(INDIGO,EMER,(p.py-bb.top)/span);bctx.beginPath();bctx.arc(p.px,p.py,p.r,0,6.2832);bctx.fill();}
    gctx.setTransform(1,0,0,1,0,0);gctx.clearRect(0,0,goo.width,goo.height);
    gctx.filter='url(#jheadGoo)';gctx.drawImage(blob,0,0);gctx.filter='none';
    gctx.globalCompositeOperation='destination-in';gctx.drawImage(mask,0,0);gctx.globalCompositeOperation='source-over';
    ctx.setTransform(dpr,0,0,dpr,0,0);ctx.clearRect(0,0,W,H);
    ctx.font=fontStr(fs);ctx.textAlign='left';ctx.textBaseline='middle';ls(ctx,fs);
    ctx.lineWidth=Math.max(1,fs*0.010);ctx.strokeStyle='rgba(198,204,255,0.18)';
    for(var j=0;j<lines.length;j++)ctx.strokeText(lines[j],pad,lineY[j]);
    ctx.setTransform(1,0,0,1,0,0);ctx.drawImage(goo,0,0);
    ctx.setTransform(dpr,0,0,dpr,0,0);ctx.save();ctx.globalCompositeOperation='source-atop';
    var g=ctx.createLinearGradient(0,bb.top,0,bb.top+span*0.55);g.addColorStop(0,'rgba(255,255,255,0.18)');g.addColorStop(1,'rgba(255,255,255,0)');
    ctx.fillStyle=g;ctx.fillRect(bb.left,bb.top,bb.right-bb.left,span);ctx.restore();
  }

  function frame(now){var t=now*0.001;
    for(var i=0;i<parts.length;i++){var p=parts[i];
      var bx=Math.sin(t*0.9+p.ph)*p.amp+Math.sin(t*1.7+p.ph2)*p.amp*0.4;
      var by=Math.cos(t*0.8+p.ph2)*p.amp*1.15+Math.sin(t*0.5+p.ph)*p.amp*0.5;
      p.vx+=-0.11*p.dx;p.vy+=-0.11*p.dy;p.vx*=0.87;p.vy*=0.87;
      var px=p.hx+bx+p.dx,py=p.hy+by+p.dy;
      if(mouse.active){var ddx=px-mouse.x,ddy=py-mouse.y,d2=ddx*ddx+ddy*ddy,R=fs*0.8;if(d2<R*R){var d=Math.sqrt(d2)||1,f=(1-d/R);p.vx+=ddx/d*f*R*0.16;p.vy+=ddy/d*f*R*0.16;}}
      p.dx+=p.vx;p.dy+=p.vy;p.px=p.hx+bx+p.dx;p.py=p.hy+by+p.dy;
    }
    positionCanvas();render();if(!reduce)raf=requestAnimationFrame(frame);
  }

  function start(){try{layout();}catch(e){return;}
    h1.classList.add('liquid-on');cv.classList.add('on');
    if(reduce){for(var i=0;i<parts.length;i++){parts[i].px=parts[i].hx;parts[i].py=parts[i].hy;}positionCanvas();render();return;}
    cancelAnimationFrame(raf);raf=requestAnimationFrame(frame);
  }
  function pt(e){var r=cv.getBoundingClientRect();mouse.x=e.clientX-r.left;mouse.y=e.clientY-r.top;mouse.active=true;}
  window.addEventListener('pointermove',pt,{passive:true});
  var rt;window.addEventListener('resize',function(){clearTimeout(rt);rt=setTimeout(start,180);});
  if(document.fonts&&document.fonts.load){Promise.all([document.fonts.load('800 100px Syne'),document.fonts.ready]).then(start).catch(start);}else setTimeout(start,150);
})();
</script>
</body>
</html>
