Models 44

MiniMax M3.1 Flash

by MiniMaxReasoningClean
Open in new window

Running live in a sandboxed frame. Click inside it before using the keyboard.

How it went

Total time
1 min 25 s
Cost
$0.0089
Output tokens
14,814
Spent thinking
7,133 tokens
Speed
174.7 tok/s
Console errors
0
First token after
523 ms
First visible text after
48.3 s
Prompt tokens
541
Code size
20.5 KB
Finish reason
stop
Served by
Fireworks
Model id
minimax/minimax-m3.1-flash
Reasoning sent
{"effort":"xhigh"}
Max output
64,000 tokens
Generated
Nov 11, 2026

What it was asked

The prompt
“a "like" button in pure CSS, no JavaScript, that does a crazy animation when you click it”
System prompt, sent with every prompt
You are generating a self-contained web demo. It will be rendered automatically in a sandboxed iframe and compared side by side with the output of other AI models given the exact same task.

Output rules:
- Reply with exactly ONE fenced code block containing the complete file: ```html (or ```svg when the task asks for an SVG). No text before or after the code block.
- Everything must be inline: CSS in <style>, JavaScript in <script>. No external files, images, fonts or network requests, except the CDN URLs explicitly allowed by the task.
- Do not use localStorage, sessionStorage, cookies, IndexedDB, alert(), confirm(), prompt() or window.open(): they are blocked in the sandbox and will throw.
- The page must look right in a 1280×800 viewport and adapt gracefully down to 375px wide. No horizontal scrollbar.
- Something meaningful must be visible on first paint: a screenshot is taken automatically about 3 seconds after load, without any interaction.
- Everything that makes the demo interesting must be visible within the first seconds: nothing hidden behind a high score, a later level or a long play session.
- Games must start in a self-playing demo mode (a simple AI plays) behind a "Click or press a key to start" message, so the game can be judged in action without playing.
- The iframe only receives keyboard events after the user clicks it: if the demo uses the keyboard, display a clear "Click or press a key to start" message.
- The code must run with zero errors in the console of the latest Chrome.

Code run-1.html · 392 lines

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Pure CSS Like Button — Zero JavaScript</title>
<style>
  /* ============ RESET / BASE ============ */
  *,*::before,*::after{box-sizing:border-box}
  html,body{margin:0;padding:0}
  body{
    min-height:100%;
    font-family:"Segoe UI",system-ui,-apple-system,"Helvetica Neue",Arial,sans-serif;
    color:#eaf0ff;
    background:#080a1a;
    overflow-x:hidden;
    -webkit-font-smoothing:antialiased;
  }
  .sr-only{
    position:absolute;width:1px;height:1px;padding:0;margin:-1px;
    overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;
  }

  /* ============ BACKGROUND ============ */
  .bg{
    position:fixed;inset:0;z-index:0;overflow:hidden;
    background:
      radial-gradient(1200px 700px at 15% 10%, #22114a 0%, transparent 60%),
      radial-gradient(1000px 700px at 85% 90%, #06283c 0%, transparent 60%),
      linear-gradient(160deg,#0a0c22 0%,#080a1a 50%,#120b22 100%);
  }
  .grid{
    position:fixed;inset:-50%;z-index:0;opacity:.16;
    background-image:linear-gradient(rgba(255,255,255,.14) 1px,transparent 1px),
                     linear-gradient(90deg,rgba(255,255,255,.14) 1px,transparent 1px);
    background-size:44px 44px;
    transform:perspective(500px) rotateX(62deg) translateY(-8%);
    mask-image:radial-gradient(ellipse at 50% 30%,#000 10%,transparent 65%);
    -webkit-mask-image:radial-gradient(ellipse at 50% 30%,#000 10%,transparent 65%);
    animation:gridScroll 22s linear infinite;
  }
  @keyframes gridScroll{to{background-position:0 44px,44px 0}}

  .aurora{
    position:fixed;z-index:0;border-radius:50%;filter:blur(80px);opacity:.5;
    mix-blend-mode:screen;
  }
  .a1{width:46vw;height:46vw;left:-12vw;top:-14vw;background:#ff2d78;animation:float1 16s ease-in-out infinite}
  .a2{width:38vw;height:38vw;right:-10vw;top:6vh;background:#7c3aed;animation:float2 19s ease-in-out infinite}
  .a3{width:34vw;height:34vw;left:35vw;bottom:-16vw;background:#06b6d4;animation:float3 22s ease-in-out infinite}
  @keyframes float1{50%{transform:translate(8vw,10vh) scale(1.15)}}
  @keyframes float2{50%{transform:translate(-9vw,7vh) scale(1.2)}}
  @keyframes float3{50%{transform:translate(5vw,-8vh) scale(1.1)}}
  #like:checked ~ .bg .aurora{animation-duration:7s;filter:blur(70px) saturate(1.6) hue-rotate(90deg)}

  .flash{
    position:fixed;inset:0;z-index:60;pointer-events:none;opacity:0;
    background:radial-gradient(circle at 50% 46%,rgba(255,255,255,.95) 0%,rgba(255,45,120,.6) 22%,rgba(139,92,246,.35) 45%,transparent 70%);
  }
  #like:checked ~ .flash{animation:flash .55s ease-out}
  @keyframes flash{0%{opacity:0}12%{opacity:.85}100%{opacity:0}}

  /* ============ LAYOUT ============ */
  .wrap{
    position:relative;z-index:2;min-height:100vh;display:flex;align-items:center;justify-content:center;
    padding:28px 16px;
  }
  .card{
    position:relative;width:min(520px,100%);
    padding:30px 26px 26px;border-radius:30px;text-align:center;
    background:linear-gradient(160deg,rgba(255,255,255,.10),rgba(255,255,255,.03));
    border:1px solid rgba(255,255,255,.16);
    box-shadow:0 30px 70px rgba(0,0,0,.55),inset 0 1px 0 rgba(255,255,255,.22);
    backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);
    transition:transform .3s cubic-bezier(.2,.9,.2,1),box-shadow .3s;
    transform-style:preserve-3d;
  }
  .card:hover{transform:perspective(900px) rotateX(5deg) rotateY(-5deg) translateY(-4px);box-shadow:0 40px 90px rgba(0,0,0,.6),inset 0 1px 0 rgba(255,255,255,.3)}
  #like:checked ~ .wrap .card{animation:shake .75s cubic-bezier(.36,.07,.19,.97) both}
  @keyframes shake{
    0%{transform:translate(0,0) rotate(0)}
    12%{transform:translate(-9px,5px) rotate(-1.4deg)}
    25%{transform:translate(8px,-6px) rotate(1.2deg)}
    38%{transform:translate(-7px,-3px) rotate(-1deg)}
    50%{transform:translate(6px,4px) rotate(.9deg)}
    62%{transform:translate(-5px,2px) rotate(-.6deg)}
    75%{transform:translate(4px,-2px) rotate(.4deg)}
    88%{transform:translate(-2px,1px) rotate(-.2deg)}
    100%{transform:translate(0,0) rotate(0)}
  }

  .pill{
    display:inline-flex;align-items:center;gap:8px;padding:7px 14px;border-radius:999px;
    font-size:11px;font-weight:700;letter-spacing:.16em;text-transform:uppercase;
    color:#bfe7ff;background:rgba(34,211,238,.12);border:1px solid rgba(34,211,238,.35);
  }
  .live{width:7px;height:7px;border-radius:50%;background:#22d3ee;box-shadow:0 0 10px #22d3ee;animation:blink 1.4s infinite}
  @keyframes blink{50%{opacity:.25;transform:scale(.7)}}

  h1{margin:16px 0 6px;font-size:clamp(28px,6vw,40px);line-height:1.05;font-weight:800;letter-spacing:-.02em}
  .grad{background:linear-gradient(90deg,#ff2d78,#ff8a3d,#ffd166,#22d3ee,#8b5cf6);background-size:300% 100%;
    -webkit-background-clip:text;background-clip:text;color:transparent;animation:slide 6s linear infinite}
  @keyframes slide{to{background-position:300% 0}}
  .sub{margin:0 0 6px;color:#a8b3d6;font-size:14.5px;line-height:1.55}

  /* ============ STAGE ============ */
  .stage{position:relative;height:230px;display:flex;align-items:center;justify-content:center;margin-top:10px}

  /* orbiting decorative sparkles (idle hint) */
  .orbit{position:absolute;left:50%;top:50%;width:230px;height:230px;margin:-115px 0 0 -115px;border-radius:50%;
    border:1.5px dashed rgba(255,255,255,.16);animation:spin 26s linear infinite}
  .orbit::after{content:'';position:absolute;top:-5px;left:50%;width:9px;height:9px;margin-left:-4.5px;border-radius:50%;
    background:#ffd166;box-shadow:0 0 14px #ffd166,0 0 30px rgba(255,209,102,.6)}
  @keyframes spin{to{transform:rotate(360deg)}}

  .halo{position:absolute;left:50%;top:50%;width:150px;height:150px;margin:-75px 0 0 -75px;border-radius:50%;
    background:radial-gradient(circle,rgba(255,45,120,.30),transparent 70%);opacity:0;transform:scale(.7);transition:opacity .3s}
  #like:checked ~ .wrap .halo{animation:halo 1.6s ease-out infinite}
  @keyframes halo{
    0%{opacity:.9;transform:scale(.6)}
    70%{opacity:0;transform:scale(1.5)}
    100%{opacity:0;transform:scale(1.5)}
  }

  /* rays */
  .rays{position:absolute;left:50%;top:50%;width:620px;height:620px;margin:-310px 0 0 -310px;opacity:0;border-radius:50%}
  .rays::before{content:'';position:absolute;inset:0;border-radius:50%;
    background:repeating-conic-gradient(from 0deg,rgba(255,45,120,.40) 0deg 2.4deg,rgba(139,92,246,.28) 2.4deg 4.8deg,rgba(255,209,102,.22) 4.8deg 7deg,transparent 7deg 16deg);
    -webkit-mask-image:radial-gradient(circle,#000 8%,rgba(0,0,0,.55) 40%,transparent 70%);
    mask-image:radial-gradient(circle,#000 8%,rgba(0,0,0,.55) 40%,transparent 70%);
    animation:spin 9s linear infinite}
  #like:checked ~ .wrap .rays{animation:rayOut 1.35s cubic-bezier(.15,.85,.25,1) forwards}
  @keyframes rayOut{0%{opacity:0;transform:scale(.4) rotate(0)}18%{opacity:1}100%{opacity:0;transform:scale(1.35) rotate(120deg)}}

  /* shockwave rings */
  .rings{position:absolute;left:50%;top:50%;width:0;height:0}
  .rings span{position:absolute;left:50%;top:50%;width:150px;height:150px;margin:-75px 0 0 -75px;border-radius:50%;
    border:6px solid rgba(255,45,120,.9);opacity:0}
  .rings span:nth-child(2){border-color:rgba(139,92,246,.9)}
  .rings span:nth-child(3){border-color:rgba(34,211,238,.9)}
  #like:checked ~ .wrap .rings span{animation:ring .95s cubic-bezier(.15,.75,.3,1) forwards}
  #like:checked ~ .wrap .rings span:nth-child(2){animation-delay:.13s}
  #like:checked ~ .wrap .rings span:nth-child(3){animation-delay:.26s}
  @keyframes ring{
    0%{transform:scale(.15);opacity:.95;border-width:14px}
    100%{transform:scale(2.9);opacity:0;border-width:1px}
  }

  /* particles */
  .particles{position:absolute;left:50%;top:50%;width:0;height:0}
  .particles span{position:absolute;left:-7px;top:-7px;width:14px;height:14px;border-radius:50%;
    background:hsl(var(--h) 95% 62%);box-shadow:0 0 14px hsl(var(--h) 95% 62%),0 0 30px hsla(var(--h),95%,62%,.5);
    opacity:0}
  .particles span:nth-child(3n){border-radius:2px;transform:rotate(45deg)}
  .particles span:nth-child(4n){
    border-radius:0;width:18px;height:18px;left:-9px;top:-9px;
    clip-path:polygon(50% 0%,60% 40%,100% 50%,60% 60%,50% 100%,40% 60%,0% 50%,40% 40%);
    background:hsl(var(--h) 100% 72%)}
  .particles span:nth-child(5n){width:9px;height:9px;left:-4.5px;top:-4.5px}
  #like:checked ~ .wrap .particles span{animation:burst .95s cubic-bezier(.12,.8,.25,1) forwards;animation-delay:var(--d)}
  @keyframes burst{
    0%{transform:translate(0,0) scale(0) rotate(0);opacity:1}
    55%{opacity:1}
    100%{transform:translate(var(--tx),var(--ty)) scale(1.15) rotate(var(--rot));opacity:0}
  }

  /* confetti */
  .confetti{position:absolute;left:50%;top:50%;width:0;height:0}
  .confetti span{position:absolute;left:-4px;top:-7px;width:8px;height:14px;border-radius:2px;
    background:hsl(var(--h) 92% 60%);box-shadow:0 0 10px hsla(var(--h),92%,60%,.6);opacity:0}
  #like:checked ~ .wrap .confetti span{animation:confetti 1.5s cubic-bezier(.2,.6,.35,1) forwards;animation-delay:var(--d)}
  @keyframes confetti{
    0%{transform:translate(0,0) rotate(0) scale(1);opacity:1}
    40%{transform:translate(calc(var(--tx) * .55),calc(var(--ty) * -.55)) rotate(calc(var(--rot) * .45));opacity:1}
    100%{transform:translate(var(--tx),var(--ty)) rotate(var(--rot)) scale(.85);opacity:0}
  }

  /* rising hearts */
  .rise{position:absolute;left:50%;top:50%;margin:-12px 0 0 -12px;font-size:22px;color:#ff5c8a;opacity:0;
    text-shadow:0 0 14px rgba(255,45,120,.9)}
  #like:checked ~ .wrap .rise{animation:rise 2.8s ease-out infinite;animation-delay:var(--d)}
  @keyframes rise{
    0%{transform:translate(0,0) scale(.25);opacity:0}
    14%{opacity:.95}
    100%{transform:translate(var(--x),-290px) scale(1.25) rotate(var(--r));opacity:0}
  }

  /* burst word */
  .word{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);opacity:0;pointer-events:none;
    font-size:clamp(26px,6vw,40px);font-weight:900;letter-spacing:.04em;white-space:nowrap;
    background:linear-gradient(90deg,#fff,#ffd166,#ff2d78,#22d3ee);
    -webkit-background-clip:text;background-clip:text;color:transparent;
    filter:drop-shadow(0 0 18px rgba(255,45,120,.75))}
  #like:checked ~ .wrap .word{animation:wordpop 1.15s cubic-bezier(.2,.9,.25,1) forwards}
  @keyframes wordpop{
    0%{transform:translate(-50%,-30%) scale(.3) rotate(-12deg);opacity:0}
    22%{transform:translate(-50%,-55%) scale(1.25) rotate(4deg);opacity:1}
    55%{transform:translate(-50%,-60%) scale(1) rotate(0);opacity:1}
    100%{transform:translate(-50%,-95%) scale(.9);opacity:0}
  }

  /* ============ BUTTON ============ */
  .btn{
    position:relative;display:inline-flex;align-items:center;gap:12px;cursor:pointer;
    padding:14px 30px 14px 22px;border-radius:999px;user-select:none;-webkit-user-select:none;
    background:linear-gradient(140deg,rgba(255,255,255,.16),rgba(255,255,255,.05));
    border:1.5px solid rgba(255,255,255,.25);
    box-shadow:0 12px 34px rgba(0,0,0,.45),inset 0 1px 0 rgba(255,255,255,.35);
    transition:transform .18s cubic-bezier(.2,.9,.3,1.4),box-shadow .3s,background .3s,border-color .3s;
    outline:none;
  }
  .btn:hover{transform:translateY(-3px) scale(1.03)}
  .btn:active{transform:translateY(0) scale(.97)}
  #like:checked ~ .wrap .btn{
    background:linear-gradient(140deg,#ff2d78,#ff4d6d 45%,#ff8a3d);
    border-color:rgba(255,255,255,.55);
    box-shadow:0 0 0 4px rgba(255,45,120,.18),0 18px 44px rgba(255,45,120,.5),inset 0 1px 0 rgba(255,255,255,.5);
    animation:btnGlow 1.5s ease-in-out infinite;
  }
  @keyframes btnGlow{
    0%,100%{box-shadow:0 0 0 4px rgba(255,45,120,.16),0 18px 44px rgba(255,45,120,.45),inset 0 1px 0 rgba(255,255,255,.5)}
    50%{box-shadow:0 0 0 12px rgba(255,45,120,0),0 22px 60px rgba(255,45,120,.75),inset 0 1px 0 rgba(255,255,255,.6)}
  }
  #like:focus-visible ~ .wrap .btn{outline:3px solid #22d3ee;outline-offset:5px}

  .heart{width:34px;height:34px;flex:none;fill:#fff;filter:drop-shadow(0 3px 6px rgba(0,0,0,.4));
    animation:beat 1.5s ease-in-out infinite;transform-origin:50% 55%}
  #like:checked ~ .wrap .heart{
    fill:#fff;
    animation:pop .85s cubic-bezier(.2,1.5,.35,1),beat 1.5s ease-in-out .85s infinite;
  }
  @keyframes beat{0%,100%{transform:scale(1)}12%{transform:scale(1.14)}24%{transform:scale(1)}36%{transform:scale(1.09)}}
  @keyframes pop{
    0%{transform:scale(1) rotate(0)}
    18%{transform:scale(.55) rotate(-16deg)}
    42%{transform:scale(1.55) rotate(12deg)}
    60%{transform:scale(.9) rotate(-7deg)}
    78%{transform:scale(1.16) rotate(4deg)}
    100%{transform:scale(1) rotate(0)}
  }

  .txt{position:relative;display:inline-block;min-width:76px;text-align:left;font-weight:800;font-size:19px;letter-spacing:.01em}
  .txt .off{transition:transform .35s cubic-bezier(.2,.9,.2,1),opacity .25s}
  .txt .on{position:absolute;left:0;top:0;width:100%;opacity:0;transform:translateY(16px);
    transition:transform .38s cubic-bezier(.2,1.4,.35,1),opacity .25s}
  #like:checked ~ .wrap .txt .off{opacity:0;transform:translateY(-16px)}
  #like:checked ~ .wrap .txt .on{opacity:1;transform:translateY(0)}

  .count{position:relative;display:inline-block;min-width:52px;text-align:right;font-weight:700;font-size:15px;color:#cdd8f7}
  .count .c-on{position:absolute;right:0;top:0;opacity:0;transform:translateY(10px);transition:.3s}
  #like:checked ~ .wrap .count .c-off{opacity:0;transform:translateY(-10px)}
  #like:checked ~ .wrap .count .c-on{opacity:1;transform:translateY(0);animation:bump .6s cubic-bezier(.2,1.7,.3,1)}
  @keyframes bump{0%{transform:scale(1)}40%{transform:scale(1.6)}100%{transform:scale(1)}}

  /* ============ FOOTER ============ */
  .foot{margin-top:6px;display:flex;align-items:center;justify-content:center;gap:14px;flex-wrap:wrap;
    color:#93a0c6;font-size:13px}
  .status{display:inline-flex;align-items:center;gap:8px;padding:6px 12px;border-radius:999px;
    background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.12);font-weight:600}
  .dot{width:8px;height:8px;border-radius:50%;background:#64748b;transition:.3s}
  #like:checked ~ .wrap .dot{background:#22c55e;box-shadow:0 0 12px #22c55e}
  .s-off,.s-on{position:relative;display:inline-block}
  .s-on{position:absolute;left:0;top:0;width:100%;opacity:0;transform:translateY(9px);transition:.3s}
  #like:checked ~ .wrap .s-off{opacity:0;transform:translateY(-9px)}
  #like:checked ~ .wrap .s-on{opacity:1;transform:translateY(0)}

  .tip{position:absolute;left:50%;bottom:-4px;transform:translateX(-50%);white-space:nowrap;
    font-size:12px;font-weight:700;letter-spacing:.12em;text-transform:uppercase;color:#8ea0d0;
    animation:bob 1.8s ease-in-out infinite}
  .tip span{display:inline-block;animation:bob 1.8s ease-in-out infinite}
  @keyframes bob{0%,100%{transform:translateY(0)}50%{transform:translateY(6px)}}

  @media (max-width:420px){
    .card{padding:24px 18px 22px;border-radius:24px}
    .stage{height:200px}
    .orbit{width:190px;height:190px;margin:-95px 0 0 -95px}
    .btn{padding:12px 24px 12px 18px;gap:10px}
    .heart{width:28px;height:28px}
    .txt{font-size:17px;min-width:66px}
    .tip{font-size:10.5px;letter-spacing:.08em}
  }
  @media (prefers-reduced-motion:reduce){
    *{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important}
  }
</style>
</head>
<body>

<!-- ============ THE ONLY SOURCE OF TRUTH: A CHECKBOX ============ -->
<input type="checkbox" id="like" class="sr-only">

<div class="bg">
  <div class="grid"></div>
  <div class="aurora a1"></div>
  <div class="aurora a2"></div>
  <div class="aurora a3"></div>
</div>
<div class="flash"></div>

<div class="wrap">
  <div class="card">

    <div class="pill"><span class="live"></span>Pure CSS · 0 bytes of JavaScript</div>
    <h1>Give it a <span class="grad">like</span></h1>
    <p class="sub">A hidden <code>:checked</code> selector drives the whole explosion — hearts, shockwaves, confetti and all.</p>

    <div class="stage">

      <!-- idle decorations -->
      <div class="orbit"></div>
      <div class="halo"></div>
      <div class="rays"></div>

      <!-- shockwave rings -->
      <div class="rings" aria-hidden="true"><span></span><span></span><span></span></div>

      <!-- radial particles -->
      <div class="particles" aria-hidden="true">
        <span style="--tx:150px;--ty:0px;--rot:200deg;--h:340;--d:0ms"></span>
        <span style="--tx:145px;--ty:48px;--rot:-140deg;--h:20;--d:20ms"></span>
        <span style="--tx:124px;--ty:93px;--rot:320deg;--h:280;--d:40ms"></span>
        <span style="--tx:92px;--ty:126px;--rot:-90deg;--h:190;--d:60ms"></span>
        <span style="--tx:48px;--ty:149px;--rot:410deg;--h:45;--d:80ms"></span>
        <span style="--tx:0px;--ty:156px;--rot:-250deg;--h:160;--d:100ms"></span>
        <span style="--tx:-48px;--ty:150px;--rot:180deg;--h:320;--d:120ms"></span>
        <span style="--tx:-93px;--ty:128px;--rot:-330deg;--h:15;--d:140ms"></span>
        <span style="--tx:-125px;--ty:92px;--rot:260deg;--h:240;--d:160ms"></span>
        <span style="--tx:-146px;--ty:47px;--rot:-70deg;--h:60;--d:180ms"></span>
        <span style="--tx:-152px;--ty:0px;--rot:390deg;--h:300;--d:200ms"></span>
        <span style="--tx:-146px;--ty:-48px;--rot:-160deg;--h:175;--d:220ms"></span>
        <span style="--tx:-124px;--ty:-93px;--rot:120deg;--h:35;--d:240ms"></span>
        <span style="--tx:-92px;--ty:-126px;--rot:-300deg;--h:265;--d:260ms"></span>
        <span style="--tx:-48px;--ty:-149px;--rot:210deg;--h:95;--d:280ms"></span>
        <span style="--tx:0px;--ty:-156px;--rot:-120deg;--h:330;--d:300ms"></span>
        <span style="--tx:48px;--ty:-150px;--rot:330deg;--h:205;--d:320ms"></span>
        <span style="--tx:93px;--ty:-128px;--rot:-220deg;--h:50;--d:340ms"></span>
        <span style="--tx:125px;--ty:-92px;--rot:160deg;--h:285;--d:360ms"></span>
        <span style="--tx:146px;--ty:-47px;--rot:-40deg;--h:120;--d:380ms"></span>
        <span style="--tx:70px;--ty:70px;--rot:520deg;--h:355;--d:400ms"></span>
        <span style="--tx:-70px;--ty:-70px;--rot:-520deg;--h:75;--d:420ms"></span>
      </div>

      <!-- confetti -->
      <div class="confetti" aria-hidden="true">
        <span style="--tx:-60px;--ty:230px;--rot:640deg;--h:340;--d:0ms"></span>
        <span style="--tx:72px;--ty:210px;--rot:-540deg;--h:190;--d:40ms"></span>
        <span style="--tx:-16px;--ty:265px;--rot:760deg;--h:45;--d:80ms"></span>
        <span style="--tx:118px;--ty:250px;--rot:-690deg;--h:280;--d:120ms"></span>
        <span style="--tx:-124px;--ty:245px;--rot:560deg;--h:160;--d:160ms"></span>
        <span style="--tx:34px;--ty:290px;--rot:-820deg;--h:95;--d:200ms"></span>
        <span style="--tx:-96px;--ty:285px;--rot:480deg;--h:310;--d:240ms"></span>
        <span style="--tx:98px;--ty:295px;--rot:-610deg;--h:55;--d:280ms"></span>
        <span style="--tx:-40px;--ty:205px;--rot:900deg;--h:240;--d:320ms"></span>
        <span style="--tx:52px;--ty:195px;--rot:-470deg;--h:350;--d:360ms"></span>
        <span style="--tx:-140px;--ty:200px;--rot:720deg;--h:205;--d:400ms"></span>
        <span style="--tx:140px;--ty:200px;--rot:-700deg;--h:125;--d:440ms"></span>
      </div>

      <!-- rising hearts -->
      <div aria-hidden="true">
        <span class="rise" style="--x:-70px;--r:-25deg;--d:0s">&#9829;</span>
        <span class="rise" style="--x:66px;--r:22deg;--d:.35s">&#9829;</span>
        <span class="rise" style="--x:-30px;--r:14deg;--d:.7s">&#10084;</span>
        <span class="rise" style="--x:34px;--r:-18deg;--d:1.05s">&#9829;</span>
        <span class="rise" style="--x:-105px;--r:30deg;--d:1.4s">&#10084;</span>
        <span class="rise" style="--x:104px;--r:-30deg;--d:1.75s">&#9829;</span>
      </div>

      <!-- the label IS the button -->
      <label class="btn" for="like" title="Click to like (toggle)">
        <svg class="heart" viewBox="0 0 24 24" aria-hidden="true">
          <path d="M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z"/>
        </svg>
        <span class="txt"><span class="off">Like</span><span class="on">Liked!</span></span>
        <span class="count"><span class="c-off">1,284</span><span class="c-on">1,285</span></span>
      </label>

      <div class="word" aria-hidden="true">LIKED!</div>
      <div class="tip" aria-hidden="true"><span>click the heart</span></div>
    </div>

    <div class="foot">
      <span class="status"><span class="dot"></span>
        <span class="s-off">Not liked yet</span><span class="s-on">You liked this &#10084;</span>
      </span>
      <span>Click the heart again to undo</span>
    </div>
  </div>
</div>

</body>
</html>
Reasoning trace (7,133 tokens)
The user wants a pure CSS like button with a crazy animation on click. No JavaScript. Let me make something visually impressive.

Key: Use a hidden checkbox (or radio) + label, and CSS `:checked` to trigger animations. Pure CSS, no JS.

Let me design:
- A big heart that beats/pulses
- On check: heart explodes with particles, rings, shockwaves, rainbow flash, confetti, screen shake, floating hearts
- CSS keyframes with staggered delays using nth-child
- Uses CSS custom properties for particle directions

I should make it look polished: dark gradient background, glow, glassy card.

Let me build:

```
<div class="stage">
  <div class="card">
    <h1>Pure CSS Like</h1>
    <p>No JavaScript. Just a checkbox.</p>
    <input type="checkbox" id="like" hidden>
    <label for="like" class="heart-wrap">
      <span class="heart"> ... svg or css shape
    </label>
    <div class="count">1,284 likes</div>
  </div>
  <div class="fx"> particles </div>
</div>
```

Particles: 16 spans with `--tx`, `--ty` custom properties defined per nth-child. On `#like:checked ~ .fx .particle` animate outward.

Also add:
- Expanding rings
- Radiating rays (conic gradient rotating)
- Confetti strips
- Floating emoji hearts rising
- Screen shake on the card
- Counter "pop"
- Text change "Liked!" via checkbox sibling selectors

Also, to make it re-triggerable: with a checkbox, unchecking resets. Toggling again re-runs animations because the selector applies again. But the animation might not restart if the element remains in the same state — actually when it goes from unchecked to checked, the animation rule applies fresh, so it restarts. Good.

To make it feel like "crazy", I'll add:
- A colorful flash overlay
- The button morphing into a glowing orb
- Sparkles
- A ring pulse
- Background hue-rotate shift
- Confetti burst

Let me write the heart using an SVG inline (allowed, no external file). Inline SVG in HTML is fine.

Actually maybe better: draw the heart with CSS using two circles and a rotated square — but inline SVG is cleaner and can animate with CSS.

I'll use an inline SVG path for the heart.

Let me also add multiple hearts floating up continuously after liked (animation on `.hearts .h` with play state tied to checked).

Layout: centered card, 1280x800 fine. Responsive down to 375.

Let me write the code carefully.

Structure:

```html
<body>
  <div class="bg-grid"></div>
  <div class="aurora"></div>
  <div class="wrap">
    <div class="card" id="card">
      <div class="badge">Pure CSS · Zero JavaScript</div>
      <h1>Like this post</h1>
      <p class="sub">One hidden checkbox drives the entire explosion.</p>

      <div class="like-area">
        <input type="checkbox" id="like" />
        <label for="like" class="btn" tabindex="0">
          <span class="btn-glow"></span>
          <span class="btn-ripple"></span>
          <svg class="icon heart" viewBox="0 0 24 24">...</svg>
          <span class="label-text"><span class="t-off">Like</span><span class="t-on">Liked</span></span>
          <span class="count">1,284</span>
        </label>
        <div class="burst"> ... particles ... </div>
      </div>

      <div class="status">
        <span class="dot"></span>
        <span class="status-text off">Not liked</span>  ...
      </div>
    </div>
  </div>
</body>
```

Careful: sibling selector for the burst must be after the input in the DOM, or use `#like:checked ~ .like-area ...`. Since `#like` is inside `.like-area` before the label, I can use `#like:checked ~ .burst .particle`. Let me put the input as first child of `.like-area` and then everything else as siblings. Good.

For the card shake, I need the checkbox to be a sibling of the card or use `:has()`. `:has()` is supported in modern Chrome. But to be safe, I could place the input at the body level as the very first element and then use `#like:checked ~ .wrap .card { animation: shake ... }`. That's robust. Let's do that: put `<input id="like" type="checkbox">` as first child of body, hidden but focusable (use visually-hidden, not display:none so label works — actually `display:none` inputs still work with labels in Chrome; clicking a label toggles a display:none checkbox? Yes, label click still activates it. But safer to use opacity/position off-screen). I'll use the standard sr-only clip approach.

Then:
- `#like:checked ~ .wrap .card { animation: shake .6s }`
- `#like:checked ~ .wrap .btn .heart { animation: pop ... }`
- etc.

Since input is a sibling of .wrap at body level, selectors work.

Also `#like:focus-visible ~ .wrap .btn { outline ... }` for keyboard accessibility.

Now the "crazy animation" elements:

1. **Heart pop** — scales up, squishes, rotates, with color change.
2. **Shockwave rings** — 3 expanding circles with staggered delays, fading.
3. **Particles** — 20 dots/sparkles flying outward in varied directions with rotation and fade.
4. **Rays** — a conic-gradient starburst behind the button that spins and fades.
5. **Confetti** — small rectangles falling from the button.
6. **Floating hearts** — rise upward and fade, several with different sizes/delays.
7. **Background flash** — full-screen radial gradient flash.
8. **Card shake** + hue rotate of the aurora background.
9. **Button color morph** — gradient shift.
10. **Text swap** with a slide-up.
11. **Count bump** — scale pulse.
12. **Sparkle ring** — rotating dashed circle.

Let's define particles with CSS variables. I'll write nth-child rules for 20 particles with --tx/--ty/--rot/--delay/--size/--hue.

That's a lot of manual CSS but fine. Let me generate values.

Particle angles: distribute around circle. Using unit circle offsets: x = cos(a)*dist, y = sin(a)*dist.

Let me pick 20 angles evenly: a_i = i*18deg.
cos/sin values:
- 0°: (1, 0)
- 18°: (0.951, 0.309)
- 36°: (0.809, 0.588)
- 54°: (0.588, 0.809)
- 72°: (0.309, 0.951)
- 90°: (0, 1)
- 108°: (-0.309, 0.951)
- 126°: (-0.588, 0.809)
- 144°: (-0.809, 0.588)
- 162°: (-0.951, 0.309)
- 180°: (-1, 0)
- 198°: (-0.951, -0.309)
- 216°: (-0.809, -0.588)
- 234°: (-0.588, -0.809)
- 252°: (-0.309, -0.951)
- 270°: (0, -1)
- 288°: (0.309, -0.951)
- 306°: (0.588, -0.809)
- 324°: (0.809, -0.588)
- 342°: (0.951, -0.309)

Multiply by ~150px distance with some jitter: --tx: calc(var(--d) * cos) etc. Simpler: just write px values directly.

Let me set dist ~ 130-170 px.

i0: tx 150, ty 0
i1: tx 145, ty 47
i2: tx 125, ty 92
i3: tx 92, ty 125
i4: tx 48, ty 148
i5: tx 0, ty 155
i6: tx -48, ty 150
i7: tx -92, ty 128
i8: tx -125, ty 92
i9: tx -145, ty 47
i10: tx -150, ty 0
i11: tx -145, ty -47
i12: tx -125, ty -92
i13: tx -92, ty -125
i14: tx -48, ty -148
i15: tx 0, ty -155
i16: tx 48, ty -150
i17: tx 92, ty -128
i18: tx 125, ty -92
i19: tx 145, ty -47

Good. Particles use transform: translate(var(--tx), var(--ty)) scale(0) -> ... -> translate scaled.

Animation:
```
@keyframes burst {
  0% { transform: translate(0,0) scale(0) rotate(0); opacity: 1 }
  60% { opacity: 1 }
  100% { transform: translate(var(--tx), var(--ty)) scale(1) rotate(var(--rot)); opacity: 0 }
}
```
Hmm rotate after translate rotates around own center fine.

Sparkle shape: use a 4-point star via clip-path or just circles with box-shadow. I'll use small circles with gradient colors and some as diamonds via clip-path polygon.

Confetti: 12 rects with different --tx, --ty, --rot, colors, animated with gravity-ish.

Rings: 3 spans with animation expanding scale 0->4 and opacity fading.

Let me also make a "boom" text that appears: "💥" ? Maybe a big "POP!" word that scales up and fades. Could use ::after on the burst container with content "LIKED!" Actually let's add a `.word` element with "LIKE!" that arcs up.

Also the aurora background hue-rotates when checked and continues rotating (animation on checked only). Use `#like:checked ~ .aurora { animation: hue 6s linear infinite }`.

Also add continuous floating hearts in background always? Better: on liked, a stream of hearts rises from the button continuously (animation infinite with play-state). Use `#like:checked ~ ... .heart-rise { animation: rise 2.4s ease-out infinite }` with staggered delays.

Let me write it.

Also need a "reset" affordance: clicking the heart again unlikes. Mention "click again to unlike".

Also keyboard: label with tabindex and for= attribute; pressing space on focused label toggles checkbox? Label with tabindex="0" — pressing space on a label does not toggle. But the input itself could be focusable: instead of sr-only hiding, keep input focusable but visually hidden with opacity 0 and position absolute over the button, so clicking the button directly hits the input? That's tricky. Alternative: make the input visually hidden but focusable (sr-only), and add `#like:focus-visible ~ .wrap .btn` outline. Keyboard users press Space on the focused input → toggles. That works if input is focusable. Use the classic sr-only clip technique which keeps focusability.

But input is at body level, so `:focus-visible` selector `#like:focus-visible ~ .wrap .btn`. Fine.

Also the input at body level — I want the label to reference it; `for="like"` works anywhere.

Let me also handle the counter text: "1,284" → "1,285" when liked. Use two spans toggled.

Now write CSS with nice visuals:

Background: deep navy/violet gradient with animated aurora blobs and subtle grid.

Card: glassmorphism, rounded 28px, border 1px rgba(255,255,255,.12), backdrop-filter blur, box-shadow.

Button: pill shape with gradient border, when liked gradient turns to pink/red with animated hue shift.

Let me write everything.

One more "crazy" element: the whole card tilts in 3D on hover (transform-style preserve-3d, perspective). And on liked, a 3D rotation flip? Let's add: when checked, the card does a quick 3D flip/shake.

Also add a lightning-ish zigzag SVG flash? Maybe overkill. I'll add a "zap" bolt that appears.

Let me also add screen-wide flash overlay: `#like:checked ~ .flash { animation: flash .5s ease-out }` with a radial-gradient pink/white.

Let's write the final code.

CSS animation restart on re-toggle: since animations are bound to `:checked` state, toggling off removes them; toggling on re-adds → restarts. Good.

Note: `#like:checked ~ .wrap .btn` — the `.wrap` is a sibling of input. I'll put input as first child of body.

Detailed CSS:

```css
:root{
  --pink:#ff2d78;
  --red:#ff5a5f;
  --violet:#8b5cf6;
  --cyan:#22d3ee;
}
```

Now, particle colors: use hsl with different hues.

Let me write the HTML.

```html
<input type="checkbox" id="like" class="sr-only">
<div class="flash"></div>
<div class="aurora a1"></div>
<div class="aurora a2"></div>
<div class="aurora a3"></div>
<div class="wrap">
  <div class="card">
    <div class="pill"><span class="live"></span>PURE CSS · NO JAVASCRIPT</div>
    <h1>Give it a <span class="grad">like</span></h1>
    <p class="sub">A hidden checkbox drives a full-blown explosion. Pure CSS, zero scripts.</p>

    <div class="stage">
      <div class="rays"></div>
      <div class="rings"><span></span><span></span><span></span></div>
      <div class="particles">...20 spans...</div>
      <div class="confetti">...12 spans...</div>

      <label class="btn" for="like">
        <span class="btn-bg"></span>
        <svg class="heart" viewBox="0 0 24 24"><path d="M12 21s-8.5-5.3-8.5-11A4.9 4.9 0 0 1 12 6.6 4.9 4.9 0 0 1 20.5 10c0 5.7-8.5 11-8.5 11z"/></svg>
        <span class="txt"><span class="off">Like</span><span class="on">Liked!</span></span>
      </label>
      <div class="rise-wrap">
        <span class="rise" style="--x:-60px;--d:0s">♥</span>...
      </div>
    </div>
    <div class="foot">
      <span class="count"><span class="c-off">1,284</span><span class="c-on">1,285</span></span>
      <span class="hint">Click the heart again to undo</span>
    </div>
  </div>
</div>
```

The `.on`/`.off` text swapping: use two spans stacked and toggle opacity/transform.

Heart path: standard material heart path: "M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z" — good.

Now particles must be behind/around the button. `.stage` is position:relative with the button centered.

Particles are absolutely positioned centered at the button: left:50%; top:50%; margin-left:-6px; margin-top:-6px.

Let's write the code now. I'll be careful about the `hidden` sr-only input.

sr-only:
```css
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0;}
```

Focus visible outline on button.

Now write keyframes.

Heart pop:
```
@keyframes pop{
 0%{transform:scale(1) rotate(0)}
 20%{transform:scale(.6) rotate(-14deg)}
 45%{transform:scale(1.45) rotate(10deg)}
 60%{transform:scale(.92) rotate(-6deg)}
 75%{transform:scale(1.12) rotate(3deg)}
 100%{transform:scale(1) rotate(0)}
}
```
With fill-mode forwards? Use `animation: pop .8s cubic-bezier(.2,1.4,.3,1)`.

Also heart fill color: default white/grey, when liked gradient pink→red with a pulse glow.

Rays: conic-gradient with repeating transparent/colored segments, masked with radial-gradient to fade edges, spinning.

```
.rays{
 position:absolute; left:50%; top:50%; width:520px;height:520px;margin:-260px 0 0 -260px;
 background: conic-gradient(from 0deg, rgba(255,45,120,.55) 0 4deg, transparent 4deg 18deg, ... );
}
```
Simpler: repeating-conic-gradient(from 0deg, rgba(255,45,120,.5) 0deg 3deg, transparent 3deg 15deg). Then mask-image: radial-gradient(circle, #000 0%, #000 30%, transparent 70%).

Animate: when checked, spin fast + scale up + fade out then remain? I'd make it spin continuously while checked with opacity animation that spikes. Use two animations: `#like:checked ~ .wrap .rays { animation: rays 1.4s ease-out forwards }` with keyframes combining spin and fade. But to keep spinning, use nested: outer `.rays` handles fade/scale, inner `.rays-inner` handles spin infinite. Let's just do: `.rays { animation: raySpin 6s linear infinite, rayFade 1.2s ease-out forwards }` — multiple animations both affecting transform conflict. Instead: outer element `.rays` does fade+scale, inner `::before` spins. I'll use `.rays::before` for the spinning cone and `.rays` for fade/scale.

Rings:
```
@keyframes ring{
 0%{transform:scale(.2);opacity:.9;border-width:10px}
 100%{transform:scale(2.6);opacity:0;border-width:1px}
}
```
Three rings with delays 0, .12s, .24s and different colors.

Confetti: rectangles falling:
```
@keyframes confetti{
 0%{transform:translate(0,0) rotate(0);opacity:1}
 100%{transform:translate(var(--tx), var(--ty)) rotate(var(--rot));opacity:0}
}
```
with --ty positive large (fall down) and some up then down — just use varied values.

Rising hearts:
```
@keyframes rise{
 0%{transform:translate(0,0) scale(.4);opacity:0}
 15%{opacity:1}
 100%{transform:translate(var(--x), -260px) scale(1.1);opacity:0}
}
```
Placed at button center bottom, run infinite when checked with staggered delays.

Card shake:
```
@keyframes shake{
 0%,100%{transform:translate3d(0,0,0) rotate(0)}
 10%{transform:translate3d(-8px,4px,0) rotate(-1.2deg)}
 ...
}
```

Also `.card` has hover 3D tilt:
```
.card{transition:transform .25s ease}
.card:hover{transform:perspective(900px) rotateX(6deg) rotateY(-6deg) translateY(-4px)}
```
But when checked the shake animation overrides transform. Animation wins over transition/transform. Fine; after animation ends (no fill-mode), transform returns to hover. Good — use `animation-fill-mode: both`? If forwards, hover tilt lost. Use none; shake ends and hover resumes. Good.

Background flash:
```
@keyframes flash{0%{opacity:0}10%{opacity:.85}100%{opacity:0}}
```

Aurora hue rotate infinite when checked.

Also add a "BOOM" burst word:
```
.word{font-size:34px;font-weight:800;letter-spacing:.06em;background:linear-gradient(...);-webkit-background-clip:text;color:transparent;opacity:0}
#like:checked ~ .wrap .word{animation: wordpop 1s ease-out}
@keyframes wordpop{0%{transform:translate(-50%,0) scale(.4);opacity:0}30%{opacity:1;transform:translate(-50%,-10px) scale(1.1)}100%{transform:translate(-50%,-70px) scale(1);opacity:0}}
```

Also add sparks: tiny 2-ray sparkles.

Also add a rotating dashed ring around the button when liked (like a spinner halo).

Let's finalize. Also need responsive: at small widths reduce particle distances? Particles use fixed px offsets; at 375 width the card is ~335 wide, so 150px offsets might overflow horizontally causing scroll. To avoid horizontal scrollbar, set `overflow:hidden` on body/wrap and stage. The particles are inside `.stage` which is inside `.card`; if I set overflow hidden on body, no horizontal scrollbar. But then effects get clipped by card edges? Card has overflow visible by default; body overflow hidden clips at viewport — fine, looks like a burst going off-screen, acceptable. Better: give `.stage` overflow: visible but body overflow-x: hidden. Let's set `body{overflow-x:hidden}` and also clip stage? I'll keep overflow visible on card but body overflow-x hidden. But vertical overflow of rising hearts could cause scroll... body overflow-x:hidden only affects x; y scroll may appear if content is taller than viewport — content is centered, fine.

Actually, to be safe: `html,body{height:100%; overflow:hidden}` might cut off content on small screens. I'll use overflow-x hidden only, and min-height 100%.

Let me now write the whole thing.

For the count animation, bump scale.

Text swap:
```
.txt .off, .txt .on{transition:transform .35s cubic-bezier(.2,.9,.2,1), opacity .3s}
.txt .on{position:absolute;...}
```
Button uses flex; I'll make `.txt` position relative with fixed min-width and both spans absolutely stacked. Simpler: `.txt{position:relative;display:inline-block;min-width:78px;text-align:center}` `.off{transition:...}` `.on{position:absolute;inset:0;opacity:0;transform:translateY(14px)}` and checked → on: opacity 1, translateY(0); off: opacity 0, translateY(-14px).

Similarly count: `.count{position:relative;display:inline-block}` with two spans.

OK. Let's write.

Also add a subtle "pulse" idle animation on the heart so it's alive before interaction (idle heartbeat) — good for the screenshot.

Also add a hint text "Click or press Space" — since the iframe only receives keyboard events after clicking, but here we don't need keyboard to see anything. Still, keyboard support is nice. Add "Click the heart · or press Space when focused".

I'll also add a floating badge showing "0 bytes of JavaScript".

Final code writing now.

Particle markup: 20 spans. I'll generate with a loop... no JS allowed, so write manually. Fine.

Let me write each particle span with inline style variables? Inline styles are CSS, fine and not JS. Using inline `style="--tx:150px;--ty:0px;--rot:220deg;--h:340;--d:0s"` is allowed (it's HTML/CSS, not JS). That's much more compact. Yes.

Confetti 12 spans with inline styles.

Rising hearts 6 spans.

Let's write.

Colors for particles: `background: hsl(var(--h) 95% 62%)`, with box-shadow glow.

Particle shape variations: give some a diamond via clip-path. I'll add classes `.p` (round), `.d` (diamond), `.s` (sparkle/star via clip-path polygon 4-point). Assign via nth-child in CSS: `.particles span:nth-child(3n){clip-path:polygon(50% 0,61% 39%,100% 50%,61% 61%,50% 100%,39% 61%,0 50%,39% 39%)}` etc.

Let me write the star clip-path: polygon(50% 0%, 60% 40%, 100% 50%, 60% 60%, 50% 100%, 40% 60%, 0% 50%, 40% 40%).

OK final.

Also the rays: use `.rays::before` with the conic gradient and `animation: spin 8s linear infinite` always (subtle), and when checked speed up? Just keep spinning always but fade in when liked.

Let me structure:
```
.rays{position:absolute;...;opacity:0;transition:opacity .3s; }
.rays::before{content:'';position:absolute;inset:0;background:repeating-conic-gradient(from 0deg, rgba(255,45,120,.35) 0deg 2.5deg, rgba(139,92,246,.25) 2.5deg 5deg, transparent 5deg 16deg);-webkit-mask-image:radial-gradient(circle, #000 10%, rgba(0,0,0,.6) 45%, transparent 72%);mask-image:...;animation:spin 14s linear infinite;border-radius:50%}
#like:checked ~ .wrap .rays{animation: rayOut 1.3s cubic-bezier(.2,.8,.2,1) forwards}
```
rayOut: 0% opacity 0 scale .5; 15% opacity 1; 100% opacity 0 scale 1.4.

Hmm scale on .rays while ::before spins — fine.

Also add a "halo" ring around button that pulses when liked.

Let me write final HTML now.

One more consideration: The demo is judged in action at ~3s. The button should be visible and inviting. Also maybe auto-trigger the animation once on load? No JS, so I can't auto-check. But I could use CSS `animation` on load to show a hint pulse. Since a screenshot is taken at 3s without interaction, the initial state should look appealing: idle heart with heartbeat pulse, aurora background, card. Good.

Actually, could I make the checkbox appear "checked" by default using `checked` attribute in HTML? Yes! `<input type="checkbox" id="like" checked>` — then the animation would have already run and finished by 3s (animations don't loop). Hmm, that would show the liked state statically. That could be nice: the demo shows a liked state with the button glowing, and clicking toggles to unliked and back to liked, re-running the explosion. But then the first click would "unlike" (no explosion) — bad for the judge clicking. Better: default unchecked, but make idle state visually rich (heart pulsing, hint arrows). Hmm, but the judge might just screenshot.

Alternative: use CSS to make the explosion run on load as a "preview" and then... no, can't reset a checkbox via CSS.

I think default unchecked with an inviting pulsing button is right. But to guarantee "crazy animation" visible in a screenshot, I could add an idle "sparkle" shimmer around the heart, and a bouncing arrow "click me".

Actually here's a trick: I can have a second, purely decorative element that always plays a mini-burst loop (sparkles orbiting the heart) so the first paint shows motion. Combined with a "Click to explode" badge.

Alternatively: default `checked` and add an animation that plays infinitely when checked for the sparkles/halo, so the liked state looks alive; and the click handler (CSS) toggles to unchecked → the card returns to normal (a "reset"), clicking again explodes. Risky.

Hmm — what about using a `<label>` for the checkbox plus a second label? No.

Another approach: Use a radio group? Not needed.

Better approach: default unchecked. Add an "auto-demo" that plays the burst periodically using CSS animation on decorative elements (not tied to the checkbox) — e.g., a looping sparkle/shimmer ring around the button that hints at the explosion. Then when clicked, the big explosion happens.

I'll do that: an always-on orbiting sparkle ring + pulse.

Let me write it.

Also, we could make the *first* click feel rewarded regardless.

Alright, writing the final code.

CSS for count bump:
```
#like:checked ~ .wrap .c-on{animation:bump .6s cubic-bezier(.2,1.6,.3,1)}
```

Let me now produce the final file.

Also need `#like:checked ~ .wrap .card` shake and `#like:checked ~ .flash`.

Let me write.

For the "hint arrow" bouncing: `.hint-arrow{animation: bob 1.6s ease-in-out infinite}` with text "▼" below the button? Or a pulsing ring around button. I'll add a pulsing dashed circle around the button labeled "click".

Final code below.

Also add "Liked! +1" toast at top of card? The word pop suffices.

Let me write out the HTML fully with inline styles for particles.

I'll write the particle spans:

```html
<div class="particles" aria-hidden="true">
 <span style="--tx:150px;--ty:0px;--rot:200deg;--h:340;--d:0ms"></span>
 ...
</div>
```

20 spans.

Confetti:
```html
<div class="confetti" aria-hidden="true">
 <span style="--tx:-40px;--ty:220px;--rot:520deg;--h:190;--d:0ms"></span>
 ...
</div>
```
Confetti start at button center, fall with rotation, some go up first? Simple: translate to (tx, ty) where ty between 120 and 280, and fade.

Actually confetti usually sprays then falls. I'll do: 0% at center scale 1, 35% at (tx*0.6, ty*-0.6) (up), 100% at (tx, ty) down. Use keyframes with two stops.

```
@keyframes confetti{
 0%{transform:translate(0,0) rotate(0);opacity:1}
 40%{transform:translate(calc(var(--tx)*.6), calc(var(--ty)*-.5)) rotate(calc(var(--rot)*.5));opacity:1}
 100%{transform:translate(var(--tx),var(--ty)) rotate(var(--rot));opacity:0}
}
```
Hmm --ty positive means down at end, and mid uses negative of it = up. Good.

Rising hearts: appear at button and float up:
```
.rise{position:absolute;left:50%;top:50%;margin:-14px 0 0 -14px;color:var(--pink);font-size:22px;opacity:0}
#like:checked ~ .wrap .rise{animation:rise 2.6s ease-out infinite;animation-delay:var(--d)}
@keyframes rise{
0%{transform:translate(0,0) scale(.3);opacity:0}
12%{opacity:.95}
100%{transform:translate(var(--x),-300px) scale(1.2) rotate(var(--r));opacity:0}
}
```

Good. Also add hearts rising even when not liked? No.

Now, write everything. I'll also add `will-change` for perf.

One thing: `#like:checked ~ .wrap ...` — `.wrap` is a sibling of `#like` in body. Input is first child of body. Good.

Write final.