anvilsign in

collin/mahjong

1@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@400;600;900&display=swap');
2
3:root {
4 --depth: clamp(232px, 30vh, 330px);
5 --h-len: calc(100vw - 2 * var(--depth));
6 --v-len: 100vh;
7
8 --felt: #0f4534;
9 --felt-2: #0a3126;
10 --ivory: #f6f0e2;
11 --ivory-edge: #d9cfb6;
12 --ink: #21262b;
13 --gold: #d9b45c;
14 --red: #b3261e;
15 --green: #1c7a4b;
16 --blue: #1d5aa8;
17}
18
19* {
20 box-sizing: border-box;
21 -webkit-tap-highlight-color: transparent;
22}
23
24html,
25body,
26#root {
27 height: 100%;
28 margin: 0;
29 overflow: hidden;
30 overscroll-behavior: none;
31 touch-action: manipulation;
32 user-select: none;
33}
34
35body {
36 font-family: 'Noto Sans TC', system-ui, sans-serif;
37 color: var(--ivory);
38 background: var(--felt-2);
39}
40
41/* ---------- lobby ---------- */
42.lobby {
43 height: 100%;
44 display: flex;
45 flex-direction: column;
46 align-items: center;
47 justify-content: center;
48 gap: 0.5rem;
49 background: radial-gradient(ellipse at center, var(--felt) 0%, var(--felt-2) 75%);
50}
51.lobby h1 {
52 font-size: clamp(3rem, 9vw, 7rem);
53 font-weight: 900;
54 letter-spacing: 0.1em;
55 margin: 0 0 0.5rem;
56 color: var(--gold);
57}
58.lobby p {
59 margin: 0;
60 opacity: 0.75;
61 letter-spacing: 0.15em;
62}
63.lobby .hint {
64 opacity: 0.45;
65 font-size: 0.9rem;
66 margin-bottom: 1.5rem;
67}
68
69/* ---------- table ---------- */
70.table {
71 position: relative;
72 height: 100%;
73 width: 100%;
74 background: radial-gradient(ellipse at center, var(--felt) 0%, var(--felt-2) 80%);
75}
76
77.slot {
78 position: absolute;
79 overflow: hidden;
80}
81.slot-bottom {
82 bottom: 0;
83 left: var(--depth);
84 right: var(--depth);
85 height: var(--depth);
86}
87.slot-top {
88 top: 0;
89 left: var(--depth);
90 right: var(--depth);
91 height: var(--depth);
92}
93.slot-left {
94 left: 0;
95 top: 0;
96 width: var(--depth);
97 height: 100%;
98}
99.slot-right {
100 right: 0;
101 top: 0;
102 width: var(--depth);
103 height: 100%;
104}
105
106.seat {
107 position: absolute;
108 top: 50%;
109 left: 50%;
110 height: var(--depth);
111 display: flex;
112 flex-direction: column;
113 justify-content: flex-end;
114 align-items: center;
115 gap: 2px;
116 padding: 2px 8px 4px;
117 border-radius: 10px;
118 overflow: hidden;
119 transition: background 0.2s;
120}
121.slot-bottom .seat,
122.slot-top .seat {
123 width: var(--h-len);
124 --tile-w: min(calc((var(--h-len) - 40px) / 18), 72px);
125}
126.slot-left .seat,
127.slot-right .seat {
128 width: var(--v-len);
129 --tile-w: min(calc((var(--v-len) - 40px) / 18), 72px);
130}
131.seat.active {
132 background: linear-gradient(to top, rgba(217, 180, 92, 0.22), transparent 70%);
133}
134.seat.claiming {
135 background: linear-gradient(to top, rgba(179, 38, 30, 0.25), transparent 70%);
136 animation: pulse 1.1s ease-in-out infinite;
137}
138@keyframes pulse {
139 50% {
140 background: linear-gradient(to top, rgba(179, 38, 30, 0.45), transparent 70%);
141 }
142}
143
144/* ---------- tiles ---------- */
145/* Faces come from a 43x2 sprite sheet; the second row is the highlighted
146 variant, which we use for the tile a player has lifted to discard. */
147.tile {
148 position: relative;
149 flex: none;
150 --tw: var(--tile-w);
151 width: var(--tw);
152 height: calc(var(--tw) * 1.375);
153 border-radius: calc(var(--tw) * 0.1);
154 transition: transform 0.12s ease, filter 0.12s ease;
155}
156.tile.t-meld {
157 --tw: calc(var(--tile-w) * 0.62);
158}
159.tile.t-small {
160 --tw: calc(var(--tile-w) * 0.42);
161}
162.tile.face {
163 background-image: url('/tiles/tiles.svg');
164 background-repeat: no-repeat;
165 background-size: calc(var(--tw) * 43) calc(var(--tw) * 2.75);
166 background-position: calc(var(--col) * var(--tw) * -1) 0;
167 filter: drop-shadow(0 2px 3px rgba(0, 0, 0, 0.45));
168}
169.tile.back {
170 background-image: url('/tiles/back.png');
171 background-size: 100% 100%;
172 filter: drop-shadow(0 2px 3px rgba(0, 0, 0, 0.45));
173}
174.tile.tappable {
175 cursor: pointer;
176}
177.tile.raised {
178 transform: translateY(calc(var(--tw) * -0.28));
179 filter: drop-shadow(0 10px 12px rgba(0, 0, 0, 0.55));
180}
181/* Lifted tiles switch to the sheet's highlighted row. */
182.tile.face.raised {
183 background-position: calc(var(--col) * var(--tw) * -1) calc(var(--tw) * -1.375);
184}
185.tile.hl {
186 outline: 2px solid var(--gold);
187 outline-offset: 1px;
188 border-radius: calc(var(--tw) * 0.1);
189}
190.tile.dim {
191 opacity: 0.45;
192}
193
194/* ---------- seat sections ---------- */
195.hand {
196 display: flex;
197 gap: 2px;
198 /* the extra top room is where the 摸 tag sits */
199 height: calc(var(--tile-w) * 1.71 + 6px);
200 padding-top: calc(var(--tile-w) * 0.34);
201 align-items: flex-end;
202 flex: none;
203}
204/* Every hand tile sits in a draggable cell. */
205.hand-cell {
206 position: relative;
207 display: flex;
208 align-items: flex-end;
209 touch-action: none;
210 cursor: grab;
211}
212.hand-cell.dragging {
213 z-index: 5;
214 cursor: grabbing;
215}
216.hand-cell.dragging .tile {
217 transform: translateY(calc(var(--tile-w) * -0.2)) scale(1.06);
218 filter: drop-shadow(0 14px 18px rgba(0, 0, 0, 0.65));
219}
220.drawn-slot {
221 margin-left: calc(var(--tile-w) * 0.45);
222}
223.drawn-slot .tile {
224 outline: 2px solid var(--gold);
225 outline-offset: 1px;
226 border-radius: calc(var(--tw) * 0.1);
227}
228.drawn-tag {
229 position: absolute;
230 top: calc(var(--tile-w) * -0.3);
231 left: 0;
232 right: 0;
233 text-align: center;
234 font-size: calc(var(--tile-w) * 0.24);
235 font-weight: 600;
236 letter-spacing: 0.1em;
237 color: var(--gold);
238 white-space: nowrap;
239 pointer-events: none;
240}
241
242.melds {
243 display: flex;
244 gap: 10px;
245 flex-wrap: wrap;
246 justify-content: center;
247 min-height: calc(var(--tile-w) * 0.86);
248 flex: none;
249}
250.meld {
251 display: flex;
252 gap: 1px;
253}
254.meld.flowers {
255 margin-left: 12px;
256 padding-left: 12px;
257 border-left: 1px dashed rgba(246, 240, 226, 0.3);
258}
259.discards {
260 display: flex;
261 flex-wrap: wrap;
262 gap: 2px;
263 justify-content: center;
264 align-content: flex-start;
265 max-width: 94%;
266 min-height: 0;
267 margin-bottom: 2px;
268 flex: 1 1 0;
269 overflow-y: auto;
270 scrollbar-width: none;
271}
272
273.nameplate {
274 display: flex;
275 align-items: center;
276 gap: 8px;
277 font-size: 13px;
278 letter-spacing: 0.08em;
279 opacity: 0.9;
280 padding-top: 2px;
281 flex: none;
282}
283.nameplate .wind {
284 display: flex;
285 flex-direction: column;
286 align-items: center;
287 line-height: 1;
288 font-size: 18px;
289 font-weight: 900;
290 color: var(--gold);
291}
292.nameplate .wind em {
293 font-style: normal;
294 font-size: 8px;
295 font-weight: 600;
296 letter-spacing: 0.1em;
297 text-transform: uppercase;
298 opacity: 0.6;
299}
300.nameplate .wind.dealer {
301 color: #ff7a68;
302}
303.nameplate .tag {
304 font-size: 11px;
305 padding: 1px 6px;
306 border-radius: 999px;
307 background: rgba(217, 180, 92, 0.2);
308 border: 1px solid rgba(217, 180, 92, 0.5);
309}
310.nameplate .tag.ting {
311 background: rgba(46, 170, 120, 0.2);
312 border-color: rgba(46, 170, 120, 0.6);
313}
314.nameplate .tag.sacred {
315 background: rgba(179, 38, 30, 0.22);
316 border-color: rgba(224, 108, 96, 0.6);
317 color: #ffc9c2;
318}
319.nameplate .chips {
320 margin-left: 4px;
321 font-weight: 900;
322 font-size: 16px;
323 color: var(--gold);
324}
325
326.actionbar {
327 display: flex;
328 gap: 8px;
329 align-items: center;
330 justify-content: flex-end;
331 padding-right: calc(var(--tile-w) * 0.4);
332 align-self: stretch;
333 min-height: 40px;
334 flex-wrap: wrap;
335 flex: none;
336}
337.waiting {
338 font-size: 12px;
339 opacity: 0.5;
340}
341.delta {
342 font-size: 20px;
343 font-weight: 900;
344}
345.delta.up {
346 color: #5fd39a;
347}
348.delta.down {
349 color: #ff8a80;
350}
351
352/* ---------- buttons ---------- */
353.btn {
354 font-family: inherit;
355 font-size: 17px;
356 font-weight: 400;
357 color: #1a1a1a;
358 background: linear-gradient(180deg, #f3e6c4, #d9b45c);
359 border: none;
360 border-radius: 8px;
361 padding: 6px 15px;
362 min-height: 46px;
363 box-shadow: 0 2px 0 #9a7d38;
364 cursor: pointer;
365 display: inline-flex;
366 align-items: center;
367 gap: 6px;
368}
369.btn:active {
370 transform: translateY(2px);
371 box-shadow: none;
372}
373.btn-sub {
374 font-size: 12px;
375 opacity: 0.7;
376}
377
378/* Bilingual label: the called term above, English cue below. */
379.bi {
380 display: flex;
381 flex-direction: column;
382 align-items: center;
383 justify-content: center;
384 line-height: 1.05;
385 gap: 1px;
386}
387.bi .zh {
388 font-size: 19px;
389 font-weight: 400;
390 letter-spacing: 0.06em;
391}
392.bi .en {
393 font-size: 9.5px;
394 font-weight: 600;
395 letter-spacing: 0.11em;
396 text-transform: uppercase;
397 opacity: 0.68;
398 white-space: nowrap;
399}
400.bi .bi-sub {
401 font-size: 11px;
402 opacity: 0.72;
403 white-space: nowrap;
404}
405.big-btn .bi .zh {
406 font-size: 24px;
407}
408.big-btn .bi .en {
409 font-size: 11px;
410}
411.btn.claim.hu {
412 background: linear-gradient(180deg, #ff8a7a, #c0392b);
413 color: #fff;
414 box-shadow: 0 2px 0 #7c231a;
415}
416.btn.claim.kong,
417.btn.claim.pung {
418 background: linear-gradient(180deg, #8fd3ff, #2b7ec0);
419 color: #fff;
420 box-shadow: 0 2px 0 #1c527d;
421}
422.btn.claim.chow {
423 background: linear-gradient(180deg, #9be3b7, #2e9e63);
424 color: #fff;
425 box-shadow: 0 2px 0 #1d6640;
426}
427.btn.sort {
428 min-height: 20px;
429 padding: 1px 8px;
430 font-size: 11px;
431 letter-spacing: 0.06em;
432 border-radius: 999px;
433}
434.btn.proceed {
435 background: linear-gradient(180deg, #f3e6c4, #d9b45c);
436}
437.btn.pass,
438.btn.ghost {
439 background: transparent;
440 color: rgba(246, 240, 226, 0.75);
441 border: 1px solid rgba(246, 240, 226, 0.35);
442 box-shadow: none;
443}
444.btn.discard {
445 background: linear-gradient(180deg, #fff2cf, #e0c070);
446}
447.big-btn {
448 font-size: 22px;
449 padding: 12px 34px;
450 min-height: 56px;
451}
452
453/* ---------- center ---------- */
454.center {
455 position: absolute;
456 inset: var(--depth);
457 display: flex;
458 flex-direction: column;
459 align-items: center;
460 justify-content: center;
461 gap: 10px;
462 pointer-events: none;
463}
464.center > * {
465 pointer-events: auto;
466}
467/* Everything in the centre reads on top of the wall square. */
468.info,
469.last-discard,
470.prompt,
471.result,
472.log,
473.log,
474.info {
475 display: flex;
476 flex-direction: column;
477 align-items: center;
478 gap: 2px;
479 opacity: 0.9;
480 text-align: center;
481}
482.info .round,
483.info .wall {
484 display: flex;
485 flex-direction: column;
486 align-items: center;
487 line-height: 1.05;
488}
489.info .wall {
490 margin-top: 10px;
491 padding-top: 10px;
492 border-top: 1px solid rgba(246, 240, 226, 0.14);
493}
494.info .big {
495 font-size: 40px;
496 font-weight: 400;
497 color: var(--gold);
498}
499.info .lbl {
500 font-size: 11px;
501 letter-spacing: 0.06em;
502 opacity: 0.6;
503}
504.info .hand-no {
505 margin-top: 8px;
506 font-size: 11px;
507 opacity: 0.5;
508 letter-spacing: 0.1em;
509}
510/* The wall: a square of four staggered sides, 18 stacks of two each, drawn
511 with the tileset's own blank tile. Sits behind the centre readout. */
512.wall-ring {
513 position: absolute;
514 top: 50%;
515 left: 50%;
516 --ring: min(calc(100vh - 2 * var(--depth) - 16px), calc(100vw - 2 * var(--depth) - 16px), 560px);
517 --ws: calc(var(--ring) / 19.375);
518 --wd: calc(var(--ws) * 1.375);
519 width: var(--ring);
520 height: var(--ring);
521 transform: translate(-50%, -50%);
522 pointer-events: none;
523 z-index: 0;
524}
525.wall-side {
526 position: absolute;
527 display: flex;
528}
529/* Pinwheel: each side starts where the previous one ended. */
530.wall-side.top {
531 top: 0;
532 left: var(--wd);
533 right: 0;
534 height: var(--wd);
535}
536.wall-side.right {
537 top: var(--wd);
538 right: 0;
539 bottom: 0;
540 width: var(--wd);
541 flex-direction: column;
542}
543.wall-side.bottom {
544 bottom: 0;
545 left: 0;
546 right: var(--wd);
547 height: var(--wd);
548 flex-direction: row-reverse;
549}
550.wall-side.left {
551 top: 0;
552 left: 0;
553 bottom: var(--wd);
554 width: var(--wd);
555 flex-direction: column-reverse;
556}
557.wall-stack {
558 position: relative;
559 flex: none;
560 width: var(--ws);
561 height: var(--wd);
562}
563.wall-side.left .wall-stack,
564.wall-side.right .wall-stack {
565 width: var(--wd);
566 height: var(--ws);
567}
568.wall-stack i {
569 position: absolute;
570 top: 50%;
571 left: 50%;
572 width: var(--ws);
573 height: var(--wd);
574 margin: calc(var(--wd) / -2) 0 0 calc(var(--ws) / -2);
575 background-image: url('/tiles/back.png');
576 background-size: 100% 100%;
577 filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.45));
578}
579.wall-side.left .wall-stack i,
580.wall-side.right .wall-stack i {
581 transform: rotate(90deg);
582}
583/* One tile left in the stack. */
584.wall-stack.s1 i {
585 opacity: 0.8;
586 transform: scale(0.86);
587}
588.wall-side.left .wall-stack.s1 i,
589.wall-side.right .wall-stack.s1 i {
590 transform: rotate(90deg) scale(0.86);
591}
592/* Spent stacks stay as ghosts so the square keeps its shape. */
593.wall-stack.s0 i {
594 background: none;
595 filter: none;
596 border: 1px dashed rgba(246, 240, 226, 0.11);
597 border-radius: 2px;
598}
599.wall-stack.dead i {
600 opacity: 0.4;
601 filter: grayscale(0.6);
602}
603.wall-stack.next::after {
604 content: '';
605 position: absolute;
606 inset: -2px;
607 border: 2px solid var(--gold);
608 border-radius: 3px;
609 box-shadow: 0 0 12px rgba(217, 180, 92, 0.7);
610}
611
612.facing {
613 position: relative;
614 z-index: 1;
615 display: flex;
616 flex-direction: column;
617 align-items: center;
618 gap: 8px;
619 transition: transform 0.35s ease;
620}
621
622.last-discard {
623 display: flex;
624 flex-direction: column;
625 align-items: center;
626 gap: 6px;
627 --tile-w: 64px;
628}
629.ld-label {
630 font-size: 12px;
631 opacity: 0.6;
632}
633.prompt {
634 font-size: 15px;
635 letter-spacing: 0.1em;
636 opacity: 0.8;
637}
638.prompt.warn {
639 color: #ffb4a2;
640 font-weight: 600;
641}
642.log {
643 position: absolute;
644 bottom: 8px;
645 left: 12px;
646 font-size: 12px;
647 line-height: 1.5;
648 opacity: 0.55;
649 pointer-events: none;
650}
651
652.result {
653 background: rgba(10, 30, 24, 0.94);
654 border: 1px solid rgba(217, 180, 92, 0.45);
655 border-radius: 14px;
656 padding: 18px 26px;
657 display: flex;
658 flex-direction: column;
659 align-items: center;
660 gap: 10px;
661 max-height: 90%;
662 overflow: auto;
663}
664.result h2 {
665 margin: 0;
666 font-size: 24px;
667 color: var(--gold);
668}
669.result .wt {
670 color: var(--ivory);
671 opacity: 0.8;
672}
673.tai-list {
674 display: grid;
675 grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
676 gap: 2px 18px;
677 font-size: 14px;
678 width: 100%;
679}
680.tai-item {
681 display: flex;
682 align-items: baseline;
683 justify-content: space-between;
684 gap: 12px;
685 padding: 2px 0;
686 border-bottom: 1px dotted rgba(246, 240, 226, 0.2);
687}
688.tai-name {
689 display: flex;
690 flex-direction: column;
691 line-height: 1.15;
692}
693.tai-name em {
694 font-style: normal;
695 font-size: 10px;
696 letter-spacing: 0.08em;
697 text-transform: uppercase;
698 opacity: 0.55;
699}
700.tai-val {
701 font-weight: 700;
702 color: var(--gold);
703}
704.deltas {
705 display: flex;
706 gap: 16px;
707 font-size: 14px;
708 opacity: 0.9;
709}
710.deltas .up {
711 color: #5fd39a;
712}
713.deltas .down {
714 color: #ff8a80;
715}
716
717/* ---------- help panel ---------- */
718.helpbtn {
719 margin-left: 2px;
720 width: 22px;
721 height: 22px;
722 border-radius: 50%;
723 border: 1px solid rgba(246, 240, 226, 0.35);
724 background: transparent;
725 color: rgba(246, 240, 226, 0.75);
726 font-family: inherit;
727 font-size: 12px;
728 line-height: 1;
729 cursor: pointer;
730}
731/* The rules panel gets its own deeper slot so it is comfortable to read. */
732.help-slot {
733 position: absolute;
734 inset: 0;
735 z-index: 30;
736 background: rgba(4, 18, 14, 0.55);
737}
738.help-slot.slot-bottom,
739.help-slot.slot-top,
740.help-slot.slot-left,
741.help-slot.slot-right {
742 inset: 0;
743 width: auto;
744 height: auto;
745}
746.help {
747 position: absolute;
748 top: 50%;
749 left: 50%;
750 height: var(--hd);
751 z-index: 31;
752 display: flex;
753 flex-direction: column;
754 background: rgba(8, 32, 25, 0.985);
755 border: 1px solid rgba(217, 180, 92, 0.4);
756 border-radius: 12px;
757 padding: 10px 18px 14px;
758 box-shadow: 0 18px 50px rgba(0, 0, 0, 0.6);
759}
760/* Anchored to the asking player's own edge, and rotated to face them. The
761 leading translate is applied last, so it shifts the box in screen space. */
762.help-slot.slot-bottom .help,
763.help-slot.slot-top .help {
764 width: calc(100vw - 60px);
765 --hd: min(52vh, 560px);
766 --off: calc(50vh - var(--hd) / 2 - 14px);
767}
768.help-slot.slot-left .help,
769.help-slot.slot-right .help {
770 width: calc(100vh - 60px);
771 --hd: min(52vw, 560px);
772 --off: calc(50vw - var(--hd) / 2 - 14px);
773}
774.help-slot.slot-bottom .help {
775 translate: 0 var(--off);
776}
777.help-slot.slot-top .help {
778 translate: 0 calc(var(--off) * -1);
779}
780.help-slot.slot-left .help {
781 translate: calc(var(--off) * -1) 0;
782}
783.help-slot.slot-right .help {
784 translate: var(--off) 0;
785}
786.help-head {
787 display: flex;
788 align-items: center;
789 justify-content: space-between;
790 gap: 16px;
791 flex: none;
792}
793.help-head h3 {
794 margin: 0;
795 font-size: 15px;
796 font-weight: 400;
797 letter-spacing: 0.08em;
798 color: var(--gold);
799}
800.help-head .btn {
801 min-height: 30px;
802 padding: 2px 12px;
803 font-size: 13px;
804}
805.help-body {
806 flex: 1 1 0;
807 min-height: 0;
808 overflow-y: auto;
809 columns: 4;
810 column-gap: 26px;
811 column-fill: auto;
812 padding-top: 8px;
813 overflow-x: auto;
814 scrollbar-width: thin;
815}
816.help-body section {
817 break-inside: avoid;
818 margin-bottom: 10px;
819}
820.help-body h4 {
821 margin: 0 0 2px;
822 font-size: 13px;
823 font-weight: 400;
824 color: var(--gold);
825 letter-spacing: 0.06em;
826}
827.help-body h4 em {
828 font-style: normal;
829 font-size: 9px;
830 letter-spacing: 0.12em;
831 text-transform: uppercase;
832 opacity: 0.55;
833 margin-left: 4px;
834}
835.help-body p {
836 margin: 0 0 4px;
837 display: flex;
838 flex-direction: column;
839 line-height: 1.35;
840 font-size: 11.5px;
841}
842.help-body p em {
843 font-style: normal;
844 font-size: 10.5px;
845 opacity: 0.6;
846}
847.help-body .credit {
848 opacity: 0.6;
849}
850
851/* ---------- lobby resume ---------- */
852.lobby .sub {
853 font-size: 0.95rem;
854}
855.resume {
856 margin-top: 1.4rem;
857 padding: 12px 26px;
858 border: 1px solid rgba(217, 180, 92, 0.35);
859 border-radius: 12px;
860 background: rgba(0, 0, 0, 0.2);
861 text-align: center;
862 display: flex;
863 flex-direction: column;
864 gap: 6px;
865}
866.resume-line {
867 font-size: 14px;
868 color: var(--gold);
869 letter-spacing: 0.06em;
870}
871.resume-scores {
872 display: flex;
873 gap: 18px;
874 justify-content: center;
875 font-size: 13px;
876 opacity: 0.8;
877}
878.resume-scores b {
879 color: var(--gold);
880 font-weight: 600;
881}
882.resume-when {
883 font-size: 11px;
884 opacity: 0.45;
885 letter-spacing: 0.08em;
886}
887.lobby-buttons {
888 display: flex;
889 gap: 14px;
890 margin-top: 1.6rem;
891 align-items: center;
892}
893
894/* ---------- sound ---------- */
895.lobby-extras {
896 margin-top: 1.4rem;
897 display: flex;
898 gap: 12px;
899 align-items: center;
900}
901.sound-toggle {
902 min-height: 34px;
903 padding: 2px 14px;
904 font-size: 13px;
905 letter-spacing: 0.06em;
906 border-radius: 999px;
907 gap: 8px;
908}
909.sound-toggle.on {
910 border-color: rgba(217, 180, 92, 0.7);
911 color: var(--gold);
912}
913.sound-toggle.compact {
914 min-height: 28px;
915 padding: 2px 9px;
916 font-size: 15px;
917}
918.sound-toggle .spk {
919 font-size: 15px;
920 line-height: 1;
921}
922
923/* ---------- shared table controls ---------- */
924/* Bottom-right of the centre square, opposite the log. Unrotated on purpose:
925 it belongs to the table, not to a seat. */
926.table-controls {
927 position: absolute;
928 right: 10px;
929 bottom: 8px;
930 display: flex;
931 align-items: center;
932 gap: 8px;
933}
934.btn.undo {
935 min-height: 34px;
936 padding: 3px 14px;
937 border-radius: 999px;
938 gap: 9px;
939 max-width: 40vh;
940}
941.undo-arrow {
942 font-size: 17px;
943 line-height: 1;
944 color: var(--gold);
945}
946.undo-what {
947 display: flex;
948 flex-direction: column;
949 align-items: flex-start;
950 line-height: 1.15;
951 min-width: 0;
952}
953.undo-what .zh {
954 font-size: 13px;
955 letter-spacing: 0.05em;
956}
957.undo-what .en {
958 font-size: 9px;
959 letter-spacing: 0.09em;
960 text-transform: uppercase;
961 opacity: 0.55;
962 white-space: nowrap;
963 overflow: hidden;
964 text-overflow: ellipsis;
965 max-width: 100%;
966}
967
968/* ---------- result: one block per winner ---------- */
969.result .win {
970 display: flex;
971 flex-direction: column;
972 align-items: center;
973 gap: 8px;
974 width: 100%;
975}
976.result .win + .win {
977 padding-top: 10px;
978 border-top: 1px solid rgba(217, 180, 92, 0.3);
979}
980.result .liable {
981 font-size: 12px;
982 letter-spacing: 0.08em;
983 color: #ffb4a2;
984}
985.result .multi {
986 font-size: 12px;
987 letter-spacing: 0.1em;
988 color: var(--gold);
989 opacity: 0.85;
990}
991
992/* ---------- settings ---------- */
993.over-buttons {
994 display: flex;
995 gap: 12px;
996 align-items: center;
997}
998.settings-scrim {
999 position: absolute;
1000 inset: 0;
1001 z-index: 40;
1002 background: rgba(4, 18, 14, 0.72);
1003 display: flex;
1004 align-items: center;
1005 justify-content: center;
1006 padding: 20px;
1007}
1008.settings {
1009 width: min(880px, 100%);
1010 max-height: 100%;
1011 display: flex;
1012 flex-direction: column;
1013 background: rgba(8, 32, 25, 0.99);
1014 border: 1px solid rgba(217, 180, 92, 0.4);
1015 border-radius: 14px;
1016 box-shadow: 0 18px 50px rgba(0, 0, 0, 0.6);
1017 padding: 12px 20px 16px;
1018}
1019.settings-head {
1020 display: flex;
1021 align-items: center;
1022 justify-content: space-between;
1023 gap: 16px;
1024 flex: none;
1025 padding-bottom: 8px;
1026 border-bottom: 1px solid rgba(246, 240, 226, 0.12);
1027}
1028.settings-head h3 {
1029 margin: 0;
1030 font-size: 17px;
1031 font-weight: 400;
1032 letter-spacing: 0.08em;
1033 color: var(--gold);
1034}
1035.settings-head-btns {
1036 display: flex;
1037 gap: 10px;
1038}
1039.settings-head .btn {
1040 min-height: 36px;
1041 padding: 2px 16px;
1042 font-size: 14px;
1043}
1044.settings-body {
1045 flex: 1 1 0;
1046 min-height: 0;
1047 overflow-y: auto;
1048 scrollbar-width: thin;
1049 padding-top: 10px;
1050 display: grid;
1051 grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
1052 gap: 4px 28px;
1053 align-content: start;
1054}
1055.settings-body section {
1056 margin-bottom: 12px;
1057}
1058.settings-body h4 {
1059 margin: 0 0 6px;
1060 font-size: 13px;
1061 font-weight: 400;
1062 color: var(--gold);
1063 letter-spacing: 0.06em;
1064}
1065.settings-body h4 em {
1066 font-style: normal;
1067 font-size: 9px;
1068 letter-spacing: 0.12em;
1069 text-transform: uppercase;
1070 opacity: 0.55;
1071 margin-left: 5px;
1072}
1073.settings .field {
1074 display: flex;
1075 align-items: center;
1076 gap: 10px;
1077 padding: 3px 0;
1078}
1079.settings .f-label {
1080 display: flex;
1081 align-items: baseline;
1082 gap: 5px;
1083 font-size: 13px;
1084 min-width: 92px;
1085 opacity: 0.85;
1086}
1087.settings .f-label em {
1088 font-style: normal;
1089 font-size: 9px;
1090 letter-spacing: 0.1em;
1091 text-transform: uppercase;
1092 opacity: 0.55;
1093}
1094.settings input[type='text'],
1095.settings input:not([type]),
1096.settings input[type='number'] {
1097 flex: 1 1 0;
1098 min-width: 0;
1099 font-family: inherit;
1100 font-size: 15px;
1101 color: var(--ivory);
1102 background: rgba(0, 0, 0, 0.28);
1103 border: 1px solid rgba(246, 240, 226, 0.25);
1104 border-radius: 7px;
1105 padding: 7px 10px;
1106 user-select: text;
1107}
1108.settings input:focus {
1109 outline: none;
1110 border-color: rgba(217, 180, 92, 0.8);
1111}
1112.settings input[type='number'] {
1113 max-width: 110px;
1114}
1115.settings input[type='range'] {
1116 flex: 1 1 0;
1117 accent-color: var(--gold);
1118}
1119.settings input:disabled {
1120 opacity: 0.4;
1121}
1122.settings .switch {
1123 display: grid;
1124 grid-template-columns: auto 1fr;
1125 gap: 2px 10px;
1126 align-items: center;
1127 padding: 5px 0;
1128 cursor: pointer;
1129}
1130.settings .switch input {
1131 width: 20px;
1132 height: 20px;
1133 accent-color: var(--gold);
1134 cursor: pointer;
1135}
1136.settings .sw-name {
1137 display: flex;
1138 align-items: baseline;
1139 gap: 6px;
1140 font-size: 14px;
1141}
1142.settings .sw-name em {
1143 font-style: normal;
1144 font-size: 9px;
1145 letter-spacing: 0.1em;
1146 text-transform: uppercase;
1147 opacity: 0.55;
1148}
1149.settings .note {
1150 grid-column: 2;
1151 font-size: 11px;
1152 line-height: 1.35;
1153 opacity: 0.55;
1154}
1155.settings .switch.dead {
1156 opacity: 0.4;
1157 cursor: default;
1158}
1159.settings .note.lock {
1160 grid-column: auto;
1161 margin: 4px 0 0;
1162 color: #ffb4a2;
1163 opacity: 0.75;
1164}