:root{--ink:#3a2d3f;--pink:#ff6f91;--safeT:env(safe-area-inset-top,0px);--safeB:env(safe-area-inset-bottom,0px);--safeL:env(safe-area-inset-left,0px);--safeR:env(safe-area-inset-right,0px)}
*{box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{margin:0;padding:0;min-height:100%;font-family:"Varela Round","Nunito","PingFang HK","Noto Sans TC","Microsoft JhengHei",system-ui,sans-serif;color:var(--ink);background:linear-gradient(160deg,#ffe3ef 0%,#fff6d6 45%,#dff6ff 100%);-webkit-user-select:none;user-select:none}
button{font:inherit;color:inherit;border:0;cursor:pointer;touch-action:manipulation}
.hidden{display:none!important}
#app{min-height:100dvh;padding:calc(var(--safeT) + 10px) calc(var(--safeR) + 14px) calc(var(--safeB) + 14px) calc(var(--safeL) + 14px);display:flex;flex-direction:column;gap:10px;max-width:560px;margin:0 auto}
.top{display:flex;align-items:center;justify-content:space-between;gap:8px}
.pill{background:#fff;border-radius:999px;padding:.4em .95em;font-weight:800;font-size:clamp(13px,3.4vw,16px);box-shadow:0 3px 0 rgba(58,45,63,.12);min-height:40px}
.pill.on{background:#ffd93b}
h1{margin:0;font-size:clamp(22px,6vw,30px);text-align:center}
.sub{margin:0;text-align:center;opacity:.75;font-weight:700;font-size:clamp(13px,3.5vw,16px)}
.modes{display:flex;gap:8px;justify-content:center;flex-wrap:wrap}
.modeBtn{background:#fff;border-radius:18px;padding:.7em 1.1em;font-weight:800;box-shadow:0 4px 0 rgba(58,45,63,.1);min-height:48px}
.modeBtn.on{background:#ff8fc7;color:#fff}
.stage{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;min-height:0}
.prompt{font-size:clamp(16px,4.5vw,22px);font-weight:900;text-align:center;background:rgba(255,255,255,.8);padding:.55em 1em;border-radius:22px;max-width:100%}
.grid{display:grid;gap:10px;width:100%;justify-content:center}
.grid.c3{grid-template-columns:repeat(3,minmax(0,1fr))}
.grid.c2{grid-template-columns:repeat(2,minmax(0,1fr))}
.grid.c4{grid-template-columns:repeat(4,minmax(0,1fr))}
.card{background:#fff;border-radius:22px;aspect-ratio:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;box-shadow:0 5px 0 rgba(58,45,63,.1);padding:8px;min-height:88px;border:3px solid transparent;transition:transform .15s}
.card:active{transform:scale(.94)}
.card .swatch,.card .shape{width:58%;height:58%;border-radius:50%;border:3px solid rgba(58,45,63,.15)}
.card .label{font-size:clamp(12px,3.2vw,15px);font-weight:800;text-align:center;line-height:1.15}
.card.yay{border-color:#52d273;background:#f0fff4;animation:pop .45s}
.card.wiggle{animation:wiggle .45s}
@keyframes pop{40%{transform:scale(1.08)}}
@keyframes wiggle{20%{transform:rotate(-7deg)}40%{transform:rotate(7deg)}60%{transform:rotate(-4deg)}80%{transform:rotate(3deg)}}
.speak{width:52px;height:52px;border-radius:50%;background:#ff9f1c;box-shadow:0 4px 0 #e07b00;font-size:22px;flex:0 0 auto}
.speak:active{transform:translateY(3px);box-shadow:0 1px 0 #e07b00}
.row{display:flex;align-items:center;justify-content:center;gap:10px;width:100%}
.bigBtn{background:#ff6f91;color:#fff;border-radius:999px;padding:.85em 1.6em;font-weight:900;font-size:clamp(16px,4.5vw,20px);box-shadow:0 5px 0 #d62839;min-height:52px}
.bigBtn:active{transform:translateY(3px);box-shadow:0 2px 0 #d62839}
.dots{display:flex;gap:6px;justify-content:center;flex-wrap:wrap}
.dot{width:12px;height:12px;border-radius:50%;background:rgba(58,45,63,.18)}
.dot.on{background:#ff6f91}
.dot.done{background:#52d273}
.foot{text-align:center;font-size:12px;opacity:.55;font-weight:700}
.numBox{font-size:clamp(42px,14vw,72px);font-weight:900;background:#fff;border-radius:28px;padding:.2em .55em;box-shadow:0 6px 0 rgba(58,45,63,.1);min-width:1.4em;text-align:center}
.ops{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}
.opBtn{width:clamp(72px,22vw,96px);height:clamp(72px,22vw,96px);border-radius:28%;background:#fff;font-size:clamp(28px,9vw,42px);font-weight:900;box-shadow:0 5px 0 rgba(58,45,63,.12);border:3px solid #ffb3c8}
.opBtn:active{transform:scale(.94)}
.opBtn.yay{border-color:#52d273;background:#f0fff4}
.train{display:flex;gap:6px;overflow-x:auto;width:100%;padding:8px 4px 16px;-webkit-overflow-scrolling:touch;scroll-snap-type:x mandatory}
.car{flex:0 0 auto;width:72px;height:88px;border-radius:16px 16px 10px 10px;background:#fff;border:3px solid #ff8fc7;display:flex;flex-direction:column;align-items:center;justify-content:center;scroll-snap-align:center;box-shadow:0 4px 0 rgba(58,45,63,.1);position:relative}
.car .n{font-size:28px;font-weight:900}
.car .wheel{position:absolute;bottom:-8px;width:14px;height:14px;border-radius:50%;background:#3a2d3f}
.car .wheel.l{left:10px}.car .wheel.r{right:10px}
.car.empty{border-style:dashed;background:rgba(255,255,255,.55);color:rgba(58,45,63,.35)}
.car.filled{border-color:#52d273;background:#f0fff4}
.pool{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;width:100%}
.chip{min-width:56px;min-height:56px;border-radius:18px;background:#fff;font-size:22px;font-weight:900;box-shadow:0 4px 0 rgba(58,45,63,.1);padding:.35em .55em}
.chip.used{opacity:.35;pointer-events:none}
.compareRow{display:flex;align-items:center;justify-content:center;gap:clamp(8px,3vw,18px);width:100%;flex-wrap:wrap}
.group{background:rgba(255,255,255,.75);border-radius:22px;padding:12px;min-width:120px;text-align:center;box-shadow:0 4px 0 rgba(58,45,63,.08)}
.group .dotsN{display:flex;flex-wrap:wrap;gap:6px;justify-content:center;max-width:140px;margin:0 auto 8px}
.group .d{width:18px;height:18px;border-radius:50%;background:#ff6f91}
.group.b .d{background:#3a86ff}
.opBtn.wiggle,.car.wiggle,.chip.wiggle{animation:wiggle .45s}
