@tailwind base; @tailwind components; @tailwind utilities; /* 테마 CSS 변수 */ :root { /* 다크 테마 (기본) */ --bg-primary: #141414; --bg-secondary: #1c1c1c; --bg-tertiary: #252525; --bg-card: #1c1c1c; --bg-hover: rgba(255, 255, 255, 0.05); --text-primary: #ffffff; --text-secondary: #a1a1aa; --text-tertiary: #71717a; --text-muted: #52525b; --border-color: rgba(255, 255, 255, 0.1); --border-subtle: rgba(255, 255, 255, 0.05); --shadow-color: rgba(0, 0, 0, 0.3); } /* 라이트 테마 */ .light { --bg-primary: #f8fafc; --bg-secondary: #ffffff; --bg-tertiary: #f1f5f9; --bg-card: #ffffff; --bg-hover: rgba(0, 0, 0, 0.05); --text-primary: #18181b; --text-secondary: #52525b; --text-tertiary: #71717a; --text-muted: #a1a1aa; --border-color: rgba(0, 0, 0, 0.1); --border-subtle: rgba(0, 0, 0, 0.05); --shadow-color: rgba(0, 0, 0, 0.1); /* 글래스 및 카드 */ --glass-bg: rgba(255, 255, 255, 0.9); --glass-border: rgba(0, 0, 0, 0.1); --glass-dark-bg: rgba(248, 250, 252, 0.95); --card-bg: linear-gradient( 135deg, rgba(255, 255, 255, 0.98) 0%, rgba(248, 250, 252, 0.98) 100% ); --card-border: rgba(0, 0, 0, 0.1); } /* 기본 html, body 스타일 */ html { scrollbar-gutter: stable; /* 스크롤바 공간 예약 (세로 스크롤바) */ } body { background: var(--bg-primary); color: var(--text-primary); min-height: 100vh; transition: background-color 0.3s ease, color 0.3s ease; } /* 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: var(--glass-bg, rgba(28, 28, 28, 0.8)); backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); border: 1px solid var(--glass-border, rgba(74, 222, 128, 0.1)); } .glass-dark { background: var(--glass-dark-bg, rgba(20, 20, 20, 0.9)); backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); border: 1px solid var(--border-subtle); } /* 글로우 카드 효과 */ .glow-card { position: relative; background: var( --card-bg, linear-gradient( 135deg, rgba(28, 28, 28, 0.95) 0%, rgba(24, 24, 24, 0.95) 100% ) ); border: 1px solid var(--card-border, 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; }