@import "https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@300;400;500;600;700&display=swap";:root{--primary:#e8a0bf;--primary-dark:#d4789a;--primary-light:#f5d5e0;--secondary:#ba90c6;--accent:#c0dbea;--bg:#fff5f7;--bg-card:#fff;--text:#4a4a4a;--text-light:#8a8a8a;--success:#7bc67e;--danger:#e88b8b;--warning:#f0c76e;--shadow:0 4px 20px #e8a0bf26;--shadow-hover:0 8px 30px #e8a0bf40;--radius:16px;--radius-sm:10px;--transition:all .3s cubic-bezier(.4, 0, .2, 1)}*{box-sizing:border-box;margin:0;padding:0}body{background:var(--bg);color:var(--text);min-height:100vh;font-family:Noto Sans SC,-apple-system,BlinkMacSystemFont,sans-serif;overflow-x:hidden}@keyframes fadeIn{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes slideUp{0%{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}@keyframes pulse{0%,to{transform:scale(1)}50%{transform:scale(1.05)}}@keyframes float{0%,to{transform:translateY(0)}50%{transform:translateY(-10px)}}@keyframes shimmer{0%{background-position:-200%}to{background-position:200%}}@keyframes ripple{0%{opacity:1;transform:scale(0)}to{opacity:0;transform:scale(4)}}@keyframes voicePulse{0%,to{box-shadow:0 0 #e8a0bf66}50%{box-shadow:0 0 0 15px #e8a0bf00}}@keyframes modalIn{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}@keyframes confetti{0%{opacity:1;transform:translateY(0)rotate(0)}to{opacity:0;transform:translateY(100vh)rotate(720deg)}}@keyframes revealWord{0%{filter:blur(12px);transform:scale(.95)}50%{filter:blur(3px);transform:scale(1.02)}to{filter:blur();transform:scale(1)}}.app-wrapper{background:radial-gradient(ellipse at 20% 50%, #e8a0bf14 0%, transparent 50%), radial-gradient(ellipse at 80% 20%, #ba90c614 0%, transparent 50%), radial-gradient(ellipse at 50% 80%, #c0dbea14 0%, transparent 50%), var(--bg);min-height:100vh;position:relative}.app-wrapper:before{content:"";pointer-events:none;background:radial-gradient(circle,#e8a0bf0d 0%,#0000 70%);width:100%;height:100%;animation:20s ease-in-out infinite float;position:fixed;top:-50%;right:-50%}.landing{flex-direction:column;justify-content:center;align-items:center;min-height:100vh;padding:20px;animation:.6s ease-out fadeIn;display:flex}.landing-logo{margin-bottom:8px;font-size:3rem;animation:3s ease-in-out infinite float}.landing h1{color:var(--primary-dark);letter-spacing:2px;margin-bottom:6px;font-size:2rem;font-weight:600}.landing .subtitle{color:var(--text-light);margin-bottom:40px;font-size:.95rem;font-weight:300}.landing-card{background:var(--bg-card);border-radius:var(--radius);box-shadow:var(--shadow);width:100%;max-width:400px;padding:40px;animation:.6s ease-out .2s both slideUp}.landing-card h2{color:var(--text);text-align:center;margin-bottom:24px;font-size:1.15rem;font-weight:500}.landing-card .divider{color:var(--text-light);align-items:center;margin:24px 0;font-size:.85rem;display:flex}.landing-card .divider:before,.landing-card .divider:after{content:"";background:linear-gradient(90deg, transparent, var(--primary-light), transparent);flex:1;height:1px}.landing-card .divider span{padding:0 16px}.input-group{margin-bottom:16px}.input-group label{color:var(--text-light);margin-bottom:8px;font-size:.85rem;font-weight:500;display:block}.input-group input{border-radius:var(--radius-sm);width:100%;color:var(--text);transition:var(--transition);background:#fdfafb;border:2px solid #f0e6ea;outline:none;padding:14px 18px;font-family:inherit;font-size:1rem}.input-group input:focus{border-color:var(--primary);background:#fff;box-shadow:0 0 0 4px #e8a0bf1a}.input-group input::placeholder{color:#c8bfc2}.room-code-input{text-align:center;letter-spacing:6px;text-transform:uppercase;font-weight:600;font-size:1.3rem!important}.btn{border-radius:var(--radius-sm);cursor:pointer;transition:var(--transition);-webkit-user-select:none;user-select:none;border:none;justify-content:center;align-items:center;gap:8px;padding:14px 28px;font-family:inherit;font-size:.95rem;font-weight:500;display:inline-flex;position:relative;overflow:hidden}.btn:after{content:"";background:#ffffff4d;border-radius:50%;width:0;height:0;transition:width .6s,height .6s;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.btn:active:after{width:300px;height:300px}.btn-primary{background:linear-gradient(135deg, var(--primary), var(--primary-dark));color:#fff;box-shadow:0 4px 15px #e8a0bf4d}.btn-primary:hover{transform:translateY(-2px);box-shadow:0 6px 20px #e8a0bf66}.btn-primary:active{transform:translateY(0)}.btn-secondary{background:linear-gradient(135deg, var(--secondary), #9a7aa8);color:#fff;box-shadow:0 4px 15px #ba90c64d}.btn-secondary:hover{transform:translateY(-2px);box-shadow:0 6px 20px #ba90c666}.btn-success{background:linear-gradient(135deg, var(--success), #5fb362);color:#fff;box-shadow:0 4px 15px #7bc67e4d}.btn-success:hover{transform:translateY(-2px);box-shadow:0 6px 20px #7bc67e66}.btn-danger{background:linear-gradient(135deg, var(--danger), #d46a6a);color:#fff;box-shadow:0 4px 15px #e88b8b4d}.btn-danger:hover{transform:translateY(-2px);box-shadow:0 6px 20px #e88b8b66}.btn-outline{border:2px solid var(--primary-light);color:var(--primary-dark);background:0 0}.btn-outline:hover{background:var(--primary-light);transform:translateY(-2px)}.btn-ghost{color:var(--primary-dark);background:#e8a0bf14;border:none}.btn-ghost:hover{background:#e8a0bf26}.btn-full{width:100%}.btn-sm{padding:10px 18px;font-size:.85rem}.btn-icon{border-radius:50%;width:48px;height:48px;padding:0}.btn:disabled{opacity:.5;cursor:not-allowed;transform:none!important}.room-bar{-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);z-index:100;background:#fffc;border-bottom:1px solid #e8a0bf1a;justify-content:space-between;align-items:center;padding:14px 24px;animation:.4s ease-out fadeIn;display:flex;position:sticky;top:0}.room-bar .room-info{align-items:center;gap:12px;display:flex}.room-bar .room-code{color:var(--primary-dark);background:var(--primary-light);letter-spacing:2px;cursor:pointer;transition:var(--transition);border-radius:20px;padding:6px 14px;font-size:.85rem;font-weight:600}.room-bar .room-code:hover{background:var(--primary);color:#fff}.room-bar .role-badge{border-radius:20px;padding:6px 14px;font-size:.8rem;font-weight:500}.role-badge.host{color:#d4789a;background:linear-gradient(135deg,#fff0f3,#ffe0e8)}.role-badge.guesser{color:#9a7aa8;background:linear-gradient(135deg,#f0e8f5,#e8d8f0)}.room-bar .voice-status{color:var(--text-light);align-items:center;gap:8px;font-size:.85rem;display:flex}.voice-dot{background:var(--success);border-radius:50%;width:8px;height:8px;animation:2s ease-in-out infinite pulse}.voice-dot.inactive{background:var(--text-light);animation:none}.game-container{flex-direction:column;align-items:center;max-width:600px;min-height:calc(100vh - 60px);margin:0 auto;padding:20px;animation:.5s ease-out fadeIn;display:flex}.word-card{background:var(--bg-card);box-shadow:var(--shadow);text-align:center;border-radius:24px;width:100%;margin-bottom:24px;padding:48px 40px;animation:.5s ease-out .1s both slideUp;position:relative;overflow:hidden}.word-card:before{content:"";background:linear-gradient(90deg, var(--primary), var(--secondary), var(--accent));height:4px;position:absolute;top:0;left:0;right:0}.word-card .word-label{color:var(--text-light);text-transform:uppercase;letter-spacing:3px;margin-bottom:16px;font-size:.85rem;font-weight:500}.word-display{color:var(--primary-dark);min-height:80px;transition:var(--transition);justify-content:center;align-items:center;font-size:3rem;font-weight:700;line-height:1.4;display:flex}.word-display.blurred{filter:blur(12px);-webkit-user-select:none;user-select:none;pointer-events:none;color:var(--secondary)}.word-display.revealing{animation:.8s ease-out forwards revealWord}.word-display.empty{color:var(--text-light);font-size:1.2rem;font-weight:400}.word-card .word-hint{color:var(--text-light);margin-top:16px;font-size:.8rem;font-style:italic}.controls{flex-wrap:wrap;gap:12px;width:100%;animation:.5s ease-out .2s both slideUp;display:flex}.controls .btn{flex:1;min-width:calc(50% - 6px)}.controls .btn-wide{flex:100%}.voice-control{justify-content:center;align-items:center;gap:16px;margin-top:20px;animation:.5s ease-out .3s both slideUp;display:flex}.mic-btn{background:linear-gradient(135deg, var(--primary), var(--primary-dark));color:#fff;cursor:pointer;width:64px;height:64px;transition:var(--transition);border:none;border-radius:50%;justify-content:center;align-items:center;font-size:1.5rem;display:flex;box-shadow:0 4px 15px #e8a0bf4d}.mic-btn:hover{transform:scale(1.1);box-shadow:0 6px 25px #e8a0bf66}.mic-btn.active{background:linear-gradient(135deg, var(--success), #5fb362);animation:1.5s ease-in-out infinite voicePulse;box-shadow:0 4px 15px #7bc67e4d}.mic-btn.muted{background:linear-gradient(135deg, var(--text-light), #6a6a6a);box-shadow:none}.voice-label{color:var(--text-light);font-size:.85rem}.toast-container{z-index:1000;pointer-events:none;flex-direction:column;gap:10px;display:flex;position:fixed;top:80px;left:50%;transform:translate(-50%)}.toast{border-radius:var(--radius-sm);color:#fff;pointer-events:auto;white-space:nowrap;padding:14px 24px;font-size:.9rem;font-weight:500;animation:.3s ease-out slideUp;box-shadow:0 8px 30px #00000026}.toast.success{background:linear-gradient(135deg, var(--success), #5fb362)}.toast.error{background:linear-gradient(135deg, var(--danger), #d46a6a)}.toast.info{background:linear-gradient(135deg, var(--primary), var(--primary-dark))}.toast.warning{background:linear-gradient(135deg, var(--warning), #d4a94e)}.modal-overlay{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:500;background:#0006;justify-content:center;align-items:center;padding:20px;animation:.2s ease-out fadeIn;display:flex;position:fixed;inset:0}.modal{background:var(--bg-card);text-align:center;border-radius:24px;width:100%;max-width:360px;padding:36px;animation:.3s ease-out modalIn;box-shadow:0 20px 60px #00000026}.modal .modal-icon{margin-bottom:16px;font-size:3rem}.modal h3{color:var(--text);margin-bottom:12px;font-size:1.2rem;font-weight:600}.modal p{color:var(--text-light);margin-bottom:24px;font-size:.9rem;line-height:1.6}.modal-actions{gap:12px;display:flex}.modal-actions .btn{flex:1}.waiting{flex-direction:column;justify-content:center;align-items:center;padding:60px 20px;animation:.5s ease-out fadeIn;display:flex}.waiting .spinner{border:3px solid var(--primary-light);border-top-color:var(--primary);border-radius:50%;width:48px;height:48px;margin-bottom:20px;animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.waiting h3{color:var(--text);margin-bottom:8px;font-size:1.1rem;font-weight:500}.waiting p{color:var(--text-light);font-size:.9rem}.result-overlay{z-index:600;pointer-events:auto;-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);cursor:pointer;background:#00000073;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.result-content{text-align:center;animation:.5s ease-out modalIn}.result-emoji{font-size:5rem;animation:1s ease-in-out pulse}.result-text{text-shadow:0 2px 10px #0000001a;margin-top:16px;font-size:2rem;font-weight:700}.result-word{opacity:.9;margin-top:10px;font-size:1.2rem}@media (width<=480px){.landing h1{font-size:1.6rem}.landing-card{padding:28px 24px}.word-card{padding:36px 24px}.word-display{font-size:2.2rem}.controls .btn{min-width:100%}.room-bar{padding:12px 16px}.room-bar .room-code{padding:5px 10px;font-size:.75rem}}::-webkit-scrollbar{width:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--primary-light);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--primary)}.copy-tooltip{position:relative}.copy-tooltip:after{content:"已复制!";background:var(--text);color:#fff;opacity:0;pointer-events:none;white-space:nowrap;border-radius:6px;padding:4px 12px;font-size:.75rem;transition:opacity .2s;position:absolute;bottom:100%;left:50%;transform:translate(-50%)}.copy-tooltip.show:after{opacity:1}.connection-status{background:#e8a0bf14;border-radius:20px;align-items:center;gap:6px;padding:4px 12px;font-size:.8rem;display:flex}.connection-status.connected{color:var(--success)}.connection-status.disconnected{color:var(--danger)}.connection-status.connecting{color:var(--warning)}
