@import url("https://fonts.googleapis.com/css2?family=DM+Serif+Display&family=Inter:wght@400;500;600;700;800&display=swap");:root{--accent:#6c63ff;--accent-light:#eef0ff;--green:#34d399;--gold:#fbbf24;--bg:#f8f7f4;--card:#fff;--text:#1a1a2e;--text-muted:#6b7280;--text-light:#9ca3af;--border:#e5e7eb;--font-display:"DM Serif Display",serif;--font-body:"Inter",-apple-system,sans-serif}*{margin:0;padding:0;box-sizing:border-box}body,html{background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;min-height:100dvh}body,button,html,input,textarea{font-family:var(--font-body)}a{color:inherit;text-decoration:none}.app-shell{max-width:430px;margin:0 auto;min-height:100dvh;position:relative;background:var(--bg)}.tab-bar{position:fixed;bottom:0;left:50%;transform:translateX(-50%);width:100%;max-width:430px;display:flex;background:var(--card);border-top:1px solid var(--border);padding:8px 0 max(8px,env(safe-area-inset-bottom));z-index:40}.tab-item{flex:1 1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:6px 0;background:none;border:none;cursor:pointer;color:var(--text-light);font-size:10px;font-weight:500;transition:color .2s}.tab-item.active{color:var(--accent)}.scroll-area{padding-bottom:80px;overflow-y:auto;-webkit-overflow-scrolling:touch}.header{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;border-bottom:1px solid var(--border);position:-webkit-sticky;position:sticky;top:0;z-index:30}.card,.header{background:var(--card)}.card{border-radius:16px;box-shadow:0 1px 4px rgba(0,0,0,.04);overflow:hidden}.book-cover{border-radius:6px;object-fit:cover;background:var(--border)}.book-cover-sm{width:44px;height:64px}.book-cover-md{width:80px;height:116px}.book-cover-lg{width:120px;height:174px}.book-cover-placeholder{display:flex;align-items:center;justify-content:center;font-size:24px;background:linear-gradient(135deg,var(--accent-light),#ddd);border-radius:6px}.btn-primary{width:100%;padding:14px;border-radius:12px;border:none;background:var(--accent);color:#fff;font-size:15px;font-weight:700;cursor:pointer;font-family:var(--font-body);box-shadow:0 4px 16px rgba(108,99,255,.25);transition:opacity .2s}.btn-primary:hover{opacity:.9}.btn-primary:disabled{background:var(--border);color:var(--text-light);box-shadow:none;cursor:default}.btn-secondary{padding:10px 16px;border-radius:10px;border:1px solid var(--border);background:var(--bg);color:var(--text);font-size:13px;font-weight:600;cursor:pointer;font-family:var(--font-body);transition:background .2s}.btn-secondary:hover{background:var(--border)}.tag{font-size:10px;padding:3px 10px;border-radius:8px;background:var(--accent-light);color:var(--accent);font-weight:600}.input{width:100%;padding:12px 16px;border-radius:12px;border:1px solid var(--border);background:var(--card);font-size:14px;outline:none;transition:border-color .2s}.input:focus{border-color:var(--accent)}.search-input{width:100%;padding:12px 16px 12px 42px;border-radius:12px;border:1px solid var(--border);background:var(--card);font-size:14px;outline:none;transition:border-color .2s}.search-input:focus{border-color:var(--accent)}.overlay{position:fixed;inset:0;max-width:430px;margin:0 auto;z-index:50;background:var(--bg);animation:slideUp .3s ease}@keyframes slideUp{0%{transform:translateY(100%)}to{transform:translateY(0)}}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.fab{position:fixed;bottom:76px;right:calc(50% - 195px);width:52px;height:52px;border-radius:26px;background:var(--accent);color:#fff;border:none;box-shadow:0 4px 16px rgba(108,99,255,.4);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:24px;z-index:15;transition:transform .2s}.fab:hover{transform:scale(1.08)}.truncate{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.font-display{font-family:var(--font-display)}.spinner{width:24px;height:24px;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .6s linear infinite}@keyframes spin{to{transform:rotate(1turn)}}.star{color:var(--border)}.star.filled{color:var(--gold)}