/* 知识图谱：视觉结构沿用 Codebase Memory Graph 的深色侧栏与星河画布。 */
.kg-view{position:relative!important;overflow:hidden!important;padding:0!important;background:#070a10!important;color:#dce8ed}
.kg-shell{position:absolute;inset:0;display:grid;grid-template-rows:48px minmax(0,1fr);background:#070a10;font-family:var(--font-body)}
.kg-head{display:flex;align-items:center;gap:18px;padding:0 16px;border-bottom:1px solid rgba(89,172,167,.12);background:#091920;z-index:8}
.kg-brand{display:flex;align-items:center;gap:9px;font-size:13px;font-weight:650;color:#d9e7ea;white-space:nowrap}
.kg-brand-mark{width:8px;height:8px;border-radius:50%;background:#28bea5;box-shadow:0 0 12px rgba(40,190,165,.8)}
.kg-tabs{display:flex;align-items:center;gap:4px;height:100%}
.kg-tab{height:32px;padding:0 13px;border:0;border-radius:7px;background:transparent;color:#66858d;font-size:12px;cursor:pointer;text-decoration:none;display:inline-flex;align-items:center}
.kg-tab:hover{color:#a8c5cb;background:rgba(255,255,255,.025)}
.kg-tab.active{color:#38c2aa;background:rgba(40,190,165,.13)}
.kg-back{height:31px;margin-left:2px;padding:0 12px;border:1px solid rgba(82,218,195,.48);border-radius:7px;background:#155f59;color:#eafffb;font-size:10.5px;font-weight:650;cursor:pointer;box-shadow:0 0 16px rgba(40,190,165,.16)}
.kg-back:hover{color:#fff;background:#1b756c;border-color:rgba(111,235,214,.7)}
.kg-head-stats{margin-left:auto;color:#58747b;font:11px var(--font-mono)}
.kg-head-state{padding:5px 9px;border-radius:7px;background:#0d222a;color:#68bfb2;font:10px var(--font-mono)}
.kg-body{min-height:0;display:grid;grid-template-columns:244px minmax(0,1fr);position:relative}
.kg-sidebar{min-height:0;overflow-y:auto;padding:15px 13px 20px;background:rgba(8,25,32,.96);border-right:1px solid rgba(89,172,167,.12);z-index:5;scrollbar-width:thin;scrollbar-color:#1d3b43 transparent}
.kg-side-title{display:flex;justify-content:space-between;align-items:center;margin:0 0 11px;color:#6d858b;font:10px var(--font-mono);letter-spacing:.13em;text-transform:uppercase}
.kg-side-actions{display:flex;gap:7px}
.kg-linkbtn{border:0;background:transparent;padding:0;color:#2f857a;font-size:9px;cursor:pointer}
.kg-linkbtn:hover{color:#4bd4bd}
.kg-filter-list{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:18px}
.kg-filter{display:flex;align-items:center;gap:6px;min-height:24px;padding:3px 8px;border:1px solid rgba(129,175,185,.11);border-radius:6px;background:#0c222a;color:#789198;font:10px var(--font-mono);cursor:pointer;transition:.16s ease}
.kg-filter:hover{border-color:rgba(129,175,185,.24);color:#b3c6ca}
.kg-filter.off{opacity:.28;background:#08161b}
.kg-filter-key{color:var(--kg-color,#62c8b4)}
.kg-filter-count{color:#425e65}
.kg-search{width:100%;height:34px;border:1px solid rgba(129,175,185,.14);border-radius:7px;background:#0c2028;color:#c6dadd;padding:0 10px;outline:none;font-size:11px;margin:2px 0 13px}
.kg-search:focus{border-color:rgba(50,192,170,.48);box-shadow:0 0 0 2px rgba(50,192,170,.07)}
.kg-search::placeholder{color:#3e5960}
.kg-check{display:flex;align-items:center;gap:8px;color:#638087;font-size:10.5px;margin:9px 0;cursor:pointer}
.kg-check input{accent-color:#26ae98}
.kg-source-note{font-size:9.5px;color:#45636a;line-height:1.65;border-top:1px solid rgba(129,175,185,.1);padding-top:12px;margin-top:15px}
.kg-source-note b{color:#6e9ca4;font-weight:500}
.kg-stage{position:relative;min-width:0;min-height:0;overflow:hidden;background:#070a10}
.kg-canvas{position:absolute;inset:0;width:100%;height:100%;display:block;cursor:grab;touch-action:none}
.kg-canvas.dragging{cursor:grabbing}
.kg-overlay{position:absolute;top:14px;left:15px;z-index:3;pointer-events:none;color:rgba(190,215,219,.38);font:10px var(--font-mono);line-height:1.7}
.kg-overlay strong{display:block;color:rgba(225,239,241,.58);font-weight:500}
.kg-toolbar{position:absolute;top:14px;right:14px;z-index:4;display:flex;align-items:center;gap:7px}
.kg-control{height:31px;border:1px solid rgba(129,175,185,.14);border-radius:7px;background:rgba(8,25,32,.88);color:#86a5ab;padding:0 10px;font-size:10.5px;cursor:pointer;backdrop-filter:blur(8px)}
.kg-control:hover{color:#d3e4e7;border-color:rgba(129,175,185,.28)}
.kg-budget{display:flex;align-items:center;gap:6px;height:31px;padding:0 8px;border:1px solid rgba(129,175,185,.14);border-radius:7px;background:rgba(8,25,32,.88);color:#4e6c73;font:9px var(--font-mono)}
.kg-budget input{width:55px;border:0;outline:0;background:transparent;color:#87cfca;text-align:right;font:10px var(--font-mono)}
.kg-detail{position:absolute;top:0;right:0;bottom:0;width:300px;z-index:7;overflow-y:auto;padding:17px 16px 25px;background:rgba(8,25,32,.97);border-left:1px solid rgba(129,175,185,.14);transform:translateX(102%);transition:transform .22s ease;box-shadow:-20px 0 40px rgba(0,0,0,.18)}
.kg-detail.open{transform:translateX(0)}
.kg-detail-close{position:absolute;right:12px;top:10px;border:0;background:transparent;color:#5d7b82;font-size:17px;cursor:pointer}
.kg-detail-type{display:inline-flex;margin:4px 0 10px;padding:4px 7px;border:1px solid color-mix(in srgb,var(--kg-color) 35%,transparent);border-radius:5px;color:var(--kg-color);font:9px var(--font-mono);letter-spacing:.08em}
.kg-detail h3{margin:0 28px 7px 0;color:#e5eff1;font-size:16px;line-height:1.5;font-weight:650}
.kg-detail-sub{color:#4f7078;font:9.5px var(--font-mono);word-break:break-all;line-height:1.55}
.kg-meta{margin-top:16px;border-top:1px solid rgba(129,175,185,.12)}
.kg-meta-row{padding:9px 0;border-bottom:1px solid rgba(129,175,185,.08)}
.kg-meta-k{display:block;color:#4d6870;font-size:9.5px;margin-bottom:4px}
.kg-meta-v{display:block;color:#9fb8bd;font-size:11px;line-height:1.65;word-break:break-word;white-space:pre-wrap}
.kg-neighbors{margin-top:17px}
.kg-neighbors h4{margin:0 0 9px;color:#657f86;font:10px var(--font-mono);letter-spacing:.09em;text-transform:uppercase}
.kg-neighbor{display:block;width:100%;border:0;border-radius:6px;background:transparent;color:#7e9ba1;padding:6px 7px;text-align:left;font-size:10.5px;cursor:pointer}
.kg-neighbor:hover{color:#d3e4e7;background:rgba(255,255,255,.035)}
.kg-neighbor small{color:#3e5c64;margin-left:5px}
.kg-expand-doc{width:100%;margin-top:13px;padding:9px 11px;border:1px solid rgba(29,162,126,.45);
  border-radius:7px;background:rgba(29,162,126,.14);color:#8ee3c4;font-size:11px;font-weight:650;cursor:pointer}
.kg-expand-doc:hover{background:rgba(29,162,126,.24);color:#d4fff0}
.kg-doc-back{border-color:rgba(29,162,126,.4)!important;color:#8ee3c4!important}
.kg-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#49636a;font-size:12px;text-align:center;line-height:1.9}
.kg-loading-dot{display:inline-block;width:7px;height:7px;margin-right:8px;border-radius:50%;background:#3cd0b8;box-shadow:0 0 14px rgba(60,208,184,.8);animation:kgPulse 1.2s ease-in-out infinite}
@keyframes kgPulse{50%{opacity:.35;transform:scale(.72)}}
.kg-source-wrap{position:absolute;inset:0;display:none;background:#070a10}
.kg-source-wrap.active{display:block}
.kg-source-frame{width:100%;height:100%;border:0;background:#070a10}
.kg-source-hint{position:absolute;left:16px;bottom:14px;z-index:2;padding:7px 10px;border:1px solid rgba(129,175,185,.14);border-radius:7px;background:rgba(8,25,32,.9);color:#53747b;font-size:9.5px;pointer-events:none}

body.kg-active>.app>.sidebar{display:none}
body.kg-active>.app>.main{width:100%;max-width:none}
body.kg-active>.app>.main>.topbar{display:none}
body.kg-active .kg-view{inset:0;height:100vh}

@media(max-width:920px){
  .kg-body{grid-template-columns:190px minmax(0,1fr)}
  .kg-detail{width:270px}
  .kg-head-stats{display:none}
}
@media(max-width:680px){
  /* 侧栏改成抽屉后 .kg-body 退成块级，<main> 没有内容撑高就塌成 0，
     画布拿不到尺寸 → 整块黑屏。这里显式把画布区撑满。 */
  .kg-body{display:block}
  .kg-stage{height:100%}
  .kg-sidebar{position:absolute;left:0;top:0;bottom:0;width:210px;transform:translateX(-100%);transition:transform .2s ease;box-shadow:18px 0 32px rgba(0,0,0,.3)}
  .kg-shell.filters-open .kg-sidebar{transform:translateX(0)}
  .kg-toolbar{left:10px;right:10px;justify-content:flex-end;flex-wrap:wrap}
  .kg-detail{width:min(88vw,310px)}
  .kg-head{gap:8px;padding:0 9px}
  .kg-brand{font-size:11px}
  .kg-back{padding:0 7px}
  .kg-tab{padding:0 8px}
  .kg-head-state{display:none}
}


/* ============================================================================
 * 对齐 codebase-memory Graph UI（http://127.0.0.1:9749/?tab=graph）
 *
 * 下面的数值不是估的，是从那个界面上直接读的计算样式：
 *   底色 rgb(10,22,26) / 文字 rgb(224,237,237) / 正文 Inter / 等宽 JetBrains Mono
 *   分区标题 11px·500·50% 透明 / 次级标题 10px·500·40%
 *   筛选芯片 bg rgba(255,255,255,.04) + 1px rgba(255,255,255,.08) + 圆角 6px + 3px 6px
 *   搜索框 bg .04 / 边框 .06 / 圆角 8px / 12px
 *   强调色（All·None 这类链接）rgba(29,162,126,.7)
 * ========================================================================== */

/* 画布底色 #06090f 与原实现的 Canvas background 同值；侧栏用 #0a161a 保持层次 */
.kg-view, .kg-shell{ background:#0a161a!important }
.kg-stage, .kg-stage canvas{ background:#06090f!important }
.kg-shell{
  color:#e0eded;
  font-family:Inter,system-ui,-apple-system,"PingFang SC",sans-serif;
}

.kg-head{
  background:#0a161a;
  border-bottom:1px solid rgba(255,255,255,.06);
}
.kg-sidebar{
  background:#0a161a;
  border-right:1px solid rgba(255,255,255,.06);
}

/* 分区标题：全大写、半透明、字重 500 —— 参考界面 FILTERS / NODE TYPES 的写法。
 * 本机没装 Inter / JetBrains Mono（内网部署也不便去 CDN 取），字体栈里保留了它们，
 * 装了就用，没装退回系统字体——字形接近，度量参数才是观感的主要来源。 */
.kg-side-title{
  margin:0 0 10px!important;
  font:500 10px Inter,system-ui,-apple-system,sans-serif!important;
  color:rgba(224,237,237,.4)!important;
  letter-spacing:.06em!important;
}
.kg-side-title:has(.kg-side-actions){          /* Filters 那一行，参考界面里更亮一档 */
  font-size:11px!important; color:rgba(224,237,237,.5)!important;
}

/* 筛选芯片 */
.kg-filter{
  gap:5px!important; min-height:0!important;
  padding:3px 6px!important; border-radius:6px!important;
  border:1px solid rgba(255,255,255,.08)!important;
  background:rgba(255,255,255,.04)!important;
  color:#e0eded!important;
  font:500 10px Inter,system-ui,sans-serif!important;
  transition:background .12s ease, border-color .12s ease!important;
}
.kg-filter:hover{ background:rgba(255,255,255,.08)!important; border-color:rgba(255,255,255,.14)!important }
.kg-filter.off{ opacity:.35!important; background:rgba(255,255,255,.02)!important }
/* 类型色点：5×5 圆点，和参考界面一致 */
.kg-filter::before{
  content:''; width:5px; height:5px; border-radius:50%;
  background:var(--kg-color,#64748b); flex-shrink:0;
}
/* 参考界面里只有圆点带类型色，标签文字是统一的中性色 */
.kg-filter-key{ color:#e0eded!important }
.kg-filter-count{ color:rgba(224,237,237,.35)!important; font-variant-numeric:tabular-nums }
.kg-filter-list{ gap:5px!important }

.kg-linkbtn{ color:rgba(29,162,126,.7)!important; font-size:10px!important }
.kg-linkbtn:hover{ color:rgba(29,162,126,1)!important }

.kg-search{
  height:auto!important; padding:6px 12px!important;
  border-radius:8px!important;
  border:1px solid rgba(255,255,255,.06)!important;
  background:rgba(255,255,255,.04)!important;
  color:#e0eded!important; font-size:12px!important;
}
.kg-search::placeholder{ color:rgba(224,237,237,.3)!important }
.kg-search:focus{ border-color:rgba(29,162,126,.5)!important; box-shadow:none!important }

/* 画布左上角的统计文字：等宽、30% 白 */
.kg-overlay{
  font:11px "JetBrains Mono",ui-monospace,SFMono-Regular,monospace!important;
  color:rgba(255,255,255,.3)!important;
}
.kg-overlay strong{ color:rgba(255,255,255,.55)!important; font-weight:500 }

.kg-head-state{
  background:transparent!important;
  color:rgba(255,255,255,.3)!important;
  font:11px "JetBrains Mono",ui-monospace,monospace!important;
}
.kg-brand-mark{ background:#1da27e; box-shadow:0 0 10px rgba(29,162,126,.7) }
.kg-tab.active{ color:#1da27e!important; background:rgba(29,162,126,.12)!important }
.kg-back{
  background:rgba(29,162,126,.14)!important; border-color:rgba(29,162,126,.45)!important;
  color:#8ee3c4!important; box-shadow:none!important;
}
.kg-back:hover{ background:rgba(29,162,126,.24)!important; color:#c7f5e4!important }

.kg-control{
  border-radius:8px!important;
  border:1px solid rgba(255,255,255,.08)!important;
  background:rgba(255,255,255,.04)!important;
  color:rgba(224,237,237,.75)!important; font-size:11px!important;
}
.kg-control:hover{ background:rgba(255,255,255,.09)!important; color:#e0eded!important }
.kg-budget{
  border-radius:8px!important;
  border:1px solid rgba(255,255,255,.08)!important;
  background:rgba(255,255,255,.04)!important;
  color:rgba(224,237,237,.4)!important;
  font:10px "JetBrains Mono",ui-monospace,monospace!important;
}
.kg-budget input{ color:#e0eded!important; font:11px "JetBrains Mono",ui-monospace,monospace!important }

.kg-detail{
  background:#0c1a1f!important;
  border-left:1px solid rgba(255,255,255,.08)!important;
  transition:transform .18s cubic-bezier(.22,1,.36,1)!important;
  will-change:transform;
}
.kg-neighbor{
  border-radius:6px!important;
  border:1px solid rgba(255,255,255,.08)!important;
  background:rgba(255,255,255,.04)!important;
  color:#e0eded!important; font-size:11px!important;
  transition:background .12s ease!important;
}
.kg-neighbor:hover{ background:rgba(255,255,255,.09)!important }

/* WebGL 画布：交给 OrbitControls，浏览器自己的手势/选中都要让开 */
.kg-stage canvas{
  transition:none!important; display:block;
  cursor:grab; touch-action:none; outline:none; user-select:none;
}
.kg-stage canvas:active{ cursor:grabbing }
@media (prefers-reduced-motion: reduce){ .kg-detail{ transition:none!important } }

/* 显示设置滑杆 + 恒星分类图例 —— 对应上游的 DisplaySettingsMenu 与 STELLAR_LEGEND */
.kg-sliders{display:flex;flex-direction:column;gap:9px;margin-bottom:4px}
.kg-slider{display:flex;flex-direction:column;gap:4px}
.kg-slider span{
  display:flex;justify-content:space-between;
  font:500 10px Inter,system-ui,sans-serif;color:rgba(224,237,237,.5);
}
.kg-slider b{color:rgba(224,237,237,.85);font:400 10px "JetBrains Mono",ui-monospace,monospace}
.kg-slider input[type=range]{
  -webkit-appearance:none;appearance:none;width:100%;height:3px;border-radius:2px;
  background:rgba(255,255,255,.12);outline:none;cursor:pointer;
}
.kg-slider input[type=range]::-webkit-slider-thumb{
  -webkit-appearance:none;width:11px;height:11px;border-radius:50%;
  background:#1da27e;box-shadow:0 0 6px rgba(29,162,126,.6);cursor:pointer;
}
.kg-slider input[type=range]::-moz-range-thumb{
  width:11px;height:11px;border:0;border-radius:50%;
  background:#1da27e;box-shadow:0 0 6px rgba(29,162,126,.6);cursor:pointer;
}

.kg-legend{display:flex;flex-direction:column;gap:5px}
.kg-legend-row{
  display:flex;align-items:center;gap:6px;
  font:500 10px Inter,system-ui,sans-serif;color:rgba(224,237,237,.7);
}
.kg-legend-row i{width:5px;height:5px;border-radius:50%;flex-shrink:0}
.kg-legend-row small{margin-left:auto;color:rgba(224,237,237,.32);font-size:9px}
