:root{--bg: #e2f1f8;--card: #ffffff;--deep: #163652;--text: #1a3348;--muted: #53758e;--line: #163652;--cyan: #1eb6c9;--cyan-soft: #e0f7fa;--coral: #ff6b4a;--yellow: #ffd166;--green: #06d6a0;--purple: #8338ec;--pink: #ff477e;--shadow: 0 8px 0 #163652;--shadow-sm: 0 4px 0 #163652;--radius: 20px;--font: "Nunito", "PingFang SC", "Microsoft YaHei", system-ui, sans-serif}*{box-sizing:border-box}html,body,#root{margin:0;min-height:100%}body{font-family:var(--font);color:var(--text);background:var(--bg) url(/assets/generated/cartoon_bg.png) center top / cover fixed no-repeat;line-height:1.55}img{max-width:100%;height:auto}a{color:inherit;text-decoration:none}button,input,textarea{font:inherit}.app-shell{min-height:100vh;display:flex;flex-direction:column;background:#e2f1f8c7;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.topbar{position:sticky;top:0;z-index:20;display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 24px;background:#fff;border-bottom:4px solid var(--line);box-shadow:var(--shadow-sm)}.brand{display:flex;align-items:center;gap:10px;font-weight:900;font-size:1.25rem;color:var(--deep);transition:transform .15s ease}.brand:hover{transform:scale(1.04)}.brand-icon{width:44px;height:44px;border-radius:50%;display:grid;place-items:center;background:var(--yellow);border:3px solid var(--line);box-shadow:2px 2px 0 var(--line);font-size:1.3rem;animation:pulseGlow 2.5s infinite ease-in-out}.topnav{display:flex;gap:10px;align-items:center;flex-wrap:wrap}.topnav a{padding:8px 16px;border-radius:999px;font-weight:900;color:var(--deep);background:#fff;border:3px solid var(--line);box-shadow:0 4px 0 var(--line);transition:all .12s ease}.topnav a.active,.topnav a:hover{background:var(--yellow);transform:translateY(-2px);box-shadow:0 6px 0 var(--line)}.topnav a:active{transform:translateY(2px);box-shadow:0 2px 0 var(--line)}.sound-toggle-btn{background:var(--cyan-soft)!important}.main{flex:1;width:min(1120px,100%);margin:0 auto;padding:24px 20px}.foot{text-align:center;padding:18px;color:var(--deep);font-weight:800;font-size:.95rem;background:#ffffffd9;border-top:3px solid var(--line)}.hero-card{background:#fff;border:4px solid var(--line);border-radius:24px;padding:24px 28px;box-shadow:var(--shadow);margin-bottom:24px}.hero-card h1{margin:0 0 8px;color:var(--deep);font-size:clamp(1.8rem,3.5vw,2.3rem);text-shadow:2px 2px 0 var(--yellow)}.stats-row{display:flex;flex-wrap:wrap;gap:10px;margin-top:16px}.pill{padding:8px 14px;border-radius:999px;background:var(--cyan-soft);border:3px solid var(--line);box-shadow:2px 2px 0 var(--line);font-weight:900;font-size:.92rem;color:var(--deep)}.pill.warm{background:#ffe8e1}.game-kicker{display:inline-block;font-weight:900;font-size:.88rem;color:#fff;background:var(--pink);border:3px solid var(--line);box-shadow:2px 2px 0 var(--line);border-radius:999px;padding:4px 12px;margin-bottom:10px;animation:bounceMini 2s infinite ease-in-out}.game-sub{display:block;font-size:1.05rem;font-weight:900;color:var(--muted);margin-top:4px}.campaign-hero{display:grid;grid-template-columns:minmax(0,1.15fr) minmax(0,.85fr);gap:20px;align-items:center}.journey-bar{margin-top:16px;height:16px;border-radius:999px;background:#eef3f7;border:3px solid var(--line);overflow:hidden}.journey-bar-fill{height:100%;background:linear-gradient(90deg,var(--cyan),var(--green));border-radius:999px;transition:width .4s cubic-bezier(.34,1.56,.64,1)}.fragment-board{background:var(--cyan-soft);border:4px solid var(--line);border-radius:20px;padding:16px;box-shadow:var(--shadow-sm);text-align:center}.fragment-title{font-weight:900;font-size:1.1rem;color:var(--deep);margin-bottom:12px}.crystal-center-img{width:90px;height:90px;object-fit:contain;margin:0 auto 10px;filter:drop-shadow(0 6px 0 var(--line));animation:floatAnim 3s infinite ease-in-out}.fragment-row{display:grid;grid-template-columns:1fr 1fr;gap:10px}.fragment-chip{display:flex;gap:8px;align-items:center;padding:8px 10px;border-radius:14px;border:3px dashed var(--line);background:#fff;font-size:.85rem;font-weight:900;color:var(--muted);transition:all .2s ease}.fragment-chip.got{border-style:solid;border-color:var(--line);color:var(--deep);background:#e3f8ec;box-shadow:2px 2px 0 var(--line)}.fragment-chip img{width:32px;height:32px;border-radius:8px;object-fit:cover;border:2px solid var(--line)}.panel-lite{background:#fff;border:4px solid var(--line);border-radius:22px;padding:18px 22px;margin-bottom:24px;box-shadow:var(--shadow)}.panel-lite h2{margin:0 0 6px;font-size:1.25rem;color:var(--deep)}.party-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px;margin-top:14px}.party-card{display:flex;gap:12px;align-items:center;padding:12px;border-radius:16px;border:3px solid var(--line);background:#fff;box-shadow:var(--shadow-sm);transition:transform .15s ease}.party-card:hover:not(.locked){transform:translateY(-3px) scale(1.02)}.party-card.locked{opacity:.55;filter:grayscale(.5);background:#f0f4f8}.party-card img{width:54px;height:54px;max-width:54px;max-height:54px;border-radius:14px;object-fit:cover;border:3px solid var(--line);background:var(--yellow);flex-shrink:0}.party-quote{margin-top:4px;font-size:.85rem;font-weight:800;color:var(--purple)}.path-rail{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:24px;padding:14px;background:#fff;border:4px solid var(--line);border-radius:20px;box-shadow:var(--shadow-sm)}.path-node{width:36px;height:36px;border-radius:50%;border:3px solid var(--line);display:grid;place-items:center;font-size:.82rem;font-weight:900;color:var(--deep);background:#f0f6fa;box-shadow:0 3px 0 var(--line);transition:transform .15s ease}.path-node.clear{background:var(--green);color:#fff}.path-node.current{background:var(--coral);color:#fff;animation:bouncePulse 1.2s infinite ease-in-out}.path-node.locked{opacity:.45}.stage-block{margin-bottom:28px}.stage-banner{display:flex;gap:16px;align-items:center;margin-bottom:16px;padding:14px 18px;background:#fff;border:4px solid var(--line);border-radius:20px;box-shadow:var(--shadow)}.stage-cover{width:96px;height:96px;max-width:96px;max-height:96px;object-fit:cover;border-radius:16px;border:3px solid var(--line);flex-shrink:0;background:var(--yellow)}.level-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:14px}.level-card{background:#fff;border:4px solid var(--line);border-radius:20px;padding:12px 12px 16px;text-align:center;box-shadow:var(--shadow);transition:all .15s cubic-bezier(.34,1.56,.64,1);position:relative}.level-card:hover:not(.locked){transform:translateY(-5px) scale(1.03);box-shadow:0 12px 0 var(--line)}.level-card:active:not(.locked){transform:translateY(2px);box-shadow:0 4px 0 var(--line)}.level-card.locked{opacity:.6;filter:grayscale(.3);cursor:not-allowed}.level-card.cleared{background:#f0fdf4}.level-thumb-wrap{width:100%;aspect-ratio:4 / 3;border-radius:14px;overflow:hidden;border:3px solid var(--line);margin-bottom:10px;background:var(--cyan-soft)}.level-thumb{width:100%;height:100%;object-fit:cover}.level-cover-wrap{width:100%;aspect-ratio:2.6 / 1;max-height:180px;border-radius:18px;overflow:hidden;border:4px solid var(--line);box-shadow:3px 3px 0 var(--line);background:var(--cyan-soft);display:flex;align-items:center;justify-content:center}.level-cover{width:100%;height:100%;object-fit:cover;object-position:center 30%;display:block}.on-stage-party{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin:12px 0 14px}.on-stage-label{font-weight:900;font-size:.9rem;color:var(--deep)}.on-stage-chip{display:inline-flex;align-items:center;gap:8px;padding:4px 12px 4px 4px;border-radius:999px;border:3px solid var(--line);background:#fff;box-shadow:2px 2px 0 var(--line);font-weight:900;font-size:.88rem;color:var(--deep)}.on-stage-chip img{width:34px!important;height:34px!important;max-width:34px!important;max-height:34px!important;border-radius:50%;object-fit:cover;border:2px solid var(--line);flex-shrink:0;display:block}.interactive-input-card{background:var(--yellow);border:4px solid var(--line);border-radius:18px;padding:14px 16px;margin-bottom:16px;box-shadow:3px 3px 0 var(--line)}.input-prompt-label{font-weight:900;font-size:.98rem;color:var(--deep);margin-bottom:10px;display:flex;align-items:center;gap:6px}.kid-text-input{width:100%;padding:10px 14px;border-radius:12px;border:3px solid var(--line);font-size:1.05rem;font-weight:900;color:var(--deep);background:#fff;outline:none;box-shadow:inset 0 2px 4px #0000000f;transition:border-color .15s ease,box-shadow .15s ease}.kid-text-input:focus{border-color:var(--purple);box-shadow:0 0 0 4px #8338ec40}.level-num{font-size:.85rem;font-weight:900;color:var(--muted)}.level-title{font-weight:900;color:var(--deep);margin:4px 0 6px;font-size:1.02rem}.level-stars{color:#ffb703;letter-spacing:2px;font-size:1.1rem;text-shadow:1px 1px 0 var(--line)}.lock-badge{position:absolute;top:10px;right:10px;font-size:1.1rem;z-index:2}.chapter-play{display:flex;flex-direction:column;gap:14px}.chapter-top{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px}.chapter-crumb{font-weight:900;color:var(--deep);font-size:.95rem;background:#fff;padding:6px 14px;border-radius:999px;border:3px solid var(--line);box-shadow:2px 2px 0 var(--line)}.crumb-sep{margin:0 6px;opacity:.5}.play-layout{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,.95fr);gap:20px;align-items:start}@media (max-width: 900px){.play-layout{grid-template-columns:minmax(0,1fr)}}.panel{background:#fff;border:4px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden}.panel-hd{padding:14px 18px;border-bottom:3px solid var(--line);font-weight:900;font-size:1.1rem;color:var(--deep);display:flex;align-items:center;justify-content:space-between;gap:8px;background:var(--yellow)}.panel-bd{padding:18px}.speech-bubble{position:relative;background:#fff;border:3px solid var(--line);border-radius:18px;padding:14px 18px;margin-bottom:14px;box-shadow:3px 3px 0 var(--line);font-weight:800;font-size:1rem;color:var(--deep)}.speech-bubble:before{content:"";position:absolute;bottom:-12px;left:24px;width:0;height:0;border-style:solid;border-width:12px 10px 0 10px;border-color:var(--line) transparent transparent transparent}.speech-bubble:after{content:"";position:absolute;bottom:-7px;left:26px;width:0;height:0;border-style:solid;border-width:9px 8px 0 8px;border-color:#fff transparent transparent transparent}.goal-box{margin:12px 0;padding:12px 16px;border-radius:16px;background:#fff8d6;border:3px solid var(--line);box-shadow:3px 3px 0 var(--line);font-weight:900;color:var(--deep);display:flex;align-items:center;gap:10px}.btn-row{display:flex;flex-wrap:wrap;gap:10px;margin-top:14px}.btn{border:3px solid var(--line);border-radius:999px;padding:12px 22px;font-weight:900;font-size:1.05rem;cursor:pointer;box-shadow:0 5px 0 var(--line);transition:all .12s ease;display:inline-flex;align-items:center;justify-content:center;gap:6px}.btn:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 7px 0 var(--line)}.btn:active:not(:disabled){transform:translateY(3px);box-shadow:0 2px 0 var(--line)}.btn:disabled{opacity:.55;cursor:not-allowed;box-shadow:0 2px 0 var(--line)}.btn-run{background:var(--coral);color:#fff;font-size:1.15rem;min-width:130px}.btn-secondary{background:#fff;color:var(--deep)}.btn-purple{background:var(--purple);color:#fff}.btn-green{background:var(--green);color:#fff}.cards-row{display:flex;flex-wrap:wrap;gap:10px;margin:12px 0 14px}.code-card{border:3px solid var(--line);background:var(--cyan-soft);color:var(--deep);border-radius:14px;padding:8px 14px;font-weight:900;font-family:SF Mono,Menlo,Consolas,monospace;font-size:.95rem;cursor:pointer;box-shadow:0 4px 0 var(--line);transition:all .12s ease}.code-card:hover{transform:translateY(-2px) scale(1.04);box-shadow:0 6px 0 var(--line);background:var(--yellow)}.code-card:active{transform:translateY(2px);box-shadow:0 1px 0 var(--line)}.editor-wrap .cm-editor{font-size:17px;min-height:270px;border-radius:16px;border:3px solid var(--line);box-shadow:inset 0 3px 6px #0000000f;overflow:hidden}.editor-toolbar{display:flex;gap:8px;margin-bottom:10px}.tool-btn{padding:6px 12px;font-size:.85rem;font-weight:900;border:2px solid var(--line);border-radius:10px;background:#fff;box-shadow:2px 2px 0 var(--line);cursor:pointer}.tool-btn:hover{background:var(--yellow)}.stage-canvas{width:100%;aspect-ratio:3 / 2;border-radius:16px;border:4px solid var(--line);box-shadow:3px 3px 0 var(--line);background:#f3fafd;display:block}.output-box{margin-top:14px;padding:14px;background:#fff;border:3px solid var(--line);border-radius:16px;box-shadow:3px 3px 0 var(--line);min-height:90px;font-family:SF Mono,Menlo,Consolas,monospace;font-weight:700;white-space:pre-wrap;color:var(--deep)}.output-box .label{font-weight:900;font-size:.85rem;color:var(--muted);margin-bottom:6px}.msg{padding:12px 16px;border-radius:16px;border:3px solid var(--line);font-weight:900;box-shadow:3px 3px 0 var(--line);margin-top:12px}.msg.ok{background:#d8f3dc;color:#1b4332;animation:bounceMini .5s cubic-bezier(.34,1.56,.64,1)}.msg.err{background:#ffccd5;color:#800f2f;animation:shakeAnim .4s ease-in-out}.msg.warn{background:#fff3b0;color:#7f5539}.msg.info{background:var(--cyan-soft);color:var(--deep)}.celebrate{position:fixed;top:0;right:0;bottom:0;left:0;z-index:100;background:#163652a6;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);display:grid;place-items:center;padding:20px;animation:fadeIn .3s ease}.celebrate-card{background:#fff;border:5px solid var(--line);border-radius:28px;padding:32px 28px;text-align:center;box-shadow:0 16px 0 var(--line);max-width:460px;width:100%;animation:popIn .4s cubic-bezier(.34,1.56,.64,1)}.celebrate-card h2{font-size:2rem;color:var(--deep);margin:10px 0;text-shadow:2px 2px 0 var(--yellow)}.star-pop-row{display:flex;justify-content:center;gap:10px;font-size:2.8rem;margin:10px 0}.star-pop{animation:starPop .5s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes floatAnim{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}@keyframes pulseGlow{0%,to{transform:scale(1)}50%{transform:scale(1.08)}}@keyframes bounceMini{0%,to{transform:translateY(0)}50%{transform:translateY(-4px)}}@keyframes bouncePulse{0%,to{transform:scale(1)}50%{transform:scale(1.18)}}@keyframes shakeAnim{0%,to{transform:translate(0)}20%,60%{transform:translate(-6px)}40%,80%{transform:translate(6px)}}@keyframes popIn{0%{transform:scale(.6);opacity:0}to{transform:scale(1);opacity:1}}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes starPop{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}
