/* What this viewer adds to DeskPark's table: initials for avatars, the other hands in a replay, the replay controls, and the bomb and spring effects DeskPark does not have. */ body { background: var(--felt-3); } .avatar { font-weight: 650; letter-spacing: 0.02em; font-family: var(--font-ui); } /* a replay shows every hand: the opponents' fanned under their seats */ .ddz__seat { display: flex; flex-direction: column; align-items: center; gap: 8px; z-index: 2; } .peek { --w: var(--cw-xs); display: flex; flex-wrap: wrap; justify-content: center; max-width: calc(var(--w) * 4.6); /* nine cards a row: a farmer's 17 in two */ padding-left: calc(var(--w) * 0.6); row-gap: 4px; } .peek > .pcard { margin-left: calc(var(--w) * -0.6); animation: fade-in 0.3s; } .replay-bar { display: flex; align-items: center; gap: 6px; font-size: 12.5px; color: var(--felt-ink-2); } .replay-bar .btn--sm { height: 30px; min-width: 36px; padding: 0 10px; font-size: 12px; } .replay-bar input[type='range'] { width: min(28vw, 260px); accent-color: var(--felt-accent); } .live-dot { display: inline-flex; align-items: center; gap: 6px; padding-right: 8px; font-size: 13px; color: var(--felt-ink-2); } .live-dot::before { content: ''; width: 8px; height: 8px; border-radius: 50%; background: #e46a55; box-shadow: 0 0 0 3px rgba(228, 106, 85, 0.25); } /* 炸弹、王炸、春天:a burst over the table that fades by itself */ .fx { position: absolute; inset: 0; z-index: 250; /* over the result sheet: a spring is the last move */ display: grid; place-items: center; pointer-events: none; animation: fx-out 1.8s var(--ease-out) forwards; } .fx::before { content: ''; position: absolute; width: 60vmin; height: 60vmin; border-radius: 50%; background: radial-gradient(closest-side, rgba(255, 196, 92, 0.55), rgba(255, 120, 60, 0.18) 60%, transparent); animation: fx-burst 0.9s var(--ease-out) both; } .fx span { position: relative; font-family: var(--font-display); font-weight: 800; font-size: clamp(44px, 11vmin, 120px); letter-spacing: 0.12em; color: #ffe2a3; -webkit-text-stroke: 2px #9a3b16; text-shadow: 0 4px 0 #6d2a10, 0 10px 30px rgba(0, 0, 0, 0.45); animation: pop-in 0.45s var(--ease-out) both; } .fx.is-spring::before { background: radial-gradient(closest-side, rgba(255, 236, 160, 0.5), rgba(120, 220, 160, 0.16) 60%, transparent); } .fx.is-spring span { color: #fff4c4; -webkit-text-stroke-color: #2f7d58; text-shadow: 0 4px 0 #1f5c4f, 0 10px 30px rgba(0, 0, 0, 0.4); } /* the result waits for the last move (and its effect) to be seen */ .sheet-backdrop.is-late, .sheet-backdrop.is-late .sheet { animation-delay: 1.4s; animation-fill-mode: both; } @keyframes fx-burst { from { transform: scale(0.2); opacity: 0; } 40% { opacity: 1; } } @keyframes fx-out { 0%, 70% { opacity: 1; } 100% { opacity: 0; visibility: hidden; } }