minecraft-web/frontend/src/index.css
caadiq 6fe6d0dda0 feat: 콘솔 스크롤 개선 및 닉네임 실시간 동기화 구현
- 콘솔 탭 스크롤 동작 개선 (조건부 자동 스크롤, 맨 아래로 버튼)
- 탭 전환 시 레이아웃 쉬프트 방지 (scrollbar-gutter: stable)
- 맨 아래로 버튼에 그림자 효과 추가
- Sidebar에 소켓 기반 닉네임 실시간 동기화 로직 추가
- /link/status API에서 displayName 사용하도록 수정
2025-12-23 10:07:34 +09:00

227 lines
4.7 KiB
CSS

@tailwind base;
@tailwind components;
@tailwind utilities;
/* 기본 html, body 스타일 - 다크 배경 & 스크롤바 레이아웃 고정 */
html {
scrollbar-gutter: stable; /* 스크롤바 공간 예약 (세로 스크롤바) */
}
body {
background: #141414;
min-height: 100vh;
}
/* PC 레이아웃 - min-width 적용 */
body.desktop-layout {
min-width: 1400px;
}
/* 모바일 레이아웃 */
body.mobile-layout {
min-width: unset;
width: 100%;
overflow-x: hidden;
min-height: auto;
}
@layer utilities {
/* 텍스트 그림자 */
.text-shadow {
text-shadow: 2px 2px 0px rgba(0, 0, 0, 0.5);
}
.text-shadow-sm {
text-shadow: 1px 1px 0px rgba(0, 0, 0, 0.5);
}
.text-shadow-lg {
text-shadow: 3px 3px 0px rgba(0, 0, 0, 0.5);
}
/* 그라디언트 텍스트 */
.text-gradient {
background: linear-gradient(135deg, #4ade80 0%, #22d3ee 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* 글래스모피즘 (다크 테마) */
.glass {
background: rgba(28, 28, 28, 0.8);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border: 1px solid rgba(74, 222, 128, 0.1);
}
.glass-dark {
background: rgba(20, 20, 20, 0.9);
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
border: 1px solid rgba(255, 255, 255, 0.05);
}
/* 글로우 카드 효과 */
.glow-card {
position: relative;
background: linear-gradient(
135deg,
rgba(28, 28, 28, 0.95) 0%,
rgba(24, 24, 24, 0.95) 100%
);
border: 1px solid rgba(74, 222, 128, 0.15);
transition: all 0.3s ease;
}
.glow-card::before {
content: "";
position: absolute;
inset: -1px;
background: linear-gradient(
135deg,
rgba(74, 222, 128, 0.2) 0%,
rgba(34, 211, 238, 0.2) 100%
);
border-radius: inherit;
z-index: -1;
opacity: 0;
transition: opacity 0.3s ease;
}
.glow-card:hover::before {
opacity: 1;
}
.glow-card:hover {
border-color: rgba(74, 222, 128, 0.4);
transform: translateY(-2px);
box-shadow: 0 10px 40px rgba(74, 222, 128, 0.15);
}
/* Shimmer 효과 */
.shimmer {
background: linear-gradient(
90deg,
rgba(37, 37, 37, 0.5) 25%,
rgba(74, 222, 128, 0.1) 50%,
rgba(37, 37, 37, 0.5) 75%
);
background-size: 200% 100%;
animation: shimmer 2s infinite linear;
}
/* 아이콘 글로우 */
.icon-glow {
filter: drop-shadow(0 0 8px rgba(74, 222, 128, 0.5));
}
/* 호버 리프트 효과 */
.hover-lift {
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.hover-lift:hover {
transform: translateY(-4px);
box-shadow: 0 12px 24px rgba(0, 0, 0, 0.4);
}
/* 버튼 글로우 */
.btn-glow {
position: relative;
overflow: hidden;
}
.btn-glow::after {
content: "";
position: absolute;
inset: 0;
background: linear-gradient(
135deg,
transparent 0%,
rgba(255, 255, 255, 0.1) 50%,
transparent 100%
);
transform: translateX(-100%);
transition: transform 0.3s ease;
}
.btn-glow:hover::after {
transform: translateX(100%);
}
}
/* 온라인 상태 표시기 펄스 */
.online-pulse {
animation: pulse-ring 1.5s cubic-bezier(0.455, 0.03, 0.515, 0.955) infinite;
}
@keyframes pulse-ring {
0% {
box-shadow: 0 0 0 0 rgba(74, 222, 128, 0.6);
}
70% {
box-shadow: 0 0 0 8px rgba(74, 222, 128, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(74, 222, 128, 0);
}
}
/* 배경 파티클 효과용 */
.particles-bg {
background-image: radial-gradient(
circle at 20% 80%,
rgba(74, 222, 128, 0.04) 0%,
transparent 50%
),
radial-gradient(
circle at 80% 20%,
rgba(34, 211, 238, 0.04) 0%,
transparent 50%
),
radial-gradient(
circle at 40% 40%,
rgba(74, 222, 128, 0.03) 0%,
transparent 30%
);
}
/* 커스텀 스크롤바 */
.custom-scrollbar::-webkit-scrollbar {
width: 8px;
}
.custom-scrollbar::-webkit-scrollbar-track {
background: rgba(255, 255, 255, 0.05);
border-radius: 4px;
}
.custom-scrollbar::-webkit-scrollbar-thumb {
background: rgba(74, 222, 128, 0.3);
border-radius: 4px;
}
.custom-scrollbar::-webkit-scrollbar-thumb:hover {
background: rgba(74, 222, 128, 0.5);
}
/* 픽셀 이미지 렌더링 */
.pixelated {
image-rendering: pixelated;
image-rendering: -moz-crisp-edges;
image-rendering: crisp-edges;
}
/* Details 펼치기/접기 애니메이션 */
details .details-content {
display: grid;
grid-template-rows: 0fr;
transition: grid-template-rows 0.3s ease-out;
}
details[open] .details-content {
grid-template-rows: 1fr;
}
details .details-content > div {
overflow: hidden;
}