/* $GIN — one stylesheet, no framework.

   Two layers, deliberately.

   THE SKIN is the art's: navy sampled off the flat templates, the cat's warm
   off-white, one silver gradient, mincho for anything that speaks. Every
   colour was sampled rather than picked — see docs/ui-context.md.

   THE CHROME is a night terminal, and it is machined out of silver: sections
   are windows with title bars and filenames, the only navigation is a taskbar
   along the bottom, and every edge on it is bevelled — light where it faces
   up, dark where it faces down.

   The chrome is still achromatic and it still never GLOWS. A bevel is
   reflected light; the cat is the only thing on this page that emits any, and
   nothing around him is allowed to compete with that. Value, never colour,
   and never a light of its own. */

:root {
  --night: #080e1c;
  --ink: #0d1c3b;
  --ink-lift: #13284f;
  --slate: #3c4c74;   /* rules and separators only — 2.1:1 on --night, never text */
  --haze: #9aa7c4;    /* body, 7.4:1 */
  --haze-2: #7686a6;  /* small print, 5.7:1 on --night and 5.0:1 on --ink */
  --cream: #fffdef;
  --lamp: #f2b263;

  --ag-1: #ffffff;
  --ag-2: #dfe4ee;
  --ag-3: #a9b2c4;
  --ag-4: #6f7a91;

  /* SILVER, PROPERLY. Two ramps, because one cannot do both jobs.

     --ag-chrome is polished metal and it is built around a HORIZON: the hard
     value flip at 46-50% where the surface stops reflecting the sky and
     starts reflecting the ground. That flip is the whole trick. The previous
     single ramp ran #737d92 to #f7f9fc — all mid-to-light, no darks — which
     is why it read as light grey with a shimmer rather than as metal. Note
     also the hue split: the top stops are cool (sky) and the 74% stop is
     deliberately less blue (ground). Silver is achromatic overall and never
     uniformly so.

     Only the biggest type gets it: the wordmark, the slogan slabs, the
     primary button. Below about 40px the dark band closes up and muddies. */
  --ag-chrome: linear-gradient(176deg,
    #fbfcfe 0%, #cfd6e2 14%, #99a2b4 30%, #5f6878 46%,
    #eef2f8 50%, #c2c8d2 60%, #8d9199 74%, #b9bcc0 88%, #e6e9ee 100%);

  /* A struck coin: the same light direction, but the whole ramp lives in the
     top half of the value range so that dark ink on top of it stays readable.
     --ag-chrome here put its dark band straight through the middle of the
     button, exactly where the label sits, and "See the nights" nearly
     disappeared. A face you print on is not the same surface as a face you
     only look at. Worst point is #b9c1d0, which is 10:1 against --ink. */
  --ag-coin: linear-gradient(176deg, #ffffff 0%, #e9edf5 34%, #b9c1d0 52%, #e2e7f0 68%, #f6f8fc 100%);

  /* The same light direction as --ag-chrome with a shallower dark band, so
     the horizon survives down to about 28px. For type that is large but not
     enormous — the stat numerals, which go from 48px to 28px across the
     breakpoints. Worst point #7c8698 is 5.3:1 on --night. */
  --ag-chrome-soft: linear-gradient(176deg,
    #f8fafd 0%, #ccd3e0 26%, #7c8698 46%, #e6ebf3 52%, #a8b0c0 74%, #dde3ed 100%);

  /* The old ramp, kept for small type where the chrome horizon would close
     up: a lateral sheen, all mid-to-light on purpose. */
  --ag-sheen: linear-gradient(100deg, #7e879b 0%, #eef1f7 18%, #b6bdcd 34%, #f7f9fc 52%, #8c94a8 68%, #e3e7f0 86%, #737d92 100%);

  /* A machined edge: light where it faces up, dark where it faces down. This
     is reflected light, not emitted — the cat is still the only thing on this
     page that glows, and a bevel does not compete with him. */
  --ag-up: rgba(226, 232, 245, 0.22);
  --ag-down: rgba(3, 6, 14, 0.55);
  --ag-edge: inset 0 1px 0 var(--ag-up), inset 0 -1px 0 var(--ag-down);
  --ag-edge-in: inset 0 1px 0 var(--ag-down), inset 0 -1px 0 var(--ag-up);

  --display: "Zen Old Mincho", "Hiragino Mincho ProN", "Yu Mincho", Georgia, serif;
  --body: "Zen Kaku Gothic New", "Hiragino Sans", "Yu Gothic", system-ui, -apple-system, "Segoe UI", sans-serif;
  --mono: "IBM Plex Mono", ui-monospace, SFMono-Regular, Consolas, monospace;

  --pad: clamp(1rem, 4vw, 4rem);
  --line: rgba(169, 178, 196, 0.18);
  --rule: 1px solid var(--line);

  /* The texture in every title bar, the way an old window had one. A light
     line AND a dark one now: a single light line is a stripe, a light/dark
     pair is a machined surface. */
  --stripes: repeating-linear-gradient(0deg,
    rgba(226, 232, 245, 0.06) 0 1px,
    rgba(3, 6, 14, 0.14) 1px 2px,
    transparent 2px 4px);
}

*, *::before, *::after { box-sizing: border-box; }

html { scroll-behavior: smooth; scroll-padding-top: 4.5rem; }

body {
  margin: 0;
  /* Clears the fixed taskbar. */
  padding-bottom: 3.5rem;
  background: var(--night);
  color: var(--haze);
  font: 400 clamp(1rem, 0.95rem + 0.25vw, 1.0625rem)/1.7 var(--body);
  -webkit-font-smoothing: antialiased;
  overflow-x: hidden;
}

/* height:auto is load-bearing: the width/height attributes on every <img> are
   presentational hints, and without this the height attribute wins over
   aspect-ratio and the tiles render 238x512 instead of square. */
img { max-width: 100%; display: block; height: auto; }

a { color: var(--ag-2); text-decoration-color: rgba(169, 178, 196, 0.4); text-underline-offset: 3px; }
a:hover { color: var(--ag-1); text-decoration-color: currentColor; }

h1, h2, h3 { font-family: var(--display); font-weight: 700; line-height: 1.15; color: var(--ag-1); margin: 0; }

:focus-visible { outline: 2px solid var(--lamp); outline-offset: 3px; }

.skip {
  position: absolute; left: -9999px; top: 0; z-index: 60;
  background: var(--ag-1); color: var(--ink); padding: 0.75rem 1.25rem; font-weight: 700;
}
.skip:focus { left: 0; }

/* ---------------------------------------------------------------- the bar */

.bar {
  position: sticky; top: 0; z-index: 40;
  display: flex; align-items: center; gap: 1rem;
  padding: 0.7rem var(--pad);
  background: rgba(8, 14, 28, 0.84);
  backdrop-filter: blur(14px);
  border-bottom: var(--rule);
}

.bar__mark { display: flex; align-items: baseline; gap: 0.55rem; text-decoration: none; }
.bar__kanji { font-family: var(--display); font-size: 1.5rem; color: var(--ag-2); line-height: 1; }
.bar__word { font-family: var(--display); font-weight: 900; font-size: 1.25rem; letter-spacing: 0.14em; color: var(--ag-1); }

/* The small wordmarks take the lateral sheen, not the chrome ramp: at 20px
   the horizon would land inside the stroke and read as a smudge. */
@supports (-webkit-background-clip: text) or (background-clip: text) {
  .bar__word, .foot__mark span {
    background: var(--ag-sheen); -webkit-background-clip: text; background-clip: text; color: transparent;
  }
  .foot__mark i { -webkit-text-fill-color: var(--ag-4); }
}

.bar__path { margin: 0 auto 0 0.5rem; font: 400 0.75rem var(--mono); letter-spacing: 0.08em; color: var(--ag-4); }

.chip {
  display: inline-flex; align-items: center; gap: 0.5rem;
  padding: 0.35rem 0.8rem;
  border: 1px solid rgba(242, 178, 99, 0.35);
  color: var(--lamp); font: 500 0.75rem var(--mono); letter-spacing: 0.08em; text-transform: uppercase;
  text-decoration: none; white-space: nowrap;
}
.chip:hover { color: var(--lamp); border-color: rgba(242, 178, 99, 0.75); }
.chip__dot { width: 6px; height: 6px; background: var(--lamp); }

/* --------------------------------------------------------------- the hero */

.hero {
  position: relative;
  display: grid; grid-template-columns: 1.05fr 0.95fr; align-items: center; gap: clamp(2rem, 5vw, 5rem);
  padding: clamp(2.5rem, 7vw, 6rem) var(--pad) clamp(2rem, 5vw, 4rem);
}

/* One large 銀 behind the type, never rotated and never animated. */
.hero__kanji {
  position: absolute; left: -0.1em; top: 50%; transform: translateY(-50%);
  font-family: var(--display); font-weight: 900; font-size: min(46vw, 34rem); line-height: 1;
  color: var(--ag-1); opacity: 0.05; pointer-events: none; user-select: none;
}
/* A brushed plate rather than a flat grey shape. It sits under body copy, so
   it stays far enough down in opacity to never fight it. */
@supports (-webkit-background-clip: text) or (background-clip: text) {
  .hero__kanji {
    background: var(--ag-chrome); -webkit-background-clip: text; background-clip: text; color: transparent;
  }
}

.hero__text { position: relative; }

.hero__eyebrow { margin: 0 0 1rem; color: var(--ag-3); font: 400 0.8125rem var(--mono); letter-spacing: 0.2em; text-transform: uppercase; }
.hero__eyebrow i { font-style: italic; }

.wordmark {
  margin: 0 0 1.25rem;
  font-weight: 900; font-size: clamp(4.5rem, 15vw, 10.5rem); letter-spacing: 0.02em; line-height: 0.9;
  color: var(--ag-2);
}
@supports (-webkit-background-clip: text) or (background-clip: text) {
  .wordmark { background: var(--ag-chrome); -webkit-background-clip: text; background-clip: text; color: transparent; }
}

.hero__sub { margin: 0 0 2rem; max-width: 40ch; font-size: clamp(1.0625rem, 1rem + 0.4vw, 1.1875rem); color: var(--ag-3); }
.hero__cta { display: flex; flex-wrap: wrap; gap: 0.75rem; margin-bottom: 2rem; }
.hero__note { margin: 0; max-width: 46ch; font-size: 0.9375rem; color: var(--haze-2); }
.hero__note a { color: var(--haze); }

.hero__art { margin: 0; position: relative; }
.hero__art figcaption {
  margin-top: 0.75rem; font-family: var(--display); font-size: 0.9375rem; color: var(--ag-4); letter-spacing: 0.08em;
}

/* ------------------------------------------------------------- the window */

/* The frame around a single picture: the hero's, and the lightbox's. Its bar
   carries a filename and a size and no controls, so there is no button glyph
   on it pretending to be one. The panels below DO toggle, and theirs does. */
.win {
  border: 1px solid rgba(169, 178, 196, 0.22);
  border-top-color: rgba(226, 232, 245, 0.4);
  border-bottom-color: rgba(3, 6, 14, 0.6);
  background: var(--ink);
}

.win__bar {
  display: flex; align-items: center; gap: 0.75rem; margin: 0;
  padding: 0.45rem 0.7rem;
  font: 500 0.6875rem/1.4 var(--mono); letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--ag-3);
  border-bottom: 1px solid var(--line);
  background-image: var(--stripes);
  box-shadow: var(--ag-edge);
}
.win__meta { margin-left: auto; color: var(--haze-2); }

.hero__art .win img { box-shadow: 0 30px 80px -40px rgba(120, 160, 220, 0.45); }

/* ------------------------------------------------------------- the panels */

.panel { margin: clamp(1rem, 2.5vw, 2rem) var(--pad); }
.panel > details, .panel__fixed {
  border: 1px solid var(--line);
  border-top-color: rgba(226, 232, 245, 0.34);
  border-bottom-color: rgba(3, 6, 14, 0.5);
  background: linear-gradient(180deg, rgba(13, 28, 59, 0.5), rgba(8, 14, 28, 0));
}

.panel__bar {
  display: flex; align-items: center; gap: 0.75rem; margin: 0;
  padding: 0.55rem 0.8rem;
  font: 500 0.75rem/1.4 var(--mono); letter-spacing: 0.12em;
  color: var(--ag-2);
  border-bottom: 1px solid var(--line);
  background-image: var(--stripes);
  box-shadow: var(--ag-edge);
}

summary.panel__bar { cursor: pointer; list-style: none; }
summary.panel__bar::-webkit-details-marker { display: none; }

.panel__jp { font-family: var(--display); font-size: 0.875rem; color: var(--ag-4); letter-spacing: 0.1em; }
.panel__count { margin-left: auto; color: var(--haze-2); text-transform: uppercase; letter-spacing: 0.1em; font-size: 0.6875rem; }

/* The toggle state, drawn rather than iconified. It follows the count, so on
   a panel that does not collapse there is simply nothing there. */
summary.panel__bar::after { content: "[ − ]"; color: var(--ag-3); letter-spacing: 0; }
details:not([open]) > summary.panel__bar::after { content: "[ + ]"; }
summary.panel__bar:hover::after { color: var(--ag-1); }

.panel__body { padding: clamp(1.5rem, 4vw, 3rem); }

.panel--warn > .panel__fixed { border-color: rgba(242, 178, 99, 0.28); }
.panel--warn .panel__bar { color: var(--lamp); border-bottom-color: rgba(242, 178, 99, 0.2); }
.panel--warn .panel__jp, .panel--warn .panel__count { color: rgba(242, 178, 99, 0.7); }

/* ------------------------------------------------------------ the marquee */

.marquee { overflow: hidden; border-block: var(--rule); padding: 0.7rem 0; }
.marquee__track { display: flex; align-items: center; gap: 1.5rem; width: max-content; animation: slide 60s linear infinite; }
.marquee:hover .marquee__track, .marquee:focus-within .marquee__track { animation-play-state: paused; }
.marquee span { font: 400 0.75rem var(--mono); letter-spacing: 0.18em; text-transform: uppercase; color: var(--ag-4); white-space: nowrap; }
.marquee i { font-family: var(--display); font-style: normal; color: var(--slate); font-size: 0.8125rem; }

@keyframes slide { from { transform: translateX(0); } to { transform: translateX(-50%); } }

/* ------------------------------------------------------------- the heads */

.head { max-width: 62ch; margin-bottom: clamp(1.5rem, 3vw, 2.5rem); }
.head h2 { font-size: clamp(1.75rem, 4vw, 2.75rem); margin-bottom: 0.75rem; }
.head__sub { margin: 0; color: var(--haze); max-width: 58ch; }

/* ---------------------------------------------------------------- the art */

.grid {
  list-style: none; margin: 0; padding: 0;
  display: grid; gap: clamp(0.75rem, 1.5vw, 1.25rem);
  grid-template-columns: repeat(auto-fill, minmax(min(100%, 15rem), 1fr));
}
.grid--six { grid-template-columns: repeat(auto-fill, minmax(min(100%, 13rem), 1fr)); }

.tile a {
  position: relative; display: block; overflow: hidden;
  border: 1px solid rgba(169, 178, 196, 0.16);
  background: var(--ink);
  text-decoration: none;
  transition: border-color 180ms ease, box-shadow 180ms ease, transform 180ms ease;
}
.tile a:hover, .tile a:focus-visible {
  border-color: rgba(223, 228, 238, 0.55);
  box-shadow: 0 18px 45px -22px rgba(120, 160, 220, 0.6);
  transform: translateY(-2px);
}
.tile img { width: 100%; aspect-ratio: 1; object-fit: cover; transition: transform 320ms ease; }
.tile a:hover img { transform: scale(1.035); }

.tile b {
  position: absolute; left: 0; right: 0; bottom: 0;
  padding: 2.5rem 0.85rem 0.7rem;
  font-family: var(--display); font-weight: 700; font-size: 0.9375rem; letter-spacing: 0.04em;
  color: var(--cream);
  background: linear-gradient(180deg, rgba(8, 14, 28, 0), rgba(8, 14, 28, 0.85));
}

/* ------------------------------------------------------------ profile kit */

.kit { display: grid; grid-template-columns: minmax(0, 0.85fr) minmax(0, 1.15fr); gap: clamp(1rem, 2.5vw, 2rem); align-items: start; }
.kit__banners { display: grid; gap: clamp(1rem, 2.5vw, 2rem); }

.kit__pfp, .kit__banner {
  display: block; text-decoration: none; border: 1px solid rgba(169, 178, 196, 0.16); background: var(--ink);
  transition: border-color 180ms ease, box-shadow 180ms ease;
}
.kit__pfp:hover, .kit__banner:hover, .kit__pfp:focus-visible, .kit__banner:focus-visible {
  border-color: rgba(223, 228, 238, 0.55);
  box-shadow: 0 18px 45px -22px rgba(120, 160, 220, 0.6);
}
.kit__banner img { width: 100%; aspect-ratio: 3 / 1; object-fit: cover; }

.kit__label {
  display: flex; flex-wrap: wrap; align-items: baseline; gap: 0.5rem; justify-content: space-between;
  padding: 0.7rem 0.9rem;
  font-family: var(--display); font-size: 0.9375rem; letter-spacing: 0.04em; color: var(--ag-2);
  border-top: var(--rule);
}
.kit__label i { font: 400 0.6875rem var(--mono); font-style: normal; letter-spacing: 0.08em; color: var(--haze-2); }

/* --------------------------------------------------------------- the name */

.cards { list-style: none; margin: 0 0 2rem; padding: 0; display: grid; gap: clamp(1rem, 2.5vw, 1.75rem); grid-template-columns: repeat(auto-fit, minmax(min(100%, 17rem), 1fr)); }
.card { padding: clamp(1.25rem, 3vw, 2rem); background: var(--ink); border: 1px solid rgba(169, 178, 196, 0.14); }
.card__glyph { margin: 0 0 1rem; font-family: var(--display); font-weight: 900; font-size: 3.25rem; line-height: 1; color: var(--ag-3); }
.card h3 { font-size: 1.3125rem; margin-bottom: 0.6rem; }
.card p:last-child { margin: 0; font-size: 0.9375rem; }
.card i { color: var(--ag-2); font-style: italic; }

.name__foot { margin: 0; max-width: 60ch; color: var(--haze-2); font-size: 0.9375rem; }

/* ------------------------------------------------------------- the status */

/* A config file, because that is the most boring possible way to say a thing
   that people need to believe. */
.cfg {
  margin: 0 0 2rem; padding: clamp(1rem, 3vw, 1.5rem);
  background: rgba(8, 14, 28, 0.55); border: 1px solid var(--line);
  font: 400 clamp(0.75rem, 0.7rem + 0.25vw, 0.875rem)/1.9 var(--mono);
  color: var(--haze-2);
  overflow-x: auto;
}
.cfg b { color: var(--lamp); font-weight: 500; }
/* The comments carry real information — "none exists. not hidden, not soon."
   is the sentence somebody needs to read — so they are subordinate to the
   values but never drop below readable. --slate would be 2.1:1 here. */
.cfg i { color: var(--haze-2); font-style: normal; }

.status__warn {
  margin: 0 0 1.5rem; padding: clamp(1rem, 3vw, 1.5rem);
  border-left: 2px solid rgba(242, 178, 99, 0.5); background: rgba(242, 178, 99, 0.05);
  color: var(--ag-2); font-size: 0.9375rem;
}
.status__warn strong { color: var(--lamp); font-weight: 700; }

.status__fine { margin: 0; color: var(--haze-2); font-size: 0.875rem; }

/* ------------------------------------------------------------- the footer */

.foot { padding: clamp(2rem, 4vw, 3.5rem) var(--pad); border-top: var(--rule); }
.foot__row { display: flex; flex-wrap: wrap; align-items: center; gap: 1rem 2rem; margin-bottom: 1.25rem; }
.foot__mark { display: flex; align-items: center; gap: 0.75rem; text-decoration: none; font-family: var(--display); font-weight: 900; letter-spacing: 0.12em; color: var(--ag-1); }
.foot__mark img { border-radius: 50%; }
.foot__mark i { font-style: normal; font-weight: 700; color: var(--ag-4); }
.foot__links { display: flex; flex-wrap: wrap; gap: 0.5rem; }
.foot__links a {
  padding: 0.4rem 0.75rem;
  border: 1px solid rgba(169, 178, 196, 0.16);
  background: linear-gradient(180deg, rgba(226, 232, 245, 0.07), rgba(3, 6, 14, 0.18));
  box-shadow: var(--ag-edge);
  color: var(--ag-2); text-decoration: none; white-space: nowrap;
  font: 500 0.6875rem var(--mono); letter-spacing: 0.1em;
  transition: border-color 140ms ease, color 140ms ease;
}
.foot__links a:hover { color: var(--ag-1); border-color: rgba(223, 228, 238, 0.5); }

.foot__none { margin: 0 0 0 auto; font-size: 0.875rem; color: var(--haze-2); max-width: 42ch; }
.foot__fine { margin: 0; max-width: 70ch; font-size: 0.875rem; color: var(--haze-2); }

/* ------------------------------------------------------------ the taskbar */

.task {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 45;
  display: flex; align-items: center; gap: 0.5rem;
  padding: 0.4rem 0.6rem;
  background: rgba(11, 22, 45, 0.94);
  backdrop-filter: blur(12px);
  border-top: 1px solid rgba(169, 178, 196, 0.22);
  font: 500 0.6875rem var(--mono); letter-spacing: 0.1em;
  /* Lit along its top edge, the way the lip of a metal strip is. */
  box-shadow: inset 0 1px 0 var(--ag-up);
}

.task__start, .task__items a {
  display: inline-flex; align-items: center; gap: 0.4rem;
  padding: 0.4rem 0.7rem;
  border: 1px solid rgba(169, 178, 196, 0.16);
  color: var(--ag-3); text-decoration: none; white-space: nowrap;
  /* Each one is a key: raised, with a lit top edge and a shadowed bottom. */
  background: linear-gradient(180deg, rgba(226, 232, 245, 0.07), rgba(3, 6, 14, 0.18));
  box-shadow: var(--ag-edge);
  transition: border-color 140ms ease, color 140ms ease, background-color 140ms ease, box-shadow 140ms ease;
}
.task__start { color: var(--ag-1); border-color: rgba(169, 178, 196, 0.3); }
.task__start span { font-family: var(--display); font-size: 0.875rem; }

.task__items { display: flex; gap: 0.35rem; overflow-x: auto; scrollbar-width: none; }
.task__items::-webkit-scrollbar { display: none; }

.task__items a:hover, .task__start:hover { color: var(--ag-1); border-color: rgba(223, 228, 238, 0.5); }

/* Pressed, the way a taskbar button is pressed for the window you are in. */
.task__items a[aria-current="true"] {
  color: var(--ag-1);
  background: linear-gradient(180deg, rgba(3, 6, 14, 0.32), rgba(226, 232, 245, 0.06));
  border-color: rgba(223, 228, 238, 0.45);
  box-shadow: var(--ag-edge-in);
}

.task__warn { color: var(--lamp) !important; border-color: rgba(242, 178, 99, 0.3) !important; }
.task__warn[aria-current="true"] { background: rgba(242, 178, 99, 0.14) !important; border-color: rgba(242, 178, 99, 0.6) !important; }

.task__clock { margin: 0 0 0 auto; padding-left: 0.75rem; color: var(--haze-2); white-space: nowrap; font-variant-numeric: tabular-nums; }

/* ------------------------------------------------------------- the button */

.btn {
  display: inline-flex; align-items: center; justify-content: center;
  padding: 0.8rem 1.5rem; border: 1px solid transparent;
  font: 700 0.9375rem/1 var(--body); letter-spacing: 0.04em;
  text-decoration: none; cursor: pointer;
  transition: transform 140ms ease, box-shadow 140ms ease, border-color 140ms ease, color 140ms ease;
}
.btn:active { transform: translateY(1px); }

/* A struck coin: the gradient as the face, the ink as the stamp. */
.btn--silver { background: var(--ag-coin); color: var(--ink); box-shadow: var(--ag-edge); }
.btn--silver:hover { color: var(--ink); box-shadow: var(--ag-edge), 0 12px 30px -12px rgba(200, 214, 240, 0.55); }
/* Pressed, the bevel inverts, which is what a real key does. */
.btn--silver:active { box-shadow: var(--ag-edge-in); }

.btn--ghost { background: transparent; border-color: rgba(169, 178, 196, 0.35); color: var(--ag-2); }
.btn--ghost:hover { border-color: var(--ag-2); color: var(--ag-1); }

/* ----------------------------------------------------------- the lightbox */

.lightbox {
  position: fixed; inset: 0; z-index: 50;
  display: flex; align-items: center; justify-content: center;
  padding: clamp(1rem, 4vw, 3rem);
  background: rgba(4, 7, 14, 0.94);
  animation: fade 140ms ease;
}
.lightbox[hidden] { display: none; }

@keyframes fade { from { opacity: 0; } to { opacity: 1; } }

.lightbox__figure { margin: 0; max-width: 76rem; width: 100%; }
.lightbox__body {
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 19rem);
  gap: clamp(1rem, 3vw, 2rem); align-items: center;
  padding: clamp(1rem, 2.5vw, 1.75rem);
}
.lightbox__body img { width: 100%; max-height: min(70vh, 42rem); object-fit: contain; border: 1px solid var(--line); }
.lightbox figcaption h3 { font-size: clamp(1.375rem, 3vw, 2rem); margin-bottom: 0.75rem; }
.lightbox figcaption p { margin: 0 0 1.5rem; font-size: 0.9375rem; color: var(--haze); }
.lightbox__actions { display: flex; flex-wrap: wrap; gap: 0.75rem; }

.lightbox__close {
  margin-left: 0.5rem; width: 1.5rem; height: 1.5rem; padding: 0;
  display: grid; place-content: center;
  background: transparent; border: 1px solid var(--line); color: var(--ag-3);
  font-size: 1rem; line-height: 1; cursor: pointer;
}
.lightbox__close:hover { border-color: var(--ag-2); color: var(--ag-1); }

.lightbox__nav {
  position: absolute; top: 50%; transform: translateY(-50%); z-index: 2;
  width: 2.75rem; height: 4rem;
  background: rgba(13, 28, 59, 0.75); border: 1px solid var(--line); color: var(--ag-2);
  font-size: 1.75rem; line-height: 1; cursor: pointer;
  transition: border-color 140ms ease, color 140ms ease;
}
.lightbox__nav:hover { border-color: var(--ag-2); color: var(--ag-1); }
.lightbox__nav--prev { left: 0.5rem; }
.lightbox__nav--next { right: 0.5rem; }

/* ---------------------------------------------------------------- a toast */

.toast {
  position: fixed; left: 50%; bottom: 4.5rem; z-index: 60; transform: translate(-50%, 1rem);
  margin: 0; padding: 0.65rem 1.2rem;
  background: var(--ag-1); color: var(--ink);
  font: 500 0.75rem var(--mono); letter-spacing: 0.08em; text-transform: uppercase;
  opacity: 0; pointer-events: none; transition: opacity 180ms ease, transform 180ms ease;
}
.toast[data-show] { opacity: 1; transform: translate(-50%, 0); }

/* ------------------------------------------------------- the typed line */

/* One deadpan statement at a time under the wordmark, typed out and deleted.
   min-height holds a line and a half so the hero does not jump as lines of
   different lengths come and go. Each line rests complete for 2.4s, which is
   most of its life and is when a screenshot gets taken. */
.type {
  margin: 0 0 1.5rem; min-height: 1.6em;
  font: 400 clamp(0.9375rem, 0.9rem + 0.3vw, 1.0625rem)/1.6 var(--mono);
  letter-spacing: 0.04em; color: var(--ag-2);
}
.type__caret {
  display: inline-block; width: 0.6em; height: 1.1em; margin-left: 0.15em;
  background: var(--lamp); vertical-align: -0.18em;
  animation: blink 1.1s steps(1) infinite;
}
@keyframes blink { 0%, 50% { opacity: 1; } 50.01%, 100% { opacity: 0; } }

/* --------------------------------------------------------- the stat band */

.stats {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(4, 1fr);
  border-block: var(--rule);
}
.stats li {
  padding: clamp(1rem, 2.5vw, 1.75rem) var(--pad);
  border-right: var(--rule);
}
.stats li:last-child { border-right: 0; }
.stats b {
  display: block;
  font: 500 clamp(1.75rem, 5vw, 3rem)/1 var(--mono); letter-spacing: -0.02em;
  color: var(--ag-1);
}
@supports (-webkit-background-clip: text) or (background-clip: text) {
  .stats b { background: var(--ag-chrome-soft); -webkit-background-clip: text; background-clip: text; color: transparent; }
}
.stats span {
  display: block; margin-top: 0.5rem;
  font: 400 0.6875rem var(--mono); letter-spacing: 0.14em; text-transform: uppercase; color: var(--haze-2);
}

/* ------------------------------------------------------- the error box */

.dialog {
  max-width: 34rem; margin: clamp(2rem, 5vw, 3.5rem) var(--pad);
  border: 1px solid rgba(242, 178, 99, 0.35);
  background: var(--ink);
  /* Sat slightly off the page, the way a dialog sits on top of a window. */
  box-shadow: 10px 10px 0 rgba(8, 14, 28, 0.55);
}
.dialog[hidden] { display: none; }

.dialog__bar {
  display: flex; align-items: center; margin: 0; padding: 0.45rem 0.5rem 0.45rem 0.8rem;
  font: 500 0.6875rem var(--mono); letter-spacing: 0.18em; color: var(--lamp);
  border-bottom: 1px solid rgba(242, 178, 99, 0.25);
  background-image: var(--stripes);
  box-shadow: var(--ag-edge);
}
.dialog__x {
  margin-left: auto; width: 1.4rem; height: 1.4rem; padding: 0;
  display: grid; place-content: center;
  background: transparent; border: 1px solid rgba(242, 178, 99, 0.35); color: var(--lamp);
  font-size: 0.9rem; line-height: 1; cursor: pointer;
}
.dialog__x:hover { border-color: var(--lamp); background: rgba(242, 178, 99, 0.12); }

.dialog__body { display: flex; gap: 1rem; padding: clamp(1.25rem, 3vw, 1.75rem); }
.dialog__icon {
  flex: none; margin: 0; width: 2rem; height: 2rem;
  display: grid; place-content: center;
  border: 1px solid rgba(242, 178, 99, 0.5); color: var(--lamp);
  font: 700 1.125rem var(--mono);
}
.dialog__head { margin: 0 0 0.5rem; font: 500 1rem/1.4 var(--mono); color: var(--ag-1); }
.dialog__msg { margin: 0; font-size: 0.9375rem; color: var(--haze); }
.dialog__jp { margin: 0.5rem 0 0; font-family: var(--display); font-size: 0.9375rem; color: var(--ag-4); }

.dialog__actions {
  display: flex; gap: 0.6rem; justify-content: flex-end; margin: 0;
  padding: 0 clamp(1.25rem, 3vw, 1.75rem) clamp(1.25rem, 3vw, 1.75rem);
}

/* A small squared button, for the chrome. Mono, so it belongs to the window
   rather than to the page. */
.btn--dialog {
  padding: 0.45rem 1.1rem; border-color: rgba(169, 178, 196, 0.35);
  background: linear-gradient(180deg, rgba(226, 232, 245, 0.08), rgba(3, 6, 14, 0.2));
  color: var(--ag-2);
  font: 500 0.75rem var(--mono); letter-spacing: 0.1em;
  box-shadow: var(--ag-edge);
}
.btn--dialog:active { box-shadow: var(--ag-edge-in); }
.btn--dialog:hover { border-color: var(--ag-2); color: var(--ag-1); background: rgba(169, 178, 196, 0.08); }

/* --------------------------------------------------------- the slogans */

/* The slabs of type people screenshot. Nothing else is on the screen. */
.slogan { padding: clamp(3rem, 9vw, 7rem) var(--pad); border-block: var(--rule); }
.slogan--right { text-align: right; }

.slogan__en {
  margin: 0 0 1rem;
  font-family: var(--display); font-weight: 900;
  font-size: clamp(2.25rem, 8.5vw, 6rem); line-height: 0.98; letter-spacing: 0.01em;
  color: var(--ag-2);
}
@supports (-webkit-background-clip: text) or (background-clip: text) {
  .slogan__en { background: var(--ag-chrome); -webkit-background-clip: text; background-clip: text; color: transparent; }
}
.slogan__jp {
  margin: 0; font-family: var(--display); font-weight: 700;
  font-size: clamp(1rem, 2.5vw, 1.5rem); letter-spacing: 0.16em; color: var(--ag-4);
}

/* ------------------------------------------------- the contract address */

.ca { margin: 0 0 1.5rem; border: 1px solid rgba(242, 178, 99, 0.3); background: rgba(8, 14, 28, 0.55); }
.ca__bar {
  display: flex; flex-wrap: wrap; gap: 0.5rem 1rem; justify-content: space-between; margin: 0;
  padding: 0.5rem 0.8rem;
  font: 500 0.6875rem var(--mono); letter-spacing: 0.14em; color: var(--haze-2);
  border-bottom: 1px solid rgba(242, 178, 99, 0.2);
  background-image: var(--stripes);
  box-shadow: var(--ag-edge);
}
.ca__warn { color: var(--lamp); }
.ca__row { display: flex; flex-wrap: wrap; align-items: center; gap: 0.75rem; margin: 0; padding: 0.9rem 0.8rem; }
.ca__value {
  flex: 1 1 14rem;
  font: 400 clamp(0.875rem, 0.8rem + 0.4vw, 1.125rem) var(--mono); letter-spacing: 0.02em;
  color: var(--ag-1);
}

/* -------------------------------------------------- copy, from the grid */

/* Injected by app.js, because it is useless without JavaScript. It is the
   shortest path there is from looking at a picture to having it on your
   clipboard — no lightbox, no download, no file in a folder somewhere. */
.tile { position: relative; }
.tile__copy {
  position: absolute; top: 0.5rem; right: 0.5rem; z-index: 2;
  padding: 0.35rem 0.6rem;
  background: linear-gradient(180deg, rgba(28, 40, 66, 0.92), rgba(8, 14, 28, 0.92));
  border: 1px solid rgba(169, 178, 196, 0.35);
  box-shadow: var(--ag-edge);
  color: var(--ag-2); font: 500 0.625rem var(--mono); letter-spacing: 0.1em;
  cursor: pointer; transition: opacity 160ms ease, border-color 160ms ease, color 160ms ease;
}
.tile__copy:hover { border-color: var(--ag-2); color: var(--ag-1); }

/* Visible by default, hidden ONLY where hovering is genuinely possible.
   Written the other way round first — hidden by default, revealed by
   `@media (hover: none)` — which left an invisible but perfectly tappable
   button sitting over the corner of every picture on any device whose hover
   support the query did not resolve. A control you cannot see and can still
   press is worse than one that is always there. */
@media (hover: hover) {
  .tile__copy { opacity: 0; }
  .tile:hover .tile__copy, .tile__copy:focus-visible { opacity: 1; }
}

/* ------------------------------------------------------------ small print */

@media (max-width: 60rem) {
  .hero { grid-template-columns: 1fr; }
  .hero__art { order: -1; max-width: 26rem; }
  .kit { grid-template-columns: 1fr; }
  .lightbox__body { grid-template-columns: 1fr; }
  .lightbox__body img { max-height: 48vh; }
}

@media (max-width: 45rem) {
  .foot__none { margin-left: 0; }
  .stats { grid-template-columns: repeat(2, 1fr); }
  .stats li:nth-child(2) { border-right: 0; }
  .stats li:nth-child(-n+2) { border-bottom: var(--rule); }
  .dialog { margin-inline: var(--pad); box-shadow: 6px 6px 0 rgba(8, 14, 28, 0.55); }
  .dialog__body { flex-direction: column; gap: 0.75rem; }
  .bar__path { display: none; }
  .bar__mark { margin-right: auto; }
  .task__clock { display: none; }
  .task__start { padding: 0.4rem 0.5rem; }
  .lightbox__nav { width: 2.25rem; height: 3.25rem; font-size: 1.375rem; }
  .lightbox__body { padding: 0.85rem; }
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .marquee__track { animation: none; }
  .type__caret { animation: none; }
  *, *::before, *::after { transition-duration: 1ms !important; animation-duration: 1ms !important; }
}
