/* Nudge board (shared by raven-nudge chain games): reels of their own heights, vertically centred (a hull), and a layer
   over them for the raven's swoop. Colours and decoration come from the game's skin: --window-bg (a reel), --reel-gap,
   --window-radius, --win-glow, --win-ring, --rune-glow (a landed rune), --lantern (the budget pulse), --spin-blur. */
.nudge-board{position:relative}
.nudge-board .hull{display:grid;grid-template-columns:repeat(var(--reels,6),var(--cell));column-gap:var(--reel-gap,3px);align-items:center;height:calc(var(--cell)*var(--rows,5))}
.nudge-board .nreel{position:relative;height:calc(var(--cell)*var(--h,3));overflow:hidden;border-radius:var(--window-radius,8px);background:var(--window-bg,rgba(0,0,0,.55))}
.nudge-board .strip{position:absolute;left:0;right:0;top:0;will-change:transform}
.nudge-board .nreel.spinning .strip{filter:blur(var(--spin-blur,1.3px)) brightness(.85)}
.nudge-board .nreel.tease{box-shadow:inset 0 0 26px var(--accent)}
.nudge-board .nreel.cawing{box-shadow:inset 0 0 0 2px var(--accent)}
.nudge-board .cell{height:var(--cell);display:flex;align-items:center;justify-content:center;position:relative}
.nudge-board .sym{position:relative;width:88%;height:88%;transition:filter .2s}
.nudge-board .sym img{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;-webkit-user-drag:none}
/* landing (.landed) and entering (.enter) are one-shot: nudge.js drops them once played or when a win mark takes the
   cell, so a cleared mark never plays a landing again */
.nudge-board .cell.landed .sym{animation:nb-land .32s ease-out}
.nudge-board .cell.win .sym{animation:nb-throb 420ms var(--ease-std,ease-in-out) infinite alternate;filter:drop-shadow(0 0 8px var(--win-glow)) brightness(1.12)}
.nudge-board .cell.win::after{content:"";position:absolute;inset:5%;border-radius:10px;border:2px solid var(--win-ring,var(--primary));box-shadow:0 0 12px var(--win-glow);pointer-events:none}
.nudge-board .cell.dim .sym{filter:brightness(.4) saturate(.6)}
/* a rune that lands or enters: a ring that swells once (static glow with reduced motion) */
.nudge-board .cell.rune .sym{filter:drop-shadow(0 0 7px var(--rune-glow,var(--primary)))}
.nudge-board .cell.rune::before{content:"";position:absolute;inset:8%;border-radius:50%;border:2px solid var(--rune-glow,var(--primary));opacity:0;pointer-events:none;animation:nb-rune .7s ease-out}
/* the budget pulse: a lantern glow at the reel's top (a small shape, never a screen flash; it fades out in .1 s; reduced
   motion shows none — nudge.js leaves it off, as it would blink with every nudge) */
.nudge-board .nreel::before{content:"";position:absolute;inset:0;z-index:3;pointer-events:none;opacity:0;transition:opacity .1s;background:radial-gradient(70% calc(var(--cell)*.9) at 50% 0,var(--lantern,rgba(255,214,140,.75)),transparent)}
.nudge-board .nreel.lantern::before{opacity:.6;animation:nb-lantern .28s ease-out}
.nudge-board .fly{position:absolute;inset:0;pointer-events:none;z-index:5}
.nudge-board .raven-fly{position:absolute;left:0;top:0;width:var(--cell);height:var(--cell);display:flex;align-items:center;justify-content:center}
.nudge-board .raven-fly .sym{width:80%;height:80%;filter:drop-shadow(0 4px 6px rgba(0,0,0,.45))}
@keyframes nb-land{0%{transform:translateY(-5%)}55%{transform:translateY(2.5%)}100%{transform:none}}
@keyframes nb-throb{to{transform:scale(1.06)}}
@keyframes nb-rune{0%{opacity:.95;transform:scale(.6)}100%{opacity:0;transform:scale(1.35)}}
@keyframes nb-lantern{0%{opacity:0}45%{opacity:.85}100%{opacity:.6}}
/* reduced motion: no landing bounce, no swelling rings, no throb (shell.css also caps every animation) */
body.still .nudge-board .cell.landed .sym,body.still .nudge-board .cell.win .sym,body.still .nudge-board .cell.rune::before,body.still .nudge-board .nreel.lantern::before{animation:none}
@media (prefers-reduced-motion:reduce){
  .nudge-board .cell.landed .sym,.nudge-board .cell.win .sym,.nudge-board .cell.rune::before,.nudge-board .nreel.lantern::before{animation:none}
  .nudge-board .nreel.spinning .strip{filter:none}
}
