dok/public/css/1v1.css
2026-04-13 09:40:48 +01:00

976 lines
24 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
/*
── SKALIERUNGS-SYSTEM ──────────────────────────────────────────────────────
--s: universeller Skalierungsfaktor basierend auf der Viewport-Breite.
Basis-Design: 1800 px Breite → 1vw ≙ 0.0556 * 1800 = 1 Designpixel.
Alle Größen: calc(var(--s) * <Designwert>)
clamp() verhindert, dass es auf kleinen Screens unlesbar wird.
────────────────────────────────────────────────────────────────────────────
*/
:root {
--s: max(0.45px, 0.0556vw, 1px); /* 1 Designpixel */
}
body {
width: 100vw;
height: 100vh;
overflow: hidden;
font-family: "Cinzel", serif;
}
.board {
width: 100vw;
height: 100vh;
position: relative;
background-image: url(../images/arena_hintergrund/1.jpg);
background-size: cover;
background-position: center;
}
.board::before {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(
to bottom,
rgba(0, 0, 0, 0.1) 0%,
rgba(0, 0, 0, 0.05) 50%,
rgba(0, 0, 0, 0.65) 100%
);
z-index: 0;
}
/* ── TOP BAR ── */
.top-bar {
position: absolute;
top: 0;
left: 0;
right: 0;
height: calc(var(--s) * 48);
background: rgba(0, 0, 0, 0.55);
backdrop-filter: blur(6px);
border-bottom: 1px solid rgba(255, 215, 80, 0.3);
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 calc(var(--s) * 20);
z-index: 20;
}
.top-bar .game-title {
font-size: calc(var(--s) * 14);
letter-spacing: calc(var(--s) * 6);
color: rgba(255, 215, 80, 0.9);
text-transform: uppercase;
text-shadow: 0 1px 8px rgba(0, 0, 0, 0.8);
}
.top-bar .top-icons {
display: flex;
gap: calc(var(--s) * 8);
}
.top-bar .top-icon {
width: calc(var(--s) * 34);
height: calc(var(--s) * 34);
border-radius: calc(var(--s) * 6);
background: rgba(255, 255, 255, 0.08);
border: 1px solid rgba(255, 215, 80, 0.3);
display: flex;
align-items: center;
justify-content: center;
font-size: calc(var(--s) * 16);
cursor: pointer;
transition: background 0.2s;
}
.top-bar .top-icon:hover {
background: rgba(255, 215, 80, 0.2);
}
.end-turn-btn {
background: linear-gradient(135deg, #8b1a1a, #c0392b);
border: 2px solid rgba(255, 100, 100, 0.5);
border-radius: calc(var(--s) * 8);
color: #fff;
font-family: "Cinzel", serif;
font-size: calc(var(--s) * 12);
letter-spacing: calc(var(--s) * 2);
padding: calc(var(--s) * 7) calc(var(--s) * 20);
cursor: pointer;
text-transform: uppercase;
box-shadow: 0 0 calc(var(--s) * 14) rgba(200, 0, 0, 0.4);
transition: all 0.2s;
}
.end-turn-btn:hover {
background: linear-gradient(135deg, #a02020, #e74c3c);
box-shadow: 0 0 calc(var(--s) * 24) rgba(200, 0, 0, 0.7);
}
/* ── AVATAR (rectangular) ── */
.avatar {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: calc(var(--s) * 150);
height: calc(var(--s) * 200);
border-radius: calc(var(--s) * 10);
border: 2px solid rgba(255, 215, 80, 0.7);
background: rgba(0, 0, 0, 0.45);
backdrop-filter: blur(8px);
display: flex;
flex-direction: column;
overflow: hidden;
cursor: pointer;
z-index: 10;
box-shadow:
0 0 calc(var(--s) * 24) rgba(255, 215, 80, 0.2),
inset 0 0 calc(var(--s) * 20) rgba(0, 0, 0, 0.5);
transition:
border-color 0.3s,
box-shadow 0.3s;
}
.avatar:hover {
border-color: rgba(255, 215, 80, 1);
box-shadow: 0 0 calc(var(--s) * 38) rgba(255, 215, 80, 0.5);
}
.avatar-left {
left: calc(var(--s) * 40);
}
.avatar-right {
right: calc(var(--s) * 40);
}
.avatar input[type="file"] {
position: absolute;
inset: 0;
opacity: 0;
cursor: pointer;
z-index: 3;
}
.avatar .av-img {
width: 100%;
flex: 1;
object-fit: cover;
display: none;
}
.avatar .av-placeholder {
flex: 1;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 6px;
}
.avatar .av-placeholder .av-icon {
font-size: calc(var(--s) * 38);
opacity: 0.5;
pointer-events: none;
}
.avatar .av-placeholder .av-lbl {
font-size: calc(var(--s) * 9);
color: rgba(255, 215, 80, 0.75);
letter-spacing: calc(var(--s) * 2);
text-transform: uppercase;
pointer-events: none;
}
/* Stats bar inside avatar */
.avatar .av-stats {
background: rgba(0, 0, 0, 0.6);
border-top: 1px solid rgba(255, 215, 80, 0.3);
display: flex;
justify-content: space-around;
padding: 4px 6px;
z-index: 2;
}
.stat {
display: flex;
align-items: center;
gap: calc(var(--s) * 3);
font-size: calc(var(--s) * 11);
color: #fff;
}
.stat .s-icon {
font-size: calc(var(--s) * 13);
}
.stat .s-val {
font-weight: 700;
font-size: calc(var(--s) * 13);
}
.hp .s-val {
color: #e74c3c;
}
.mana .s-val {
color: #3498db;
}
/* HP orb bottom-left/right of avatar */
.hp-orb {
position: absolute;
bottom: calc(var(--s) * -18);
width: calc(var(--s) * 36);
height: calc(var(--s) * 36);
border-radius: 50%;
background: radial-gradient(circle at 40% 35%, #e74c3c, #8b0000);
border: 2px solid rgba(255, 100, 100, 0.6);
display: flex;
align-items: center;
justify-content: center;
font-size: calc(var(--s) * 11);
font-weight: 700;
color: #fff;
box-shadow: 0 0 calc(var(--s) * 12) rgba(220, 0, 0, 0.6);
z-index: 11;
}
.avatar-left .hp-orb {
left: calc(var(--s) * -10);
}
.avatar-right .hp-orb {
right: calc(var(--s) * -10);
}
/* ── CENTER CARD AREA ── */
.card-area {
position: absolute;
left: calc(var(--s) * 220);
right: calc(var(--s) * 220);
top: 50%;
transform: translateY(-50%);
display: flex;
flex-direction: column;
gap: calc(var(--s) * 16);
align-items: center;
z-index: 10;
}
.row-label {
font-size: calc(var(--s) * 9);
letter-spacing: calc(var(--s) * 3);
color: rgba(255, 215, 80, 0.45);
text-transform: uppercase;
align-self: flex-start;
margin-left: calc(var(--s) * 4);
margin-bottom: calc(var(--s) * -10);
}
.card-row {
display: flex;
gap: calc(var(--s) * 10);
}
.card-slot {
width: calc(var(--s) * 105);
height: calc(var(--s) * 160);
border-radius: calc(var(--s) * 9);
border: 2px dashed rgba(255, 215, 80, 0.35);
background: rgba(0, 0, 0, 0.25);
backdrop-filter: blur(3px);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
cursor: pointer;
transition: all 0.22s ease;
box-shadow: 0 calc(var(--s) * 4) calc(var(--s) * 14) rgba(0, 0, 0, 0.3);
position: relative;
overflow: hidden;
}
.card-slot::before {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.05) 0%,
transparent 55%
);
}
.card-slot .slot-num {
font-size: calc(var(--s) * 9);
color: rgba(255, 255, 255, 0.2);
letter-spacing: calc(var(--s) * 1);
position: absolute;
bottom: calc(var(--s) * 6);
}
.card-slot .slot-icon {
font-size: calc(var(--s) * 18);
opacity: 0.2;
}
/* ── BOTTOM BAR ── */
.bottom-bar {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: calc(var(--s) * 185);
background: linear-gradient(
to top,
rgba(0, 0, 0, 0.82) 0%,
rgba(0, 0, 0, 0.5) 70%,
transparent 100%
);
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 calc(var(--s) * 20);
z-index: 15;
}
/* Left side: portrait + resources */
.player-hud {
display: flex;
align-items: center;
gap: 14px;
min-width: 200px;
}
.portrait {
width: calc(var(--s) * 80);
height: calc(var(--s) * 80);
border-radius: 50%;
border: 3px solid rgba(255, 215, 80, 0.7);
background: rgba(0, 0, 0, 0.5);
overflow: hidden;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: calc(var(--s) * 30);
cursor: pointer;
position: relative;
box-shadow: 0 0 calc(var(--s) * 18) rgba(255, 215, 80, 0.3);
}
.portrait input[type="file"] {
position: absolute;
inset: 0;
opacity: 0;
cursor: pointer;
z-index: 2;
}
.portrait img {
width: 100%;
height: 100%;
object-fit: cover;
display: none;
border-radius: 50%;
}
.res-bars {
display: flex;
flex-direction: column;
gap: calc(var(--s) * 6);
}
.res-bar-wrap {
display: flex;
align-items: center;
gap: calc(var(--s) * 6);
}
.res-bar-wrap .res-icon {
font-size: calc(var(--s) * 14);
width: calc(var(--s) * 20);
text-align: center;
}
.res-bar {
width: calc(var(--s) * 90);
height: calc(var(--s) * 12);
background: rgba(0, 0, 0, 0.5);
border-radius: calc(var(--s) * 6);
overflow: hidden;
border: 1px solid rgba(255, 255, 255, 0.15);
}
.res-fill {
height: 100%;
border-radius: 6px;
}
.res-fill.hp-fill {
width: 75%;
background: linear-gradient(to right, #8b0000, #e74c3c);
}
.res-fill.mana-fill {
width: 60%;
background: linear-gradient(to right, #1a237e, #3498db);
}
.res-fill.armor-fill {
width: 40%;
background: linear-gradient(to right, #4a4a00, #f1c40f);
}
.res-val {
font-size: calc(var(--s) * 11);
color: #fff;
font-weight: 700;
min-width: calc(var(--s) * 28);
}
/* Hand cards */
.hand-area {
display: flex;
gap: calc(var(--s) * 8);
align-items: center;
flex: 1;
justify-content: center;
}
.hand-slot {
width: calc(var(--s) * 105);
height: calc(var(--s) * 160);
border-radius: calc(var(--s) * 9);
border: 2px dashed rgba(255, 215, 80, 0.35);
background: rgba(0, 0, 0, 0.4);
/* backdrop-filter BEWUSST ENTFERNT erzeugt GPU-Compositing-Ebene
die position:absolute-Kinder verschluckt (Browser-Bug) */
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
transition:
border-color 0.2s ease,
transform 0.2s ease,
box-shadow 0.2s ease,
opacity 0.2s ease;
position: relative;
z-index: 0; /* eigener Stacking-Context: img z-index:2 schlaegt ::before sicher kein isolation:isolate (GPU-Compositing-Bug mit overflow:hidden) */
overflow: visible;
box-shadow: 0 calc(var(--s) * 4) calc(var(--s) * 12) rgba(0, 0, 0, 0.4);
}
.hand-slot::before {
content: "";
position: absolute;
inset: 0;
z-index: 0; /* explizit unter dem Karten-Image (z-index:2) */
background: linear-gradient(
160deg,
rgba(255, 255, 255, 0.06) 0%,
transparent 50%
);
}
.hand-slot:hover {
border-color: rgba(255, 215, 80, 0.9);
transform: translateY(calc(var(--s) * -10));
box-shadow: 0 calc(var(--s) * 16) calc(var(--s) * 28) rgba(255, 215, 80, 0.2);
}
.hand-slot .hs-icon {
font-size: calc(var(--s) * 22);
opacity: 0.2;
}
/* Right side: action icons */
.action-hud {
display: flex;
flex-direction: column;
gap: calc(var(--s) * 6);
align-items: flex-end;
min-width: calc(var(--s) * 140);
}
.action-row {
display: flex;
gap: calc(var(--s) * 6);
}
.action-btn {
width: calc(var(--s) * 40);
height: calc(var(--s) * 40);
border-radius: calc(var(--s) * 8);
background: rgba(0, 0, 0, 0.5);
border: 1px solid rgba(255, 215, 80, 0.35);
display: flex;
align-items: center;
justify-content: center;
font-size: calc(var(--s) * 18);
cursor: pointer;
transition: all 0.2s;
box-shadow: 0 calc(var(--s) * 2) calc(var(--s) * 8) rgba(0, 0, 0, 0.4);
}
.action-btn:hover {
background: rgba(255, 215, 80, 0.18);
border-color: rgba(255, 215, 80, 0.8);
transform: scale(1.1);
}
/* ── Verbindungs-Overlay ── */
#connecting-overlay {
position: fixed;
inset: 0;
z-index: 200;
background: rgba(0, 0, 0, 0.85);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-family: "Cinzel", serif;
color: rgba(255, 215, 80, 0.85);
font-size: 18px;
letter-spacing: 3px;
}
#connecting-overlay p {
margin-top: 12px;
font-size: 12px;
color: rgba(255, 255, 255, 0.4);
letter-spacing: 2px;
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
#connecting-overlay .spinner {
width: 40px;
height: 40px;
border: 3px solid rgba(255, 215, 80, 0.2);
border-top-color: #ffd750;
border-radius: 50%;
animation: spin 0.8s linear infinite;
margin-bottom: 16px;
}
/* ── Avatar Name (immer sichtbar) ── */
.av-name {
position: absolute;
bottom: 8px;
left: 0;
right: 0;
text-align: center;
font-family: "Cinzel", serif;
font-size: 13px;
font-weight: 700;
color: #ffd750;
text-shadow:
0 1px 6px rgba(0, 0, 0, 0.9),
0 0 12px rgba(0, 0, 0, 0.7);
letter-spacing: 1px;
pointer-events: none;
z-index: 10;
padding: 0 4px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* ── Top Bar Actions (Buttons-Gruppe) ── */
.top-bar-actions {
display: flex;
align-items: center;
gap: calc(var(--s) * 10);
}
/* BEREIT Button */
#ready-timer-box .bereit-btn {
width: 100%;
margin-top: 4px;
font-size: 15px;
padding: 10px 20px;
}
.bereit-btn {
background: linear-gradient(135deg, #1a7a1a, #27ae60);
border: 2px solid rgba(100, 255, 100, 0.5);
border-radius: calc(var(--s) * 8);
color: #fff;
font-family: "Cinzel", serif;
font-size: calc(var(--s) * 12);
letter-spacing: calc(var(--s) * 2);
padding: calc(var(--s) * 7) calc(var(--s) * 20);
cursor: pointer;
text-transform: uppercase;
box-shadow: 0 0 calc(var(--s) * 14) rgba(0, 200, 0, 0.4);
transition: all 0.2s;
}
.bereit-btn:hover:not(:disabled) {
background: linear-gradient(135deg, #22992a, #2ecc71);
box-shadow: 0 0 calc(var(--s) * 24) rgba(0, 200, 0, 0.7);
}
.bereit-btn.bereit-clicked {
background: linear-gradient(135deg, #145214, #1e8449);
border-color: rgba(100, 255, 100, 0.3);
opacity: 0.75;
cursor: default;
}
/* AUFGEBEN Button */
.aufgeben-btn {
background: linear-gradient(135deg, #2c2c2c, #444);
border: 2px solid rgba(255, 255, 255, 0.35);
border-radius: calc(var(--s) * 8);
color: #fff;
font-family: "Cinzel", serif;
font-size: calc(var(--s) * 12);
letter-spacing: calc(var(--s) * 2);
padding: calc(var(--s) * 7) calc(var(--s) * 20);
cursor: pointer;
text-transform: uppercase;
box-shadow: 0 0 calc(var(--s) * 8) rgba(0, 0, 0, 0.5);
transition: all 0.2s;
}
.aufgeben-btn:hover {
background: linear-gradient(135deg, #3a3a3a, #555);
border-color: rgba(255, 255, 255, 0.7);
box-shadow: 0 0 calc(var(--s) * 16) rgba(255, 255, 255, 0.2);
}
/* ── Zug-Timer (Top Bar Mitte) ── */
#turn-timer-wrap {
position: absolute;
left: 50%;
transform: translateX(-50%);
display: flex;
align-items: center;
justify-content: center;
}
#turn-timer-svg {
display: block;
}
.tt-track {
fill: none;
stroke: rgba(255, 255, 255, 0.1);
stroke-width: 4;
}
.tt-fill {
fill: none;
stroke: #27ae60;
stroke-width: 4;
stroke-linecap: round;
transform: rotate(-90deg);
transform-origin: center;
stroke-dasharray: 113.1; /* 2π×18 */
stroke-dashoffset: 0;
transition:
stroke-dashoffset 0.9s linear,
stroke 0.3s ease;
}
#turn-timer-num {
position: absolute;
font-family: "Cinzel", serif;
font-size: calc(var(--s) * 13);
font-weight: 700;
color: #fff;
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.9);
line-height: 1;
}
@keyframes tt-pulse {
0%,
100% {
opacity: 1;
transform: scale(1);
}
50% {
opacity: 0.6;
transform: scale(1.15);
}
}
/* ── Karten-Stats Overlay exakt wie Slotmaschine ── */
.card-stat-overlay {
position: absolute;
inset: 0;
pointer-events: none;
z-index: 5;
border-radius: calc(var(--s) * 7);
}
/* ⚔ Angriff roter Pill, rechts mittig (wie kd-stat-atk) */
.cs-atk {
position: absolute;
right: calc(var(--s) * 5);
top: 40%;
transform: translateY(-50%);
background: rgba(180, 40, 20, 0.88);
border: 1px solid #ff6040;
border-radius: calc(var(--s) * 45);
color: #fff;
font-family: "Cinzel", serif;
font-size: calc(var(--s) * 8);
font-weight: bold;
padding: calc(var(--s) * 1.5) calc(var(--s) * 4);
z-index: 5;
}
/* 🛡 Verteidigung blauer Pill, links mittig (wie kd-stat-def) */
.cs-def {
position: absolute;
left: calc(var(--s) * 5);
top: 40%;
transform: translateY(-50%);
background: rgba(20, 80, 180, 0.88);
border: 1px solid #4090ff;
border-radius: calc(var(--s) * 45);
color: #fff;
font-family: "Cinzel", serif;
font-size: calc(var(--s) * 8);
font-weight: bold;
padding: calc(var(--s) * 1.5) calc(var(--s) * 4);
z-index: 5;
}
/* ⏱ Cooldown goldener Kreis, unten-rechts (wie kd-stat-cd) */
.cs-cd {
position: absolute;
bottom: calc(var(--s) * 7);
right: calc(var(--s) * 2);
width: calc(var(--s) * 18);
height: calc(var(--s) * 18);
border-radius: 50%;
background: rgba(0, 0, 0, 0.75);
border: 1px solid #f0d060;
display: flex;
align-items: center;
justify-content: center;
font-family: "Cinzel", serif;
font-size: calc(var(--s) * 8);
font-weight: bold;
color: #f0d9a6;
z-index: 5;
}
/* Belegte Feldslots */
.card-slot.slot-occupied {
border-style: solid;
border-color: rgba(255, 215, 80, 0.6);
}
/* Hand-Slot: Karte ist drin
- background transparent damit der dunkle Slot-Hintergrund nicht durchscheint
- overflow:hidden clippt das absolute img auf den border-radius
- ::before Gradient-Overlay ausblenden */
.hand-slot.hand-slot--filled {
background: transparent !important;
overflow: hidden !important;
}
.hand-slot.hand-slot--filled::before {
display: none !important;
}
/* Hand-Slot: Karte ist spielbereit (CD = 0) */
.hand-slot.hand-slot-ready {
border-color: rgba(80, 220, 80, 0.9) !important;
border-style: solid !important;
box-shadow:
0 0 calc(var(--s) * 18) rgba(60, 200, 60, 0.5),
0 calc(var(--s) * 4) calc(var(--s) * 12) rgba(0, 0, 0, 0.4);
}
/* CD-Badge wenn Karte spielbereit */
.cs-cd.cs-cd-ready {
background: rgba(20, 140, 20, 0.9);
border-color: #60ff60;
color: #b0ffb0;
font-size: calc(var(--s) * 7);
}
/* "SPIELEN" Badge oben-mittig wenn CD = 0 */
.hand-slot-ready-badge {
position: absolute;
top: calc(var(--s) * 4);
left: 50%;
transform: translateX(-50%);
background: linear-gradient(
135deg,
rgba(20, 120, 20, 0.92),
rgba(10, 80, 10, 0.92)
);
border: 1px solid #60d060;
border-radius: calc(var(--s) * 4);
color: #a0ffa0;
font-family: "Cinzel", serif;
font-size: calc(var(--s) * 7);
font-weight: bold;
letter-spacing: calc(var(--s) * 1);
padding: calc(var(--s) * 2) calc(var(--s) * 5);
pointer-events: none;
z-index: 6;
white-space: nowrap;
text-shadow: 0 1px 4px rgba(0, 0, 0, 0.8);
}
/* Spielfeld-Sperre */
#board-lock-overlay {
position: absolute;
inset: 0;
z-index: 50;
background: rgba(0, 0, 0, 0.55);
backdrop-filter: blur(2px);
cursor: not-allowed;
display: flex;
align-items: center;
justify-content: center;
}
#board-lock-overlay #ready-timer-box {
cursor: default;
pointer-events: all;
}
/* ── Bereit-Timer Box ── */
#ready-timer-box {
display: flex;
flex-direction: column;
align-items: center;
gap: 14px;
background: rgba(10, 8, 5, 0.92);
border: 1px solid rgba(255, 215, 80, 0.35);
border-radius: 16px;
padding: 32px 40px;
box-shadow: 0 8px 40px rgba(0, 0, 0, 0.8);
min-width: 260px;
}
#ready-timer-label {
font-family: "Cinzel", serif;
font-size: 18px;
letter-spacing: 4px;
color: rgba(255, 215, 80, 0.9);
text-transform: uppercase;
}
#ready-timer-ring {
position: relative;
width: 80px;
height: 80px;
display: flex;
align-items: center;
justify-content: center;
}
.timer-track {
fill: none;
stroke: rgba(255, 255, 255, 0.1);
stroke-width: 6;
}
.timer-fill {
fill: none;
stroke: #27ae60;
stroke-width: 6;
stroke-linecap: round;
transform: rotate(-90deg);
transform-origin: center;
transition:
stroke-dashoffset 0.9s linear,
stroke 0.3s ease;
}
#ready-timer-number {
position: absolute;
font-family: "Cinzel", serif;
font-size: 26px;
font-weight: 700;
color: #fff;
text-shadow: 0 0 10px rgba(0, 0, 0, 0.8);
}
#ready-timer-sub {
font-family: "Cinzel", serif;
font-size: 11px;
color: rgba(255, 255, 255, 0.4);
letter-spacing: 1px;
text-align: center;
}
#ready-status-row {
display: flex;
gap: 20px;
}
.ready-pip {
font-family: "Cinzel", serif;
font-size: 12px;
color: rgba(255, 255, 255, 0.5);
letter-spacing: 1px;
transition: color 0.3s;
}
/* ═══════════════════════════════════════════════════════════
PLACEMENT ZONES Linker Spieler (Slots 13) & Rechter Spieler (Slots 911)
═══════════════════════════════════════════════════════════ */
/* Linke Zone (Slots 13): Gold/Amber für Spieler 1 */
.board.my-side-left .card-row .card-slot:nth-child(-n + 3),
.board.my-side-right .card-row .card-slot:nth-last-child(-n + 3) {
border-color: rgba(200, 150, 42, 0.75);
background: rgba(180, 120, 20, 0.18);
box-shadow:
0 0 0 1px rgba(200, 150, 42, 0.2),
0 calc(var(--s) * 4) calc(var(--s) * 14) rgba(0, 0, 0, 0.3),
inset 0 0 calc(var(--s) * 20) rgba(200, 150, 42, 0.08);
}
/* Hover auf eigener Zone: stärker leuchten */
.board.my-side-left .card-row .card-slot:nth-child(-n + 3):hover,
.board.my-side-right .card-row .card-slot:nth-last-child(-n + 3):hover {
border-color: rgba(240, 190, 60, 1);
background: rgba(200, 140, 30, 0.28);
box-shadow:
0 0 0 2px rgba(240, 190, 60, 0.35),
0 0 calc(var(--s) * 18) rgba(200, 150, 42, 0.4);
transform: translateY(calc(var(--s) * -2));
}
/* Zonen-Label oben im Slot (kleine Markierung) */
.board.my-side-left .card-row .card-slot:nth-child(-n + 3)::after,
.board.my-side-right .card-row .card-slot:nth-last-child(-n + 3)::after {
content: "⚔";
position: absolute;
top: calc(var(--s) * 5);
font-size: calc(var(--s) * 10);
opacity: 0.35;
pointer-events: none;
}
/* Gegner-Zone: dezentes Blau/Lila nicht bespielbar */
.board.my-side-left .card-row .card-slot:nth-last-child(-n + 3),
.board.my-side-right .card-row .card-slot:nth-child(-n + 3) {
border-color: rgba(80, 130, 200, 0.45);
background: rgba(40, 80, 160, 0.1);
cursor: not-allowed;
opacity: 0.75;
}
.board.my-side-left .card-row .card-slot:nth-last-child(-n + 3)::after,
.board.my-side-right .card-row .card-slot:nth-child(-n + 3)::after {
content: "🛡";
position: absolute;
top: calc(var(--s) * 5);
font-size: calc(var(--s) * 10);
opacity: 0.25;
pointer-events: none;
}
/* ═══════════════════════════════════════════════════════════
DRAG & DROP
═══════════════════════════════════════════════════════════ */
/* Hand-Karte wird gerade gezogen */
.hand-slot.dragging {
opacity: 0.35;
transform: scale(0.95);
border-color: rgba(240, 190, 60, 0.4) !important;
}
/* Board-Slot ist eine aktive Drop-Zone (freier Slot in meiner Zone) */
.card-slot.drop-zone-active {
border: 2px dashed rgba(240, 190, 60, 0.9) !important;
background: rgba(180, 130, 20, 0.22) !important;
animation: pulse-zone 1.2s ease-in-out infinite;
}
/* Hover: Karte schwebt über einem gültigen Slot */
.card-slot.drop-zone-hover {
border: 2px solid rgba(240, 210, 80, 1) !important;
background: rgba(200, 150, 30, 0.38) !important;
box-shadow:
0 0 0 3px rgba(240, 200, 60, 0.4),
0 0 28px rgba(240, 190, 60, 0.55) !important;
transform: scale(1.06);
animation: none !important;
}
@keyframes pulse-zone {
0%,
100% {
box-shadow: 0 0 8px rgba(240, 190, 60, 0.25);
}
50% {
box-shadow: 0 0 22px rgba(240, 190, 60, 0.55);
}
}
/* Hand-Slot nicht draggable (kein Cursor-Feedback) */
.hand-slot:not([draggable="true"]) {
cursor: default;
}
.hand-slot[draggable="true"] {
cursor: grab;
}
.hand-slot[draggable="true"]:active {
cursor: grabbing;
}