:root{--bg-top: #f3fbff;--bg-bottom: #eef3ff;--panel: #ffffff;--ink: #1f2a37;--muted: #5f6b7a;--line: #dce4ef;--primary: #0f766e;--primary-ink: #e6fffb;--danger: #b91c1c;--danger-soft: #fee2e2;--info: #0c4a6e;--info-soft: #dbeafe;--shadow: 0 18px 40px rgba(15, 34, 58, .12);--book-shelf-cols: 6;--book-shelf-gap: 10px;--book-card-height: 346px;--book-cover-height: 190px;--book-body-min-height: 86px;--book-tags-min-height: 24px}*{box-sizing:border-box}body{margin:0;min-height:100vh;color:var(--ink);font-family:IBM Plex Sans,Noto Sans SC,PingFang SC,Hiragino Sans GB,sans-serif;background:radial-gradient(circle at 10% 10%,#d9f7f6 0%,transparent 32%),radial-gradient(circle at 90% 15%,#e0eaff 0%,transparent 30%),linear-gradient(155deg,var(--bg-top),var(--bg-bottom))}#app{min-height:100vh}.shell{width:min(1500px,98vw);margin:0 auto;padding:26px 0 40px}.shell.single{display:grid;place-items:center;min-height:100vh;padding:0}.topbar{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;gap:16px}.topbar h1{margin:0;letter-spacing:.2px;font-size:1.5rem}.subtitle{margin-top:4px;color:var(--muted);font-size:.92rem}.layout{display:grid;grid-template-columns:380px 1fr;gap:16px;align-items:start}.column{display:flex;flex-direction:column;gap:16px}.column.left{position:sticky;top:16px;max-height:calc(100vh - 32px);overflow-y:auto}.panel{background:var(--panel);border:1px solid var(--line);border-radius:18px;padding:16px;box-shadow:var(--shadow)}.hero{width:min(560px,92vw);text-align:left}.hero h1{margin:0 0 8px;font-size:1.7rem}.hero p{margin:0 0 18px;color:var(--muted);line-height:1.6}.panel h2{margin:0 0 12px;font-size:1.05rem}.panel-head{display:flex;justify-content:space-between;align-items:center;gap:12px;margin-bottom:10px}.row-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.sort-control{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:.85rem}.sort-control .sort-select{width:auto;min-width:128px;padding:6px 10px}.stack-form{display:grid;gap:10px}.stack-form label{display:grid;gap:6px}.stack-form span{font-size:.86rem;color:var(--muted)}.secondary-block{margin-top:12px;border-top:1px dashed var(--line);padding-top:12px}.secondary-block h3{margin:0 0 10px;font-size:.95rem}input,select,button{font:inherit}input,select{width:100%;border:1px solid var(--line);background:#fbfdff;border-radius:10px;padding:10px 12px;color:var(--ink)}input:focus,select:focus{outline:2px solid rgba(15,118,110,.28);border-color:var(--primary)}button{cursor:pointer;border:0;border-radius:10px;padding:9px 14px;transition:transform .12s ease,opacity .12s ease,background-color .12s ease}button:disabled{cursor:not-allowed;opacity:.58}.primary-btn{background:var(--primary);color:var(--primary-ink)}.ghost-btn{background:#f3f7ff;color:#1e3a5f;border:1px solid #d3dff2}.text-btn{background:transparent;color:#0a5a56;padding:4px 8px}.link-like{display:inline-block;margin-top:8px;text-decoration:none}.empty-block{border:1px dashed var(--line);border-radius:12px;color:var(--muted);padding:14px;font-size:.92rem}.inline-tip{margin-bottom:10px;color:var(--muted);font-size:.92rem}.shelf-list,.task-list,.download-list{list-style:none;margin:0;padding:0;display:grid;gap:8px}.shelf-btn{width:100%;text-align:left;border:1px solid var(--line);background:#fbfdff;border-radius:12px;padding:10px 12px;display:grid;gap:3px}.shelf-btn span{color:var(--muted);font-size:.82rem}.shelf-btn.active{border-color:#22a29a;background:#effcfb}.book-shelf{display:grid;grid-template-columns:repeat(var(--book-shelf-cols),minmax(0,1fr));gap:var(--book-shelf-gap);margin-bottom:10px}.book-card{position:relative;border:1px solid var(--line);border-radius:14px;padding:8px;overflow:hidden;background:#fdfefe;display:flex;flex-direction:column;gap:6px;height:var(--book-card-height);cursor:pointer;transition:border-color .12s ease,background-color .12s ease,box-shadow .12s ease}.book-card.cached{background:#f7fffb}.book-card.selected{border-color:#0f766e;background:#ecfdf9;box-shadow:0 0 0 2px #0f766e33}.book-card.disabled{opacity:.72;cursor:not-allowed}.book-selector{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;white-space:nowrap;clip-path:inset(100%);clip:rect(0 0 0 0);overflow:hidden}.book-cover{border:1px solid #e2e8f0;border-radius:10px;overflow:hidden;background:linear-gradient(145deg,#f8fbff,#eef3ff);height:var(--book-cover-height);display:flex;align-items:center;justify-content:center}.book-cover img{width:100%;height:100%;object-fit:cover;display:block}.book-cover-placeholder{color:var(--muted);font-size:.82rem;text-align:center;padding:0 10px}.book-card-body{display:grid;gap:4px;min-height:var(--book-body-min-height)}.book-title{font-weight:600;font-size:.9rem;line-height:1.35;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}.book-meta{margin-top:2px;color:var(--muted);font-size:.8rem;line-height:1.35;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}.book-submeta{color:#607086;font-size:.76rem;line-height:1.35;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1;overflow:hidden}.book-submeta:empty:before{content:" "}.book-hover-desc{position:absolute;top:8px;right:8px;bottom:8px;left:8px;display:flex;align-items:flex-end;padding:10px;border-radius:10px;background:linear-gradient(180deg,#0f172a14,#0f172ad1 72%);opacity:0;transform:translateY(6px);transition:opacity .14s ease,transform .14s ease;pointer-events:none}.book-hover-desc-text{color:#f8fafc;font-size:.76rem;line-height:1.45;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:6;overflow:hidden;text-shadow:0 1px 2px rgba(15,23,42,.45)}.book-card:hover .book-hover-desc,.book-card:focus-within .book-hover-desc{opacity:1;transform:translateY(0)}.book-tags{display:flex;flex-direction:column;gap:5px;margin-top:auto;min-height:var(--book-tags-min-height)}.book-tags.horizontal{flex-direction:row;flex-wrap:nowrap}.book-tags.horizontal .tag{white-space:nowrap}.tag{border-radius:999px;padding:3px 8px;font-size:.75rem;border:1px solid transparent;text-align:center}.tag-ok{background:#e8fff4;color:#166534;border-color:#bbf7d0}.tag-warn{background:#fff8e6;color:#92400e;border-color:#fde68a}.tag-muted{background:#f2f4f7;color:#667085;border-color:#e4e7ec}.download-actions{margin-top:6px}.books-pager{display:flex;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap;margin-top:4px}.books-pager-text{color:var(--muted);font-size:.86rem;min-width:96px;text-align:center}.books-pager-jump{display:flex;align-items:center;gap:6px}.books-pager-jump span{color:var(--muted);font-size:.84rem}.books-pager-jump input{width:76px;padding:6px 8px}.books-pager-jump .ghost-btn{padding:6px 10px}.download-list li{display:flex;align-items:center;justify-content:space-between;border:1px solid var(--line);border-radius:10px;padding:9px 11px;background:#fcfdff;gap:10px}.download-list a{color:#0b4f8a;text-decoration:none;font-weight:600}.download-list a:hover{text-decoration:underline}.task-item{border:1px solid var(--line);border-left-width:4px;border-radius:10px;padding:8px 10px;background:#fafcff}.task-item.running{border-left-color:#0ea5e9}.task-item.success{border-left-color:#16a34a}.task-item.failed{border-left-color:#dc2626}.task-top{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:4px}.task-sub{color:var(--muted);font-size:.8rem;line-height:1.35;word-break:break-all}.notice{border-radius:10px;padding:9px 12px;margin-bottom:10px;display:flex;justify-content:space-between;align-items:center;gap:8px}.notice-error{border:1px solid #fecaca;background:var(--danger-soft);color:var(--danger)}.notice-info{border:1px solid #bfdbfe;background:var(--info-soft);color:var(--info)}@keyframes fade-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@media(max-width:980px){.layout{grid-template-columns:1fr}.column.left{position:static;top:auto;max-height:none;overflow-y:visible}.topbar{flex-direction:column;align-items:flex-start}.book-shelf{--book-shelf-cols: auto;grid-template-columns:repeat(auto-fill,minmax(156px,1fr))}.books-pager{justify-content:space-between}}
