bc/public/style_alt.css

1399 lines
40 KiB
CSS
Raw Permalink 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.

/* === style_alt.css (Изменения для user-info и game-header) === */
@import url('https://fonts.googleapis.com/css2?family=MedievalSharp&family=Roboto:wght@300;400;700&display=swap');
@import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css');
:root {
/* --- Переменные цветов и шрифтов (из локальной версии) --- */
--font-main: 'Roboto', sans-serif;
--font-fancy: 'MedievalSharp', cursive;
--bg-gradient-dark: linear-gradient(160deg, #1f243a, #10121c);
--panel-bg: rgba(16, 18, 28, 0.8);
--panel-border: #4a5072;
--panel-glow-player: rgba(80, 150, 255, 0.3);
--panel-glow-opponent: rgba(255, 80, 80, 0.3);
--panel-glow-almagest: rgba(199, 108, 255, 0.3);
--text-light: #e8effc;
--text-muted: #9badce;
--text-heading: #ffffff;
--accent-player: #6c95ff;
--accent-opponent: #ff6c6c;
--accent-almagest: #c76cff;
--hp-color: #de4b4b;
--mana-color: #58a8d0;
--stamina-color: #ffb347;
--dark-energy-color: #ab47bc;
--bar-bg: #252a44;
--button-bg: linear-gradient(145deg, #556190, #3f4a70);
--button-hover-bg: linear-gradient(145deg, #6a79b0, #556190);
--button-text: var(--text-light);
--button-ability-bg: linear-gradient(145deg, #305a5e, #1f4043);
--button-ability-hover-bg: linear-gradient(145deg, #407a7e, #305a5e);
--button-ability-border: #4db0b5;
--button-disabled-bg: #333950;
--button-disabled-text: #6b7491;
--log-bg: rgba(10, 12, 20, 0.85);
--log-border: var(--panel-border);
--log-text: var(--text-muted);
--icon-color: var(--text-muted);
--damage-color: #ff8080;
--heal-color: #90ee90;
--block-color: #add8e6;
--effect-color: #d8bfd8;
--turn-color: #ffd700;
--system-color: #7fffd4;
--modal-bg: rgba(16, 18, 28, 0.97);
--modal-content-bg: #2a2f45;
--scrollbar-thumb: #4a5072;
--scrollbar-track: #10121c;
--shake-duration: 0.4s;
--cast-duration: 0.6s;
--dissolve-duration: 6.0s;
--log-panel-fixed-height: 280px;
--timer-text-color: var(--turn-color);
--timer-icon-color: #b0c4de;
--timer-low-time-color: var(--damage-color);
/* === Переменные для переключателя панелей (мобильный вид) - ИЗ СЕРВЕРНОЙ ВЕРСИИ === */
--panel-switcher-bg: rgba(10, 12, 20, 0.9);
--panel-switcher-border: var(--panel-border);
--panel-switcher-button-bg: var(--button-bg);
--panel-switcher-button-text: var(--button-text);
--panel-switcher-button-active-bg: var(--accent-player);
--panel-switcher-button-active-text: #fff;
}
/* --- Базовые Стили и Сброс --- */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
height: 100%;
}
body {
font-family: var(--font-main);
background: var(--bg-gradient-dark) fixed;
color: var(--text-light);
line-height: 1.5;
height: 100vh;
overflow: hidden;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 10px;
}
h1, h2, h3, h4 {
font-family: var(--font-fancy);
color: var(--text-heading);
margin-bottom: 0.75em;
font-weight: normal;
}
button {
font-family: var(--font-main);
}
i {
margin-right: 6px;
color: var(--icon-color);
width: 1.2em;
text-align: center;
}
* {
scrollbar-width: thin;
scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
}
*::-webkit-scrollbar {
width: 8px;
}
*::-webkit-scrollbar-track {
background: var(--scrollbar-track);
border-radius: 4px;
}
*::-webkit-scrollbar-thumb {
background-color: var(--scrollbar-thumb);
border-radius: 4px;
border: 2px solid var(--scrollbar-track);
}
/* === Стили для Экранов Аутентификации и Настройки Игры (из локальной версии) === */
.auth-game-setup-wrapper {
width: 100%;
max-width: 700px;
margin: 20px auto;
background: var(--panel-bg);
border: 1px solid var(--panel-border);
border-radius: 10px;
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.5);
color: var(--text-light);
text-align: center;
max-height: calc(100vh - 40px);
overflow-y: hidden; /* Сохраняем из локальной */
position: relative; /* <<< Добавлено для позиционирования #user-info (из локальной) */
}
.auth-game-setup-wrapper h2,
.auth-game-setup-wrapper h3 {
font-family: var(--font-fancy);
color: var(--text-heading);
margin-bottom: 1em;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
padding-bottom: 0.5em;
}
.auth-game-setup-wrapper h3 {
font-size: 1.2em;
margin-top: 1.5em;
}
.auth-game-setup-wrapper button,
#auth-section form button {
font-family: var(--font-main);
background: var(--button-bg);
color: var(--button-text);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 6px;
padding: 10px 18px;
margin: 8px 5px;
cursor: pointer;
transition: all 0.15s ease;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 0.5px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
outline: none;
}
.auth-game-setup-wrapper button:hover:enabled,
#auth-section form button:hover:enabled {
background: var(--button-hover-bg);
transform: translateY(-2px) scale(1.02);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4);
}
.auth-game-setup-wrapper button:active:enabled,
#auth-section form button:active:enabled {
transform: translateY(0px) scale(1);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);
}
.auth-game-setup-wrapper button:disabled,
#auth-section form button:disabled {
background: var(--button-disabled-bg) !important;
color: var(--button-disabled-text) !important;
border-color: transparent !important;
cursor: not-allowed !important;
opacity: 0.7;
transform: none !important;
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.4) !important;
filter: grayscale(50%);
}
.auth-game-setup-wrapper input[type="text"],
#auth-section input[type="text"],
#auth-section input[type="password"] {
padding: 10px;
border-radius: 5px;
border: 1px solid var(--panel-border);
background-color: var(--bar-bg);
color: var(--text-light);
margin: 5px 5px 10px 5px;
font-size: 0.9em;
width: calc(100% - 22px);
max-width: 300px;
box-sizing: border-box;
outline: none;
transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.auth-game-setup-wrapper input[type="text"]:focus,
#auth-section input[type="text"]:focus,
#auth-section input[type="password"]:focus {
border-color: var(--accent-player);
box-shadow: 0 0 8px rgba(108, 149, 255, 0.4);
}
#available-games-list {
margin-top: 20px;
text-align: left;
max-height: 250px;
height: 100px; /* Сохраняем из локальной */
overflow-y: scroll;
padding: 10px 15px;
background-color: rgba(0, 0, 0, 0.25);
border: 1px solid var(--log-border);
border-radius: 6px;
}
#available-games-list h3 {
margin-top: 0;
margin-bottom: 10px;
padding-bottom: 5px;
border-bottom: 1px dashed rgba(255, 255, 255, 0.1);
}
#available-games-list ul {
list-style: none;
padding: 0;
margin: 0;
}
#available-games-list li {
padding: 10px;
border-bottom: 1px solid rgba(74, 80, 114, 0.5);
display: flex;
justify-content: space-between;
align-items: center;
font-size: 0.9em;
}
#available-games-list li:last-child {
border-bottom: none;
}
#available-games-list li button {
padding: 6px 10px;
font-size: 0.8em;
margin-left: 10px;
flex-shrink: 0;
}
#status-container {
height: 40px; /* Сохраняем из локальной */
}
#auth-message,
#game-status-message {
font-weight: bold;
font-size: 1.1em;
padding: 5px;
background-color: rgba(0, 0, 0, 0.1);
border-radius: 4px;
display: block;
margin-bottom: 5px;
text-align: center;
}
#auth-message.success {
color: var(--heal-color);
}
#auth-message.error {
color: var(--damage-color);
}
#game-status-message {
color: var(--turn-color);
}
#auth-section form {
margin-bottom: 20px;
}
/* === ИЗМЕНЕНИЕ: Стили для #user-info (из локальной версии) === */
#user-info {
position: absolute;
top: 10px; /* Отступ сверху */
right: 15px; /* Отступ справа */
line-height: 1.5;
text-align: right; /* Выравнивание текста и кнопки вправо */
z-index: 10; /* Чтобы был поверх другого контента в .auth-game-setup-wrapper */
}
#user-info p {
margin: 0 10px 0 0; /* Уменьшен нижний отступ */
font-size: 0.9em; /* Уменьшен шрифт приветствия */
color: var(--text-muted);
line-height: 2.5;
}
#user-info p #logged-in-username {
font-weight: bold;
color: var(--text-light);
}
#user-info div {
display: flex;
flex-direction: row;
}
#logout-button {
background: linear-gradient(145deg, #6e3c3c, #502626) !important; /* Более темный красный */
color: #f0d0d0 !important; /* Светло-розовый текст */
padding: 6px 12px !important; /* Уменьшены паддинги */
font-size: 0.8em !important; /* Уменьшен шрифт */
margin: 0 !important; /* Убираем внешние отступы */
letter-spacing: 0.2px;
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3) !important;
border: 1px solid #422020 !important; /* Темная рамка */
}
#logout-button:hover:enabled {
background: linear-gradient(145deg, #834545, #6e3c3c) !important;
transform: translateY(-1px) !important;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4) !important;
}
#logout-button i {
margin-right: 4px; /* Уменьшен отступ иконки */
}
/* === КОНЕЦ ИЗМЕНЕНИЯ === */
.character-selection {
margin-top: 15px;
margin-bottom: 15px;
padding: 15px;
background-color: rgba(0, 0, 0, 0.2);
border-radius: 6px;
border: 1px solid rgba(74, 80, 114, 0.5);
}
.character-selection h4 {
font-size: 1.1em;
color: var(--text-muted);
margin-bottom: 10px;
border: none;
padding: 0;
text-align: center;
}
.character-selection label {
display: inline-block;
margin: 0 15px;
cursor: pointer;
font-size: 1.05em;
padding: 5px 10px;
border-radius: 4px;
transition: background-color 0.2s ease, color 0.2s ease;
user-select: none;
}
.character-selection input[type="radio"] {
display: none;
}
.character-selection input[type="radio"]:checked + label {
color: #fff;
font-weight: bold;
}
.character-selection input[type="radio"][value="elena"]:checked + label {
background-color: var(--accent-player);
box-shadow: 0 0 8px rgba(108, 149, 255, 0.5);
}
.character-selection input[type="radio"][value="almagest"]:checked + label {
background-color: var(--accent-almagest);
box-shadow: 0 0 8px rgba(199, 108, 255, 0.5);
}
.character-selection label:hover {
background-color: rgba(255, 255, 255, 0.1);
}
.character-selection label i {
margin-right: 8px;
vertical-align: middle;
}
label[for="char-elena"] i {
color: var(--accent-player);
}
label[for="char-almagest"] i {
color: var(--accent-almagest);
}
/* --- Основная Структура Игры (.game-wrapper) --- */
.game-wrapper {
width: 100%;
height: 100%;
max-width: 1400px;
margin: 0 auto;
padding: 10px;
display: flex;
flex-direction: column;
gap: 10px;
overflow: hidden;
}
/* === ИЗМЕНЕНИЕ: .game-header удален, стили для него больше не нужны (из локальной версии) === */
/* Глобальные стили для кнопок переключения панелей - ИЗ СЕРВЕРНОЙ ВЕРСИИ */
.panel-switcher-controls {
display: none; /* Скрыт по умолчанию для десктопа */
flex-shrink: 0;
padding: 8px 5px;
background: var(--panel-switcher-bg);
border-bottom: 1px solid var(--panel-switcher-border);
gap: 10px;
}
.panel-switch-button {
flex: 1;
padding: 8px 10px;
font-size: 0.9em;
font-weight: bold;
text-transform: uppercase;
background: var(--panel-switcher-button-bg);
color: var(--panel-switcher-button-text);
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 5px;
cursor: pointer;
transition: background-color 0.2s, color 0.2s, transform 0.1s;
display: flex;
align-items: center;
justify-content: center;
}
.panel-switch-button i { margin-right: 8px; }
.panel-switch-button:hover { filter: brightness(1.1); }
.panel-switch-button.active {
background: var(--panel-switcher-button-active-bg);
color: var(--panel-switcher-button-active-text);
box-shadow: 0 0 8px rgba(255,255,255,0.3);
}
.battle-arena-container {
flex-grow: 1;
display: flex;
gap: 10px;
overflow: hidden;
/* === ИЗМЕНЕНИЕ: Добавляем верхний отступ, если .game-header был убран, а .game-wrapper виден (из локальной версии) === */
/* margin-top: 10px; /* или padding-top: 10px; на .game-wrapper, если нужно */
/* === Изменения из серверной для работы переключения панелей === */
position: relative;
min-height: 0;
}
.player-column,
.opponent-column {
flex: 1;
display: flex;
flex-direction: column;
gap: 10px;
min-width: 0;
overflow: hidden;
}
/* Остальные стили панелей, кнопок, лога и т.д. из локальной версии */
.fighter-panel,
.controls-panel-new,
.battle-log-new {
background: var(--panel-bg);
border: 1px solid var(--panel-border);
border-radius: 8px;
box-shadow: 0 0 15px rgba(0, 0, 0, 0.4), inset 0 0 10px rgba(0, 0, 0, 0.3);
padding: 15px;
display: flex;
flex-direction: column;
overflow: hidden;
transition: box-shadow 0.3s ease, border-color 0.3s ease, opacity 0.3s ease-out, transform 0.3s ease-out;
}
.fighter-panel.panel-elena {
border-color: var(--accent-player);
}
.fighter-panel.panel-almagest {
border-color: var(--accent-almagest);
}
.fighter-panel.panel-balard {
border-color: var(--accent-opponent);
}
.panel-header {
flex-shrink: 0;
display: flex;
align-items: center;
gap: 10px;
padding-bottom: 10px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
margin-bottom: 0;
}
.fighter-name {
font-size: 1.6em;
margin: 0;
flex-grow: 1;
text-align: left;
}
.fighter-name .icon-elena { color: var(--accent-player); }
.fighter-name .icon-almagest { color: var(--accent-almagest); }
.fighter-name .icon-balard { color: var(--accent-opponent); }
.character-visual {
flex-shrink: 0;
margin-bottom: 0;
}
.avatar-image {
display: block;
max-width: 50px;
height: auto;
border-radius: 50%;
border: 2px solid var(--panel-border);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.5);
}
.avatar-image.avatar-elena { border-color: var(--accent-player); }
.avatar-image.avatar-almagest { border-color: var(--accent-almagest); }
.avatar-image.avatar-balard { border-color: var(--accent-opponent); }
.panel-content {
flex-grow: 1;
overflow-y: auto;
padding-right: 5px;
display: flex;
flex-direction: column;
gap: 10px; /* Добавлено из серверной версии для консистентности */
min-height: 0;
padding-top: 10px;
margin-top: 0;
}
.stat-bar-container {
display: flex;
align-items: center;
gap: 10px;
flex-shrink: 0;
}
.stat-bar-container .bar-icon {
flex-shrink: 0;
font-size: 1.4em;
}
.stat-bar-container.health .bar-icon { color: var(--hp-color); }
.stat-bar-container.mana .bar-icon { color: var(--mana-color); }
.stat-bar-container.stamina .bar-icon { color: var(--stamina-color); }
.stat-bar-container.dark-energy .bar-icon { color: var(--dark-energy-color); }
.bar-wrapper {
flex-grow: 1;
}
.bar {
border-radius: 4px;
height: 20px;
border: 1px solid rgba(0, 0, 0, 0.5);
overflow: hidden;
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5);
position: relative;
background-color: var(--bar-bg);
}
.bar-fill {
display: block;
height: 100%;
border-radius: 3px;
position: relative;
z-index: 2;
transition: width 0.4s ease-out;
}
.bar-text {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
z-index: 3;
display: flex;
justify-content: center;
align-items: center;
font-size: 0.75em;
font-weight: bold;
color: #fff;
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.9);
padding: 0 5px;
white-space: nowrap;
pointer-events: none;
}
.health .bar-fill { background-color: var(--hp-color); }
.mana .bar-fill { background-color: var(--mana-color); }
.stamina .bar-fill { background-color: var(--stamina-color); }
.dark-energy .bar-fill { background-color: var(--dark-energy-color); }
.status-area {
font-size: 0.9em;
display: flex;
align-items: baseline;
gap: 5px;
flex-shrink: 0;
min-height: 1.5em;
}
.status-area .icon-status {
font-size: 1em;
flex-shrink: 0;
margin-top: 0.1em;
}
.status-area strong {
color: var(--text-muted);
font-weight: normal;
flex-shrink: 0;
margin-right: 3px;
}
.status-area span {
font-weight: bold;
}
.status-area span.blocking {
color: var(--block-color);
font-style: italic;
}
.effects-area {
font-size: 0.9em;
display: flex;
flex-direction: column;
gap: 8px; /* Добавлено из серверной версии для консистентности */
flex-shrink: 0;
min-height: 3em;
}
.effect-category {
display: flex;
align-items: baseline;
gap: 5px;
}
.effect-category strong {
color: var(--text-muted);
font-weight: normal;
font-family: var(--font-main);
font-size: 0.9em;
flex-shrink: 0;
margin-right: 3px;
}
.effect-category .icon-effects-buff,
.effect-category .icon-effects-debuff {
font-size: 1em;
flex-shrink: 0;
margin-top: 0.1em;
width: 1.2em;
text-align: center;
}
.effect-category .icon-effects-buff { color: var(--heal-color); }
.effect-category .icon-effects-debuff { color: var(--damage-color); }
.effect-list {
display: inline;
line-height: 1.4;
min-width: 0;
font-weight: bold;
}
.effect {
display: inline-block;
margin: 2px 3px 2px 0;
padding: 1px 6px;
font-size: 0.8em;
border-radius: 10px;
border: 1px solid;
cursor: default;
font-weight: 600;
background-color: rgba(0, 0, 0, 0.2);
white-space: nowrap;
vertical-align: baseline;
}
.effect-buff { border-color: var(--heal-color); color: var(--heal-color); }
.effect-debuff { border-color: var(--damage-color); color: var(--damage-color); }
.effect-stun { border-color: var(--turn-color); color: var(--turn-color); }
.effect-block { border-color: var(--block-color); color: var(--block-color); }
.effect-info { border-color: var(--text-muted); color: var(--text-muted); }
.controls-panel-new {
flex-grow: 1;
min-height: 0;
display: flex;
flex-direction: column;
}
#turn-indicator {
flex-shrink: 0;
text-align: center;
font-size: 1.4em;
margin-bottom: 10px;
padding-bottom: 8px;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
transition: color 0.3s ease;
}
.turn-timer-display {
flex-shrink: 0;
text-align: center;
font-size: 0.9em;
color: var(--timer-text-color);
margin-top: -5px;
margin-bottom: 10px;
padding: 5px;
background-color: rgba(0,0,0,0.15);
border-radius: 4px;
border-top: 1px solid rgba(255,255,255,0.05);
}
.turn-timer-display i {
color: var(--timer-icon-color);
margin-right: 8px;
}
#turn-timer {
font-weight: bold;
font-size: 1.1em;
min-width: 35px;
display: inline-block;
text-align: left;
}
#turn-timer.low-time {
color: var(--timer-low-time-color);
animation: pulse-timer-warning 1s infinite ease-in-out;
}
.controls-layout {
flex-grow: 1;
display: flex;
flex-direction: column;
gap: 10px;
overflow: hidden;
min-height: 0;
}
.control-group {
flex-shrink: 0;
}
.control-group h4 {
font-size: 0.9em;
color: var(--text-muted);
margin-bottom: 5px;
padding-bottom: 5px;
border-bottom: 1px dashed var(--panel-border);
text-transform: uppercase;
letter-spacing: 1px;
}
.basic-actions {
display: flex;
gap: 10px;
}
.action-button.basic {
flex: 1;
padding: 8px 5px;
font-size: 0.85em;
font-weight: bold;
background: var(--button-bg);
color: var(--button-text);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 5px;
cursor: pointer;
transition: all 0.15s ease;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
outline: none;
}
.action-button.basic:hover:enabled {
background: var(--button-hover-bg);
transform: translateY(-1px);
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.5);
}
.action-button.basic:active:enabled {
transform: translateY(0px);
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.4);
}
#button-attack.attack-buffed:enabled {
border: 2px solid var(--heal-color);
box-shadow: 0 0 10px 2px rgba(144, 238, 144, 0.6), 0 3px 6px rgba(0, 0, 0, 0.5);
background: linear-gradient(145deg, #70c070, #5a9a5a);
transform: translateY(-1px);
}
.ability-list {
flex-grow: 1;
display: flex;
flex-direction: column;
min-height: 0;
overflow: hidden;
}
.ability-list h4 {
flex-shrink: 0;
}
.abilities-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(75px, 1fr));
gap: 8px;
padding: 8px;
padding-bottom: 12px;
background-color: rgba(0, 0, 0, 0.2);
border-radius: 4px;
overflow-y: auto;
border: 1px solid rgba(0, 0, 0, 0.3);
flex-grow: 1;
position: relative;
}
.abilities-grid::after {
content: '';
display: block;
height: 10px;
width: 100%;
}
.abilities-grid .placeholder-text {
grid-column: 1 / -1;
text-align: center;
color: var(--text-muted);
align-self: center;
font-size: 0.9em;
padding: 15px 0;
}
.ability-button {
aspect-ratio: 1 / 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
padding: 5px;
border-radius: 6px;
background: var(--button-ability-bg);
border: 1px solid var(--button-ability-border);
color: #fff;
text-align: center;
line-height: 1.15;
cursor: pointer;
transition: all 0.2s ease-out;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4);
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.6);
position: relative;
overflow: hidden;
outline: none;
}
.ability-button .ability-name {
font-size: 0.75em;
font-weight: bold;
margin-bottom: 2px;
display: block;
width: 95%;
}
.ability-button .ability-desc {
font-size: 0.65em;
font-weight: normal;
color: #aaccce;
opacity: 0.8;
text-shadow: none;
max-height: 2em;
overflow: hidden;
width: 95%;
display: block;
margin-top: auto;
}
.ability-button:hover:enabled {
transform: scale(1.03) translateY(-1px);
background: var(--button-ability-hover-bg);
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.5), 0 0 8px rgba(77, 176, 181, 0.4);
border-color: #77d9dd;
}
.ability-button:active:enabled {
transform: scale(1) translateY(0);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.3), 0 1px 2px rgba(0, 0, 0, 0.3);
filter: brightness(0.9);
}
.ability-button:disabled,
.action-button.basic:disabled {
background: var(--button-disabled-bg) !important;
border-color: transparent !important;
color: var(--button-disabled-text) !important;
cursor: not-allowed !important;
transform: none !important;
box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.4) !important;
opacity: 0.7;
text-shadow: none !important;
filter: grayscale(50%);
}
.ability-button.not-enough-resource {
border: 2px dashed var(--damage-color);
animation: pulse-red-border 1s infinite ease-in-out;
}
.ability-button.not-enough-resource:disabled {
border-color: var(--damage-color);
box-shadow: inset 0 0 8px rgba(255, 80, 80, 0.2), 0 3px 6px rgba(0, 0, 0, 0.2), inset 0 1px 3px rgba(0, 0, 0, 0.4);
}
.ability-button.buff-is-active {
border: 2px solid var(--heal-color);
box-shadow: 0 0 8px rgba(144, 238, 144, 0.5);
}
.ability-button.buff-is-active:disabled {
border-color: var(--heal-color);
}
.ability-button.is-on-cooldown,
.ability-button.is-silenced {
filter: grayscale(70%) brightness(0.8);
}
.ability-button.is-on-cooldown:disabled,
.ability-button.is-silenced:disabled {
filter: grayscale(70%) brightness(0.7);
}
.ability-button.is-on-cooldown .ability-name,
.ability-button.is-silenced .ability-name,
.ability-button.is-on-cooldown .ability-desc,
.ability-button.is-silenced .ability-desc {
opacity: 0.6;
}
.ability-button.is-on-cooldown .ability-desc,
.ability-button.is-silenced .ability-desc {
display: none;
}
.ability-cooldown-display {
position: absolute;
bottom: 5px;
left: 0;
width: 100%;
text-align: center;
font-size: 0.75em;
font-weight: bold;
color: var(--turn-color);
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.7);
pointer-events: none;
display: none;
line-height: 1;
}
.ability-button.is-on-cooldown .ability-cooldown-display,
.ability-button.is-silenced .ability-cooldown-display {
display: block !important;
}
.battle-log-new {
height: var(--log-panel-fixed-height);
flex-shrink: 0;
display: flex;
flex-direction: column;
overflow: hidden;
}
.battle-log-new h3 {
flex-shrink: 0;
font-size: 1.4em;
margin-bottom: 10px;
text-align: center;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
padding-bottom: 8px;
}
#log-list {
list-style: none;
flex-grow: 1;
overflow-y: auto;
background-color: var(--log-bg);
border: 1px solid var(--log-border);
font-size: 0.85em;
border-radius: 6px;
color: var(--log-text);
padding: 10px;
min-height: 0;
word-wrap: break-word;
}
#log-list li {
padding: 4px 8px;
border-bottom: 1px solid rgba(74, 80, 114, 0.5);
line-height: 1.35;
transition: background-color 0.3s;
}
#log-list li:last-child {
border-bottom: none;
}
#log-list li:hover {
background-color: rgba(255, 255, 255, 0.03);
}
.log-damage { color: var(--damage-color); font-weight: 500; }
.log-heal { color: var(--heal-color); font-weight: 500; }
.log-block { color: var(--block-color); font-style: italic; }
.log-info { color: #b0c4de; }
.log-turn {
font-weight: bold;
color: var(--turn-color);
margin-top: 6px;
border-top: 1px solid rgba(255, 215, 0, 0.3);
padding-top: 6px;
font-size: 1.05em;
display: block;
}
.log-system {
font-weight: bold;
color: var(--system-color);
font-style: italic;
opacity: 0.8;
}
.log-effect {
font-style: italic;
color: var(--effect-color);
}
.modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: var(--modal-bg);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
backdrop-filter: blur(4px) brightness(0.7);
opacity: 0;
pointer-events: none;
transition: opacity 0.4s ease-out;
}
.modal.hidden {
display: none !important;
}
.modal:not(.hidden) {
opacity: 1;
pointer-events: auto;
}
.modal-content {
background: var(--modal-content-bg);
padding: 40px 50px;
border-radius: 10px;
text-align: center;
border: 1px solid var(--panel-border);
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.6);
color: var(--text-light);
transform: scale(0.8) translateY(30px);
opacity: 0;
transition: transform 0.4s cubic-bezier(0.2, 0.9, 0.3, 1.2), opacity 0.4s ease-out;
}
.modal:not(.hidden) .modal-content {
transform: scale(1) translateY(0);
opacity: 1;
}
.modal-content h2#result-message {
margin-bottom: 25px;
font-family: var(--font-fancy);
font-size: 2.5em;
line-height: 1.2;
}
.modal-action-button {
padding: 12px 30px;
font-size: 1.1em;
cursor: pointer;
background: var(--button-bg);
color: var(--button-text);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 6px;
margin-top: 20px;
font-weight: bold;
text-transform: uppercase;
letter-spacing: 1px;
transition: all 0.2s ease;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.4);
outline: none;
}
.modal-action-button:hover:enabled {
background: var(--button-hover-bg);
transform: scale(1.05) translateY(-1px);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.5);
}
.modal-action-button:active:enabled {
transform: scale(1) translateY(0);
box-shadow: 0 3px 6px rgba(0, 0, 0, 0.4);
}
.modal-action-button:disabled {
background: var(--button-disabled-bg);
color: var(--button-disabled-text);
cursor: not-allowed;
opacity: 0.7;
}
.modal-action-button i {
margin-right: 8px;
}
@keyframes pulse-red-border {
0%, 100% { border-color: var(--damage-color); }
50% { border-color: #ffb3b3; }
}
@keyframes pulse-timer-warning {
0%, 100% { color: var(--timer-low-time-color); transform: scale(1); }
50% { color: #ff6347; transform: scale(1.05); }
}
@keyframes flash-effect {
0%, 100% {
box-shadow: var(--initial-box-shadow, 0 0 15px rgba(0, 0, 0, 0.4), inset 0 0 10px rgba(0, 0, 0, 0.3));
border-color: var(--initial-border-color, var(--panel-border));
transform: scale(1);
}
50% {
box-shadow: 0 0 25px 10px var(--flash-color-outer, rgba(255, 255, 255, 0.7)),
inset 0 0 15px var(--flash-color-inner, rgba(255, 255, 255, 0.4)),
0 0 15px rgba(0, 0, 0, 0.4);
border-color: var(--flash-border-color, #ffffff);
transform: scale(1.005);
}
}
[class*="is-casting-"] {
animation: flash-effect var(--cast-duration) ease-out;
}
#player-panel.is-casting-heal, #opponent-panel.is-casting-heal {
--flash-color-outer: rgba(144, 238, 144, 0.7); --flash-color-inner: rgba(144, 238, 144, 0.4);
--flash-border-color: var(--heal-color);
}
#player-panel.is-casting-fireball, #opponent-panel.is-casting-fireball {
--flash-color-outer: rgba(255, 100, 100, 0.7); --flash-color-inner: rgba(255, 100, 100, 0.4);
--flash-border-color: var(--damage-color);
}
#player-panel.is-casting-shadowBolt, #opponent-panel.is-casting-shadowBolt {
--flash-color-outer: rgba(138, 43, 226, 0.6); --flash-color-inner: rgba(138, 43, 226, 0.3);
--flash-border-color: var(--dark-energy-color);
}
@keyframes shake-opponent {
0%, 100% { transform: translateX(0); }
10%, 30%, 50%, 70%, 90% { transform: translateX(-4px) rotate(-0.5deg); }
20%, 40%, 60%, 80% { transform: translateX(4px) rotate(0.5deg); }
}
#opponent-panel.is-shaking {
animation: shake-opponent var(--shake-duration) cubic-bezier(.36, .07, .19, .97) both;
transform: translate3d(0, 0, 0);
backface-visibility: hidden;
perspective: 1000px;
}
#opponent-panel.dissolving {
opacity: 0;
transform: scale(0.9) translateY(20px);
transition: opacity var(--dissolve-duration) ease-in, transform var(--dissolve-duration) ease-in;
pointer-events: none;
}
@keyframes shake-short {
0%, 100% { transform: translateX(0); }
25% { transform: translateX(-3px); }
50% { transform: translateX(3px); }
75% { transform: translateX(-3px); }
}
.shake-short {
animation: shake-short 0.3s ease-in-out;
}
/* --- Отзывчивость (Медиа-запросы) --- */
@media (max-width: 900px) {
body {
height: auto; min-height: 100vh; /* Из серверной, чтобы обеспечить высоту */
overflow-y: auto;
padding: 5px 0; font-size: 15px;
justify-content: flex-start;
}
.auth-game-setup-wrapper {
max-height: none;
padding-top: 60px; /* Отступ для #user-info из локальной */
}
/* === ИЗМЕНЕНИЕ: Адаптация #user-info (из локальной версии) === */
#user-info { top: 5px; right: 10px; }
#user-info p { font-size: 0.85em; }
#logout-button { padding: 5px 10px !important; font-size: 0.75em !important; }
/* === КОНЕЦ ИЗМЕНЕНИЯ === */
.game-wrapper { padding: 5px; gap: 5px; height: auto; min-height: calc(100vh - 10px); width: 100%; } /* min-height и width из серверной */
/* === ИЗМЕНЕНИЕ: game-header удален (из локальной версии) === */
/* Показываем кнопки переключения на мобильных - ИЗ СЕРВЕРНОЙ ВЕРСИИ */
.panel-switcher-controls {
display: flex;
}
.battle-arena-container {
/* flex-direction: column; height: auto; overflow: visible; - из локальной версии заменяется логикой ниже */
gap: 0; /* Убираем отступ между колонками, т.к. они будут накладываться - ИЗ СЕРВЕРНОЙ ВЕРСИИ */
/* position: relative; overflow: hidden; flex-grow: 1; min-height: 350px; - Эти стили уже есть глобально, но тут подтверждаем */
}
/* Стили для колонок при переключении - ИЗ СЕРВЕРНОЙ ВЕРСИИ */
.player-column,
.opponent-column {
/* width: 100%; height: auto; overflow: visible; - из локальной версии заменяется логикой ниже */
position: absolute; /* Для наложения */
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow-y: auto; /* Прокрутка содержимого колонки */
transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out;
padding: 5px; /* Добавлено для отступов внутри колонок на мобильных */
gap: 8px; /* Добавлено для отступов между панелями внутри колонок */
}
.player-column { transform: translateX(0); opacity: 1; z-index: 10; pointer-events: auto; }
.opponent-column { transform: translateX(100%); opacity: 0; z-index: 5; pointer-events: none; }
.battle-arena-container.show-opponent-panel .player-column { transform: translateX(-100%); opacity: 0; z-index: 5; pointer-events: none; }
.battle-arena-container.show-opponent-panel .opponent-column { transform: translateX(0); opacity: 1; z-index: 10; pointer-events: auto; }
.fighter-panel, .controls-panel-new, .battle-log-new {
min-height: auto; /* Высота по контенту */
height: auto;
padding: 10px;
flex-grow: 0; /* Локальное */
flex-shrink: 1; /* Локальное */
}
.fighter-panel { flex-shrink: 0; } /* Из серверной для panel-switcher */
.fighter-panel .panel-content { flex-grow: 1; min-height: 0; } /* Из серверной для panel-switcher */
.controls-panel-new { min-height: 200px; flex-shrink: 0; } /* flex-shrink из серверной */
.battle-log-new { height: auto; min-height: 150px; flex-shrink: 0; } /* flex-shrink из серверной */
#log-list { max-height: 200px; }
.abilities-grid { max-height: none; overflow-y: visible; padding-bottom: 8px; }
.abilities-grid::after { display: none; }
.ability-list, .controls-layout { overflow: visible; } /* Локальное */
.fighter-name { font-size: 1.3em; }
.panel-content { margin-top: 10px; /* Локальное, но теперь panel-content изменен для серверного panel-switcher, возможно, не нужно */ }
.stat-bar-container .bar-icon { font-size: 1.2em; }
.bar { height: 18px; }
.effects-area, .effect { font-size: 0.85em; }
#turn-indicator { font-size: 1.2em; margin-bottom: 8px; }
.turn-timer-display { font-size: 0.85em; margin-bottom: 8px; padding: 4px; }
#turn-timer { font-size: 1em; }
.action-button.basic { font-size: 0.8em; padding: 8px 4px; }
.abilities-grid { grid-template-columns: repeat(auto-fit, minmax(80px, 1fr)); gap: 8px; padding: 8px; }
.ability-button { font-size: 0.75em; padding: 5px; }
.ability-button .ability-name { margin-bottom: 2px; }
.ability-button .ability-desc { font-size: 0.65em; }
.modal-content { padding: 25px 30px; width: 90%; max-width: 400px; }
.modal-content h2#result-message { font-size: 1.8em; }
.modal-action-button { font-size: 1em; padding: 10px 20px; }
#game-setup { max-width: 95%; padding: 15px; }
#game-setup h2 { font-size: 1.6em; }
#game-setup h3 { font-size: 1.1em; }
#game-setup button { padding: 8px 12px; font-size: 0.9em; }
#game-setup input[type="text"] { width: calc(100% - 90px); max-width: 200px; padding: 8px; }
#available-games-list { max-height: 180px; }
.character-selection label { margin: 0 10px; font-size: 1em; }
}
@media (max-width: 480px) {
body { font-size: 14px; }
/* === ИЗМЕНЕНИЕ: Адаптация #user-info для мобильных (из локальной версии) === */
.auth-game-setup-wrapper { padding-top: 50px; /* Еще немного места сверху */ }
#user-info {
top: 5px;
right: 5px;
display: flex; /* В одну строку */
flex-direction: row;
align-items: center;
gap: 8px;
}
#user-info p { margin-bottom: 0; font-size: 0.8em; }
#logout-button { padding: 4px 8px !important; font-size: 0.7em !important; }
#logout-button i { margin-right: 3px; }
/* === КОНЕЦ ИЗМЕНЕНИЯ === */
/* Стили для panel-switcher на очень маленьких экранах - ИЗ СЕРВЕРНОЙ ВЕРСИИ */
.panel-switch-button .button-text { display: none; } /* Скрываем текст, оставляем иконки */
.panel-switch-button i { margin-right: 0; font-size: 1.2em; }
.panel-switch-button { padding: 6px 8px; }
/* Локальные изменения */
.fighter-name { font-size: 1.2em; }
.avatar-image { max-width: 40px; } /* Из серверной, но не противоречит */
.abilities-grid { grid-template-columns: repeat(auto-fit, minmax(65px, 1fr)); gap: 5px; padding: 5px; padding-bottom: 10px; }
.ability-button { font-size: 0.7em; padding: 4px; }
.ability-button .ability-name { margin-bottom: 1px; }
.ability-button .ability-desc { display: none; }
#log-list { font-size: 0.8em; max-height: 150px; }
.modal-content { padding: 20px; }
.modal-content h2#result-message { font-size: 1.6em; }
.modal-action-button { font-size: 0.9em; padding: 8px 16px; }
.auth-game-setup-wrapper { padding-left: 15px; padding-right: 15px; }
#game-setup { padding: 10px; }
#game-setup h2 { font-size: 1.4em; }
#game-setup button { padding: 7px 10px; font-size: 0.85em; margin: 5px; }
#game-setup input[type="text"],
#game-setup button { display: block; width: 100%; margin-left: 0; margin-right: 0; }
#game-setup input[type="text"] { max-width: none; margin-bottom: 10px; }
#game-setup div>input[type="text"]+button { margin-top: 5px; }
#available-games-list { max-height: 120px; }
#available-games-list li button { font-size: 0.75em; padding: 5px 8px; }
.character-selection { padding: 10px; }
.character-selection label { margin: 0 5px 5px 5px; font-size: 0.9em; display: block; }
.character-selection label i { margin-right: 5px; }
#turn-indicator { font-size: 1.1em; }
.turn-timer-display { font-size: 0.8em; margin-top: -3px; margin-bottom: 6px; }
#turn-timer { font-size: 0.95em; }
}