*{box-sizing:border-box}html,body,#root{height:100%;margin:0;padding:0;font-family:Segoe UI,system-ui,-apple-system,BlinkMacSystemFont,sans-serif;background:linear-gradient(135deg,#2e5a2f,#295229)}.app-shell{display:flex;height:100%}.table-area{flex:3;padding:12px;background:linear-gradient(135deg,#2e5a2f,#295229);display:flex;flex-direction:column;align-items:center}.table-wrapper{display:flex;flex-direction:column;align-items:center;gap:6px}.side-bars{display:flex;align-items:center;gap:12px;justify-content:center}.opponent-bar{display:flex;align-items:center;gap:8px;position:relative}.opponent-bar.left-bar,.opponent-bar.right-bar{flex-direction:column}.opponent-bar.left-bar,.opponent-bar.right-bar{margin-top:-40px}.opponent-bar.left-bar{margin-right:-190px}.opponent-bar.right-bar{margin-left:-190px}.opponent-bar .self-nameplate{margin-bottom:4px;z-index:3}.north-nameplate,.south-nameplate{position:absolute;top:-240px}.debug-nameplate{transition:box-shadow .16s ease,transform .16s ease}.debug-nameplate:hover{box-shadow:0 0 0 2px #ffd54f,0 6px 12px #0006;transform:translateY(-1px)}.sidebar{flex:1;padding:16px;border-left:1px solid #ccc;background:#f7f7f7;display:flex;flex-direction:column;gap:12px;min-width:280px}.board-frame{position:relative;width:min(70vw,460px);aspect-ratio:16 / 10;height:min(70vw,460px);background:#1f3a1f;border:12px solid #5b381c;border-radius:12px;overflow:hidden;margin:0 auto}.board-felt{position:absolute;top:12px;right:12px;bottom:12px;left:12px;background:#2e6530;border:6px solid #1c4a1e;border-radius:8px}.center-panel{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:220px;height:220px;background:#d8b887;border:3px solid #5b381c;border-radius:6px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;color:#2b1b0d;font-weight:600}.nameplate{background:#5b381c;color:#fff;padding:4px 8px;border-radius:4px;font-size:12px;min-width:70px;text-align:center;box-shadow:0 1px 2px #0000004d}.tile{width:32px;height:44px;border-radius:4px;border:1px solid #333;background:#fffef7;color:#d11f1f;display:inline-flex;align-items:center;justify-content:center;margin-right:4px;font-size:18px;font-weight:600;box-shadow:0 1px 2px #0003;transition:transform .32s ease,box-shadow .32s ease,border-color .32s ease,margin .42s ease}.tile:hover{transform:translateY(-3px);box-shadow:0 4px 6px #00000040}.tile.selected{border-color:#ff7043;box-shadow:0 0 0 2px #ff7043,0 4px 8px #00000040;transform:translateY(-4px)}.tile.recent-draw{margin-left:10px}.floating-holder{position:absolute;transition:transform .62s ease}.floating-holder.seat-E{right:-34px;top:4px}.floating-holder.seat-W{left:-34px;top:4px}.floating-holder.seat-S{left:50%;transform:translate(-50%) translateY(-30px)}.floating-holder.seat-N{left:50%;transform:translate(-50%) translateY(30px)}.tile.small{width:24px;height:34px;font-size:14px}.tile.side-view{width:24px;height:32px;background:linear-gradient(180deg,#1e4d2e,#114022 40%,#1e4d2e);border:2px solid #0c2a18;border-radius:3px;box-shadow:inset 0 0 0 1px #ffffff14,inset 0 0 0 2px #0000001f;position:relative}.tile.side-view.small{width:20px;height:26px}.tile.side-view:before,.tile.side-view:after{content:"";position:absolute;left:3px;right:3px;height:2px;background:#ffffff38;border-radius:1px}.tile.side-view:before{top:7px;box-shadow:0 8px #ffffff2e}.tile.side-view:after{top:14px;height:4px;background:#0c803773;box-shadow:0 8px #ffffff2e}.tile.placeholder{background:#f4efe1;color:#8a7b6a;display:inline-flex;align-items:center;justify-content:center}.tile.face-down{background:#1f4b2e;color:transparent}.tile.laizi{position:relative;background:linear-gradient(180deg,#fff2c0,#ffe89a);box-shadow:0 0 0 2px #d18f00 inset,0 1px 2px #0000004d}.tile.laizi:after{content:"赖";position:absolute;top:-4px;right:-4px;background:#d18f00;color:#fff;font-size:10px;padding:1px 3px;border-radius:6px;box-shadow:0 1px 2px #0000004d}.tile.zigang{position:relative;background:linear-gradient(180deg,#d9ecff,#b9d3f5);box-shadow:0 0 0 2px #2b6acb inset,0 1px 2px #00000040}.tile.zigang:after{content:"杠";position:absolute;top:-4px;right:-4px;background:#2b6acb;color:#fff;font-size:10px;padding:1px 3px;border-radius:6px;box-shadow:0 1px 2px #0000004d}.tile.tong{color:#0c7fe2}.tile.tiao{color:#0b8a3a}.tile.wind,.tile.dragon{color:#111}.hand-row{display:flex;padding:6px 8px;background:#5b381c;border-radius:6px;box-shadow:inset 0 0 0 1px #2f1e0f;gap:4px;transition:padding .32s ease;position:relative;min-height:52px}.hand-vertical{transform:rotate(90deg);transform-origin:center}.hand-row.has-floating{padding-right:14px}.hand-row.hand-vertical.has-floating{padding-right:10px;padding-left:10px}.melds-row{display:flex;margin-bottom:4px}.meld-group{display:flex;margin-right:6px;padding-right:2px}.action-panel{position:absolute;right:12px;top:50%;transform:translateY(-50%);display:flex;flex-direction:column;gap:8px;z-index:5}.action-btn{min-width:90px;padding:8px 10px;border:none;border-radius:6px;font-size:14px;font-weight:700;cursor:pointer;color:#fff;background:linear-gradient(180deg,#1e88e5,#1565c0);box-shadow:0 2px 3px #0003}.action-btn.kong-default{background:linear-gradient(180deg,#8a4df3,#5c2dc6)}.action-btn.kong-zi{background:linear-gradient(180deg,#4285f4,#2b6dcf)}.action-btn.kong-laizi{background:linear-gradient(180deg,#f7d046,#d9ad2f);color:#2d1c00}.action-btn.chi,.action-btn.peng{background:linear-gradient(180deg,#34a853,#1f8a3d)}.action-btn.hu{background:linear-gradient(180deg,#e53935,#c62828)}.action-btn.secondary{background:linear-gradient(180deg,#9e9e9e,#6b6b6b)}.timer-box{position:absolute;bottom:12px;right:12px;padding:10px 12px;background:#ffffffe6;border-radius:8px;box-shadow:0 2px 4px #00000040;font-size:13px;color:#1f1f1f;display:flex;flex-direction:column;gap:4px;min-width:140px}.self-hand-bar{margin-top:8px;width:min(85vw,960px);display:flex;align-items:center;justify-content:center;gap:12px}.self-nameplate{background:#5b381c;color:#fff;padding:6px 10px;border-radius:6px;font-size:13px;box-shadow:0 1px 2px #0000004d;white-space:nowrap}.panel{background:#fff;border:1px solid #d9d9d9;border-radius:8px;padding:12px;box-shadow:0 1px 2px #0000000f}.panel h2{margin:0 0 8px;font-size:20px}.scores{list-style:none;padding-left:0;margin:6px 0 0}.scores li{display:flex;justify-content:space-between;padding:4px 0;font-size:14px}.log-box{border:1px solid #d9d9d9;border-radius:8px;background:#fff;padding:10px;min-height:160px;overflow-y:auto}.pill{display:inline-flex;align-items:center;gap:6px;padding:4px 8px;border-radius:999px;background:#e9f3ff;color:#1565c0;font-size:12px;font-weight:600}.indicator-ribbon{position:absolute;top:12px;left:33.5%;transform:translate(-22%);display:flex;gap:14px;align-items:center;background:#1a381a;padding:8px 12px;border:2px solid #5b381c;border-radius:10px;box-shadow:0 4px 8px #00000040;z-index:4}.indicator-card{display:flex;align-items:center;gap:6px;background:#fff;padding:6px 8px;border-radius:6px;box-shadow:inset 0 0 0 1px #5b381c}.indicator-title{font-size:12px;color:#3b2a1d;writing-mode:vertical-rl;letter-spacing:1px;text-align:center}.tail-block{display:flex;flex-direction:column;gap:4px;color:#f0f0e6}.tail-title{font-size:13px;font-weight:700;text-shadow:0 1px 2px rgba(0,0,0,.4)}.tail-row{display:flex;gap:6px;flex-wrap:wrap;max-width:260px;align-items:center}.tail-img{height:34px;width:auto;filter:drop-shadow(0 1px 1px rgba(0,0,0,.35))}.tail-img.double{height:36px}.tail-img.single{height:32px}.wall{position:absolute;background:#1c4a1e;border:8px solid #5b381c;border-radius:6px}.wall.h{height:36px;width:65%;left:17.5%}.wall.v{width:36px;height:65%;top:17.5%}.wall:before{content:"";position:absolute;top:6px;right:6px;bottom:6px;left:6px;border-radius:4px;background-image:repeating-linear-gradient(to right,rgba(255,255,255,.08),rgba(255,255,255,.08) 4px,transparent 4px,transparent 12px),repeating-linear-gradient(to bottom,rgba(255,255,255,.08),rgba(255,255,255,.08) 4px,transparent 4px,transparent 12px);opacity:.35;pointer-events:none}.wall.top{top:32px}.wall.bottom{bottom:32px}.wall.left{left:32px}.wall.right{right:32px}.canvas-table{position:relative;width:min(90vw,980px);max-width:1200px;aspect-ratio:16 / 12;border-radius:14px;box-shadow:0 12px 30px #0000004d;overflow:hidden}.canvas-table canvas{width:100%;height:100%;display:block;background:#234924}.action-floating{position:absolute;bottom:16px;left:50%;transform:translate(-50%);display:flex;gap:10px;z-index:10}.canvas-hint{position:absolute;bottom:14px;right:14px;padding:8px 12px;background:#ffffffdb;border-radius:8px;font-size:12px;color:#1f1f1f;box-shadow:0 2px 6px #0003}@keyframes fadeInUp{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes pulseGlow{0%,to{box-shadow:0 0 5px #ffffff4d}50%{box-shadow:0 0 20px #fff9}}@keyframes slideHighlight{0%{transform:translate(-100%);opacity:0}50%{opacity:1}to{transform:translate(100%);opacity:0}}.tile.highlighted{animation:pulseGlow 1s ease-in-out infinite;border-width:2px;transform:translateY(-2px)}.tile.highlighted.discard{border-color:#ff6b6b;box-shadow:0 0 10px #ff6b6b80}.tile.highlighted.meld{border-color:#4ecdc4;box-shadow:0 0 10px #4ecdc480}.tile.highlighted.kong{border-color:#f9ca24;box-shadow:0 0 10px #f9ca2480}.tile.highlighted.win{border-color:#6c5ce7;box-shadow:0 0 15px #6c5ce7b3;animation:pulseGlow .8s ease-in-out infinite}.action-preview-tooltip{animation:fadeInUp .2s ease-out}.action-preview-tooltip:before{content:"";position:absolute;bottom:-8px;left:50%;transform:translate(-50%);width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid rgba(0,0,0,.8)}.action-btn{transition:all .2s ease;position:relative;overflow:hidden}.action-btn:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.2),transparent);transition:left .5s ease}.action-btn:hover:before{left:100%}.action-btn:hover{transform:translateY(-1px);box-shadow:0 4px 8px #0000004d}.action-btn:active{transform:translateY(0);box-shadow:0 2px 4px #0003}.ting-pai-tooltip{animation:fadeInUp .3s ease-out}.ting-pai-tooltip:before{content:"";position:absolute;top:-8px;right:20px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid rgba(0,100,0,.9)}@keyframes scaleIn{0%{opacity:0;transform:scale(.8)}to{opacity:1;transform:scale(1)}}.confirmation-btn{transition:all .2s ease}.confirmation-btn:hover{transform:translateY(-1px);box-shadow:0 2px 8px #00000026}.confirmation-btn.cancel:hover{background:#f5f5f5;border-color:#bbb}.confirmation-btn.confirm:hover{filter:brightness(1.1)}.confirmation-btn:active{transform:translateY(0);box-shadow:0 1px 4px #0000001a}@keyframes actionSuccess{0%{transform:scale(1);background:var(--original-bg)}50%{transform:scale(1.05);background:#4caf50}to{transform:scale(1);background:var(--original-bg)}}@keyframes actionError{0%,to{transform:translate(0)}25%{transform:translate(-5px)}75%{transform:translate(5px)}}.action-btn.success{animation:actionSuccess .6s ease-out}.action-btn.error{animation:actionError .4s ease-out}@keyframes shake{0%,to{transform:translate(0)}25%{transform:translate(-5px)}75%{transform:translate(5px)}}.error-panel{animation:slideInDown .3s ease-out}.error-panel button{transition:all .2s ease}.error-panel button:hover{transform:translateY(-1px);box-shadow:0 2px 4px #0000001a}.error-panel button:active{transform:translateY(0)}@keyframes successPulse{0%{box-shadow:0 0 #4caf50b3}70%{box-shadow:0 0 0 10px #4caf5000}to{box-shadow:0 0 #4caf5000}}.success-feedback{animation:successPulse .6s ease-out}@keyframes loadingSpinner{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.loading-spinner{display:inline-block;width:16px;height:16px;border:2px solid #f3f3f3;border-top:2px solid #3498db;border-radius:50%;animation:loadingSpinner 1s linear infinite}.panel label{transition:all .2s ease}.panel label:hover{background:#ffffff0d;border-radius:4px;padding:4px;margin:-4px}.panel input[type=checkbox]{width:16px;height:16px;accent-color:#4caf50;transition:all .2s ease}.panel input[type=checkbox]:hover{transform:scale(1.1)}.panel input[type=checkbox]:checked{filter:drop-shadow(0 0 4px rgba(76,175,80,.5))}.confirmation-overlay{animation:fadeIn .2s ease-out}.confirmation-dialog{animation:scaleIn .3s ease-out}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}@keyframes scaleIn{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}@keyframes fadeInUp{0%{opacity:0;transform:translate(-50%) translateY(10px)}to{opacity:1;transform:translate(-50%) translateY(0)}}@keyframes slideInDown{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}
