/* GENEROVÁNO scripts/bust-cache.cjs z css/bracket.css — NEEDITOVAT RUČNĚ.
   Zdroj pravidel jsou importované soubory; změnu udělej tam a spusť node scripts/bust-cache.cjs. */

/* --- css/bracket.css --- */
/* TurnajSystem — Bracket (index).
   Po splitu obsahuje jen @import — žádné HTML callsites nemusí měnit. */

/* --- css/bracket-layout.css --- */
/* TurnajSystem — Bracket layout
   Container, rounds, matches (status + states), mobile compact mode,
   players, match number, connectors, dark mode glassmorphism. */

.bracket-container {
    overflow-x: auto;
    padding: 20px;
    background: var(--light);
    border-radius: var(--radius);
}

.bracket {
    display: flex;
    gap: 30px;
    min-width: max-content;
    align-items: stretch;
}

/* Kolo (round) */
.bracket-round {
    display: flex;
    flex-direction: column;
    justify-content: space-around;
    min-width: 180px;
    /* Nadpis kola je mimo tok (absolutně nahoře) — dřív se rozkládal se zápasy
       přes space-around a nadpisy „padaly“ šikmo dolů (9. 10. 2026). */
    position: relative;
    padding-top: 26px;
}

/* Kolo jen s volnými losy (např. L1) se nezobrazuje vůbec. */
.bracket-round:not(:has(.bracket-match:not(.bye))) {
    display: none;
}

/* První kolo: menší min-width aby se BYE komprimovaly */
.bracket-round:first-child {
    min-width: 160px;
}

.bracket-round-title {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    text-align: center;
    font-weight: 600;
    color: var(--gray);
    margin: 0;
    font-size: 0.8rem;
    text-transform: uppercase;
}

/* Zápas */
.bracket-match {
    background: var(--white);
    border-radius: var(--radius);
    box-shadow: var(--shadow);
    margin: 4px 0;
    overflow: hidden;
    transition: box-shadow var(--transition-normal), transform var(--transition-normal);
}

/* BYE (volný los) — skrytý všude, na PC i mobilu stejně; postupující je vidět
   v dalším kole. Dřív na PC sloupce drobných krabiček „TBD ✓ –“. */
.bracket-match.bye {
    display: none;
}
.bracket-match.bye .bracket-player {
    padding: 2px 8px;
    font-size: 0.7rem;
}
.bracket-match.bye .bracket-match-number {
    display: none;
}

/* ====== MOBILE: ultra-kompaktní bracket (Challonge-style) ====== */
@media (max-width: 768px) {
    .bracket-container { padding: 4px; }
    .bracket { gap: 4px; }
    .bracket-round { min-width: 110px; }
    .bracket-round { padding-top: 14px; }
    .bracket-round-title {
        font-size: 0.55rem;
        padding: 0;
    }
    .bracket-match {
        margin: 1px 0;
        border-radius: 3px;
        box-shadow: none;
        border: 1px solid var(--border-color);
    }
    .bracket-match-number {
        display: none;
    }
    .bracket-player {
        padding: 2px 5px;
        font-size: 0.68rem;
        border-bottom-width: 0;
        line-height: 1.2;
    }
    .bracket-player:last-child {
        border-top: 1px solid var(--border-color);
    }
    .bracket-player-name {
        font-weight: 500;
        max-width: 75px;
        font-size: 0.68rem;
    }
    .bracket-player-name.empty { max-width: none; font-size: 0.6rem; }
    .bracket-player-score {
        font-size: 0.68rem;
        font-weight: 600;
        min-width: 14px;
    }
    /* BYE na mobilu: úplně skryté */
    .bracket-match.bye {
        display: none;
    }
    /* Match status borders — tenčí */
    .bracket-match.ready,
    .bracket-match.in-progress,
    .bracket-match.in_progress,
    .bracket-match.completed {
        border-left-width: 3px;
    }
    /* Section titles */
    .bracket-section-title {
        font-size: 0.8rem;
        margin-bottom: 4px;
        padding-bottom: 3px;
    }
    /* Connector lines off */
    .bracket-match::after,
    .bracket-match::before {
        display: none !important;
    }
    /* Grand final */
    .grand-final { padding: 6px; }
    .grand-final-title { font-size: 0.8rem; }
    .grand-final .bracket-match { min-width: 120px; }
    .double-elimination { gap: 12px; }
    /* Self-report button */
    .bracket-match .btn-micro { font-size: 0.5rem; padding: 0 3px; }
}

.bracket-match:hover {
    box-shadow: var(--shadow-lg);
    transform: translateY(-1px);
}

.bracket-match.ready {
    border-left: 4px solid var(--warning);
}

/* Právě se hraje — BSL: červený rámeček + jemná červená záře (NE cyan). */
.bracket-match.in-progress,
.bracket-match.in_progress {
    border: 1px solid var(--primary);
    border-left: 4px solid var(--primary);
    animation: matchPulse 2s ease-in-out infinite;
}

.bracket-match.completed {
    border-left: 4px solid var(--secondary);
}

.bracket-match.pending {
    opacity: 0.6;
}

@keyframes matchPulse {
    0%, 100% { box-shadow: 0 0 0 1px var(--primary), 0 4px 16px rgba(220, 20, 60, 0.18); }
    50%      { box-shadow: 0 0 0 1px var(--primary), 0 4px 22px rgba(220, 20, 60, 0.32); }
}

/* Dark mode bracket — čisté černé karty (BSL), bez glassmorphism rozmazání. */
[data-theme="dark"] .bracket-match {
    background: var(--card-bg);
    border: 1px solid var(--border-color);
}

[data-theme="dark"] .bracket-match.in-progress,
[data-theme="dark"] .bracket-match.in_progress {
    border: 1px solid var(--primary);
    border-left: 4px solid var(--primary);
}

/* Dark mode vítěz — cyan akcent (shodně s light mode). */
[data-theme="dark"] .bracket-player.winner {
    background: linear-gradient(90deg, var(--secondary-bg-medium), transparent);
    border-left: 3px solid var(--secondary);
}

/* Dark mode vyřazen — ztlumený (bez light-mode červeného pozadí #f8d7da). */
[data-theme="dark"] .bracket-player.loser {
    background: transparent;
    border-left: 3px solid transparent;
}

/* Hráč v zápase */
.bracket-player {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: 7px 10px;
    border-bottom: 1px solid var(--border);
    cursor: default;
    font-size: 0.85rem;
}

.bracket-player:last-child {
    border-bottom: none;
}

/* Vítěz / postupující — BSL cyan akcent (levý okraj + jemný gradient + ✓). */
.bracket-player.winner {
    background: linear-gradient(90deg, var(--secondary-bg-medium), transparent);
    border-left: 3px solid var(--secondary);
}
.bracket-player.winner .bracket-player-name::after {
    content: "\2713";
    color: var(--secondary);
    font-weight: 900;
    margin-left: 8px;
}

/* Vyřazen — ztlumený (BSL #6b7075), bez červené (červená = živý zápas). */
.bracket-player.loser {
    background: transparent;
    opacity: 1;
}
.bracket-player.loser .bracket-player-name,
.bracket-player.loser .bracket-player-score {
    color: #6b7075;
}

.bracket-player-name {
    font-weight: 500;
    flex: 1;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

.bracket-player-name.empty {
    color: var(--gray);
    font-style: italic;
    /* „Vítěz Filip – Pepa“ — zalomit místo useknutí, ať je vidět celé. */
    white-space: normal;
    font-size: 0.85em;
    line-height: 1.2;
}

.bracket-player-score {
    font-weight: 700;
    font-size: 1rem;
    min-width: 30px;
    text-align: center;
    color: var(--dark);
}

.bracket-player-score.winner {
    color: var(--secondary);
}

/* Match number — BSL: jemný badge štítek (W1-1…). */
.bracket-match-number {
    font-size: 0.62rem;
    letter-spacing: 0.5px;
    color: var(--text-muted);
    padding: 2px 8px;
    background: var(--bg);
    border-bottom: 1px solid var(--border-color);
}
/* Live zápas — match-id v crimson (sladěno s rámečkem). */
.bracket-match.in-progress .bracket-match-number,
.bracket-match.in_progress .bracket-match-number {
    color: var(--primary);
}

/* Connectors (čáry mezi zápasy) */
.bracket-connector {
    position: relative;
}

.bracket-connector::after {
    content: '';
    position: absolute;
    right: -20px;
    top: 50%;
    width: 20px;
    height: 2px;
    background: var(--border);
    transition: background var(--transition-normal);
}

.bracket-match.completed + .bracket-connector::after {
    background: var(--secondary);
}

/* Double Elimination layout */
.double-elimination {
    display: flex;
    flex-direction: column;
    gap: 40px;
}

.winners-bracket,
.losers-bracket {
    display: flex;
    gap: 40px;
}

/* Section titles — BSL: gradientový accent proužek vlevo (crimson→cyan). */
.bracket-section-title {
    display: flex;
    align-items: center;
    gap: 12px;
    font-size: 1.25rem;
    font-weight: 700;
    color: var(--text);
    margin-bottom: 15px;
    padding-bottom: 10px;
    border-bottom: 1px solid var(--border-color);
}
.bracket-section-title::before {
    content: "";
    width: 4px;
    height: 22px;
    border-radius: 3px;
    background: var(--gradient-accent);
    flex-shrink: 0;
}

/* Losers bracket — tlumenější (crimson→tmavá) accent proužek. */
.losers-bracket .bracket-section-title::before {
    background: linear-gradient(135deg, #dc143c, #7a0c22);
}

/* Grand Final — BSL: zvýrazněná karta s crimson rámečkem + gradientový titulek. */
.grand-final {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: 20px;
    padding: 20px;
    background: var(--card-bg);
    border-radius: var(--radius-md);
    border: 1px solid var(--primary);
    box-shadow: 0 0 30px rgba(220, 20, 60, 0.12);
}

[data-theme="dark"] .grand-final {
    background: var(--card2, #232323);
    border: 1px solid var(--primary);
    box-shadow: 0 0 30px rgba(220, 20, 60, 0.18);
}

.grand-final .bracket-match {
    min-width: 250px;
    border: 1px solid var(--primary);
}

.grand-final-title {
    font-size: 1.25rem;
    font-weight: 800;
    letter-spacing: 0.5px;
    background: var(--gradient-accent);
    -webkit-background-clip: text;
    background-clip: text;
    -webkit-text-fill-color: transparent;
}
/* --- css/bracket-extras.css --- */
/* TurnajSystem — Bracket extras
   Round Robin tabulka, match modal form (singles + legs),
   timer s urgency, presence indicator, kontumace badge,
   responsive overrides. */

/* Round Robin tabulka */
.round-robin-table {
    width: 100%;
    border-collapse: collapse;
    background: var(--white);
    border-radius: var(--radius);
    overflow: hidden;
    box-shadow: var(--shadow);
}

.round-robin-table th,
.round-robin-table td {
    padding: 10px 15px;
    text-align: center;
    border: 1px solid var(--border);
}

.round-robin-table th {
    background: var(--primary);
    color: var(--text-on-color);
}

.round-robin-table .player-name {
    text-align: left;
    font-weight: 500;
}

.round-robin-table .position {
    font-weight: 700;
    color: var(--primary);
}

.round-robin-table .points {
    font-weight: 700;
    color: var(--success);
}

/* Postupová místa: průsvitný nádech, text zůstává čitelný ve světlém i tmavém vzhledu
   (dřív napevno světle zelená #d4edda — ve tmavém vzhledu nešlo nic přečíst). */
.round-robin-table tr.top-3 {
    background: color-mix(in srgb, var(--success) 14%, transparent);
}
.round-robin-table tr.top-3 td:first-child {
    box-shadow: inset 4px 0 0 var(--success);
}

/* Match modal pro zadávání výsledků */
.match-form {
    display: flex;
    flex-direction: column;
    gap: 15px;
}

.match-form-player {
    display: flex;
    align-items: center;
    gap: 15px;
    padding: 15px;
    background: var(--light);
    border-radius: var(--radius);
}

.match-form-player-name {
    flex: 1;
    font-weight: 500;
    font-size: 1.125rem;
}

.match-form-score {
    width: 80px;
    font-size: 1.5rem;
    font-weight: 700;
    text-align: center;
    padding: 10px;
}

.match-form-vs {
    text-align: center;
    font-weight: 700;
    color: var(--gray);
    font-size: 1.25rem;
}

/* Legy pro Round Robin */
.legs-form {
    display: flex;
    flex-direction: column;
    gap: 10px;
}

.leg-row {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 10px;
    background: var(--light);
    border-radius: var(--radius);
}

.leg-number {
    font-weight: 600;
    color: var(--gray);
    min-width: 60px;
}

.leg-score {
    width: 60px;
    text-align: center;
    font-weight: 600;
    padding: 8px;
}

.leg-vs {
    color: var(--gray);
}

/* Timer v zápase */
.match-timer {
    text-align: center;
    padding: 4px 12px;
    font-size: 0.8rem;
    font-weight: 600;
    background: #e3f2fd;
    color: #1565c0;
    border-top: 1px solid var(--border);
}

.match-timer.timer-warning {
    background: #fff3cd;
    color: #856404;
}

.match-timer.timer-urgent {
    background: #f8d7da;
    color: #721c24;
    animation: timer-pulse 1s ease-in-out infinite;
}

.match-timer.timer-ok {
    background: #d4edda;
    color: #155724;
}

@keyframes timer-pulse {
    0%, 100% { opacity: 1; }
    50%      { opacity: 0.6; }
}

/* Indikátor přítomnosti */
.presence-indicator {
    display: inline-block;
    width: 8px;
    height: 8px;
    border-radius: 50%;
    background: #ccc;
    margin-right: 6px;
    vertical-align: middle;
}

.presence-indicator.present {
    background: var(--success);
}

/* Badge kontumace */
.kontumace-badge {
    display: inline-block;
    background: #fff3cd;
    color: #856404;
    font-size: 0.65rem;
    font-weight: 700;
    padding: 1px 5px;
    border-radius: 3px;
    margin-left: 4px;
    vertical-align: middle;
}

/* Responsive: Tablet */
@media (max-width: 1024px) {
    .bracket-round {
        min-width: 180px;
    }

    .winners-bracket,
    .losers-bracket {
        gap: 25px;
    }
}

/* Responsive: Mobil */
@media (max-width: 768px) {
    .bracket-container {
        padding: 10px;
    }

    .bracket-round {
        min-width: 150px;
    }

    .bracket-player {
        padding: 8px 10px;
    }

    .bracket-player-name {
        font-size: 0.875rem;
    }

    /* Kola zleva doprava jako na PC — pavouk se posouvá do strany (9. 10. 2026). */
    .double-elimination {
        flex-direction: column;
        min-width: max-content;
    }

    .winners-bracket,
    .losers-bracket {
        flex-wrap: nowrap;
    }
}

/* Responsive: Malý mobil (iPhone SE, 375px) */
@media (max-width: 480px) {
    .bracket-round {
        min-width: 130px;
    }

    .bracket-player {
        padding: 6px 8px;
    }

    .bracket-player-name {
        font-size: 0.8rem;
    }

    .bracket-player-score {
        font-size: 0.95rem;
        min-width: 24px;
    }

    .bracket-match-number {
        font-size: 0.65rem;
        padding: 3px 8px;
    }

    .bracket-section-title {
        font-size: 1rem;
    }

    .grand-final-title {
        font-size: 1rem;
    }

    .grand-final .bracket-match {
        min-width: 200px;
    }

    .presence-indicator {
        width: 10px;
        height: 10px;
    }

    .winners-bracket,
    .losers-bracket {
        gap: 15px;
    }

    .match-timer {
        font-size: 0.75rem;
        padding: 3px 8px;
    }
}

/* === Fx: losovací animace + efekty === */
.fx-draw-overlay { position: fixed; inset: 0; z-index: 9000; pointer-events: none; overflow: hidden; }
.fx-drum {
    position: fixed; transform: translate(-50%, -50%); font-size: 3rem; line-height: 1;
    filter: drop-shadow(0 4px 12px rgba(0,0,0,.5)); will-change: transform;
}
.fx-drum-full { font-size: 3.6rem; }
.fx-drum-pop { animation: fxDrumPop .2s ease; }
@keyframes fxDrumPop {
    50% { transform: translate(-50%, -50%) scale(1.25) rotate(-12deg); }
}
.fx-chip {
    position: fixed; transform: translate(-50%, -50%); will-change: transform;
    padding: 6px 14px; border-radius: 999px; font-weight: 700; font-size: .9rem; white-space: nowrap;
    color: #fff; background: linear-gradient(135deg, var(--primary, #dc143c), var(--secondary, #06cef9));
    box-shadow: 0 6px 20px rgba(0,0,0,.45); transition: transform .52s cubic-bezier(.5,1.4,.5,1);
}
.fx-chip-full { box-shadow: 0 0 18px var(--secondary, #06cef9), 0 6px 20px rgba(0,0,0,.5); transition-duration: .72s; }
.bracket-player.fx-slot-pop { animation: fxSlotPop .6s ease; }
@keyframes fxSlotPop {
    0% { background: rgba(6,206,249,.35); transform: scale(1.08); }
    100% { background: transparent; transform: scale(1); }
}
.fx-burst { position: fixed; z-index: 9001; pointer-events: none; }
.fx-burst i {
    position: absolute; left: 0; top: 0; width: 7px; height: 7px; border-radius: 50%;
    animation: fxBurst .8s ease-out forwards;
}
@keyframes fxBurst {
    to { transform: translate(var(--dx), var(--dy)) scale(.2); opacity: 0; }
}
/* Losování po jednom hráči (Fx.drawSequence) */
.fx-draw-seq { background: rgba(0,0,0,.35); }
.fx-draw-title, .fx-draw-count {
    position: fixed; left: 50%; transform: translateX(-50%); color: #fff; font-weight: 700;
    text-shadow: 0 2px 8px rgba(0,0,0,.6); white-space: nowrap;
    background: rgba(0,0,0,.7); border-radius: 999px;
}
.fx-draw-title { top: 18%; font-size: 1.4rem; padding: 6px 18px; }
.fx-draw-count { top: calc(18% + 2.9rem); font-size: .95rem; padding: 2px 12px; }
.fx-draw-skip {
    position: fixed; right: 16px; bottom: 16px; pointer-events: auto; cursor: pointer;
    padding: 10px 16px; border-radius: 999px; border: 0; font-weight: 700;
    background: rgba(255,255,255,.92); color: #111;
}
.fx-chip-big {
    left: 50%; top: 50%; font-size: 1.6rem; padding: 12px 26px; transition: none;
    animation: fxChipIn .35s cubic-bezier(.5,1.6,.5,1);
}
.fx-chip-big.fx-chip-flying { transition: transform .52s cubic-bezier(.6,0,.4,1); animation: none; }
.fx-chip-mine { background: linear-gradient(135deg, #f5b301, #ff6a00); box-shadow: 0 0 24px #f5b301, 0 6px 20px rgba(0,0,0,.5); }
@keyframes fxChipIn { from { transform: translate(-50%, -50%) scale(.2); opacity: 0; } }
.bracket-player.fx-slot-mine { animation: fxSlotMine 1.6s ease; }
@keyframes fxSlotMine {
    0%, 60% { background: rgba(245,179,1,.45); transform: scale(1.08); }
    100% { background: transparent; transform: scale(1); }
}
/* Toolbar přepínač efektů + losování */
.fx-toggle-btn .fx-lvl { opacity: .8; font-weight: 600; }
@media (prefers-reduced-motion: reduce) {
    .fx-chip, .bracket-player.fx-slot-pop, .bracket-player.fx-slot-mine, .fx-burst i, .fx-drum-pop { animation: none !important; transition: none !important; }
}

/* === Stupně vítězů (pódium) + ohňostroj === */
.podium { max-width: 560px; margin: 28px auto 0; }
.podium-title { text-align: center; margin: 0 0 16px; font-size: 1.25rem; }
.podium-stage { display: flex; align-items: flex-end; justify-content: center; gap: 10px; }
.podium-place { display: flex; flex-direction: column; align-items: center; flex: 1; max-width: 150px; }
.podium-place.empty { visibility: hidden; }
.podium-medal { font-size: 2rem; line-height: 1; filter: drop-shadow(0 3px 6px rgba(0,0,0,.4)); }
.podium-name { font-weight: 700; text-align: center; margin: 4px 0 8px; font-size: .95rem; word-break: break-word; }
.podium-name a { color: var(--secondary); text-decoration: none; }
.podium-block {
    width: 100%; border-radius: 8px 8px 0 0; display: flex; align-items: flex-start; justify-content: center;
    padding-top: 8px; font-weight: 800; color: rgba(255,255,255,.9); box-shadow: inset 0 2px 0 rgba(255,255,255,.25);
}
.place-1 .podium-block { height: 150px; background: linear-gradient(180deg, #ffd700, #b8860b); }
.place-2 .podium-block { height: 110px; background: linear-gradient(180deg, #d8d8d8, #8a8a8a); }
.place-3 .podium-block { height: 80px;  background: linear-gradient(180deg, #cd7f32, #7a4a1e); }
.podium-stage.rise .podium-block { transform-origin: bottom; animation: podiumRise .7s cubic-bezier(.3,1.25,.5,1) backwards; }
.podium-stage.rise .place-3 .podium-block { animation-delay: 0s; }
.podium-stage.rise .place-2 .podium-block { animation-delay: .25s; }
.podium-stage.rise .place-1 .podium-block { animation-delay: .5s; }
.podium-stage.rise .podium-medal, .podium-stage.rise .podium-name { animation: podiumFade .5s ease backwards; }
.podium-stage.rise .place-3 .podium-medal, .podium-stage.rise .place-3 .podium-name { animation-delay: .35s; }
.podium-stage.rise .place-2 .podium-medal, .podium-stage.rise .place-2 .podium-name { animation-delay: .6s; }
.podium-stage.rise .place-1 .podium-medal, .podium-stage.rise .place-1 .podium-name { animation-delay: .85s; }
@keyframes podiumRise { from { transform: scaleY(0); } to { transform: scaleY(1); } }
@keyframes podiumFade { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }
.fx-fireworks { position: fixed; inset: 0; z-index: 9000; pointer-events: none; }
@media (prefers-reduced-motion: reduce) {
    .podium-stage.rise .podium-block,
    .podium-stage.rise .podium-medal,
    .podium-stage.rise .podium-name { animation: none !important; }
}

/* === Bojové efekty u zadání výsledku === */
.fx-shaking { animation: fxShake .5s cubic-bezier(.36,.07,.19,.97); }
@keyframes fxShake {
    10%,90% { transform: translate3d(calc(var(--fx-amp,6px) * -0.4), 0, 0); }
    20%,80% { transform: translate3d(calc(var(--fx-amp,6px) * 0.7), 0, 0); }
    30%,50%,70% { transform: translate3d(calc(var(--fx-amp,6px) * -1), calc(var(--fx-amp,6px) * 0.4), 0); }
    40%,60% { transform: translate3d(var(--fx-amp,6px), calc(var(--fx-amp,6px) * -0.4), 0); }
}
.fx-shatter { position: fixed; z-index: 9002; pointer-events: none; }
/* Střep = výřez řádku (clip-path), sklo: barva řádku + odlesk + světlá hrana. */
.fx-shatter i {
    position: absolute; inset: 0; will-change: transform, opacity;
    background-image: linear-gradient(135deg, rgba(255,255,255,.35), rgba(160,210,255,.12) 45%, rgba(255,255,255,.28));
    filter: drop-shadow(0 0 1px rgba(220,240,255,.9));
}
.fx-shatter .fx-piece { position: absolute; inset: 0; width: 100%; height: 100%; margin: 0; box-sizing: border-box; opacity: 1; }
.fx-cracks { position: absolute; inset: 0; width: 100%; height: 100%; overflow: visible; }
.fx-cracks path {
    fill: none; stroke: rgba(235,245,255,.95); stroke-width: 1.4; stroke-linecap: round;
    filter: drop-shadow(0 0 3px rgba(160,210,255,.9));
    stroke-dasharray: 400; stroke-dashoffset: 400; animation: fxCrack .17s ease-out forwards;
}
@keyframes fxCrack { to { stroke-dashoffset: 0; } }
.fx-cracked { animation: fxCrackFlash .3s ease; }
@keyframes fxCrackFlash {
    30% { box-shadow: inset 0 0 18px rgba(255,255,255,.85), 0 0 16px rgba(180,220,255,.7); filter: brightness(1.5); }
    100% { filter: brightness(1); }
}
/* Během rozpadu je původní řádek pryč, pak se ztlumeně vrátí (poražený). */
.fx-broken { opacity: 0 !important; }
.bracket-player:not(.fx-broken) { transition: opacity .35s ease; }
.fx-proj {
    position: fixed; left: 0; top: 0; z-index: 9003; pointer-events: none; font-size: 1.7rem; line-height: 1;
    will-change: transform; filter: drop-shadow(0 0 10px rgba(255,150,40,.9));
}
.fx-proj-ice { filter: drop-shadow(0 0 10px rgba(120,200,255,.95)); }
.fx-proj-dart { filter: drop-shadow(0 0 6px rgba(255,255,255,.6)); }
.fx-trail {
    position: fixed; z-index: 9002; pointer-events: none; width: 22px; height: 22px; margin: -11px 0 0 -11px;
    border-radius: 50%; animation: fxTrail .5s ease-out forwards;
}
@keyframes fxTrail { to { transform: scale(.2); opacity: 0; } }
.fx-bolt { position: fixed; z-index: 9003; pointer-events: none; }
.fx-bolt svg { width: 100%; height: 100%; overflow: visible; }
.fx-bolt path {
    fill: none; stroke: #fffbe0; stroke-width: 3; stroke-linejoin: round;
    filter: drop-shadow(0 0 6px #ffe94d) drop-shadow(0 0 14px rgba(255,220,60,.8));
    animation: fxBolt .26s steps(2) forwards;
}
@keyframes fxBolt { 0% { opacity: 1; } 50% { opacity: .4; } 75% { opacity: 1; } 100% { opacity: 0; } }
.bracket-match.fx-landed { animation: fxLanded .9s ease; }
@keyframes fxLanded { 25% { box-shadow: 0 0 0 2px var(--secondary,#06cef9), 0 0 22px rgba(6,206,249,.8); transform: scale(1.04); } }
.fx-ghost {
    z-index: 9001; pointer-events: none; border-radius: 8px; box-shadow: 0 8px 30px rgba(0,0,0,.6);
    transition: transform .7s cubic-bezier(.5,.1,.7,1), opacity .7s ease; will-change: transform, opacity;
}
.fx-ghost-drop { box-shadow: 0 0 22px var(--secondary,#06cef9), 0 8px 30px rgba(0,0,0,.6); }
.fx-ghost-out { filter: grayscale(.6); }
.fx-banner {
    position: fixed; left: 50%; top: 38%; transform: translate(-50%,-50%); z-index: 9004; pointer-events: none;
    font-weight: 900; font-size: clamp(2rem, 11vw, 6rem); color: #fff; letter-spacing: 2px; white-space: nowrap;
    text-shadow: 0 0 20px var(--primary,#dc143c), 0 0 40px var(--secondary,#06cef9); animation: fxBanner 1.4s ease forwards;
}
@keyframes fxBanner {
    0% { opacity: 0; transform: translate(-50%,-50%) scale(.4); }
    20% { opacity: 1; transform: translate(-50%,-50%) scale(1.06); }
    75% { opacity: 1; transform: translate(-50%,-50%) scale(1); }
    100% { opacity: 0; transform: translate(-50%,-50%) scale(1.2); }
}
.bracket-player.fx-win, .bracket-match.fx-win { animation: fxWin 1.2s ease; }
@keyframes fxWin { 30% { box-shadow: 0 0 0 2px #2ec16a, 0 0 22px rgba(46,193,106,.85); } }
.bracket-match.fx-champion, .bracket-player.fx-champion {
    animation: fxChampion 1.6s ease; box-shadow: 0 0 0 2px #ffd700, 0 0 30px rgba(255,215,0,.85) !important;
}
@keyframes fxChampion { 40% { transform: scale(1.06); } }
@media (prefers-reduced-motion: reduce) {
    .fx-shaking, .fx-shatter i, .fx-cracks path, .fx-cracked, .fx-proj, .fx-trail, .fx-bolt path, .fx-ghost, .fx-banner, .bracket-match.fx-landed,
    .bracket-player.fx-win, .bracket-match.fx-win, .bracket-match.fx-champion { animation: none !important; transition: none !important; }
}
