*{box-sizing:border-box;margin:0;padding:0}html,body,#app{height:100%}body{font-family:-apple-system,PingFang SC,Microsoft YaHei,system-ui,sans-serif;background:#f3f4f6;color:#1f2937}.muted{color:#6b7280;font-size:13px}.app{height:100%}.join{min-height:100%;display:flex;align-items:center;justify-content:center;padding:20px;background:linear-gradient(135deg,#1e3a8a,#2563eb)}.card{width:100%;max-width:380px;background:#fff;border-radius:16px;padding:28px 24px;box-shadow:0 12px 40px #0000002e}.card h1{margin:0 0 6px;font-size:20px;font-weight:600}.form{display:flex;flex-direction:column;gap:12px;margin-top:16px}input,select{width:100%;padding:12px 14px;border:1px solid #d1d5db;border-radius:10px;font-size:15px;outline:none;background:#fff}input:focus,select:focus{border-color:#2563eb}button{cursor:pointer;border:none;border-radius:10px;padding:12px 14px;font-size:15px;background:#e5e7eb;color:#1f2937}button.primary{background:#2563eb;color:#fff}button.primary:disabled{opacity:.6}button.link{background:transparent;color:#2563eb;padding:6px}button.hangup{background:#dc2626;color:#fff}button.active{background:#2563eb;color:#fff}button.off{background:#475569;color:#94a3b8}.err{color:#dc2626;font-size:13px;margin:12px 0 0}.invite-box{background:#f0f9ff;border:1px solid #bae6fd;border-radius:12px;padding:16px}.invite-title{font-weight:600;font-size:16px;margin-bottom:8px;color:#0369a1}.invite-info{margin:6px 0;font-size:14px;word-break:break-all}.invite-info span{color:#6b7280}.invite-info b{color:#1f2937}.invite-link{color:#2563eb;font-family:monospace;font-size:12px}.preview{min-height:100%;display:flex;align-items:center;justify-content:center;padding:20px;background:linear-gradient(135deg,#1e3a8a,#2563eb)}.preview-card{width:100%;max-width:420px;background:#fff;border-radius:16px;padding:28px 24px;box-shadow:0 12px 40px #0000002e}.preview-card h2{margin:0 0 16px;font-size:18px;font-weight:600;text-align:center}.preview-video{width:100%;aspect-ratio:4/3;background:#1e293b;border-radius:12px;overflow:hidden;display:flex;align-items:center;justify-content:center;margin-bottom:16px}.preview-video video{width:100%;height:100%;object-fit:cover}.avatar-lg{width:72px;height:72px;border-radius:50%;background:#2563eb;color:#fff;display:flex;align-items:center;justify-content:center;font-size:28px;font-weight:600}.device-row{display:flex;align-items:center;gap:10px;margin-bottom:10px}.device-row label{min-width:60px;font-size:13px;color:#6b7280}.device-row select{flex:1;padding:8px 10px;font-size:13px}.preview-btns{display:flex;gap:10px;margin-bottom:16px}.preview-btns button{flex:1}.preview-actions{display:flex;flex-direction:column;gap:10px}.room{height:100%;display:flex;flex-direction:column;background:#0f172a}.topbar{display:flex;align-items:center;justify-content:space-between;padding:10px 16px;color:#e5e7eb}.topbar .t{font-weight:600}.topbar-right{display:flex;align-items:center;gap:12px}.time-warn{color:#f59e0b;font-weight:600;animation:blink 1s infinite}@keyframes blink{50%{opacity:.5}}.quality{display:inline-block;width:10px;height:10px;border-radius:50%}.quality-good{background:#22c55e}.quality-poor{background:#f59e0b}.quality-unknown{background:#6b7280}.room-body{flex:1;display:flex;position:relative;overflow:hidden}.grid{flex:1;display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;padding:10px;align-content:center;overflow-y:auto}.grid.layout-speaker{grid-template-columns:1fr}.grid.layout-speaker .tile:not(.local){max-height:60vh}.tile{position:relative;aspect-ratio:4/3;background:#1e293b;border-radius:12px;overflow:hidden;display:flex;align-items:center;justify-content:center;border:2px solid transparent;transition:border-color .2s}.tile.is-speaking{border-color:#22c55e}.tile video{width:100%;height:100%;object-fit:cover}.tile .avatar{width:56px;height:56px;border-radius:50%;background:#2563eb;color:#fff;display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:600}.tile .label{position:absolute;left:8px;bottom:8px;background:#00000080;color:#fff;font-size:12px;padding:2px 8px;border-radius:6px}.side-panel{width:300px;background:#1e293b;border-left:1px solid #334155;display:flex;flex-direction:column}.panel-header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid #334155;color:#e5e7eb;font-weight:600}.close-btn{background:transparent;color:#94a3b8;font-size:20px;padding:4px 8px;min-width:auto}.chat-messages{flex:1;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:8px}.chat-msg{background:#334155;border-radius:10px;padding:8px 12px;max-width:90%}.chat-msg.mine{align-self:flex-end;background:#2563eb}.chat-from{font-size:11px;color:#94a3b8;display:block;margin-bottom:2px}.chat-msg.mine .chat-from{color:#ffffffb3}.chat-text{font-size:14px;color:#e5e7eb;word-break:break-word}.chat-input{display:flex;gap:8px;padding:12px;border-top:1px solid #334155}.chat-input input{flex:1;padding:8px 12px;font-size:14px;border-radius:8px;background:#334155;border:1px solid #475569;color:#e5e7eb}.chat-input button{padding:8px 16px;font-size:14px;background:#2563eb;color:#fff;border-radius:8px}.participant-list{flex:1;overflow-y:auto;padding:12px}.participant-item{display:flex;align-items:center;gap:10px;padding:8px 0;color:#e5e7eb;font-size:14px;border-bottom:1px solid #334155}.p-avatar{width:32px;height:32px;border-radius:50%;background:#2563eb;color:#fff;display:flex;align-items:center;justify-content:center;font-size:14px;font-weight:600;flex-shrink:0}.hand-badge{margin-left:auto;font-size:16px}.emoji-layer{position:absolute;inset:0;pointer-events:none;overflow:hidden}.float-emoji{position:absolute;bottom:-40px;font-size:32px;animation:floatUp 3s ease-out forwards}@keyframes floatUp{0%{transform:translateY(0) scale(1);opacity:1}to{transform:translateY(-100vh) scale(1.5);opacity:0}}.bar{display:flex;gap:8px;justify-content:center;padding:10px 14px;background:#1e293b;flex-wrap:wrap}.bar button{min-width:70px;padding:10px 8px;font-size:13px;background:#334155;color:#e5e7eb;border-radius:8px}.bar button.off{background:#475569;color:#94a3b8}.bar button.active{background:#2563eb;color:#fff}.bar button.hangup{background:#dc2626;color:#fff}
