/* HDFS tunnel queue (modal opened from the HDFS health card) */
.hcard[data-act]{cursor:pointer}.hcard[data-act]:hover{box-shadow:var(--sh-2)}
.tn{display:flex;flex-direction:column;gap:var(--sp-3);min-width:0}
.tn h5{margin:var(--sp-2) 0 0;font-size:var(--fs-2);font-weight:600;color:var(--fg-3);text-transform:uppercase;letter-spacing:.04em;display:flex;gap:var(--sp-2);align-items:baseline}
.tn h5 .hint,.tn h5 .mono{text-transform:none;letter-spacing:0;font-weight:400}
.tn-conn{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-3);border-radius:var(--r12);background:var(--bg-2)}
.tn-hop{display:flex;align-items:center;gap:var(--sp-2);min-width:0;flex:0 1 auto}
.tn-hop .hdot{flex:none}
@media (max-width:760px){.tn-conn{flex-direction:column;align-items:flex-start}.tn-conn>i{display:none}}
.tn-hop div{display:flex;flex-direction:column;min-width:0}.tn-hop b{font-size:var(--fs-3);font-weight:600}
.tn-hop span:not(.hdot){font-size:var(--fs-1);color:var(--fg-3);overflow-wrap:anywhere}
.tn-conn>i{flex:1 0 18px;min-width:18px;height:2px;background:var(--ok);border-radius:2px}
.tn-conn>i.warn{background:repeating-linear-gradient(90deg,var(--warn) 0 6px,transparent 6px 11px)}
.tn-conn>i.err{background:repeating-linear-gradient(90deg,var(--err) 0 6px,transparent 6px 11px)}
.tn-form{display:flex;gap:var(--sp-2);align-items:center;flex-wrap:wrap}
.tn-form select,.tn-form input{height:28px;border-radius:var(--r8);box-shadow:0 0 0 1px var(--line-2);border:0;background:var(--bg);color:var(--fg);padding:0 var(--sp-2);font-size:var(--fs-3)}
.tn-form #tn-arg{flex:1 1 260px;min-width:0}.tn-form #tn-limit{width:70px}.tn-form input:disabled{background:var(--bg-2);color:var(--fg-3)}
.tn table.tn-q{width:100%;display:table;border-collapse:collapse;font-size:var(--fs-2);margin:0}
.tn-q th{text-align:left;font-weight:500;color:var(--fg-3);padding:4px var(--sp-2);border-bottom:1px solid var(--line);white-space:nowrap;position:sticky;top:0;background:var(--bg)}
.tn-q td{padding:5px var(--sp-2);border-bottom:1px solid var(--line-soft);vertical-align:top}
.tn-q .r{text-align:right}.tn-q .ell{max-width:340px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tn-q tbody tr[data-id]{cursor:pointer}.tn-q tbody tr[data-id]:hover{background:var(--bg-2)}.tn-q tbody tr.on{background:var(--accent-soft)}
.tn-scroll{overflow:auto;max-height:340px;border-radius:var(--r8);box-shadow:0 0 0 1px var(--line)}
.tn-res td{font-family:var(--mono);white-space:nowrap;max-width:320px;overflow:hidden;text-overflow:ellipsis}
.tn-meta{display:flex;flex-wrap:wrap;gap:var(--sp-1) var(--sp-4);font-size:var(--fs-2);font-family:var(--mono);overflow-wrap:anywhere}
.tn-meta i{font-style:normal;color:var(--fg-3);font-family:var(--sans,inherit)}
.tn-chips{display:flex;flex-wrap:wrap;gap:var(--sp-1)}
#tn-result:empty{display:none}#tn-result{display:flex;flex-direction:column;gap:var(--sp-2)}
.tn-hop b{white-space:nowrap}.tn-hop:first-child{flex:none}
.tn .note{display:block}.tn .note .spin{vertical-align:-2px;margin-right:6px}
.tn-mode{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap}
.tn-form #tn-tables{flex:1 1 100%;order:5}
/* setup walkthrough */
.tn-steps{border-radius:var(--r12);box-shadow:0 0 0 1px var(--line);padding:0 var(--sp-3)}
.tn-steps summary{display:flex;align-items:center;gap:var(--sp-2);padding:var(--sp-2) 0;cursor:pointer;list-style:none}
.tn-steps summary::-webkit-details-marker{display:none}
.tn-steps summary::before{content:'▸';color:var(--fg-3);font-size:11px}.tn-steps[open] summary::before{content:'▾'}
.tn-steps summary b{font-size:var(--fs-3);font-weight:600}.tn-steps summary .hint{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.tn-steps ol{list-style:none;margin:0;padding:0 0 var(--sp-3)}
.tn-steps li{display:grid;grid-template-columns:24px minmax(0,1fr);gap:var(--sp-3);position:relative;padding-bottom:var(--sp-3)}
.tn-steps li:last-child{padding-bottom:0}
.tn-steps li:not(:last-child)::before{content:'';position:absolute;left:11px;top:24px;bottom:0;width:2px;background:var(--line)}
.tn-steps li.done:not(:last-child)::before{background:var(--ok)}
.tn-steps .n{width:24px;height:24px;border-radius:50%;display:grid;place-items:center;font:600 var(--fs-2) var(--mono);background:var(--bg-3);color:var(--fg-3);position:relative}
.tn-steps li.done .n{background:var(--ok);color:#fff}.tn-steps li.cur .n{background:var(--fg);color:var(--bg)}
.tn-steps li b{font-size:var(--fs-3);font-weight:600}.tn-steps li:not(.done):not(.cur) b{color:var(--fg-2)}
.tn-steps p{margin:2px 0 var(--sp-2);font-size:var(--fs-2);color:var(--fg-2);line-height:1.5}
.tn-code{position:relative;margin-bottom:var(--sp-2)}
.tn-code pre{margin:0;padding:var(--sp-2) 64px var(--sp-2) var(--sp-3);border-radius:var(--r8);background:var(--bg-2);font-size:var(--fs-1);line-height:1.6;overflow-x:auto;white-space:pre}
.tn-code .btn{position:absolute;top:6px;right:6px}
.hcard.loading .detail{color:var(--fg-3)}
.tn-coderow{display:flex;align-items:center;gap:var(--sp-3);flex-wrap:wrap;font-size:var(--fs-2);color:var(--fg-2)}
.tn-coderow b{font-size:var(--fs-3);color:var(--fg);font-weight:600}
/* ---- HDFS page ---- */
/* HDFS access is a sub-page of Settings */
#v-settings{grid-template-rows:auto minmax(0,1fr);align-content:start}
.s-tabs{position:sticky;top:0;z-index:3;background:var(--bg)}
.tn-page{max-width:1500px;width:100%;margin:0 auto;padding:var(--sp-5) var(--sp-6);display:flex;flex-direction:column;gap:var(--sp-4)}
.tn-page .s-head{margin-bottom:0}
.tn-cols{display:grid;grid-template-columns:minmax(360px,5fr) minmax(0,7fr);gap:var(--sp-5);align-items:start}
@media (max-width:1100px){.tn-cols{grid-template-columns:minmax(0,1fr)}}
.tn-left,.tn-right{border-radius:var(--r16);box-shadow:var(--sh-1);background:var(--bg);padding:var(--sp-4)}
.tn-left h5:first-child,.tn-right h5:first-child{margin-top:0}
#tn-list{max-height:520px;overflow:auto}
.tn-dh{display:flex;flex-direction:column;gap:var(--sp-1)}
.tn-dh>div:first-child{display:flex;align-items:center;gap:var(--sp-2);font-size:var(--fs-4)}.tn-dh .mono{font-size:var(--fs-1);color:var(--fg-3)}
.tn-run{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(0,1fr);gap:var(--sp-4);align-items:start}
@media (max-width:1300px){.tn-run{grid-template-columns:minmax(0,1fr)}}
.tn-stages{list-style:none;margin:0;padding:0}
.tn-stages li{display:grid;grid-template-columns:20px minmax(0,1fr) auto;gap:var(--sp-2);align-items:start;padding:3px 0;position:relative}
.tn-stages li:not(:last-child)::before{content:'';position:absolute;left:9px;top:22px;bottom:-3px;width:2px;background:var(--line)}
.tn-stages li.done:not(:last-child)::before{background:var(--ok)}
.tn-stages .n{width:20px;height:20px;border-radius:50%;display:grid;place-items:center;font:600 11px var(--mono);background:var(--bg-3);color:var(--fg-3)}
.tn-stages li.done .n{background:var(--ok);color:#fff}.tn-stages li.failed .n{background:var(--err);color:#fff}.tn-stages li.running .n{background:var(--accent-soft)}
.tn-stages .n .spin{width:10px;height:10px}
.tn-stages div{display:flex;flex-direction:column;min-width:0}.tn-stages b{font-size:var(--fs-3);font-weight:600}
.tn-stages li.todo b{color:var(--fg-3);font-weight:500}
.tn-stages span:not(.n):not(.spin){font-size:var(--fs-2);color:var(--fg-2);overflow-wrap:anywhere}.tn-stages li.failed div span{color:var(--err)}
.tn-stages time{font:var(--fs-1) var(--mono);color:var(--fg-3);padding-top:3px}
.tn-air{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--sp-2) var(--sp-3);padding:var(--sp-3);border-radius:var(--r12);background:var(--bg-2)}
.tn-air>div{display:flex;flex-direction:column;gap:2px;min-width:0}.tn-air .wide{grid-column:1/-1}
.tn-air i{font-style:normal;font-size:var(--fs-1);color:var(--fg-3)}.tn-air b{font-size:var(--fs-2);font-weight:500;overflow-wrap:anywhere}
.tn-air .pill{align-self:flex-start}
.tn-tabs{margin-top:var(--sp-2)}
.tn-tabbody{display:flex;flex-direction:column;gap:var(--sp-2);min-width:0}.tn-tabbody h6{margin:var(--sp-2) 0 0;font-size:var(--fs-2);color:var(--fg-3);font-weight:600}
.tn-log{margin:0;padding:var(--sp-3);border-radius:var(--r8);background:var(--bg-2);font-size:var(--fs-1);line-height:1.55;max-height:380px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere}
.tn-log.err{background:var(--err-soft);color:var(--err)}
.tn-code pre.py{max-height:420px;overflow:auto;white-space:pre-wrap;overflow-wrap:anywhere}
.tn-code .k{color:var(--accent-deep);font-weight:600}.tn-code .s{color:var(--ok)}.tn-code .c{color:var(--fg-3)}
.tn-checks{margin:0;padding-left:var(--sp-4);font-size:var(--fs-2);color:var(--fg-2);line-height:1.7}
.tn-right .tn-scroll{max-height:460px}
.tn-stages li.cancelled .n{background:var(--fg-3);color:#fff;font-size:8px}
.tn-dh>div:first-child .grow{flex:1}
/* hints, table cards, timing */
.tn-val{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}
#tn-hints{display:flex;flex-direction:column;gap:var(--sp-2)}#tn-hints:empty{display:none}
.tn-hint{display:flex;gap:var(--sp-2);align-items:flex-start;font-size:var(--fs-2);line-height:1.5;padding:var(--sp-2) var(--sp-3);border-radius:var(--r8);background:var(--bg-2);color:var(--fg-2)}
.tn-hint.warn{background:var(--warn-soft);color:var(--fg)}.tn-hint .pill{flex:none;margin-top:1px}.tn-hint i{color:var(--fg-3)}
.tn-tbl{border-radius:var(--r12);box-shadow:0 0 0 1px var(--line);padding:var(--sp-3);display:flex;flex-direction:column;gap:var(--sp-2);min-width:0}
.tn-tbl .h{display:flex;align-items:center;gap:var(--sp-2);min-width:0}.tn-tbl .h b{font-size:var(--fs-3);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}
.tn-tbl .h .grow{flex:1}
.tn-tbl details summary{cursor:pointer;font-size:var(--fs-2);color:var(--fg-2)}
.tn-cols2{display:flex;flex-wrap:wrap;gap:4px;margin-top:var(--sp-2);max-height:180px;overflow:auto}
.tn-cols2 span{font-size:var(--fs-1);padding:1px 6px;border-radius:var(--r4);background:var(--bg-3);color:var(--fg-2)}
.tn-sql{margin:0;padding:var(--sp-3) 64px var(--sp-3) var(--sp-3);border-radius:var(--r8);background:var(--bg-2);font-size:var(--fs-2);line-height:1.6;white-space:pre-wrap;overflow-wrap:anywhere;max-height:320px;overflow:auto}
.tn-hist{border-radius:var(--r16);box-shadow:var(--sh-1);background:var(--bg);padding:var(--sp-3) var(--sp-4);display:flex;flex-direction:column;gap:var(--sp-2);overflow-x:auto}
.tn-histhead{display:flex;align-items:baseline;gap:var(--sp-3);flex-wrap:wrap}.tn-histhead h5{margin:0;font-size:var(--fs-2);font-weight:600;color:var(--fg-3);text-transform:uppercase;letter-spacing:.04em}
.tn-histhead .grow{flex:1}.tn-hist .lg{display:inline-flex;align-items:center;gap:4px;font-size:var(--fs-1);color:var(--fg-3)}.tn-hist .lg i{width:8px;height:8px;border-radius:2px}
.tn-hist svg{display:block;flex:none}.tn-hist rect.b{cursor:pointer;opacity:.85}.tn-hist rect.b:hover,.tn-hist rect.b.on{opacity:1;stroke:var(--fg);stroke-width:1.5}
.tn-gantt{display:flex;flex-direction:column;gap:6px}
.tn-gantt .axis{display:flex;justify-content:space-between;margin:0 56px 0 112px;font:var(--fs-1) var(--mono);color:var(--fg-3)}
.tn-gantt .row{display:grid;grid-template-columns:104px minmax(0,1fr) 48px;gap:var(--sp-2);align-items:center}
.tn-gantt .l{font-size:var(--fs-2);color:var(--fg-2)}.tn-gantt .d{font-size:var(--fs-1);color:var(--fg-3);text-align:right}
.tn-gantt .track{position:relative;height:14px;border-radius:var(--r4);background:var(--bg-2)}
.tn-gantt .track i{position:absolute;top:0;bottom:0;border-radius:var(--r4);min-width:3px}
.tn-diag{border-radius:var(--r12);background:var(--err-soft);padding:var(--sp-3);display:flex;flex-direction:column;gap:var(--sp-2)}
.tn-diag .h{display:flex;gap:var(--sp-2);align-items:flex-start}.tn-diag .h b{font-size:var(--fs-3);font-weight:600;color:var(--fg)}
.tn-diag p{margin:0;font-size:var(--fs-2);color:var(--fg)}.tn-diag p i{font-style:normal;font-weight:600;margin-right:6px}
.tn-diag pre{margin:0;padding:var(--sp-2) var(--sp-3);border-radius:var(--r8);background:var(--bg);font-size:var(--fs-1);white-space:pre-wrap;overflow-wrap:anywhere;max-height:120px;overflow:auto}
.tn-att{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-2);color:var(--fg-3)}.tn-form #tn-att{width:48px}
/* statistics */
.tn-stats{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:var(--sp-3);padding-bottom:var(--sp-3)}
.tn-stats.compact{grid-template-columns:repeat(2,minmax(0,1fr));padding:0}
.tn-stats .k{display:flex;flex-direction:column;gap:2px;min-width:0}.tn-stats .wide{grid-column:1/-1}
.tn-stats i{font-style:normal;font-size:var(--fs-1);color:var(--fg-3)}.tn-stats b{font-size:var(--fs-5);font-weight:600}
.tn-stats .k>span{font-size:var(--fs-1);color:var(--fg-3)}.tn-stats .chips{display:flex;flex-wrap:wrap;gap:4px}
.tn-fail{display:flex;gap:var(--sp-2);align-items:baseline;font-size:var(--fs-2);padding:3px 0;cursor:pointer;min-width:0}
.tn-fail:hover{background:var(--bg-2)}.tn-fail>span:nth-child(2){flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tn-ins summary .hint{font-weight:400}.tn-runs:empty{display:none}
/* chat cards for the HDFS tools */
.hq{display:flex;flex-direction:column;gap:var(--sp-2);padding:var(--sp-3);min-width:0}
.hq-strip{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.hq-strip .st{display:inline-flex;align-items:center;gap:5px;font-size:var(--fs-2);color:var(--fg-3)}
.hq-strip .st b{font-weight:500}.hq-strip .st i{font-style:normal;font:var(--fs-1) var(--mono);color:var(--fg-3)}
.hq-strip .d{width:16px;height:16px;border-radius:50%;display:grid;place-items:center;font:600 9px var(--mono);background:var(--bg-3);color:var(--fg-3)}
.hq-strip .st.done{color:var(--fg)}.hq-strip .st.done .d{background:var(--ok);color:#fff}
.hq-strip .st.failed{color:var(--err)}.hq-strip .st.failed .d{background:var(--err);color:#fff}
.hq-strip .st.running{color:var(--fg)}.hq-strip .st.running .d{background:var(--accent-soft)}.hq-strip .d .spin{width:9px;height:9px}
.hq-strip .st.cancelled .d{background:var(--fg-3)}.hq-strip .ln{flex:0 0 12px;height:2px;background:var(--line);border-radius:2px}
.hq-line{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;font-size:var(--fs-2);color:var(--fg-2);min-width:0}.hq-line .grow{flex:1}
.hq-tabs{display:flex;flex-direction:column;gap:4px;padding:var(--sp-2) var(--sp-3)}
.hq-tab{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap;font-size:var(--fs-2);min-width:0;overflow-wrap:anywhere}
.hq-tab details{flex:1 1 100%}.hq-tab summary{cursor:pointer;color:var(--fg-3);font-size:var(--fs-1)}
.hq-ds{display:flex;flex-direction:column;gap:2px;padding:4px 0;border-bottom:1px solid var(--line-soft);min-width:0}.hq-ds:last-child{border:0}
.hq-ds>div:first-child{display:flex;align-items:center;gap:var(--sp-2);flex-wrap:wrap}.hq-ds .hint{overflow-wrap:anywhere}
.hq-hints{display:flex;flex-direction:column;gap:var(--sp-1)}
.notice{display:flex;gap:var(--sp-2);align-items:flex-start;margin:var(--sp-2) 0;padding:var(--sp-2) var(--sp-3);border-radius:var(--r12);background:var(--bg-2);font-size:var(--fs-2);min-width:0}
.notice.ok{background:var(--ok-soft)}.notice.err{background:var(--err-soft)}
.notice .nb svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:1.6;stroke-linecap:round;stroke-linejoin:round;margin-top:1px}
.notice b{font-weight:600}.notice .nt{color:var(--fg-2);overflow-wrap:anywhere}.notice .nr{color:var(--fg);margin-top:2px;overflow-wrap:anywhere}
.tn-joins td{vertical-align:top;font-size:var(--fs-2)}.tn-joins .hint{margin-top:2px}
.tn-rev{display:inline-flex;align-items:center;gap:6px;font-size:var(--fs-2);cursor:pointer;white-space:nowrap}.tn-rev input{accent-color:var(--accent)}
.tn-ins h5{margin-top:var(--sp-3)}
