/* MY STINKY LINKIES — one room, lit by one bulb and one CRT.
   Deliberately not the FrAnK desktop: no window chrome, no lime. Everything
   that speaks here speaks through a screen, so the UI is phosphor on glass. */

:root{
  --phos:#7dff6a; --phos-dim:#3f8a38; --glass:#0b140b; --glass-lit:#132113;
  --amber:#ffe9a8; --ink:#0a0a0a; --wall:#2a231d;
}
*{box-sizing:border-box}
html,body{height:100%}
body{margin:0;background:var(--ink);color:var(--phos);overflow:hidden;
  font-family:ui-monospace,Menlo,Monaco,"Courier New",monospace;
  -webkit-font-smoothing:none;text-rendering:geometricPrecision}
button{font:inherit;color:inherit;cursor:pointer}
.vh{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;
  clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;border:0}

/* ---------- the room ---------- */
#room{position:fixed;inset:0;overflow:hidden;background:var(--ink)}
#scene{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;
  image-rendering:pixelated;user-select:none}
#spots{position:absolute;inset:0}

.spot{position:absolute;background:none;border:0;padding:0;border-radius:4px;
  cursor:pointer;transition:box-shadow .18s, background .18s}
.spot:hover,.spot:focus-visible{outline:none;
  background:rgba(125,255,106,.07);
  box-shadow:0 0 0 2px rgba(125,255,106,.55), 0 0 26px 6px rgba(125,255,106,.22)}
.spot .tag{position:absolute;left:50%;top:-30px;transform:translateX(-50%);
  white-space:nowrap;font-size:12px;letter-spacing:.18em;color:var(--phos);
  background:rgba(6,12,6,.88);border:1px solid rgba(125,255,106,.4);
  padding:4px 9px;opacity:0;transition:opacity .18s;pointer-events:none}
.spot:hover .tag,.spot:focus-visible .tag{opacity:1}

/* floating specks, because the air down here is not clean */
#dust{position:absolute;inset:0;pointer-events:none;opacity:.5}
#dust i{position:absolute;width:2px;height:2px;background:#d8c9a8;border-radius:50%;
  animation:drift linear infinite}
@keyframes drift{
  0%{transform:translate3d(0,0,0);opacity:0}
  10%{opacity:.7} 90%{opacity:.7}
  100%{transform:translate3d(18px,-120px,0);opacity:0}
}

/* the furnace */
.addr{margin:16px 0 4px;font-size:11px;letter-spacing:.08em;word-break:break-all;
  padding:8px 10px;background:rgba(125,255,106,.07);
  border:1px solid rgba(125,255,106,.3)}
/* the hero: the one number that cannot fall */
.hero{margin:18px 0 6px;padding:16px 14px;
  background:rgba(125,255,106,.06);border:1px solid rgba(125,255,106,.28)}
.hero .said{margin-bottom:8px}
.hero .big{font-size:26px;letter-spacing:.06em;color:#dcffd2;line-height:1.15}
@media (max-width:520px){.hero .big{font-size:20px}}
.hero .never{margin-top:12px;white-space:pre-wrap;font-size:12px;line-height:1.6;
  color:var(--phos-dim);opacity:.8}
.spark{margin-top:12px}
.spark svg{display:block;width:100%;height:34px}
.spark .ln{fill:none;stroke:var(--phos);stroke-width:1.5;vector-effect:non-scaling-stroke}
.spark .fill{fill:rgba(125,255,106,.12);stroke:none}
.sparkfoot{margin-top:5px;font-size:10px;letter-spacing:.14em;opacity:.45}

.furn{margin:10px 0 4px;border-top:1px solid rgba(125,255,106,.2)}
.furn div{display:flex;justify-content:space-between;gap:16px;padding:9px 2px;
  border-bottom:1px solid rgba(125,255,106,.12);font-size:13px}
.furn span{opacity:.6}
.furn b{font-weight:normal;color:#c9ffbd}
.warn{margin-top:18px;padding:12px 14px;white-space:pre-wrap;font-size:12px;
  line-height:1.55;color:#ffd08a;background:rgba(255,160,60,.07);
  border:1px solid rgba(255,160,60,.35)}

/* the grate — the only part of this site that touches a wallet. Deliberately
   plainer than everything else: no glow, no animation, nothing that reads as
   urgency. A man in a basement showing you a number and waiting. */
.grate{margin-top:18px;padding-top:16px;border-top:1px solid rgba(125,255,106,.2)}
.grate .dim{white-space:pre-wrap;line-height:1.55;font-size:13px}
.grate .who2{font-size:11px;letter-spacing:.1em;opacity:.55;margin-bottom:12px}
.grate .amt{display:flex;gap:8px;margin:4px 0}
.grate .amt input{flex:1;min-width:0;background:none;
  border:1px solid rgba(125,255,106,.4);color:var(--phos);
  padding:9px 11px;font:inherit;font-size:14px;letter-spacing:.04em}
.grate .amt input:focus{outline:none;border-color:var(--phos)}
.grate .quote{min-height:20px;margin:12px 0 4px;font-size:13px;color:#c9ffbd;
  letter-spacing:.04em}
.grate .go{margin-top:10px}
.grate .go .dim{margin-bottom:12px;opacity:.72}
.grate .why{margin:10px 0;font-size:11px;opacity:.45;word-break:break-word}
/* "do this without my website" — plainest thing on the page on purpose */
.without{margin-top:20px;padding-top:14px;border-top:1px solid rgba(125,255,106,.14)}
.without button.plain{background:none;border:0;padding:0;font:inherit;font-size:12px;
  letter-spacing:.06em;color:var(--phos-dim);text-decoration:underline;opacity:.75}
.without button.plain:hover{opacity:1;color:var(--phos)}
.without .dim{margin-top:12px;white-space:pre-wrap;line-height:1.6;font-size:12px}
.without .said{margin-top:14px}
.without .addr{margin-top:4px}
button.act,a.act{display:inline-block;margin-top:4px;text-decoration:none;
  background:rgba(125,255,106,.1);border:1px solid rgba(125,255,106,.45);
  color:var(--phos);padding:9px 20px;letter-spacing:.16em;font-size:13px}
button.act:hover,a.act:hover{background:rgba(125,255,106,.2)}
.grate .amt button.act{margin-top:0;white-space:nowrap;padding:9px 14px}

/* the phone. a chat log, styled as a phone rather than as more terminal, because
   it is the one thing down here that was not his idea. */
.chat{margin:-4px -4px 0}
.chat .intro{opacity:.55;margin-bottom:16px}
.chat .day{text-align:center;font-size:10px;letter-spacing:.28em;opacity:.42;
  margin:22px 0 12px;position:relative}
.chat .day::before,.chat .day::after{content:'';position:absolute;top:50%;width:22%;
  height:1px;background:rgba(125,255,106,.18)}
.chat .day::before{left:0} .chat .day::after{right:0}
.chat .msg{margin:7px 0;display:flex;flex-direction:column;align-items:flex-start}
.chat .msg.mine{align-items:flex-end}
.chat .who{font-size:10px;letter-spacing:.14em;opacity:.45;margin:0 0 3px 2px}
.chat .bub{max-width:78%;padding:8px 12px;border-radius:12px 12px 12px 3px;
  background:rgba(125,255,106,.09);border:1px solid rgba(125,255,106,.2);
  font-size:13px;line-height:1.5;white-space:pre-wrap;text-shadow:none}
.chat .msg.mine .bub{border-radius:12px 12px 3px 12px;
  background:rgba(125,255,106,.2);border-color:rgba(125,255,106,.42);color:#d6ffcc}
.chat .none{text-align:center;font-size:10px;letter-spacing:.2em;opacity:.3;
  margin:4px 0 10px}
.chat .left{text-align:center;font-size:10px;letter-spacing:.14em;opacity:.34;
  margin:10px 0}
.chat .foot{margin-top:26px;padding-top:16px;
  border-top:1px solid rgba(125,255,106,.18);opacity:.6;white-space:pre-wrap}

/* the boombox. it does not open anything, it just goes. */
.spot.playing{
  background:rgba(125,255,106,calc(.05 + var(--lvl,0) * .10));
  box-shadow:0 0 0 2px rgba(125,255,106,calc(.35 + var(--lvl,0) * .45)),
             0 0 calc(22px + var(--lvl,0) * 60px) calc(4px + var(--lvl,0) * 16px)
                     rgba(125,255,106,calc(.16 + var(--lvl,0) * .34));
  transform:scale(calc(1 + var(--lvl,0) * .022))}
.spot.playing .tag{opacity:1}

#notes{position:absolute;inset:0;pointer-events:none;z-index:7;overflow:hidden}
#notes span{position:absolute;color:rgba(125,255,106,.85);font-size:20px;
  text-shadow:0 0 12px rgba(125,255,106,.7);
  animation:rise 3.1s ease-out forwards}
@keyframes rise{
  0%{transform:translate(0,0) rotate(0deg) scale(.6);opacity:0}
  12%{opacity:.95}
  100%{transform:translate(var(--dx,20px),-190px) rotate(var(--rot,18deg)) scale(1.15);opacity:0}
}

/* the film, playing on the monitor in the room */
#crtvid{position:absolute;image-rendering:pixelated;object-fit:cover;z-index:6;
  cursor:pointer;box-shadow:0 0 40px 10px rgba(125,255,106,.18)}
#crtoff{position:fixed;left:0;right:0;bottom:44px;z-index:20;text-align:center;
  font-size:11px;letter-spacing:.2em;color:rgba(125,255,106,.6);pointer-events:none}

/* channels */
.chans{margin:14px 0 2px;border-top:1px solid rgba(125,255,106,.2)}
.chans button{display:flex;width:100%;gap:14px;align-items:baseline;
  background:none;border:0;border-bottom:1px solid rgba(125,255,106,.12);
  padding:9px 4px;text-align:left;font-size:13px}
.chans button:hover{background:rgba(125,255,106,.08)}
.chans button.on{background:rgba(125,255,106,.16);color:#c9ffbd}
.chans .play{opacity:.75;min-width:16px}
.chans .note{opacity:.45;font-size:11px;margin-left:auto;text-align:right}

.also{margin-top:20px;background:rgba(125,255,106,.1);
  border:1px solid rgba(125,255,106,.45);padding:10px 18px;letter-spacing:.16em;
  font-size:12px}
.also:hover{background:rgba(125,255,106,.2)}

#sound{position:fixed;left:14px;bottom:12px;z-index:22;background:none;border:0;
  font-size:11px;letter-spacing:.16em;color:rgba(125,255,106,.32);padding:6px}
#sound:hover{color:rgba(125,255,106,.8)}
#sound[aria-pressed="true"]{color:rgba(125,255,106,.72)}

#boring{position:fixed;right:14px;bottom:12px;z-index:22;background:none;border:0;
  font-size:11px;letter-spacing:.16em;color:rgba(125,255,106,.32);padding:6px}
#boring:hover{color:rgba(125,255,106,.8)}

canvas.stack{width:100%;display:block;image-rendering:pixelated;
  background:#0a0f0a;border:1px solid rgba(125,255,106,.3);touch-action:none;
  cursor:pointer;margin-top:12px}

/* ---------- what the object says ---------- */
#panel{position:fixed;inset:0;z-index:60;display:flex;align-items:center;
  justify-content:center;padding:24px;background:rgba(4,8,4,.72);
  transition:opacity .22s}
#panel.out{opacity:0;pointer-events:none}
#panel .screen{position:relative;width:min(680px,100%);max-height:82vh;
  display:flex;flex-direction:column;overflow:hidden;
  background:var(--glass);border:3px solid #1d2a1d;
  box-shadow:0 0 0 6px #10170f, 0 0 60px rgba(125,255,106,.18),
             inset 0 0 90px rgba(125,255,106,.07)}
#panel .screen::after{content:'';position:absolute;inset:0;pointer-events:none;
  background:repeating-linear-gradient(to bottom,
    rgba(0,0,0,.28) 0 2px, transparent 2px 4px)}
#panel .bar{display:flex;justify-content:space-between;align-items:center;
  padding:10px 14px;border-bottom:1px solid rgba(125,255,106,.25);
  letter-spacing:.2em;font-size:13px;background:rgba(125,255,106,.05)}
#panel .bar button{background:none;border:0;font-size:15px;padding:0 4px;opacity:.75}
#panel .bar button:hover{opacity:1}
#panelBody{padding:20px 22px 26px;overflow:auto;white-space:pre-wrap;
  font-size:14px;line-height:1.65;text-shadow:0 0 10px rgba(125,255,106,.35)}
#panelBody .dim{color:var(--phos-dim)}
#panelBody img{max-width:100%;display:block;image-rendering:pixelated;margin:10px 0}
#panelBody video{max-width:100%;display:block;background:#000;margin:6px 0}

/* things inside a panel that need to be interactive */
.ask{display:flex;gap:8px;margin:14px 0 4px}
.ask input{flex:1;min-width:0;background:#08110800;border:1px solid rgba(125,255,106,.4);
  color:var(--phos);padding:8px 10px;font:inherit;font-size:14px}
.ask input:focus{outline:none;border-color:var(--phos)}
.ask button{background:rgba(125,255,106,.12);border:1px solid rgba(125,255,106,.5);
  padding:8px 16px;letter-spacing:.14em}
.out-line{min-height:22px;margin-top:12px}
.out-line.blink::after{content:'_';animation:bl 1.05s steps(1) infinite}
@keyframes bl{50%{opacity:0}}
.said{font-size:11px;letter-spacing:.22em;opacity:.55;margin-bottom:6px}

.tracklist{margin-top:12px;border-top:1px solid rgba(125,255,106,.2)}
.tracklist button{display:flex;width:100%;gap:14px;
  background:none;border:0;border-bottom:1px solid rgba(125,255,106,.12);
  padding:9px 4px;text-align:left;font-size:13px}
.tracklist button:hover{background:rgba(125,255,106,.08)}
.tracklist button.on{background:rgba(125,255,106,.16);color:#c9ffbd}
.tracklist .n{opacity:.5;min-width:22px}

/* ---------- the way in ---------- */
#door{position:fixed;inset:0;z-index:90;background:var(--ink);
  display:flex;align-items:center;justify-content:center;text-align:center;
  transition:opacity .55s}
#door.out{opacity:0;pointer-events:none}
#door .inner{padding:0 22px}
#doorArt{width:190px;height:150px;margin:0 auto 26px;
  background:radial-gradient(ellipse at 50% 120%,rgba(255,233,168,.28) 0%,transparent 62%);
  border-bottom:3px solid #241d17;position:relative}
#doorArt::after{content:'';position:absolute;left:50%;bottom:0;width:120px;height:90px;
  transform:translateX(-50%);
  background:linear-gradient(to top,rgba(255,233,168,.22),transparent)}
#doorLine{margin:0 0 22px;letter-spacing:.2em;font-size:13px;color:var(--phos-dim)}
#doorBtn{background:none;border:2px solid var(--phos);color:var(--phos);
  padding:14px 30px;letter-spacing:.24em;font-size:15px;
  box-shadow:0 0 24px rgba(125,255,106,.2);transition:background .14s,transform .06s}
#doorBtn:hover{background:rgba(125,255,106,.12)}
#doorBtn:active{transform:translateY(2px)}

#hint{position:fixed;left:0;right:0;bottom:14px;z-index:20;text-align:center;
  font-size:11px;letter-spacing:.2em;color:rgba(125,255,106,.45);
  pointer-events:none;transition:opacity .6s}
#hint.gone{opacity:0}

@media (max-width:640px){
  #panelBody{font-size:13px}
  .spot .tag{font-size:10px;top:-26px}
  #hint{font-size:10px;padding:0 16px}
}
