/* hub SPA; loaded after app.css and reuses its variables */
.hubtop{flex-wrap:wrap;row-gap:6px}
.hubtop nav{display:flex;gap:4px}
.hubtop nav a{padding:3px 12px;border-radius:999px;color:var(--fg);text-decoration:none;border:1px solid transparent}
.hubtop nav a:hover{background:var(--chip)}
.hubtop nav a.on{background:var(--accent);color:var(--accent-fg)}
.extl{display:flex;gap:10px;font-size:12px}
.extl a{color:var(--accent)}
.hubtop .flash{min-width:60px}
.hub a{color:var(--accent)}
.hub{min-width:0}
.hub h2{font-size:14px;margin:0 0 8px}
.hub h3{font-size:13px;margin:10px 0 6px}
.hub .card{min-width:0}
.toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:10px;margin-bottom:12px}
.toolbar .grow{flex:1}
.banner{border-radius:6px;padding:8px 10px;margin:8px 0;font-size:13px}
.banner.bad{background:var(--bad-bg);color:var(--bad);border:1px solid var(--bad);font-weight:600}
.banner.warn{background:var(--warn-bg);color:var(--warn)}
.banner.ok{background:#dcfce7;color:#15803d}
.stats{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:8px}
.stat{border:1px solid var(--line);border-radius:6px;padding:6px 8px;background:var(--bg)}
.stat b{display:block;font-size:20px;line-height:1.2}
.stat span{font-size:12px;color:var(--muted)}
.stat.bad b{color:var(--bad)}
.stat.good b{color:var(--ok)}
.bar{height:12px;border-radius:6px;background:var(--chip);overflow:hidden;border:1px solid var(--line)}
.bar i{display:block;height:100%;background:var(--accent)}
.split{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px;align-items:start}
.split>*{min-width:0}
@media (max-width:900px){.split{grid-template-columns:minmax(0,1fr)}}
.inst{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:8px}
.inst .acard{min-width:0;word-break:break-word}
.stage{display:flex;flex-wrap:wrap;align-items:center;gap:6px;white-space:normal}
.stage .arrow{color:var(--muted)}
.pchip{display:inline-block;border-radius:999px;padding:0 8px;font-size:12px;background:var(--chip);border:1px solid var(--line);white-space:normal;word-break:break-all}
.pchip.posted{background:#dcfce7;color:#15803d;border-color:transparent}
.pchip.queued,.pchip.claimed{background:var(--warn-bg);color:var(--warn);border-color:transparent}
.pchip.failed,.pchip.bad{background:var(--bad-bg);color:var(--bad);border-color:transparent}
.pchip.cancelled{color:var(--muted)}
.pchip a{color:inherit;text-decoration:underline}
.badge.new{background:var(--chip);color:var(--fg)}
.badge.processing{background:var(--warn-bg);color:var(--warn)}
.badge.drafted{background:#dbeafe;color:#1d4ed8}
.badge.published{background:#dcfce7;color:#15803d}
.badge.skipped{background:var(--chip);color:var(--muted)}
.badge.cancelled{background:var(--chip);color:var(--muted)}
.badge.questions,.badge.ok{background:#dcfce7;color:#15803d}
.badge.not_found,.badge.error{background:var(--bad-bg);color:var(--bad)}
@media (prefers-color-scheme:dark){
  .banner.ok,.pchip.posted,.badge.published,.badge.questions,.badge.ok{background:#052e16;color:#86efac}
  .badge.drafted{background:#172554;color:#93c5fd}
}
.hub td.wrap,.hub th.wrap{white-space:normal;min-width:160px;max-width:420px;word-break:break-word}
.hub table.t td{vertical-align:top}
.hub tr.sel td{background:var(--chip)}
.hub tr.click{cursor:pointer}
.hub tr.click:hover td{background:var(--chip)}
.hub tr.hl td{background:var(--warn-bg)}
.scroll{max-height:320px;overflow:auto}
.list .item{display:flex;gap:8px;align-items:baseline;flex-wrap:wrap;padding:6px 4px;border-bottom:1px solid var(--line);cursor:pointer}
.list .item:hover{background:var(--chip)}
.list .item.sel{background:var(--chip);border-left:3px solid var(--accent)}
.list .item .txt{flex:1 1 220px;min-width:0;word-break:break-word}
.rendered{max-height:none;overflow-wrap:anywhere}
.rendered table{border-collapse:collapse;margin:0 0 .8em}
.rendered th,.rendered td{border:1px solid var(--line);padding:3px 8px;white-space:normal}
.rendered .tw{overflow-x:auto;max-width:100%}
.rendered h3,.rendered h4,.rendered h5{margin:.9em 0 .4em;font-size:15px}
.rendered h5{font-size:14px}
.rendered ul,.rendered ol{margin:0 0 .7em;padding-left:1.4em}
.rendered code,.pre{font-family:ui-monospace,Consolas,monospace;font-size:12px}
.rendered sup a{text-decoration:none;font-size:11px}
.pre{white-space:pre-wrap;word-break:break-all;background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:6px;max-height:360px;overflow:auto;margin:6px 0}
.ansview .kv{grid-template-columns:90px 1fr}
.ansview .scroll{max-height:none}
details.raw{margin:8px 0}
details.raw summary{cursor:pointer;color:var(--muted)}
.trow{display:grid;grid-template-columns:minmax(80px,1fr) minmax(80px,1fr) minmax(70px,.8fr) minmax(80px,1fr) minmax(90px,1.2fr) auto;gap:6px;align-items:center;margin-bottom:6px}
.trow select,.trow input{width:100%;min-width:0;padding:4px 6px;background:var(--bg);border:1px solid var(--line);border-radius:6px}
.trow .ph{visibility:hidden}
.trow>input.off{visibility:hidden}
@media (max-width:600px){.trow{grid-template-columns:1fr 1fr}.trow .ph{display:none}.trow>input.off{display:none}}
.field.inl-row{flex-direction:row;align-items:center;flex-wrap:wrap}
select{font:inherit;color:inherit;background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:4px 6px}
.filters2{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:8px}
.filters2 input{width:auto;flex:1 1 120px;max-width:240px}
.dlgbody{margin:10px 0;max-height:60vh;overflow:auto;word-break:break-word}
.dlgbody ol,.dlgbody ul{padding-left:1.4em;margin:6px 0}
.dlgbtns{justify-content:flex-end}
dialog#dlg h2{font-size:15px;margin:0}
button.primary.danger{background:var(--bad);border-color:var(--bad);color:#fff}
.muted a{color:var(--accent)}
.mono{font-family:ui-monospace,Consolas,monospace;font-size:12px}
.nowrap{white-space:nowrap}
@media (max-width:800px){
  .hub table{display:table;width:100%}
  .hub thead{display:table-header-group}
  .hub tbody{display:table-row-group}
  .hub tr{display:table-row;border:0;margin:0;padding:0}
  .hub td{display:table-cell;border-bottom:1px solid var(--line);padding:5px 6px;white-space:nowrap}
  .hub td::before{content:none}
  .hub td:empty{display:table-cell}
  .hub td.wrap{white-space:normal;min-width:140px}
  .hub .row2{grid-template-columns:1fr}
  .hubtop h1{flex:0 0 auto}
}
/* CSV 导入计划 card (hub_import.js) */
.imp .row.imp-row{margin:8px 0}
.imp input[type=file]{max-width:100%}
.imp .imp-lbl{display:flex;align-items:center;gap:6px;font-size:13px}
.imp input.imp-off{width:7em;padding:4px 6px;background:var(--bg);color:var(--fg);border:1px solid var(--line);border-radius:6px;font:inherit}
.imp .imp-err{white-space:pre-wrap;word-break:break-word}
.imp tr.imp-bad td{background:var(--bad-bg)}
@media (max-width:600px){.imp .row.imp-row{flex-direction:column;align-items:stretch}}
