CSS
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
:root{
--terminal:#020d02;
--green:#00e060;
--green-dim:#006030;
--green-faint:rgba(0,224,96,0.08);
--green-mid:rgba(0,224,96,0.4);
--white:#d0f0d0;
--dim:rgba(208,240,208,0.4);
--red:#ff3050;
}
html,body{height:100%;overflow:hidden;background:var(--terminal);font-family:'JetBrains Mono',monospace;color:var(--white);}
/* CRT scanline effect */
body::after{
content:'';position:fixed;inset:0;z-index:9999;pointer-events:none;
background:repeating-linear-gradient(0deg,transparent,transparent 1px,rgba(0,0,0,0.08) 1px,rgba(0,0,0,0.08) 2px);
}
/* Phosphor glow vignette */
body::before{
content:'';position:fixed;inset:0;z-index:9998;pointer-events:none;
background:radial-gradient(ellipse at center,transparent 60%,rgba(0,0,0,0.4) 100%);
}
/* Pages */
.pages{position:fixed;inset:0;}
.page{position:absolute;inset:0;pointer-events:none;visibility:hidden;}
.page.active{visibility:visible;pointer-events:auto;}
/* Matrix canvas */
#matCanvas{
position:fixed;inset:0;z-index:700;pointer-events:none;
}
/* PAGE 0 — TERMINAL */
#p0{background:var(--terminal);}
.term-frame{
height:100%;
display:flex;flex-direction:column;
padding:32px 48px;
position:relative;
}
.term-topbar{
display:flex;align-items:center;gap:12px;
margin-bottom:32px;
border-bottom:1px solid var(--green-faint);
padding-bottom:20px;
}
.term-dots{display:flex;gap:6px;}
.term-dot{width:10px;height:10px;border-radius:50%;}
.td-red{background:#ff3b3b;}
.td-yellow{background:#ffbb00;}
.td-green{background:#00e060;}
.term-title{
font-size:9px;letter-spacing:0.2em;
color:var(--green-dim);flex:1;text-align:center;
text-transform:uppercase;
}
.term-body{
flex:1;
display:flex;flex-direction:column;
justify-content:center;
max-width:700px;
margin:0 auto;
width:100%;
}
.term-prompt{
font-size:9px;color:var(--green-dim);
margin-bottom:8px;letter-spacing:0.08em;
}
.term-prompt span{color:var(--green);}
.term-hero{
margin-bottom:48px;
}
.term-big{
font-family:'Syne',sans-serif;
font-size:clamp(44px,8vw,96px);
font-weight:800;line-height:0.9;
letter-spacing:-0.04em;
color:var(--green);
text-shadow:0 0 40px rgba(0,224,96,0.3);
margin-bottom:4px;
}
.term-big-dim{
font-family:'Syne',sans-serif;
font-size:clamp(20px,3.5vw,44px);
font-weight:400;line-height:1;
letter-spacing:-0.02em;
color:var(--green-dim);
}
.term-output{
display:flex;flex-direction:column;gap:6px;
margin-bottom:40px;
}
.term-line{
font-size:12px;letter-spacing:0.04em;line-height:1.6;
}
.term-line.c{color:var(--dim);}
.term-line.g{color:var(--green);}
.term-line.r{color:var(--red);}
.term-line.y{color:#ffee00;}
.blink{
display:inline-block;width:8px;height:14px;
background:var(--green);vertical-align:middle;
animation:blink .8s step-end infinite;
}
@keyframes blink{0%,100%{opacity:1;}50%{opacity:0;}}
.term-commands{
display:flex;gap:12px;flex-wrap:wrap;
}
.cmd-btn{
padding:10px 24px;
border:1px solid var(--green-dim);
background:none;color:var(--green-mid);
font-family:'JetBrains Mono',monospace;
font-size:11px;letter-spacing:0.08em;
cursor:pointer;
transition:all .15s;
}
.cmd-btn:hover{
border-color:var(--green);color:var(--green);
background:var(--green-faint);
box-shadow:0 0 12px rgba(0,224,96,0.15);
}
.cmd-btn.primary{
background:var(--green);color:var(--terminal);
font-weight:700;border-color:var(--green);
}
.cmd-btn.primary:hover{
background:#00ff70;
box-shadow:0 0 20px rgba(0,224,96,0.4);
}
/* System info sidebar */
.term-side{
position:absolute;right:48px;top:50%;transform:translateY(-50%);
width:220px;
border:1px solid var(--green-faint);
padding:20px;
background:rgba(0,224,96,0.02);
}
.side-label{
font-size:8px;letter-spacing:0.25em;text-transform:uppercase;
color:var(--green-dim);margin-bottom:16px;
border-bottom:1px solid var(--green-faint);
padding-bottom:10px;
}
.side-row{
display:flex;justify-content:space-between;
font-size:10px;padding:6px 0;
border-bottom:1px solid rgba(0,224,96,0.04);
}
.side-k{color:var(--green-dim);}
.side-v{color:var(--green);}
.side-v.ok{color:#00e060;}
.side-v.warn{color:#ffee00;}
.side-v.crit{color:var(--red);animation:blink .5s step-end infinite;}
/* PAGE 1 — OPERATIONS */
#p1{
background:#010a01;
padding:48px;
overflow-y:auto;
}
.p1-header{
display:flex;align-items:baseline;gap:24px;
margin-bottom:40px;
border-bottom:1px solid var(--green-faint);
padding-bottom:20px;
}
.p1-title{
font-family:'Syne',sans-serif;
font-size:clamp(32px,5vw,64px);
font-weight:800;letter-spacing:-0.04em;
color:var(--green);line-height:1;
}
.p1-uptime{
font-size:9px;letter-spacing:0.2em;
color:var(--green-dim);
}
.ops-grid{
display:grid;grid-template-columns:repeat(2,1fr);
gap:2px;
margin-bottom:32px;
}
.op-card{
border:1px solid var(--green-faint);
padding:24px;
background:rgba(0,224,96,0.015);
transition:border-color .2s,background .2s;
cursor:pointer;
}
.op-card:hover{
border-color:var(--green-dim);
background:rgba(0,224,96,0.03);
}
.op-status{
display:flex;align-items:center;gap:8px;
margin-bottom:16px;
}
.op-dot{
width:6px;height:6px;border-radius:50%;
}
.dot-ok{background:var(--green);box-shadow:0 0 6px var(--green);}
.dot-warn{background:#ffee00;box-shadow:0 0 6px #ffee00;}
.dot-crit{background:var(--red);box-shadow:0 0 6px var(--red);animation:blink .5s step-end infinite;}
.op-status-text{
font-size:8px;letter-spacing:0.2em;text-transform:uppercase;color:var(--green-dim);
}
.op-name{
font-family:'Syne',sans-serif;
font-size:20px;font-weight:700;color:var(--white);
letter-spacing:-0.02em;margin-bottom:8px;
}
.op-desc{
font-size:10px;line-height:1.7;color:var(--dim);
letter-spacing:0.02em;margin-bottom:16px;
}
.op-meta{
font-size:9px;color:var(--green-dim);letter-spacing:0.08em;
font-style:italic;
}
.log-feed{
border:1px solid var(--green-faint);
padding:16px 20px;
background:rgba(0,224,96,0.01);
max-height:200px;overflow-y:auto;
}
.log-title{font-size:8px;letter-spacing:0.2em;text-transform:uppercase;color:var(--green-dim);margin-bottom:12px;}
.log-entry{font-size:9px;line-height:1.8;letter-spacing:0.04em;}
.log-time{color:var(--green-dim);}
.log-msg{color:var(--dim);}
.log-ok{color:var(--green);}
.log-err{color:var(--red);}
/* PAGE 2 — THREAT INTEL */
#p2{
background:#010802;
padding:48px;
overflow-y:auto;
}
.p2-header{
display:flex;justify-content:space-between;align-items:flex-end;
margin-bottom:40px;
padding-bottom:20px;
border-bottom:1px solid var(--green-faint);
}
.p2-title{
font-family:'Syne',sans-serif;
font-size:clamp(32px,5vw,64px);
font-weight:800;letter-spacing:-0.04em;
color:var(--red);line-height:1;
}
.threat-level{
display:flex;align-items:center;gap:8px;
padding:8px 20px;
border:1px solid rgba(255,48,80,0.4);
background:rgba(255,48,80,0.05);
font-size:9px;letter-spacing:0.2em;text-transform:uppercase;
color:var(--red);
}
.threat-table{
display:flex;flex-direction:column;gap:2px;
margin-bottom:28px;
}
.threat-row{
display:grid;
grid-template-columns:140px 1fr 100px 80px 80px;
border:1px solid var(--green-faint);
font-size:10px;letter-spacing:0.04em;
}
.threat-row.head{
border-color:rgba(0,224,96,0.12);
font-size:8px;letter-spacing:0.2em;text-transform:uppercase;
}
.th-cell{
padding:14px 16px;
border-right:1px solid var(--green-faint);
display:flex;align-items:center;
}
.th-cell:last-child{border-right:none;}
.sev{
padding:3px 10px;font-size:8px;letter-spacing:0.12em;text-transform:uppercase;
font-weight:700;
}
.sev-crit{background:rgba(255,48,80,0.15);color:var(--red);}
.sev-high{background:rgba(255,160,0,0.12);color:#ffa000;}
.sev-med{background:rgba(255,238,0,0.08);color:#ffee00;}
.stat-badge{
padding:2px 10px;font-size:8px;letter-spacing:0.1em;
}
.badge-new{border:1px solid var(--red);color:var(--red);}
.badge-active{border:1px solid #ffa000;color:#ffa000;}
.badge-patch{border:1px solid var(--green-dim);color:var(--green-dim);}
/* PAGE 3 — TEAM */
#p3{
background:var(--terminal);
padding:48px;
display:flex;flex-direction:column;
}
.p3-header{
display:flex;align-items:baseline;gap:20px;
margin-bottom:48px;border-bottom:1px solid var(--green-faint);
padding-bottom:20px;
}
.p3-title{
font-family:'Syne',sans-serif;
font-size:clamp(36px,6vw,72px);
font-weight:800;letter-spacing:-0.04em;
color:var(--green);line-height:1;
}
.team-grid{
display:grid;grid-template-columns:repeat(4,1fr);gap:2px;
flex:1;align-content:start;
}
.team-card{
border:1px solid var(--green-faint);
padding:24px;
position:relative;
overflow:hidden;
transition:border-color .2s,background .2s;
}
.team-card:hover{
border-color:var(--green-dim);
background:rgba(0,224,96,0.02);
}
.tc-handle{
font-size:10px;letter-spacing:0.12em;
color:var(--green);margin-bottom:12px;
display:flex;align-items:center;gap:6px;
}
.tc-handle::before{content:'@';color:var(--green-dim);}
.tc-role{
font-size:9px;letter-spacing:0.15em;text-transform:uppercase;
color:var(--green-dim);margin-bottom:8px;
}
.tc-name{
font-family:'Syne',sans-serif;
font-size:15px;font-weight:700;
color:var(--white);margin-bottom:16px;
}
.tc-skills{
display:flex;flex-wrap:wrap;gap:6px;
}
.skill-tag{
font-size:8px;letter-spacing:0.1em;
border:1px solid var(--green-faint);
color:var(--green-dim);padding:2px 8px;
}
/* Nav */
.term-nav{
position:fixed;bottom:0;left:0;right:0;z-index:800;
background:rgba(1,10,1,0.95);
border-top:1px solid var(--green-faint);
display:flex;align-items:center;
padding:12px 48px;
gap:0;
backdrop-filter:blur(20px);
}
.tnav-item{
flex:1;padding:8px 16px;
font-size:9px;letter-spacing:0.15em;text-transform:uppercase;
color:var(--green-dim);background:none;border:none;
cursor:pointer;font-family:'JetBrains Mono',monospace;
position:relative;
transition:color .2s;
text-align:left;
}
.tnav-item::before{
content:attr(data-cmd);
position:absolute;left:0;top:0;bottom:0;
display:flex;align-items:center;padding-left:16px;
color:rgba(0,224,96,0.2);
font-size:8px;
pointer-events:none;
transition:opacity .2s;
}
.tnav-item:hover{color:var(--green);}
.tnav-item.active{color:var(--green);}
.tnav-item.active::after{
content:'';position:absolute;top:0;left:0;right:0;height:1px;
background:var(--green);
box-shadow:0 0 8px var(--green);
}
.term-clock{
font-size:9px;letter-spacing:0.15em;color:var(--green-dim);
margin-left:auto;
} JS
const matCanvas=document.getElementById('matCanvas');
const matCtx=matCanvas.getContext('2d');
const pages=document.querySelectorAll('.page');
const navItems=document.querySelectorAll('.tnav-item');
let cur=0,busy=false;
function resize(){matCanvas.width=window.innerWidth;matCanvas.height=window.innerHeight;}
resize();window.addEventListener('resize',resize);
// Matrix characters — katakana + ASCII
const CHARS='アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヲンABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*<>/\\|{}[]';
function matrixTransition(color,midCallback,done){
const W=matCanvas.width,H=matCanvas.height;
const fontSize=14;
const cols=Math.ceil(W/fontSize);
const rows=Math.ceil(H/fontSize);
const dropPos=Array.from({length:cols},()=>-Math.floor(Math.random()*rows*0.8));
const speed=Array.from({length:cols},()=>Math.random()*1.5+0.8);
let midDone=false;
let phase=0;
function frame(){
matCtx.clearRect(0,0,W,H);
matCtx.fillStyle='rgba(2,13,2,0.15)';
matCtx.fillRect(0,0,W,H);
let allCovered=true;
for(let c=0;c<cols;c++){
const x=c*fontSize;
const drop=dropPos[c];
if(phase===0){
for(let r=0;r<Math.min(drop,rows);r++){
const char=CHARS[Math.floor(Math.random()*CHARS.length)];
const alpha=r/Math.max(drop,1);
if(r===Math.floor(drop)-1){
matCtx.fillStyle='#80ffb0';
matCtx.shadowColor='#00ff70';
matCtx.shadowBlur=8;
}else{
const g=Math.floor(alpha*180+20);
matCtx.fillStyle=`rgba(0,${g},${Math.floor(g*0.3)},${0.3+alpha*0.7})`;
matCtx.shadowBlur=0;
}
matCtx.font=`${fontSize}px 'JetBrains Mono'`;
matCtx.fillText(char,x,r*fontSize);
}
if(drop<rows) allCovered=false;
dropPos[c]+=speed[c];
if(!midDone&&allCovered){
midDone=true;
midCallback&&midCallback();
phase=1;
dropPos.fill(0);
}
} else {
const clearPos=dropPos[c];
for(let r=Math.floor(clearPos);r<rows;r++){
const char=CHARS[Math.floor(Math.random()*CHARS.length)];
const alpha=(r-clearPos)/rows;
matCtx.fillStyle=`rgba(0,${Math.floor(150+alpha*80)},${Math.floor(60+alpha*20)},${0.6-alpha*0.6})`;
matCtx.shadowBlur=0;
matCtx.font=`${fontSize}px 'JetBrains Mono'`;
matCtx.fillText(char,x,r*fontSize);
}
dropPos[c]+=speed[c]*1.5;
}
}
matCtx.shadowBlur=0;
if(phase===1&&dropPos.every(d=>d>=rows)){
matCtx.clearRect(0,0,W,H);
done&&done();
} else {
requestAnimationFrame(frame);
}
}
requestAnimationFrame(frame);
}
function goTo(n){
if(busy||n===cur)return;
busy=true;
const prev=cur;cur=n;
navItems.forEach((it,i)=>it.classList.toggle('active',i===cur));
matrixTransition('#020d02',
()=>{
pages[prev].classList.remove('active');
pages[cur].classList.add('active');
},
()=>{busy=false;}
);
}
navItems.forEach(it=>it.addEventListener('click',()=>goTo(+it.dataset.i)));
document.querySelectorAll('[data-next]').forEach(b=>b.addEventListener('click',()=>goTo(+b.dataset.next)));
let wt=0;
window.addEventListener('wheel',e=>{
const now=Date.now();if(now-wt<1500)return;wt=now;
goTo(Math.max(0,Math.min(3,cur+(e.deltaY>0?1:-1))));
},{passive:true});
document.addEventListener('keydown',e=>{
if(e.key==='ArrowRight')goTo(Math.min(3,cur+1));
if(e.key==='ArrowLeft')goTo(Math.max(0,cur-1));
});
// Clock
(function tick(){
const now=new Date();
const t=now.toUTCString().split(' ').slice(-2)[0];
document.getElementById('termClock').textContent=t+' UTC';
setTimeout(tick,1000);
})();