/* Direction B: the network.
   Rolls sit where their categories pull them, so a roll carried by three
   categories lands between all three. Connections are hairlines, categories are
   set type, and the pictures are clean rectangles. No stamps, no tape, no
   colour: the structure is drawn, not decorated. */

html,body{height:100%}
body{background:var(--paper);color:var(--ink);overflow:hidden}

.stage{position:fixed;inset:0;z-index:1;overflow:hidden;isolation:isolate;cursor:grab}
.stage:active{cursor:grabbing}
.plane{position:absolute;left:50%;top:50%;width:0;height:0;transform-origin:0 0}

.links{position:absolute;left:0;top:0;overflow:visible;pointer-events:none}
.links line{stroke:var(--ink);stroke-width:.7;opacity:.17;
  transition:opacity .45s var(--ease),stroke-width .45s var(--ease)}
.links line.is-lit{opacity:.62;stroke-width:1}
.links line.is-back{opacity:.04}

/* ---- rolls --------------------------------------------------------------- */
.node{position:absolute;overflow:hidden;background:var(--shade,#111);
  transition:opacity .45s var(--ease),filter .45s var(--ease),transform .5s var(--ease)}
.node img{width:100%;height:100%;object-fit:cover;display:block;opacity:0;
  transition:opacity .7s var(--ease),transform .6s var(--ease)}
.node img.is-loaded{opacity:1}
.node button{position:absolute;inset:0;width:100%;cursor:pointer;z-index:2}
.node figcaption{position:absolute;left:0;right:0;bottom:0;padding:26px 9px 8px;
  font-family:var(--mono);font-size:8.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink);
  background:linear-gradient(transparent,rgba(0,0,0,.82));opacity:0;transition:opacity .35s var(--ease);
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.node:hover figcaption,.node:focus-within figcaption{opacity:1}
.node:hover img,.node:focus-within img{transform:scale(1.04)}
.node.is-back{opacity:.14;filter:grayscale(1)}

/* ---- categories ---------------------------------------------------------- */
.hub{position:absolute;display:block;text-align:center;cursor:pointer;z-index:7;padding:7px 11px;
  font-family:var(--mono);font-size:11px;letter-spacing:.2em;text-transform:uppercase;color:var(--ink);
  background:rgba(0,0,0,.72);backdrop-filter:blur(3px);
  transition:color .3s var(--ease),opacity .45s var(--ease),background-color .3s var(--ease)}
.hub small{display:block;margin-top:4px;font-size:8.5px;letter-spacing:.16em;color:var(--muted);white-space:nowrap}
.hub:hover{background:rgba(0,0,0,.9)}
.hub[aria-pressed=true]{background:var(--ink);color:var(--paper)}
.hub[aria-pressed=true] small{color:rgba(0,0,0,.62)}
.hub.is-back{opacity:.26}

.title{position:absolute;left:0;right:0;top:50%;translate:0 -50%;z-index:6;pointer-events:none;
  text-align:center;padding:0 var(--gutter);mix-blend-mode:difference}
.title h1{margin:0;font-family:var(--display);font-weight:400;text-transform:uppercase;
  font-size:clamp(34px,6.4vw,102px);line-height:.94;letter-spacing:-.03em;color:var(--ink);
  transition:opacity .55s var(--ease)}
.title[data-quiet=true] h1{opacity:.1}

/* ---- chrome -------------------------------------------------------------- */
.masthead{position:fixed;top:0;left:0;right:0;z-index:10;display:flex;align-items:flex-start;
  justify-content:space-between;gap:24px;padding:26px var(--gutter) 0}
.brand{display:flex;flex-direction:column;gap:5px;text-decoration:none;color:var(--ink)}
.brand b{font-family:var(--sans);font-weight:700;font-size:15px;letter-spacing:.01em;text-transform:uppercase}
.brand span{font-family:var(--mono);font-size:9.5px;letter-spacing:.2em;text-transform:uppercase;color:var(--muted)}
.masthead nav{display:flex;gap:16px;padding-top:2px}
.masthead nav a{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;
  text-decoration:none;color:var(--muted);transition:color .25s var(--ease)}
.masthead nav a::before{content:"[ "}
.masthead nav a::after{content:" ]"}
.masthead nav a:hover{color:var(--ink)}

.statement{position:fixed;left:var(--gutter);bottom:74px;z-index:10;max-width:42ch;pointer-events:none}
.statement p{margin:0;font-size:14.5px;line-height:1.6;color:var(--muted)}

.count{position:fixed;right:var(--gutter);bottom:26px;z-index:11;font-family:var(--mono);font-size:10px;
  letter-spacing:.16em;text-transform:uppercase;color:var(--dim)}
.reset{position:fixed;left:var(--gutter);bottom:26px;z-index:11;font-family:var(--mono);font-size:10px;
  letter-spacing:.16em;text-transform:uppercase;color:var(--dim);transition:color .25s var(--ease)}
.reset::before{content:"[ "}
.reset::after{content:" ]"}
.reset:hover{color:var(--ink)}
.reset[hidden]{display:none}

/* ---- roll ---------------------------------------------------------------- */
.sheet{position:fixed;inset:0;z-index:40;background:var(--paper);display:none;overflow-y:auto;overscroll-behavior:contain}
.sheet[open]{display:block}
.sheet-head{position:sticky;top:0;z-index:2;display:flex;align-items:flex-start;justify-content:space-between;
  gap:24px;padding:26px var(--gutter) 22px;background:linear-gradient(var(--paper) 74%,transparent)}
.sheet-head h2{font-family:var(--display);font-weight:400;font-size:clamp(28px,4.6vw,62px);line-height:1;
  margin:0 0 10px;text-transform:uppercase;letter-spacing:-.026em}
.sheet-head dl{display:flex;flex-wrap:wrap;gap:4px 26px;margin:0;font-family:var(--mono);font-size:9.5px;
  letter-spacing:.16em;text-transform:uppercase;color:var(--muted)}
.sheet-head dt{color:var(--dim)}
.sheet-head dd{margin:0}
.sheet-close{flex:none;font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;
  color:var(--muted);transition:color .25s var(--ease)}
.sheet-close::before{content:"[ "}
.sheet-close::after{content:" ]"}
.sheet-close:hover{color:var(--ink)}

.sheet-grid{columns:3 320px;column-gap:10px;padding:0 var(--gutter) 72px}
.sheet-grid figure{break-inside:avoid;margin:0 0 10px;position:relative}
.sheet-grid .cell{position:relative;background:var(--shade,#111) center/cover no-repeat;overflow:hidden}
.sheet-grid img{width:100%;height:auto;display:block;opacity:0;transition:opacity .6s var(--ease)}
.sheet-grid img.is-loaded{opacity:1}
.sheet-grid button{position:absolute;inset:0;width:100%;z-index:2;cursor:pointer}

.fallback{position:absolute;left:-9999px}
.fallback:focus-within{position:static;padding:90px var(--gutter) 40px;z-index:50;background:var(--paper)}

@media (max-width:820px){
  .masthead{padding:18px var(--gutter) 0}
  .brand b{font-size:13px}
  .brand span{font-size:8px;letter-spacing:.14em}
  .masthead nav{gap:10px}
  .masthead nav a{font-size:8.5px;letter-spacing:.1em}
  .statement{display:none}
  .hub{font-size:9px;letter-spacing:.12em}
  .hub small{font-size:7.5px}
  .count{display:none}
  .sheet-grid{columns:2 150px;column-gap:7px}
}
