blackjack/Components/Pages/BlackjackGame.razor.css
2025-04-17 22:25:37 +07:00

1060 lines
23 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.

:root {
/* Цветовая палитра */
--casino-green: #2a9d8f;
--casino-dark-green: #226f66;
--felt-green: #40a886;
--wood-brown: #b76e40;
--gold: #ffbe0b;
--light-gold: #ffe066;
--dark-gold: #e29400;
--red: #ff5e5b;
--black: #2b2b2b;
--white: #ffffff;
--gray: #7d8597;
--light-gray: #f1f3f5;
--blue: #3a86ff;
/* Общие эффекты */
--card-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
--button-shadow: 0 6px 0 var(--dark-gold);
--transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
}
/* Базовая структура страницы */
.casino-background {
background: linear-gradient(135deg, #2c3e50, #4a6572, #2c3e50);
background-size: 400% 400%;
animation: gradient 15s ease infinite;
min-height: 100vh;
padding: 20px;
box-sizing: border-box;
display: flex;
justify-content: center;
align-items: center;
font-family: 'Poppins', 'Montserrat', sans-serif;
color: var(--white);
position: relative;
overflow-x: hidden;
}
/* Анимация градиентного фона */
@keyframes gradient {
0% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
100% {
background-position: 0% 50%;
}
}
/* Текстура фона */
.casino-background::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-image: radial-gradient(circle at 25px 25px, rgba(255, 255, 255, 0.1) 2px, transparent 0);
background-size: 100px 100px;
pointer-events: none;
}
/* Основной контейнер игры */
.blackjack-container {
width: 100%;
max-width: 1000px;
background: linear-gradient(145deg, var(--casino-green), var(--casino-dark-green));
border-radius: 20px;
box-shadow: 0 12px 25px rgba(0, 0, 0, 0.3);
padding: 30px;
position: relative;
border: 6px solid var(--wood-brown);
display: flex;
flex-direction: column;
}
/* Заголовок игры */
.game-header {
display: flex;
justify-content: center;
align-items: center;
position: relative;
margin-bottom: 20px;
}
.game-title {
color: var(--light-gold);
text-transform: uppercase;
text-align: center;
font-size: 3rem;
margin: 0;
letter-spacing: 3px;
font-weight: 800;
position: relative;
z-index: 2;
}
.game-title::after {
content: '';
position: absolute;
bottom: -10px;
left: 50%;
transform: translateX(-50%);
width: 70%;
height: 3px;
background: linear-gradient(90deg, transparent, var(--gold), transparent);
}
/* Стопка фишек - декоративный элемент */
.chip-stack {
width: 70px;
height: 70px;
position: absolute;
right: 0;
top: 0;
filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2));
display: flex;
flex-direction: column;
align-items: center;
z-index: 1;
}
.chip-stack::before {
content: "";
width: 60px;
height: 10px;
background: linear-gradient(to right, var(--red), var(--gold), var(--blue), var(--black));
border-radius: 5px;
position: absolute;
top: 20px;
transform: rotate(-15deg);
}
.chip-stack::after {
content: "";
width: 60px;
height: 60px;
background: conic-gradient(var(--gold) 0deg 60deg, var(--blue) 60deg 120deg, var(--red) 120deg 240deg, var(--black) 240deg 360deg);
border-radius: 50%;
position: absolute;
top: 0;
border: 2px solid rgba(0,0,0,0.2);
box-shadow: 0 5px 15px rgba(0,0,0,0.3);
}
/* Область сообщений */
.message-box {
background-color: var(--white);
border-left: 5px solid var(--gold);
padding: 15px 20px;
margin: 0 auto 25px;
color: var(--black);
border-radius: 8px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
text-align: center;
max-width: 85%;
transition: var(--transition);
z-index: 2;
position: relative;
}
.message-win {
border-left: 5px solid #4caf50;
background-color: #e8f5e9;
color: #2e7d32;
}
.message-lose {
border-left: 5px solid var(--red);
background-color: #ffebee;
color: #c62828;
}
.message-info {
border-left: 5px solid var(--blue);
background-color: #e1f5fe;
color: #0277bd;
}
.message-content {
font-size: 1.2rem;
font-weight: 600;
letter-spacing: 0.5px;
}
/* Основная игровая область */
.game-area {
background-color: var(--felt-green);
border-radius: 16px;
padding: 25px;
box-shadow: inset 0 0 15px rgba(0, 0, 0, 0.3);
position: relative;
border: 3px solid var(--casino-dark-green);
display: flex;
flex-direction: column;
}
/* Текстура игрового стола */
.game-area::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-image: repeating-linear-gradient(45deg, transparent, transparent 2px, rgba(255, 255, 255, 0.03) 2px, rgba(255, 255, 255, 0.03) 4px);
border-radius: inherit;
z-index: 1;
pointer-events: none;
}
/* Секции игроков */
.player-section {
position: relative;
z-index: 2;
margin-bottom: 15px;
}
.player-section-user {
margin-top: 15px;
margin-bottom: 25px;
}
/* Информация об игроке */
.player-info {
display: flex;
align-items: center;
gap: 15px;
margin-bottom: 15px;
}
.player-avatar {
width: 50px;
height: 50px;
border-radius: 50%;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
border: 3px solid var(--gold);
position: relative;
overflow: hidden;
display: flex;
justify-content: center;
align-items: center;
background: #e8e8e8;
}
/* Аватар дилера */
.dealer-avatar::after {
content: "♠";
font-size: 30px;
color: var(--black);
text-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
}
.dealer-avatar::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 20px;
background: linear-gradient(to bottom, #3f51b5, transparent);
}
/* Аватар игрока */
.player-avatar-user {
background: linear-gradient(135deg, #e4d9b4, #f8eecc);
}
.player-avatar-user::after {
content: "♥";
font-size: 30px;
color: var(--red);
text-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
}
.player-avatar-user::before {
content: "";
position: absolute;
bottom: -15px;
left: 0;
right: 0;
height: 30px;
border-radius: 50% 50% 0 0;
background: rgba(0,0,0,0.1);
}
/* Заголовок игрока */
.player-title {
color: var(--white);
font-size: 1.5rem;
margin: 0;
font-weight: 600;
letter-spacing: 0.5px;
display: flex;
align-items: center;
}
/* Значок с очками */
.score-badge {
background: #ffffff;
padding: 5px 10px;
border-radius: 50px;
font-size: 1.1rem;
margin-left: 10px;
color: var(--black);
border: 2px solid var(--dark-gold);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
display: inline-block;
}
/* Область для карт */
.hand {
display: flex;
flex-wrap: wrap;
min-height: 160px;
padding: 10px;
position: relative;
justify-content: center;
gap: 10px;
z-index: 2;
}
/* Разделитель между дилером и игроком */
.table-divider {
display: flex;
justify-content: center;
gap: 15px;
margin: 20px 0;
position: relative;
z-index: 2;
}
.table-divider::before {
content: '';
position: absolute;
top: 50%;
left: 5%;
right: 5%;
height: 1px;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.6), transparent);
z-index: 1;
}
/* Фишки на столе */
.chip {
width: 36px;
height: 36px;
border-radius: 50%;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
position: relative;
z-index: 2;
transition: transform 0.3s ease;
}
.chip:hover {
transform: translateY(-3px);
}
.chip::after {
content: "";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 24px;
height: 24px;
border-radius: 50%;
border: 1px dashed rgba(255, 255, 255, 0.5);
}
.red-chip {
background: radial-gradient(circle at 30% 30%, #ff8a8a 0%, var(--red) 60%);
border: 2px dashed #ffc7c7;
}
.blue-chip {
background: radial-gradient(circle at 30% 30%, #94d0ff 0%, var(--blue) 60%);
border: 2px dashed #c5e5ff;
}
.green-chip {
background: radial-gradient(circle at 30% 30%, #89e89c 0%, #3cac4c 60%);
border: 2px dashed #d2f9db;
}
.black-chip {
background: radial-gradient(circle at 30% 30%, #a6aaaf 0%, var(--black) 60%);
border: 2px dashed #e2e6eb;
}
/* Контейнер карты */
.card-container {
position: relative;
perspective: 1000px;
margin: 5px;
z-index: 2;
}
.card-container.card-hidden {
transform: rotateY(0deg);
}
/* Игральная карта - базовый стиль */
.playing-card {
width: 110px;
height: 154px;
background-color: #ffffff;
border-radius: 8px;
box-shadow: var(--card-shadow);
position: relative;
transform-style: preserve-3d;
backface-visibility: hidden;
transition: transform 0.3s ease, box-shadow 0.3s ease;
border: 1px solid rgba(0, 0, 0, 0.15);
display: flex;
justify-content: center;
align-items: center;
/* Удаляем линовку */
background-image: none;
}
/* Добавляем декоративную внутреннюю рамку для всех карт */
.playing-card::before {
content: "";
position: absolute;
top: 5px;
left: 5px;
right: 5px;
bottom: 5px;
border: 1px solid rgba(0, 0, 0, 0.1);
border-radius: 4px;
z-index: 1;
pointer-events: none;
}
/* Улучшаем эффект при наведении */
.card-container:hover .playing-card {
transform: translateY(-5px) rotate(1deg);
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.25);
}
/* Рубашка карты - полностью переопределяем все стили */
.playing-card.card-back {
/* Отключаем все ранее определённые фоны */
background: none;
background-color: #303f9f;
background-image: none !important;
position: relative;
overflow: hidden;
}
/* Узор на рубашке */
.playing-card.card-back::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-image: repeating-linear-gradient( 45deg, #3949ab, #3949ab 10px, #303f9f 10px, #303f9f 20px );
opacity: 0.7;
z-index: 1;
}
/* Символ в центре */
.playing-card.card-back::after {
content: "?";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 50px;
color: white;
z-index: 2;
text-shadow: 0 0 5px rgba(0,0,0,0.5);
}
/* Фон для красных карт (червы и бубны) */
.card-red {
color: #e53935;
background: linear-gradient(135deg, #fff, #fff8f8);
}
/* Тонкий узор для красных карт */
.card-red::after {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
opacity: 0.05;
background-image: repeating-linear-gradient(45deg, #e53935, #e53935 10px, transparent 10px, transparent 20px), repeating-linear-gradient(-45deg, #e53935, #e53935 10px, transparent 10px, transparent 20px);
border-radius: 7px;
z-index: 1;
}
/* Фон для черных карт (пики и трефы) */
.card-black {
color: #212121;
background: linear-gradient(135deg, #fff, #f8f8ff);
}
/* Тонкий узор для черных карт */
.card-black::after {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
opacity: 0.05;
background-image: repeating-linear-gradient(45deg, #212121, #212121 10px, transparent 10px, transparent 20px), repeating-linear-gradient(-45deg, #212121, #212121 10px, transparent 10px, transparent 20px);
border-radius: 7px;
z-index: 1;
}
/* Улучшение видимости содержимого карты */
.card-corner, .card-center-suit {
position: relative;
z-index: 2;
}
/* Добавляем тень для масти в центре */
.card-center-suit {
font-size: 3rem;
filter: drop-shadow(0 2px 3px rgba(0, 0, 0, 0.2));
}
/* Эффект при наведении */
.card-container:hover .playing-card {
transform: translateY(-5px) rotate(1deg);
box-shadow: 0 8px 16px rgba(0, 0, 0, 0.25);
}
/* Углы карт */
.card-corner {
position: absolute;
display: flex;
flex-direction: column;
align-items: center;
line-height: 1;
}
.top-left {
top: 6px;
left: 6px;
}
.bottom-right {
bottom: 6px;
right: 6px;
transform: rotate(180deg);
}
.card-rank {
font-size: 1.4rem;
font-weight: bold;
}
.card-suit {
font-size: 1.2rem;
}
.card-center-suit {
font-size: 3rem;
filter: drop-shadow(0 2px 3px rgba(0, 0, 0, 0.1));
}
/* Кнопки действий */
.action-buttons {
display: flex;
justify-content: center;
gap: 20px;
margin-top: 25px;
flex-wrap: wrap;
position: relative;
z-index: 3;
}
/* 3D кнопки */
.btn-3d {
position: relative;
padding: 12px 25px;
background: linear-gradient(to bottom, var(--gold), var(--dark-gold));
color: var(--black);
border: none;
border-radius: 50px;
font-size: 1rem;
font-weight: 700;
text-transform: uppercase;
box-shadow: var(--button-shadow), 0 8px 16px rgba(0, 0, 0, 0.18);
transition: all 0.25s;
cursor: pointer;
outline: none;
min-width: 150px;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
letter-spacing: 1px;
z-index: 3;
}
.btn-3d:hover {
background: linear-gradient(to bottom, var(--light-gold), var(--gold));
transform: translateY(-3px);
box-shadow: 0 9px 0 var(--dark-gold), 0 12px 22px rgba(0, 0, 0, 0.2);
}
.btn-3d:active {
transform: translateY(3px);
box-shadow: 0 3px 0 var(--dark-gold), 0 4px 8px rgba(0, 0, 0, 0.1);
}
.btn-3d:disabled {
background: linear-gradient(to bottom, var(--gray), #939cad);
color: var(--light-gray);
cursor: not-allowed;
box-shadow: 0 6px 0 #636b7c, 0 8px 16px rgba(0, 0, 0, 0.1);
opacity: 0.8;
}
/* Кнопка "Взять карту" */
.btn-hit {
background: linear-gradient(to bottom, #76cf79, #48a04c);
box-shadow: 0 6px 0 #3e8942, 0 8px 16px rgba(0, 0, 0, 0.18);
color: white;
}
.btn-hit:hover {
background: linear-gradient(to bottom, #91d994, #53b557);
box-shadow: 0 9px 0 #3e8942, 0 12px 22px rgba(0, 0, 0, 0.2);
}
.btn-hit:active {
box-shadow: 0 3px 0 #3e8942, 0 4px 8px rgba(0, 0, 0, 0.1);
}
/* Кнопка "Стоп" */
.btn-stand {
background: linear-gradient(to bottom, #ff7875, #d63d38);
box-shadow: 0 6px 0 #c62828, 0 8px 16px rgba(0, 0, 0, 0.18);
color: white;
}
.btn-stand:hover {
background: linear-gradient(to bottom, #ff9793, #e34744);
box-shadow: 0 9px 0 #c62828, 0 12px 22px rgba(0, 0, 0, 0.2);
}
.btn-stand:active {
box-shadow: 0 3px 0 #c62828, 0 4px 8px rgba(0, 0, 0, 0.1);
}
/* Кнопка "Новая игра" */
.btn-new-game {
background: linear-gradient(to bottom, #7986cb, #495cc9);
color: var(--white);
box-shadow: 0 6px 0 #3949ab, 0 8px 16px rgba(0, 0, 0, 0.18);
}
.btn-new-game:hover {
background: linear-gradient(to bottom, #9aa5d6, #5969d2);
box-shadow: 0 9px 0 #3949ab, 0 12px 22px rgba(0, 0, 0, 0.2);
}
.btn-new-game:active {
box-shadow: 0 3px 0 #3949ab, 0 4px 8px rgba(0, 0, 0, 0.1);
}
/* Иконки для кнопок */
.btn-icon {
display: inline-block;
width: 20px;
height: 20px;
position: relative;
filter: drop-shadow(0 1px 1px rgba(0, 0, 0, 0.2));
}
/* Иконка "Взять карту" */
.hit-icon::before {
content: "+";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 20px;
font-weight: bold;
color: #ffffff;
}
/* Иконка "Стоп" */
.stand-icon::before {
content: "✋";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 16px;
color: #ffffff;
}
/* Иконка "Новая игра" */
.new-game-icon::before {
content: "↻";
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 18px;
color: #ffffff;
font-weight: bold;
}
/* Начальный экран */
.start-screen {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 40px 20px;
}
/* Заменяем старый логотип игры на анимированный */
.game-logo {
width: 300px;
height: 200px;
margin-bottom: 40px;
position: relative;
filter: drop-shadow(0 8px 16px rgba(0, 0, 0, 0.25));
transition: transform 0.5s ease;
display: flex;
align-items: center;
justify-content: center;
}
/* Удаляем старые псевдоэлементы с текстом */
.game-logo::before,
.game-logo::after {
content: none;
}
/* Создаем анимированную карточную колоду */
.game-logo {
position: relative;
perspective: 1000px;
}
/* Анимированная колода карт */
.game-logo::before {
content: "";
position: absolute;
width: 120px;
height: 160px;
background: linear-gradient(145deg, var(--gold), var(--dark-gold));
border-radius: 10px;
box-shadow: 0 15px 25px rgba(0, 0, 0, 0.4);
transform-style: preserve-3d;
animation: cardShuffle 3s infinite ease-in-out;
}
/* Лицевая карта с символом */
.game-logo::after {
content: "♠";
position: absolute;
width: 120px;
height: 160px;
background: white;
border-radius: 10px;
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3);
font-size: 70px;
display: flex;
align-items: center;
justify-content: center;
color: var(--black);
transform-style: preserve-3d;
animation: cardFlip 3s infinite ease-in-out;
border: 2px solid var(--dark-gold);
}
/* Анимация перемешивания колоды */
@keyframes cardShuffle {
0% {
transform: translateX(-80px) rotateY(0) translateZ(0);
}
25% {
transform: translateX(-30px) rotateY(10deg) translateZ(10px);
}
50% {
transform: translateX(30px) rotateY(-10deg) translateZ(20px);
}
75% {
transform: translateX(80px) rotateY(10deg) translateZ(10px);
}
100% {
transform: translateX(-80px) rotateY(0) translateZ(0);
}
}
/* Анимация переворота карты */
@keyframes cardFlip {
0% {
transform: translateZ(20px) rotateY(0);
opacity: 1;
}
45% {
transform: translateZ(80px) rotateY(180deg);
opacity: 0.8;
}
55% {
transform: translateZ(80px) rotateY(180deg);
opacity: 0.8;
}
100% {
transform: translateZ(20px) rotateY(360deg);
opacity: 1;
}
}
/* Дополняем анимацию подсветкой */
.game-logo::before {
animation: cardShuffle 3s infinite ease-in-out, glow 2s infinite alternate;
}
@keyframes glow {
from {
box-shadow: 0 0 10px 2px var(--gold);
}
to {
box-shadow: 0 0 20px 5px var(--light-gold);
}
}
/* Адаптивные стили для анимированного логотипа */
@media (max-width: 768px) {
.game-logo::before,
.game-logo::after {
width: 100px;
height: 140px;
}
.game-logo::after {
font-size: 60px;
}
}
@media (max-width: 480px) {
.game-logo::before,
.game-logo::after {
width: 80px;
height: 112px;
}
.game-logo::after {
font-size: 50px;
}
}
/* Кнопка начала игры */
.btn-start {
font-size: 1.4rem;
padding: 16px 40px;
min-width: 200px;
}
/* Адаптивные стили */
@media (max-width: 768px) {
.blackjack-container {
padding: 20px;
border-width: 4px;
}
.game-title {
font-size: 2rem;
}
.playing-card {
width: 90px;
height: 126px;
}
.card-rank {
font-size: 1.2rem;
}
.card-suit {
font-size: 1.1rem;
}
.card-center-suit {
font-size: 2.4rem;
}
.hand {
min-height: 130px;
}
.action-buttons {
gap: 15px;
margin-top: 20px;
}
.btn-3d {
padding: 10px 18px;
min-width: 130px;
font-size: 0.9rem;
}
.player-title {
font-size: 1.3rem;
}
.message-content {
font-size: 1.1rem;
}
.chip-stack {
width: 60px;
height: 60px;
}
.chip-stack::after {
width: 45px;
height: 45px;
}
.chip-stack::before {
width: 45px;
height: 8px;
}
.game-logo::before {
font-size: 80px;
}
.game-logo::after {
font-size: 36px;
bottom: 40px;
}
}
@media (max-width: 480px) {
.casino-background {
padding: 10px;
}
.blackjack-container {
padding: 15px;
border-width: 3px;
}
.game-title {
font-size: 1.6rem;
}
.playing-card {
width: 70px;
height: 98px;
}
.hand {
min-height: 105px;
gap: 5px;
padding: 5px;
}
.card-rank {
font-size: 1rem;
}
.card-suit {
font-size: 0.9rem;
}
.card-center-suit {
font-size: 1.8rem;
}
.action-buttons {
flex-direction: column;
align-items: center;
gap: 12px;
}
.btn-3d {
width: 100%;
max-width: 250px;
}
.game-area {
padding: 15px;
}
.message-content {
font-size: 1rem;
}
.player-info {
gap: 10px;
margin-bottom: 10px;
}
.player-avatar {
width: 40px;
height: 40px;
}
.player-title {
font-size: 1.1rem;
}
.score-badge {
font-size: 0.9rem;
padding: 3px 8px;
}
.chip-stack {
display: none;
}
.table-divider {
margin: 15px 0;
}
.game-logo {
width: 240px;
height: 160px;
margin-bottom: 30px;
}
.game-logo::before {
font-size: 60px;
}
.game-logo::after {
font-size: 28px;
bottom: 35px;
}
.btn-start {
font-size: 1.2rem;
padding: 14px 30px;
}
}