:root{
  --bg:#0e1116; --panel:#141922; --panel2:#1a2029; --line:#262d39; --line2:#1f2630;
  --text:#e6e9ef; --muted:#8b95a7; --accent:#3ecf8e; --accent-d:#2aa971; --accent-bg:rgba(62,207,142,.12);
  --row-alt:#121720; --row-hover:#1b222d; --sel:#1f3a31; --danger:#ff6b6b;
  --num:#7cc4ff; --str:#e6e9ef; --bool-t:#3ecf8e; --bool-f:#ff8a8a; --json:#d6a8ff;
  --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,"Liberation Mono",monospace;
  --sans:Inter,"Pretendard",-apple-system,"Segoe UI","Noto Sans KR",system-ui,sans-serif;
}
:root[data-theme=light]{
  --bg:#f6f7f9; --panel:#fff; --panel2:#f1f3f6; --line:#e2e6ec; --line2:#eceff3;
  --text:#1b2330; --muted:#6a7588; --accent:#12a36b; --accent-d:#0e8758; --accent-bg:rgba(18,163,107,.1);
  --row-alt:#fafbfc; --row-hover:#eef6f2; --sel:#dff3e9; --danger:#d63b3b;
  --num:#0b6fc2; --str:#1b2330; --bool-t:#0e8758; --bool-f:#d63b3b; --json:#7c3fc4;
}
*{box-sizing:border-box}
html,body{height:100%}
body{margin:0;background:var(--bg);color:var(--text);font:13.5px/1.45 var(--sans);-webkit-font-smoothing:antialiased}
button,input,select,textarea{font:inherit;color:inherit}
.muted{color:var(--muted)} .small{font-size:12px} .grow{flex:1}
::-webkit-scrollbar{width:11px;height:11px} ::-webkit-scrollbar-thumb{background:#39424f;border-radius:8px;border:2px solid transparent;background-clip:padding-box}
::-webkit-scrollbar-thumb:hover{background:#4a5565;background-clip:padding-box;border:2px solid transparent}
::-webkit-scrollbar-corner{background:transparent}

/* buttons */
.btn,.ghost,.btn-primary{border:1px solid var(--line);background:var(--panel2);border-radius:8px;padding:6px 12px;cursor:pointer;transition:.15s}
.btn:hover{border-color:#3b4656;background:var(--row-hover)}
.btn.icon{padding:6px 10px;min-width:34px}
.btn:disabled{opacity:.4;cursor:default}
.ghost{background:transparent;border-color:transparent;color:var(--muted)} .ghost:hover{color:var(--text);background:var(--panel2)}
.btn-primary{background:var(--accent);border-color:var(--accent);color:#04140d;font-weight:650}
.btn-primary:hover{background:var(--accent-d);border-color:var(--accent-d)} .btn-primary.sm{padding:5px 14px}
.btn-primary:disabled{opacity:.6;cursor:default}

/* login */
.login-body{display:grid;place-items:center;min-height:100%;
  background:radial-gradient(900px 500px at 50% -10%,rgba(62,207,142,.14),transparent),var(--bg)}
.login-card{width:min(380px,calc(100vw - 32px));background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:34px 30px;box-shadow:0 20px 60px rgba(0,0,0,.45)}
.login-card h1{margin:14px 0 4px;font-size:21px;letter-spacing:-.2px}
.login-card .sub{margin:0 0 24px;color:var(--muted)}
.login-card label{display:block;margin-bottom:14px;color:var(--muted);font-size:12px}
.login-card input{display:block;width:100%;margin-top:6px;padding:10px 12px;background:var(--bg);border:1px solid var(--line);border-radius:9px;color:var(--text);outline:none;font-size:14px}
.login-card input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-bg)}
.login-card .btn-primary{width:100%;padding:11px;margin-top:6px;font-size:14px}
.err{min-height:18px;color:var(--danger);font-size:12.5px;margin-bottom:6px}
.logo-mark{display:inline-grid;place-items:center;width:46px;height:46px;border-radius:12px;background:var(--accent-bg);color:var(--accent);border:1px solid rgba(62,207,142,.3)}
.logo-mark.sm{width:30px;height:30px;border-radius:8px}

/* layout */
.app{display:grid;grid-template-columns:272px 1fr;height:100vh}
.sidebar{background:var(--panel);border-right:1px solid var(--line);display:flex;flex-direction:column;min-height:0}
.brand{display:flex;gap:10px;align-items:center;padding:14px 14px 10px}
.brand b{display:block;font-size:14px} .brand small{color:var(--muted);font-size:11px}
.side-search{padding:4px 12px 10px}
.side-search input{width:100%;padding:7px 10px;border-radius:8px;border:1px solid var(--line);background:var(--bg);outline:none}
.side-search input:focus,.search input:focus{border-color:var(--accent)}
.tree{flex:1;overflow:auto;padding:0 6px 10px}
.db{margin:2px 0}
.db-h,.sch-h{display:flex;align-items:center;gap:7px;padding:6px 8px;border-radius:7px;cursor:pointer;user-select:none}
.db-h:hover,.sch-h:hover,.tb:hover{background:var(--panel2)}
.db-h b{font-weight:600}
.db-h .sz{margin-left:auto;font-size:11px;color:var(--muted)}
.caret{width:10px;color:var(--muted);transition:transform .12s;font-size:9px} .open>.db-h .caret,.open>.sch-h .caret{transform:rotate(90deg)}
.db-body,.sch-body{display:none} .open>.db-body,.open>.sch-body{display:block}
.sch-h{padding-left:20px;color:var(--muted);font-size:12px;text-transform:uppercase;letter-spacing:.5px;font-weight:600}
.tb{display:flex;align-items:center;gap:8px;padding:5px 8px 5px 38px;border-radius:7px;cursor:pointer;white-space:nowrap}
.tb .nm{overflow:hidden;text-overflow:ellipsis;flex:1}
.tb .cnt{font-size:11px;color:var(--muted);font-variant-numeric:tabular-nums}
.tb.active{background:var(--accent-bg);color:var(--accent)}
.ico{width:14px;text-align:center;color:var(--muted);font-size:12px} .tb.active .ico{color:var(--accent)}
.dbico{color:var(--accent)}
.side-foot{display:flex;justify-content:space-between;padding:8px 10px;border-top:1px solid var(--line)}

.main{display:flex;flex-direction:column;min-width:0;min-height:0;height:100vh}
.topbar{display:flex;align-items:center;gap:14px;padding:0 18px;height:52px;border-bottom:1px solid var(--line);background:var(--panel);flex:none}
.menu-btn{display:none}
.crumbs{display:flex;align-items:center;gap:8px;min-width:0;white-space:nowrap;overflow:hidden}
.crumbs .sep{color:var(--muted)} .crumbs b{font-size:14px}
.pill{font-size:11px;padding:2px 8px;border-radius:999px;background:var(--panel2);border:1px solid var(--line);color:var(--muted)}
.tabs{margin-left:auto;display:flex;gap:2px;background:var(--bg);border:1px solid var(--line);border-radius:9px;padding:3px}
.tabs button{border:0;background:transparent;color:var(--muted);padding:5px 14px;border-radius:7px;cursor:pointer}
.tabs button.on{background:var(--panel2);color:var(--text);box-shadow:0 1px 0 var(--line)}

.empty{flex:1;display:grid;place-items:center;padding:24px;overflow:auto}
.empty-card{max-width:760px;width:100%}
.empty-card h2{margin:0 0 6px;font-size:20px} .empty-card p{color:var(--muted);margin:0 0 20px}
.dbcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:12px}
.dbcard{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px;cursor:pointer;transition:.15s}
.dbcard:hover{border-color:var(--accent);transform:translateY(-1px)}
.dbcard b{display:block;margin-bottom:4px} .dbcard span{color:var(--muted);font-size:12px}

#dataView,#sqlView,#structView{flex:1;display:flex;flex-direction:column;min-height:0}
[hidden]{display:none!important}
.toolbar{display:flex;align-items:center;gap:8px;padding:10px 18px;flex:none}
.search{display:flex;align-items:center;gap:6px;background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:0 10px;min-width:280px}
.search input{border:0;background:transparent;outline:none;padding:7px 0;width:100%}
.search span{color:var(--muted)}

/* grid */
.gridwrap{flex:1;overflow:auto;margin:0 18px;border:1px solid var(--line);border-radius:12px;background:var(--panel);min-height:0;position:relative}
table.grid{border-collapse:separate;border-spacing:0;table-layout:fixed;font-size:13px}
.grid th{position:sticky;top:0;z-index:3;background:var(--panel2);text-align:left;font-weight:600;padding:0;height:38px;border-bottom:1px solid var(--line);border-right:1px solid var(--line2);user-select:none}
.grid th .hc{display:flex;align-items:center;gap:6px;padding:0 12px;height:100%;cursor:pointer;overflow:hidden;white-space:nowrap}
.grid th .hc:hover{background:var(--row-hover)}
.grid th .tn{overflow:hidden;text-overflow:ellipsis}
.grid th .ty{font:11px var(--mono);color:var(--muted);font-weight:400;overflow:hidden;text-overflow:ellipsis}
.grid th .arrow{color:var(--accent);margin-left:auto;font-size:11px}
.grid th .key{color:#f5c04a;font-size:11px}
.grid th .rs{position:absolute;right:0;top:0;bottom:0;width:6px;cursor:col-resize;z-index:4}
.grid th .rs:hover,.grid th .rs.drag{background:var(--accent)}
.grid td{padding:0 12px;height:34px;border-bottom:1px solid var(--line2);border-right:1px solid var(--line2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:0}
.grid tbody tr:nth-child(even) td{background:var(--row-alt)}
.grid tbody tr:hover td{background:var(--row-hover)}
.grid tbody tr.sel td{background:var(--sel)}
.grid .rn{position:sticky;left:0;z-index:2;width:56px;min-width:56px;text-align:right;color:var(--muted);font:11.5px var(--mono);background:var(--panel2)!important;cursor:pointer;padding-right:10px}
.grid th.rn{z-index:5;cursor:default}
.grid .rn:hover{color:var(--accent)}
.grid td.num{text-align:right;font-family:var(--mono);color:var(--num);font-variant-numeric:tabular-nums}
.grid td.mono{font-family:var(--mono);font-size:12.5px}
.grid td.json{font-family:var(--mono);font-size:12px;color:var(--json)}
.grid td.nul{color:var(--muted);font-style:italic;opacity:.65}
.grid td.bool span{display:inline-block;padding:1px 9px;border-radius:999px;font-size:11.5px;font-weight:600}
.grid td.bool .t{background:rgba(62,207,142,.14);color:var(--bool-t)} .grid td.bool .f{background:rgba(255,107,107,.14);color:var(--bool-f)}
.grid td{cursor:default} .grid td:active{background:var(--accent-bg)}
.nodata{padding:60px;text-align:center;color:var(--muted)}
.loading{position:absolute;inset:0;background:color-mix(in srgb,var(--panel) 60%,transparent);display:grid;place-items:center;z-index:9;color:var(--muted)}

.pager{display:flex;align-items:center;gap:8px;padding:10px 18px 14px;flex:none}
.pager select,.pgnum input{background:var(--panel);border:1px solid var(--line);border-radius:7px;padding:5px 8px;outline:none}
.pgnum input{width:54px;text-align:center}
.pgnum{display:flex;gap:6px;align-items:center;color:var(--muted)}

/* panels */
.panel{overflow:auto;padding:18px}
.stbl{width:100%;border-collapse:collapse;background:var(--panel);border:1px solid var(--line);border-radius:12px;overflow:hidden}
.stbl th,.stbl td{padding:9px 14px;text-align:left;border-bottom:1px solid var(--line2)}
.stbl th{background:var(--panel2);color:var(--muted);font-weight:600;font-size:12px}
.stbl td.mono{font-family:var(--mono);font-size:12.5px}
.tag{font-size:11px;padding:1px 7px;border-radius:5px;margin-right:4px;background:var(--panel2);border:1px solid var(--line)}
.tag.pk{color:#f5c04a;border-color:rgba(245,192,74,.4)} .tag.nn{color:var(--muted)}
.sqlpanel{padding:14px 18px;gap:10px;overflow:hidden}
.sqlbar{display:flex;align-items:center;gap:10px}
#sql{width:100%;height:150px;resize:vertical;background:var(--bg);border:1px solid var(--line);border-radius:10px;padding:12px;font:13px/1.55 var(--mono);outline:none;flex:none}
#sql:focus{border-color:var(--accent)}
.sqlmsg{font-size:12.5px;min-height:18px;color:var(--muted)} .sqlmsg.bad{color:var(--danger);white-space:pre-wrap}
.sqlpanel .gridwrap{margin:0}

/* drawer */
.drawer{position:fixed;top:0;right:0;bottom:0;width:min(440px,100vw);background:var(--panel);border-left:1px solid var(--line);box-shadow:-20px 0 50px rgba(0,0,0,.35);z-index:50;display:flex;flex-direction:column}
.drawer-head{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid var(--line)}
.drawer-body{overflow:auto;padding:6px 16px 20px}
.f{padding:11px 0;border-bottom:1px solid var(--line2)}
.f .k{display:flex;gap:8px;align-items:center;font-size:12px;color:var(--muted);margin-bottom:5px}
.f .k i{font:11px var(--mono);opacity:.7;font-style:normal}
.f .v{white-space:pre-wrap;word-break:break-word;font-family:var(--mono);font-size:12.5px;background:var(--bg);border:1px solid var(--line2);border-radius:8px;padding:8px 10px;max-height:260px;overflow:auto;cursor:copy}
.f .v.nul{color:var(--muted);font-style:italic}
.toast{position:fixed;bottom:22px;left:50%;transform:translate(-50%,20px);background:var(--panel2);border:1px solid var(--line);padding:8px 16px;border-radius:9px;opacity:0;pointer-events:none;transition:.2s;z-index:99}
.toast.show{opacity:1;transform:translate(-50%,0)}

@media (max-width:820px){
  .app{grid-template-columns:1fr}
  .sidebar{position:fixed;inset:0 auto 0 0;width:280px;z-index:40;transform:translateX(-100%);transition:.2s}
  .app.menu .sidebar{transform:none;box-shadow:20px 0 50px rgba(0,0,0,.5)}
  .menu-btn{display:block}
  .search{min-width:0;flex:1} .toolbar{flex-wrap:wrap} #sortInfo{display:none}
  .gridwrap,.toolbar,.pager{margin-left:10px;margin-right:10px} .toolbar,.pager{padding-left:0;padding-right:0}
  .tabs{margin-left:auto}
}
