/* ============================================================
   pathglyph — the subway map. GENERATED by tools/gen-worlds.py; edit the spec
   there, not this file.

   Tokens for both themes, then the game's own --pa-<role> tokens
   re-pointed at them. Shared scaffolding (card, board, cells, buttons,
   readouts) is in lib/gv-world.css and reads these same tokens.
   ============================================================ */

:root body.gv-world{
  --w-font: 'Bungee', 'Outfit', system-ui, sans-serif;
  --w-radius: 20px;
  --w-bg-0: #0a0e1a;
  --w-bg-1: #111828;
  --w-bg-2: #182236;
  --w-bg-3: #202d46;
  --w-edge-hi: rgba(255,255,255,.08);
  --w-edge-lo: rgba(0,0,0,.55);
  --w-ink: #f5f7ff;
  --w-dim: #a3aec9;
  --w-accent: #ffd400;
  --w-accent-hi: #fff08a;
  --w-accent-lo: #b39300;
  --w-accent-ink: #1a1600;
  --w-accent-text: #ffe14d;
  --w-fill-tint: #ffffff;
  --w-good: #3ddc84;
  --w-good-text: #3ddc84;
  --w-bad: #ff4d4d;
  --w-bad-text: #ff8080;
  --w-warn: #ffd400;
  --w-warn-text: #ffd400;
  --w-blue: #2d9cff;
  --w-violet: #b07cff;
  --w-line: rgba(255,212,0,.30);
  --w-line-soft: rgba(255,212,0,.13);
  --w-glow: rgba(255,212,0,.45);
  --w-glow-soft: rgba(255,212,0,.13);
  --w-drop: rgba(0,0,0,.55);
  --w-glow-scale: 1;
  --w-cell: #1b2540;
  --w-cell-hi: #263254;
  --w-cell-lo: #121a30;
  --w-cell-br: #3a4a78;
  --w-cell-ink: #f5f7ff;
  --w-hole: rgba(0,0,0,.45);
  --w-texture: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 120 120'%3E%3Cg fill='none' stroke='rgba(255,255,255,.035)' stroke-width='4' stroke-linecap='round'%3E%3Cpath d='M-10 30 H50 L90 70 H130'/%3E%3Cpath d='M20 130 V80 L60 40 V-10'/%3E%3C/g%3E%3C/svg%3E") 0 0 / 120px 120px;
  --w-fill-a: #fff08a;
  --w-fill-b: #ffd400;
}

:root[data-theme="light"] body.gv-world{
  --w-bg-0: #e3e7f2;
  --w-bg-1: #eef1f8;
  --w-bg-2: #f5f7fb;
  --w-bg-3: #ffffff;
  --w-edge-hi: rgba(255,255,255,.9);
  --w-edge-lo: rgba(20,16,8,.14);
  --w-ink: #111828;
  --w-dim: #4f5a78;
  --w-accent: #e0b800;
  --w-accent-hi: #fff08a;
  --w-accent-lo: #8a7000;
  --w-accent-ink: #1a1600;
  --w-accent-text: #7a6300;
  --w-fill-tint: #0b0f14;
  --w-good: #1a9d54;
  --w-good-text: #0f6b3a;
  --w-bad: #d2372c;
  --w-bad-text: #a3231b;
  --w-warn: #c98a10;
  --w-warn-text: #7a5008;
  --w-blue: #1b74c8;
  --w-violet: #7233c9;
  --w-line: rgba(17,24,40,.26);
  --w-line-soft: rgba(17,24,40,.11);
  --w-glow: rgba(224,184,0,.3);
  --w-glow-soft: rgba(224,184,0,.12);
  --w-drop: rgba(20,16,8,.16);
  --w-glow-scale: 0.5;
  --w-cell: #ffffff;
  --w-cell-hi: #ffffff;
  --w-cell-lo: #e7ebf5;
  --w-cell-br: #aab4d0;
  --w-cell-ink: #111828;
  --w-hole: rgba(17,24,40,.07);
  --w-texture: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 120 120'%3E%3Cg fill='none' stroke='rgba(17,24,40,.035)' stroke-width='4' stroke-linecap='round'%3E%3Cpath d='M-10 30 H50 L90 70 H130'/%3E%3Cpath d='M20 130 V80 L60 40 V-10'/%3E%3C/g%3E%3C/svg%3E") 0 0 / 120px 120px;
  --w-fill-a: #fff08a;
  --w-fill-b: #e0b800;
}

/* ---- the game's own roles, in this world ---- */
:root body.gv-world{
  --pg-gold2: color-mix(in srgb, var(--w-warn) 60%, transparent);
  --pg-ink: var(--w-ink);
  --pg-border2: color-mix(in srgb, var(--w-accent) 40%, transparent);
  --pg-glow: color-mix(in srgb, var(--w-accent) 42%, transparent);
  --pg-glow-strong: color-mix(in srgb, var(--w-accent) 70%, transparent);
}
:root[data-theme="light"] body.gv-world{
  --pg-gold2: color-mix(in srgb, var(--w-warn) 60%, transparent);
  --pg-ink: var(--w-ink);
  --pg-border2: color-mix(in srgb, var(--w-accent) 40%, transparent);
  --pg-glow: color-mix(in srgb, var(--w-accent) 34%, transparent);
  --pg-glow-strong: color-mix(in srgb, var(--w-accent) 55%, transparent);
}

/* ---- the subway map ---- */
:root body.gv-world .gvArcCell{ border-radius: 50%; }
:root body.gv-world .seg{ font-size: 11px; letter-spacing: .04em; }

/* The map. A solid sheet (the card's texture stays behind it), a faint
   grid, stations as white rings, the route as a thick transit line. */
:root body.gv-world .pgMount{
  border: 1px solid var(--w-line);
  border-radius: 18px;
  background: var(--w-bg-0);
  box-shadow: inset 0 0 0 6px var(--w-bg-1), inset 0 0 0 7px var(--w-line-soft), 0 20px 50px var(--w-drop);
}
:root body.gv-world .pgMount::before{ content: none; }
:root body.gv-world .pgMount::after{ inset: 12px; border-radius: 12px; border: 1px dashed var(--w-line); opacity: 1; }
:root body.gv-world .pgGridLine{ stroke: var(--w-line-soft); stroke-width: 1.2; }

:root body.gv-world .pgNodeCircle{ fill: var(--w-cell); stroke: var(--w-dim); stroke-width: 3; }
:root body.gv-world .pgNodeInner{ fill: var(--w-bg-0); opacity: 1; r: 3; }
:root body.gv-world .pgNodeStart .pgNodeCircle{ fill: var(--w-good); stroke: var(--w-cell); }
:root body.gv-world .pgNodeEnd .pgNodeCircle{ fill: var(--w-bad); stroke: var(--w-cell); }
:root body.gv-world .pgNodeStart .pgNodeInner, :root body.gv-world .pgNodeEnd .pgNodeInner{ opacity: 0; }
:root body.gv-world .pgGlyph{ font-family: var(--w-font); font-size: 15px; fill: var(--w-bg-0); }
:root body.gv-world .pgNodeStart .pgGlyph, :root body.gv-world .pgNodeEnd .pgGlyph{ fill: var(--w-bg-0); }
:root[data-theme="light"] body.gv-world .pgNodeEnd .pgGlyph{ fill: #fff; }
:root[data-theme="light"] body.gv-world .pgNodeStart .pgGlyph{ fill: var(--w-ink); }
:root body.gv-world .pgNodeBlocked{ opacity: .5; fill: var(--w-bg-1) !important; stroke: var(--w-dim) !important; stroke-dasharray: 3 3; }
:root body.gv-world .pgNeighbor .pgNodeCircle{ stroke: var(--w-accent); filter: drop-shadow(0 0 8px var(--w-glow)); }
:root body.gv-world .pgVisited{ opacity: 1; }
:root body.gv-world .pgVisited .pgNodeCircle{ fill: var(--w-accent); stroke: var(--w-cell); }
:root body.gv-world .pgVisited .pgNodeInner{ fill: var(--w-accent-lo); opacity: 1; }

:root body.gv-world .pgInk{ stroke: var(--w-accent); stroke-width: 13; filter: drop-shadow(0 4px 10px rgba(0,0,0,.35)); }
:root body.gv-world .pgInkHi{ stroke: rgba(255,255,255,.55); stroke-width: 4; opacity: .8; }
:root body.gv-world .pgInkGhost{ stroke: var(--w-accent); stroke-width: 13; opacity: .35; stroke-dasharray: 10 12; }
:root body.gv-world .pgMount.pgWin .pgInk{ stroke: var(--w-good); filter: drop-shadow(0 0 14px var(--w-good)); }
:root body.gv-world .pgMount.pgWin::after{ border-color: var(--w-good); box-shadow: 0 0 0 2px var(--w-good), 0 0 30px var(--w-good); }
:root body.gv-world .pgWinSweep{ background: linear-gradient(110deg, transparent 30%, rgba(255,255,255,.18) 45%, transparent 60%); }

/* legend chips */
:root body.gv-world .pgLegendItem{ border-color: var(--w-line); background: var(--w-bg-1); color: var(--w-ink); }
:root body.gv-world .pgIcon{ font-family: var(--w-font); }
:root body.gv-world .pgStart{ background: var(--w-good); border-color: var(--w-good); color: var(--w-bg-0); }
:root body.gv-world .pgEnd{ background: var(--w-bad); border-color: var(--w-bad); color: var(--w-bg-0); }
:root[data-theme="light"] body.gv-world .pgEnd{ color: #fff; }
:root[data-theme="light"] body.gv-world .pgStart{ color: var(--w-ink); }
:root body.gv-world .pgStone{ background: var(--w-cell); border: 3px solid var(--w-dim); }
:root body.gv-world .pgBlock{ background: var(--w-bg-1); border: 1px dashed var(--w-dim); }

/* ---- carried over from the game's earlier skin, re-pointed ---- */
/* The path is drawn as SVG ink, so the glow belongs on the stroke itself.
   drop-shadow on the element, not box-shadow, which SVG geometry ignores. */
:root body.gv-world .pgInk{
  filter: drop-shadow(0 0 6px color-mix(in srgb, var(--w-accent) calc(75% * var(--w-glow-scale)), transparent));
}
:root body.gv-world .pgInkHi{
  filter: drop-shadow(0 0 10px color-mix(in srgb, var(--w-accent) calc(95% * var(--w-glow-scale)), transparent));
}
:root body.gv-world .pgInkGhost{ opacity: .45; }
:root body.gv-world .pgNodeStart,
:root body.gv-world .pgNodeEnd{
  filter: drop-shadow(0 0 8px color-mix(in srgb, var(--w-warn) calc(80% * var(--w-glow-scale)), transparent));
}
:root body.gv-world .pgNodeCircle{
  filter: drop-shadow(0 0 4px color-mix(in srgb, var(--w-accent) calc(45% * var(--w-glow-scale)), transparent));
}
:root body.gv-world .pgMount.pgWin .pgInk{
  filter: drop-shadow(0 0 12px color-mix(in srgb, var(--w-good) calc(90% * var(--w-glow-scale)), transparent));
}
:root body.gv-world .pgMount.pgIllegal{ animation: pgNo .36s ease; }
@keyframes pgNo{ 0%,100%{transform:none} 30%{transform:translateX(-5px)} 70%{transform:translateX(5px)} }
