/* ============================================================
   조작 연구소 · 공용 게임 셸 스타일
   각 게임은 :root 변수만 덮어써서 테마를 바꿉니다.
   ============================================================ */
:root{
  --deep:#06182f;          /* 화면 바깥 배경 */
  --p1:#1d4f8f;            /* 패널 그라디언트 위 */
  --p2:#123c73;            /* 패널 그라디언트 아래 */
  --shadow:3,26,54;        /* 패널 그림자 rgb */
  --ink:#1a3f77;           /* 제목 글자색(흰 테두리 안쪽) */
  --accent:#ffd54a;        /* 강조색 */
  --guide:#5ffbd0;         /* 진행 안내 화살표 */
  --knob1:#7cc6ff;
  --knob2:#1e7fe0;
  --knob3:#1565c0;
  --dial1:#2a5391;
  --dial2:#0f2c58;
}
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
html,body{height:100%;background:var(--deep);overflow:hidden;
  font-family:'Noto Sans KR',system-ui,sans-serif;color:#fff;user-select:none;
  touch-action:none;overscroll-behavior:none;-webkit-user-select:none}

#fit{position:fixed;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:clamp(4px,1.2vh,16px);
  padding:max(4px,env(safe-area-inset-top)) max(6px,env(safe-area-inset-right)) max(4px,env(safe-area-inset-bottom)) max(6px,env(safe-area-inset-left));
  min-height:100%;min-height:100dvh;box-sizing:border-box}
#view{position:relative;flex:none;display:flex;align-items:center;justify-content:center;max-width:100%}
#stage{position:relative;flex:none;transform-origin:center;border-radius:18px;overflow:hidden;
  box-shadow:0 24px 60px rgba(0,0,0,.55)}
#cv{position:absolute;inset:0;width:100%;height:100%;display:block}

.hud{position:absolute;inset:0;pointer-events:none;font-weight:700}
.hud > *{pointer-events:auto}
.panel{background:linear-gradient(180deg,var(--p1),var(--p2));border:3px solid #fff;
  box-shadow:0 6px 0 rgba(var(--shadow),.45),0 10px 24px rgba(0,0,0,.35)}

#brand{position:absolute;left:22px;top:16px;display:flex;flex-direction:column;gap:8px;align-items:flex-start}
#brand .t{display:flex;align-items:center;gap:10px}
#brand h1{font-family:'Jua',sans-serif;font-size:33px;font-weight:400;color:var(--ink);
  -webkit-text-stroke:8px #fff;paint-order:stroke fill;letter-spacing:-1px}
#brand .sub{font-size:14px;background:linear-gradient(180deg,var(--p1),var(--p2));border:2px solid #fff;
  border-radius:999px;padding:5px 13px;box-shadow:0 4px 0 rgba(var(--shadow),.4)}
#brand .mark{width:38px;height:38px;flex:none}

#topbar{position:absolute;left:50%;top:18px;transform:translateX(-50%);display:flex;align-items:center;gap:12px;
  border-radius:999px;padding:8px 18px 8px 13px;white-space:nowrap}
#topbar .clock{width:27px;height:27px}
#time{font-family:'Jua',sans-serif;font-weight:400;font-size:27px;min-width:92px;text-align:center;letter-spacing:1px}
#topbar .div{width:2px;height:26px;background:rgba(255,255,255,.35);border-radius:2px}
#topbar .goal{font-size:17px}
#score{font-family:'Jua',sans-serif;font-weight:400;font-size:24px;color:var(--accent)}
#topbar .pin{width:24px;height:24px}

#sysbtns{position:absolute;right:22px;top:16px;display:flex;gap:12px}
.rbtn{width:58px;height:58px;border-radius:50%;border:3px solid #fff;
  background:linear-gradient(180deg,var(--p1),var(--p2));
  box-shadow:0 6px 0 rgba(var(--shadow),.5);display:grid;place-items:center;cursor:pointer}
.rbtn:active{transform:translateY(3px);box-shadow:0 3px 0 rgba(var(--shadow),.5)}
.rbtn svg{width:26px;height:26px}

#side{position:absolute;right:22px;top:98px;width:238px;display:flex;flex-direction:column;gap:16px}
#missions{width:100%;border-radius:16px;overflow:hidden;background:#fff8e6;border:3px solid #fff;
  box-shadow:0 8px 0 rgba(var(--shadow),.3),0 12px 26px rgba(0,0,0,.3)}
#missions .hd{background:linear-gradient(180deg,#ffd05a,#f5a623);color:#5a3a00;font-size:17px;padding:6px 14px}
#missions ul{list-style:none;padding:8px 12px 12px}
#missions li{display:flex;align-items:center;gap:9px;color:#20385c;font-size:15px;padding:5px 0}
#missions li.done{color:#0e7a3c}
.star{width:20px;height:20px;flex:none}

#mapwrap{width:100%;border-radius:16px;overflow:hidden;border:3px solid #fff;
  box-shadow:0 8px 0 rgba(var(--shadow),.3),0 12px 26px rgba(0,0,0,.3);background:var(--p2)}
#minimap{width:100%;height:auto;display:block}

/* ---- 조작부: 심해 탐사대식 조이스틱 + 액션 버튼 (터치 우선) ---- */
#pad{--dp:clamp(112px,28vmin,188px);--tb:clamp(58px,14.5vmin,100px);--stick:clamp(42px,10.5vmin,72px);
  flex:none;width:100%;max-width:100%;display:flex;align-items:center;justify-content:space-between;
  gap:clamp(8px,2.5vw,22px);padding:0 clamp(10px,3.5vw,28px);touch-action:none;z-index:8}
#dpad{position:relative;flex:none;width:var(--dp);height:var(--dp);border-radius:50%;
  background:radial-gradient(circle at 50% 32%,var(--dial1),var(--dial2) 72%);border:5px solid #eef4ff;
  box-shadow:0 10px 0 rgba(var(--shadow),.45),0 16px 30px rgba(0,0,0,.35);
  touch-action:none;cursor:pointer;-webkit-user-select:none;user-select:none}
#dpad .joyHint{position:absolute;width:18%;height:18%;display:grid;place-items:center;pointer-events:none;opacity:.55;transition:opacity .12s,filter .12s}
#dpad .joyHint svg{width:100%;height:100%;filter:drop-shadow(0 2px 2px rgba(0,0,0,.35))}
#dpad .joyHint.on{opacity:1;filter:drop-shadow(0 0 6px var(--knob1))}
#dpad .joyHint.on svg polygon,#dpad .joyHint.on svg polyline{fill:var(--knob1);stroke:var(--knob1)}
#dpad .joyHint.off{opacity:.18}
#a-up{left:41%;top:5%}#a-dn{left:41%;bottom:5%}#a-lf{left:5%;top:41%}#a-rt{right:5%;top:41%}
#joyStick{position:absolute;left:50%;top:50%;width:var(--stick);height:var(--stick);border-radius:50%;
  transform:translate(-50%,-50%);pointer-events:none;z-index:2;
  background:radial-gradient(circle at 40% 30%,var(--knob1),var(--knob2) 65%,var(--knob3));border:4px solid #eef4ff;
  box-shadow:0 6px 14px rgba(0,0,0,.35),inset 0 -5px 10px rgba(0,0,0,.22)}
#dpad.active{box-shadow:0 10px 0 rgba(var(--shadow),.45),0 0 0 4px rgba(124,198,255,.28),0 16px 30px rgba(0,0,0,.35)}

#throttle{flex:none;display:flex;gap:clamp(8px,2.5vw,18px);touch-action:none}
.tb{display:flex;flex-direction:column;align-items:center;gap:3px}
.tb button{width:var(--tb);height:var(--tb);border-radius:50%;border:5px solid #eef4ff;cursor:pointer;
  display:grid;place-items:center;touch-action:none;-webkit-user-select:none;user-select:none}
.tb button svg{width:50%;height:50%;pointer-events:none}
.tb.rev button{background:radial-gradient(circle at 40% 26%,#ff8a80,#e53935 60%,#b71c1c);
  box-shadow:0 10px 0 #7f1010,0 16px 28px rgba(0,0,0,.35)}
.tb.fwd button{background:radial-gradient(circle at 40% 26%,#a5f39a,#43a047 60%,#1b5e20);
  box-shadow:0 10px 0 #14521a,0 16px 28px rgba(0,0,0,.35)}
.tb.act button{background:radial-gradient(circle at 40% 26%,#ffe37a,#f5a623 60%,#a86c00);
  box-shadow:0 10px 0 #7a4f00,0 16px 28px rgba(0,0,0,.35)}
.tb button:active,.tb button.on{transform:translateY(5px)}
.tb .lb{font-family:'Jua',sans-serif;font-weight:400;font-size:clamp(13px,3.6vmin,22px);color:#123;
  -webkit-text-stroke:6px #fff;paint-order:stroke fill;line-height:1.1;max-width:5.5em;text-align:center}

/* 가로: 조작부가 화면 아래에 떠 있음 */
body.land #pad{position:absolute;z-index:8;pointer-events:none;padding-bottom:max(clamp(6px,1.8vh,22px),env(safe-area-inset-bottom));align-items:flex-end}
body.land #pad > *{pointer-events:auto}
/* 세로: 조작부를 게임 화면 하단에 겹쳐 장면을 줄이지 않습니다. */
body.port #pad{position:fixed;left:0;right:0;bottom:0;z-index:20;pointer-events:none;padding:clamp(6px,1.3vh,12px) clamp(10px,3.5vw,28px) max(clamp(6px,1.3vh,12px),env(safe-area-inset-bottom));
  --dp:clamp(96px,24vmin,136px);--tb:clamp(48px,12vmin,74px);--stick:clamp(34px,8.8vmin,52px);
  border-radius:20px;
  background:linear-gradient(180deg,rgba(var(--shadow),.35),rgba(var(--shadow),.62));
  border:2px solid rgba(255,255,255,.18);width:calc(100% - 12px);max-width:560px;box-sizing:border-box}
body.port #pad > *{pointer-events:auto}
body.port #brand{left:calc(50% - 320px)}
body.port #sysbtns{right:calc(50% - 320px)}
body.port #side{position:absolute;left:calc(50% - 320px);right:calc(50% - 320px);top:86px;width:auto;max-width:none;z-index:4;
  display:flex;flex-direction:row;align-items:flex-start;gap:10px;pointer-events:auto}
body.port #side > *{flex:1;min-width:0}
body.port #missions{max-width:none;border-radius:12px;box-shadow:0 5px 0 rgba(var(--shadow),.26),0 8px 18px rgba(0,0,0,.24)}
body.port #missions .hd{font-size:13px;padding:4px 9px}
body.port #missions ul{padding:5px 9px 7px}
body.port #missions li{font-size:11px;padding:2px 0;gap:6px}
body.port #missions .star{width:16px;height:16px}
body.port #mapwrap{display:block;max-width:310px;border-radius:12px;box-shadow:0 5px 0 rgba(var(--shadow),.26),0 8px 18px rgba(0,0,0,.24)}
body.port{--dp:clamp(96px,24vmin,136px);--tb:clamp(48px,12vmin,74px);--stick:clamp(34px,8.8vmin,52px)}

/* 짧은 화면에서도 미니맵은 유지하고 조작 버튼만 조금 줄입니다. */
@media (max-height:740px){
  body.port{--dp:clamp(90px,22vmin,122px);--tb:clamp(44px,11.2vmin,68px);--stick:clamp(30px,8vmin,46px)}
  body.port #pad{--dp:clamp(90px,22vmin,122px);--tb:clamp(44px,11.2vmin,68px);--stick:clamp(30px,8vmin,46px)}
}
@media (max-width:420px){
  #brand h1{font-size:22px;-webkit-text-stroke:5px #fff}
  #brand .sub{font-size:11px;padding:4px 9px}
  #topbar{padding:6px 12px 6px 10px;gap:8px;transform:translateX(-50%) scale(.92);transform-origin:top center}
  #time{font-size:20px;min-width:70px}
  #topbar .goal,#score{font-size:13px}
  .rbtn{width:44px;height:44px}
  .rbtn svg{width:20px;height:20px}
  #sysbtns{right:10px;top:10px;gap:8px}
  #brand{left:10px;top:10px}
  .card{padding:18px 16px;width:min(600px,92%)}
  .card h2{font-size:28px}
  .card p{font-size:14px}
  .go{font-size:22px;padding:10px 28px}
  a.back{font-size:12px;bottom:max(4px,env(safe-area-inset-bottom))}
}

/* backdrop-filter는 stage의 transform:scale과 겹치면 화면이 겹쳐 보이는 문제가 있어 사용하지 않음 */
.ov{position:absolute;inset:0;display:grid;place-items:center;background:rgba(4,20,40,.82);z-index:5}
.ov.hide{display:none}
.card{width:min(600px,88%);border-radius:22px;padding:26px 28px;text-align:center;
  background:linear-gradient(180deg,var(--p1),var(--p2));border:4px solid #fff;
  box-shadow:0 14px 0 rgba(var(--shadow),.45)}
.card h2{font-family:'Jua',sans-serif;font-weight:400;font-size:38px;margin-bottom:6px}
.card p{font-size:16px;line-height:1.6;color:#e2eeff;margin-bottom:16px}
.keys{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin-bottom:20px}
.keys span{font-size:14px;background:rgba(255,255,255,.14);border:2px solid rgba(255,255,255,.4);
  border-radius:999px;padding:6px 12px}
.go{font-family:'Jua',sans-serif;font-weight:400;font-size:26px;color:#4a2d00;padding:12px 40px;border-radius:999px;
  cursor:pointer;border:5px solid #fff;background:radial-gradient(circle at 40% 25%,#ffe37a,#f5a623 70%);
  box-shadow:0 8px 0 #a86c00}
.go:active{transform:translateY(4px);box-shadow:0 4px 0 #a86c00}
.end-actions{display:flex;justify-content:center;gap:12px;flex-wrap:wrap}
.end-actions .go{display:inline-flex;align-items:center;justify-content:center;text-decoration:none}
.end-actions .home{background:radial-gradient(circle at 40% 25%,#b9e7ff,#3c8fd5 70%);box-shadow:0 8px 0 #1b5c91;color:#082f52}
.end-actions .home:active{box-shadow:0 4px 0 #1b5c91}
.res{display:flex;justify-content:center;gap:26px;margin:4px 0 16px}
.res div{font-size:15px;color:#cfe2ff}
.res b{display:block;font-family:'Jua',sans-serif;font-weight:400;font-size:30px;color:var(--accent)}
#endStars{font-size:0;margin-bottom:8px}
#endStars svg{width:46px;height:46px;margin:0 3px}
#setPanel .row{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:9px 4px;font-size:16px}
.sw{border:3px solid #fff;background:rgba(255,255,255,.15);color:#fff;border-radius:999px;padding:7px 18px;
  font-size:15px;font-weight:700;cursor:pointer;font-family:'Noto Sans KR',sans-serif}
a.back{position:absolute;left:50%;bottom:6px;transform:translateX(-50%);z-index:6;font-size:13px;color:#dfeaff;
  text-decoration:none;background:rgba(6,24,47,.7);border:2px solid rgba(255,255,255,.35);
  border-radius:999px;padding:5px 14px}
/* 알림 글: 밝은 배경 위에서도 잘 보이도록 진한 알약 배경을 깔아 줍니다 */
#flash{position:absolute;left:50%;top:124px;transform:translateX(-50%);z-index:4;pointer-events:none;
  max-width:min(78%,620px);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center;
  padding:5px 22px;border-radius:999px;border:3px solid #fff;background:rgba(8,30,58,.92);
  box-shadow:0 6px 0 rgba(var(--shadow),.55),0 10px 24px rgba(0,0,0,.35);
  font-family:'Jua',sans-serif;font-weight:400;font-size:clamp(21px,2.6vw,32px);color:#fff;
  opacity:0;transition:opacity .2s;text-shadow:0 2px 0 rgba(var(--shadow),1)}
