:root{--ink: #1a1a1a;--ink-soft: #4a4642;--ink-faint: #8a847c;--paper: #faf8f5;--paper-raised: #f2ede5;--paper-line: #e3dcd0;--accent: #b3541e;--accent-soft: #f1e0d2;--danger: #a3311a;--danger-soft: #f6e3de;--ok: #3a6b46;--font-sans: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--space-1: .25rem;--space-2: .5rem;--space-3: .75rem;--space-4: 1rem;--space-5: 1.5rem;--space-6: 2rem;--space-8: 3rem;--radius: 8px;--radius-sm: 5px}*{box-sizing:border-box}html,body{padding:0;margin:0}body{background:var(--paper);color:var(--ink);font-family:var(--font-sans);font-size:16px;line-height:1.5;-webkit-font-smoothing:antialiased}h1,h2,h3{font-weight:600;letter-spacing:-.01em;margin:0 0 var(--space-2)}h1{font-size:1.5rem}h2{font-size:1.125rem}p{margin:0 0 var(--space-3);color:var(--ink-soft)}a{color:var(--accent)}button{font-family:inherit;font-size:.9375rem;cursor:pointer}input,select{font-family:inherit;font-size:.9375rem}code,.mono{font-family:SF Mono,ui-monospace,Menlo,Consolas,monospace;font-size:.875em}.page{max-width:960px;margin:0 auto;padding:var(--space-6) var(--space-5) var(--space-8)}.page-header{margin-bottom:var(--space-6);display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-4);flex-wrap:wrap}.section{margin-bottom:var(--space-6)}.nav{background:var(--ink);color:var(--paper)}.nav-inner{max-width:960px;margin:0 auto;padding:var(--space-3) var(--space-5);display:flex;align-items:center;gap:var(--space-5)}.nav-brand{font-weight:700;letter-spacing:-.01em;color:var(--paper);text-decoration:none;margin-right:var(--space-2)}.nav-links{display:flex;gap:var(--space-4);list-style:none;margin:0;padding:0}.nav-links a{color:#cfc9c0;text-decoration:none;font-size:.9375rem;padding:var(--space-1) 0;border-bottom:2px solid transparent}.nav-links a:hover{color:var(--paper)}.nav-links a.active{color:var(--paper);border-bottom-color:var(--accent)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-2);border:1px solid var(--paper-line);background:var(--paper);color:var(--ink);border-radius:var(--radius-sm);padding:var(--space-2) var(--space-4);font-weight:500;transition:border-color .15s ease,background .15s ease}.btn:hover{border-color:var(--ink-faint)}.btn:disabled{opacity:.5;cursor:not-allowed}.btn-accent{background:var(--accent);border-color:var(--accent);color:var(--paper)}.btn-accent:hover{background:#9a4718;border-color:#9a4718}.btn-ghost{border-color:transparent;background:transparent}.btn-danger{color:var(--danger);border-color:var(--danger-soft)}.btn-danger:hover{border-color:var(--danger);background:var(--danger-soft)}.state-block{padding:var(--space-6) var(--space-4);text-align:center;color:var(--ink-faint);border:1px dashed var(--paper-line);border-radius:var(--radius)}.error-banner{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);background:var(--danger-soft);color:var(--danger);border:1px solid #e3bfb2;border-radius:var(--radius-sm);padding:var(--space-3) var(--space-4);margin-bottom:var(--space-4);font-size:.9375rem}.key-form{max-width:360px;padding:var(--space-5);border:1px solid var(--paper-line);border-radius:var(--radius);background:var(--paper-raised)}.key-form p{margin-bottom:var(--space-4)}.key-form-row{display:flex;gap:var(--space-2)}.key-form input[type=password]{flex:1;padding:var(--space-2) var(--space-3);border:1px solid var(--paper-line);border-radius:var(--radius-sm);background:var(--paper);color:var(--ink)}.key-form input[type=password]:focus{outline:2px solid var(--accent-soft);border-color:var(--accent)}.progress-list{display:flex;flex-direction:column;gap:var(--space-3)}.progress-row{display:flex;align-items:center;gap:var(--space-4);padding:var(--space-3) var(--space-4);background:var(--paper-raised);border:1px solid var(--paper-line);border-radius:var(--radius)}.progress-cover{flex:0 0 auto;width:44px;height:60px;border-radius:3px;object-fit:cover;background:var(--paper-line)}.progress-cover-fallback{flex:0 0 auto;width:44px;height:60px;border-radius:3px;background:var(--ink-faint);color:var(--paper);display:flex;align-items:center;justify-content:center;font-weight:600}.progress-main{flex:1;min-width:0}.progress-title{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.progress-meta{font-size:.8125rem;color:var(--ink-faint);display:flex;gap:var(--space-2);flex-wrap:wrap}.progress-bar{margin-top:var(--space-2);height:6px;border-radius:3px;background:var(--paper-line);overflow:hidden}.progress-fill{height:100%;background:var(--accent);border-radius:3px}.progress-pct{flex:0 0 auto;width:56px;text-align:right;font-variant-numeric:tabular-nums;color:var(--ink-soft);font-size:.875rem}.shelf-tabs{display:flex;gap:var(--space-2);margin-bottom:var(--space-5);flex-wrap:wrap}.shelf-tab{border:1px solid var(--paper-line);background:var(--paper);color:var(--ink-soft);border-radius:999px;padding:var(--space-1) var(--space-4);font-size:.875rem}.shelf-tab:hover{border-color:var(--ink-faint)}.shelf-tab.active{background:var(--ink);border-color:var(--ink);color:var(--paper)}.book-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:var(--space-4)}.book-card{display:flex;flex-direction:column;background:var(--paper-raised);border:1px solid var(--paper-line);border-radius:var(--radius);overflow:hidden}.book-cover{width:100%;aspect-ratio:2 / 3;object-fit:cover;background:var(--paper-line);display:block}.book-cover-fallback{width:100%;aspect-ratio:2 / 3;display:flex;align-items:center;justify-content:center;font-size:2rem;font-weight:700;color:var(--paper);background:var(--accent)}.book-info{padding:var(--space-3);display:flex;flex-direction:column;gap:var(--space-1);flex:1}.book-title{font-weight:600;font-size:.9375rem;line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.book-author{font-size:.8125rem;color:var(--ink-faint)}.book-footer{margin-top:auto;display:flex;align-items:center;justify-content:space-between;padding-top:var(--space-2);font-size:.75rem;color:var(--ink-faint)}.shelf-badge{display:inline-block;padding:1px var(--space-2);border-radius:999px;background:var(--accent-soft);color:var(--accent);font-size:.6875rem;font-weight:600;text-transform:uppercase;letter-spacing:.02em}.dropzone{border:2px dashed var(--paper-line);border-radius:var(--radius);padding:var(--space-6) var(--space-4);text-align:center;color:var(--ink-faint);background:var(--paper-raised);transition:border-color .15s ease,background .15s ease}.dropzone.dragover{border-color:var(--accent);background:var(--accent-soft);color:var(--accent)}.dropzone input[type=file]{display:none}.upload-list{margin-top:var(--space-4);display:flex;flex-direction:column;gap:var(--space-2)}.upload-item{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:var(--space-2) var(--space-3);border:1px solid var(--paper-line);border-radius:var(--radius-sm);font-size:.875rem;background:var(--paper)}.upload-status{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.02em}.upload-status.pending{color:var(--ink-faint)}.upload-status.uploading{color:var(--accent)}.upload-status.done{color:var(--ok)}.upload-status.error{color:var(--danger)}.settings-grid{display:grid;gap:var(--space-4)}.settings-card{padding:var(--space-5);background:var(--paper-raised);border:1px solid var(--paper-line);border-radius:var(--radius)}.settings-card h2{margin-bottom:var(--space-3)}.settings-card ol{margin:0 0 var(--space-3);padding-left:1.25rem}.settings-card li{margin-bottom:var(--space-2)}.code-row{display:flex;align-items:center;gap:var(--space-2);background:var(--paper);border:1px solid var(--paper-line);border-radius:var(--radius-sm);padding:var(--space-2) var(--space-3);margin-bottom:var(--space-2)}.code-row code{flex:1;overflow-x:auto;white-space:nowrap}.hint{font-size:.8125rem;color:var(--ink-faint)}.warning{font-size:.8125rem;color:var(--danger);background:var(--danger-soft);border-radius:var(--radius-sm);padding:var(--space-2) var(--space-3);margin:var(--space-2) 0}.key-status{display:flex;align-items:center;gap:var(--space-2);margin-bottom:var(--space-3);font-size:.9375rem}.key-dot{width:8px;height:8px;border-radius:50%;background:var(--danger)}.key-dot.set{background:var(--ok)}
