/* Polish v7 · 03.10.2026 · user decisions from the gameplay/didactics review.
   Visual only: no rule, timing or layout of keyboards and learning panels changes. */

/* Wide portal art may extend past the board edge; it must never scroll the page. */
html,body{overflow:clip}

/* 1 · The wanted form stands as large as the word: "say → ②". */
.team:not([data-clue-source='table'])>.prompt .prompt-content{flex-flow:row wrap;align-items:center;align-content:center}
.team[data-clue-source='base']>.prompt .prompt-content .prompt-label{display:none}
.team:not([data-clue-source='table']):not([data-clue-source='base'])>.prompt .prompt-content .prompt-label{flex:0 0 100%}
.team:not([data-clue-source='table'])>.prompt .prompt-content .base-form{width:auto;flex:0 1 auto;overflow:hidden;text-overflow:clip}
.target-cue{display:inline-flex;align-items:center;gap:.16em;margin-left:.2em;flex:none;font-family:Georgia,serif;line-height:1;white-space:nowrap}
.target-cue:empty{display:none}
.target-arrow{font-size:.5em;color:#d9cda5;opacity:.9;translate:0 .04em}
.target-symbol{display:inline-flex;align-items:center;justify-content:center;font-size:.9em;color:#ffe7a3;
  text-shadow:0 0 .22em #ffcf6f99,0 .04em .08em #031017}
.target-symbol .german-flag{width:1.1em;height:.7em;box-shadow:0 0 0 1px #f0dfb066,0 0 .3em #ffd77a66}
.team[data-word-reveal='true'] .target-symbol{text-shadow:0 0 .4em #ffe39acc,0 .04em .08em #031017}
.team[data-question-visible='false'] .target-cue{visibility:hidden}

/* Rift Echo: a returning form carries a violet echo of the word and its mark. */
.team[data-echo='true'] .prompt-content .base-form{text-shadow:0 2px 5px #031017,.13em 0 0 #c4a0ff47,.26em 0 0 #c4a0ff1f}
.team[data-echo='true'] .target-cue::after{content:'';width:.62em;height:.62em;margin-left:.12em;flex:none;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' fill='none' stroke='%23d2b4ff' stroke-width='2.6' stroke-linecap='round'%3E%3Cpath d='M8 16a8 8 0 1 1 8 8'/%3E%3Cpath d='M3 16a13 13 0 1 1 13 13' opacity='.55'/%3E%3Cpath d='m5 12 3 4 4-3'/%3E%3C/svg%3E") center/contain no-repeat;
  filter:drop-shadow(0 0 4px #a67cff)}
.team[data-echo='true'][data-question-visible='true']>.prompt{filter:drop-shadow(0 4px 5px #0006) drop-shadow(0 0 7px #a67cffaa)}

/* 5 · The waiting plate remembers the team's last form. */
.plate-memory{position:absolute;inset:6px 68px 6px 92px;z-index:3;display:flex;align-items:center;gap:.42em;overflow:hidden;white-space:nowrap;
  font:500 clamp(22px,1.75vw,34px)/1 Georgia,serif;color:#d6cfb9;opacity:.86;pointer-events:none}
.plate-memory[hidden]{display:none}
.memory-mark{font-size:.8em}
.memory-mark[data-kind='correct']{color:#a6e7a2}.memory-mark[data-kind='wrong']{color:#f2a08f}.memory-mark[data-kind='omitted']{color:#dfcd9c}
.memory-clue{color:#cdc5ad}
.memory-arrow{display:inline-flex;align-items:center;gap:.15em;font-size:.62em;color:#b8ae92}
.memory-target{display:inline-flex;align-items:center;font-size:1.25em;color:#e9d8a8}
.memory-target .german-flag{width:1.05em;height:.66em}
.plate-memory strong{font-weight:600;color:#e3f6d3}
.memory-echo{display:inline-flex;width:.95em;height:.95em}
.memory-echo svg{width:100%;height:100%;fill:none;stroke:#cdb0ff;stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round;filter:drop-shadow(0 0 5px #a77cff)}
.team[data-memory='true'][data-question-visible='false']>.prompt::before{background-position:14px center;opacity:.42}

/* 2 · Faction banners hang from each team's own bridge deck. */
.faction-banner{position:absolute;z-index:1;pointer-events:none;
  --banner-w:calc(var(--tile-height,60px)*.82);--banner-h:calc(var(--tile-height,60px)*1.5);
  transition:opacity .25s ease;
  width:var(--banner-w);height:var(--banner-h);margin-left:calc(var(--banner-w)*-.5);
  bottom:calc(var(--baseline) - var(--tile-height,60px)*.62 - var(--banner-h));
  transform-origin:50% 0;animation:banner-sway 7s ease-in-out infinite;animation-delay:var(--sway-delay,0s);
  filter:brightness(calc(.84 + var(--storm-light,0)*.55)) saturate(calc(1 - var(--elite-blend,0)*.3)) drop-shadow(0 5px 4px #020b16a0)}
.faction-banner::before{content:'';position:absolute;inset:5% 4% 0;clip-path:polygon(0 0,100% 0,100% 100%,50% 82%,0 100%);
  background:linear-gradient(90deg,#c9d6e6 0 3%,transparent 3% 97%,#c9d6e6 97%),
    linear-gradient(90deg,#081831,#1d3f73 26%,#2f5d9a 50%,#1a3866 76%,#081831)}
.faction-banner[data-team='B']::before{background:linear-gradient(90deg,#e8c46f 0 3%,transparent 3% 97%,#e8c46f 97%),
    linear-gradient(90deg,#2a0907,#6f1b14 26%,#9e2c1f 50%,#651812 76%,#2a0907)}
.faction-banner::after{content:'';position:absolute;left:-6%;right:-6%;top:0;height:7%;border-radius:3px;
  background:linear-gradient(#efe2bb,#a48955 60%,#5f4c2b);box-shadow:0 1px 2px #000b}
.faction-banner img{position:absolute;z-index:1;left:14%;width:72%;top:18%;filter:drop-shadow(0 2px 3px #000a)}
/* The upper lane's banner ends above the lower runner's head; a lower banner fades
   while a keyboard covers it, so no cloth shows between the keys. */
.faction-banner[data-team='A']{--banner-h:calc(var(--tile-height,60px)*1.2)}
#gameScene:has(#teamA[data-input-open='true']) .faction-banner[data-team='B'][data-side='left'],
#gameScene:has(#teamB[data-input-open='true']) .faction-banner[data-team='B'][data-side='right']{opacity:0}
@keyframes banner-sway{0%,100%{rotate:-1.6deg}50%{rotate:1.6deg}}
#gameScene[data-motion='reduced'] .faction-banner,#gameScene[data-paused='true'] .faction-banner{animation-play-state:paused}
@media(prefers-reduced-motion:reduce){.faction-banner{animation:none}}

/* 4 · Power ready: the whole panel breathes in the faction colour until it is used. */
.team.charged .power-panel{box-shadow:0 0 calc(10px + var(--ready-glow,0)*16px) var(--accent),inset 0 0 12px #f2dca633,0 4px 12px #0009}
#gameScene[data-motion='full'][data-paused='false'] .team.charged .power-panel{animation:power-ready-breathe 1.6s ease-in-out infinite}
@keyframes power-ready-breathe{0%,100%{--ready-glow:0;filter:brightness(1)}50%{--ready-glow:1;filter:brightness(1.18)}}
@property --ready-glow{syntax:'<number>';inherits:false;initial-value:0}
.team.charged .charge-pips i.filled{background:#fff0c0;box-shadow:0 0 10px 2px var(--accent)}

/* A cast shows its symbol large just ahead of the caster, below the task plates. */
.power-glyph{position:absolute;z-index:7;bottom:calc(var(--baseline) + var(--tile-height,60px)*.55);width:clamp(76px,6.2vw,120px);aspect-ratio:1;
  margin-left:calc(clamp(76px,6.2vw,120px)*.55);pointer-events:none;color:#fff3cf;
  opacity:calc(min(1,var(--glyph,0)*6)*(1 - var(--glyph,0)));scale:calc(.6 + var(--glyph,0)*.55);
  filter:drop-shadow(0 0 10px var(--accent)) drop-shadow(0 0 22px var(--accent)) drop-shadow(0 3px 3px #000b)}
.power-glyph[hidden]{display:none}
.power-glyph svg{width:100%;height:100%}
.power-glyph[data-power='hex']{color:#ecd7ff;filter:drop-shadow(0 0 10px #b77cff) drop-shadow(0 0 24px #9a5cff) drop-shadow(0 3px 3px #000b)}
.power-glyph[data-power='shield']{color:#e4f8ff;filter:drop-shadow(0 0 10px #9fe3ff) drop-shadow(0 0 24px #6fc7ef) drop-shadow(0 3px 3px #000b)}

/* Portal light for the team behind: crest and panel flare while the charge flies in. */
.energy-flight[data-source='portal-surge']{background:#fff6dc;box-shadow:0 0 10px 4px #ffd98a,0 0 18px 6px #c79bff80;width:12px;height:12px}
.energy-flight[data-source='echo']{background:#efe2ff;box-shadow:0 0 9px 3px #b78cff}
.team[data-cue='surge'] .team-mark{animation:surge-crest 1.1s ease-out}
.team[data-cue='surge'] .power-panel{animation:surge-panel 1.1s ease-out}
@keyframes surge-crest{0%{filter:none}30%{filter:drop-shadow(0 0 12px #ffe39a) drop-shadow(0 0 22px #fff3c6) brightness(1.5)}100%{filter:none}}
@keyframes surge-panel{0%,100%{filter:none}35%{filter:brightness(1.45) drop-shadow(0 0 14px #ffe39a)}}

/* Positive feedback: the correct form arrives with a bright rise, a streak lifts it further. */
#gameScene[data-motion='full'] .team[data-result='correct'] .answer-reveal strong{animation:correct-rise .55s cubic-bezier(.2,1.4,.4,1) both}
#gameScene[data-motion='full'] .team[data-cue='streak'] .answer-reveal strong{animation:streak-rise .8s cubic-bezier(.2,1.4,.4,1) both}
@keyframes correct-rise{0%{scale:.82;filter:brightness(1.8) drop-shadow(0 0 0 #a6f5a0)}45%{scale:1.08;filter:brightness(1.35) drop-shadow(0 0 16px #a6f5a0)}100%{scale:1;filter:none}}
@keyframes streak-rise{0%{scale:.8;filter:brightness(2) drop-shadow(0 0 0 #ffd98a)}40%{scale:1.14;filter:brightness(1.5) drop-shadow(0 0 22px #ffd98a)}100%{scale:1;filter:none}}
.team[data-cue='streak'] .team-mark{filter:drop-shadow(0 0 9px var(--accent)) drop-shadow(0 0 4px #fff3bd)}

#gameScene[data-paused='true'] .power-panel,#gameScene[data-paused='true'] .team-mark{animation-play-state:paused}
@media(prefers-reduced-motion:reduce){.team .power-panel{animation:none!important}.power-glyph{display:none}}
#gameScene[data-motion='full'][data-paused='false'] .team.charged .power-panel[data-reaction-open='true']{animation:power-window-wake 360ms ease-out both,power-ready-breathe 1.6s ease-in-out infinite}

/* 7 · Victory moment (G7): before every result card, the race winner owns the board. */
.victory-moment{position:absolute;inset:0;z-index:9;display:grid;place-items:center;overflow:hidden;pointer-events:none;
  --win:#61b7f2;--win-deep:#0d2747;--win-light:#d7f1ff;
  opacity:clamp(0,min(var(--victory,0)*9,(1 - var(--victory,0))*7),1);
  background:radial-gradient(ellipse at 50% 46%,color-mix(in srgb,var(--win) 34%,transparent) 0%,color-mix(in srgb,var(--win-deep) 70%,#050b14) 46%,#03070dee 82%)}
.victory-moment[hidden]{display:none}
.victory-moment[data-winner='B']{--win:#ef927d;--win-deep:#3d0f0b;--win-light:#ffe3c9}
.victory-moment[data-winner='draw']{--win:#e8cf8e;--win-deep:#272013;--win-light:#fff3d2}
.victory-rays{position:absolute;inset:-30%;rotate:calc(var(--victory,0)*38deg);opacity:calc(.35 + min(.45,var(--victory,0)*3));
  background:repeating-conic-gradient(from 0deg at 50% 50%,color-mix(in srgb,var(--win-light) 22%,transparent) 0 5deg,transparent 5deg 15deg);
  mask:radial-gradient(circle at 50% 50%,#000 0 14%,transparent 52%)}
.victory-stage{position:relative;display:flex;flex-direction:column;align-items:center}
.victory-crest{width:min(34vh,360px);height:auto;
  scale:calc(.5 + .5*min(1,var(--victory,0)*5));
  filter:drop-shadow(0 0 calc(18px + 30px*max(0,1 - var(--victory,0)*4)) var(--win)) drop-shadow(0 0 60px color-mix(in srgb,var(--win) 60%,transparent)) brightness(calc(1 + max(0,.9 - var(--victory,0)*5)))}
.victory-crest[hidden]{display:none}
.victory-heroes{display:flex;gap:2vw;margin-top:max(-11vh,-110px);opacity:clamp(0,(var(--victory,0) - .06)*8,1);translate:0 calc(max(0,.2 - var(--victory,0))*80px)}
.victory-hero{position:relative;width:min(32vh,300px);height:min(32vh,300px);background:radial-gradient(ellipse at 50% 86%,color-mix(in srgb,var(--win) 50%,transparent),transparent 60%)}
.victory-hero[hidden]{display:none}
.victory-hero>div,.victory-hero>img{position:absolute;inset:0;width:100%;height:100%;background-repeat:no-repeat;object-fit:contain;filter:drop-shadow(0 0 14px color-mix(in srgb,var(--win) 70%,transparent))}
.victory-name{margin:max(-2vh,-18px) 0 0;font:600 clamp(42px,5.6vw,108px)/1 Georgia,serif;letter-spacing:.08em;text-transform:uppercase;
  color:#fff6dc;text-shadow:0 0 18px var(--win),0 0 46px color-mix(in srgb,var(--win) 70%,transparent),0 4px 6px #000c;
  opacity:clamp(0,(var(--victory,0) - .12)*7,1);translate:0 calc(max(0,.3 - var(--victory,0))*60px)}
.victory-sparks i{position:absolute;bottom:-4%;left:var(--x);width:calc(8px*var(--s,1));height:calc(8px*var(--s,1));border-radius:50%;
  background:var(--win-light);box-shadow:0 0 12px 3px var(--win);animation:victory-spark 2.6s ease-out infinite;animation-delay:var(--d)}
@keyframes victory-spark{0%{translate:0 0;opacity:0}12%{opacity:1}100%{translate:calc((var(--s,1) - 1)*120px) -88vh;opacity:0}}
.victory-moment[data-motion='reduced'] .victory-sparks,.victory-moment[data-motion='reduced'] .victory-rays{display:none}
.victory-moment[data-motion='reduced'] .victory-crest,.victory-moment[data-motion='reduced'] .victory-name{scale:1;translate:none}
@media(prefers-reduced-motion:reduce){.victory-sparks{display:none}.victory-rays{rotate:none}}
/* The result card marks the race winner's row; expedition totals stay unchanged. */
.phase-overlay[data-race-winner='A'] .score-a,.phase-overlay[data-race-winner='B'] .score-b{box-shadow:0 2px 0 var(--race-win,#e8cf8e),0 10px 18px -12px var(--race-win,#e8cf8e)}
.phase-overlay[data-race-winner='A']{--race-win:#61b7f2}.phase-overlay[data-race-winner='B']{--race-win:#ef927d}
/* The tutorial plate shows the same "go → ②" line as the arena. */
.demo-task .demo-base{display:inline-block;margin:6px 0}
/* turns.css sets the old small cue with !important; the large mark must win here. */
.demo-task .demo-target{display:inline-flex;align-items:center;gap:.16em;margin-left:.2em;font:500 clamp(26px,2.6vw,44px)/1.2 Georgia,serif!important;color:inherit;vertical-align:baseline}
@media(max-width:1000px){.demo-task .demo-target{font-size:25px!important}}
.faction-banner[data-fallen='true']{opacity:0;translate:0 calc(var(--tile-height,60px)*.9);transition:opacity .9s ease-in,translate .9s ease-in}

/* Polish v8 · N5 finale dramaturgy (presentation only). */
.tension-veil{position:absolute;inset:0;z-index:5;pointer-events:none;opacity:0;transition:opacity .8s ease;
  background:radial-gradient(ellipse 75% 70% at 50% 50%,transparent 52%,#ffcf7a1c 72%,#a3322a80 100%)}
#gameScene[data-tension='stretch'] .tension-veil{opacity:.7}
#gameScene[data-tension='close'] .tension-veil{opacity:1}
#gameScene[data-motion='full'][data-paused='false'][data-tension='close'] .tension-veil{animation:tension-beat .92s ease-out infinite}
#gameScene[data-motion='full'][data-paused='false'][data-tension='stretch'] .tension-veil{animation:tension-beat 1.35s ease-out infinite}
@keyframes tension-beat{0%{filter:brightness(1.6) saturate(1.3)}18%{filter:brightness(1)}30%{filter:brightness(1.3)}55%,100%{filter:brightness(.9)}}
#gameScene[data-slow-motion='true'] .landscape{filter:saturate(.75) brightness(.9);transition:filter .3s ease}
#gameScene[data-slow-motion='true'] .tension-veil{opacity:1;background:radial-gradient(ellipse 70% 65% at 50% 50%,transparent 50%,#02060ccc 100%)}
.goal-flash{position:absolute;inset:0;z-index:6;pointer-events:none;mix-blend-mode:screen;
  background:radial-gradient(circle at var(--fx,90%) var(--fy,50%),#fffbe8 0,#ffe7a6 calc(4% + var(--flash,0)*30%),#ffd06a55 calc(10% + var(--flash,0)*55%),transparent calc(18% + var(--flash,0)*80%));
  opacity:clamp(0,min(var(--flash,0)*10,(1 - var(--flash,0))*1.6),1)}
.goal-flash[data-team='A']{background:radial-gradient(circle at var(--fx,90%) var(--fy,50%),#ffffff 0,#cdeeff calc(4% + var(--flash,0)*30%),#61b7f266 calc(10% + var(--flash,0)*55%),transparent calc(18% + var(--flash,0)*80%))}
.goal-flash[data-team='B']{background:radial-gradient(circle at var(--fx,90%) var(--fy,50%),#ffffff 0,#ffe0c4 calc(4% + var(--flash,0)*30%),#ef927d66 calc(10% + var(--flash,0)*55%),transparent calc(18% + var(--flash,0)*80%))}
.goal-flash[hidden]{display:none}
@media(prefers-reduced-motion:reduce){.tension-veil{animation:none!important}.goal-flash{display:none}}

/* Polish v8 · N6 race awards: a duel table on the result card. */
.race-awards{display:grid;gap:7px;margin:14px auto 6px;max-width:560px}
.race-awards[hidden]{display:none}
.award-row{display:grid;grid-template-columns:86px 1fr 86px;align-items:center;gap:14px;
  opacity:0;translate:0 10px;animation:award-in .45s cubic-bezier(.2,1.3,.4,1) forwards;animation-delay:calc(.25s + var(--row)*.16s)}
@keyframes award-in{to{opacity:1;translate:0 0}}
.award-label{display:flex;align-items:center;justify-content:center;gap:10px;font:600 17px/1 Georgia,serif;letter-spacing:.04em;color:#efe3c4;text-transform:uppercase}
.award-icon{display:inline-flex;width:24px;height:24px;flex:none}
.award-icon svg{width:100%;height:100%;fill:none;stroke:#f3d996;stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round;filter:drop-shadow(0 0 4px #f0c45a88)}
.award-row[data-award='streak'] .award-icon svg{fill:#ff9d4d33;stroke:#ffb36b}
.award-row[data-award='echo'] .award-icon svg{stroke:#d2b4ff;filter:drop-shadow(0 0 4px #a67cff)}
.award-row[data-award='powers'] .award-icon svg{fill:#fff1b833}
.award-medal{position:relative;display:grid;place-items:center;height:46px;border-radius:23px;font:600 30px/1 Georgia,serif;color:#fff6dc;
  background:linear-gradient(160deg,#1f4f7a,#0c2238);box-shadow:inset 0 0 0 2px #7fc7f04d,0 4px 10px #0008;font-variant-numeric:tabular-nums;
  counter-reset:award var(--count);animation:award-count 1.1s ease-out forwards;animation-delay:calc(.35s + var(--row)*.16s)}
.award-medal[data-team='B']{background:linear-gradient(160deg,#7a2a1f,#38100b);box-shadow:inset 0 0 0 2px #ffb39a4d,0 4px 10px #0008}
@property --count{syntax:'<integer>';inherits:false;initial-value:0}
@keyframes award-count{from{--count:0}to{--count:var(--target)}}
@supports (counter-reset:x var(--count)){.award-medal{color:transparent}.award-medal::after{content:counter(award);position:absolute;color:#fff6dc;text-shadow:0 2px 4px #000a}}
.award-row[data-leader='A'] .award-medal[data-team='A'],.award-row[data-leader='B'] .award-medal[data-team='B'],.award-row[data-leader='both'] .award-medal{
  box-shadow:inset 0 0 0 2px #ffe08a,0 0 16px #ffd36a99,0 4px 10px #0008}
.award-row[data-leader='A'] .award-medal[data-team='A']::before,.award-row[data-leader='B'] .award-medal[data-team='B']::before,.award-row[data-leader='both'] .award-medal::before{
  content:'★';position:absolute;top:-9px;right:-5px;font:16px/1 Georgia,serif;color:#ffe08a;text-shadow:0 0 6px #ffcc55}
@media(max-height:800px){.race-awards{gap:4px;margin:8px auto 2px}.award-medal{height:36px;font-size:24px}.award-label{font-size:14px}.award-icon{width:20px;height:20px}}
@media(prefers-reduced-motion:reduce){.award-row{animation:none;opacity:1;translate:none}.award-medal{animation:none;--count:var(--target)}}
/* Polish v8 · N7 tutorial scenes: Rift Echo and portal light. */
.demo-lane[data-echo='true'] .demo-base{text-shadow:0 2px 5px #031017,.13em 0 0 #c4a0ff47,.26em 0 0 #c4a0ff1f}
.demo-lane[data-echo='true'] .demo-target::after{content:'';width:.62em;height:.62em;margin-left:.12em;flex:none;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32' fill='none' stroke='%23d2b4ff' stroke-width='2.6' stroke-linecap='round'%3E%3Cpath d='M8 16a8 8 0 1 1 8 8'/%3E%3Cpath d='M3 16a13 13 0 1 1 13 13' opacity='.55'/%3E%3Cpath d='m5 12 3 4 4-3'/%3E%3C/svg%3E") center/contain no-repeat;filter:drop-shadow(0 0 4px #a67cff)}
.demo-lane[data-echo='true'] .demo-task{filter:drop-shadow(0 6px 10px #0006) drop-shadow(0 0 10px #a67cffaa)}
.demo-lane[data-surge='true'] .demo-crystals{color:#fff3c6;text-shadow:0 0 10px #ffd98a,0 0 20px #c79bff;animation:surge-crest 1.1s ease-out}

/* Polish v9 · P1 overtake beat: a light sweep in the new leader's colour, crest and lead flare. */
.overtake-sweep{position:absolute;inset:0;z-index:4;pointer-events:none;overflow:hidden;--win:#8fd8ff}
.overtake-sweep[hidden]{display:none}
.overtake-sweep[data-team='B']{--win:#ffa77f}
.overtake-sweep::before{content:'';position:absolute;top:-20%;bottom:-20%;width:34%;left:calc(-40% + var(--sweep,0)*150%);
  transform:skewX(-18deg);background:linear-gradient(90deg,transparent,color-mix(in srgb,var(--win) 30%,transparent) 35%,#fffbe8b0 50%,color-mix(in srgb,var(--win) 30%,transparent) 65%,transparent);
  mix-blend-mode:screen;opacity:calc(1 - var(--sweep,0)*.6)}
.team[data-overtake='true'] .team-mark{animation:overtake-crest 1.2s ease-out}
.team[data-overtake='true'] .lead-distance{animation:overtake-lead 1.2s cubic-bezier(.2,1.5,.4,1)}
@keyframes overtake-crest{0%{scale:1;filter:none}22%{scale:1.45;filter:drop-shadow(0 0 14px var(--accent)) drop-shadow(0 0 26px #fff6cf) brightness(1.6)}100%{scale:1;filter:none}}
@keyframes overtake-lead{0%{scale:.6}35%{scale:1.5;filter:brightness(1.5) drop-shadow(0 0 8px #ffe39a)}100%{scale:1}}

/* Polish v9 · P2 photo finish: flash, frozen frame, finish line and photo border. */
.photo-finish{position:absolute;inset:0;z-index:8;pointer-events:none}
.photo-finish[hidden]{display:none}
.photo-finish::before{content:'';position:absolute;inset:0;background:#fffef6;opacity:clamp(0,1 - var(--photo,0)*7,1)}
.photo-finish::after{content:'';position:absolute;inset:0;box-shadow:inset 0 0 0 clamp(10px,1.2vw,22px) #0b0d10e6,inset 0 0 120px #000a;
  opacity:clamp(0,(var(--photo,0) - .08)*8,1)}
.photo-line{position:absolute;top:8%;bottom:8%;left:var(--line-x,88%);width:3px;margin-left:-1.5px;
  background:repeating-linear-gradient(#ffe7a3 0 14px,transparent 14px 24px);box-shadow:0 0 10px #ffd36a;opacity:clamp(0,(var(--photo,0) - .1)*8,1)}
.photo-corner{position:absolute;width:clamp(36px,4vw,70px);height:clamp(36px,4vw,70px);border:3px solid #f6ead0;opacity:clamp(0,(var(--photo,0) - .08)*8,1)}
.photo-corner.tl{left:4%;top:7%;border-right:0;border-bottom:0}.photo-corner.tr{right:4%;top:7%;border-left:0;border-bottom:0}
.photo-corner.bl{left:4%;bottom:7%;border-right:0;border-top:0}.photo-corner.br{right:4%;bottom:7%;border-left:0;border-top:0}
.photo-caption{position:absolute;left:50%;top:8.5%;translate:-50% 0;font:600 clamp(22px,2.2vw,40px)/1 Georgia,serif;letter-spacing:.32em;color:#fff6dc;
  text-shadow:0 0 14px #000,0 2px 4px #000;opacity:clamp(0,(var(--photo,0) - .12)*8,1)}
#gameScene[data-photo='true'] .landscape,#gameScene[data-photo='true'] .world{filter:grayscale(.6) sepia(.22) contrast(1.15) brightness(1.05)}

/* Polish v9 · P4 streak transformation: aura from 5 in a row, light crown from 7. Visual only. */
.streak-aura,.streak-crown{position:absolute;pointer-events:none;opacity:0;transition:opacity .5s ease}
.streak-aura{left:12%;right:12%;top:6%;bottom:-2%;z-index:-1;border-radius:46% 46% 40% 40%;
  background:radial-gradient(ellipse 50% 60% at 50% 62%,color-mix(in srgb,var(--accent) 70%,#fff) 0,color-mix(in srgb,var(--accent) 55%,transparent) 38%,transparent 72%);
  filter:blur(6px)}
.team-a .streak-aura{--accent:#61b7f2}.team-b .streak-aura{--accent:#ff8a4d}
.team[data-streak-tier='aura'] .streak-aura,.team[data-streak-tier='crown'] .streak-aura{opacity:.85}
#gameScene[data-motion='full'][data-paused='false'] .team[data-streak-tier] .streak-aura{animation:aura-flicker 1.1s ease-in-out infinite alternate}
@keyframes aura-flicker{0%{scale:1 1;opacity:.7}50%{scale:1.06 1.1;opacity:.95}100%{scale:.97 1.04;opacity:.8}}
.team[data-streak-tier=''] .streak-aura{animation:none!important;opacity:0!important}
.streak-crown{left:50%;top:-6%;width:34%;translate:-50% 0;z-index:5}
.streak-crown svg{width:100%;height:auto;fill:#ffe39a;stroke:#fff6d6;stroke-width:1.5;filter:drop-shadow(0 0 6px #ffd36a) drop-shadow(0 0 14px var(--accent,#ffd36a))}
.team[data-streak-tier='crown'] .streak-crown{opacity:1}
#gameScene[data-motion='full'] .team[data-streak-tier='crown'] .streak-crown{animation:crown-in .7s cubic-bezier(.2,1.6,.4,1) both,crown-float 2.4s ease-in-out .7s infinite}
@keyframes crown-in{0%{scale:.2;translate:-50% 40%;opacity:0}100%{scale:1;translate:-50% 0;opacity:1}}
@keyframes crown-float{0%,100%{translate:-50% 0}50%{translate:-50% -6%}}
#gameScene[data-paused='true'] .streak-aura,#gameScene[data-paused='true'] .streak-crown{animation-play-state:paused}
/* 07.10.2026 · Caption when the aura (5 in a row) or the crown (7 in a row) appears; fades out after about three seconds. */
.streak-label{position:absolute;left:50%;top:-34%;translate:-50% 0;z-index:6;pointer-events:none;opacity:0;white-space:nowrap;
  font:800 clamp(13px,1.15vw,22px)/1 system-ui,sans-serif;letter-spacing:.12em;text-transform:uppercase;color:#fff6d6;
  padding:.35em .7em;border-radius:999px;background:rgba(10,18,30,.72);box-shadow:0 0 0 1px rgba(255,227,154,.55),0 0 18px rgba(255,211,106,.45)}
.team[data-streak-tier='aura'] .streak-label::after{content:'5 in a row'}
.team[data-streak-tier='crown'] .streak-label::after{content:'7 in a row'}
.team[data-streak-tier='aura'] .streak-label{animation:streak-label-aura 3.2s ease both}
.team[data-streak-tier='crown'] .streak-label{animation:streak-label-crown 3.6s ease both}
@keyframes streak-label-aura{0%{opacity:0}12%{opacity:1}78%{opacity:1}100%{opacity:0}}
@keyframes streak-label-crown{0%{opacity:0}12%{opacity:1}82%{opacity:1}100%{opacity:0}}
#gameScene[data-paused='true'] .streak-label{animation-play-state:paused}

/* Polish v9 · P3 storm boss verbs: a crackling violet edge and a lightning mark. */
.team[data-boss='true'][data-question-visible='true']>.prompt{filter:drop-shadow(0 4px 5px #0006) drop-shadow(0 0 9px #b98aff)}
#gameScene[data-motion='full'][data-paused='false'] .team[data-boss='true'][data-question-visible='true']>.prompt{animation:boss-crackle 1.8s steps(1) infinite}
@keyframes boss-crackle{0%,100%{filter:drop-shadow(0 4px 5px #0006) drop-shadow(0 0 9px #b98aff)}12%{filter:drop-shadow(0 4px 5px #0006) drop-shadow(0 0 16px #e6d4ff) brightness(1.15)}15%{filter:drop-shadow(0 4px 5px #0006) drop-shadow(0 0 7px #9a6bff)}52%{filter:drop-shadow(0 4px 5px #0006) drop-shadow(0 0 14px #d9c2ff) brightness(1.08)}55%{filter:drop-shadow(0 4px 5px #0006) drop-shadow(0 0 9px #b98aff)}}
.team[data-boss='true'] .target-cue::before{content:'';order:-1;width:.5em;height:.66em;margin-right:.08em;flex:none;
  background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 28'%3E%3Cpath d='M12 1 2 16h7l-2 11 11-16h-7Z' fill='%23e9dcff' stroke='%23a77cff' stroke-width='1.4' stroke-linejoin='round'/%3E%3C/svg%3E") center/contain no-repeat;
  filter:drop-shadow(0 0 4px #b98aff)}

/* Polish v9 · P7 power spectacle. */
.dash-ghost{position:absolute;inset:0;background-repeat:no-repeat;pointer-events:none;opacity:0;mix-blend-mode:screen;
  filter:brightness(1.6) saturate(.4) drop-shadow(0 0 6px var(--accent))}
.team[data-dash-ghost='true'] .dash-ghost{opacity:var(--ghost-alpha)}
.dash-ghost[data-n='1']{translate:-14% 0;--ghost-alpha:.42}.dash-ghost[data-n='2']{translate:-28% 0;--ghost-alpha:.24}.dash-ghost[data-n='3']{translate:-42% 0;--ghost-alpha:.12}
.team .bridge-lane,.team .bridge-support,.team .faction-banner{translate:calc(var(--tremor,0)*1px) calc(var(--tremor,0)*-.4px)}
.team .world-figure{margin-left:calc(var(--tremor,0)*1px)}

/* Polish v9 · P6 race intro: banners stay rolled up until the runners step out, then unroll. */
#gameScene[data-intro='waiting'] .faction-banner{scale:1 0}
#gameScene[data-intro='entering'] .faction-banner{animation:banner-unroll .9s cubic-bezier(.2,1.25,.4,1) .35s both,banner-sway 7s ease-in-out infinite;transform-origin:50% 0}
@keyframes banner-unroll{from{scale:1 0}to{scale:1 1}}

/* Polish v9 · P9 new class records on the result card. */
.race-records{display:grid;gap:6px;margin:4px auto 8px;max-width:560px}
.race-records[hidden]{display:none}
.record-row{display:grid;grid-template-columns:auto 1fr auto 34px;align-items:center;gap:12px;padding:7px 14px;border-radius:10px;
  background:linear-gradient(100deg,#3a2c0fcc,#14100acc);box-shadow:inset 0 0 0 1px #ffd77a99,0 0 22px #ffcf6a44;
  animation:record-in .7s cubic-bezier(.2,1.5,.4,1) 1.1s both}
.record-badge{font:700 12px/1 system-ui,sans-serif;letter-spacing:.14em;text-transform:uppercase;color:#1d1503;background:linear-gradient(#ffeaa8,#e6b54f);padding:5px 8px;border-radius:5px}
.record-row span{font:600 17px/1 Georgia,serif;color:#f5e6c3;text-align:left}
.record-row b{font:600 26px/1 Georgia,serif;color:#fff4d0;text-shadow:0 0 10px #ffd36a}
.record-row img{width:34px;height:34px;object-fit:contain}
@keyframes record-in{0%{opacity:0;scale:.7}60%{opacity:1;scale:1.06;filter:brightness(1.5)}100%{scale:1;filter:none}}
@media(max-height:800px){.race-records{grid-template-columns:1fr 1fr;gap:5px;margin:2px auto 6px}
  .record-row{grid-template-columns:auto 1fr auto 24px;gap:7px;padding:4px 8px}
  .record-badge{font-size:0;padding:3px 6px}.record-badge::before{content:'★ Record';font-size:10px;letter-spacing:.1em}
  .record-row span{font-size:14px}.record-row b{font-size:18px}.record-row img{width:24px;height:24px}}
@media(prefers-reduced-motion:reduce){.record-row{animation:none}}

/* Polish v8 · P8 camp trophy hall. */
.camp-trophies{margin:10px 0 0;padding:12px 14px;border-block:1px solid #c7b58145;background:linear-gradient(180deg,#0b1a2299,#0b1a2200)}
.camp-trophies[hidden]{display:none}
.trophy-title{margin:0 0 8px;font:700 11px/1 system-ui,sans-serif;letter-spacing:.2em;text-transform:uppercase;color:#d9c48f}
.trophy-houses{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.trophy-house{display:flex;align-items:center;gap:10px;padding:6px 10px;border-radius:10px;background:#0f2433cc;box-shadow:inset 0 0 0 1px #61b7f255}
.trophy-house[data-team='B']{background:#2a1512cc;box-shadow:inset 0 0 0 1px #ef927d55}
.trophy-house img{width:34px;height:34px;object-fit:contain}
.trophy-wins{display:inline-flex;align-items:center;gap:4px;font:600 20px/1 Georgia,serif;color:#ffe9b0}
.trophy-wins svg{width:24px;height:16px;fill:#ffd977;filter:drop-shadow(0 0 4px #ffcf6a)}
.trophy-stars{font:600 18px/1 Georgia,serif;color:#ffe08a}
.trophy-records{list-style:none;margin:10px 0 0;padding:0;display:grid;gap:5px}
.trophy-records li{display:grid;grid-template-columns:1fr auto 24px;align-items:center;gap:10px;font:500 14px/1.2 Georgia,serif;color:#e7dcc0}
.trophy-records strong{font:600 17px/1 Georgia,serif;color:#fff1c8}
.trophy-records img{width:24px;height:24px;object-fit:contain}

/* Polish v9 · P10 extra large board: bigger task word, answer and keys. Only the
   world row gives up height; plates and keyboards keep their places. */
#gameScene[data-board='xl']{--prompt-height:clamp(100px,12.6vh,136px);--answer-height:clamp(48px,5.4vh,60px);--keyboard-height:clamp(176px,23vh,248px)}
#gameScene[data-board='xl'] .key-row button{font-size:clamp(22px,1.9vw,38px)}
#gameScene[data-board='xl'] .key-row .function-key{font-size:clamp(24px,1.9vw,36px)}
@media(max-height:650px){#gameScene[data-board='xl']{--prompt-height:104px;--keyboard-height:180px}}
