mirror of
https://github.com/headporter81/specialsource-homepage-frontend.git
synced 2026-08-08 15:21:11 +09:00
This commit is contained in:
+44
-20
@@ -6,10 +6,10 @@
|
|||||||
<span class="brand">SPECIALSOURCE.SYSTEM</span>
|
<span class="brand">SPECIALSOURCE.SYSTEM</span>
|
||||||
|
|
||||||
<select v-model="activeTheme" class="theme-selector">
|
<select v-model="activeTheme" class="theme-selector">
|
||||||
<option value="green">Green (기본)</option>
|
<option value="green">P3_GREEN (기본)</option>
|
||||||
<option value="amber">Amber (호박)</option>
|
<option value="amber">HERCULES (호박)</option>
|
||||||
<option value="vga">Paper White (회색)</option>
|
<option value="vga">VGA_GRAY (회색)</option>
|
||||||
<option value="ega">EGA (청록)</option>
|
<option value="ega">EGA_CYAN (청록)</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -157,8 +157,6 @@ const loginPw = ref('');
|
|||||||
|
|
||||||
const activeMenu = ref('main');
|
const activeMenu = ref('main');
|
||||||
const authToken = ref(localStorage.getItem('token'));
|
const authToken = ref(localStorage.getItem('token'));
|
||||||
|
|
||||||
// 🟢 [NEW] 활성화된 테마 상태 제어 변수 (green, amber, vga, ega)
|
|
||||||
const activeTheme = ref('green');
|
const activeTheme = ref('green');
|
||||||
|
|
||||||
const isProcessing = ref(false);
|
const isProcessing = ref(false);
|
||||||
@@ -182,7 +180,7 @@ const rawAscii = `
|
|||||||
╚════██║██╔═══╝ ██╔══╝ ██║ ██║██╔══██║██║
|
╚════██║██╔═══╝ ██╔══╝ ██║ ██║██╔══██║██║
|
||||||
███████║██║ ███████╗╚██████╗██║██║ ██║███████╗
|
███████║██║ ███████╗╚██████╗██║██║ ██║███████╗
|
||||||
╚══════╝╚═╝ ╚══════╝ ╚═════╝╚═╝╚═╝ ╚═╝╚══════╝
|
╚══════╝╚═╝ ╚══════╝ ╚═════╝╚═╝╚═╝ ╚═╝╚══════╝
|
||||||
███████╗██████╗ ██╗ ██╗██████╗ ██████╗███████╗
|
███████╗ ██████╗ ██╗ ██╗██████╗ ██████╗███████╗
|
||||||
██╔════╝██╔═══██╗██║ ██║██╔══██╗██╔════╝██╔════╝
|
██╔════╝██╔═══██╗██║ ██║██╔══██╗██╔════╝██╔════╝
|
||||||
███████╗██║ ██║██║ ██║██████╔╝██║ █████╗
|
███████╗██║ ██║██║ ██║██████╔╝██║ █████╗
|
||||||
╚════██║██║ ██║██║ ██║██╔══██╗██║ ██╔══╝
|
╚════██║██║ ██║██║ ██║██╔══██╗██║ ██╔══╝
|
||||||
@@ -258,6 +256,7 @@ const triggerOverlayProcess = (durationMs, initialMsg) => {
|
|||||||
}, stepTime);
|
}, stepTime);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 🟢 [보안 & 할당량 디버그 강화] 유튜브 로드 모듈
|
||||||
const apiKey = 'AIzaSyD51LHwqoY8spjq6rsY_RlhBXzb96j7D6o';
|
const apiKey = 'AIzaSyD51LHwqoY8spjq6rsY_RlhBXzb96j7D6o';
|
||||||
const channelId = 'UC8L92ju0V88s6TcmLPb8Bkg';
|
const channelId = 'UC8L92ju0V88s6TcmLPb8Bkg';
|
||||||
const maxResults = 8;
|
const maxResults = 8;
|
||||||
@@ -266,8 +265,42 @@ const apiUrl = `https://www.googleapis.com/youtube/v3/search?part=snippet&channe
|
|||||||
const fetchVideos = async () => {
|
const fetchVideos = async () => {
|
||||||
try {
|
try {
|
||||||
const res = await axios.get(apiUrl);
|
const res = await axios.get(apiUrl);
|
||||||
videos.value = res.data.items || [];
|
if (res.data && res.data.items && res.data.items.length > 0) {
|
||||||
} catch (err) { console.error("유튜브 로드 실패:", err); }
|
videos.value = res.data.items;
|
||||||
|
} else {
|
||||||
|
throw new Error("API returned empty items. Check quota.");
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error("유튜브 로드 실패 (할당량 초과 또는 키 폐기 가능성):", err);
|
||||||
|
|
||||||
|
// 1) 아래 CRT 모니터 터미널에 해커 감성으로 에러 경고 사출
|
||||||
|
setTimeout(() => {
|
||||||
|
if (termInstance.value) {
|
||||||
|
termInstance.value.echo(`[[b;red;][WARN]] YOUTUBE API QUOTA EXCEEDED OR KEY REVOKED.`);
|
||||||
|
termInstance.value.echo(`[[b;var(--tui-color);][SYS]] ENFORCING RETRO INTERFACE STANDBY DATA... SUCCESS.`);
|
||||||
|
}
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
// 2) [★무적 보정 클로킹] 구글 API가 막혔을 때 화면을 꽉 채워줄 고화질 인프라 더미 데이터 주입
|
||||||
|
videos.value = [
|
||||||
|
{
|
||||||
|
id: { videoId: 'dQw4w9WgXcQ' }, // Rick Astley (명예의 전당)
|
||||||
|
snippet: { title: '> [LIVE] SpecialSource Cloud Pipeline Infrastructure Main Cluster Monitoring' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: { videoId: 'kJQP7kiw5Fk' }, // Lofi
|
||||||
|
snippet: { title: '> [TUTORIAL] Automated Backend CI/CD Deploy Workflow on Ugreen NAS' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: { videoId: '9bZkp7q19f0' },
|
||||||
|
snippet: { title: '> [SECURITY] Injecting JASYPT_ENCRYPTOR_PASSWORD to Docker Runtime' }
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: { videoId: 'LXb3EKWsInQ' },
|
||||||
|
snippet: { title: '> [DATABASE] PostgreSQL Network Routing & Port 5435 Connection Log' }
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const openVideo = (id) => window.open(`https://www.youtube.com/watch?v=${id}`);
|
const openVideo = (id) => window.open(`https://www.youtube.com/watch?v=${id}`);
|
||||||
@@ -343,7 +376,7 @@ const handleLoginSubmit = async () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
fetchVideos();
|
fetchVideos(); // 초기에 무조건 작동
|
||||||
|
|
||||||
const globaljQuery = window.$;
|
const globaljQuery = window.$;
|
||||||
if (globaljQuery && terminalRef.value) {
|
if (globaljQuery && terminalRef.value) {
|
||||||
@@ -380,29 +413,24 @@ onMounted(() => {
|
|||||||
font-family: 'JetBrains Mono', monospace !important;
|
font-family: 'JetBrains Mono', monospace !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 🌟 [테마 마스터 서버 변수 선언] */
|
|
||||||
/* 🟢 테마 1: 오리지널 P3 녹색 인광 시스템 */
|
|
||||||
.theme-green {
|
.theme-green {
|
||||||
--tui-color: #00ff00;
|
--tui-color: #00ff00;
|
||||||
--tui-dim: #008800;
|
--tui-dim: #008800;
|
||||||
--tui-glow: rgba(0, 255, 0, 0.6);
|
--tui-glow: rgba(0, 255, 0, 0.6);
|
||||||
--tui-border: rgba(0, 255, 0, 0.2);
|
--tui-border: rgba(0, 255, 0, 0.2);
|
||||||
}
|
}
|
||||||
/* 🟠 테마 2: 추억의 허큘리스 플라즈마 호박색(Amber) 단색 시스템 */
|
|
||||||
.theme-amber {
|
.theme-amber {
|
||||||
--tui-color: #ffb000;
|
--tui-color: #ffb000;
|
||||||
--tui-dim: #aa6600;
|
--tui-dim: #aa6600;
|
||||||
--tui-glow: rgba(255, 176, 0, 0.6);
|
--tui-glow: rgba(255, 176, 0, 0.6);
|
||||||
--tui-border: rgba(255, 176, 0, 0.2);
|
--tui-border: rgba(255, 176, 0, 0.2);
|
||||||
}
|
}
|
||||||
/* ⚪ 테마 3: IBM 오리지널 VGA 단색 회색/흰색 시스템 */
|
|
||||||
.theme-vga {
|
.theme-vga {
|
||||||
--tui-color: #e2e8f0;
|
--tui-color: #e2e8f0;
|
||||||
--tui-dim: #718096;
|
--tui-dim: #718096;
|
||||||
--tui-glow: rgba(226, 232, 240, 0.4);
|
--tui-glow: rgba(226, 232, 240, 0.4);
|
||||||
--tui-border: rgba(226, 232, 240, 0.2);
|
--tui-border: rgba(226, 232, 240, 0.2);
|
||||||
}
|
}
|
||||||
/* 🔵 테마 4: 화려한 레트로 사이버 청록색(CGA/EGA Cyan) 시스템 */
|
|
||||||
.theme-ega {
|
.theme-ega {
|
||||||
--tui-color: #00ffff;
|
--tui-color: #00ffff;
|
||||||
--tui-dim: #008b8b;
|
--tui-dim: #008b8b;
|
||||||
@@ -412,7 +440,6 @@ onMounted(() => {
|
|||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
/* 하단 임베디드 터미널 내부 컬러까지 실시간 매핑 연동 */
|
|
||||||
:deep(.terminal), :deep(.terminal span) {
|
:deep(.terminal), :deep(.terminal span) {
|
||||||
--color: var(--tui-color) !important;
|
--color: var(--tui-color) !important;
|
||||||
text-shadow: 0 0 5px var(--tui-glow) !important;
|
text-shadow: 0 0 5px var(--tui-glow) !important;
|
||||||
@@ -420,13 +447,12 @@ onMounted(() => {
|
|||||||
|
|
||||||
.homepage-wrapper {
|
.homepage-wrapper {
|
||||||
background-color: #050505;
|
background-color: #050505;
|
||||||
color: var(--tui-color); /* 덮어쓰기 */
|
color: var(--tui-color);
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 🟢 [NEW] GNB 테마 셀렉터 스타일 */
|
|
||||||
.theme-selector {
|
.theme-selector {
|
||||||
background: #111;
|
background: #111;
|
||||||
border: 1px solid var(--tui-border);
|
border: 1px solid var(--tui-border);
|
||||||
@@ -684,8 +710,6 @@ iframe { width: 100%; height: 180px; border-radius: 4px; }
|
|||||||
30% { transform: translate(0); color: var(--tui-color) !important; text-shadow: 0 0 15px var(--tui-color) !important;}
|
30% { transform: translate(0); color: var(--tui-color) !important; text-shadow: 0 0 15px var(--tui-color) !important;}
|
||||||
31%, 50% { transform: translate(0); color: var(--tui-color) !important; text-shadow: 0 0 8px var(--tui-glow) !important;}
|
31%, 50% { transform: translate(0); color: var(--tui-color) !important; text-shadow: 0 0 8px var(--tui-glow) !important;}
|
||||||
51% { transform: scale(1.05) skewY(1deg); color: #ffffff !important; opacity: 0.05; }
|
51% { transform: scale(1.05) skewY(1deg); color: #ffffff !important; opacity: 0.05; }
|
||||||
|
|
||||||
/* 🌟 [복구 시점 고정] 부활 연출 이후 최종 색상도 선택한 테마 변수(--tui-color)에 무조건 완벽 연동되도록 매핑 */
|
|
||||||
53% { opacity: 1; transform: translate(0); color: var(--tui-color) !important; text-shadow: 0 0 20px var(--tui-color), 0 0 40px var(--tui-glow) !important; }
|
53% { opacity: 1; transform: translate(0); color: var(--tui-color) !important; text-shadow: 0 0 20px var(--tui-color), 0 0 40px var(--tui-glow) !important; }
|
||||||
90% { transform: translate(-2px, 1px); text-shadow: 2px 0 red, -2px 0 blue;}
|
90% { transform: translate(-2px, 1px); text-shadow: 2px 0 red, -2px 0 blue;}
|
||||||
92% { transform: translate(2px, -1px); text-shadow: -2px 0 red, 2px 0 blue;}
|
92% { transform: translate(2px, -1px); text-shadow: -2px 0 red, 2px 0 blue;}
|
||||||
|
|||||||
Reference in New Issue
Block a user