.books{max-width:1080px;margin:0 auto;padding-bottom:32px}.books-search{display:flex;flex-direction:column;gap:8px;max-width:520px;margin-bottom:24px}.books-search input{width:100%;box-sizing:border-box}.books-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:24px;align-items:start}.book-card{min-width:0;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius-md);overflow:hidden}.book-cover{position:relative;aspect-ratio:3/4;background:var(--brand-soft)}.book-cover-fallback{position:absolute;inset:0;display:flex;flex-direction:column;justify-content:center;gap:18px;text-align:center;padding:20px;color:var(--brand-deep);border:12px solid var(--surface-muted);overflow-wrap:anywhere}.book-cover-fallback strong{font-family:"Source Serif 4",serif;font-size:1.3rem;line-height:1.3}.book-cover-fallback span{font-size:.8rem}.book-cover img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;background:var(--surface-muted)}.book-description{padding:18px}.book-script{color:var(--ink-soft);font-size:.75rem}.book-description h2{font-size:1.1rem;line-height:1.35;margin:8px 0;overflow-wrap:anywhere}.book-description p{font-size:.875rem;line-height:1.5;color:var(--ink-soft);margin:0 0 16px;overflow-wrap:anywhere}.book-description .button{display:block;text-align:center;min-height:44px;box-sizing:border-box}.books-empty{padding:40px 24px;border:1px dashed var(--line-strong);border-radius:var(--radius-md);text-align:center;color:var(--ink-soft);background:var(--surface)}.books-empty h2{font-size:1.3rem;color:var(--ink)}
@media(max-width:1200px){.books-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:640px){.books-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.book-description{padding:12px}.book-description h2{font-size:1rem}.book-cover-fallback{padding:10px;border-width:8px}.book-cover-fallback strong{font-size:1.1rem}.book-cover-fallback span{font-size:.7rem}.books-search{max-width:none}}
@media(max-width:360px){.books-grid{grid-template-columns:1fr}}
.books-reader{max-width:1000px;margin:0 auto;padding-bottom:24px}.books-reader-heading{display:flex;align-items:center;gap:24px;margin-bottom:20px}.books-reader-heading h1{font-size:1.4rem;margin:0;overflow-wrap:anywhere}.books-reader-heading a{flex:none}.books-reader-tools{display:flex;align-items:flex-end;justify-content:space-between;gap:20px;margin-bottom:16px}.books-reader-tools label{display:flex;flex-direction:column;gap:6px;min-width:0;max-width:65%;font-size:.8rem}.books-reader-tools select{width:100%;min-height:44px;padding:8px 12px;border:1px solid var(--line-strong);border-radius:12px;background:var(--surface);color:var(--ink);font:inherit}.books-reader-font{display:flex;gap:8px;align-items:center;font-size:.8rem}.books-reader-font .button{min-height:44px;min-width:44px;padding:8px}.books-reader-stage{height:clamp(360px,66dvh,760px);background:#fffdf8;border:1px solid var(--line);border-radius:16px;overflow:hidden}.books-reader-stage iframe{width:100%;height:100%;border:0;display:block}.books-reader-status:empty{display:none}.books-reader-status{padding:12px 0;color:var(--ink-soft)}.books-reader-footer{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-top:16px}.books-reader-footer span{font-size:.75rem;color:var(--ink-soft);text-align:center}.books-reader-footer .button{min-height:44px}.books-reader [hidden]{display:none}
@media(max-width:640px){.books-reader-heading{align-items:flex-start;flex-direction:column;gap:14px}.books-reader-tools{gap:10px}.books-reader-tools label{max-width:60%}.books-reader-font{flex-wrap:wrap;justify-content:flex-end}.books-reader-font span{width:100%;text-align:right}.books-reader-stage{height:54dvh;min-height:340px}.books-reader-footer .button{padding:8px 12px;font-size:.8rem}}
/* The reader has its own Back to Books exit; the fixed mobile dock must not
   cover book text or page controls. The bookshelf and other screens keep it. */
@media(max-width:980px){.library-app .books-shell:has(.books-reader) .sidebar{display:none}.library-app .student-shell.books-shell:has(.books-reader){padding-bottom:0}}
/* A width-driven portrait sheet, not a viewport-height dashboard panel.
   The document scrolls around it; the EPUB remains horizontally paginated. */
.books-reader{max-width:720px}
.books-reader-stage{position:relative;height:auto;min-height:0;aspect-ratio:210/297}
.books-reader-stage>iframe{position:absolute;inset:0}
