/* theeye-v2.html 에서 이식. 렌더링 관련 스타일은 손대지 않았다. */
:root{
  /* 바탕은 지정받은 #0d0d0d. 위로 얹히는 층들은 완전 중성 회색 대신 파랑
     강조색(--anchor) 쪽으로 아주 살짝 기울여, 고른 색이라는 인상을 준다. */
  --bg:#0d0d0d; --panel:#0d0d0d; --panel2:#191a1e; --line:#232428; --line2:#31333a;
  --track:#141518;                    /* 탭 세그먼트 뒤 은은한 회색 */
  --text:#e4e7ec; --dim:#868d99; --dim2:#5f666f;
  --anchor:#6ea8fe; --multi:#e8a33d; --multi-soft:rgba(232,163,61,.14);
  --ctrl:#e0645f; --cycle:#b07de8; --ok:#5bbf8f;
  --ui:-apple-system,BlinkMacSystemFont,'Apple SD Gothic Neo','Pretendard','Noto Sans KR','Malgun Gothic',system-ui,sans-serif;
  --mono:ui-monospace,SFMono-Regular,'SF Mono',Menlo,monospace;

  /* 층을 얹는 반투명 오버레이. 어두운 바탕에서는 흰빛을, 밝은 바탕에서는
     검은빛을 얹어야 같은 "살짝 도드라짐"이 된다. 라이트 테마에서 이 값만
     뒤집으면 되도록 변수로 뺐다. */
  --ov1:rgba(255,255,255,.014);   /* 카드 바탕 */
  --ov2:rgba(255,255,255,.035);   /* 탭 호버 */
  --ov3:rgba(255,255,255,.06);    /* 선택된 탭 안쪽 테두리 */
  --ov4:rgba(255,255,255,.14);    /* 색상 팔레트 원 테두리 */
  --ov5:rgba(255,255,255,.16);    /* 스와치 포커스 링 */
  --shadow:rgba(0,0,0,.5);
  --tab-on:#26282e;               /* 선택된 탭 바탕 */
  --strong:#fff;                  /* 강조 글자(버튼 호버 등) */
  --body:#c3c8d0;                 /* 본문 문단 */

  /* 캔버스 전용. 캔버스는 CSS 를 못 쓰므로 JS 가 getComputedStyle 로 읽어 간다.
     여기 두는 이유는 **색 정의를 한 곳에만** 두기 위해서다 — JS 에 따로 적으면
     테마를 바꿀 때 두 곳을 맞춰야 하고 반드시 어긋난다. */
  --cv-label:#a8b0bb;                      /* 노드 이름 */
  --cv-label-bg:rgba(22,24,28,.74);        /* 이름 뒤 판 */
  --cv-ring:#fff;                          /* 선택 노드 테두리 */
  --cv-foreign:rgba(255,255,255,.35);      /* 해외 노드 점선 */
  --cv-lock:rgba(255,255,255,.82);         /* 자물쇠 아이콘 */
  --cv-edge:140,150,165;                   /* 기본 엣지 RGB 채널 */
  /* 헤더 그라디언트와 떠 있는 패널의 바탕. 알파를 쓰는 쪽에서 주므로
     RGB 채널만 둔다. 라이트에서 이 값을 안 뒤집으면 밝은 화면 위에
     검은 판이 떠 있게 된다(실제로 그랬다). */
  /* 강조 글자. 원래는 어두운 바탕에 얹을 파스텔로 골랐던 값들이라,
     밝은 바탕에서는 그대로 쓰면 읽히지 않는다. 의미별로 변수를 두고
     테마마다 명도를 뒤집는다. */
  --t-blue:#b9d3ff; --t-gray:#8b93a0; --t-purple:#b9a8e0;
  --t-red:#f0968f;  --t-green:#8fd3b3;
  --bg-rgb:13,13,13;
  --float-rgb:20,21,24;
  --cv-lockl:#9aa2b4;                      /* 잠긴 노드 이름 */
  --cv-deadl:#8b93a0;                      /* 폐지 노드 이름 */
}

/* ── 라이트 테마 ──────────────────────────────────────────
   data-theme 은 <html> 에 붙는다. 'system' 이면 OS 설정을 따르고,
   'light'·'dark' 면 그것을 강제한다. 두 규칙의 내용이 같아 중복이지만,
   미디어쿼리는 선택자와 합칠 수 없어 어쩔 수 없다. */
:root[data-theme="light"]{
  --bg:#f7f8fa; --panel:#ffffff; --panel2:#ffffff; --line:#e4e6ea; --line2:#d3d6dc;
  --track:#eceef2;
  --text:#1a1c20; --dim:#5f666f; --dim2:#8b929c;
  --multi-soft:rgba(232,163,61,.18);
  --ov1:rgba(0,0,0,.02); --ov2:rgba(0,0,0,.04); --ov3:rgba(0,0,0,.07);
  --ov4:rgba(0,0,0,.16); --ov5:rgba(0,0,0,.18);
  --shadow:rgba(0,0,0,.14);
  --tab-on:#ffffff; --strong:#0d0d0d; --body:#3b4048;
  --cv-label:#4a5058;
  --cv-label-bg:rgba(255,255,255,.82);
  --cv-ring:#1a1c20;
  --cv-foreign:rgba(0,0,0,.35);
  --cv-lock:rgba(0,0,0,.72);
  --cv-edge:120,130,145;
  --t-blue:#1f56a8; --t-gray:#565d67; --t-purple:#5f43a0;
  --t-red:#b03a34;  --t-green:#1f6b4c;
  --bg-rgb:247,248,250;
  --float-rgb:255,255,255;
  --cv-lockl:#5d6470;
  --cv-deadl:#6b727c;
}
@media (prefers-color-scheme: light){
  :root[data-theme="system"]{
    --bg:#f7f8fa; --panel:#ffffff; --panel2:#ffffff; --line:#e4e6ea; --line2:#d3d6dc;
    --track:#eceef2;
    --text:#1a1c20; --dim:#5f666f; --dim2:#8b929c;
    --multi-soft:rgba(232,163,61,.18);
    --ov1:rgba(0,0,0,.02); --ov2:rgba(0,0,0,.04); --ov3:rgba(0,0,0,.07);
    --ov4:rgba(0,0,0,.16); --ov5:rgba(0,0,0,.18);
    --shadow:rgba(0,0,0,.14);
    --tab-on:#ffffff; --strong:#0d0d0d; --body:#3b4048;
    --cv-label:#4a5058;
    --cv-label-bg:rgba(255,255,255,.82);
    --cv-ring:#1a1c20;
    --cv-foreign:rgba(0,0,0,.35);
    --cv-lock:rgba(0,0,0,.72);
    --cv-edge:120,130,145;
    --t-blue:#1f56a8; --t-gray:#565d67; --t-purple:#5f43a0;
  --t-red:#b03a34;  --t-green:#1f6b4c;
  --bg-rgb:247,248,250;
    --float-rgb:255,255,255;
    --cv-lockl:#5d6470;
    --cv-deadl:#6b727c;
  }
}
*{box-sizing:border-box;margin:0;padding:0}
/* **hidden 속성이 실제로 감추게 한다.**

   브라우저 기본 규칙은 `[hidden]{display:none}` 인데, 작성자 스타일이 UA
   스타일을 무조건 이긴다. 그래서 `.login-cta{display:flex}` 같은 규칙이 하나
   있으면 `el.hidden=true` 를 해도 그대로 보인다 — 코드는 감췄다고 믿고,
   화면에는 남는다.

   여기 걸려서 요소마다 `.acct-menu[hidden]`·`.busy[hidden]` 을 하나씩 붙여
   왔는데, 그러면 **새로 만드는 요소마다 같은 함정을 다시 밟는다.** 실제로
   로그인 유도 블록과 '데이터 갱신' 항목이 그렇게 감춰지지 않고 있었다.
   특이도가 같아 순서에 따라 지므로 !important 로 못 박는다. */
[hidden]{display:none !important}
/* 위 리셋의 margin:0 이 <dialog> 의 브라우저 기본 margin:auto 까지 지운다.
   그러면 showModal() 한 창이 화면 가운데가 아니라 **좌상단에 달라붙는다.**
   작성자 스타일이 UA 스타일을 무조건 이기므로 여기서 되돌려 줘야 한다.
   네 창(출처 고지·확인 창·설정·지원)이 모두 이 상태였다. */
dialog{margin:auto}
html,body{height:100%;overflow:hidden}
body{background:var(--bg);color:var(--text);font-family:var(--ui);font-size:13px;-webkit-font-smoothing:antialiased}
button{font:inherit;color:inherit;background:none;border:none;cursor:pointer}
input{font:inherit;color:inherit}
:focus-visible{outline:2px solid var(--anchor);outline-offset:2px;border-radius:3px}
/* 사이드바 폭. 접을 때 이 값만큼 정확히 밀어내야 하므로 한 곳에만 적는다. */
.app{--sb-w:292px;display:flex;height:100vh;position:relative}

/* sidebar */
/* 접을 때 width 를 줄이면 안쪽 내용이 찌그러지며 글자가 밀린다.
   폭은 그대로 두고 margin 으로 밀어내면 내용이 흐트러지지 않고 미끄러진다. */
.sb{width:var(--sb-w);flex:none;background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;
  transition:margin-left .24s cubic-bezier(.4,0,.2,1)}
/* **폭만큼 정확히 밀어낸다.** 예전에는 -233px 이라 오른쪽 59px 이 화면에
   남아 있었다. 다시 펼 방법이 필요해서 남긴 것처럼 보였지만, 펼치기 단추는
   상단 바에 따로 있다(#sbShow) — 남길 이유가 없었다.
   숫자를 두 곳에 적지 않으려고 --sb-w 로 묶었다. 한쪽만 고치면 다시 삐져나온다. */
.app.sb-off .sb{margin-left:calc(var(--sb-w) * -1)}
@media (prefers-reduced-motion:reduce){
  .sb,.detail,.tab{transition:none}
}
.sb-top{padding:10px 10px 0;display:flex}
.icon-btn{width:26px;height:26px;display:grid;place-items:center;border-radius:5px;color:var(--dim)}
.icon-btn:hover{background:var(--panel2);color:var(--text)}
/* 세그먼트 컨트롤. 두 버튼을 감싸는 트랙이 배경과 구분되어야 '여기서 좌우로
   오갈 수 있다'가 눌러 보기 전에 읽힌다. 선택된 쪽만 한 단계 더 밝게 띄운다. */
.tabs{display:flex;gap:2px;margin:8px 10px 12px;padding:3px;background:var(--track);
  border-radius:9px;box-shadow:inset 0 0 0 1px var(--ov2)}
.tab{flex:1;display:flex;align-items:center;justify-content:center;gap:4px;height:28px;border-radius:6px;color:var(--dim);font-size:11.5px;font-weight:500;white-space:nowrap;transition:background .13s,color .13s}
.tab[aria-selected="true"]{background:var(--tab-on);color:var(--text);box-shadow:0 1px 2px var(--shadow),inset 0 0 0 1px var(--ov3)}
/* 배경·글자를 한 규칙에 모은다. 따로 두면 뒤 규칙이 앞을 덮어 하나가 죽는다 */
.tab:hover:not([aria-selected="true"]){background:var(--ov2);color:var(--text)}
.sb-act{padding:0 10px;display:flex;align-items:center;gap:6px;height:26px;color:var(--dim);font-size:12.5px;border-radius:5px;width:calc(100% - 20px);margin:0 10px}
.sb-act:hover{color:var(--text)}
.sort{padding:10px 12px 6px;font-size:11.5px;color:var(--dim2);display:flex;align-items:center;gap:4px}
.spaces{flex:1;overflow-y:auto;padding:0 8px}
/* 공간 줄은 div 다. 안에 '이름 수정' 버튼이 들어가야 하는데 button 안에 button 을
   넣을 수 없어서, 이동은 .go 버튼이 맡고 줄 자체는 컨테이너 역할만 한다. */
.space{display:flex;align-items:center;height:30px;padding:0 4px 0 9px;border-radius:6px;color:var(--dim);font-size:12.5px;width:100%}
.space:hover{background:var(--panel2);color:var(--text)}
.space[aria-current="true"]{background:var(--line);color:var(--text)}
.space .go{display:flex;align-items:center;gap:7px;flex:1;min-width:0;height:100%;text-align:left;color:inherit}
.space .dot{width:5px;height:5px;border-radius:50%;background:var(--dim2);flex:none}
.space[aria-current="true"] .dot{background:var(--anchor)}
.space .nm{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* 평소엔 감춰 두고 hover·키보드 포커스에서만 드러낸다 */
.space .ed{width:22px;height:22px;flex:none;display:grid;place-items:center;border-radius:4px;color:var(--dim2);opacity:0;transition:opacity .12s}
.space:hover .ed,.space:focus-within .ed{opacity:1}
.space .ed:hover{background:var(--line2);color:var(--text)}
.ren{width:100%;min-width:0;background:var(--bg);border:1px solid var(--anchor);border-radius:4px;padding:2px 6px;font-size:12.5px;outline:none}
/* ── 계정 칸 ───────────────────────────────────────────────
   눌러서 메뉴를 여는 자리라는 걸 눌러 보기 전에 알아야 한다. 그래서 (1) 이름
   옆에 화살촉을 두고 (2) hover 하면 줄 전체가 밝아진다. */
.acct-wrap{position:relative;border-top:1px solid var(--line);padding:8px}
.acct{width:100%;display:flex;align-items:center;gap:8px;padding:6px;border-radius:8px;
  color:var(--dim2);font-size:11.5px;text-align:left;transition:background .12s}
.acct:hover,.acct[aria-expanded="true"]{background:var(--panel2)}
.acct-id{flex:1;min-width:0;line-height:1.35}
.acct-id b{display:block;color:var(--dim);font-weight:500;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.acct:hover .acct-id b{color:var(--text)}
.acct-id span{font-size:10.5px;color:var(--dim2)}
.acct .chev{flex:none;color:var(--dim2);transition:transform .15s}
.acct[aria-expanded="true"] .chev{transform:rotate(180deg)}
.avatar{width:22px;height:22px;border-radius:50%;background:var(--line2);display:grid;place-items:center;font-size:10px;color:var(--dim);flex:none}

/* 메뉴는 **위로** 펼친다. 계정 칸이 사이드바 맨 아래라 아래로 열면 화면을 벗어난다. */
.acct-menu{position:absolute;left:8px;right:8px;bottom:calc(100% - 4px);z-index:30;
  background:var(--panel2);border:1px solid var(--line2);border-radius:9px;
  padding:5px;box-shadow:0 12px 34px var(--shadow)}
.mi{width:100%;display:flex;align-items:center;gap:9px;padding:7px 9px;border-radius:6px;
  font-size:12.5px;color:var(--dim);text-align:left}
.mi:hover{background:var(--line);color:var(--text)}
.mi svg{flex:none;color:var(--dim2)}
.mi:hover svg{color:var(--dim)}
.mi[disabled]{opacity:.6;cursor:default}
.mi[disabled]:hover{background:none;color:var(--dim)}
/* 새 버전이 있을 때만. 눈에 띄어야 하지만 작업을 가로막지는 않는다. */
.mi.new,.mi.new:hover{color:var(--anchor)}
.mi.new svg{color:var(--anchor)}
/* 항목 오른쪽의 값(언어 '한국어', 업데이트 'v0.1.0'). 누르는 것이 아니라
   지금 상태를 알리는 글자라 흐리게 둔다. */
.mi-v{margin-left:auto;font-size:10.5px;font-family:var(--mono);color:var(--dim2)}
.mi.new .mi-v{color:var(--anchor);opacity:.7}
.mi-sep{height:1px;background:var(--line);margin:5px 4px}
/* 메뉴 맨 아래 회색 한 줄. 누를 수 없는 정보라 항목과 확실히 구분한다. */
.acct-ver{padding:7px 9px 3px;font-size:10.5px;color:var(--dim2);
  border-top:1px solid var(--line);margin-top:5px}

/* 로그인한 계정. 누를 수 없어 항목과 확실히 구분한다. */
.acct-who{padding:6px 9px 8px;font-size:11px;color:var(--dim2);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ── 지원 창 ─────────────────────────────────────────────── */
#supDlg{width:400px;max-width:92vw;padding:0;border:1px solid var(--line2);border-radius:12px;
  background:var(--panel2);color:var(--text);font-family:var(--ui);
  box-shadow:0 24px 70px var(--shadow)}
#supDlg::backdrop{background:rgba(0,0,0,.5)}
.sup-p{font-size:12.5px;color:var(--body);line-height:1.65}
.sup-meta{margin-top:13px;padding:9px 11px;border-radius:7px;background:var(--panel);
  font-size:11px;font-family:var(--mono);color:var(--dim2);line-height:1.6;
  white-space:pre-wrap;word-break:break-all}
.sup-act{display:flex;gap:8px;justify-content:flex-end;margin-top:15px}
.sup-act button{padding:7px 14px;border-radius:7px;font-size:12.5px}
.sup-act button:disabled{opacity:.5;cursor:default}

/* ── 설정 창 ─────────────────────────────────────────────── */
#setDlg{width:440px;max-width:92vw;padding:0;border:1px solid var(--line2);border-radius:12px;
  background:var(--panel2);color:var(--text);font-family:var(--ui);
  box-shadow:0 24px 70px var(--shadow)}
#setDlg::backdrop{background:rgba(0,0,0,.5)}
.set-hd{display:flex;align-items:center;padding:15px 18px;font-size:14px;font-weight:600;
  border-bottom:1px solid var(--line)}
.set-x{margin-left:auto;padding:3px;border-radius:5px;color:var(--dim2);display:flex}
.set-x:hover{color:var(--text);background:var(--line)}
.set-b{padding:16px 18px 18px}
.set-row{display:flex;align-items:flex-start;gap:18px}
.set-row+.set-row{margin-top:18px;padding-top:18px;border-top:1px solid var(--line)}
.set-lb{flex:1;min-width:0;font-size:12.5px;color:var(--text);line-height:1.4}
.set-lb span{display:block;margin-top:3px;font-size:11px;color:var(--dim2);line-height:1.5}
.set-row .seg{flex:none;width:190px;margin:0}

/* main */
/* 캔버스가 화면 전체를 쓰고, 상단 바·앵커 줄은 그 위에 떠서 blur 로 가른다.
   구분선을 지우는 대신 아래로 갈수록 투명해지는 그라디언트를 둬서, 버블이
   헤더 밑으로 흘러 들어가는 게 보이도록 했다 — 선 하나로 자르는 것보다
   공간이 이어져 있다는 느낌을 준다. */
.main{flex:1;min-width:0;position:relative}
.head{position:absolute;top:0;left:0;right:0;z-index:6;padding-bottom:14px;
  backdrop-filter:blur(16px) saturate(1.3);-webkit-backdrop-filter:blur(16px) saturate(1.3);
  background:linear-gradient(to bottom,rgba(var(--bg-rgb),.92),rgba(var(--bg-rgb),.74) 58%,rgba(var(--bg-rgb),0));
  /* 그라디언트 꼬리가 캔버스 조작을 가로채지 않도록 실제 UI 에만 이벤트를 준다 */
  pointer-events:none;
  -webkit-mask-image:linear-gradient(to bottom,#000 72%,transparent);
  mask-image:linear-gradient(to bottom,#000 72%,transparent)}
.head>*{pointer-events:auto}
.bar{height:44px;flex:none;display:flex;align-items:center;gap:10px;padding:0 14px}
/* 상단 공간명. 클릭하면 그 자리에서 이름을 고친다 — 눌러도 되는 곳임을
   알 수 있게 hover 배경을 준다. */
.title{font-size:13px;font-weight:600;letter-spacing:-.01em;cursor:text;border-radius:5px;padding:3px 6px;margin-left:-6px}
.title:hover{background:var(--panel2)}
.title .ren{font-size:13px;font-weight:600;width:180px}
.spacer{flex:1}
.saved{font-size:11.5px;color:var(--dim2);display:flex;align-items:center;gap:5px}
.rail{height:42px;flex:none;display:flex;align-items:center;gap:7px;padding:0 14px}
.rail-lb{font-size:11px;color:var(--dim2);letter-spacing:.06em;text-transform:uppercase;font-family:var(--mono);flex:none}
.chip{display:flex;align-items:center;gap:6px;height:26px;padding:0 5px 0 10px;border-radius:13px;background:rgba(110,168,254,.11);box-shadow:inset 0 0 0 1px rgba(110,168,254,.32);color:var(--t-blue);font-size:12px;font-weight:500;flex:none}
.chip .x{width:16px;height:16px;border-radius:50%;display:grid;place-items:center;color:rgba(185,211,255,.55);font-size:13px;line-height:1}
.chip .x:hover{background:rgba(110,168,254,.2);color:var(--strong)}
.addbtn{height:26px;padding:0 11px;border-radius:13px;box-shadow:inset 0 0 0 1px var(--line2);color:var(--dim);font-size:12px;flex:none}
.addbtn:hover{color:var(--text);box-shadow:inset 0 0 0 1px var(--dim2)}
.stage{position:absolute;inset:0;min-height:0}
canvas{display:block;width:100%;height:100%;cursor:grab}
canvas.drag{cursor:grabbing} canvas.hot{cursor:pointer}

/* empty */
.empty{position:absolute;inset:0;display:grid;place-items:center;pointer-events:none}
.empty.off{display:none}
.search-wrap{pointer-events:auto;width:320px;position:relative}
.search{display:flex;align-items:center;gap:9px;height:44px;padding:0 16px;border-radius:22px;background:var(--panel2);box-shadow:inset 0 0 0 1px var(--line2);transition:box-shadow .15s}
.search:focus-within{box-shadow:inset 0 0 0 1px var(--anchor)}
/* 가운데 정렬. 오른쪽 24px 는 왼쪽 돋보기(15)와 gap(9)을 상쇄하는 값이다 —
   이게 없으면 글자가 알약 한가운데가 아니라 12px 오른쪽에 선다. */
.search input{flex:1;background:none;border:none;outline:none;font-size:13.5px;color:var(--text);
  text-align:center;padding-right:24px}
.search input::placeholder{color:var(--dim2)}
/* 안내문을 검색란 쪽으로 당겼다. 붙이지는 않는다 — 붙으면 검색란의 일부처럼
   읽혀서, 누를 수 있는 것과 읽기만 하는 것이 한 덩어리가 된다. */
.hint{text-align:center;margin-top:8px;font-size:11.5px;color:var(--dim2);line-height:1.7}
.results{position:absolute;top:52px;left:0;right:0;background:var(--panel2);border:1px solid var(--line2);border-radius:10px;overflow:hidden;box-shadow:0 12px 32px rgba(0,0,0,.5);max-height:290px;overflow-y:auto}
.results:empty{display:none}
.res{display:flex;align-items:center;gap:9px;padding:9px 14px;width:100%;text-align:left;font-size:12.5px}
.res:hover,.res.on{background:var(--line)}
/* 키보드로 고른 항목. hover 와 색은 같게 두되 왼쪽 띠로 '지금 여기'를 표시한다 —
   마우스를 얹은 것과 Enter 로 들어갈 것이 구분되어야 한다. */
.res.on{box-shadow:inset 2px 0 0 var(--anchor)}
/* 결과가 없을 때. 박스가 사라지지 않도록 반드시 무언가를 그린다. */
.res-none{padding:12px 14px;font-size:12.5px;color:var(--dim)}
.res-none span{display:block;margin-top:4px;font-size:11px;color:var(--dim2);line-height:1.5}
.res .sec{margin-left:auto;font-size:11px;color:var(--dim2);font-family:var(--mono)}
.res .mk{width:6px;height:6px;border-radius:50%;background:var(--anchor);flex:none}
.res .mkt{font-size:10px;color:var(--dim2);font-family:var(--mono);border:1px solid var(--line2);border-radius:3px;padding:1px 4px;flex:none}

/* floating */
.float{position:absolute;z-index:4;background:rgba(var(--float-rgb),.92);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);border:1px solid var(--line);border-radius:9px;padding:11px 13px}
.legend{left:14px;bottom:14px}
.filters{right:14px;bottom:14px;width:210px}
/* 배치 설정. 톱니바퀴가 앵커 줄 오른쪽 끝에 있으므로 그 아래에 맞춰 연다.
   필터와 달리 hover 로 펼치지 않는다 — 슬라이더를 끌다 커서가 벗어나면
   패널이 접히면서 끌던 손잡이가 사라진다(필터는 손잡이가 하나뿐이라 덜 걸린다). */
/* top 은 .head 높이(바 44 + 앵커 줄 42)에 맞춘다. .head 는 캔버스 위에 떠 있고
   z-index 가 .float 보다 높아서, 14px 로 두면 첫 줄이 앵커 줄 밑에 깔린다. */
.phys{right:14px;top:92px;width:214px}
.ph-hd{display:flex;align-items:center;font-size:10.5px;letter-spacing:.09em;
  text-transform:uppercase;color:var(--dim2);font-family:var(--mono);margin-bottom:11px}
.ph-x{margin-left:auto;background:none;border:0;padding:2px;cursor:pointer;
  color:var(--dim2);display:flex;border-radius:4px}
.ph-x:hover{color:var(--text);background:var(--panel2)}
.ph-rs{width:100%;margin-top:3px;padding:5px 0;font:inherit;font-size:11px;
  color:var(--dim);background:none;border:1px solid var(--line2);border-radius:6px;cursor:pointer}
.ph-rs:hover{color:var(--text);border-color:var(--dim2)}
.ph-d{font-size:10.5px;color:var(--dim2);line-height:1.45;margin:-5px 0 9px}
/* 톱니바퀴는 앵커 줄 끝으로 민다. 요금제 배지가 쓰던 자리다. */
.icon-btn.gear{margin-left:auto;flex:none}
.icon-btn.gear[aria-expanded="true"]{color:var(--text);background:var(--panel2)}
.f-h{font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--dim2);font-family:var(--mono);margin-bottom:9px}
.lg{display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--dim);margin-top:6px}
.lg:first-of-type{margin-top:0}
.sw{width:11px;height:11px;flex:none}
.sw.c{border-radius:50%} .sw.d{transform:rotate(45deg)} .sw.s{border-radius:2px}
.ln{width:16px;height:0;border-top:2px solid;flex:none}
.rng{width:100%;accent-color:var(--anchor);margin:2px 0 9px}
.rowv{display:flex;justify-content:space-between;font-size:11.5px;color:var(--dim);margin-bottom:3px}
.rowv b{font-family:var(--mono);color:var(--text);font-weight:500}
.cb{display:flex;align-items:center;gap:7px;font-size:11.5px;color:var(--dim);padding:3px 0;cursor:pointer}
.cb input{accent-color:var(--anchor);width:13px;height:13px}
.cb:hover{color:var(--text)}
.seg{display:flex;gap:3px;margin-bottom:10px}
.seg button{flex:1;height:26px;border-radius:5px;font-size:11.5px;color:var(--dim);box-shadow:inset 0 0 0 1px var(--line2)}
.seg button[aria-pressed="true"]{background:var(--line);color:var(--text);box-shadow:inset 0 0 0 1px var(--dim2)}

/* detail */
/* 상세 패널. 예전에는 flex 항목이라 열릴 때 width 가 0 → 330px 로 늘면서
   **메인 화면을 밀어냈다.** 그래프가 통째로 옆으로 움직여, 보고 있던 노드가
   손을 대지도 않았는데 자리를 옮기는 것처럼 보였다.

   그래서 레이아웃에서 빼내 위에 겹치게 했다. transform 으로 밀어 넣으므로
   레이아웃 계산이 아예 일어나지 않고, 캔버스는 한 픽셀도 움직이지 않는다. */
.detail{position:absolute;top:0;right:0;bottom:0;width:340px;z-index:8;
  background:var(--panel);border-left:1px solid var(--line);
  box-shadow:-14px 0 34px var(--shadow);
  transform:translateX(100%);transition:transform .22s cubic-bezier(.4,0,.2,1);
  /* 닫힌 동안에는 클릭을 가로채면 안 된다. transform 만으로는 여전히
     화면 밖에서 이벤트를 받으므로 명시적으로 꺼 둔다. */
  pointer-events:none;overflow:hidden}
.detail.open{transform:translateX(0);pointer-events:auto}
/* 예전에는 .detail 이 width:0 으로 접혀서 안쪽 글자가 찌그러졌다. 그걸 막으려고
   고정폭을 줬는데, 이제 transform 으로 밀어내므로 그 이유가 사라졌다. */
.d-in{width:100%;height:100%;display:flex;flex-direction:column}
.d-hd{padding:14px 16px 13px;border-bottom:1px solid var(--line);display:flex;align-items:flex-start;gap:10px}
.d-hd h2{font-size:15px;font-weight:600;letter-spacing:-.01em;line-height:1.3}
.d-hd .sub{font-size:11.5px;color:var(--dim2);margin-top:3px}
.d-body{flex:1;overflow-y:auto;padding:14px 16px 20px}
.tagrow{display:flex;gap:5px;flex-wrap:wrap;margin-top:9px}
.tag{font-size:10.5px;padding:2.5px 7px;border-radius:4px;background:var(--line);color:var(--dim)}
.tag.amber{background:var(--multi-soft);color:var(--multi)}
.tag.ctrl{background:rgba(224,100,95,.16);color:#f0918d}
.sec-h{font-size:10.5px;letter-spacing:.09em;text-transform:uppercase;color:var(--dim2);font-family:var(--mono);margin:18px 0 9px}
.sec-h:first-child{margin-top:0}
/* ── 접었다 펴는 절 ──────────────────────────────────────
   상세 패널이 길어져 아래쪽(근거·주주)을 보려면 한참 스크롤해야 한다.
   머리글을 눌러 접을 수 있게 한다. 펼침 상태는 S.open 에 남아, 다른 회사를
   눌러도 방금 접어 둔 절은 접힌 채로 있다 — 매번 다시 접게 하면 소용없다. */
button.sec-h{display:flex;align-items:center;gap:6px;width:100%;text-align:left;
  background:none;border:none;padding:0;cursor:pointer}
button.sec-h:hover{color:var(--dim)}
button.sec-h::after{content:'▾';font-size:9px;opacity:.6;transition:transform .15s}
button.sec-h[aria-expanded="false"]::after{transform:rotate(-90deg)}
button.sec-h .cnt{margin-left:auto;font-size:9.5px;opacity:.75;letter-spacing:0}
/* ── 3개년 재무 막대 ─────────────────────────────────────
   지표마다 자릿수가 달라(매출 조 단위, 영업이익 억 단위) 한 축에 그리면
   이익 막대가 눈에 보이지도 않는다. 지표별로 축을 따로 둔 작은 막대 셋을
   쌓는다. 적자는 기준선 아래로 내려 색을 바꾼다. */
.fin{margin:2px 0 4px}
.fin-r{margin-bottom:11px}
.fin-r:last-child{margin-bottom:2px}
.fin-lb{display:flex;align-items:baseline;gap:6px;font-size:10.5px;color:var(--dim);margin-bottom:4px}
.fin-lb b{font-size:11.5px;color:var(--text);font-weight:500;font-variant-numeric:tabular-nums}
.fin-lb .yoy{margin-left:auto;font-size:10px;font-family:var(--mono)}
.fin-up{color:var(--ok)} .fin-dn{color:var(--ctrl)}
/* 막대 셋. --zero 는 위에서 0 선까지의 비율이라, 적자가 없으면 100% 라 바닥이 된다.
   막대는 칸 폭을 다 채우지 않는다 — 채우면 폭 95px·높이 56px 짜리 뭉툭한
   덩어리가 되어 높이 차이가 눈에 안 들어온다. 폭을 좁히면 같은 데이터라도
   막대 사이의 길이 차가 훨씬 또렷하다. */
.fin-g{display:flex;gap:14px;position:relative}
.fin-g::after{content:'';position:absolute;left:0;right:0;top:var(--zero);
  border-top:1px solid var(--line2);pointer-events:none}
.fin-c{flex:1;display:flex;flex-direction:column;min-width:0}
.fin-t{position:relative;height:56px}
.fin-t i{position:absolute;left:50%;transform:translateX(-50%);
  width:26px;max-width:70%;border-radius:2px;display:block}
.fin-v{font-size:8.5px;color:var(--dim);font-family:var(--mono);
  text-align:center;line-height:1.3;min-height:11px}
.fin-y{font-size:8.5px;color:var(--dim2);font-family:var(--mono);
  text-align:center;margin-top:3px}
.fin-src{font-size:9.5px;color:var(--dim2);margin-top:2px}

.ev{border:1px solid var(--line);border-radius:8px;padding:11px 12px;margin-bottom:8px;background:var(--ov1)}
.ev-top{display:flex;align-items:center;gap:7px;margin-bottom:8px;flex-wrap:wrap}
.ev-arrow{font-size:12px;font-weight:500} .ev-arrow .a{color:var(--anchor)}
.q{font-size:12px;line-height:1.65;color:#c8cdd5;border-left:2px solid var(--line2);padding-left:10px;margin-bottom:9px}
.meta{display:flex;align-items:center;gap:8px;font-size:10.5px;color:var(--dim2);font-family:var(--mono)}
.conf{margin-left:auto;display:flex;align-items:center;gap:5px}
.cbar{width:34px;height:3px;border-radius:2px;background:var(--line2);overflow:hidden}
.cbar i{display:block;height:100%}
.rel{font-size:10.5px;padding:2px 6px;border-radius:3px;background:var(--line);color:var(--dim)}
.kv{display:flex;justify-content:space-between;padding:7px 0;border-bottom:1px solid var(--line);font-size:12px}
.kv:last-child{border:none} .kv span{color:var(--dim2)} .kv b{font-weight:500}
.xbtn{margin-left:auto;color:var(--dim2);font-size:17px;line-height:1;padding:2px 4px;flex:none}
.xbtn:hover{color:var(--text)}
.promote{width:100%;height:32px;border-radius:7px;box-shadow:inset 0 0 0 1px var(--line2);color:var(--dim);font-size:12px;margin-top:14px}
.promote:hover{color:var(--anchor);box-shadow:inset 0 0 0 1px rgba(110,168,254,.5)}
.note{font-size:11px;color:var(--dim2);line-height:1.6;margin-top:12px}
.warn{font-size:11.5px;color:var(--cycle);background:rgba(176,125,232,.1);border:1px solid rgba(176,125,232,.3);border-radius:7px;padding:9px 11px;margin-bottom:10px;line-height:1.55}

/* ── 출처·면책 고지 ──────────────────────────────
   OpenDART 이용약관 제23조가 정확성·완전성을 보장하지 않는다고 명시한다.
   유료 배포이므로 사용자가 언제든 다시 볼 수 있어야 한다.

   진입점은 **계정 메뉴로 옮겼다**(.mi). 업데이트 줄과 함께 사이드바 아래에
   붙여 두었더니, 공간 목록과 계정 칸 사이에 앱 자체에 대한 정보가 끼어
   시선이 두 번 끊겼다. 둘 다 자주 쓰는 것이 아니라 메뉴 안이 맞는 자리다. */

#discDlg{max-width:460px;padding:22px 24px;border:1px solid var(--line2);border-radius:12px;
  background:var(--panel2);color:var(--text);font-family:var(--ui);font-size:12.5px;line-height:1.7}
#discDlg::backdrop{background:rgba(0,0,0,.62)}
#discDlg h3{font-size:14px;margin-bottom:12px}
#discDlg p{margin:9px 0;color:var(--body)}
#discDlg ul{margin:12px 0 0 16px;color:var(--body)}
#discDlg li{margin:7px 0}
#discDlg b{color:var(--text);font-weight:600}
#discDlg .dlg-meta{margin-top:16px;font-size:11px;color:var(--dim2)}
#discDlg button{margin-top:16px;padding:7px 16px;border-radius:7px;
  background:var(--anchor);color:#0d0d0d;font-size:12.5px;font-weight:600}

/* ── 상세 패널: '앵커로 추가' 를 기업명 왼쪽에 둔다 ─────────
   원래는 패널 아래쪽 큰 버튼이었는데, 제목 옆이 "이 회사를 어떻게 할까"를
   묻기에 더 가까운 자리다. */
.d-title{display:flex;align-items:center;gap:9px}
.d-add{flex:none;height:22px;padding:0 9px;border-radius:11px;font-size:11px;font-weight:500;
  color:var(--t-blue);background:rgba(110,168,254,.12);box-shadow:inset 0 0 0 1px rgba(110,168,254,.3)}
.d-add:hover{background:rgba(110,168,254,.22);color:var(--strong)}

/* ── 필터: 평소 접어 두고 호버에서 편다 ────────────────────
   화면 위에 떠 있는 패널이라 늘 펼쳐 두면 그래프를 가린다. */
.filters{max-height:30px;overflow:hidden;transition:max-height .2s cubic-bezier(.4,0,.2,1)}
.filters:hover,.filters:focus-within{max-height:min(60vh,460px);overflow-y:auto}
.f-cap{font-size:11px;color:var(--dim2);letter-spacing:.06em;text-transform:uppercase;
  font-family:var(--mono);display:flex;align-items:center;gap:5px}
.f-cap::after{content:'▾';font-size:9px;opacity:.7}
.filters:hover .f-cap::after{content:'▴'}
@media (prefers-reduced-motion:reduce){ .filters{transition:none} }

/* ── 범례 색상 커스터마이징 ────────────────────────────── */
.f-note{margin-left:auto;font-size:9.5px;color:var(--dim2);text-transform:none;letter-spacing:0}
/* 필터 안의 여러 줄 설명. .f-note 는 `margin-left:auto` 라 flex 안에서 오른쪽에
   붙는 인라인 배지용이고, 블록으로 쓰면 줄이 깨진다. */
.f-desc{font-size:9.5px;line-height:1.55;color:var(--dim2);margin:0 0 8px}
.f-h{display:flex;align-items:center}
button.swx{cursor:pointer;padding:0;border:none}
button.swx:hover{box-shadow:0 0 0 3px var(--ov5)}
.cpick{position:fixed;z-index:50;display:grid;grid-template-columns:repeat(4,1fr);gap:6px;
  width:178px;padding:10px;border-radius:10px;background:var(--panel2);
  border:1px solid var(--line2);box-shadow:0 14px 34px rgba(0,0,0,.55)}
.cp{width:26px;height:26px;border-radius:50%;cursor:pointer;box-shadow:inset 0 0 0 1px var(--ov4)}
.cp[aria-current="true"]{box-shadow:0 0 0 2px var(--text)}
.cp-custom{grid-column:1/-1;display:flex;align-items:center;justify-content:space-between;
  font-size:11px;color:var(--dim);cursor:pointer}
.cp-custom input{width:32px;height:22px;padding:0;border:none;background:none;cursor:pointer}
.cp-reset{grid-column:1/-1;height:24px;border-radius:6px;font-size:11px;color:var(--dim);
  box-shadow:inset 0 0 0 1px var(--line2)}
.cp-reset:hover{color:var(--text)}
/* 앵커 해제는 '되돌리는' 동작이라 파란 강조 대신 중립색으로 둔다 */
.d-add.off{color:var(--dim);background:transparent;box-shadow:inset 0 0 0 1px var(--line2)}
.d-add.off:hover{color:var(--text);box-shadow:inset 0 0 0 1px var(--dim2)}
/* 외부 링크(DART 원문). href 없이 opener 로 여므로 커서만 링크처럼 보이게 한다 */
a.ext{color:var(--anchor);text-decoration:none;cursor:pointer}
a.ext:hover{text-decoration:underline}

/* ── 상장폐지 표시 ────────────────────────────────────────
   화면(canvas)에서는 반투명 회색으로 그린다. 패널·검색은 canvas 가 아니므로
   여기서 같은 뜻을 CSS 로 되풀이한다 — 두 곳의 톤이 어긋나면 같은 회사가
   그래프에선 흐리고 목록에선 멀쩡해 보인다. */
.tag.dead{background:rgba(90,98,112,.22);color:var(--t-gray);box-shadow:inset 0 0 0 1px rgba(139,147,160,.28)}
.warn.dead{color:var(--t-gray);background:rgba(90,98,112,.12);border-color:rgba(139,147,160,.26)}
.res.dead{opacity:.62}
.res.dead:hover{opacity:1}          /* 고를 수는 있어야 하므로 호버 시엔 되살린다 */
.res .mkt.dead{color:var(--t-gray);border-color:rgba(139,147,160,.3)}

/* 노드 상한 안내. 경고(빨강)가 아니라 정보다 — 사용자가 뭘 잘못한 게 아니라
   데이터가 넓을 뿐이므로, 앰버 톤으로 눈에는 띄되 불안하지 않게 둔다. */
.trunc{margin-left:auto;flex:none;font-size:11px;color:var(--multi);
  background:var(--multi-soft);border-radius:5px;padding:3px 9px;white-space:nowrap}

/* ── 지배-종속 ────────────────────────────────────────────
   지분율(색)과 지배 여부(화살표)를 분리한다. 60% 를 든 오너 개인에게
   화살표가 붙어 '지배회사'로 읽히던 문제를 막기 위해서다. */
.rel.ctl{background:rgba(224,100,95,.16);color:var(--t-red)}
.lg .ln.arw{position:relative}
.lg .ln.arw::after{content:'';position:absolute;right:-1px;top:-3px;
  border:3px solid transparent;border-left-color:var(--ctrl)}

/* ── 요금제 ───────────────────────────────────────────────
   잠긴 노드는 '상장폐지'(회색)와 뜻이 다르므로 색 계열을 나눈다. 폐지는
   '지난 것', 잠김은 '아직 못 보는 것'이라 보라 계열을 썼다. */
.tier-badge{margin-left:auto;flex:none;font-size:10.5px;font-family:var(--mono);
  letter-spacing:.04em;padding:2px 8px;border-radius:999px;
  color:var(--dim);box-shadow:inset 0 0 0 1px var(--line2)}
.tier-badge.t-pro,.tier-badge.t-premium{color:var(--t-blue);box-shadow:inset 0 0 0 1px rgba(110,168,254,.4)}
.tab.locked{opacity:.45}
.tab.locked::after{content:'🔒';margin-left:5px;font-size:10px}
.warn.lock{color:var(--t-purple);background:rgba(123,107,168,.13);border-color:rgba(123,107,168,.32)}
.d-add[disabled]{opacity:.5;cursor:not-allowed}
.upsell{position:absolute;top:64px;left:50%;transform:translate(-50%,-12px);
  z-index:40;display:flex;align-items:center;gap:10px;pointer-events:none;
  background:var(--panel2);border:1px solid rgba(123,107,168,.45);border-radius:8px;
  padding:9px 15px;font-size:12.5px;color:var(--text);opacity:0;
  box-shadow:0 10px 30px rgba(0,0,0,.5);transition:opacity .18s,transform .18s}
.upsell.on{opacity:1;transform:translate(-50%,0)}
.upsell span{font-size:10.5px;font-family:var(--mono);color:var(--dim2)}
/* 오류일 때. 요금제 안내(보라)와 색으로 구분한다 — 같은 자리를 쓰므로
   무엇을 말하는 띠인지 색만 보고 알아야 한다. */
.upsell.bad{border-color:rgba(224,100,95,.55)}
.upsell.bad b{color:var(--ctrl)}

/* 조회 중 띠. 화면을 가리지 않고 위쪽에 2px 로만 흐른다 — 무거운 조회는
   1초 안쪽이라 스피너로 흐름을 끊을 일이 아니다. */
.busy{position:absolute;top:0;left:0;right:0;height:2px;z-index:45;
  background:var(--line);overflow:hidden;pointer-events:none}
.busy span{display:block;width:35%;height:100%;background:var(--anchor);
  animation:busy 1.1s ease-in-out infinite}
@keyframes busy{
  0%{transform:translateX(-100%)} 100%{transform:translateX(386%)}
}
@media (prefers-reduced-motion:reduce){
  /* 흐르지 않게 하되 '진행 중'은 보여야 한다 */
  .busy span{width:100%;animation:none;opacity:.55}
}


/* ── 산업지도 ─────────────────────────────────────────────
   탭이 셋이 되면서 사이드바를 232px → 292px 로 넓혔다. 글자도 12.5 → 11.5px 로
   줄여 '산업지도 | 공급망 | 지분관계' 가 줄바꿈 없이 한 줄에 들어간다. */
.tab svg{flex:none}
/* 레벨 배지. 검색 결과에서 이 산업이 몇 층인지 바로 보여야 고를 수 있다 */
.lv{font-size:10px;font-family:var(--mono);color:var(--dim2);
  border:1px solid var(--line2);border-radius:3px;padding:1px 4px;flex:none}
.res .desc{color:var(--dim2);font-size:11px;margin-left:auto;
  max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* ── 공간 우클릭 메뉴 ─────────────────────────────────────
   삭제는 되돌릴 수 없어서 연필 버튼 옆에 두지 않았다. 우클릭은 의도해야만
   닿는 자리라 실수로 누를 일이 없다. */
.ctx{position:fixed;z-index:60;min-width:150px;background:var(--panel2);
  border:1px solid var(--line2);border-radius:8px;padding:4px;
  box-shadow:0 12px 32px rgba(0,0,0,.55)}
.ctx-h{padding:6px 9px 7px;font-size:11px;color:var(--dim2);
  border-bottom:1px solid var(--line);margin-bottom:4px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ctx-i{display:block;width:100%;text-align:left;padding:7px 9px;border-radius:5px;
  font-size:12.5px;color:var(--text)}
.ctx-i:hover{background:var(--line)}
.ctx-i.danger{color:#e0645f}
.ctx-i.danger:hover{background:rgba(224,100,95,.14)}

/* ── 확인 대화상자 ────────────────────────────────────────
   Tauri 웹뷰에서 confirm()·alert() 가 동작하지 않아(호스트가 JS 패널
   델리게이트를 구현하지 않는다) <dialog> 로 직접 만들었다. */
dialog.ask{border:1px solid var(--line2);border-radius:12px;background:var(--panel2);
  color:var(--text);padding:20px 22px 16px;max-width:380px;box-shadow:0 20px 60px rgba(0,0,0,.6)}
dialog.ask::backdrop{background:rgba(0,0,0,.5)}
dialog.ask h3{font-size:14.5px;margin-bottom:9px;line-height:1.45}
dialog.ask p{font-size:12.5px;color:var(--dim);line-height:1.65;margin-bottom:16px}
.ask-row{display:flex;gap:8px;justify-content:flex-end}
.ask-row button{padding:7px 15px;border-radius:7px;font-size:12.5px}
.ask-c{color:var(--dim);box-shadow:inset 0 0 0 1px var(--line2)}
.ask-c:hover{color:var(--text);background:var(--line)}
.ask-o{background:var(--line);color:var(--text)}
.ask-o.danger{background:#e0645f;color:#fff}
.ask-o.danger:hover{background:#c9534e}

/* 창 배경은 tauri.conf.json 에서 뺐다(OS 기본을 따르게). 대신 html 에도 바탕을
   깔아, 웹뷰가 그려지기 전 한 프레임 동안 흰 화면이 번쩍이지 않게 한다. */
html{background:var(--bg)}

/* ── 주가 차트 (TradingView 위젯) ─────────────────────────
   붙일 수 있는 노드가 전체의 6% 뿐이라, 없을 때는 이 블록 자체가 안 나온다.
   iframe 이 못 뜨면 뒤에 깔린 안내가 드러난다 — 빈 회색 상자만 남기면
   "데이터 없음"이 아니라 "고장"으로 읽힌다. */
.tv{position:relative;height:150px;margin:0 0 14px;border-radius:8px;
  overflow:hidden;border:1px solid var(--line);background:var(--ov1)}
.tv iframe{position:relative;z-index:1;width:100%;height:150px;display:block;border:0}
/* 안내문은 iframe **위**에 덮고, 위젯이 뜨면 아예 없앤다(display:none).
   뒤에 깔아 두고 위젯이 가려주길 기대하면 안 된다 — 위젯을 isTransparent 로
   띄우기 때문에 글씨가 차트 위로 그대로 비친다(실제로 겪었다).
   iframe 에 불투명 배경을 주는 방법도 썼다가 실패했다. --ov1 같은 오버레이
   변수는 알파가 1~4% 라 이름과 달리 불투명하지 않다. 색에 기대지 않는다. */
.tv-off{position:absolute;inset:0;z-index:2;display:grid;place-items:center;
  padding:0 16px;text-align:center;font-size:11.5px;color:var(--dim2);line-height:1.6;
  background:var(--panel)}
.tv.on .tv-off{display:none}

/* ── 상세 패널의 산업 섹션 ──
   근거(.q)는 지분/공급망 카드와 같은 스타일을 그대로 쓴다. 축자 인용이라는
   성격이 같으므로 다르게 보일 이유가 없다. */
.ind-wrap{margin-bottom:14px}
.ind{border:1px solid var(--line);border-radius:8px;padding:10px 11px;
  margin-bottom:7px;background:var(--ov1)}
.ind-top{display:flex;align-items:center;gap:7px;margin-bottom:4px}
.ind-top i{width:8px;height:8px;border-radius:50%;flex:none}
.ind-top b{font-size:12.5px;color:var(--text)}
.ind-sh{margin-left:auto;font-size:11.5px;color:var(--dim2);font-variant-numeric:tabular-nums}
.ind-path{font-size:10.5px;color:var(--dim2);margin-bottom:6px;line-height:1.5}
.ind-none{font-size:11.5px;color:var(--dim2);padding:8px 2px;line-height:1.6}
/* 잠긴 노드의 산업. '미조사'와 같은 회색으로 두면 두 상태가 구분되지 않는다 —
   잠긴 노드 이름과 같은 색을 써서 화면 안에서 같은 뜻으로 읽히게 한다.
   자물쇠는 탭의 잠금 표시(.tab.locked)와 같은 약속이다. */
.ind-lock{color:var(--cv-lockl)}
.ind-lock::before{content:'🔒';margin-right:5px;font-size:10px}
.ind-why{margin-top:4px;font-size:10.5px;color:var(--dim2);opacity:.85}
/* 다른 탭에 결과가 있을 때 뜨는 안내 줄. 결과 버튼과 같은 모양이되 앵커색
   테두리로 "이건 회사가 아니라 이동 안내"임을 구분한다. */
.res.alt{box-shadow:inset 0 0 0 1px rgba(110,168,254,.35)}
.res.alt .sec{color:var(--anchor)}

/* ══ 자회사를 통한 산업 노출 ══
   직접 사업 목록과 **시각적으로 갈라 놓는다.** 같은 모양으로 이어 붙이면
   "이 회사가 그 산업을 한다"로 읽혀, 산업 규모를 두 번 세게 만든다. */
.via{margin-top:10px;padding-top:9px;border-top:1px dashed var(--line2)}
.via-h{font-size:11px;color:var(--dim2);margin-bottom:6px;display:flex;
  align-items:baseline;gap:6px;flex-wrap:wrap}
.via-hint{font-size:10px;color:var(--dim3, var(--dim2));opacity:.75}
.via-row{display:flex;align-items:center;gap:6px;padding:3px 0;font-size:12px}
.via-row i{width:7px;height:7px;border-radius:50%;flex:none}
.via-nm{color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:9em}
.via-arw{color:var(--dim2);font-size:10px}
.via-none{color:var(--dim2);font-style:italic}
.via-row b{font-weight:600}

/* ══ 지분관계도 ══
   좁은 패널에 계층을 넣어야 해서 들여쓰기 문자로 가지를 그린다. 등폭 글꼴이
   아니면 가지가 어긋나므로 여백만 고정폭으로 둔다. */
.own-wrap{margin:2px 0 4px}
.own-row{display:flex;align-items:center;gap:5px;padding:2.5px 0;font-size:12px;
  cursor:pointer;border-radius:4px}
.own-row:hover{background:var(--ov1)}
.own-pad{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  white-space:pre;color:var(--line2);flex:none;font-size:11px}
.own-row i{width:7px;height:7px;border-radius:50%;flex:none}
.own-nm{color:var(--dim);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:11em}
.own-rt{font-size:11px;font-variant-numeric:tabular-nums;flex:none}
.own-ind{font-size:11px;color:var(--dim2);white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis}
.own-more{font-size:10.5px;color:var(--dim2);margin-top:5px;font-style:italic}

/* 자회사 경유 배지. 판정이 아니라 **추정 표시**라 다른 배지보다 옅게 둔다. */
.via-badge{background:transparent;box-shadow:inset 0 0 0 1px var(--line2);
  color:var(--dim2);font-size:10px}

/* ══ 산업지도 — 필터와 얹은 기업 ══════════════════════════
   기업은 앵커와 하는 일이 다르다. 앵커는 지도를 넓히고, 얹은 기업은 이미
   그려진 갈래를 짚기만 한다. 그래서 칩도 색을 달리해 섞이지 않게 한다. */
.chip-co{background:rgba(240,195,65,.11);box-shadow:inset 0 0 0 1px rgba(240,195,65,.34);color:#e8c04a}
.chip-co .x{color:rgba(240,195,65,.6)}
.chip-co .x:hover{background:rgba(240,195,65,.2);color:#f5d97a}
/* 검색 결과에서 산업과 기업을 가르는 줄. 둘이 이어 붙으면 무엇을 누르는지
   모른 채 기업을 앵커로 담으려 하게 된다. */
.res-sep{padding:7px 14px 5px;font-size:10.5px;letter-spacing:.06em;color:var(--dim2);
  font-family:var(--mono);border-top:1px solid var(--line);margin-top:4px}
.res .mk-co{background:#f0c341;border-radius:2px}
.res-co{color:var(--dim)}
.res-co:hover,.res-co.on{color:var(--text)}
/* 이름 필터 입력. 검색창(.search input)과 달리 패널 안에 들어가므로 작다. */
.fq{width:100%;height:27px;padding:0 9px;border-radius:6px;font-size:12px;color:var(--text);
  background:var(--line);box-shadow:inset 0 0 0 1px var(--line2)}
.fq::placeholder{color:var(--dim2)}
.fq:focus{box-shadow:inset 0 0 0 1px var(--dim2)}
/* 섹터 머리글 오른쪽의 '모두 끄기'. 한 섹터만 보려고 열 번 누르게 두지 않는다. */
.f-all{float:right;font-size:10px;letter-spacing:0;text-transform:none;color:var(--dim2);
  font-family:var(--mono);padding:0 2px}
.f-all:hover{color:var(--text)}

/* ══ 담아 둔 앵커가 화면에 못 나올 때 ═══════════════════════
   요금제가 내려가면 코스피 앵커가 이 DB 에 없어 노드가 0개가 된다. 예전에는
   빈 캔버스만 남아 고장으로 보였다. 검색창 위에 이유를 적는다. */
.empty-why{max-width:520px;margin:0 auto 14px;padding:12px 15px;border-radius:9px;
  background:rgba(123,107,168,.10);box-shadow:inset 0 0 0 1px rgba(123,107,168,.28);
  font-size:12.5px;line-height:1.65;color:var(--text);text-align:left}
.empty-why b{color:var(--lock,#9b8ac4);font-weight:600}
.empty-why .ew-sub{display:block;margin-top:5px;font-size:11.5px;color:var(--dim)}
.empty-why .ew-list{display:block;margin-top:7px;font-size:11.5px;color:var(--dim2);
  font-family:var(--mono);word-break:keep-all}
/* 이 요금제에서 볼 수 없는 앵커. 담긴 것은 그대로 두되 구분은 되어야 한다. */
.chip.locked{background:rgba(123,107,168,.11);box-shadow:inset 0 0 0 1px rgba(123,107,168,.34);
  color:#9b8ac4}
.chip.locked .x{color:rgba(155,138,196,.6)}
.chip.locked .x:hover{background:rgba(123,107,168,.2);color:#c3b3e0}

/* ══ 로그인 유도 ═══════════════════════════════════════════
   사이드바 맨 아래, 계정 칸 바로 위. 로그인이 있는 판에서만 뜬다.

   짜임은 ChatGPT 첫 화면의 같은 자리를 따랐다 — 굵은 한 줄로 **얻는 것**을
   말하고, 작은 글씨로 풀고, 전체 폭 버튼 하나. 위쪽 선으로 메뉴와 갈라 둔다.
   버튼을 테두리만 있는 형태로 두는 것은, 이것이 지금 당장 해야 할 일이 아니라
   해도 좋은 일이기 때문이다 — 채운 버튼은 재촉으로 읽힌다. */
.login-cta{display:flex;flex-direction:column;gap:5px;padding:13px 13px 12px;
  border-top:1px solid var(--line)}
.login-cta b{font-size:12.5px;font-weight:600;color:var(--text)}
.login-cta span{font-size:11.5px;line-height:1.55;color:var(--dim)}
.login-btn{margin-top:7px;height:34px;border-radius:17px;font-size:12.5px;font-weight:500;
  color:var(--text);box-shadow:inset 0 0 0 1px var(--line2);width:100%}
.login-btn:hover{box-shadow:inset 0 0 0 1px var(--dim2);background:var(--line)}

/* 우상단 로그인. 사이드바 아래 유도와 같은 일을 하되 늘 보이는 자리다.
   채운 단추로 둔다 — 여기는 '해도 좋은 일'을 알리는 자리가 아니라
   마음먹은 사람이 곧장 누르는 자리다. 설명은 사이드바 쪽이 맡는다. */
.top-login{height:28px;padding:0 14px;border-radius:14px;font-size:12.5px;font-weight:600;
  background:var(--anchor,#6ea8fe);color:#0b1220;flex:none}
.top-login:hover{filter:brightness(1.08)}
