PageSourceSearch

https://asylumink.com/volumes.html

html asylumink.com collected 2026-10-10 02:31:51 UTC 31,827 bytes, 562 lines download raw bytes

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">&#9824;</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">&#9824; 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 &mdash; 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 &#9829;</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 &#183; 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 &mdash; 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">&#9824;</span><h3>The Booklet</h3><p class="runs">The game &#183; 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">&#9830;</span><h3>The Frost Journals</h3><p class="runs">The story &#183; 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">&#9830;</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">&#9829;</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">&#9679;</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">&#9827;</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">&#9829;</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">&#9824;</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">&#9830;</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">&#9827;</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">&#9830;</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">&#9824;</span></div>
274      <div class="d-body">
275        <button class="d-close" id="dClose" aria-label="Close">&#10005;</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 &#183; 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 &mdash; $5/month</a>
289          <a class="btn waiting" id="dBuy" aria-disabled="true">Single copy &mdash; soon</a>
290          <p class="note" id="dNote">Single copies are a one-time purchase &#183; the PDF is yours to keep &#183; 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 &mdash; $5/month</a>
305    <a class="btn" href="#free">Take the booklet &mdash; free &#9824;</a>
306  </div>
307  <p class="mono-note rv" style="margin-top:24px">$50 a year saves two months &#183; cancel whenever you please</p>
308</section>
309
310<footer>
311  <div class="fwrap">
312    <span class="fbrand"><span class="seal">&#9824;</span>Asylum Ink</span>
313    <p class="ftag">An archive in recovery &#183; recovery is ongoing</p>
314    <p class="ftag" style="margin-top:8px">&copy; 2026 Asylum Ink &#183; all rights reserved</p>
315    <div class="index-line"><a href="/archive.html">Archive</a><span class="sep">&#183;</span><a href="/deck.html">Deck</a><span class="sep">&#183;</span><span style="color:var(--dim)">Store</span><span class="sep">&#183;</span><a href="/intake.html">Intake</a><span class="sep">&#183;</span><a href="/files.html">Narrations</a><span class="sep">&#183;</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">&#183;</span><a href="https://orderofbuilders.com/privacy">Privacy</a><span class="sep">&#183;</span><a href="https://orderofbuilders.com/refunds">Refunds</a></div>
317    <p class="stamp-line">Recovered, illustrated and filed by Jason Moser &#183; 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:"&#9824;",title:"The Booklet",kick:"Free &#183; 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 &mdash; full manual"]],
360      free:true,pdf:"/corrupting-deck.pdf",
361      pair:"frost-journals",pairline:"Got the rules? Take the story next &mdash;
361 the Frost Journals are free too."},
362    "frost-journals":{suit:"&#9830;",title:"The Frost Journals",kick:"Free &#183; 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 &mdash; 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:"&#9830;",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 &mdash; Entropy Rising","entropy_v01"],["II &mdash; Sacrifice to Entropy","entropy_v02"],["III &mdash; Child of Entropy","entropy_v03"],["IV &mdash; Pillars of Entropy","entropy_v04"],["V &mdash; Lord of Entropy","entropy_v05"]]},
370    "phobic":{suit:"&#9829;",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:"&#9679;",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:"&#9827;",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:"&#9829;",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:"&#9824;",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 &mdash; Rituals of Fear","quiet-panic_v01"]]},
385    "survival-instincts":{suit:"&#9830;",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 &mdash; Triggered","survival-instincts_v01"]]},
388    "hunters-guide":{suit:"&#9827;",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:"&#9830;",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 &#183; '+b.price+'</a>';
418    return '<span class="vb soon">Single copy &#183; 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 &mdash; free &#9824;';
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+' &mdash; 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 &mdash; $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 &mdash; '+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 &mdash; 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">&#9650;</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.