/* 기본 & 배경 */ :root { --bg-gradient-start: #1B2735; --bg-gradient-end: #090A0F; --text-color: #e0e0e0; --glow-color-1: rgba(200, 220, 255, 0.6); --glow-color-2: rgba(180, 200, 255, 0.4); --nebula-color-1: rgba(120, 150, 255, 0.25); --nebula-color-2: rgba(200, 100, 200, 0.2); } body[data-theme="nebula"] { --bg-gradient-start: #2c1a4d; --bg-gradient-end: #1f1137; --text-color: #f0e8ff; --glow-color-1: rgba(224, 188, 255, 0.7); --glow-color-2: rgba(198, 148, 255, 0.5); --nebula-color-1: rgba(180, 120, 255, 0.3); --nebula-color-2: rgba(255, 100, 150, 0.25); } body[data-theme="supernova"] { --bg-gradient-start: #4d1a1a; --bg-gradient-end: #371111; --text-color: #fff0e8; --glow-color-1: rgba(255, 224, 188, 0.7); --glow-color-2: rgba(255, 198, 148, 0.5); --nebula-color-1: rgba(255, 180, 120, 0.3); --nebula-color-2: rgba(255, 150, 100, 0.25); } body, html { margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; font-family: 'Segoe UI', 'Roboto', sans-serif; } .cosmic-background { position: relative; width: 100%; height: 100%; background: radial-gradient(ellipse at bottom, var(--bg-gradient-start) 0%, var(--bg-gradient-end) 100%); overflow: hidden; } /* 별 & 성운 & 별똥별 (색상 변수 적용) */ .stars-small, .stars-medium, .stars-large { position: absolute; top: 0; left: 0; width: 1px; height: 1px; background: transparent; border-radius: 50%; animation: animStar 150s linear infinite; /* z-index: 2; 성운보다 높은 z-index */ transition: transform 0.5s ease-out; /* 이 줄을 추가 */ } .stars-small::after, .stars-medium::after, .stars-large::after { content: " "; position: absolute; top: 0; left: 2000px; width: 1px; height: 1px; background: transparent; border-radius: 50%; } .stars-medium, .stars-medium::after { width: 2px; height: 2px; animation-duration: 200s; /* z-index: 3; */ } .stars-large, .stars-large::after { width: 3px; height: 3px; animation-duration: 250s; /* z-index: 4; */ } @keyframes animStar { from { transform: translateX(0); } to { transform: translateX(-2000px); } } .nebula-layer { position: absolute; inset: 0; width: 100%; height: 100%; /* background: radial-gradient(ellipse at 90% 10%, var(--nebula-color-1) 0%, transparent 60%), radial-gradient(ellipse at 10% 90%, var(--nebula-color-2) 0%, transparent 50%), radial-gradient(ellipse at center, rgba(255, 255, 255, 0.05) 0%, transparent 80%); */ mix-blend-mode: screen; animation: move-nebula 60s linear infinite alternate; opacity: 0.7; /* 성운이 너무 강렬하지 않도록 투명도 조절 */ /* z-index: 1; 은하수보다 높은 z-index */ } @keyframes move-nebula { from { transform: scale(2.5) rotate(0deg); opacity: 0.8; } to { transform: scale(2.8) rotate(360deg); opacity: 1; } } /* 1. 은하수 (가장 뒤) */ #milky-way-canvas { position: absolute; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; display: none; /* z-index: 0; 가장 낮은 z-index */ } .shooting-star { position: absolute; width: 2px; height: 2px; border-radius: 50%; background-color: #fff; opacity: 0; /* animation 속성을 분리하고 animation-duration에 CSS 변수 사용 */ animation-name: shooting-star-fall; animation-timing-function: linear; animation-duration: var(--shooting-star-duration); } .shooting-star::before { content: ''; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 100%; height: 100%; border-radius: 50%; background-color: #fff; box-shadow: 0 0 10px 2px #fff, 0 0 20px 5px rgba(255, 255, 255, 0.5); animation: shooting-star-glow 1.5s ease-in-out infinite alternate; } .shooting-star::after { content: ''; position: absolute; top: 50%; left: 50%; width: 150px; height: 2px; background: linear-gradient(to left, transparent, #fff); transform-origin: 0% 50%; transform: translateY(-50%) rotate(295deg); filter: blur(1px); } @keyframes shooting-star-fall { 0% { transform: translate(0, 0); opacity: 1; } 95% { opacity: 1; } 100% { transform: translate(-40vw, 120vh); opacity: 0; } } @keyframes shooting-star-glow { 0% { transform: translate(-50%, -50%) scale(0.8); box-shadow: 0 0 8px 1px #fff, 0 0 16px 4px rgba(255, 255, 255, 0.4); } 100% { transform: translate(-50%, -50%) scale(1.2); box-shadow: 0 0 12px 3px #fff, 0 0 24px 6px rgba(255, 255, 255, 0.6); } } /* 중앙 정보 클러스터 */ #clock-container { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: var(--text-color); text-align: center; text-shadow: 0 0 8px var(--glow-color-1), 0 0 12px var(--glow-color-2); pointer-events: none; animation: fadeInClock 3s ease; transition: opacity 0.5s ease; } #info-cluster { display: flex; justify-content: center; align-items: center; gap: 20px; min-height: 24px; margin-bottom: 10px; opacity: 0.8; } #moon-phase-display { font-size: 1.5rem; } #quote-display { font-size: 0.9rem; font-style: italic; max-width: 400px; } #date-display { font-size: 1.2rem; letter-spacing: 2px; } #time-display { font-size: 3.5rem; font-weight: 300; letter-spacing: 4px; margin-top: 5px; } @keyframes fadeInClock { from { opacity: 0; } to { opacity: 1; } } #toggle-clock-btn { background-color: rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.2); color: var(--text-color); padding: 5px 15px; border-radius: 20px; cursor: pointer; margin-top: 20px; font-size: 0.8rem; letter-spacing: 1px; pointer-events: all; text-shadow: 0 0 5px var(--glow-color-1); } #toggle-clock-btn:hover { background-color: rgba(255, 255, 255, 0.2); box-shadow: 0 0 10px var(--glow-color-2); } #clock-container.hidden { opacity: 0; pointer-events: none; } /* UFO & 행성 & 효과 */ .ufo { position: absolute; width: 42px; height: 30px; top: 0; left: 0; animation-name: fly-ufo; animation-duration: 30s; animation-timing-function: linear; animation-iteration-count: 1; animation-fill-mode: forwards; opacity: 0; pointer-events: all; cursor: pointer; transition: transform 0.2s ease-out; /* display: none; JS로 제어 */ } .ufo.flash { filter: brightness(2) drop-shadow(0 0 5px white); } .ufo-cockpit { position: absolute; width: 20px; height: 10px; background-color: #87ceeb; border-radius: 10px 10px 0 0; top: 0; left: 11px; border-top: 2px solid #e0e0e0; border-left: 2px solid #e0e0e0; border-right: 2px solid #e0e0e0; box-shadow: inset 0 2px 5px rgba(255, 255, 255, 0.5); } .ufo-base { position: absolute; width: 40px; height: 20px; background-color: #c0c0c0; border-radius: 50%; top: 8px; left: 1px; box-shadow: inset 0 -4px 6px rgba(0, 0, 0, 0.3), 0 5px 10px rgba(0, 0, 0, 0.4); } .ufo-base::after { content: ''; position: absolute; width: 6px; height: 6px; background-color: #ffeb3b; border-radius: 50%; bottom: -3px; left: 17px; box-shadow: 0 0 8px #ffeb3b, 0 0 16px #ffeb3b; animation: blink-light 2s infinite; } @keyframes blink-light { 0%, 100% { opacity: 1; transform: scale(1); } 50% { opacity: 0.6; transform: scale(0.8); } } .spaceship-trail { position: absolute; width: 4px; height: 4px; background-color: rgba(187, 247, 208, 0.5); border-radius: 50%; box-shadow: 0 0 10px rgba(187, 247, 208, 0.4); pointer-events: none; animation: fadeOutTrail 1.5s ease-out forwards; } @keyframes fadeOutTrail { to { transform: scale(0.3); opacity: 0; } } /* .planet { position: absolute; width: 100px; height: 100px; border-radius: 50%; opacity: 0; box-shadow: -10px -10px 20px rgba(255, 255, 255, 0.1) inset, 0 0 40px rgba(255, 230, 200, 0.2); /* background-color: #8a5a44; */ /* background-image: radial-gradient(circle at 30% 30%, #d4a373, #8a5a44); */ /* } */ @keyframes drift-planet { from { transform: translate(-150%, 0); opacity: 1; } to { transform: translate(1200%, 0); opacity: 1; } } /* [추가] ISS 추적기 스타일 */ #iss-tracker { position: absolute; font-size: 1.5rem; text-shadow: 0 0 10px white, 0 0 20px cyan; /* opacity: 0; 이 줄을 추가하세요 */ cursor: pointer; /* transition: top 5s linear, left 5s linear; 부드러운 이동 */ display: none; /* JS로 제어 */ } #black-hole-effect { position: absolute; width: 80px; height: 80px; border-radius: 50%; background: radial-gradient(circle, transparent 20%, #111 50%, #222 100%); box-shadow: 0 0 10px 5px #6a0dad, 0 0 20px 10px #4b0082; transform: translate(-50%, -50%) scale(0); opacity: 0; } #black-hole-effect.active { animation: black-hole-anim 1.5s ease-out; } @keyframes black-hole-anim { 0% { transform: translate(-50%, -50%) scale(0); opacity: 1; } 50% { transform: translate(-50%, -50%) scale(1.2); } 100% { transform: translate(-50%, -50%) scale(0); opacity: 0; } } .black-hole-particle { position: absolute; width: 2px; height: 2px; background-color: rgba(255, 255, 255, 0.7); border-radius: 50%; pointer-events: none; } /* 기존 @keyframes pull-to-black-hole 삭제 후 아래 코드로 대체 */ @keyframes pull-to-center { from { transform: translate(0, 0) scale(1); opacity: 0.8; } to { transform: translate(var(--delta-x), var(--delta-y)) scale(0); opacity: 0; } } /* 설정 패널 */ #settings-toggle-btn { position: fixed; bottom: 20px; right: 20px; font-size: 1.5rem; cursor: pointer; z-index: 1001; opacity: 0.7; transition: opacity 0.3s, transform 0.3s; } #settings-toggle-btn:hover { opacity: 1; transform: rotate(45deg); } #settings-panel { position: fixed; bottom: 60px; right: 20px; background-color: rgba(30, 41, 59, 0.9); backdrop-filter: blur(5px); border: 1px solid rgba(255, 255, 255, 0.2); border-radius: 10px; padding: 15px; z-index: 1000; color: var(--text-color); width: 200px; box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); transform: translateY(20px) scale(0.95); opacity: 0; transition: transform 0.3s ease, opacity 0.3s ease; pointer-events: none; } #settings-panel.visible { transform: translateY(0) scale(1); opacity: 1; pointer-events: all; } .settings-header { font-weight: bold; margin-bottom: 10px; border-bottom: 1px solid rgba(255, 255, 255, 0.2); padding-bottom: 5px; } .setting-item { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; } .theme-buttons { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 5px; } .theme-btn { background-color: rgba(255, 255, 255, 0.1); border: 1px solid rgba(255, 255, 255, 0.2); color: var(--text-color); padding: 5px; border-radius: 5px; cursor: pointer; font-size: 0.8rem; } .theme-btn:hover { background-color: rgba(255, 255, 255, 0.2); } .switch { position: relative; display: inline-block; width: 34px; height: 20px; } .switch input { opacity: 0; width: 0; height: 0; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; transition: .4s; border-radius: 20px; } .slider:before { position: absolute; content: ""; height: 12px; width: 12px; left: 4px; bottom: 4px; background-color: white; transition: .4s; border-radius: 50%; } input:checked+.slider { background-color: #87ceeb; } input:checked+.slider:before { transform: translateX(14px); } /* 행성 기본 스타일 */ .planet { position: absolute; width: 100px; height: 100px; border-radius: 50%; opacity: 0; cursor: pointer; transform-style: preserve-3d; } /* 행성 표면 (가상요소로 분리하여 안정성 확보) */ .planet::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; border-radius: 50%; z-index: 2; /* 고리 사이에 위치 */ background-color: var(--planet-base-color); background-image: var(--planet-gradient); box-shadow: -10px -10px 20px rgba(255, 255, 255, 0.1) inset, 0 0 40px rgba(255, 230, 200, 0.2); } /* 행성 위에 표시될 동반자 요소 컨테이너 */ #planet-companion-container { position: absolute; top: 0; left: 0; width: 100%; height: 100%; z-index: 3; /* 행성 표면 위에 위치 */ } /* 개별 동반자 요소 스타일 (SVG를 담을 div) */ .planet-companion { position: absolute; width: 35px; /* 아이콘 크기 기준 */ height: 35px; /* 아이콘 크기 기준 */ transform: translate(-50%, -50%); /* 정확한 중앙 정렬을 위해 수정 */ filter: drop-shadow(0px 2px 2px rgba(0,0,0,0.5)); } /* 컨테이너 안의 SVG가 꽉 차도록 설정 */ .planet-companion svg { width: 100%; height: 100%; } /* 행성 및 ISS 정보창 스타일 */ .planet.is-scanning, #iss-tracker.is-showing-info { pointer-events: none; /* 정보창 표시 중 중복 클릭 방지 */ } .scan-line { position: absolute; left: 0; width: 100%; height: 3px; z-index: 5; background: radial-gradient(ellipse at center, rgba(135, 206, 250, 1) 0%, rgba(135, 206, 250, 0) 70%); box-shadow: 0 0 10px 2px skyblue; border-radius: 50%; opacity: 0; animation: scan-anim 1.5s ease-out; } @keyframes scan-anim { 0% { top: 0%; opacity: 1; } 90% { opacity: 1; } 100% { top: 100%; opacity: 0; } } .planet-info, .celestial-info { position: fixed; /* 화면 기준 위치 고정 */ background-color: rgba(30, 41, 59, 0.8); backdrop-filter: blur(5px); border: 1px solid rgba(135, 206, 250, 0.5); border-radius: 8px; padding: 10px 15px; color: #e0e0e0; font-size: 0.9rem; z-index: 100; text-shadow: 0 0 5px skyblue; animation: info-fade 4s ease-out; opacity: 0; /* 애니메이션이 끝나면 사라짐 */ } @keyframes info-fade { 0% { transform: translateY(20px); opacity: 0; } 20% { transform: translateY(0); opacity: 1; } 80% { transform: translateY(0); opacity: 1; } 100% { transform: translateY(-20px); opacity: 0; } } /* 워프 게이지 및 인용구 창 스타일 */ #warp-effect-container { position: fixed; z-index: 9999; pointer-events: none; /* 클릭 방지 */ opacity: 0; transition: opacity 0.3s ease; } #warp-quote-window { padding: 10px; background: rgba(0, 0, 0, 0.7); border: 1px solid #00d4ff; color: #00d4ff; border-radius: 5px; font-family: 'Courier New', Courier, monospace; text-shadow: 0 0 5px #00d4ff; margin-bottom: 10px; } #warp-gauge-container { width: 100%; height: 5px; border: 1px solid #00d4ff; border-radius: 3px; padding: 1px; } #warp-gauge-bar { width: 0%; height: 100%; background-color: #00d4ff; border-radius: 2px; transition: width 2s linear; /* 2초 동안 게이지가 참 */ } /* --- 개선된 워프 효과 스타일 --- */ .warp-line { position: fixed; /* 뷰포트 기준 위치 고정 */ background: white; height: 1px; /* 라인 두께 */ width: var(--line-length); /* JS에서 계산된 라인 길이 */ transform-origin: left center; /* 왼쪽 중앙을 기준으로 변형 */ opacity: 0; /* 기본적으로 보이지 않음 */ pointer-events: none; /* 애니메이션 속성은 JS에서 직접 설정됩니다. */ } @keyframes warp-stretch { 0% { /* 시작: 빈 공간 외부에서 작은 크기로 나타남 */ transform: rotate(var(--angle)) translateX(var(--start-dist)) scaleX(0.1); opacity: 0; } 30% { /* 빠르게 나타나도록 중간에 투명도 1 설정 */ opacity: 1; } 100% { /* 종료: 바깥쪽으로 뻗어 나가면서 사라짐 */ transform: rotate(var(--angle)) translateX(var(--end-dist)) scaleX(1); opacity: 0; } }