1<!DOCTYPE html> 2<html lang="en"> 3<head> 4<meta charset="UTF-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1.0"> 6<title>The Store â Asylum Ink</title> 7<meta name="description" content="Every volume recovered from the archive. Read a sample, buy one outright, or open all of it for $5 a month."> 8<link rel="canonical" href="https://asylumink.com/volumes.html"> 9<meta property="og:type" content="website"> 10<meta property="og:site_name" content="Asylum Ink"> 11<meta property="og:title" content="The Store · Asylum Ink"> 12<meta property="og:description" content="Every volume recovered from the archive. Read a sample, buy one outright, or open all of it for $5 a month."> 13<meta property="og:url" content="https://asylumink.com/volumes.html"> 14<meta property="og:image" content="https://asylumink.com/img/banners/store-1.jpg"> 15<meta property="og:image:width" content="1800"> 16<meta property="og:image:height" content="700"> 17<meta name="twitter:card" content="summary_large_image"> 18<meta name="twitter:title" content="The Store · Asylum Ink"> 19<meta name="twitter:description" content="Every volume recovered from the archive. Read a sample, buy one outright, or open all of it for $5 a month."> 20<meta name="twitter:image" content="https://asylumink.com/img/banners/store-1.jpg"> 21<link rel="preconnect" href="https://fonts.googleapis.com"> 22<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 23<link href="https://fonts.googleapis.com/css2?family=Corben:wght@400;700&family=Cinzel:wght@500;600;700&family=EB+Garamond:ital,wght@0,400;0,500;1,400&family=Space+Mono:wght@400;700&display=swap" rel="stylesheet"> 24<link rel="stylesheet" href="/css/archive.css"> 25 26<!-- 27 ============================================================ 28 THE STORE â merged shelf. Save as /volumes.html (replaces it). 29 30 SINGLE-PDF SALES (Payhip store: payhip.com/RelicsofAsylumInk): 31 the BUY list near the bottom holds each volume's Payhip product code 32 (the xxxxx in payhip.com/b/xxxxx). All fifteen are filled in. A new 33 volume gets a new line; a volume left at null shows "Single copy · 34 soon". Checkout opens as Payhip's pop-up over this page; if Payhip's 35 script fails to load, the button opens the Payhip page instead. 36 37 ART DROP-IN (all optional, page works without them): 38 /img/banners/store-1.jpg .. -6.jpg rotating hero banner 39 /img/covers/<slug>.jpg cover, also dimmed behind each card 40 /img/previews/<slug>-1.jpg sample page 1 (also -2, -3) 41 Slugs: the-booklet, frost-journals, entropy, phobic, carnival, 42 of-hollow-flesh, fractured-realms, quiet-panic, 43 survival-instincts, hunters-guide, doctors-findings 44 ============================================================ 45--> 46 47<style> 48 /* ---------- the offer ---------- */ 49 .offer{max-width:900px;margin:44px auto 0;padding:0 26px;position:relative;z-index:1} 50 .offer-in{border:1.5px solid var(--accent);background:var(--card);padding:30px 32px; 51 display:grid;grid-template-columns:1fr auto;gap:26px;align-items:center} 52 .offer .l .k{font-family:var(--mono);font-size:10px;letter-spacing:0.22em;text-transform:uppercase;color:var(--accent)} 53 .offer .l h2{font-family:var(--arch);font-weight:700;text-transform:uppercase;letter-spacing:0.04em; 54 font-size:clamp(1.2rem,2.8vw,1.7rem);color:var(--fg);margin:10px 0 8px} 55 .offer .l p{color:var(--dim);font-size:1.04rem;max-width:46ch;margin:0} 56 .offer .r{text-align:center;white-space:nowrap} 57 .offer .r .big{font-family:var(--arch);font-weight:700;font-size:2.6rem;line-height:1;color:var(--fg)} 58 .offer .r .per{font-family:var(--mono);font-size:.8rem;color:var(--dim);letter-spacing:0.06em} 59 .offer .r .btn{margin-top:14px;display:block} 60 @media(max-width:680px){.offer-in{grid-template-columns:1fr;text-align:center} 61 .offer .l p{margin:0 auto}} 62 63 .freeshelf .vol{border-color:#4a3a44} 64 .freeshelf .vol:hover{border-color:var(--accent)} 65 /* ---------- shelf ---------- */ 66 .shelf{display:flex;flex-wrap:wrap;justify-content:center;align-items:stretch;gap:20px;margin-top:38px} 67 .shelf > *{flex:1 1 215px;max-width:270px} 68 .vol{position:relative;background:var(--card);border:1px solid var(--line);overflow:hidden; 69 cursor:pointer;transition:border-color .3s,transform .3s;min-height:260px; 70 display:flex;flex-direction:column;justify-content:flex-end} 71 .vol:hover{border-color:var(--accent);transform:translateY(-4px)} 72 .vol[aria-expanded="true"]{border-color:var(--accent)} 73 /* dimmed cover art behind the text */ 74 .vol .art{position:absolute;inset:0;background-size:cover;background-position:center; 75 filter:grayscale(.4) contrast(1.05) brightness(.6);opacity:.62;transition:opacity .4s,filter .4s} 76 .vol:hover .art{opacity:.9;filter:grayscale(0) contrast(1.02) brightness(.74)}
76 77 .vol .scrim{position:absolute;inset:0; 78 background:linear-gradient(180deg,rgba(11,11,13,.25) 0%,rgba(11,11,13,.72) 55%,rgba(11,11,13,.97) 100%)} 79 .vol .txt{position:relative;z-index:2;padding:18px 18px 20px} 80 .vol .suit{font-family:'Georgia',serif;color:var(--accent);font-size:1.15rem;line-height:1} 81 .vol h3{font-family:var(--arch);font-weight:600;text-transform:uppercase;letter-spacing:0.05em; 82 font-size:.95rem;color:var(--fg);margin:8px 0 5px;line-height:1.35} 83 .vol .runs{font-family:var(--mono);font-size:8.5px;letter-spacing:0.16em;text-transform:uppercase;color:var(--dim)} 84 .vol .flag{position:absolute;top:11px;right:11px;z-index:3;font-family:var(--mono);font-size:8px; 85 letter-spacing:0.16em;text-transform:uppercase;color:var(--fg);background:rgba(10,9,12,.8); 86 border:1px solid var(--line);padding:4px 8px} 87 .vol .flag.free{background:var(--accent);color:#0b0b0d;border-color:var(--accent)} 88 89 /* ---------- detail ---------- */ 90 .detail{display:none;margin-top:30px;background:var(--card);border:1px solid var(--accent);scroll-margin-top:20px} 91 .detail.open{display:block;animation:dfade .35s ease both} 92 @keyframes dfade{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}} 93 .d-in{display:grid;grid-template-columns:270px 1fr} 94 .d-cov{background:#0a090c;border-right:1px solid var(--line);aspect-ratio:2/3; 95 display:flex;align-items:center;justify-content:center;overflow:hidden} 96 .d-cov img{width:100%;height:100%;object-fit:cover;display:block} 97 .d-cov .pl{font-family:'Georgia',serif;font-size:4.5rem;color:var(--accent);opacity:.45} 98 .d-body{padding:30px 32px 32px;position:relative} 99 .d-close{position:absolute;top:14px;right:16px;background:none;border:1px solid var(--line); 100 color:var(--dim);font-family:var(--mono);font-size:14px;line-height:1;cursor:pointer; 101 padding:6px 10px;transition:border-color .2s,color .2s} 102 .d-close:hover{border-color:var(--accent);color:var(--accent-br)} 103 .d-body .k{font-family:var(--mono);font-size:10px;letter-spacing:0.2em;text-transform:uppercase;color:var(--accent)} 104 .d-body h2{font-family:var(--arch);font-weight:700;text-transform:uppercase;letter-spacing:0.05em; 105 font-size:clamp(1.25rem,3vw,1.9rem);color:var(--fg);margin:11px 0 13px} 106 .d-body .blurb{font-family:var(--voice);font-size:1.1rem;color:var(--dim);line-height:1.6;max-width:52ch} 107 108 /* preview strip */ 109 .peek{margin-top:22px} 110 .peek .lab{font-family:var(--mono);font-size:9px;letter-spacing:0.2em;text-transform:uppercase; 111 color:var(--faint);margin-bottom:10px} 112 .peek .strip{display:flex;gap:10px;overflow-x:auto;padding-bottom:6px} 113 .peek .pg{flex:0 0 auto;width:96px;aspect-ratio:2/3;border:1px solid var(--line);background:#0a090c; 114 display:flex;align-items:center;justify-content:center;overflow:hidden;transition:border-color .25s} 115 .peek .pg:hover{border-color:var(--accent)} 116 .peek .pg img{width:100%;height:100%;object-fit:cover;display:block; 117 filter:grayscale(.3) brightness(1);transition:filter .3s} 118 .peek .pg:hover img{filter:none} 119 .peek .pg .n{font-family:var(--mono);font-size:8px;letter-spacing:0.14em;color:var(--faint)} 120 121 .vl{margin:22px 0 0;border-top:1px solid var(--line)} 122 .vl .row{display:flex;align-items:center;justify-content:space-between;gap:14px; 123 padding:11px 0;border-bottom:1px solid var(--line)} 124 .vl .vn{font-family:var(--arch);font-weight:600;text-transform:uppercase;font-size:.8rem; 125 letter-spacing:0.07em;color:var(--fg)} 126 .vl .vr{display:flex;align-items:center;gap:8px;flex-wrap:wrap;justify-content:flex-end} 127 .vl .vs{font-family:var(--mono);font-size:8.5px;letter-spacing:0.15em;text-transform:uppercase; 128 color:var(--faint);border:1px solid var(--line);padding:4px 9px;white-space:nowrap} 129 .vl .vs.free{background:var(--accent);color:#0b0b0d;border-color:var(--accent)} 130 /* single-copy buy link on each volume row */ 131 .vl .vb{font-family:var(--mono);font-size:8.5px;letter-spacing:0.15em;text-transform:uppercase; 132 color:var(--accent-br);border:1px solid var(--accent);padding:4px 9px;white-space:nowrap; 133 text-decoration:none;transition:background .2s,color .2s} 134 .vl .vb:hover{background:var(--accent);color:#0b0b0d} 135 .vl .vb.soon{color:var(--faint);border-color:var(--line);border-style:dashed;cursor:default;pointer-events:none} 136 .btn.waiting{opacity:.45;border-style:dashed;cursor:default;pointer-events:none} 137 .btn.waiting:hover{background:transparent;color:inherit} 138 139 .d-buy{margin-top:24px;display:flex;gap:11px;flex-wrap:wrap;align-items:center} 140 .d-buy .note{font-family:var(--mono);font-size:9px;letter-spacing:0.14em;text-transform:uppercase; 141 color:var(--faint);width:100%;margin-top:6px;line-height:1.9} 142 @media(max-width:760px){ 143 .d-in{grid-template-columns:1fr} 144 .d-cov{aspect-ratio:16/10;border-right:0;border-bottom:1px solid var(--line)} 145 .d-body{padding:26px 22px 28px} 146 } 147 @media(max-width:480px){ 148 .vl .row{flex-direction:column;align-items:flex-start;gap:8px} 149 .vl .vr{justify-content:flex-start} 150 } 151</style> 152</head> 153<body id="top"> 154 155<div class="nav"> 156 <a class="brand" href="/"><span class="seal">♠</span>Asylum Ink</a> 157 <div class="links"> 158 <a href="/archive.html">Archive</a> 159 <a href="/deck.html">Deck</a> 160 <a href="/volumes.html" class="on">Store</a> 161 <a href="/intake.html">Intake</a> 162 <a href="/files.html">Narrations</a> 163 <a href="/about.html">IN-0001</a> 164 <a href="https://orderofbuilders.com/member-home" class="members-link">Members</a> 165 <a href="/join" class="join-btn">Join</a> 166 </div> 167</div> 168<div class="banner tall" data-set="store" data-fallback="entropy,carnival,phobic,of-hollow-flesh,fractured-realms,hunters-guide"></div> 169 170<header class="page-head" style="padding-bottom:0"> 171 <p class="eyebrow rv">The collected reports</p> 172 <h1 class="page rv">The Store</h1> 173 <p class="lede rv">Read a sample. Take one home. Or open the whole shelf and stop counting.</p> 174</header> 175 176<section class="offer"> 177 <div class="offer-in rv"> 178 <div class="l"> 179 <p class="k">♠ The whole shelf</p> 180 <h2>One key opens all of it</h2> 181 <p>Every volume below, plus every new file as it is recovered. The booklet costs nothing at all — read that first if you would rather not take our word for it.</p> 182 </div> 183 <div class="r"> 184 <div class="big">$5</div> 185 <div class="per">a month</div> 186 <a class="btn solid" href="/join">Join ♥</a> 187 </div> 188 </div> 189</section> 190 191<section class="wrap" id="free" style="padding-top:44px"> 192 <div style="text-align:center"> 193 <p class="eyebrow rv">Costs nothing · no account</p> 194 <h2 class="sec rv" style="margin-top:12px">Start with the booklet</h2> 195 <p class="rv" style="color:var(--dim);margin-top:14px;max-width:52ch;margin-left:auto;margin-right:auto">Two ways in, both free and neither wants an account. One is the game. The other is the story it points at. Take whichever suits you — or both.</p> 196 </div> 197 198 <div class="shelf freeshelf"> 199 <article class="vol rv" data-book="the-booklet" tabindex="0" role="button" aria-expanded="false">
200 <span class="flag free">Free</span> 201 <div class="art" data-bg="/img/covers/the-booklet.jpg"></div><div class="scrim"></div> 202 <div class="txt"><span class="suit">♠</span><h3>The Booklet</h3><p class="runs">The game · full manual</p></div> 203 </article> 204 205 <article class="vol rv" data-book="frost-journals" tabindex="0" role="button" aria-expanded="false"> 206 <span class="flag free">Free</span> 207 <div class="art" data-bg="/img/covers/frost-journals.jpg"></div><div class="scrim"></div> 208 <div class="txt"><span class="suit">♦</span><h3>The Frost Journals</h3><p class="runs">The story · where Substrate begins</p></div> 209 </article> 210 </div> 211</section> 212 213<hr class="rule" style="margin:56px 0 0"> 214 215<section class="wrap" style="padding-top:40px"> 216 <div style="text-align:center"> 217 <p class="eyebrow rv">On the shelf</p> 218 <h2 class="sec rv" style="margin-top:12px">Pick one up</h2> 219 </div> 220 221 <div class="shelf"> 222 <article class="vol rv" data-book="entropy" tabindex="0" role="button" aria-expanded="false"> 223 <span class="flag">5 volumes</span> 224 <div class="art" data-bg="/img/covers/entropy.jpg"></div><div class="scrim"></div> 225 <div class="txt"><span class="suit">♦</span><h3>Entropy Rising</h3><p class="runs">The long collapse</p></div> 226 </article> 227 228 <article class="vol rv" data-book="phobic" tabindex="0" role="button" aria-expanded="false"> 229 <span class="flag">2 sessions</span> 230 <div class="art" data-bg="/img/covers/phobic.jpg"></div><div class="scrim"></div> 231 <div class="txt"><span class="suit">♥</span><h3>Phobic</h3><p class="runs">Fear, catalogued</p></div> 232 </article> 233 234 <article class="vol rv" data-book="carnival" tabindex="0" role="button" aria-expanded="false"> 235 <div class="art" data-bg="/img/covers/carnival.jpg"></div><div class="scrim"></div> 236 <div class="txt"><span class="suit">●</span><h3>Carnival</h3><p class="runs">Illustrated novel</p></div> 237 </article> 238 239 <article class="vol rv" data-book="of-hollow-flesh" tabindex="0" role="button" aria-expanded="false"> 240 <div class="art" data-bg="/img/covers/of-hollow-flesh.jpg"></div><div class="scrim"></div> 241 <div class="txt"><span class="suit">♣</span><h3>Of Hollow Flesh</h3><p class="runs">Novella</p></div> 242 </article> 243 244 <article class="vol rv" data-book="fractured-realms" tabindex="0" role="button" aria-expanded="false"> 245 <div class="art" data-bg="/img/covers/fractured-realms.jpg"></div><div class="scrim"></div> 246 <div class="txt"><span class="suit">♥</span><h3>Fractured Realms</h3><p class="runs">Anthology</p></div> 247 </article> 248 249 <article class="vol rv" data-book="quiet-panic" tabindex="0" role="button" aria-expanded="false"> 250 <div class="art" data-bg="/img/covers/quiet-panic.jpg"></div><div class="scrim"></div> 251 <div class="txt"><span class="suit">♠</span><h3>The Quiet Panic</h3><p class="runs">Collected file</p></div> 252 </article> 253 254 <article class="vol rv" data-book="survival-instincts" tabindex="0" role="button" aria-expanded="false"> 255 <div class="art" data-bg="/img/covers/survival-instincts.jpg"></div><div class="scrim"></div> 256 <div class="txt"><span class="suit">♦</span><h3>Survival Instincts</h3><p class="runs">Collected file</p></div> 257 </article> 258 259 <article class="vol rv" data-book="hunters-guide" tabindex="0" role="button" aria-expanded="false"> 260 <span class="flag">2 seasons</span> 261 <div class="art" data-bg="/img/covers/hunters-guide.jpg"></div><div class="scrim"></div> 262 <div class="txt"><span class="suit">♣</span><h3>Hunter's Guide</h3><p class="runs">Two seasons</p></div> 263 </article> 264 265 <article class="vol rv" data-book="doctors-findings" tabindex="0" role="button" aria-expanded="false"> 266 <div class="art" data-bg="/img/covers/doctors-findings.jpg"></div><div class="scrim"></div> 267 <div class="txt"><span class="suit">♦</span><h3>The Doctor's Findings</h3><p class="runs">Clinical record</p></div> 268 </article> 269 </div> 270
271 <div class="detail" id="detail" role="region" aria-live="polite"> 272 <div class="d-in"> 273 <div class="d-cov" id="dCov"><span class="pl">♠</span></div> 274 <div class="d-body"> 275 <button class="d-close" id="dClose" aria-label="Close">✕</button> 276 <p class="k" id="dKick"></p> 277 <h2 id="dTitle"></h2> 278 <p class="blurb" id="dBlurb"></p> 279 280 <div class="peek" id="dPeek"> 281 <p class="lab">A few pages · look before you buy</p> 282 <div class="strip" id="dStrip"></div> 283 </div> 284 285 <div class="vl" id="dVols"></div> 286 287 <div class="d-buy"> 288 <a class="btn solid" href="/join" id="dJoin">Open the shelf — $5/month</a> 289 <a class="btn waiting" id="dBuy" aria-disabled="true">Single copy — soon</a> 290 <p class="note" id="dNote">Single copies are a one-time purchase · the PDF is yours to keep · membership includes every one of them</p> 291 </div> 292 </div> 293 </div> 294 </div> 295</section> 296 297<hr class="rule"> 298 299<section class="wrap" style="max-width:720px;text-align:center"> 300 <p class="eyebrow rv">Still deciding</p> 301 <h2 class="sec rv" style="margin-top:14px;font-size:clamp(1.3rem,3vw,2rem)">One book, or the room it came from.</h2> 302 <p class="rv" style="color:var(--dim);margin-top:14px">A single copy is one account, bought once and kept. The membership is the archive it was pulled out of, every title on this shelf, and new files keep landing in it. Open any book above to buy it on its own.</p> 303 <div class="btn-row rv"> 304 <a class="btn solid" href="/join">Join — $5/month</a> 305 <a class="btn" href="#free">Take the booklet — free ♠</a> 306 </div> 307 <p class="mono-note rv" style="margin-top:24px">$50 a year saves two months · cancel whenever you please</p> 308</section> 309 310<footer> 311 <div class="fwrap"> 312 <span class="fbrand"><span class="seal">♠</span>Asylum Ink</span> 313 <p class="ftag">An archive in recovery · recovery is ongoing</p> 314 <p class="ftag" style="margin-top:8px">© 2026 Asylum Ink · all rights reserved</p> 315 <div class="index-line"><a href="/archive.html">Archive</a><span class="sep">·</span><a href="/deck.html">Deck</a><span class="sep">·</span><span style="color:var(--dim)">Store</span><span class="sep">·</span><a href="/intake.html">Intake</a><span class="sep">·</span><a href="/files.html">Narrations</a><span class="sep">·</span><a href="/corrupting-deck.pdf">Booklet</a></div> 316 <div class="legal-line"><a href="https://orderofbuilders.com/terms">Terms</a><span class="sep">·</span><a href="https://orderofbuilders.com/privacy">Privacy</a><span class="sep">·</span><a href="https://orderofbuilders.com/refunds">Refunds</a></div> 317 <p class="stamp-line">Recovered, illustrated and filed by Jason Moser · Archivist of Record</p> 318 </div> 319</footer> 320
321<script> 322(function(){ 323 /* dimmed cover art behind each card, only if the file exists */ 324 document.querySelectorAll('.vol .art[data-bg]').forEach(function(el){ 325 var src=el.getAttribute('data-bg'), im=new Image(); 326 im.onload=function(){el.style.backgroundImage='url("'+src+'")';}; 327 im.src=src; 328 }); 329 330 /* ============================================================ 331 SINGLE-PDF SALES â PAYHIP 332 One entry per volume, keyed by the volume's PDF name. 333 code = the Payhip product code, the xxxxx in payhip.com/b/xxxxx 334 price = what the button shows (set the real price in Payhip) 335 Leave code as null and the volume shows "Single copy · soon". 336 ============================================================ */ 337 var BUY={ 338 "entropy_v01": {code:"XTctL", price:"$5"}, 339 "entropy_v02": {code:"lvCzG", price:"$5"}, 340 "entropy_v03": {code:"tSFBh", price:"$5"}, 341 "entropy_v04": {code:"oqdNO", price:"$5"}, 342 "entropy_v05": {code:"IKAG2", price:"$5"}, 343 "phobic_v01": {code:"MiAvc", price:"$5"}, 344 "phobic_v02": {code:"Nnr27", price:"$5"}, 345 "carnival_v01": {code:"m1x0n", price:"$5"}, 346 "of-hollow-flesh_v01": {code:"8aukO", price:"$5"}, 347 "fractured-realms_v01": {code:"yL9gB", price:"$5"}, 348 "quiet-panic_v01": {code:"fg6dv", price:"$5"}, 349 "survival-instincts_v01":{code:"51lVz", price:"$5"}, 350 "hunters-guide_v01": {code:"ukMnd", price:"$5"}, 351 "hunters-guide_v02": {code:"10EiJ", price:"$5"}, 352 "doctors-findings_v01": {code:"DCa4g", price:"$5"} 353 }; 354 355 /* vols: [label, PDF name] â the PDF name ties each row to its BUY entry */ 356 var BOOKS={ 357 "the-booklet":{suit:"♠",title:"The Booklet",kick:"Free · the game",pages:3, 358 blurb:"Fifty-two threats, four suits, three ways to end a thing. The full manual, printed to look like a party game because a joke gets carried home and a warning gets filed. Play it with any deck, in any room, with any number of people including none.", 359 vols:[["The Corrupting Deck — full manual"]], 360 free:true,pdf:"/corrupting-deck.pdf", 361 pair:"frost-journals",pairline:"Got the rules? Take the story next —
361 the Frost Journals are free too."}, 362 "frost-journals":{suit:"♦",title:"The Frost Journals",kick:"Free · the story",pages:3, 363 blurb:"Where Substrate begins. An account kept in the cold by someone who went on writing after there was any reason to. Horrifying, complete, and the cleanest way in if you would rather read than play.", 364 vols:[["The complete journal — full colour"]], 365 free:true,pdf:"/frost-journals.pdf", 366 pair:"the-booklet",pairline:"Read that already? The deck it came out of is free as well."}, 367 "entropy":{suit:"♦",title:"Entropy Rising",kick:"Five volumes",pages:3, 368 blurb:"The Old Reality does not end. It unwinds. Five volumes tracing the long collapse, and the seat at the centre that nobody should ever have filled.", 369 vols:[["I — Entropy Rising","entropy_v01"],["II — Sacrifice to Entropy","entropy_v02"],["III — Child of Entropy","entropy_v03"],["IV — Pillars of Entropy","entropy_v04"],["V — Lord of Entropy","entropy_v05"]]}, 370 "phobic":{suit:"♥",title:"Phobic",kick:"Two sessions",pages:3, 371 blurb:"Fear catalogued, then met. What the body does when the thing it feared turns out to have been documented all along.", 372 vols:[["Session One","phobic_v01"],["Session Two","phobic_v02"]]}, 373 "carnival":{suit:"●",title:"Carnival",kick:"Illustrated novel",pages:3, 374 blurb:"The lights stay on all night and the gates never quite close. An account of a place that keeps whoever wanders into it.", 375 vols:[["The complete novel","carnival_v01"]]}, 376 "of-hollow-flesh":{suit:"♣",title:"Of Hollow Flesh",kick:"Novella",pages:3, 377 blurb:"The flesh volunteers for structural work. It produces more of itself than anyone requested, and the finishing is the problem.", 378 vols:[["The complete novella","of-hollow-flesh_v01"]]}, 379 "fractured-realms":{suit:"♥",title:"Fractured Realms",kick:"Anthology",pages:3, 380 blurb:"Help, honestly offered and freely accepted. Ted's account and the two companion files printed with it, exactly as the editor chose to arrange them.", 381 vols:[["The complete file","fractured-realms_v01"]]}, 382 "quiet-panic":{suit:"♠",title:"The Quiet Panic",kick:"Collected file",pages:3, 383 blurb:"Nothing sounded. Nobody came. The report reads as calm right up until you notice what is missing from it.", 384 vols:[["Examination One — Rituals of Fear","quiet-panic_v01"]]}, 385 "survival-instincts":{suit:"♦",title:"Survival Instincts",kick:"Collected file",pages:3, 386 blurb:"What the body does before the mind agrees to it. Field accounts from people who lived and cannot say how.", 387 vols:[["Journal One — Triggered","survival-instincts_v01"]]}, 388 "hunters-guide":{suit:"♣",title:"Hunter's Guide",kick:"Two seasons",pages:3, 389 blurb:"Quarry entries assembled by somebody without a bestiary's resources, who never stopped to say so. Season One is the oldest of the four manuals and the only one still being added to.", 390 vols:[["Season One","hunters-guide_v01"],["Season Two","hunters-guide_v02"]]}, 391 "doctors-findings":{suit:"♦",title:"The Doctor's Findings",kick:"Clinical record",pages:3, 392 blurb:"Notes taken by someone who kept working after the findings stopped making sense. Filed anyway, and never graded.", 393 vols:[["Volume I","doctors-findings_v01"]]} 394 }; 395 396 var d=document.getElementById('detail'); 397 var cov=document.getElementById('dCov'), kick=document.getElementById('dKick'), 398 ttl=document.getElementById('dTitle'), blu=document.getElementById('dBlurb'), 399 strip=document.getElementById('dStrip'), peek=document.getElementById('dPeek'), 400 vols=document.getElementById('dVols'), join=document.getElementById('dJoin'), 401 buy=document.getElementById('dBuy'), note=document.getElementById('dNote'), 402 close=document.getElementById('dClose'); 403 404 function payhipURL(code){ return 'https://payhip.com/b/'+encodeURIComponent(code); } 405 /* Payhip's own buy-button system: any element with class 406 payhip-buy-button + data-product opens the pop-up checkout. 407 Buttons built after page load are bound by re-running Payhip's 408 initialiser. If payhip.js has not loaded, the link simply opens 409 the Payhip product page. */ 410 function bindPayhip(){ 411 if(window.Payhip && Payhip.Button && typeof Payhip.Button.initiateBuyButtons==='function'){ 412 Payhip.Button.initiateBuyButtons(); 413 } 414 } 415 function buyLink(pdf){ 416 var b=BUY[pdf]; 417 if(b && b.code) return '<a class="vb payhip-buy-button" data-theme="none" data-product="'+b.code+'" href="'+payhipURL(b.code)+'" rel="noopener">Buy this one · '+b.price+'</a>'; 418 return '<span class="vb soon">Single copy · soon</span>'; 419 } 420 function setWaiting(text){ 421 buy.classList.remove('payhip-buy-button'); 422 buy.removeAttribute('data-product'); 423 buy.style.display=''; 424 buy.className='btn waiting'; 425 buy.innerHTML=text; 426 buy.removeAttribute('href'); 427 buy.setAttribute('aria-disabled','true'); 428 buy.onclick=function(e){e.preventDefault();}; 429 } 430 431 function open(slug,card){ 432 var b=BOOKS[slug]; if(!b) return; 433 document.querySelectorAll('.vol[aria-expanded="true"]').forEach(function(v){v.setAttribute('aria-expanded','false');}); 434 if(card) card.setAttribute('aria-expanded','true'); 435 436 cov.innerHTML='<span class="pl">
436'+b.suit+'</span>'; 437 (function(){var im=new Image();im.onload=function(){cov.innerHTML='<img src="/img/covers/'+slug+'.jpg" alt="">';};im.src='/img/covers/'+slug+'.jpg';})(); 438 439 kick.innerHTML=b.kick; ttl.innerHTML=b.title; blu.innerHTML=b.blurb; 440 441 /* preview strip: only show pages that actually exist */ 442 strip.innerHTML=''; var shown=0; 443 for(var i=1;i<=b.pages;i++){ 444 (function(n){ 445 var src='/img/previews/'+slug+'-'+n+'.jpg', im=new Image(); 446 im.onload=function(){ 447 var a=document.createElement('a'); 448 a.className='pg'; a.href=src; a.target='_blank'; a.rel='noopener'; 449 a.innerHTML='<img src="'+src+'" alt="Sample page '+n+'">'; 450 strip.appendChild(a); shown++; peek.style.display=''; 451 }; 452 im.src=src; 453 })(i); 454 } 455 peek.style.display='none'; 456 setTimeout(function(){ if(strip.children.length===0) peek.style.display='none'; },900); 457 458 /* volume rows: free tag, or membership tag plus a single-copy buy link */ 459 vols.innerHTML=b.vols.map(function(v){ 460 var r=b.free 461 ? '<span class="vs free">Free</span>' 462 : '<span class="vs">With membership</span>'+(b.vols.length>1?buyLink(v[1]):''); 463 return '<div class="row"><span class="vn">'+v[0]+'</span><span class="vr">'+r+'</span></div>'; 464 }).join(''); 465 buy=document.getElementById('dBuy'); /* Payhip may have swapped the node */ 466 467 if(b.free){ 468 join.innerHTML='Download it — free ♠'; 469 join.setAttribute('href', b.pdf || '/corrupting-deck.pdf'); 470 note.style.display='none'; 471 if(b.pair && BOOKS[b.pair]){ 472 buy.removeAttribute('data-product'); 473 buy.style.display=''; 474 buy.className='btn'; 475 buy.removeAttribute('aria-disabled'); 476 buy.innerHTML=BOOKS[b.pair].title+' — also free'; 477 buy.setAttribute('href','#'+b.pair); 478 buy.onclick=function(e){ 479 e.preventDefault(); 480 var c=document.querySelector('.vol[data-book="'+b.pair+'"]'); 481 open(b.pair,c); 482 }; 483 } else { 484 buy.style.display='none'; 485 } 486 } else { 487 join.innerHTML='Open the shelf — $5/month'; join.setAttribute('href','/join'); 488 note.style.display=''; 489 if(b.vols.length===1){ 490 /* one volume: the main button buys it */ 491 var one=BUY[b.vols[0][1]]; 492 if(one && one.code){ 493 buy.style.display=''; 494 buy.className='btn'; 495 buy.innerHTML='Buy this one — '+one.price; 496 buy.setAttribute('href', payhipURL(one.code)); 497 buy.classList.add('payhip-buy-button'); 498 buy.setAttribute('data-product', one.code); 499 buy.setAttribute('data-theme', 'none'); 500 buy.removeAttribute('aria-disabled'); 501 buy.onclick=null; 502 } else { 503 setWaiting('Single copy — soon'); 504 } 505 } else { 506 /* several volumes: each row carries its own buy link */ 507 buy.classList.remove('payhip-buy-button'); 508 buy.removeAttribute('data-product'); 509 buy.style.display='none'; 510 } 511 } 512 bindPayhip(); 513 514 d.classList.add('open'); 515 if(history.replaceState) history.replaceState(null,'','#'+slug); 516 d.scrollIntoView({behavior:'smooth',block:'nearest'}); 517 } 518 function shut(){ 519 d.classList.remove('open'); 520 document.querySelectorAll('.vol[aria-expanded="true"]').forEach(function(v){v.setAttribute('aria-expanded','false');}); 521 if(history.replaceState) history.replaceState(null,'',location.pathname); 522 } 523 document.querySelectorAll('.vol[data-book]').forEach(function(c){ 524 c.addEventListener('click',function(){open(c.getAttribute('data-book'),c);}); 525 c.addEventListener('keydown',function(e){ 526 if(e.key==='Enter'||e.key===' '){e.preventDefault();open(c.getAttribute('data-book'),c);} 527 }); 528 }); 529 close.addEventListener('click',shut); 530 document.addEventListener('keydown',function(e){if(e.key==='Escape'&&d.classList.contains('open'))shut();}); 531 532 var h=location.hash.replace('#',''); 533 if(h&&BOOKS[h]){var c=document.querySelector('.vol[data-book="'+h+'"]');setTimeout(function(){open(h,c);},300);} 534 535 /* reveal */ 536 var els=document.querySelectorAll(".rv"); 537 if("IntersectionObserver" in window && !window.matchMedia("(prefers-reduced-motion: reduce)").matches){ 538 var io=new IntersectionObserver(function(es){
539 es.forEach(function(e,i){ if(e.isIntersecting){ setTimeout(function(){e.target.classList.add("in");}, i*70); io.unobserve(e.target); } }); 540 },{threshold:0.14}); 541 for(var i=0;i<els.length;i++) io.observe(els[i]); 542 } else { for(var j=0;j<els.length;j++) els[j].classList.add("in"); } 543})(); 544</script>
544 545
546<script src="https://payhip.com/payhip.js" async></script>
vendor: 1 bytes, line 546
546
547<script src="/js/banner.js" defer></script>
547 548 549<a href="#top" class="totop" id="toTop" aria-label="Back to top">▲</a>
550<script> 551(function(){ 552 var b=document.getElementById('toTop'); if(!b) return; 553 function t(){ b.classList.toggle('show', window.scrollY>520); } 554 window.addEventListener('scroll',t,{passive:true}); t(); 555 b.addEventListener('click',function(e){ 556 e.preventDefault(); 557 window.scrollTo({top:0,behavior:document.documentElement.style.scrollBehavior==='auto'?'auto':'smooth'}); 558 }); 559})(); 560</script>
560 561</body> 562</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.