/* The library (/books/): the wall of covers, the list (chapters and every book as a line of type), and the open book.
   Loaded after site.css on the books page only. Uses the site's tokens (--bg, --ink, --display, --text, --label). */
:root{--cloth-shadow:rgba(20,14,8,.28);--paper:#fbf7ef;--paper-ink:#1d1915;--paper-mute:#7a7066}
.vh{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

/* ---------- the index: chapters set large, then every book as a line of type ---------- */
.lib-stacks{padding:34px var(--pad) 90px}
.chapters{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:4px 40px;margin:0 0 70px}
.ch{display:grid;grid-template-columns:auto 1fr auto;align-items:baseline;gap:14px;border:0;background:none;padding:14px 0;cursor:pointer;text-align:left;color:var(--ink);font:inherit;opacity:.55;transition:opacity .2s}
.ch:hover,.ch.on{opacity:1}
.ch .no{font:11px/1 var(--label);letter-spacing:.08em;color:var(--mute)}
.ch .nm{font:italic 400 clamp(20px,1.6vw,24px)/1.22 var(--text)}
.ch .ct{font:11px/1 var(--label);color:var(--mute)}
.ch.on .nm{text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:6px}
/* the heading on its own line; under it the description on the left and the count on the right, on one baseline */
.ixhead{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:baseline;gap:12px 24px;margin:0 0 26px}
.ixhead h2{grid-column:1/-1}
.ixhead .count{grid-column:2}
.ixhead h2{font-size:clamp(34px,3.8vw,56px);line-height:1.02;letter-spacing:-.01em}
.ixhead h2.long{font-size:clamp(28px,2.9vw,44px)}  /* long chapter names stay on one line */
.ixhead p{font:17px/1.5 var(--text);color:var(--ink2);margin:0;max-width:440px}
.ixhead .count{font:12px var(--label);color:var(--mute)}
.index{display:flex;flex-direction:column}
.ix{display:grid;grid-template-columns:52px minmax(0,1fr) minmax(0,.42fr) 64px 92px;align-items:baseline;gap:0 26px;border:0;background:none;padding:12px 0;cursor:pointer;text-align:left;color:var(--ink);font:inherit;transition:color .2s,padding .3s cubic-bezier(.2,.8,.2,1)}
.ix .n,.ix .a,.ix .y,.ix .l{font:11.5px/1.4 var(--label);letter-spacing:.02em;color:var(--mute)}
.ix .t{font:400 clamp(17px,1.4vw,21px)/1.32 var(--text);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.ix .a{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ix .th{display:none}
.ix .t .sb{font-style:italic;color:var(--ink2)}  /* type in three voices: Ogg for headings, Alegreya for titles, DM Mono for details */
.index:hover .ix{color:color-mix(in srgb,var(--ink) 38%,transparent)}
.index:hover .ix:hover{color:var(--ink);padding-left:14px}
.ix:focus-visible{outline:1.5px solid var(--ink);outline-offset:4px}
/* the picture that rises beside the cursor */
.peek{position:fixed;left:0;top:0;z-index:60;width:240px;pointer-events:none;opacity:0;transition:opacity .2s;will-change:transform}
.peek.on{opacity:1}
.peek .cv{display:block;aspect-ratio:3/4;border-radius:2px;background:var(--cloth);box-shadow:0 24px 50px -12px rgba(0,0,0,.4)}
.peek .cv img{inset:6%;width:88%;height:88%;object-fit:contain}
.peek .cv.bare{background:var(--cloth)}
@media (hover:none){.peek{display:none}}

/* ---------- covers (shared) ---------- */
.cv{display:block;position:relative;overflow:hidden;background:var(--tile)}
.cv img{position:absolute;left:0;top:0;width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .6s}
.cv img.ok{opacity:1}
.cv img.crop{width:auto;height:auto;max-width:none;object-fit:fill}
/* no certain picture: the binding carries an illuminated initial */
.cv.bare{background:transparent;box-shadow:none!important;display:flex;align-items:center;justify-content:center}
.cv.bare img.inicov{position:relative;width:62%;height:auto;object-fit:contain;opacity:1;filter:drop-shadow(0 1px 0 rgba(0,0,0,.15))}

/* ---------- the wall: covers edge to edge on an endless canvas, a hairline where they touch ---------- */
html:not([data-lib="list"]) .lib-stacks,html:not([data-lib="plates"]) .lib-plates,html[data-lib="list"] .lib-wall,html[data-lib="plates"] .lib-wall{display:none}
html:not([data-lib="list"]):not([data-lib="plates"]) body>footer{display:none}
.lib-wall{position:relative;overflow:hidden;touch-action:none;cursor:grab;user-select:none;-webkit-user-select:none;outline:none;margin-top:18px;background:var(--bg)}
.lib-wall.dragging{cursor:grabbing}
.lib-wall .layer{position:absolute;left:0;top:0;will-change:transform}
.wc{position:absolute;display:block;padding:0;border:0;margin:0;background:var(--cloth);cursor:inherit;overflow:hidden;color:inherit;font:inherit;text-align:left}
.wc:after{content:"";position:absolute;inset:0;box-shadow:inset 0 0 0 .5px rgba(120,108,94,.42);pointer-events:none}
.wc .cv{position:absolute;inset:0;background:var(--cloth)}
.wc .cv.bare img.inicov{width:48%}
/* the whole picture, centered on its binding, whatever its shape: never cropped */
.wc .cv:not(.bare) img{left:8%;top:8%;width:84%;height:84%;object-fit:contain}
.wc .cap{position:absolute;left:0;right:0;bottom:0;padding:10px 12px 11px;background:var(--bg);color:var(--ink);opacity:0;transform:translateY(8px);transition:opacity .2s,transform .3s cubic-bezier(.2,.8,.2,1);pointer-events:none}
.wc .cap .t{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font:400 15px/1.25 var(--text)}
.wc .cap .m{display:block;margin-top:4px;font:10.5px/1.35 var(--label);color:var(--mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wc:hover .cap{opacity:1;transform:none}
.lib-wall.dragging .wc .cap{opacity:0}
.wc:focus-visible{outline:2px solid var(--ink);outline-offset:-2px}
@media (hover:none){.wc .cap{display:none}}
/* a narrow filter: the same tiles as a plain grid that scrolls with the page */
.lib-wall.finite{overflow:visible;touch-action:auto;cursor:default;margin-bottom:60px}
.lib-wall.finite .layer{position:static;display:grid;grid-template-columns:repeat(auto-fill,minmax(var(--cw,200px),1fr))}
.lib-wall.finite .wc{position:relative;aspect-ratio:3/4;cursor:pointer}
.lib-wall.finite .cab-empty{padding:60px var(--pad)}

/* ---------- the plates: pictures from inside the books, rows at their own proportions, edge to edge ---------- */
.lib-plates{padding:18px 0 80px}
/* the plates as an endless canvas, like the wall */
.lib-plates.pwall{position:relative;overflow:hidden;touch-action:none;cursor:grab;user-select:none;-webkit-user-select:none;outline:none;margin-top:18px;background:var(--bg)}
.pwall.dragging{cursor:grabbing}.pwall .layer{position:absolute;left:0;top:0;will-change:transform}
.pwall .pl{position:absolute;flex:none}.pwall.dragging .pl .cap{opacity:0}
html.pw-inf[data-lib="plates"] body>footer{display:none}
.prow{display:flex}
.prow.last{max-width:100%}
.pl{position:relative;flex:1 1 0;min-width:0;padding:0;border:0;margin:0;background:#efe8da;cursor:pointer;overflow:hidden;color:inherit;font:inherit;text-align:left}
.pl img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .5s}
.pl img.ok{opacity:1}
.pl:after{content:"";position:absolute;inset:0;box-shadow:inset 0 0 0 .5px rgba(120,108,94,.42);pointer-events:none}
.pl .cap{position:absolute;left:0;right:0;bottom:0;padding:10px 12px 11px;background:var(--bg);color:var(--ink);opacity:0;transform:translateY(8px);transition:opacity .2s,transform .3s cubic-bezier(.2,.8,.2,1);pointer-events:none}
.pl .cap .t{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font:400 15px/1.25 var(--text)}
.pl .cap .m{display:block;margin-top:4px;font:10.5px/1.35 var(--label);color:var(--mute);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pl:hover .cap{opacity:1;transform:none}
@media (hover:none){.pl .cap{display:none}}
/* one plate, large */
.prec .pv{flex:1;min-height:0;width:100%;display:flex;align-items:center;justify-content:center}
.pvbox{position:relative;display:block;overflow:hidden;background:#efe8da;box-shadow:0 30px 70px -20px rgba(0,0,0,.45)}
.pvbox img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
.pvbox img.crop{inset:auto;max-width:none;opacity:0;transition:opacity .5s}
.pvbox img.crop.ok{opacity:1}
.inside{max-width:100%;overflow-x:auto;scrollbar-width:thin;padding:4px 2px 6px}
.inside button{flex:none}
.pv{position:relative}
.pnav{position:absolute;top:50%;z-index:2;transform:translateY(-50%);width:44px;height:64px;border:0;background:none;color:var(--ink);font:300 46px/1 serif;opacity:.55;cursor:pointer;transition:opacity .2s}
.pnav:hover,.pnav:focus-visible{opacity:1}
.pnav.prev{left:-6px}.pnav.next{right:-6px}
.prec .inside button img{object-position:center}
.acts button.go{border:0;font:inherit;cursor:pointer}

/* ---------- a book taken off the shelf: its cover large, and its catalogue record ---------- */
.reader{position:fixed;inset:0;z-index:70;display:flex;align-items:center;justify-content:center;padding:28px}
.reader[hidden]{display:none}
.reader .shade{position:absolute;inset:0;background:color-mix(in srgb,var(--bg) 82%,transparent);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);opacity:0;transition:opacity .35s}
.reader.open .shade{opacity:1}
.record{position:relative;display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:56px;width:min(1160px,96vw);max-height:90vh;align-items:center}
.record .art{margin:0;display:flex;flex-direction:column;align-items:flex-start;height:min(78vh,720px)}
.record .art .cv.big{flex:1;min-height:0;width:100%;background:var(--cloth);border-radius:2px 5px 5px 2px;box-shadow:inset 6px 0 0 rgba(0,0,0,.14),0 30px 70px -20px rgba(0,0,0,.45);opacity:0}
.record .art .cv.big.landed{opacity:1}
.record .art .cv.big img:not(.crop){left:5%;top:5%;width:90%;height:90%;object-fit:contain}
.record .art .cv.big.plate{background:#f1ebde}
.record .art .cv.big.bare img.inicov{width:44%}
.inside{display:flex;gap:10px;margin-top:16px;flex:none}
/* a picture from inside the book shows only once it has arrived, so there is never an empty tile */
.inside button{width:54px;height:72px;padding:0;border:0;border-radius:2px;background:none;cursor:pointer;opacity:0;overflow:hidden;box-shadow:0 2px 8px rgba(0,0,0,.12);transition:opacity .4s,transform .25s;position:relative}
.inside button img{width:100%;height:100%;object-fit:cover;display:block}
.inside button.ok{opacity:.85}
.inside button:hover{opacity:1;transform:translateY(-3px)}
.inside button[aria-current="true"]{opacity:1;box-shadow:0 0 0 1.5px var(--ink)}
.record .card{max-height:min(78vh,720px);display:flex;flex-direction:column;overflow:hidden;opacity:0;transform:translateY(14px);transition:opacity .45s .2s,transform .55s .2s cubic-bezier(.2,.8,.2,1)}
.reader.open .record .card{opacity:1;transform:none}
.record h2{font-size:clamp(24px,2.1vw,34px);line-height:1.1}
.record .sub{font:italic 17px/1.5 var(--text);color:var(--ink2);margin:14px 0 0}
.record .story{margin:26px 0 0}.record .story h3{font:10.5px/1.7 var(--label);letter-spacing:.12em;text-transform:uppercase;color:var(--mute);margin:0 0 6px}.record .story p{font:17px/1.55 var(--text);color:var(--ink);margin:0;max-width:52ch}
.record dl{display:grid;grid-template-columns:96px 1fr;gap:12px 18px;margin:30px 0 0}
.record dt{font:10.5px/1.7 var(--label);letter-spacing:.12em;text-transform:uppercase;color:var(--mute)}
.record dd{margin:0;font:16px/1.45 var(--text);color:var(--ink)}
.open1{margin-top:30px;display:flex;align-items:flex-end;gap:22px}
/* the text scrolls on its own; the way into the book stays below it, always in view */
.record .cbody{min-height:0;overflow:auto;padding-right:6px;scrollbar-width:thin}
.record .open1{flex:none}
.acts{display:flex;flex-wrap:wrap;gap:10px 20px;align-items:center;font:12.5px var(--label)}
.acts a{color:var(--ink)}
.acts .go{display:inline-flex;align-items:center;gap:10px;padding:12px 20px;border-radius:99px;background:var(--ink);color:var(--bg)}
.acts .go:after{content:"\2192";transition:transform .25s}.acts .go:hover:after{transform:translateX(4px)}
.close{position:absolute;top:-10px;right:-10px;z-index:5;width:40px;height:40px;border-radius:50%;border:0;background:var(--ink);color:var(--bg);font:18px/1 var(--label);cursor:pointer}
.fly{position:fixed;z-index:80;pointer-events:none;transform-origin:top left;background:var(--cloth);border-radius:2px 5px 5px 2px;box-shadow:0 30px 60px rgba(0,0,0,.35);overflow:hidden}
.fly .cv{display:flex}
.fly .cv:not(.bare) img:not(.crop){left:5%;top:5%;width:90%;height:90%;object-fit:contain}

/* ---------- phone ---------- */
@media (max-width:900px){.chapters{grid-template-columns:repeat(2,minmax(0,1fr))}.ix{grid-template-columns:40px minmax(0,1fr) 56px;gap:0 14px}.ix .a,.ix .l{display:none}}
@media (max-width:760px){
 .lib-stacks{padding-top:22px}
 .chapters{grid-template-columns:1fr;gap:0;margin-bottom:44px}.ch{padding:11px 0}
 .ix{grid-template-columns:54px minmax(0,1fr) 44px;gap:0 14px;align-items:center;padding:9px 0}
 .ix .n{display:none}.ix .th{display:block;width:54px}.ix .th .cv{aspect-ratio:3/4;border-radius:2px;background:var(--cloth)}.ix .th .cv:not(.bare) img{left:6%;top:6%;width:88%;height:88%;object-fit:contain}  /* the binding's color shows while a picture loads, never a pale gap */.ix .th .cv.bare img.inicov{width:70%}
 .ix .t{font-size:20px}
 .reader{padding:0;align-items:stretch}
 .record{grid-template-columns:1fr;gap:20px;width:100%;max-height:100vh;overflow:auto;padding:56px 18px 30px;background:var(--bg)}
 .record .art{height:58vh}.record .card{max-height:none;overflow:visible}
 .record dl{grid-template-columns:84px 1fr}
 .close{top:12px;right:12px}
 .open1{flex-wrap:wrap}
 .record .cbody{overflow:visible}
 .record .open1{position:sticky;bottom:-30px;padding:14px 0 30px;margin-top:16px;background:var(--bg)}  /* on a phone the record scrolls as a whole; the links ride along at the bottom */
}
@media (prefers-reduced-motion:reduce){.record .card{transition:none;opacity:1;transform:none}.record .art .cv.big{opacity:1}}
