.prog{display:flex;gap:5px;margin-top:14px}
.prog i{flex:1;height:3px;border-radius:2px;background:var(--bg-3);transition:.3s}
.prog i.on{background:var(--accent)}
.loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:40px 0;gap:14px}
.spinner{width:26px;height:26px;border:2px solid var(--line);border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.loading-txt{font-size:13px;color:var(--txt-2);text-align:center;line-height:1.7}
.dots{display:inline-flex;gap:3px}
.dots i{width:4px;height:4px;border-radius:50%;background:var(--accent);animation:bd 1.2s infinite}
.dots i:nth-child(2){animation-delay:.2s}
.dots i:nth-child(3){animation-delay:.4s}
@keyframes bd{0%,60%,100%{opacity:.25;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}
.fade-enter-active,.fade-leave-active{transition:opacity .22s}
.fade-enter-from,.fade-leave-to{opacity:0}
.slide-enter-active{transition:.28s cubic-bezier(.2,.8,.3,1)}
.slide-enter-from{opacity:0;transform:translateY(14px)}
.tree{display:flex;flex-direction:column;gap:0;font-size:12.5px}
.tree-node{padding-left:16px;position:relative;padding-top:7px;padding-bottom:7px}
.tree-node::before{content:"";position:absolute;left:5px;top:0;bottom:0;width:1px;background:var(--line)}
.tree-node:last-child::before{height:18px}
.tree-node::after{content:"";position:absolute;left:5px;top:18px;width:8px;height:1px;background:var(--line)}
.tree-node.root::before{display:none}
.tree-node.root{padding-left:0}
.tree-node.root::after{display:none}
.tree-lab{color:var(--txt-2);cursor:pointer;padding:2px 0;display:inline-block}
.tree-lab.on{color:var(--accent);font-weight:600}
.tree-lab .ag{color:var(--txt-3);font-size:11px;margin-right:6px}
.toast{position:fixed;left:50%;bottom:80px;transform:translateX(-50%);background:rgba(28,24,20,.96);border:1px solid var(--line);padding:10px 18px;border-radius:999px;font-size:13px;color:var(--txt);z-index:100;white-space:nowrap;box-shadow:0 6px 24px rgba(0,0,0,.5)}
.toast-enter-active,.toast-leave-active{transition:.25s}
.toast-enter-from,.toast-leave-to{opacity:0;transform:translate(-50%,10px)}
.overlay{position:fixed;inset:0;background:rgba(0,0,0,.92);z-index:200;display:none;flex-direction:column;align-items:center;justify-content:center;padding:20px}
.overlay.on{display:flex}
.overlay img{max-width:100%;max-height:82vh;border-radius:8px}
.overlay .close{margin-top:16px;color:var(--txt-2);font-size:14px}
