/* Shelf v21 — one motion system: shared duration/easing tokens, transform+opacity only, prefers-reduced-motion respected */
:root{
  --m-fast:140ms; --m-base:220ms; --m-slow:320ms;
  --m-ease:cubic-bezier(.2,.8,.2,1);      /* standard: quick start, soft landing */
  --m-ease-in:cubic-bezier(.4,0,1,1);     /* exits */
  --m-rise:8px;
}
/* panels + sheets (slide), scrim (fade) */
.panel{transition:transform var(--m-slow) var(--m-ease)}
.sheet{transition:transform var(--m-slow) var(--m-ease)}
.scrim{animation:m21Fade var(--m-base) var(--m-ease)}
.ptab.on,.pt{animation:m21Fade var(--m-base) var(--m-ease)}
/* reading bars hide/show (same specificity as v11 so the scroll-freeze rules still win) */
.rbar,.rfoot{transition:transform var(--m-base) var(--m-ease),opacity var(--m-base) var(--m-ease),background-color var(--m-slow) !important}
.minibar{transition:opacity var(--m-base) var(--m-ease),transform var(--m-base) var(--m-ease)}
.nav{transition:opacity var(--m-base) var(--m-ease)}
/* library: covers rise in, short capped stagger */
.wrap{animation:m21Fade var(--m-base) var(--m-ease)}
.book{animation:m21Rise var(--m-slow) var(--m-ease) both}
.books .book:nth-child(2){animation-delay:30ms}.books .book:nth-child(3){animation-delay:60ms}.books .book:nth-child(4){animation-delay:90ms}
.books .book:nth-child(5){animation-delay:120ms}.books .book:nth-child(6){animation-delay:150ms}.books .book:nth-child(n+7){animation-delay:180ms}
.continue{animation:m21Rise var(--m-slow) var(--m-ease) both}
.cover{transition:transform var(--m-slow) var(--m-ease),box-shadow var(--m-slow) var(--m-ease)}
.hl{transition:transform var(--m-base) var(--m-ease),box-shadow var(--m-base) var(--m-ease)}
/* highlight colour picker + menus */
.floatbar,.menu{animation:m21Pop var(--m-base) var(--m-ease)}
.sw{transition:transform var(--m-fast) var(--m-ease),box-shadow var(--m-base) var(--m-ease)}
.floatbar .sw{animation:m21Pop var(--m-base) var(--m-ease) both}
.floatbar .sw:nth-child(2){animation-delay:20ms}.floatbar .sw:nth-child(3){animation-delay:40ms}.floatbar .sw:nth-child(4){animation-delay:60ms}
.hlLayer i{transition:opacity var(--m-base) var(--m-ease)}
/* toasts + save pill */
.toast{animation:m21ToastIn var(--m-base) var(--m-ease)}
.savewarn:not(.hidden){animation:m21Rise var(--m-base) var(--m-ease)}
.savewarn .sw-b{transition:transform var(--m-fast) var(--m-ease),opacity var(--m-fast)}.savewarn .sw-b:active{transform:scale(.94)}
#undoToast:not(.hidden){animation:m21ToastIn var(--m-base) var(--m-ease)}
/* PDF pages: bitmap fades in over the placeholder */
#pdfView .page canvas{transition:opacity var(--m-base) var(--m-ease)}
#reader.v17-pdf #pdfView .page > canvas{transition:opacity var(--m-fast) var(--m-ease)}
#reader.v17-pdf #pdfView .page.ready > .ph:not(.has-thumb){transition:opacity var(--m-base) var(--m-ease)}
/* review card + dialogs */
.revcard{transition:transform var(--m-slow) var(--m-ease),opacity var(--m-base) var(--m-ease)}
.revempty{animation:m21Rise var(--m-slow) var(--m-ease)}

@keyframes m21Fade{from{opacity:0}}
@keyframes m21Rise{from{opacity:0;transform:translateY(var(--m-rise))}}
@keyframes m21Pop{from{opacity:0;transform:scale(.94)}}
@keyframes m21ToastIn{from{opacity:0;transform:translate(-50%,var(--m-rise))}}

@media (prefers-reduced-motion:reduce){
  :root{--m-fast:0ms;--m-base:0ms;--m-slow:0ms;--m-rise:0px}
  *,*::before,*::after{transition:none!important;animation:none!important}
}
