@charset "UTF-8";
:root{color-scheme:dark;--body:"Yu Gothic UI","Yu Gothic","Meiryo",sans-serif;--serif:"Yu Mincho","Hiragino Mincho ProN",serif;--b-text:#ece8d6;--b-muted:#9fb5b1;--b-gold:#e8d49a;--b-line:#9cc0b845;--b-panel:#050f16d9;--b-teal:#7ff5e4}
*{box-sizing:border-box}
body{margin:0;overflow:hidden;background:#010407;color:var(--b-text);font-family:var(--body);font-size:14px;line-height:1.7}
button,input{font:inherit}
button{cursor:pointer;color:inherit;border:0;background:none;transition:background .18s,transform .18s,box-shadow .18s,border-color .18s}
button:disabled{cursor:default}
button:focus-visible,a:focus-visible,input:focus-visible{outline:3px solid #e8b95a;outline-offset:3px}
button:not(:disabled):active{transform:translateY(1px)}
a{color:inherit;text-decoration:none}
[hidden]{display:none!important}
svg{width:22px;height:22px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
svg use[href="#i-star"],svg use[href="#i-play"]{fill:currentColor;stroke:none}
.svg-library{position:absolute;width:0;height:0;overflow:hidden}
h1,h2,h3,p{margin-top:0}
.eyebrow{font-size:10px;line-height:1.5;font-weight:700;letter-spacing:.3em;margin:0 0 12px;color:var(--b-gold);display:flex;align-items:center;gap:9px}
.primary-button{display:flex;align-items:center;justify-content:center;gap:10px;padding:14px 22px;font:700 14px var(--serif);letter-spacing:.06em;min-height:50px}
.primary-button svg{width:18px;height:18px}
.text-button{display:block;color:var(--b-muted);font-size:11px;padding:15px 5px 0;margin:0 auto}
.text-button:hover{color:var(--b-gold);text-decoration:underline}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
/* Dialogs (help, pause, result, evolution) */
.modal{border:1px solid #9fd3cb55;background:radial-gradient(ellipse at 50% 0,#12303a,#060f15 70%);color:var(--b-text);border-radius:4px;padding:34px;max-width:510px;width:calc(100% - 32px);box-shadow:0 30px 100px #000c;max-height:90vh;overflow-y:auto}
.modal::backdrop{background:#01050acc;backdrop-filter:blur(4px)}
.modal:focus{outline:none}
.modal-close{position:absolute;right:17px;top:13px;font-size:24px;color:var(--b-muted)}
.modal h2{font-family:var(--serif);font-size:26px;line-height:1.6;margin-bottom:18px;color:#f6ecc9}
.modal>.primary-button{width:100%}
.privacy-note{font-size:10px;color:var(--b-muted);line-height:1.9;margin:17px 0 24px}
.small-modal{text-align:center;max-width:390px}
.small-modal .eyebrow{justify-content:center}
.small-modal p:not(.eyebrow){font-size:13px;color:var(--b-muted);margin-bottom:25px}
.evolution-modal{text-align:center}
.evolution-modal .eyebrow{justify-content:center}
.evolution-modal h2{margin-bottom:0}
.evolution-reveal{position:relative;height:280px;display:flex;align-items:center;justify-content:center}
.evolution-reveal>span{position:absolute;inset:20px 40px;border-radius:50%;background:radial-gradient(ellipse,#7ff5e455,transparent 70%);animation:glow 2s infinite}
.evolution-reveal img{height:270px;width:270px;object-fit:contain;position:relative;animation:reveal .8s ease-out}
.evolution-modal h3{font-size:19px;margin-bottom:10px;color:#f6ecc9}
.evolution-modal>p:not(.eyebrow){font-size:12px;color:var(--b-muted);margin-bottom:25px}
@keyframes glow{0%,100%{box-shadow:0 0 0 0 #d8b74922}50%{box-shadow:0 0 16px 4px #d8b74933}}
@keyframes reveal{from{transform:scale(.5);opacity:0;filter:brightness(3)}to{transform:scale(1);opacity:1;filter:brightness(1)}}
/* Battle — a 16:9 stage that scales as one picture. Sizes inside use cqw (1% of the stage width). */
body.battle-mode{overflow:hidden;background:#010407;--b-text:#ece8d6;--b-muted:#9fb5b1;--b-gold:#e8d49a;--b-line:#9cc0b845;--b-panel:#050f16d9;--b-teal:#7ff5e4}
.battle-screen{position:fixed;inset:0;z-index:10;display:grid;place-items:center;background:radial-gradient(ellipse at 50% 40%,#0b1c26,#010407 72%);color:var(--b-text)}
.arena{position:relative;width:min(100vw,177.78vh);aspect-ratio:16/9;overflow:hidden;container-type:inline-size;isolation:isolate;user-select:none;-webkit-user-select:none}
.arena kbd{font:max(10px,.72cqw) ui-monospace,Consolas,monospace;border:1px solid #cfe3dc55;border-bottom-width:2px;border-radius:3px;padding:0 .35cqw;color:var(--b-gold)}
.arena-scene{position:absolute;inset:0}
.arena-bg{position:absolute;inset:-2%;background:url(./assets/concepts/battle-arena.webp) center/cover;filter:saturate(.92) brightness(.8);transition:filter .25s}
.arena[data-story="prologue"] .arena-bg{background-image:url(./assets/story/volk-throne-intact-v1.webp);filter:saturate(.82) brightness(.7)}
.arena[data-story="root-path"] .arena-bg{background-image:url(./assets/story/chapter2-forest-walk-map-v1.webp);filter:saturate(.78) brightness(.55)}
.arena-scene:before{content:"";position:absolute;inset:0;z-index:1;pointer-events:none;background:linear-gradient(#010509e0,#01050900 26%,#01050900 56%,#010509f0 100%),radial-gradient(ellipse at 50% 42%,#01050900 48%,#010509b0 100%)}
.arena-mist{position:absolute;z-index:1;left:-10%;right:-10%;bottom:24%;height:30%;pointer-events:none;background:radial-gradient(ellipse at 30% 50%,#a8dcea24,#a8dcea00 60%),radial-gradient(ellipse at 72% 60%,#a8dcea1c,#a8dcea00 55%);filter:blur(1.5cqw);animation:b-mist 16s ease-in-out infinite alternate}
.arena.skill-dim .arena-bg{filter:saturate(.6) brightness(.38)}
#effects{position:absolute;inset:0;width:100%;height:100%;z-index:3;pointer-events:none}
#backfx{position:absolute;inset:0;width:100%;height:100%;z-index:1;pointer-events:none}
/* The mood of a special move: the whole arena changes for a moment (src/specials.mjs ctx.mood). */
.arena[data-mood] .arena-bg{transition:filter .35s}
.arena[data-mood="timestop"] .arena-bg{filter:grayscale(1) brightness(.55) contrast(1.15)}
.arena[data-mood="blood"] .arena-bg{filter:sepia(1) hue-rotate(-40deg) saturate(3.5) brightness(.42)}
.arena[data-mood="night"] .arena-bg{filter:brightness(.28) saturate(.6) hue-rotate(25deg)}
.arena[data-mood="abyss"] .arena-bg,.arena[data-mood="void"] .arena-bg{filter:brightness(.07) saturate(0)}
.arena[data-mood="storm"] .arena-bg{filter:brightness(.3) saturate(.35) hue-rotate(40deg)}
.arena[data-mood="heat"] .arena-bg{filter:sepia(.7) saturate(2.4) hue-rotate(-25deg) brightness(.55)}
.arena[data-mood="sea"] .arena-bg{filter:hue-rotate(15deg) saturate(1.5) brightness(.5)}
.arena[data-mood="forest"] .arena-bg{filter:hue-rotate(-45deg) saturate(1.3) brightness(.45)}
.arena[data-mood="swamp"] .arena-bg{filter:hue-rotate(-70deg) saturate(1.4) brightness(.4)}
.arena[data-mood="crimson"] .arena-bg{filter:hue-rotate(150deg) saturate(1.6) brightness(.38)}
.arena[data-mood="archive"] .arena-bg{filter:sepia(.9) brightness(.42)}
.arena[data-mood="dusk"] .arena-bg{filter:sepia(.6) hue-rotate(-25deg) saturate(1.6) brightness(.45)}
.arena[data-mood] .arena-mist{opacity:.3}
/* A shield: a band over the HP bar and a cool glow on the fighter. */
.hp-bar{position:relative}
.hp-shield{position:absolute;left:0;top:0;bottom:0;width:0;background:repeating-linear-gradient(135deg,#bfe9ffcc 0 4px,#7fc4ffaa 4px 8px);box-shadow:0 0 .8cqw #9fe9ff;transition:width .25s}

/* Fighters: a zero-size anchor at the centre of each platform. JS sets --h, --cx, --ground, --flip and the effect colours. */
.fighter{position:absolute;top:57%;width:0;height:0;z-index:2;--flip:1;--h:22cqw;--cx:.5;--ground:1;--knock:-1}
.player-fighter{left:17%}.cpu-fighter{left:83%;--knock:1}
.fighter-body{position:absolute;left:0;top:0;scale:var(--flip) 1}
.fighter-rig{position:absolute;left:0;bottom:0;height:var(--h);translate:calc(var(--cx) * -100%) calc((1 - var(--ground)) * 100%);transform-origin:50% 100%;animation:b-breathe var(--breath,4s) ease-in-out infinite}
/* People move the way character-preview.html shows them: a slow breath with the feet fixed, and an eyes-only blink layer. */
.fighter.human .fighter-rig{transform-origin:50% 98%;animation-name:idle-human}
.fighter-rig.action-pose{animation:none}
.fighter-sprite{display:block;height:100%;width:auto;max-width:none;filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 .7cqw .6cqw #000d)}
.fighter-blink{position:absolute;inset:0;width:100%;height:100%;opacity:0;filter:hue-rotate(var(--hue,0deg));pointer-events:none;clip-path:ellipse(var(--eye-rx,10%) 3.4% at var(--eye-x,50%) var(--eye-y,15%));transition:opacity 45ms linear}
.fighter.blinking .fighter-blink{opacity:1}
.fighter-rig.action-pose .fighter-blink{display:none}
.fighter-motes{position:absolute;inset:-5%;pointer-events:none}
.fighter-motes i{position:absolute;left:var(--x);top:var(--y);width:var(--size);height:var(--size);border-radius:50%;background:var(--fx,#7ff5e4);box-shadow:0 0 7px var(--fx,#7ff5e4);opacity:0;animation:idle-drift var(--dur) linear var(--delay) infinite}
.fighter-motes[data-kind="ember"] i{border-radius:2px;background:#ffd4a2;box-shadow:0 0 7px #ff914f}
.fighter-motes[data-kind="shadow"] i,.fighter-motes[data-kind="ink"] i{filter:brightness(.68)}
.fighter-rig.action-pose .fighter-motes,.fighter.ko .fighter-motes{display:none}
.fighter-shadow{position:absolute;left:calc(var(--h) * var(--ratio,1) * var(--shadow-offset-x,0) * var(--flip,1));top:0;width:clamp(3cqw,calc(var(--h) * var(--barrier-span,.9) * var(--shadow-width,.58)),14cqw);height:clamp(.4cqw,calc(var(--h) * var(--barrier-span,.9) * var(--shadow-depth,.065)),1.5cqw);translate:-50% -45%;border-radius:50%;background:radial-gradient(ellipse,#000a 14%,#0005 40%,#0000 72%);pointer-events:none}
.fighter .fighter-body{filter:drop-shadow(0 0 calc(var(--charge,0) * 1.3cqw) var(--fx,#7ff5e4));transition:filter .15s}
/* Crouching chargers squat lower as the word fills, and shake when it is nearly done. */
.fighter-rig{scale:calc(1 + var(--crouch,0) * .06) calc(1 - var(--crouch,0) * .11);transition:scale .12s}
.fighter.trembling .fighter-body{animation:b-tremble .07s linear infinite}
.fighter.floating .fighter-body{translate:0 -2cqw;animation:b-float 3.6s ease-in-out infinite}
.fighter.floating .fighter-shadow{opacity:.5}
.fighter.attacking{animation:b-dash .45s cubic-bezier(.3,.7,.3,1)}
.cpu-fighter.attacking{animation-name:b-dash-back}
/* Attack motions (src/moves.mjs attack.motion, timings in src/stagecraft.mjs MOTIONS). The anchor moves across the
   stage (--dir points at the opponent); the rig squashes and turns (--fwd is forward in the picture's own frame). */
.fighter.attacking[data-motion]{animation-duration:var(--motion-time,.5s);animation-timing-function:cubic-bezier(.3,.7,.3,1);animation-fill-mode:none}
.fighter.attacking[data-motion] .fighter-rig{animation-duration:var(--motion-time,.5s);animation-timing-function:ease-out}
.fighter.attacking[data-motion="lunge"]{animation-name:m-lunge}
.fighter.attacking[data-motion="pounce"]{animation-name:m-pounce}.fighter.attacking[data-motion="pounce"] .fighter-rig{animation-name:m-pounce-rig}
.fighter.attacking[data-motion="rush"]{animation-name:m-rush}.fighter.attacking[data-motion="rush"] .fighter-rig{animation-name:m-rush-rig}
.fighter.attacking[data-motion="slam"]{animation-name:m-slam}.fighter.attacking[data-motion="slam"] .fighter-rig{animation-name:m-slam-rig}
.fighter.attacking[data-motion="spin"]{animation-name:m-spin}.fighter.attacking[data-motion="spin"] .fighter-rig{animation-name:m-spin-rig;transform-origin:50% 55%}
.fighter.attacking[data-motion="rear"]{animation-name:m-rear}.fighter.attacking[data-motion="rear"] .fighter-rig{animation-name:m-rear-rig}
.fighter.attacking[data-motion="throw"]{animation-name:m-throw}.fighter.attacking[data-motion="throw"] .fighter-rig{animation-name:m-throw-rig}
.fighter.attacking[data-motion="cast"]{animation-name:m-cast}.fighter.attacking[data-motion="cast"] .fighter-rig{animation-name:m-cast-rig}
.fighter.attacking[data-motion="hop"]{animation-name:m-hop}.fighter.attacking[data-motion="hop"] .fighter-rig{animation-name:m-hop-rig}
.fighter.attacking[data-motion="coil"]{animation-name:m-coil}.fighter.attacking[data-motion="coil"] .fighter-rig{animation-name:m-coil-rig}
.fighter.attacking[data-motion="float"]{animation-name:m-float}.fighter.attacking[data-motion="float"] .fighter-rig{animation-name:m-float-rig}
.fighter.attacking[data-motion="none"]{animation:none}
.fighter.hurt-heavy{animation:b-hurt-heavy .6s ease-out}
/* Body motion per fighter (older data-body values): lunge is the dash above. --dir points at the opponent. */
.player-fighter{--dir:1}.cpu-fighter{--dir:-1}
.fighter.attacking[data-body="hop"]{animation:b-hop .5s cubic-bezier(.3,.7,.3,1)}
.fighter.attacking[data-body="lean"]{animation:b-lean .5s ease-out}
.fighter.attacking[data-body="rise"]{animation:b-rise .55s ease-in-out}
.fighter.attacking[data-body="heavy"]{animation:b-heavy .6s cubic-bezier(.4,0,.2,1)}
.fighter.attacking[data-body="none"]{animation:none}
.fighter.casting{animation:b-cast .8s ease}
.fighter.hurt{animation:b-hurt .42s ease-out}
.fighter.winding .fighter-body{animation:b-wind .45s ease-in-out infinite alternate}
.fighter.hurt .fighter-body{animation:b-flash .42s ease-out}
.fighter.ko{opacity:.3;translate:0 1.6cqw;filter:grayscale(1) brightness(.6);transition:opacity .9s,translate .9s,filter .9s}

/* HUD: two name plates, and the clock with sound and pause under it. Kept short so tall monsters stay clear of it. */
.battle-hud{position:absolute;z-index:5;top:1.8%;left:2%;right:2%;display:grid;grid-template-columns:1fr 8.6cqw 1fr;gap:1.4cqw;align-items:start}
.battle-track-title{position:absolute;z-index:5;top:18%;left:2.3%;max-width:34%;margin:0;padding:.3cqw .7cqw;border-left:1px solid #e8d49a99;background:linear-gradient(90deg,#020a11b8,#020a1100);color:#d8d7cd;font:500 max(11px,.82cqw)/1.35 var(--serif);letter-spacing:.1em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;pointer-events:none;opacity:0}
.battle-track-title[hidden]{display:none}
.battle-track-title.show{animation:b-track-title 4.3s ease-out both}
@keyframes b-track-title{0%{opacity:0;translate:-.5cqw 0}12%,72%{opacity:.82;translate:0 0}100%{opacity:0;translate:0 0}}
.plate{padding:.65cqw 2cqw .8cqw 1.3cqw;background:linear-gradient(100deg,#040d14eb,#06141cd0 70%,#06141c70);border:1px solid var(--b-line);border-top-color:#e8d49a70;clip-path:polygon(0 0,100% 0,calc(100% - 1.4cqw) 100%,0 100%);pointer-events:none}
.cpu-plate{padding:.65cqw 1.3cqw .8cqw 2cqw;background:linear-gradient(260deg,#040d14eb,#06141cd0 70%,#06141c70);clip-path:polygon(0 0,100% 0,100% 100%,1.4cqw 100%)}
.plate{min-width:0}
.plate-name{display:flex;align-items:center;gap:.7cqw;white-space:nowrap;overflow:hidden}
.plate-identity{display:flex;flex:1 1 auto;min-width:0;flex-direction:column;align-items:flex-start;line-height:1.2}
.cpu-plate .plate-identity{align-items:flex-end;text-align:right}
.plate-name strong{min-width:0;overflow:hidden;text-overflow:ellipsis}
.plate-identity strong,.plate-identity .form-title{display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis}
.cpu-plate .plate-name{flex-direction:row-reverse}
.plate-name strong{font:600 max(15px,1.45cqw)/1.3 var(--serif);letter-spacing:.08em}
.plate-name small{font:max(11px,.95cqw) Georgia,serif;color:var(--b-gold)}
.form-title{font-size:max(10px,.75cqw);color:var(--b-muted);letter-spacing:.06em;overflow:hidden;text-overflow:ellipsis}
.side-tag{align-self:center;font-size:max(10px,.72cqw);font-weight:700;letter-spacing:.12em;color:var(--b-teal);border:1px solid currentColor;padding:0 .45cqw;border-radius:2px;line-height:1.6}
.cpu-tag{color:#ff9aac}
.hp-num{margin-left:auto;font-size:max(10px,.75cqw);color:var(--b-muted);letter-spacing:.06em}
.cpu-plate .hp-num{margin-left:0;margin-right:auto}
.hp-bar{position:relative;height:max(12px,1.25cqw);margin-top:.45cqw;background:#01060acc;border:1px solid #cfe3dc40;overflow:hidden}
.hp-bar:after{content:"";position:absolute;inset:0;pointer-events:none;background:repeating-linear-gradient(90deg,transparent 0 calc(10% - 1px),#010509b0 calc(10% - 1px) 10%)}
.hp-fill,.hp-lag{position:absolute;top:0;bottom:0;left:0;width:100%}
.hp-lag{background:#fff0c0;transition:width .5s ease-in .45s}
.hp-fill{background:linear-gradient(#c4fff4,#35c9b4 45%,#10806f);box-shadow:0 0 1cqw #55e3cc88;transition:width .16s ease-out}
.cpu-plate .hp-fill,.cpu-plate .hp-lag{left:auto;right:0}
.cpu-plate .hp-fill{background:linear-gradient(#ffc9d2,#e0506e 45%,#8d1f3f);box-shadow:0 0 1cqw #e0506e88}
.hp-bar.low .hp-fill{background:linear-gradient(#ffd6ad,#ff7b3a 45%,#b4381c);animation:b-low .9s ease-in-out infinite}
.hp-num b{font:max(12px,1cqw) Georgia,serif;color:var(--b-text);letter-spacing:.04em;margin-left:.3cqw}
.clock-col{display:flex;flex-direction:column;align-items:center;gap:.5cqw}
.arena-buttons{display:flex;gap:.4cqw}
.arena-icon{height:max(26px,2.1cqw);min-width:max(26px,2.1cqw);display:flex;align-items:center;justify-content:center;gap:.35cqw;padding:0 .45cqw;border:1px solid var(--b-line);border-radius:3px;background:#06121ab3;color:var(--b-text)}
.arena-icon:hover{background:#17323b}
.arena-icon[aria-pressed="false"]{opacity:.5}
.arena-icon svg{width:max(12px,1cqw);height:max(12px,1cqw)}
.clock{position:relative;width:7.2cqw;aspect-ratio:1;display:flex;flex-direction:column;align-items:center;justify-content:center}
.clock-ring{position:absolute;inset:0;width:100%;height:100%;rotate:-90deg;fill:none}
.clock-track{stroke:#01060a;stroke-width:8;fill:#040c12e6}
.clock-fill{stroke:var(--b-gold);stroke-width:4;stroke-dasharray:100;transition:stroke-dashoffset .3s linear}
.clock strong{position:relative;font:400 2.2cqw/1 Georgia,serif;color:#f6ecc9}
.clock span{position:relative;font-size:max(9px,.68cqw);letter-spacing:.22em;color:var(--b-muted)}
.clock.urgent .clock-fill{stroke:#ff6a55}
.clock.urgent strong{color:#ff8b73;animation:b-tick 1s ease-in-out infinite}

/* Bottom: special move (left), typing (centre), combo (right) */
/* The special-move gauge sits under the player's HP bar, mirroring the CPU's attack gauge. */
.plate-gauge{display:flex;align-items:center;gap:.7cqw;margin-top:.45cqw}
.gauge-name{flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:600 max(11px,.85cqw)/1.2 var(--serif);letter-spacing:.06em;color:var(--b-gold)}
/* Gauges fill one key at a time; the marks split them into quarters. */
.gauge-bar{flex:1 1 40%;min-width:4cqw;position:relative;height:max(8px,.75cqw);background:#01060acc;border:1px solid #e8d49a55;overflow:hidden}
.gauge-bar:after{content:"";position:absolute;inset:0;background:repeating-linear-gradient(90deg,transparent 0 calc(25% - 1px),#010509 calc(25% - 1px) 25%)}
.gauge-fill{position:absolute;top:0;bottom:0;left:0;width:0;background:linear-gradient(#fff2c2,#e3b54f);box-shadow:0 0 .8cqw #f3c65c99;transition:width .12s}
.plate-gauge.ready .gauge-fill{animation:b-pip .8s ease-in-out infinite}
.cpu-plate .plate-gauge{flex-direction:row-reverse}
.cpu-plate .gauge-fill{left:auto;right:0;background:linear-gradient(#ffd0da,#e0506e);box-shadow:0 0 .8cqw #e0506e99}
.skill-button{flex:none;pointer-events:auto;padding:.15cqw .7cqw;font-size:max(10px,.75cqw);font-weight:700;letter-spacing:.06em;border:1px solid #e8d49a40;border-radius:3px;background:#0b1a22;color:#8ea39f}
/* The button only shows once the gauge is full; its space is kept so nothing shifts. */
.skill-button:not(.ready){visibility:hidden}
.skill-button.ready{background:linear-gradient(#ffe7a0,#d9a441);color:#2a1a02;border-color:#fff1c4;animation:b-ready 1.1s ease-in-out infinite}
.combo-dock{position:absolute;z-index:5;bottom:4%;left:2%;width:21%;padding:1.1cqw 1.3cqw;background:var(--b-panel);border:1px solid var(--b-line);border-top-color:#e8d49a55}
.combo-count{display:flex;align-items:baseline;gap:.6cqw}
.combo-count strong{display:inline-block;font:400 3.4cqw/1 Georgia,serif;color:#f6ecc9}
.combo-count span{font-size:max(11px,.85cqw);font-weight:700;letter-spacing:.2em;color:var(--b-gold)}
.combo-count.bump strong{animation:b-bump .25s ease-out}
.ward{display:flex;align-items:center;gap:1cqw;margin:0 0 .5cqw;font-size:max(10px,.72cqw);color:var(--b-muted)}
.ward-dex{display:flex;align-items:center;gap:.3cqw;color:#9fc9ff}
.ward-label{margin-right:.2cqw;letter-spacing:.1em}
.ward-pips{display:flex;gap:.28cqw}
.ward-pips i{display:block;width:.55cqw;height:.55cqw;min-width:6px;min-height:6px;rotate:45deg;background:#9fc9ff;box-shadow:0 0 .5cqw #9fc9ff}
.ward-pips i.used{background:transparent;border:1px solid #9fc9ff55;box-shadow:none}
.ward-pips i.break{animation:w-break .5s ease-out}
.ward-mystic{color:#d3b4ff}
.ward-mystic b{font:max(11px,.8cqw) Georgia,serif}
.growth-pop{position:absolute;left:0;bottom:100%;margin:0 0 .5cqw;padding:.2cqw .7cqw;font-size:max(11px,.85cqw);font-weight:700;letter-spacing:.06em;white-space:nowrap;pointer-events:none;opacity:0}
.growth-pop.show{animation:w-pop 1.3s ease-out}
.growth-pop.saved{color:#e2efff;background:#1b3558ee;border:1px solid #9fc9ff}
.growth-pop.mystic{color:#f5ebff;background:#3a2166ee;border:1px solid #d3b4ff;box-shadow:0 0 1cqw #a77bff88}
@keyframes w-pop{0%{opacity:0;translate:0 .6cqw}12%{opacity:1;translate:0 0}75%{opacity:1}100%{opacity:0;translate:0 -.8cqw}}
@keyframes w-break{0%{scale:2;background:#fff}100%{scale:1}}
.accuracy{margin:0;padding-top:.5cqw;border-top:1px solid var(--b-line);font-size:max(11px,.8cqw);color:var(--b-muted);letter-spacing:.1em}
.accuracy b{font:max(13px,1.2cqw) Georgia,serif;color:var(--b-text);margin-left:.5cqw}
.rune-panel{position:absolute;z-index:5;left:50%;bottom:4%;translate:-50% 0;width:44%;padding:1.1cqw 2cqw .9cqw;text-align:center;background:radial-gradient(ellipse at 50% 0,#12303ae0,#050e15f0 70%);border:1px solid #9fd3cb5c;box-shadow:0 0 3cqw #000a,inset 0 0 2.5cqw #6fe0d11a}
.rune-panel:before{content:"";position:absolute;left:50%;top:-1px;width:36%;height:2px;translate:-50% 0;background:linear-gradient(90deg,#e8d49a00,var(--b-gold),#e8d49a00)}
.word-kicker{margin:0;font-size:max(10px,.75cqw);font-weight:700;letter-spacing:.3em;color:var(--b-gold)}
.rune-panel h2{margin:.1cqw 0 .15cqw;font:700 4.1cqw/1.25 var(--body);letter-spacing:.12em;color:#fbf7e6;text-shadow:0 0 1.5cqw #7ff5e44d}
.word-guide{font:600 2.5cqw/1.35 ui-monospace,Consolas,monospace;letter-spacing:.1em;color:#6f8581;min-height:3.4cqw;overflow-wrap:anywhere}
.word-guide .typed{color:var(--b-teal);text-shadow:0 0 .8cqw #7ff5e499}
.word-guide .just{display:inline-block;animation:b-pop .22s ease-out}
.word-guide .next{display:inline-block;color:#231600;background:linear-gradient(#fff0b8,#f0c350);border-radius:3px;padding:0 .1em;margin:0 .04em;box-shadow:0 0 1.2cqw #f0c35099;animation:b-caret 1s ease-in-out infinite}
.rune-panel.mistake{animation:b-nudge .22s}
.rune-panel.mistake .next{background:linear-gradient(#ffc9b8,#ff6a4d);box-shadow:0 0 1.2cqw #ff6a4daa}
.rune-panel.cleared{animation:b-clear .38s ease-out}
.next-word{margin:.25cqw 0 0;font-size:max(11px,.85cqw);color:var(--b-muted);letter-spacing:.12em}
.next-word b{margin-left:.5cqw;font-weight:600;color:#cfdcd8}
.input-message{margin:.2cqw 0 0;min-height:1.3cqw;font-size:max(11px,.8cqw);color:#8ba19d}
.input-message.warning{color:#ffb08a}

/* Overlays */
.battle-callout{position:absolute;z-index:7;left:50%;top:31%;translate:-50% -50%;pointer-events:none;white-space:nowrap;font:700 2.7cqw/1.2 var(--serif);letter-spacing:.14em;color:#fff3cc;text-shadow:0 0 1.5cqw #f0c350,0 .2cqw .4cqw #000}
.battle-callout.small{font-size:1.6cqw;color:#e9fff9;text-shadow:0 0 1.2cqw #37d6c1,0 .2cqw .4cqw #000}
.battle-callout.show{animation:b-callout .45s cubic-bezier(.2,1.5,.4,1)}
/* Opening: the two names sweep in from either side with VS, pull back, then the call. */
.countdown{position:absolute;inset:0;z-index:9;overflow:hidden;background:radial-gradient(ellipse,#02070bb8,#010407e6)}
.intro-side{position:absolute;width:46%;padding:1.3cqw 3cqw;display:flex;flex-direction:column;gap:.2cqw;opacity:0}
.intro-side.player{left:0;top:30%;background:linear-gradient(90deg,#0b2f38f0,#0b2f3800);border-top:.3cqw solid var(--b-teal)}
.intro-side.rival{right:0;top:52%;text-align:right;background:linear-gradient(270deg,#3d1020f0,#3d102000);border-top:.3cqw solid #ff6b86}
.intro-side small{font-size:max(11px,1cqw);font-weight:700;letter-spacing:.3em;color:var(--b-gold)}
.intro-side b{font:800 3.6cqw/1.2 var(--serif);letter-spacing:.1em;color:#fff4cf;text-shadow:0 .2cqw 1cqw #000}
.intro-vs{position:absolute;left:50%;top:48%;translate:-50% -50%;font:900 7cqw/1 Georgia,serif;letter-spacing:.06em;color:#fff4cf;text-shadow:0 0 1.5cqw #ff6a4d,0 0 3.5cqw #f0c350;opacity:0}
.intro-call{position:absolute;left:50%;top:46%;translate:-50% -50%;margin:0;text-align:center;white-space:nowrap;opacity:0}
.intro-call small{display:block;font:700 max(14px,1.8cqw)/1.2 var(--serif);letter-spacing:.8em;color:var(--b-gold)}
.intro-call b{display:block;font:900 9cqw/1.1 var(--serif);letter-spacing:.14em;color:#fff4cf;text-shadow:0 0 2cqw #f0c350,0 0 5cqw #7ff5e4,0 .4cqw .6cqw #000}
.countdown.play .intro-side.player{animation:i-left 2.6s cubic-bezier(.2,.9,.2,1) forwards}
.countdown.play .intro-side.rival{animation:i-right 2.6s cubic-bezier(.2,.9,.2,1) forwards}
.countdown.play .intro-vs{animation:i-vs 2.6s ease forwards}
.countdown.play .intro-call{animation:i-call 2.6s cubic-bezier(.2,1.3,.4,1) forwards}
.arena.paused .countdown *{animation-play-state:paused}
@keyframes i-left{0%{translate:-100% 0;opacity:1}14%,50%{translate:0 0;opacity:1}60%,100%{translate:-100% 0;opacity:0}}
@keyframes i-right{0%,5%{translate:100% 0;opacity:1}19%,50%{translate:0 0;opacity:1}60%,100%{translate:100% 0;opacity:0}}
@keyframes i-vs{0%,15%{opacity:0;scale:2.6}24%,48%{opacity:1;scale:1}58%,100%{opacity:0;scale:.6}}
@keyframes i-call{0%,56%{opacity:0;scale:2.2}66%,92%{opacity:1;scale:1}100%{opacity:0;scale:1.12}}

/* Special-move cut-in: a tilted band sweeps across with the fighter's skill pose, speed lines, a glint and the move's name. */
.cutin{position:absolute;inset:0;z-index:8;pointer-events:none;overflow:hidden}
.cutin.play{animation:c-dim var(--cutin-time,1.05s) ease forwards}
.cutin-band{position:absolute;left:-15%;right:-15%;top:27%;height:40%;rotate:-7deg;overflow:hidden;translate:-110% 0;background:linear-gradient(90deg,#02080d,color-mix(in srgb,var(--fx-glow) 55%,#02080d) 35%,color-mix(in srgb,var(--fx) 30%,#02080d) 70%,#02080d);border-block:.35cqw solid #f3d27f;box-shadow:0 0 3cqw #000c,0 0 2.5cqw color-mix(in srgb,var(--fx) 45%,transparent)}
.cutin.play .cutin-band{animation:c-band var(--cutin-time,1.05s) cubic-bezier(.2,.8,.2,1) forwards}
.cutin-lines{position:absolute;inset:0;background:repeating-linear-gradient(90deg,transparent 0 2.4cqw,#ffffff1c 2.4cqw 2.65cqw);animation:c-lines .25s linear infinite}
.cutin-art{position:absolute;left:14%;top:0;bottom:0;width:34%;container-type:size;filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 0 1.5cqw #000)}
.cutin-art::before{content:"";position:absolute;--figure-height:min(calc(90cqh / var(--art-span,1)),calc(94cqw / (var(--art-ratio,1) * 2 * max(var(--art-center,.5),calc(1 - var(--art-center,.5))))));height:var(--figure-height);width:calc(var(--figure-height) * var(--art-ratio,1));left:50%;top:50%;translate:calc(-100% * var(--art-center,.5)) calc(-100% * (var(--art-top,0) + var(--art-span,1) / 2));background:var(--art) center/100% 100% no-repeat}
.cutin.play .cutin-art{animation:c-art var(--cutin-time,1.05s) ease-out forwards}
.cutin-glint{position:absolute;inset:0;translate:-100% 0;background:linear-gradient(100deg,transparent 42%,#ffffffb0 48.5%,#fff 50%,#ffffffb0 51.5%,transparent 58%);mix-blend-mode:screen}
.cutin.play .cutin-glint{animation:c-glint var(--cutin-time,1.05s) ease-in-out forwards}
.cutin-name{position:absolute;right:7%;top:41%;margin:0;rotate:-7deg;text-align:right;white-space:nowrap;opacity:0}
.cutin-name small{display:block;font-size:max(11px,1cqw);font-weight:700;letter-spacing:.4em;color:var(--b-gold)}
.cutin-name span{display:block;font:800 4.4cqw/1.15 var(--serif);letter-spacing:.12em;color:#fff4cf;text-shadow:0 0 1.6cqw var(--fx),0 .3cqw .5cqw #000}
.cutin.play .cutin-name{animation:c-name var(--cutin-time,1.05s) cubic-bezier(.2,1.3,.4,1) forwards}
.cutin-art{scale:var(--art-flip,1) 1}
/* The opponent's cut-in comes from the right, tilted the other way. */
.cutin.rival .cutin-band{top:12%;rotate:7deg;translate:110% 0}
.cutin.rival.play .cutin-band{animation-name:c-band-rival}
.cutin.rival .cutin-art{left:auto;right:14%}
.cutin.rival .cutin-name{right:auto;left:7%;top:25%;rotate:7deg;text-align:left}
.cutin.rival .cutin-name small{color:#ff9aac}
.cutin.story-king .cutin-band{background:linear-gradient(95deg,#020709 5%,#18302c 35%,#342d26 68%,#030608 95%);border-block-color:#c5a876;box-shadow:0 0 3cqw #000,0 0 2.2cqw #8ac3b977}
.cutin.story-king .cutin-lines{background:repeating-linear-gradient(0deg,transparent 0 1.05cqw,#decda613 1.05cqw 1.08cqw);animation-duration:.6s}
.cutin.story-king .cutin-art{right:7%;width:43%;background-position:50% 8%;background-size:93% auto;filter:drop-shadow(0 0 1.8cqw #020506)}
.cutin.story-king .cutin-name small{color:#d7c49a;letter-spacing:.28em}
.cutin.story-king .cutin-name span{color:#e9e0cc;text-shadow:0 0 1.2cqw #91bcb2,0 .3cqw .5cqw #000}
/* A clash: both bands at once, the player's lower, with VS between them. */
.arena.clashing .cutin .cutin-band,.arena.clashing .cutin .cutin-name,.arena.clashing .cutin .cutin-art,.arena.clashing .cutin .cutin-glint{animation-duration:1.3s}
.arena.clashing .cutin:not(.rival) .cutin-band{top:52%}
.arena.clashing .cutin:not(.rival) .cutin-name{top:64%}
.arena.clashing .cutin.rival .cutin-band{top:5%}
.arena.clashing .cutin.rival .cutin-name{top:17%}
.clash-vs{position:absolute;z-index:9;left:50%;top:44%;translate:-50% -50%;pointer-events:none;font:900 9cqw/1 Georgia,serif;letter-spacing:.06em;color:#fff4cf;text-shadow:0 0 1.5cqw #ff6a4d,0 0 4cqw #f0c350,0 .4cqw .6cqw #000;opacity:0}
.clash-vs.play{animation:c-vs 1.3s cubic-bezier(.2,1.4,.4,1) forwards}
/* The typing race after a clash. */
.rune-panel.dueling{border-color:#f3d27f;box-shadow:0 0 3cqw #f0c35066,inset 0 0 2.5cqw #f0c35022}
.rune-panel.dueling .word-kicker{color:#fff4cf}
.arena.paused .cutin,.arena.paused .cutin *,.arena.hitstop .fighter,.arena.hitstop .fighter *{animation-play-state:paused}
@keyframes c-dim{0%{background:#ffffff80}7%{background:#01050ad0}84%{background:#01050ab0}100%{background:#01050a00}}
@keyframes c-band{0%{translate:-110% 0}16%{translate:0 0}82%{translate:0 0;opacity:1}100%{translate:45% 0;opacity:0}}
@keyframes c-band-rival{0%{translate:110% 0}16%{translate:0 0}82%{translate:0 0;opacity:1}100%{translate:-45% 0;opacity:0}}
@keyframes c-vs{0%{scale:3;opacity:0}18%{scale:1;opacity:1}28%{scale:1.15}40%{scale:1}85%{opacity:1}100%{opacity:0;scale:1.3}}
@keyframes c-lines{to{background-position:-5.3cqw 0}}
@keyframes c-art{0%{translate:-10cqw 0}20%{translate:0 0}82%{translate:1.5cqw 0}100%{translate:3cqw 0}}
@keyframes c-glint{0%,22%{translate:-100% 0}40%,100%{translate:100% 0}}
@keyframes c-name{0%,13%{opacity:0;scale:1.9}28%{opacity:1;scale:1}82%{opacity:1;translate:0 0}100%{opacity:0;translate:4cqw 0}}


@keyframes b-breathe{50%{transform:scale(1.006,.998)}}
@keyframes b-float{50%{translate:0 -2.2cqw}}
@keyframes b-dash{40%{translate:5cqw -.5cqw}}
@keyframes b-dash-back{40%{translate:-5cqw -.5cqw}}
@keyframes m-lunge{40%{translate:calc(var(--dir) * 5cqw) -.5cqw}}
@keyframes m-pounce{22%{translate:calc(var(--dir) * -1.6cqw) .3cqw}50%{translate:calc(var(--dir) * 9cqw) -4.2cqw}62%{translate:calc(var(--dir) * 10cqw) 0}80%{translate:calc(var(--dir) * 6cqw) 0}}
@keyframes m-pounce-rig{22%{transform:scale(1.1,.84)}45%{transform:scale(.9,1.12) rotate(calc(var(--fwd) * 8deg))}62%{transform:scale(1.14,.86)}80%{transform:scale(1)}}
@keyframes m-rush{20%{translate:calc(var(--dir) * -1.2cqw) 0}42%{translate:calc(var(--dir) * 15cqw) -.3cqw}58%{translate:calc(var(--dir) * 13cqw) 0}}
@keyframes m-rush-rig{20%{transform:scale(1.06,.94) rotate(calc(var(--fwd) * -5deg))}42%{transform:scale(1.12,.9) rotate(calc(var(--fwd) * 7deg))}58%{transform:scale(.96,1.04)}}
@keyframes m-slam{38%{translate:calc(var(--dir) * 1cqw) -7cqw}58%{translate:calc(var(--dir) * 4.5cqw) .4cqw}75%{translate:calc(var(--dir) * 3.5cqw) 0}}
@keyframes m-slam-rig{38%{transform:scale(.92,1.1) rotate(calc(var(--fwd) * -8deg))}58%{transform:scale(1.22,.76)}72%{transform:scale(.97,1.04)}}
@keyframes m-spin{50%{translate:calc(var(--dir) * 3.5cqw) -1cqw}}
@keyframes m-spin-rig{50%{transform:rotate(calc(var(--fwd) * 200deg)) scale(.95)}100%{transform:rotate(calc(var(--fwd) * 360deg))}}
@keyframes m-rear{35%{translate:calc(var(--dir) * -2.2cqw) -.8cqw}62%{translate:calc(var(--dir) * 6.5cqw) .2cqw}}
@keyframes m-rear-rig{35%{transform:rotate(calc(var(--fwd) * -12deg)) scale(.95,1.07)}62%{transform:rotate(calc(var(--fwd) * 9deg)) scale(1.1,.93)}}
@keyframes m-throw{25%{translate:calc(var(--dir) * -1.2cqw) 0}42%{translate:calc(var(--dir) * 2.4cqw) 0}}
@keyframes m-throw-rig{25%{transform:rotate(calc(var(--fwd) * -7deg))}42%{transform:rotate(calc(var(--fwd) * 6deg)) scale(1.05)}}
@keyframes m-cast{30%{translate:0 .4cqw}52%{translate:calc(var(--dir) * .8cqw) -1.6cqw}}
@keyframes m-cast-rig{30%{transform:scale(1.03,.97)}52%{transform:scale(.98,1.05);filter:brightness(1.5)}}
@keyframes m-hop{35%{translate:calc(var(--dir) * 2cqw) -2.6cqw}62%{translate:calc(var(--dir) * 1.4cqw) 0}}
@keyframes m-hop-rig{15%{transform:scale(1.1,.88)}35%{transform:scale(.92,1.1)}62%{transform:scale(1.08,.92)}}
@keyframes m-coil{30%{translate:0 .5cqw}55%{translate:calc(var(--dir) * 3.5cqw) -2.4cqw}}
@keyframes m-coil-rig{30%{transform:scale(1.14,.78)}55%{transform:scale(.86,1.18)}75%{transform:scale(1.04,.96)}}
@keyframes m-float{45%{translate:calc(var(--dir) * 4cqw) -2.4cqw}}
@keyframes m-float-rig{45%{transform:rotate(calc(var(--fwd) * 10deg))}}
@keyframes b-tremble{25%{translate:.15cqw 0}75%{translate:-.15cqw 0}}
@keyframes b-hurt-heavy{15%{translate:calc(var(--knock) * 3.2cqw) -.6cqw}40%{translate:calc(var(--knock) * 2cqw) 0}70%{translate:calc(var(--knock) * .6cqw) 0}}
@keyframes b-hop{35%{translate:calc(var(--dir) * 2cqw) -2.4cqw}70%{translate:calc(var(--dir) * 1.2cqw) 0}}
@keyframes b-lean{40%{translate:calc(var(--dir) * 1.3cqw) .2cqw}}
@keyframes b-rise{40%{translate:calc(var(--dir) * 2cqw) -1.8cqw}}
@keyframes b-heavy{25%{translate:calc(var(--dir) * -1.2cqw) .3cqw}55%{translate:calc(var(--dir) * 6cqw) -.3cqw}}
@keyframes b-cast{30%{translate:0 .4cqw}65%{translate:0 -1.2cqw}}
@keyframes b-hurt{20%{translate:calc(var(--knock) * 1.1cqw) 0}45%{translate:calc(var(--knock) * -.6cqw) 0}70%{translate:calc(var(--knock) * .3cqw) 0}}
@keyframes b-flash{15%{filter:brightness(2.6) saturate(.2)}45%{filter:brightness(1.25) sepia(.5) hue-rotate(-30deg) saturate(2.4)}}
@keyframes b-wind{from{filter:drop-shadow(0 0 .3cqw var(--fx-glow))}to{filter:drop-shadow(0 0 1.4cqw var(--fx-glow)) brightness(1.15)}}
@keyframes b-mist{to{translate:6% -3%}}
@keyframes b-low{50%{filter:brightness(1.45)}}
@keyframes b-tick{50%{scale:1.12}}
@keyframes b-caret{50%{box-shadow:0 0 .3cqw #f0c35055}}
@keyframes b-pop{from{scale:1.7;color:#fff}}
@keyframes b-nudge{30%{translate:calc(-50% - .5cqw) 0}70%{translate:calc(-50% + .5cqw) 0}}
@keyframes b-clear{from{box-shadow:0 0 0 0 #7ff5e4cc,0 0 3cqw #000a,inset 0 0 3cqw #7ff5e466}to{box-shadow:0 0 0 1.4cqw #7ff5e400,0 0 3cqw #000a,inset 0 0 2.5cqw #6fe0d11a}}
@keyframes b-bump{40%{scale:1.3}}
@keyframes b-ready{50%{box-shadow:0 0 1.6cqw #ffd87a}}
@keyframes b-callout{from{opacity:0;scale:.6}}
@keyframes b-shake{20%{translate:-.45cqw .25cqw}40%{translate:.4cqw -.25cqw}60%{translate:-.25cqw .15cqw}80%{translate:.15cqw 0}}
@keyframes b-shake-big{8%{scale:1.07;translate:-1.2cqw .6cqw}22%{translate:1.1cqw -.7cqw}40%{scale:1.03;translate:-.8cqw .45cqw}60%{translate:.5cqw -.25cqw}80%{scale:1;translate:-.2cqw 0}}
@keyframes b-pip{50%{box-shadow:0 0 1.3cqw #ffd87a;filter:brightness(1.25)}}
.arena-scene.shake{animation:b-shake .28s linear}
.arena-scene.shake-big{animation:b-shake-big .6s linear}
@media(prefers-reduced-motion:reduce){.arena *,.arena{animation:none!important}}
@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important;scroll-behavior:auto!important}}

/* Home: the companions' sanctum, where one companion is raised. The same 16:9 stage as the battle, sized in cqw:
   the companion and its growth on the left, the companion itself on the altar. */
.home-screen{position:fixed;inset:0;display:grid;place-items:center;background:radial-gradient(ellipse at 50% 40%,#0b1c26,#010407 72%)}
.sanctum{position:relative;width:min(100vw,177.78vh);aspect-ratio:16/9;overflow:clip;container-type:inline-size;isolation:isolate}
.sanctum-bg{position:absolute;inset:-2%;background:url(./assets/concepts/training-stage.webp) center/cover;filter:saturate(.95) brightness(.85)}
.sanctum-bg:after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,#010509d0,#01050900 38%,#01050900 80%,#01050980),linear-gradient(#010509c0,#01050900 18%,#01050900 75%,#010509b0)}
.sanctum-mist{position:absolute;left:30%;right:0;bottom:18%;height:30%;pointer-events:none;background:radial-gradient(ellipse at 60% 60%,#8ff0e022,#8ff0e000 60%);filter:blur(1.5cqw);animation:b-mist 14s ease-in-out infinite alternate}
#home-fx{position:absolute;inset:0;width:100%;height:100%;z-index:4;pointer-events:none}
.sanctum-top{position:absolute;z-index:6;top:1.6%;left:2%;right:2%;display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:2cqw}
.top-actions{display:flex;gap:.6cqw;align-items:center;justify-self:end}
.purse{display:flex;align-items:baseline;gap:.35cqw;margin:0;padding:.25cqw 1cqw;border:1px solid #e8d49a55;background:#1a1508cc}
.purse span{color:#ffd77a;font-size:max(12px,.95cqw)}
.purse b{font:400 max(15px,1.35cqw)/1.2 Georgia,serif;color:#fff0c4}
.purse small{font-size:max(10px,.7cqw);color:var(--b-muted)}
.notice{position:absolute;z-index:7;left:50%;top:7%;translate:-50% 0;margin:0;padding:.4cqw 1cqw;border:1px solid #e8b95a88;background:#2a1d0acc;color:#ffe0a8;font-size:max(11px,.8cqw)}
.top-button{height:max(28px,2.3cqw);display:flex;align-items:center;gap:.5cqw;padding:0 1cqw;border:1px solid var(--b-line);border-radius:3px;background:#06121ab3;font-size:max(11px,.85cqw)}
.top-button:hover{background:#17323b}
.top-button svg{width:max(13px,1.05cqw);height:max(13px,1.05cqw)}
.arena-icon{height:max(26px,2.3cqw);min-width:max(26px,2.3cqw)}

.panel{position:absolute;z-index:5;padding:1.5cqw 1.7cqw;background:linear-gradient(180deg,#06131bdd,#040d14ee);border:1px solid var(--b-line);border-top-color:#e8d49a70;box-shadow:0 1.5cqw 3cqw #0008}
.panel-kicker{display:flex;gap:.8cqw;align-items:center;margin:0 0 .3cqw;font-size:max(10px,.75cqw);font-weight:700;letter-spacing:.2em;color:var(--b-gold)}
.panel-kicker span+span{padding-left:.8cqw;border-left:1px solid var(--b-line);color:var(--b-muted);letter-spacing:.1em}
.panel-kicker span:empty{display:none}
.companion-panel{left:2%;top:9%;bottom:3%;width:29%;display:flex;flex-direction:column;overflow-y:auto;scrollbar-width:thin}
.xp{flex:1;min-width:0}
.xp-top{display:flex;justify-content:space-between;margin:0 0 .35cqw;font-size:max(10px,.72cqw);color:var(--b-muted)}
.xp-top b{font:max(11px,.85cqw) Georgia,serif;color:var(--b-text)}
.xp-track{height:max(8px,.6cqw);background:#01060acc;border:1px solid #cfe3dc40;overflow:hidden}
.xp-track div{height:100%;width:0;background:linear-gradient(90deg,#35c9b4,#c4fff4);box-shadow:0 0 .8cqw #55e3cc88;transition:width .5s}
.skill-build{display:flex;flex-direction:column}
.ghost-button,.save-button{height:max(30px,2.5cqw);border-radius:3px;font-size:max(11px,.85cqw);font-weight:700;letter-spacing:.06em}
.ghost-button{border:1px solid var(--b-line);background:#0b1a22;color:var(--b-muted)}
.ghost-button span{margin-left:.3cqw;color:#ffd77a;font-weight:400}
.ghost-button:hover:not(:disabled){color:var(--b-text);border-color:#cfe3dc70}
.ghost-button:disabled{opacity:.4}
.ghost-button.confirm{border-color:#ffd77a;color:#2a1a02;background:linear-gradient(#ffe7a0,#d9a441)}
.ghost-button.confirm span{color:#2a1a02}
.save-button{background:linear-gradient(#c4fff4,#35c9b4);color:#03201c;box-shadow:0 .25cqw 0 #0f5e52}
.save-button:disabled{background:#12303a;color:#6f8581;box-shadow:none}

/* The companion on the altar, moved the way monster-motion.html and character-preview.html move them:
   a slight breath (monsters widen, people rise), a pulsing halo, a tinted floor ring, drifting motes,
   and for people an eyes-only blink layer. JS sets --h, --ratio, --cx, --ground, --fx and the eye box. */
.altar{position:absolute;z-index:2;left:63%;top:70%;width:0;height:0;--h:30cqw;--ratio:1;--cx:.5;--ground:1}
.altar-halo{position:absolute;left:0;top:0;width:24cqw;height:18cqw;translate:-50% -95%;border-radius:50%;background:var(--fx,#7ff5e4);filter:blur(4.5cqw);opacity:.18;animation:idle-halo 4.3s ease-in-out infinite;pointer-events:none}
.altar-floor{position:absolute;left:0;top:0;width:24cqw;height:2.6cqw;translate:-50% -50%;border-radius:50%;background:#02080dbb;border:1px solid color-mix(in srgb,var(--fx,#7ff5e4) 27%,transparent);box-shadow:0 0 2.8cqw color-mix(in srgb,var(--fx,#7ff5e4) 14%,transparent)}
.altar[data-float="true"] .altar-floor{width:16cqw;opacity:.45}
.altar-particles{position:absolute;left:-15cqw;top:-34cqw;width:30cqw;height:34cqw;pointer-events:none;z-index:3}
.altar-particles i{position:absolute;left:var(--x);top:var(--y);width:var(--size);height:var(--size);border-radius:50%;background:var(--fx,#7ff5e4);box-shadow:0 0 10px var(--fx,#7ff5e4);opacity:0;animation:idle-drift var(--dur) linear var(--delay) infinite}
.altar-particles[data-kind="ember"] i{background:#ffd5a2;border-radius:2px;box-shadow:0 0 10px #ff9c58}
.altar-particles[data-kind="spore"] i{background:#e2f7d2;box-shadow:0 0 12px #a6e9d3}
.altar-particles[data-kind="shadow"] i{background:#b6a4d6;box-shadow:0 0 12px #745d9f}
.altar-particles[data-kind="bubble"] i{background:#a8f5f1;box-shadow:0 0 8px #79d9f5;border:1px solid #b7f6ec}
.altar-body{position:absolute;left:0;top:0;width:0;height:0;padding:0}
.altar-rig{position:absolute;left:0;bottom:0;height:var(--h);aspect-ratio:var(--ratio);translate:calc(var(--cx) * -100%) calc((1 - var(--ground)) * 100%);transform-origin:50% 85%;animation:idle-monster var(--breath,4.5s) ease-in-out infinite;cursor:pointer}
.altar[data-idle="human"] .altar-rig{animation-name:idle-human}
.altar[data-idle="human"] .altar-rig{transform-origin:50% 98%}
.altar[data-idle="float"] .altar-rig{animation-name:idle-float}
.altar-sprite,.altar-blink{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;pointer-events:none}
.altar-sprite{filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 1.2cqw .9cqw #000c)}
.altar-blink{filter:hue-rotate(var(--hue,0deg));opacity:0;clip-path:ellipse(var(--eye-rx,10%) 3.4% at var(--eye-x,50%) var(--eye-y,15%));transition:opacity 45ms linear}
.altar.blinking .altar-blink{opacity:1}
.altar-body.pet .altar-rig{animation:h-pet .65s ease-in-out}
.evolve-prompt{position:absolute;z-index:6;left:63%;top:73%;translate:-50% 0;display:flex;flex-direction:column;align-items:center;padding:.6cqw 2.2cqw;border:1px solid #fff1c4;border-radius:3px;background:linear-gradient(#ffe7a0,#d9a441);color:#2a1a02;box-shadow:0 0 2.5cqw #f3c65c99;animation:b-ready 1.1s ease-in-out infinite}
.evolve-prompt span{font:700 max(9px,.62cqw) Georgia,serif;letter-spacing:.3em}
.evolve-prompt b{font-size:max(15px,1.4cqw);letter-spacing:.1em}
.evolve-prompt small{font-size:max(10px,.7cqw)}

/* Companion list: pick the one to raise. */
.roster-modal{max-width:720px}
.roster-modal h2{margin-bottom:.2em}
.roster-modal h2 small{font:400 15px Georgia,serif;color:var(--b-muted);margin-left:8px}
.roster-lead{margin:0 0 16px;font-size:12px;color:var(--b-muted)}
.roster-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px}
.roster-card{position:relative;display:flex;flex-direction:column;align-items:center;padding:10px 8px 12px;border:1px solid #9fd3cb33;background:radial-gradient(ellipse at 50% 35%,#1b3a42,#0a1c24 70%);text-align:center}
button.roster-card:hover{border-color:#cfe3dc80}
.roster-card img{width:110px;height:120px;object-fit:contain;filter:drop-shadow(0 6px 6px #000c)}
.roster-card strong{margin-top:6px;font:600 14px var(--serif);letter-spacing:.06em}
.roster-card small{font-size:11px;color:var(--b-muted)}
.roster-card em{position:absolute;top:8px;left:8px;padding:1px 6px;font-style:normal;font-size:10px;font-weight:700;color:#2a1a02;background:linear-gradient(#ffe7a0,#d9a441)}
.roster-card.active{border-color:#f3d27f;box-shadow:inset 0 0 18px #f0c35033}
.roster-card.more{justify-content:center;min-height:190px;border-style:dashed;color:#6f8581;font-size:12px}
/* Summon view: the same stage with the summoning vault behind it. The companion appears on the floor circle,
   what came is described on the left, the summon button and rates sit on the right. */
.sanctum[data-view="summon"] .sanctum-bg{background-image:url(./assets/concepts/summoning-vault.webp)}
.sanctum[data-view="summon"] .companion-panel,.sanctum[data-view="summon"] #altar,.sanctum[data-view="summon"] .evolve-prompt{display:none}
.sanctum:not([data-view="summon"]) .summon-view{display:none}
.summon-glow{position:absolute;z-index:1;left:50%;top:32%;width:30cqw;height:30cqw;translate:-50% -50%;border-radius:50%;background:radial-gradient(circle,#bfe9ffaa,#7a5cff44 40%,#7a5cff00 70%);opacity:.25;pointer-events:none;transition:opacity .4s,scale .4s}
.sanctum.summoning .summon-glow{opacity:1;scale:1.5;animation:s-charge .35s ease-in-out infinite alternate}
.summon-altar{left:50%;top:70%}
.summon-altar.reveal .altar-sprite{animation:s-reveal 1.1s ease-out}
.summon-panel{right:2%;top:9%;width:22%;display:flex;flex-direction:column}
.summon-panel h2{margin:0 0 .3cqw;font:700 max(18px,2cqw)/1.25 var(--serif);letter-spacing:.1em;color:#f6ecc9}
.summon-lead{margin:0 0 1cqw;font-size:max(10px,.78cqw);line-height:1.6;color:var(--b-muted)}
.summon-button{min-height:max(44px,3.6cqw);font-size:max(14px,1.2cqw)}
.summon-button span{font-weight:400;margin-left:.3cqw}
.summon-note{min-height:1.4cqw;margin:.5cqw 0 0;font-size:max(10px,.75cqw);color:#ffd7a0}
.summon-rates{margin:.6cqw 0 0;padding-top:.7cqw;border-top:1px solid var(--b-line)}
.summon-rates div{display:flex;justify-content:space-between;align-items:baseline;font-size:max(11px,.85cqw)}
.summon-rates dt .stars{color:#ffd77a;letter-spacing:.05em}
.summon-rates dd{margin:0;font:max(12px,1cqw) Georgia,serif;color:#f6ecc9}
/* The pity count (src/summon.mjs PITY): a quiet line, gold when the next one is sure. */
.summon-pity{margin:.5cqw 0 0;font-size:max(10px,.78cqw);letter-spacing:.06em;color:var(--b-muted)}
.summon-pity b{font:max(12px,.95cqw) Georgia,serif;color:#f6ecc9}
.summon-pity.sure{color:#ffd77a;text-shadow:0 0 .8cqw #ffc84a70}
.summon-fine{margin:.6cqw 0 0;font-size:max(10px,.7cqw);color:var(--b-muted)}
.summon-owned{margin:.8cqw 0 0;font-size:max(11px,.85cqw);color:var(--b-muted)}
.summon-owned b{font:max(15px,1.4cqw) Georgia,serif;color:#f6ecc9}
.summon-result{left:2%;bottom:5%;width:30%;animation:s-card .5s cubic-bezier(.2,1.2,.4,1)}
.summon-stars{margin:0;font-size:max(16px,1.6cqw);letter-spacing:.15em;color:#ffd77a;text-shadow:0 0 1cqw #f0c350}
.summon-badge{display:inline-block;margin:.3cqw 0 .4cqw;padding:.1cqw .6cqw;font-size:max(10px,.75cqw);font-weight:700;color:#2a1a02;background:linear-gradient(#ffe7a0,#d9a441)}
.summon-badge.repeat{color:var(--b-text);background:#12303a}
.summon-result h3{margin:0;font:700 max(18px,2cqw)/1.25 var(--serif);letter-spacing:.08em;color:#f6ecc9}
.summon-kind{margin:.2cqw 0 .6cqw;font-size:max(10px,.75cqw);color:var(--b-muted);letter-spacing:.1em}
.summon-desc{margin:0 0 .9cqw;font-size:max(11px,.85cqw);line-height:1.7;color:#d8e6e2}
.summon-actions{display:grid;grid-template-columns:1.3fr 1fr;gap:.5cqw}
.altar-particles[data-kind="storm"] i{background:#c5b3ff;box-shadow:0 0 12px #a082ff;border-radius:2px}
.altar-particles[data-kind="ink"] i{background:#5fbac4;box-shadow:0 0 8px #2c828f}
@keyframes s-charge{to{opacity:.7;scale:1.62}}
@keyframes s-reveal{0%{filter:brightness(0) drop-shadow(0 0 2cqw #fff);opacity:0;transform:scale(.6)}35%{filter:brightness(0) drop-shadow(0 0 2cqw #fff);opacity:1}100%{filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 1.2cqw .9cqw #000c);transform:scale(1)}}
@keyframes s-card{from{opacity:0;translate:0 2cqw}}
.toast{position:absolute;z-index:8;left:50%;top:9%;translate:-50% 0;margin:0;padding:.7cqw 1.8cqw;border:1px solid #fff1c4;background:linear-gradient(#3a2c0ccc,#1a1508ee);color:#fff0c4;font-size:max(12px,1cqw);font-weight:700;letter-spacing:.06em;box-shadow:0 0 2.5cqw #f0c35066;white-space:nowrap}
.toast.show{animation:s-toast 5.2s ease forwards}
@keyframes s-toast{0%{opacity:0;translate:-50% -1cqw}8%,85%{opacity:1;translate:-50% 0}100%{opacity:0}}
@keyframes idle-monster{50%{transform:scale(1.006,.998)}}
/* A grounded chest rise and small weight shift. The feet stay planted; no whole-body vertical translation. */
@keyframes idle-human{0%,100%{transform:scale(1) rotate(0)}35%{transform:scale(1.001,1.005) rotate(-.05deg)}61%{transform:scale(1.001,1.003) rotate(-.02deg)}78%{transform:scale(1,1.001) rotate(.04deg)}}
@keyframes idle-float{50%{transform:translateY(-.12cqw) scale(1.003,.999)}}
@keyframes idle-halo{50%{opacity:.32;scale:1.2}}
@keyframes idle-drift{0%{opacity:0;transform:translate3d(0,9px,0) scale(.4)}18%{opacity:.8}78%{opacity:.45}100%{opacity:0;transform:translate3d(var(--dx),var(--dy),0) scale(1.2)}}
@keyframes h-pet{30%{transform:translateY(-1.6cqw) rotate(-4deg)}65%{transform:rotate(4deg)}}
/* On a small stage the pixel minimums make text relatively larger, so the left panel drops its fine print. */
@container (max-width:1100px){
  .skill-row-name small,.growth-note,.skill-note{display:none}
  .skill-row{padding:.35cqw .6cqw}
}
/* Summon, the Cthulhu way: the floor circle turns into a black mire. Runes sink in, three chants stir it, it erupts,
   the companion crawls out as a black shape, lights up with its cut-in, and the result is stamped on the left. */
#mire-fx{position:absolute;inset:0;width:100%;height:100%;z-index:1;pointer-events:none}
.sanctum-bg{transition:filter .8s}
.sanctum.summoning .sanctum-bg{filter:saturate(.8) brightness(.42)}
.summon-panel{transition:opacity .4s}
.sanctum.summoning .summon-panel{opacity:0;pointer-events:none}
.sanctum.gate-open .summon-glow{opacity:1;scale:1.9;background:radial-gradient(circle,#fff6d8,#ffe7a0aa 25%,#ff79c655 50%,#ff79c600 70%);animation:s-charge .25s ease-in-out infinite alternate}
.sanctum.quake .sanctum-bg,.sanctum.quake #mire-fx,.sanctum.quake #home-fx{animation:s-quake .38s linear}
.sanctum.quake-big .sanctum-bg,.sanctum.quake-big #mire-fx,.sanctum.quake-big #home-fx{animation:s-quake-big .6s linear}
.summon-chant{position:absolute;inset:0;z-index:7;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;padding:0 0 4.5%;background:none;border:0;color:var(--b-text);cursor:pointer;--chant:#9fe9ff}
.summon-chant:focus-visible{outline:none}
.summon-chant b{margin-right:-.7em;font:700 max(22px,2.8cqw)/1 var(--serif);letter-spacing:.7em;color:#f6ecc9;text-shadow:0 0 1.4cqw var(--chant),0 .2cqw .4cqw #000;animation:s-chant 1.1s ease-in-out infinite alternate}
.summon-chant .pips{display:flex;gap:1.3cqw;margin:1.1cqw 0 .7cqw}
.summon-chant .pips i{width:1.1cqw;height:1.1cqw;min-width:9px;min-height:9px;rotate:45deg;border:1px solid #f6ecc9aa;background:#02070c}
.summon-chant .pips i.lit{background:var(--chant);border-color:#fff;box-shadow:0 0 1.2cqw var(--chant)}
.summon-chant small{font-size:max(10px,.75cqw);letter-spacing:.35em;color:var(--b-muted)}
.summon-chant.done b{animation:none;opacity:0;transition:opacity .3s}
.summon-skip{position:absolute;z-index:9;right:2%;bottom:3.5%;padding:.4cqw 1.2cqw;font:700 max(11px,.85cqw) Georgia,serif;letter-spacing:.3em;color:var(--b-muted);border:1px solid var(--b-line);background:#02070ccc}
.summon-skip:hover{color:var(--b-text);border-color:#cfe3dc80}
@property --rise{syntax:'<number>';inherits:false;initial-value:0}
.summon-altar .altar-halo,.summon-altar .altar-particles,.summon-altar .altar-floor{transition:opacity .6s}
.summon-altar.rise .altar-sprite{animation:s-rise 1.3s cubic-bezier(.3,.75,.35,1) both;transform:translateY(calc(var(--rise) * 100%));clip-path:inset(-40% -40% calc((1 - var(--ground) + var(--rise)) * 100%) -40%);filter:brightness(0) drop-shadow(0 0 .5cqw var(--fx))}
.summon-altar.rise.lit .altar-sprite{animation:s-lit .9s ease-out;clip-path:none;transform:none;filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 1.2cqw .9cqw #000c)}
.summon-altar.rise:not(.lit) .altar-halo,.summon-altar.rise:not(.lit) .altar-particles,.summon-altar.rise:not(.lit) .altar-floor{opacity:0}
/* The summon cut-in is the battle cut-in held longer, with the rarity above the name. */
.summon-cutin.play,.summon-cutin.play .cutin-band,.summon-cutin.play .cutin-art,.summon-cutin.play .cutin-glint,.summon-cutin.play .cutin-name{animation-duration:1.9s}
.summon-cutin .cutin-name{top:36%}
.summon-cutin .cutin-name small{font-size:max(13px,1.3cqw);letter-spacing:.3em;color:#ffd77a}
.summon-cutin .cutin-name em{display:block;margin-top:.4cqw;font-style:normal;font-size:max(11px,1cqw);letter-spacing:.25em;color:var(--b-muted)}
.summon-cutin.rare .cutin-band{border-block-color:#fff1c4;box-shadow:0 0 3cqw #000c,0 0 4cqw #ffe7a0aa}
.summon-cutin.rare .cutin-name small{background:linear-gradient(90deg,#ffe7a0,#ff9ad0,#9fe9ff,#ffe7a0);-webkit-background-clip:text;background-clip:text;color:transparent}
.summon-stars i{display:inline-block;font-style:normal;animation:s-stamp .5s cubic-bezier(.2,1.6,.4,1) both}
.summon-result.rare .summon-stars i{color:#ffe7a0;text-shadow:0 0 1cqw #ff79c6,0 0 2cqw #ffe7a0}
@keyframes s-rise{from{--rise:1}to{--rise:0}}
@keyframes s-lit{0%{filter:brightness(4) saturate(0) drop-shadow(0 0 3cqw #fff)}100%{filter:hue-rotate(var(--hue,0deg)) brightness(1) drop-shadow(0 1.2cqw .9cqw #000c)}}
@keyframes s-chant{from{opacity:.65}to{opacity:1}}
@keyframes s-stamp{from{opacity:0;scale:2.8;rotate:-12deg}}
@keyframes s-quake{20%{translate:-.5cqw .25cqw}40%{translate:.45cqw -.3cqw}60%{translate:-.3cqw .15cqw}80%{translate:.2cqw 0}}
@keyframes s-quake-big{10%{translate:-1.1cqw .5cqw}25%{translate:1cqw -.6cqw}40%{translate:-.8cqw .4cqw}55%{translate:.6cqw -.3cqw}70%{translate:-.35cqw .2cqw}85%{translate:.2cqw 0}}

/* Bestiary (docs/codex-ui.md): the whole book on the left, the chosen form on a pedestal in the middle, its entry on
   the right. Forms of lines not yet owned are black shapes that do not move. */
.nav-dot{align-self:flex-start;width:.5cqw;height:.5cqw;min-width:6px;min-height:6px;border-radius:50%;background:#ffd77a;box-shadow:0 0 .6cqw #ffd77a}
.sanctum:not([data-view="codex"]) .codex-view{display:none}
.sanctum[data-view="codex"] .companion-panel,.sanctum[data-view="codex"] #altar,.sanctum[data-view="codex"] .evolve-prompt,.sanctum[data-view="codex"] .sanctum-mist{display:none}
.sanctum[data-view="codex"] .sanctum-bg{filter:brightness(.26) saturate(.6) blur(.3cqw)}
.codex-view{--accent:#7ff5e4}
.codex-view:before{content:"";position:absolute;z-index:1;left:34%;right:27%;top:8%;bottom:0;pointer-events:none;background:radial-gradient(ellipse at 50% 55%,color-mix(in srgb,var(--accent) 22%,transparent),transparent 55%),radial-gradient(ellipse at 50% 96%,#17303799,transparent 70%)}
.codex-ring{position:absolute;z-index:1;left:53.5%;top:50%;width:31cqw;height:31cqw;translate:-50% -50%;border-radius:50%;border:1px solid color-mix(in srgb,var(--accent) 25%,transparent);box-shadow:0 0 6cqw color-mix(in srgb,var(--accent) 10%,transparent),inset 0 0 4cqw color-mix(in srgb,var(--accent) 8%,transparent);pointer-events:none}
.codex-ring:after{content:"";position:absolute;inset:6%;border-radius:50%;border:1px dashed color-mix(in srgb,var(--accent) 18%,transparent);animation:x-spin 90s linear infinite}
.codex-list{left:2%;top:9%;bottom:4%;width:31%;display:flex;flex-direction:column;padding:1.2cqw 1.2cqw 1cqw}
.codex-head{display:flex;align-items:baseline;gap:1cqw}
.codex-head .panel-kicker{margin:0}
.codex-head h2{margin:0;font:700 max(18px,1.9cqw)/1.2 var(--serif);letter-spacing:.12em;color:#f6ecc9}
.codex-count{margin:0 0 0 auto;font-size:max(11px,.8cqw);color:var(--b-muted)}
.codex-count b{font:max(16px,1.5cqw) Georgia,serif;color:#f6ecc9}
.codex-meter{height:3px;margin:.5cqw 0 .8cqw;background:#ffffff14}
.codex-meter i{display:block;width:0;height:100%;background:linear-gradient(90deg,var(--b-gold),#fff1c4);box-shadow:0 0 .8cqw #f0c35088;transition:width .6s}
.codex-filter{display:flex;gap:.3cqw;margin-bottom:.7cqw}
.codex-filter button{flex:1;padding:.3cqw 0;font-size:max(11px,.8cqw);font-weight:700;letter-spacing:.1em;color:var(--b-muted);border:1px solid var(--b-line);background:#02070c88}
.codex-filter button[aria-pressed="true"]{color:#13252a;background:#d6d5ae;border-color:#d6d5ae}
.codex-grid{flex:1;min-height:0;overflow-y:auto;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.45cqw;align-content:start;padding-right:.3cqw;scrollbar-width:thin;scrollbar-color:#3c5b60 transparent}
.codex-cell{position:relative;display:flex;flex-direction:column;align-items:center;min-width:0;padding:.3cqw .2cqw;border:1px solid #9fd3cb26;background:radial-gradient(ellipse at 50% 40%,#16323a,#08161d 75%);color:var(--b-text)}
.codex-cell:hover{border-color:#cfe3dc70}
.codex-cell.active{border-color:#f3d27f;box-shadow:inset 0 0 1.2cqw #f0c35040}
.codex-cell small{align-self:flex-start;font:max(9px,.6cqw)/1.3 Georgia,serif;letter-spacing:.05em;color:#7e9998}
.codex-cell img{width:100%;height:4.6cqw;object-fit:contain;filter:drop-shadow(0 .3cqw .3cqw #000a)}
.codex-cell span{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:center;font-size:max(9px,.62cqw)}
.codex-cell.locked img{filter:brightness(0) drop-shadow(0 0 2px #9fd3cb55)}
.codex-cell.locked span{color:#5f7774}
.codex-cell em{position:absolute;top:.2cqw;right:.2cqw;padding:0 .3cqw;font:700 max(8px,.55cqw)/1.5 Georgia,serif;font-style:normal;color:#2a1a02;background:linear-gradient(#ffe7a0,#d9a441)}
.codex-pose-label{position:absolute;z-index:5;left:36%;top:10%;margin:0;font:max(9px,.7cqw) Georgia,serif;letter-spacing:.25em;color:#acbdb4}
.codex-altar{left:53.5%;top:84%}
.codex-altar.locked .altar-rig{animation:none;cursor:default}
.codex-altar.locked .altar-sprite{filter:brightness(0) drop-shadow(0 0 .35cqw #9fd3cb70)}
.codex-altar.locked .altar-particles,.codex-altar.locked .altar-halo,.codex-altar.locked .altar-blink{display:none}
.codex-info{right:2%;top:9%;width:24%;display:flex;flex-direction:column}
.codex-no{display:flex;justify-content:space-between;margin:0;font:max(13px,1.1cqw) Georgia,serif;letter-spacing:.1em;color:#7e9998}
.codex-no .stars{color:#ffd77a}
.codex-info h2{margin:.2cqw 0 0;font:700 max(18px,2cqw)/1.25 var(--serif);letter-spacing:.08em;color:#f6ecc9}
.codex-kind{margin:.2cqw 0 .7cqw;font-size:max(10px,.75cqw);letter-spacing:.12em;color:var(--b-gold)}
.codex-desc{min-height:5.4cqw;margin:0 0 .9cqw;font-size:max(11px,.85cqw);line-height:1.75;color:#d8e6e2}
.codex-data{margin:0 0 .9cqw;padding-top:.6cqw;border-top:1px solid var(--b-line)}
.codex-data div{display:flex;justify-content:space-between;align-items:baseline;gap:1cqw;padding:.15cqw 0;font-size:max(11px,.8cqw)}
.codex-data dt{color:var(--b-muted)}
.codex-data dd{margin:0;text-align:right;color:#f6ecc9}
#codex-speed{letter-spacing:.12em;color:var(--accent)}
.codex-poses{display:grid;grid-template-columns:repeat(4,1fr);gap:.3cqw}
.codex-poses button{padding:.45cqw 0;font-size:max(11px,.8cqw);font-weight:700;color:#dce8de;border:1px solid #5a7774;background:#18313a}
.codex-poses button:hover:not(:disabled){background:#28505a}
.codex-poses button[aria-pressed="true"]{color:#13252a;background:#d6d5ae;border-color:#d6d5ae}
.codex-poses button:disabled{opacity:.35;cursor:default}
/* Poses, after monster-motion.html: drawn poses move a little; juveniles with only an idle picture move that picture. */
.codex-altar[data-pose="attack"] .altar-rig{animation:x-attack .8s ease-out}
.codex-altar[data-pose="skill"] .altar-rig{animation:x-skill 1.1s ease-in-out}
.codex-altar[data-pose="hurt"] .altar-rig{animation:x-hurt .7s ease-out}
.codex-altar[data-pose="hurt"] .altar-sprite{animation:x-flash .7s ease-out}
.codex-altar[data-pose="skill"] .altar-halo{animation:x-halo 1.1s ease-in-out}
.codex-altar[data-drawn="false"][data-pose="attack"] .altar-rig{animation:x-attack-p 1.2s cubic-bezier(.2,.8,.2,1)}
.codex-altar[data-drawn="false"][data-pose="skill"] .altar-rig{animation:x-skill-p 1.6s ease-in-out}
.codex-altar[data-drawn="false"][data-pose="hurt"] .altar-rig{animation:x-hurt-p 1.1s ease-out}
.codex-altar[data-pose]:not([data-pose="idle"]) .altar-blink{display:none}
@keyframes x-attack{24%{transform:translate(calc(var(--dir) * -3%),1%) scale(.97)}65%{transform:translate(calc(var(--dir) * 4%),-1%) scale(1.045)}}
@keyframes x-skill{28%{transform:scale(.96)}70%{transform:translateY(-2%) scale(1.05)}}
@keyframes x-hurt{20%{transform:translateX(calc(var(--dir) * -4%)) rotate(calc(var(--dir) * -4deg))}58%{transform:translateX(calc(var(--dir) * 3%)) rotate(calc(var(--dir) * 3deg))}}
@keyframes x-attack-p{24%{transform:translate(calc(var(--dir) * -4%),4%) scale(.89,1.08) rotate(calc(var(--dir) * -5deg))}52%{transform:translate(calc(var(--dir) * 8%),-7%) scale(1.15,.9) rotate(calc(var(--dir) * 5deg))}}
@keyframes x-skill-p{36%{transform:scale(.93);filter:brightness(1.2)}64%{transform:translateY(-4%) scale(1.09);filter:brightness(1.55)}}
@keyframes x-hurt-p{18%{transform:translate(calc(var(--dir) * -5%),2%) rotate(calc(var(--dir) * -7deg))}35%{transform:translate(calc(var(--dir) * 5%),1%) rotate(calc(var(--dir) * 6deg))}60%{transform:translate(calc(var(--dir) * -2%),2%) rotate(calc(var(--dir) * -3deg))}}
@keyframes x-flash{20%,45%{filter:brightness(1.8) saturate(.45) drop-shadow(0 1.2cqw .9cqw #000c)}}
@keyframes x-halo{50%{opacity:.55;scale:1.8}}
@keyframes x-spin{to{rotate:360deg}}
/* Front page (docs/front-ui.md): the three entrances of concept-preview.html — raising, online battle, summoning —
   under the title. Every view other than raising hides the companion panel and the altar. */
.sanctum:not([data-view="home"]) .companion-panel,.sanctum:not([data-view="home"]) #altar,.sanctum:not([data-view="home"]) .evolve-prompt{display:none}
.sanctum:not([data-view="front"]) .front-view,.sanctum:not([data-view="shop"]) .shop-view{display:none}
.sanctum:not([data-view="story"]) .story-view{display:none}
.story-view{position:absolute;inset:0;z-index:5;overflow:hidden;background:#03080e;color:#f3eee0}
.story-view[data-world="true"] .story-image,.story-view[data-world="true"] .story-shade,.story-view[data-world="true"] .story-stage,.story-view[data-world="true"] .story-copy{display:none}
.story-world{position:absolute;inset:0;overflow:hidden;background:#06121a}
.story-world[hidden]{display:none}
.story-map-scroll,.story-map-stage{position:absolute;inset:0}
.story-world-map{position:absolute;inset:0;background:url(./assets/story/chapter1-walk-map-v1.webp) center/100% 100% no-repeat;filter:brightness(.8) saturate(.91)}
.story-world[data-leg="market-route"] .story-world-map{background-image:url(./assets/story/chapter2-market-walk-map-v1.webp)}
.story-world[data-leg="forest-route"] .story-world-map{background-image:url(./assets/story/chapter2-forest-walk-map-v1.webp)}
.story-world[data-leg="island-route"] .story-world-map{background-image:url(./assets/story/chapter3-island-walk-map-v1.webp)}
.story-world:after{content:"";position:absolute;inset:0;pointer-events:none;background:linear-gradient(90deg,#02091199,transparent 19% 82%,#02091177),linear-gradient(0deg,#020911aa,transparent 25% 77%,#02091177)}
.story-route-line{position:absolute;inset:0;width:100%;height:100%;z-index:2;pointer-events:none;filter:drop-shadow(0 2px 3px #000)}
.story-route-line polyline{fill:none;stroke-width:.34;stroke-linejoin:round;stroke-linecap:round}
.route-future{stroke:#c0c0b0a8;stroke-dasharray:1 1}.route-open{stroke:#d4bd7f}
.route-node{position:absolute;translate:-50% -50%;z-index:4;width:6.8cqw;height:6.8cqw;min-width:56px;min-height:56px;border:1px solid #baa679;border-radius:50%;background:radial-gradient(circle,#25413bea,#071319f5 75%);box-shadow:0 .4cqw 1cqw #000a;cursor:pointer;color:#f2e6c8;padding:.3cqw}
.route-node img{width:100%;height:100%;object-fit:contain;pointer-events:none}
.route-node span,.route-node small{position:absolute;left:50%;translate:-50% 0;white-space:nowrap;pointer-events:none;text-shadow:0 2px 4px #000,0 0 8px #000}
.route-node span{top:105%;font:600 max(12px,.95cqw) var(--serif)}
.route-node small{top:136%;font:max(10px,.75cqw) sans-serif;color:#ddd2b5}
.route-node[aria-pressed="true"]{outline:2px solid #efe2a9;outline-offset:5px;box-shadow:0 0 2cqw #d9bc7255,0 .4cqw 1cqw #000}
.route-node:disabled{cursor:default;filter:grayscale(1);opacity:.5;border-color:#83908b}
.route-node[data-done="true"]:before{content:"✓";position:absolute;right:-3%;top:-3%;border:1px solid #9abdb4;border-radius:50%;background:#0d2b25;width:1.7cqw;height:1.7cqw;color:#c5e6d9;font:max(12px,1.1cqw) sans-serif;z-index:1}
.route-node i{font:400 max(13px,1.05cqw) var(--serif);font-style:normal}
.story-route-marker{position:absolute;translate:-50% -100%;width:11.875cqw;height:9.5cqw;min-width:112.5px;min-height:90px;max-width:187.5px;max-height:150px;z-index:5;pointer-events:none}
.story-route-marker canvas{position:absolute;inset:0;width:100%;height:100%;filter:drop-shadow(0 2px 2px #0008)}
.route-hero-shadow{position:absolute;left:36%;right:36%;bottom:1%;height:7%;border-radius:50%;background:#020609aa;filter:blur(2px)}
.route-hero-name{position:absolute;left:50%;bottom:-14px;translate:-50% 0;font:600 12px var(--serif);color:#f0e5c8;text-shadow:0 1px 4px #000}
.story-world[data-moving="true"] .route-node{pointer-events:none}
.story-world[data-moving="true"] #story-route-action{cursor:wait}
.story-world-panel{position:absolute;left:34%;top:12%;max-width:29%;z-index:4;padding:.8cqw 1.2cqw;background:#07131ddd;border-left:2px solid #c8b47b;pointer-events:none}
.story-world-kicker{margin:0 0 .3cqw;color:#c8b47b;font:600 max(10px,.7cqw) Georgia,serif;letter-spacing:.2em}
.story-world-panel h2{margin:0;color:#f0e8d5;font:400 max(20px,1.8cqw) var(--serif)}
.story-world-panel p:last-of-type{margin:.35cqw 0;color:#c2ded9;font-size:max(12px,.86cqw)}
.story-world-panel small{color:#ddc690;font-size:max(10px,.75cqw)}
.story-route-detail{position:absolute;right:4%;bottom:5%;width:33%;z-index:5;padding:1.1cqw 1.5cqw;background:linear-gradient(110deg,#08171aee,#0a1b1af0);border:1px solid #93825788;box-shadow:0 .5cqw 2cqw #0009}
.story-route-detail h3{margin:0 0 .5cqw;font:400 max(18px,1.6cqw) var(--serif);color:#f3e9d1}
.story-route-detail p{margin:.4cqw 0;color:#bed0c8;font-size:max(11px,.83cqw)}
.story-route-detail p:empty{display:none}.story-route-detail .primary-button{margin-top:.8cqw;min-height:38px;width:100%}
.story-route-help{position:absolute;left:4%;bottom:6%;z-index:4;color:#d6ded4;font-size:max(12px,.9cqw);text-shadow:0 1px 5px #000}
.story-result-modal #story-result-text{white-space:pre-line;line-height:1.9}.roster-help{color:#bbcfc9;font-size:14px}
.story-image{position:absolute;inset:0;background:url(./assets/story/shore-background.webp) center/cover no-repeat;filter:brightness(.85) saturate(.9)}
.story-view[data-bg="seal"] .story-image{background-image:url(./assets/story/seal-chamber-background.webp)}
.story-view[data-bg="throne"] .story-image{background-image:url(./assets/story/volk-throne-intact-v1.webp)}
.story-view[data-bg="bombed"] .story-image{background-image:url(./assets/story/volk-throne-bombed-v1.webp)}
.story-view[data-scene="prologue-end"][data-line="2"] .story-shade:after,.story-view[data-scene="prologue-end"][data-line="3"] .story-shade:after{content:"";position:absolute;inset:0;background:linear-gradient(90deg,transparent 26%,#edf7ffb0 49%,transparent 72%);animation:story-white-strike 1s ease-out both;pointer-events:none}
@keyframes story-white-strike{0%{opacity:0}16%{opacity:1}100%{opacity:.48}}
.story-view[data-bg="pier"] .story-image{background-image:url(./assets/story/pier-background.webp)}
.story-view[data-bg="market"] .story-image{background-image:url(./assets/story/chapter2-market-walk-map-v1.webp)}
.story-view[data-bg="marketStreet"] .story-image{background-image:url(./assets/story/market-street-v1.webp)}
.story-view[data-bg="monument"] .story-image{background-image:url(./assets/story/hero-monument-v1.webp)}
.story-view[data-bg="ferry"] .story-image{background-image:url(./assets/story/noa-ferry-interior-v1.webp)}
.story-view[data-bg="arenaGate"] .story-image{background-image:url(./assets/story/arena-registration-v1.webp)}
.story-view[data-bg="crossing"] .story-image{background-image:url(./assets/story/sea-dragon-crossing-v1.webp)}
.story-view[data-bg="flagship"] .story-image{background-image:url(./assets/story/kingdom-flagship-deck-v1.webp)}
.story-view[data-bg="flagshipDawn"] .story-image{background-image:url(./assets/story/kingdom-flagship-dawn-v1.webp)}
.story-view[data-bg="cottage"] .story-image{background-image:url(./assets/story/garo-cottage-meal-v1.webp)}
.story-view[data-bg="forest"] .story-image{background-image:url(./assets/story/chapter2-forest-walk-map-v1.webp)}
.story-view[data-bg="island"] .story-image{background-image:url(./assets/story/chapter3-island-walk-map-v1.webp)}
.story-view[data-bg="arena"] .story-image{background-image:url(./assets/story/chapter3-arena-v1.webp)}
.story-view[data-bg="banquet"] .story-image{background-image:url(./assets/story/chapter3-banquet-v1.webp)}
.story-view[data-bg="dawn"] .story-image{background-image:url(./assets/story/chapter3-dawn-v1.webp)}
.story-view[data-bg="secretPier"] .story-image{background-image:url(./assets/story/chapter3-secret-pier-v1.webp)}
.story-view[data-bg="spring"] .story-image{background-image:url(./assets/story/chapter3-spring-v1.webp)}
.story-view[data-bg="arenaMoon"] .story-image,.story-world[data-leg="final-route"] .story-world-map{background-image:url(./assets/story/chapter3-arena-moon-v1.webp)}
.arena[data-story="round1"] .arena-bg,.arena[data-story="round2"] .arena-bg,.arena[data-story="semifinal"] .arena-bg,.arena[data-story="final"] .arena-bg{background-image:url(./assets/story/chapter3-arena-v1.webp);filter:saturate(.8) brightness(.58)}
.arena[data-story="final"] .arena-bg{background-image:url(./assets/story/chapter3-arena-moon-v1.webp);filter:saturate(.8) brightness(.68)}
.story-shade{position:absolute;inset:0;background:linear-gradient(0deg,#0105089e 0%,#02070e15 42%,#02070e13 73%,#02070e77 100%)}
.story-stage{position:absolute;inset:4% 2% 17%;z-index:1;pointer-events:none}
.story-portrait{position:absolute;bottom:0;height:100%;width:42%;object-fit:contain;object-position:center bottom;filter:brightness(.76) drop-shadow(0 .5cqw 1.3cqw #000c);transition:filter .24s ease,transform .24s ease}
.story-portrait[hidden]{display:none}
.story-portrait.left{left:3%}.story-portrait.center{left:37%;height:70%;width:26%;z-index:2}.story-portrait.right{right:2%}
.story-portrait.right[data-actor="ヴォルク"]{right:2%;left:auto;bottom:0;height:76%;width:35%;z-index:1}
.story-event-cg{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;object-position:center;}
.story-event-cg[hidden]{display:none}
.story-view[data-cg="sacrifice"] .story-shade{background:linear-gradient(0deg,#01050866,transparent 38%)}
.story-view[data-world="true"] .story-event-cg{display:none}
.story-head>div>p{margin:0;color:#f0deac;letter-spacing:.16em;font:600 max(11px,.85cqw) Georgia,serif;text-shadow:0 2px 5px #000}
.story-party-button{pointer-events:auto;margin-top:.8cqw;padding:.5cqw .8cqw;border:1px solid #aa9b6c66;background:#071318d9;color:#eee3c5;font-size:max(14px,1cqw);cursor:pointer}
.story-party-button span{margin-left:.5cqw;color:#bbc8bf;font-size:.9em}
.story-portrait[data-actor="root"]{height:72%}.story-portrait[data-actor="fish"]{height:65%}
.story-portrait.speaking{filter:brightness(1.08) drop-shadow(0 .5cqw 1.3cqw #000c);transform:scale(1.018)}
.story-head{position:absolute;left:4%;right:4%;top:9%;z-index:4;display:flex;justify-content:space-between;align-items:start;gap:2cqw;pointer-events:none}
.story-head>p{margin:0;color:#f0deac;letter-spacing:.28em;font:600 max(11px,.85cqw) Georgia,serif;text-shadow:0 2px 5px #000}
.story-online{display:flex;flex-direction:column;align-items:end;gap:.25cqw;pointer-events:auto}
.story-match-toggle{display:flex;align-items:center;gap:.55cqw;padding:.3cqw .6cqw;border:1px solid #d5cab459;background:#081219a8;font-size:max(11px,.78cqw);cursor:pointer;backdrop-filter:blur(6px)}
.story-match-toggle input{accent-color:#7ff5e4;width:1cqw;height:1cqw;min-width:14px;min-height:14px;margin:0}
.story-match-toggle b{min-width:2.5em;color:#9de7d8;letter-spacing:.08em}
.story-online .story-search-status{min-height:1em;margin:0;color:#aee2d7;font-size:max(11px,.75cqw);text-shadow:0 2px 4px #000}
.story-copy{position:absolute;left:3%;right:3%;bottom:2.8%;z-index:3;min-height:25%;padding:2.1cqw 3cqw 3.4cqw;background:linear-gradient(105deg,#061116e8,#102125dc 80%,#16282ad0);border:1px solid #c5b98c70;box-shadow:0 .5cqw 1.8cqw #0005;backdrop-filter:blur(3px)}
.story-copy:before{content:"";position:absolute;top:0;left:3cqw;width:15cqw;height:1px;background:#e3d4a8;pointer-events:none}
.story-copy h2{position:absolute;right:0;top:-2.2cqw;margin:0;color:#d2cbc0;font:400 max(11px,.82cqw) var(--serif);letter-spacing:.07em;text-shadow:0 1px 4px #000}
.story-dialogue-box{min-height:5.4cqw}
.story-dialogue-box strong{position:absolute;left:3cqw;top:-1.05cqw;display:block;min-width:11cqw;padding:.25cqw .8cqw;color:#efe4c9;background:#102024;border:1px solid #c5b98c70;font:500 max(14px,1.15cqw) var(--serif);letter-spacing:.07em}
.story-dialogue-box strong:empty{display:none}
.story-dialogue-box p{max-width:94%;margin:.35cqw 0;color:#f0ece0;font:max(18px,1.45cqw)/1.8 var(--serif);letter-spacing:.025em;text-shadow:0 1px 2px #0005;white-space:pre-line}
.story-next{position:absolute;right:2.7cqw;bottom:1.6cqw;min-width:10cqw}
.story-next:not(.is-transition){min-width:4.5cqw;min-height:2.3cqw;padding:.4cqw .8cqw;background:transparent;border:0;color:#c9c6b1;box-shadow:none;font-size:max(12px,.86cqw)}
.story-next:not(.is-transition):after{content:'  ›';font-size:1.2em}
.story-word-button{margin:.45cqw 0 0;padding:.35cqw .75cqw;border:1px solid #cfbc84;background:#263a40;color:#fff0c7;font-size:max(11px,.8cqw);cursor:pointer}
.story-found{position:absolute;inset:0;z-index:10;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1cqw;background:#02070be8;text-align:center}
.story-found p{color:#f1dc9e;letter-spacing:.25em}.story-found strong{font:400 max(24px,3cqw) var(--serif)}.story-found small{color:#9fb5b1}
.story-result-modal{width:min(640px,80vw);max-width:640px;padding:42px 50px;background:#061216ed;border:1px solid #d7c99a65;box-shadow:0 12px 50px #0008;text-align:center}
.story-result-modal:before,.story-result-modal:after{display:none}
.story-result-modal::backdrop{background:#01070bad;backdrop-filter:blur(3px)}
.story-result-modal h2{margin:0 0 22px;font:400 clamp(24px,2.5vw,34px) var(--serif);letter-spacing:.08em;color:#ede6ce}
.story-result-modal p{margin:0 0 24px;font-size:15px;line-height:1.8;color:#aebdb6}
.story-result-actions{display:flex;flex-direction:column;align-items:center;gap:12px}
.story-result-actions .primary-button{width:220px;min-height:44px;background:#bfb08118;border:1px solid #c9b77b;color:#ece1bc;box-shadow:none;font:500 17px var(--serif)}
.story-result-actions .primary-button:hover{background:#cdb87c30}
.story-result-actions .ghost-button{min-height:36px;border:0;color:#abbcb7;background:transparent;box-shadow:none;font-size:13px}
.sanctum[data-view="front"] .sanctum-bg{background-image:url(./assets/concepts/summoning-vault.webp);filter:brightness(.28) saturate(.7) blur(.25cqw)}
.front-view{position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;align-items:center;padding:5.5% 4% 2.6%}
.front-title{margin-bottom:1.5cqw;text-align:center}
.front-title h1{margin:.35cqw -.32em 0 0;font:400 max(30px,4.0cqw)/1 Georgia,"Yu Mincho",serif;letter-spacing:.32em;color:#f6ecc9;text-shadow:0 0 2.5cqw #7ff5e455,0 .3cqw .6cqw #000}
.front-sub{margin:.7cqw 0 0;font-size:max(12px,1.02cqw);letter-spacing:.42em;color:var(--b-muted)}
.front-main{flex:1;min-height:0;width:100%;display:flex;gap:1.4cqw}
.gates{flex:1;min-width:0;min-height:0;display:grid;grid-template-columns:1fr 1.15fr 1fr 1fr;gap:1.2cqw}
/* The ranking board (docs/ranking.md, 2026-10-01): a screen of its own behind the fourth gate, all on one screen —
   the game's pages do not scroll (embedded in a blog, a scroll would carry on into the article around it). Lists that
   do scroll (the codex, the shop, the bag...) stop at their ends instead of handing the scroll on to the page. */
.companion-panel,.codex-grid,.shop-grid,.bag-grid,.rune-pick,.modal{overscroll-behavior:contain}
.sanctum:not([data-view="stele"]) .stele-view{display:none}
.sanctum[data-view="stele"] .sanctum-bg{background-image:url(./assets/concepts/matching-rank-hall.webp);filter:brightness(.26) saturate(.7) blur(.25cqw)}
.stele-view{position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;align-items:center;padding:6.4% 7% 3.2%}
.stele-head{margin:0 0 1.1cqw;text-align:center}
.stele-head h2{margin:0 -.42em 0 0;font:400 max(22px,3cqw)/1.1 Georgia,"Yu Mincho",serif;letter-spacing:.42em;color:#f6ecc9;text-shadow:0 0 1.8cqw #7ff5e440}
.stele-head p{margin:.4cqw 0 0;font:max(9px,.72cqw) Georgia,serif;letter-spacing:.7em;color:var(--b-muted)}
.stele-me{width:100%;display:grid;grid-template-columns:auto 2.9cqw 1fr auto auto;align-items:center;gap:1.2cqw;margin-bottom:1cqw;padding:.7cqw 1.6cqw;border:1px solid #7ff5e466;background:linear-gradient(90deg,#7ff5e41a,#7ff5e406)}
.stele-me .me-tag{padding:.15cqw .7cqw;border:1px solid #7ff5e477;font-size:max(10px,.8cqw);letter-spacing:.3em;color:var(--b-teal)}
.stele-me img.sigil{width:2.9cqw;height:2.9cqw}
.stele-me .me-name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:max(13px,1.4cqw);color:var(--b-teal)}
.stele-me .me-place{font:max(12px,1.2cqw) Georgia,"Yu Mincho",serif;letter-spacing:.1em;color:#f6ecc9}
.stele-me .me-rate{font:max(16px,1.9cqw) Georgia,serif;color:#ffe9b0}
/* Twenty places in two columns of ten. */
.stele-rows{width:100%;flex:1;min-height:0;margin:0;padding:0;list-style:none;display:grid;grid-template-columns:1fr 1fr;grid-template-rows:repeat(10,minmax(0,1fr));grid-auto-flow:column;column-gap:2.4cqw}
.stele-rows li{min-height:0;display:grid;grid-template-columns:3.4cqw 2.4cqw 1fr 5.4cqw;align-items:center;gap:1cqw;padding:0 1.1cqw;border-bottom:1px solid #9cc0b81f}
.stele-rows .place{font:max(13px,1.5cqw) Georgia,serif;text-align:center;color:var(--b-muted)}
.stele-rows img.sigil{width:2.4cqw;height:2.4cqw}
.stele-rows .who{min-width:0;display:flex;align-items:baseline;gap:.8cqw}
.stele-rows .name{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:max(12px,1.2cqw);color:var(--b-text)}
.stele-rows .rank{flex:none;font-size:max(9px,.72cqw);letter-spacing:.15em;color:var(--rank,var(--b-muted))}
.stele-rows .rate{font:max(13px,1.5cqw) Georgia,serif;text-align:right;color:#ffe9b0}
.stele-rows li.top1{background:linear-gradient(90deg,#ffd97822,transparent 70%)}
.stele-rows li.top1 .place{font-size:max(17px,2.1cqw);color:#ffd978;text-shadow:0 0 1.2cqw #ffc84a90}
.stele-rows li.top2 .place{font-size:max(15px,1.85cqw);color:#dfe8ee}
.stele-rows li.top3 .place{font-size:max(14px,1.7cqw);color:#e0a878}
.stele-rows li.mine{background:#7ff5e414}
.stele-rows li.mine .name{color:var(--b-teal)}
.stele-rows li.empty{opacity:.28}
/* The fourth gate: the player's own rank, glowing over the hall of ranks. */
.gate-stele{--bg:url(./assets/concepts/matching-rank-hall.webp)}
.gate-stele .gate-art:before{background:radial-gradient(ellipse,#ffe08a,transparent 62%);opacity:.18}
.stele-art{align-items:center}
.stele-sigil{display:grid;place-items:center;width:62%;aspect-ratio:1;animation:stele-glow 4.3s ease-in-out infinite}
@keyframes stele-glow{50%{scale:1.04;filter:brightness(1.18)}}
.stele-sigil img.sigil{width:100%;height:100%;filter:drop-shadow(0 0 1.6cqw var(--rank)) drop-shadow(0 .8cqw .8cqw #000c)}
@media (max-width:700px){.stele{padding:28px 18px}.stele-head h2{font-size:32px}.stele-rows li{grid-template-columns:44px 36px 1fr 86px;gap:10px;padding:8px 10px}.stele-rows .rate,.stele-rows .place{font-size:22px}.stele-me{grid-template-columns:auto 36px 1fr auto;gap:10px}.stele-me .me-place{display:none}}
.gate{position:relative;overflow:hidden;display:block;padding:0;border:1px solid #9fd3cb45;border-top-color:#e8d49a80;background:#030b10;color:var(--b-text);text-align:left;box-shadow:0 1.5cqw 3cqw #000a;transition:translate .25s,border-color .25s,box-shadow .25s}
.gate:hover,.gate:focus-visible{translate:0 -.6cqw;border-color:#f3d27f;box-shadow:0 2cqw 4cqw #000c,0 0 2.5cqw #f0c35040;outline:none}
.gate-bg{position:absolute;inset:0;background:var(--bg) center/cover;filter:brightness(.6) saturate(.9);transition:scale .6s,filter .3s}
.gate:hover .gate-bg,.gate:focus-visible .gate-bg{scale:1.05;filter:brightness(.8)}
.gate-bg:after{content:"";position:absolute;inset:0;background:linear-gradient(0deg,#02080ef2 10%,#02080e40 46%,#02080e10 70%,#02080e90)}
.gate-vault{--bg:url(./assets/concepts/training-stage.webp)}
.gate-arena{--bg:url(./assets/concepts/battle-arena.webp);border-color:#e8d49a80}
.gate-summon{--bg:url(./assets/concepts/summoning-vault.webp)}
.gate-art{position:absolute;left:0;right:0;top:5%;bottom:27%;display:flex;align-items:flex-end;justify-content:center;pointer-events:none}
.gate-art img{max-width:88%;max-height:100%;object-fit:contain;transform-origin:50% 100%;filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 1cqw .8cqw #000c);animation:idle-monster var(--breath,4.5s) ease-in-out infinite}
.gate-art img[data-idle="float"]{animation-name:idle-float}
/* The gates breathe exactly as monster-motion.html / character-preview.html (idle-monster, idle-float,
   idle-human): people never bob up and down. A glow pulses behind each. */
.gate-art:before{content:"";position:absolute;left:50%;bottom:4%;width:62%;height:72%;translate:-50% 0;border-radius:50%;background:radial-gradient(ellipse,#7ff5e4,transparent 65%);opacity:.14;filter:blur(1.6cqw);animation:idle-halo 4.3s ease-in-out infinite}
.gate-vault .gate-art:before{background:radial-gradient(ellipse,#d2d6ff,transparent 65%)}
.gate-arena .gate-art:before{background:radial-gradient(ellipse,#ff9a6b,transparent 60%);opacity:.12}
.gate-summon .gate-art:before{background:radial-gradient(ellipse,#8a5cff,transparent 65%);opacity:.3}
.gate-figure{position:relative;height:100%;aspect-ratio:var(--ratio,.667);max-width:88%;transform-origin:50% 98%;animation:idle-human var(--breath,4.3s) ease-in-out infinite}
.gate-figure img{position:absolute;inset:0;width:100%;height:100%;max-width:none;max-height:none;animation:none}
.gate-blink{opacity:0;clip-path:ellipse(var(--eye-rx,10%) 3.4% at var(--eye-x,50%) var(--eye-y,15%));filter:none!important;transition:opacity 45ms linear}
.gate-figure.blinking .gate-blink{opacity:1}
.gate-art.vs{justify-content:space-between;padding:0 3%}
.gate-art.vs img{max-width:43%;max-height:88%;scale:var(--flip,1) 1}
.gate-art.vs img.rival{filter:brightness(.9) drop-shadow(0 1cqw .8cqw #000c)}
.gate-art.vs i{align-self:center;font:400 max(20px,2.6cqw) Georgia,serif;font-style:normal;letter-spacing:.2em;color:#f5e5ac;text-shadow:0 0 1.5cqw #000}
.gate-art.mystery img{max-height:86%;filter:brightness(0) drop-shadow(0 0 .8cqw #9fe9ffaa) drop-shadow(0 0 2.4cqw #7a5cff88)}
.gate:hover .gate-art.mystery img{animation:idle-monster 1.2s ease-in-out infinite}
.gate-text{position:absolute;left:0;right:0;bottom:0;padding:1.1cqw 1.5cqw 1.4cqw}
.gate-text b{display:block;margin:.2cqw 0;font:700 max(20px,2.2cqw)/1.2 var(--serif);letter-spacing:.12em;color:#f6ecc9}
.gate-arena .gate-text b{font-size:max(22px,2.6cqw)}
.gate kbd{position:absolute;top:.8cqw;left:.8cqw;padding:0 .45cqw;border:1px solid #cfe3dc55;border-bottom-width:2px;border-radius:3px;font:max(10px,.72cqw) ui-monospace,Consolas,monospace;color:var(--b-gold);background:#02080ecc}
/* The online-battle entrance: a search that finds nobody yet (src/matchmaking.mjs) and falls back to the CPU. */
.matching{position:absolute;inset:0;z-index:9;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;background:radial-gradient(ellipse 42% 58% at 50% 50%,#010407d8 30%,#0104078c 72%,#01040760),url(./assets/concepts/matching-rank-hall.webp) center 60%/cover #010407}
.matching-orb{position:relative;width:15cqw;height:15cqw;margin-bottom:1.6cqw}
.matching-circle{position:absolute;inset:0;border-radius:50%;border:1px solid #9fe9ff55;box-shadow:0 0 3cqw #7ff5e433,inset 0 0 3cqw #7ff5e422;animation:x-spin 6s linear infinite}
.matching-circle:before,.matching-circle:after{content:"";position:absolute;inset:10%;border-radius:50%;border:1px dashed #e8d49a66;animation:x-spin 3s linear infinite reverse}
.matching-circle:after{inset:-6%;border:2px solid;border-color:#9fe9ffaa transparent;animation-duration:1.6s}
.matching.found .matching-circle{border-color:#ffe7a0;box-shadow:0 0 4cqw #ffe7a066}
.matching-orb img{position:absolute;inset:14%;width:72%;height:72%;object-fit:contain;filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 .6cqw .6cqw #000c)}
.matching-kicker{margin:0;font:700 max(10px,.75cqw) Georgia,serif;letter-spacing:.4em;color:#b8b58e}
.matching h2{margin:.4cqw 0;font:700 max(18px,2cqw) var(--serif);letter-spacing:.12em;color:#f6ecc9}
.matching-time{margin:0;font:max(16px,1.6cqw) Georgia,serif;color:var(--b-text)}
.matching-note{min-height:1.4em;margin:.4cqw 0 1.4cqw;font-size:max(11px,.85cqw);color:var(--b-muted)}
.matching-note{max-width:min(90%,460px);line-height:1.7;padding:0 8px}
.matching .ghost-button{padding:0 2cqw}
/* Shop (docs/front-ui.md): runes from matches buy items. Only dyes work yet; the rest is shown as coming. */
.sanctum[data-view="shop"] .sanctum-bg{background-image:url(./assets/concepts/forge-shop.webp),url(./assets/concepts/training-stage.webp);filter:brightness(.34) saturate(.75) blur(.2cqw)}
.shop-main{position:absolute;z-index:5;left:29%;right:2%;top:9%;bottom:4%;display:flex;flex-direction:column;gap:1cqw}
.shop-main .shop-panel{position:relative;left:auto;top:auto;flex:none;display:flex;align-items:center;gap:1.2cqw;padding:.7cqw 1.2cqw}
.shop-panel .shop-tabs{flex:0 0 32%;margin:0}
.shop-panel h2{margin:0 0 .3cqw;font:700 max(18px,2cqw)/1.25 var(--serif);letter-spacing:.1em;color:#f6ecc9}
.shop-lead{margin:0;font-size:max(10px,.78cqw);line-height:1.6;color:var(--b-muted)}
.shop-tabs{display:flex;gap:.3cqw;margin:.9cqw 0}
.shop-tabs button{flex:1;padding:.35cqw 0;font-size:max(11px,.85cqw);font-weight:700;letter-spacing:.1em;color:var(--b-muted);border:1px solid var(--b-line);background:#02070c88}
.shop-tabs button[aria-pressed="true"]{color:#13252a;background:#d6d5ae;border-color:#d6d5ae}
.shop-preview{flex:1;min-height:0;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;gap:.4cqw;padding-top:.6cqw;border-top:1px solid var(--b-line)}
.shop-preview img{flex:1;min-height:0;max-width:100%;object-fit:contain;filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 .8cqw .7cqw #000c);animation:idle-monster 4.5s ease-in-out infinite;transform-origin:50% 100%}
.shop-preview p{margin:0;text-align:center}
.shop-preview b{display:block;font:700 max(13px,1.1cqw) var(--serif);color:#f6ecc9}
.shop-preview small{font-size:max(10px,.72cqw);letter-spacing:.1em;color:var(--b-gold)}
.shop-preview .ghost-button{padding:0 1.4cqw}
.shop-note{min-height:1.5em;margin:.6cqw 0 0;font-size:max(10px,.75cqw);color:#ffd7a0}
.shop-grid{flex:1;min-height:0;overflow-y:auto;scrollbar-width:thin;padding-right:.3cqw;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:1cqw;align-content:start}
.shop-card{display:flex;flex-direction:column;gap:.45cqw;min-height:14cqw;padding:1.2cqw 1.3cqw;background:linear-gradient(180deg,#06131bdd,#040d14ee);border:1px solid var(--b-line);border-top-color:#e8d49a70;box-shadow:0 1cqw 2cqw #0008}
.shop-card.soon{opacity:.55}
.shop-swatch{width:2.6cqw;height:2.6cqw;margin:.4cqw 0 .7cqw .5cqw;rotate:45deg;border:1px solid #fff6;background:radial-gradient(circle at 35% 35%,#fff,var(--c) 45%,#02080e 125%);box-shadow:0 0 1.5cqw var(--c)}
.shop-card b{font:700 max(14px,1.2cqw) var(--serif);letter-spacing:.06em;color:#f6ecc9}
.shop-card p{flex:1;margin:0;font-size:max(11px,.8cqw);line-height:1.6;color:#cfe3dc}
.shop-meta{display:flex;justify-content:space-between;align-items:baseline;font-size:max(11px,.8cqw);color:var(--b-muted)}
.shop-meta .price{font:max(14px,1.2cqw) Georgia,serif;color:#ffe08a}
.shop-actions{display:grid;grid-template-columns:1fr 1fr;gap:.4cqw}
.shop-actions button:only-child{grid-column:1/-1}
/* ===== UI pass (docs/ui-direction.md): show with pictures, keep words to names and numbers ===== */
/* Top bar: a back button and the screen's name on the left, the purse and two icon buttons on the right. */
.top-left{display:flex;align-items:center;gap:1.1cqw;justify-self:start}
.back-home{display:flex;align-items:center;gap:.35cqw;height:max(30px,2.6cqw);padding:0 1.3cqw 0 .9cqw;border:1px solid #e8d49a80;background:linear-gradient(#1c3c44,#0d222a);color:#f6ecc9;font-size:max(12px,.95cqw);font-weight:700;letter-spacing:.14em;clip-path:polygon(14% 0,100% 0,100% 100%,14% 100%,0 50%);padding-left:1.6cqw}
.back-home svg{width:max(14px,1.1cqw);height:max(14px,1.1cqw);fill:none;stroke:currentColor;stroke-width:2.5}
.back-home:hover:not(:disabled){background:linear-gradient(#2a5560,#143039)}
.back-home:disabled{opacity:.4}
.screen-title{margin:0;font:700 max(18px,1.9cqw)/1 var(--serif);letter-spacing:.24em;color:#f6ecc9;text-shadow:0 0 1.2cqw #000,0 0 .4cqw #000}
.sanctum[data-view="front"] .top-left{visibility:hidden}
.purse{cursor:help}
.icon-button{display:flex;align-items:center;justify-content:center;gap:.3cqw;height:max(28px,2.3cqw);min-width:max(28px,2.3cqw);padding:0 .5cqw;border:1px solid var(--b-line);border-radius:3px;background:#06121ab3;color:var(--b-text);font-size:max(11px,.8cqw)}
.icon-button:hover:not(:disabled){background:#17323b;border-color:#cfe3dc70}
.icon-button:disabled{opacity:.35}
.icon-button svg{width:max(14px,1.1cqw);height:max(14px,1.1cqw);fill:none;stroke:currentColor;stroke-width:2}
.icon-button.roster-text-button{width:auto;padding:0 .7cqw;gap:.4cqw;white-space:nowrap;font-size:max(12px,.9cqw)}

/* Raising: name, level ring, four crests, points as a gem, records as icons. */
.name-row{display:flex;align-items:flex-start;justify-content:space-between;gap:1cqw}
.companion-panel h2{margin:0;font:700 max(20px,2.3cqw)/1.2 var(--serif);letter-spacing:.08em;color:#f6ecc9}
.companion-panel h2 small{display:block;margin-top:.2cqw;font:500 max(11px,.85cqw) var(--body);letter-spacing:.1em;color:var(--b-muted)}
.level-row{display:flex;align-items:center;gap:1cqw;margin:.8cqw 0 1cqw}
.lv-ring{position:relative;display:grid;place-items:center;width:4.4cqw;min-width:44px;aspect-ratio:1;margin:0;border-radius:50%;background:conic-gradient(#5ff0d8 calc(var(--p,0) * 360deg),#ffffff18 0)}
.lv-ring:before{content:"";position:absolute;inset:3px;border-radius:50%;background:#06131b}
.lv-ring small,.lv-ring strong{position:relative;line-height:1}
.lv-ring small{position:absolute;top:18%;font:max(9px,.6cqw) Georgia,serif;color:var(--b-gold)}
.lv-ring strong{margin-top:.5cqw;font:400 max(16px,1.7cqw) Georgia,serif;color:#f6ecc9}
.level-row .xp{flex:1;display:flex;flex-direction:column;gap:.3cqw}
.level-row .xp b{align-self:flex-end;font:max(10px,.72cqw) Georgia,serif;color:var(--b-muted)}
.build-foot{display:grid;grid-template-columns:1fr auto 1.4fr;gap:.5cqw;align-items:center;margin-top:.7cqw}
.points{display:flex;align-items:center;gap:.4cqw;margin:0;cursor:help}
.points svg{width:max(18px,1.5cqw);height:max(18px,1.5cqw);fill:#6f858133;stroke:#6f8581;stroke-width:1.5}
.points strong{font:400 max(20px,1.9cqw)/1 Georgia,serif;color:#6f8581}
.points.has svg{fill:#ffe08a55;stroke:#ffe08a;filter:drop-shadow(0 0 .5cqw #f0c350);animation:c-gem 1.6s ease-in-out infinite}
.points.has strong{color:#ffe08a}
.reset-button span{color:#ffd77a}
.reset-button.confirm{border-color:#ffd77a;background:linear-gradient(#ffe7a0,#d9a441);color:#2a1a02}
.reset-button.confirm span{color:#2a1a02}
#skill-save.ready{animation:c-ready 1.2s ease-in-out infinite}
.records{display:flex;justify-content:space-around;margin:auto 0 0;padding-top:.8cqw;border-top:1px solid var(--b-line)}
.records div{display:flex;align-items:center;gap:.35cqw;cursor:help}
.records dt svg{display:block;width:max(14px,1.1cqw);height:max(14px,1.1cqw);fill:none;stroke:var(--b-gold);stroke-width:1.8}
.records dd{margin:0;font:400 max(15px,1.3cqw)/1 Georgia,serif;color:#f6ecc9}
@keyframes c-gem{50%{transform:scale(1.12) rotate(6deg)}}
@keyframes c-ready{50%{box-shadow:0 0 1.4cqw #7ff5e4aa}}

/* Front page: a tag per gate instead of a sentence; the book and the bag below. */
.gate-tag{display:inline-flex;align-items:center;gap:.35cqw;margin-top:.3cqw;padding:.1cqw .7cqw;border:1px solid #e8d49a80;background:#02080ecc;font:max(12px,1cqw) Georgia,serif;font-style:normal;letter-spacing:.06em;color:#ffe9b0}
.front-links{display:flex;gap:.8cqw;margin-top:1.3cqw}
.front-links button{position:relative;display:flex;align-items:center;gap:.5cqw;padding:.5cqw 1.6cqw;border:1px solid var(--b-line);background:#050f16cc;color:var(--b-text);font-size:max(12px,.95cqw);font-weight:700;letter-spacing:.14em}
.front-links button:hover{border-color:#cfe3dc80;background:#12303a}
.front-links svg{width:max(15px,1.2cqw);height:max(15px,1.2cqw);fill:none;stroke:var(--b-gold);stroke-width:1.8}
.front-links small{font:max(11px,.8cqw) Georgia,serif;letter-spacing:.04em;color:var(--b-muted)}
.front-links .nav-dot{position:absolute;top:-.3cqw;right:-.3cqw}

/* Summoning: odds as stars. */
.summon-rates div{justify-content:flex-start;gap:1cqw}
.summon-owned{display:flex;align-items:baseline;gap:.3cqw}

/* Battle: the combo's next step as ten notches. */
.combo-step{display:flex;align-items:center;gap:.6cqw;margin:.45cqw 0 .6cqw;cursor:help}
.combo-bar{flex:1;height:.55cqw;min-height:5px;background:repeating-linear-gradient(90deg,#ffffff22 0 calc(10% - 2px),transparent calc(10% - 2px) 10%)}
.combo-bar b{display:block;width:0;height:100%;background:linear-gradient(90deg,#b88a2e,#ffe08a);box-shadow:0 0 .6cqw #f0c35088;transition:width .12s}
#combo-bonus{min-width:2.4cqw;text-align:right;font:max(13px,1.1cqw) Georgia,serif;color:#6f8581}
.combo-step.hot #combo-bonus{color:#ffd77a;text-shadow:0 0 .8cqw #ffb23d88}
.combo-step.max .combo-bar b{background:linear-gradient(90deg,#ffe08a,#fff6d8)}
.combo-count.broken strong{animation:b-broken .5s ease-out}
@keyframes b-broken{15%{color:#ff6b6b;translate:-.35cqw 0}35%{translate:.35cqw 0}55%{translate:-.2cqw 0}}

/* How to play: three pictures. */
.help-modal{max-width:640px}
.help-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:0 0 14px;padding:0;list-style:none}
.help-cards li{display:flex;flex-direction:column;align-items:center;gap:8px;padding:14px 8px;border:1px solid var(--b-line);background:#0b1a22;text-align:center}
.help-cards b{font-size:13px;color:#f6ecc9}
.help-pic{height:78px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px}
.help-word{font:700 22px var(--serif);color:#f6ecc9}
.help-keys{display:flex;gap:2px}
.help-keys kbd,.help-space{padding:1px 5px;border:1px solid #cfe3dc66;border-bottom-width:3px;border-radius:3px;font:12px ui-monospace,Consolas,monospace;color:var(--b-gold);background:#02080e}
.help-combo{display:flex;gap:3px}
.help-combo i{width:8px;height:14px;background:linear-gradient(#ffe08a,#b88a2e);box-shadow:0 0 4px #f0c35088}
.help-plus{font:20px Georgia,serif;color:#ffd77a}
.help-gauge{width:110px;height:10px;border:1px solid #e8d49a88;background:#02080e}
.help-gauge i{display:block;height:100%;background:linear-gradient(90deg,#ffe7a0,#fff6d8);box-shadow:0 0 8px #f0c350}
.help-space{padding:3px 22px;font-size:13px}
.help-fine{margin:0 0 16px;text-align:center;font-size:11px;color:var(--b-muted)}
/* Growth rows: emblem, name, a bar to 50 points (dexterity's cut into fives), what it does now, − count ＋.
   Hovering a row explains it (data-tip). */
.skill-list{display:grid;gap:.45cqw}
.skill-row{--c:#ff9a6b;display:grid;grid-template-columns:max(16px,1.6cqw) minmax(0,1fr) max(24px,2cqw) max(22px,2.2cqw) max(24px,2cqw);align-items:center;gap:.5cqw;padding:.55cqw .7cqw;background:linear-gradient(90deg,color-mix(in srgb,var(--c) 10%,#06131b),#040d14);border:1px solid color-mix(in srgb,var(--c) 25%,transparent);cursor:help}
.skill-row[data-skill="guard"]{--c:#7ff5e4}.skill-row[data-skill="dex"]{--c:#9fc9ff}.skill-row[data-skill="mystic"]{--c:#d3b4ff}
.skill-row.changed{border-color:#ffe08a;box-shadow:inset 0 0 1cqw #f0c35022}
.skill-row.sealed{animation:r-seal .7s ease-out}
.skill-symbol{font-size:max(14px,1.2cqw);text-align:center;color:var(--c);text-shadow:0 0 .6cqw var(--c)}
.skill-row-name{min-width:0}
.skill-row-name b{display:block;font-size:max(12px,.95cqw);line-height:1.3;letter-spacing:.1em;color:var(--c)}
.skill-row-top .skill-effect{overflow:hidden;text-overflow:ellipsis}
.stat-bar{position:relative;display:block;height:max(5px,.36cqw);margin-top:.35cqw;background:repeating-linear-gradient(90deg,#01060a 0 calc(8.333% - 1px),#ffffff22 calc(8.333% - 1px) 8.333%)}
.stat-bar b{position:absolute;top:0;bottom:0;left:0;width:0;transition:width .2s,left .2s}
.stat-bar b.base{background:color-mix(in srgb,var(--c) 38%,#02080e)}
.stat-bar b.spent{background:linear-gradient(90deg,color-mix(in srgb,var(--c) 55%,#000),var(--c));box-shadow:0 0 .5cqw var(--c)}
.skill-effect{margin:0;white-space:nowrap;text-align:right;font:max(11px,.85cqw) Georgia,var(--serif);letter-spacing:.02em;color:#f6ecc9}
.skill-row-top{display:flex;justify-content:space-between;align-items:baseline;gap:.5cqw;min-width:0}
.skill-row-top b{white-space:nowrap}
.skill-row.zero .skill-effect{opacity:.4}
.skill-effect .shields{display:flex;gap:.2cqw}
.skill-effect .shields i{width:.6cqw;height:.72cqw;min-width:6px;min-height:8px;background:var(--c);clip-path:polygon(50% 0,100% 18%,100% 55%,50% 100%,0 55%,0 18%);box-shadow:0 0 .4cqw var(--c)}
.skill-effect .shields.empty i{background:#ffffff22}
.skill-effect .odds{display:flex;gap:.15cqw;align-items:baseline;font-size:max(11px,.78cqw)}
.skill-effect .odds i{font:700 max(9px,.62cqw) var(--body);font-style:normal;color:var(--c)}
.skill-row>strong{text-align:center;font:400 max(15px,1.3cqw) Georgia,serif;color:#f6ecc9}
.skill-row button{width:max(24px,2cqw);height:max(24px,2cqw);border:1px solid #9fd3cb55;border-radius:50%;background:#0b1a22;color:var(--b-muted);font-size:max(14px,1.1cqw);line-height:1;padding:0}
.skill-row button:disabled{opacity:.25}
.skill-row .skill-plus:not(:disabled){background:radial-gradient(circle at 40% 35%,#fff6d8,#e3b24f);color:#2a1a02;border-color:#fff1c4;box-shadow:0 0 .8cqw #f0c35066}
@keyframes r-seal{30%{box-shadow:0 0 2cqw #ffe08a,inset 0 0 1.5cqw #ffe08a55}}
/* The trait (特性): what the special move sets off. */
.trait-line{display:flex;flex-wrap:wrap;align-items:baseline;column-gap:.5cqw;margin:.5cqw 0 0;font-size:max(11px,.85cqw);cursor:help}
.trait-line b{color:#ffe9b0;letter-spacing:.06em}
.trait-line small{font-size:max(10px,.72cqw);color:var(--b-muted)}
.trait-icon{align-self:center;width:1.3cqw;height:1.3cqw;min-width:13px;min-height:13px;display:grid;place-items:center;border-radius:50%;font-size:max(9px,.7cqw);color:#2a1a02;background:#ffe08a}
.trait-icon[data-kind="heal"]{background:#9dffc9}.trait-icon[data-kind="ward"]{background:#9fe9ff}
.trait-icon[data-kind="rotate"]{background:#d8c2ff}.trait-icon[data-kind="rally"]{background:#e6e0ff}
.trait-icon[data-kind="stack"]{background:#ffc27a}.trait-icon[data-kind="leech"]{background:#ff8fa3}
.trait-chip{display:flex;align-items:center;gap:.5cqw;margin:.35cqw 0 0;font-size:max(10px,.75cqw);color:var(--b-muted);cursor:help}
.cpu-plate .trait-chip{justify-content:flex-end}
.trait-chip b{font-weight:600;letter-spacing:.06em;color:#e8d4a0}
.trait-chip.fired b{animation:t-fire 1.2s ease-out}
.trait-state{display:flex;gap:.2cqw}
.trait-state i{width:.55cqw;height:.55cqw;min-width:6px;min-height:6px;border-radius:50%;background:#ffe08a;box-shadow:0 0 .5cqw #ffb23d}
.trait-state .lit{background:none;border:1.5px solid #ffb45e;box-shadow:0 0 .4cqw #ff8a2a}
.trait-state .ward{width:.7cqw;height:.8cqw;border-radius:0;background:#9fe9ff;clip-path:polygon(50% 0,100% 18%,100% 55%,50% 100%,0 55%,0 18%);box-shadow:none}
@keyframes t-fire{0%{color:#fff;text-shadow:0 0 1cqw #ffe08a}100%{color:#e8d4a0}}
/* One tooltip for anything with data-tip. */
.tip{position:fixed;z-index:100;max-width:260px;padding:7px 10px;border:1px solid #e8d49a80;background:#06131bf2;box-shadow:0 8px 24px #000a;color:var(--b-text);font-size:12px;line-height:1.6;pointer-events:none}
.tip b{display:block;color:#ffe9b0}
/* ===== Items, runes and the forge (docs/items-and-runes.md) ===== */
/* A rune: a cut stone in its type colour, glowing brighter as it climbs (blue +5, violet +10, gold +13, rainbow +15). */
.rune-gem{--c:#cfe3dc;--g:transparent;position:relative;display:inline-grid;place-items:center;width:max(30px,2.6cqw);aspect-ratio:1;flex:none;filter:drop-shadow(0 0 .25cqw var(--g)) drop-shadow(0 0 .7cqw var(--g))}
.rune-gem:before,.gem-crack{clip-path:polygon(50% 0,100% 30%,100% 70%,50% 100%,0 70%,0 30%)}
.rune-gem:before{content:"";position:absolute;inset:0;background:radial-gradient(circle at 38% 30%,#ffffffcc,color-mix(in srgb,var(--c) 80%,#fff) 22%,var(--c) 45%,color-mix(in srgb,var(--c) 30%,#02080e) 100%)}
.rune-gem .gem-glyph{position:relative;font:700 calc(var(--s,1) * max(15px,1.3cqw))/1 var(--serif);color:#02080ecc;text-shadow:0 1px 0 #fff8}
.rune-gem .gem-plus{position:absolute;z-index:1;right:-18%;bottom:-8%;padding:0 .25cqw;font:700 max(10px,.72cqw)/1.25 Georgia,serif;color:#fff4d6;background:#02080ee6;border:1px solid #ffffff30;border-radius:2px}
.rune-gem[data-tier="blue"]{--g:#5fb8ff}
.rune-gem[data-tier="violet"]{--g:#b77bff}
.rune-gem[data-tier="gold"]{--g:#ffc94a}
.rune-gem[data-tier="rainbow"]{--g:#fff;animation:gem-rainbow 2.4s linear infinite}
@keyframes gem-rainbow{from{filter:drop-shadow(0 0 .3cqw #fff) drop-shadow(0 0 .8cqw #ff6bd5) hue-rotate(0deg)}to{filter:drop-shadow(0 0 .3cqw #fff) drop-shadow(0 0 .8cqw #ff6bd5) hue-rotate(360deg)}}

/* Growth: colour variants and the rune slots. */
.variant-row{display:flex;align-items:center;gap:.45cqw;margin:.45cqw 0 0}
.variant-label{font-size:max(10px,.7cqw);letter-spacing:.2em;color:var(--b-muted)}
.variant-chip{width:max(18px,1.35cqw);aspect-ratio:1;border-radius:50%;padding:0;border:1px solid #ffffff40;background:radial-gradient(circle at 35% 30%,#fff,var(--c) 40%,#02080e 120%);cursor:pointer}
.variant-chip[aria-pressed="true"]{outline:2px solid #ffe08a;outline-offset:2px}
.rune-dock{margin-top:.9cqw;padding-top:.7cqw;border-top:1px solid var(--b-line)}
.dock-title{display:flex;justify-content:space-between;align-items:center;margin:0 0 .45cqw;font-size:max(10px,.75cqw);font-weight:700;letter-spacing:.25em;color:var(--b-gold)}
.dock-link{display:flex;align-items:center;gap:.3cqw;font-size:max(10px,.72cqw);letter-spacing:.1em;color:var(--b-muted)}
.dock-link:hover{color:#ffe9b0}
.dock-link svg{width:max(13px,.95cqw);height:max(13px,.95cqw);fill:none;stroke:currentColor;stroke-width:1.8}
.rune-slots{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.5cqw}
.rune-slot{display:grid;place-items:center;aspect-ratio:1.25;border:1px dashed #9cc0b870;background:radial-gradient(circle,#0c2029,#040d14);cursor:pointer;transition:border-color .15s,background .15s}
.rune-slot:hover{border-color:#ffe08a;background:radial-gradient(circle,#173440,#061019)}
.rune-slot.filled{border-style:solid;border-color:#9cc0b855}
.rune-slot .rune-gem{--s:1.1;width:max(32px,2.9cqw)}
.slot-plus{font-size:max(18px,1.5cqw);color:#9cc0b8aa}
.rune-slot.locked{cursor:help;border-style:solid;border-color:#ffffff12;background:#02080e;color:#5d7478;gap:0}
.rune-slot.locked svg{width:max(14px,1.1cqw);height:max(14px,1.1cqw);fill:none;stroke:currentColor;stroke-width:1.8}
.rune-slot.locked small{font:max(9px,.65cqw) Georgia,serif}
.rune-sum{margin:.45cqw 0 0;font-size:max(10px,.7cqw);line-height:1.5;color:#cfe3dc}

/* Front page: three small links. */
.front-links .nav-dot{position:absolute;top:-.3cqw;right:-.3cqw}

/* Shop. */
.shop-stock{flex:1;display:flex;flex-wrap:wrap;gap:.2cqw 1cqw;margin:0;padding:0}
.shop-stock div{display:flex;gap:.35cqw;font-size:max(10px,.75cqw);color:var(--b-muted)}
.shop-stock dt{margin:0}.shop-stock dd{margin:0;font-family:Georgia,serif;color:#f6ecc9}
.shop-panel #shop-bag{display:flex;align-items:center;justify-content:center;gap:.4cqw;padding:0 1.2cqw;white-space:nowrap}
.shop-panel #shop-bag svg{width:max(14px,1.1cqw);height:max(14px,1.1cqw);fill:none;stroke:currentColor;stroke-width:1.8}
.item-swatch{display:grid;place-items:center;font-size:max(13px,1.1cqw);color:#02080e}
.item-swatch{rotate:0deg;clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%)}
.shop-gem{--s:1.25;width:max(40px,3.4cqw);margin:.2cqw 0 .5cqw .3cqw}
.shop-card p{white-space:pre-line}
.shop-grid[data-group="ally"] .shop-card{min-height:19cqw}
.shop-ally{display:block;height:7cqw;margin:-.3cqw -.3cqw .3cqw;background:radial-gradient(ellipse at 50% 80%,color-mix(in srgb,var(--c) 22%,transparent),transparent 70%)}
.shop-ally img{display:block;height:100%;margin:0 auto;object-fit:contain;filter:drop-shadow(0 .5cqw .5cqw #000c)}
.shop-card.owned{opacity:.6}
.shop-grid{grid-auto-rows:max-content}.shop-card>*{flex-shrink:0}.shop-card p{flex:1 0 auto}
.shop-card p.shop-lore{flex:0 0 auto;font-size:max(10px,.72cqw);line-height:1.6;font-style:italic;color:#8fa7a1;white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}

/* Bag and forge. */
.sanctum:not([data-view="bag"]) .bag-view{display:none}
.sanctum[data-view="bag"] .sanctum-bg{background-image:url(./assets/concepts/forge-anvil.webp),url(./assets/concepts/summoning-vault.webp);filter:brightness(.18) saturate(.5) blur(.35cqw)}
.bag-view{position:absolute;inset:0;z-index:4}
.sanctum[data-view="bag"] #home-fx{z-index:6}
.bag-view:before{content:"";position:absolute;left:30%;right:26%;top:18%;bottom:6%;background:radial-gradient(ellipse at 50% 72%,#ff8a3c30,#ff5a1a10 35%,transparent 65%);pointer-events:none}
.bag-list{left:2%;top:9%;bottom:4%;width:26%;display:flex;flex-direction:column;padding:1.2cqw}
.bag-list .shop-tabs{margin:0 0 .8cqw}
.bag-list .shop-tabs small{font:max(10px,.7cqw) Georgia,serif;opacity:.75}
.bag-grid{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;scrollbar-width:thin;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:.45cqw;align-content:start}
.bag-grid[data-tab="item"]{grid-template-columns:1fr}
.rune-cell{position:relative;display:grid;place-items:center;aspect-ratio:1;border:1px solid #9cc0b830;background:radial-gradient(circle,#0c2029,#040d14);cursor:pointer}
.rune-cell:hover{border-color:#cfe3dc80}
.rune-cell.active{border-color:#ffe08a;box-shadow:inset 0 0 1cqw #f0c35033}
.rune-cell .rune-gem{--s:1.05;width:min(78%,3.4cqw)}
.rune-owner-tag{position:absolute;left:.15cqw;top:.15cqw;width:max(14px,1.1cqw);height:max(14px,1.1cqw);border-radius:50%;object-fit:cover;object-position:50% 20%;border:1px solid #ffe08a;background:#02080e}
.bag-empty{grid-column:1/-1;display:grid;gap:.6cqw;justify-items:center;padding:2cqw 0;text-align:center;font-size:max(11px,.8cqw);color:var(--b-muted)}
.bag-empty .ghost-button{padding:0 1.4cqw}
.item-row{--c:#cfe3dc;display:grid;grid-template-columns:max(26px,2.2cqw) minmax(0,1fr) auto;grid-template-rows:auto auto;column-gap:.6cqw;row-gap:.35cqw;align-items:center;padding:.55cqw .7cqw;border:1px solid color-mix(in srgb,var(--c) 25%,transparent);background:linear-gradient(90deg,color-mix(in srgb,var(--c) 9%,#06131b),#040d14)}
.item-glyph{grid-row:1;display:grid;place-items:center;aspect-ratio:1;font-size:max(15px,1.2cqw);color:#02080e;background:radial-gradient(circle at 35% 30%,#fff,var(--c) 50%,#02080e 130%);clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%)}
.item-text b{display:block;font-size:max(12px,.9cqw);color:#f6ecc9}
.item-text small{font-size:max(10px,.7cqw);color:var(--b-muted)}
.item-row>strong{font:max(14px,1.1cqw) Georgia,serif;color:#f6ecc9}
.item-actions{grid-column:1/-1;display:grid;grid-template-columns:1fr 1fr;gap:.35cqw}
.item-actions button{white-space:nowrap;padding:0 .3cqw}
.item-actions button{height:max(26px,2cqw)}
.bag-note{min-height:1.4em;margin:.6cqw 0 0;font-size:max(10px,.75cqw);color:#ffd7a0}

.forge{position:absolute;left:29%;right:27%;top:9%;bottom:4%;display:flex;flex-direction:column;align-items:center}
.forge-rate{--p:0;position:relative;display:grid;place-items:center;align-content:center;width:max(92px,8.4cqw);aspect-ratio:1;border-radius:50%;background:conic-gradient(#ffe08a calc(var(--p) * 360deg),#ffffff14 0);cursor:help}
.forge-rate:before{content:"";position:absolute;inset:.45cqw;border-radius:50%;background:radial-gradient(circle,#0a1c24,#02080e)}
.forge-rate[data-risk="true"]{background:conic-gradient(#ffe08a calc(var(--p) * 360deg),#ff5d7355 0)}
.forge-rate b,.forge-rate small{position:relative}
.forge-rate b{font:700 max(22px,2.1cqw)/1 Georgia,serif;color:#fff4d6}
.forge-rate small{margin-top:.2cqw;max-width:88%;text-align:center;font-size:max(9px,.62cqw);line-height:1.3;color:#9fd8c0}
.forge-rate[data-risk="true"] small{color:#ff9f8f}
.forge-core{position:relative;flex:1;min-height:0;width:100%;display:grid;place-items:center}
.forge-flare{position:absolute;width:20cqw;aspect-ratio:1;border-radius:50%;background:radial-gradient(circle,color-mix(in srgb,var(--g,#ff9a4a) 35%,transparent),transparent 65%);pointer-events:none}
.forge-gem{--s:2.6;width:max(96px,9.5cqw);border:0;padding:0;cursor:pointer;transition:scale .15s}
.forge-gem .gem-glyph{font-size:max(34px,3.4cqw)}
.forge[data-empty="true"] .forge-gem{visibility:hidden}
.forge-gem .gem-crack{position:absolute;inset:0;opacity:0;background:linear-gradient(115deg,transparent 46%,#02080e 47%,#02080e 49%,transparent 50%),linear-gradient(35deg,transparent 58%,#02080e 59%,#02080e 60.5%,transparent 61.5%),linear-gradient(160deg,transparent 30%,#02080e 31%,#02080e 32%,transparent 33%);pointer-events:none}
.bag-view.holding .forge-gem{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='32' height='32' viewBox='0 0 24 24' fill='%2302080e' stroke='%23ffe08a' stroke-width='1.6'%3E%3Cpath d='M14 4l6 6-3 3-6-6ZM12 9 3 18l3 3 9-9M17 3l4 4'/%3E%3C/svg%3E") 6 26,pointer}
.bag-view.holding .forge-gem:hover{scale:1.05}
.forge-plus{position:absolute;left:50%;top:calc(50% + max(56px,5.4cqw));translate:-50% 0;font:700 max(20px,1.9cqw)/1 Georgia,serif;color:#f6ecc9;letter-spacing:.05em;text-shadow:0 0 1cqw #000}
.forge-plus[data-tier="blue"]{color:#9fd4ff}.forge-plus[data-tier="violet"]{color:#d3b4ff}.forge-plus[data-tier="gold"]{color:#ffd36b}
.forge-plus[data-tier="rainbow"]{background:linear-gradient(90deg,#ff8a8a,#ffe08a,#9dffc9,#9fd4ff,#d3b4ff);-webkit-background-clip:text;background-clip:text;color:transparent}
.forge-hammer{position:absolute;left:calc(50% + max(40px,4cqw));top:calc(50% - max(96px,9cqw));width:max(56px,5cqw);aspect-ratio:1;opacity:0;transform-origin:15% 85%;pointer-events:none}
.forge-hammer svg{width:100%;height:100%;fill:#1a1208;stroke:#ffe08a;stroke-width:1.3;filter:drop-shadow(0 0 .6cqw #ff9a4a)}
.forge-hammer.swing{animation:f-swing .5s cubic-bezier(.5,0,.6,1)}
@keyframes f-swing{0%{opacity:0;rotate:-10deg;translate:1cqw -1cqw}25%{opacity:1;rotate:-55deg;translate:1cqw -1.5cqw}34%{rotate:25deg;translate:-1.6cqw 1.6cqw}55%{opacity:1;rotate:18deg;translate:-1.4cqw 1.4cqw}100%{opacity:0;rotate:-20deg;translate:0 0}}
.forge-gem.struck{animation:f-struck .18s ease-out}
@keyframes f-struck{0%{scale:.9}100%{scale:1}}
.forge-gem.tense{animation:f-tense .09s linear infinite}
@keyframes f-tense{0%{translate:-1px 0}50%{translate:1px -1px}100%{translate:-1px 1px}}
.forge-gem.success{animation:f-success .6s cubic-bezier(.2,1.6,.4,1)}
@keyframes f-success{0%{scale:1;filter:brightness(3) drop-shadow(0 0 2cqw #fff)}100%{scale:1}}
.forge-gem.fail .gem-crack{animation:f-crack 1.1s ease-out}
.forge-gem.fail{animation:f-fail .45s ease-out}
@keyframes f-crack{0%,60%{opacity:.9}100%{opacity:0}}
@keyframes f-fail{0%{filter:brightness(.4) sepia(1) hue-rotate(-40deg) saturate(4)}30%{translate:-.4cqw 0}50%{translate:.4cqw 0}100%{translate:0}}
.forge-gem.kept{animation:f-kept .4s ease-out}
@keyframes f-kept{0%{filter:brightness(.6)}100%{filter:none}}
.forge.jolt .forge-anvil{animation:f-jolt .22s ease-out}
@keyframes f-jolt{0%{translate:0 .3cqw}100%{translate:0 0}}
.forge-anvil{width:62%;height:1.4cqw;margin-top:-1.2cqw;border-radius:50%;background:radial-gradient(ellipse,#ff8a3c55,#1a0d05 55%,transparent 72%);box-shadow:0 0 3cqw #ff6a1a22}
.forge-stones{display:flex;gap:.7cqw;margin-top:1cqw}
.stone-slot{--c:#cfe3dc;display:grid;grid-template-columns:auto auto;grid-template-rows:auto auto;column-gap:.5cqw;align-items:center;padding:.5cqw .9cqw;border:1px solid color-mix(in srgb,var(--c) 30%,transparent);background:#050f16cc;color:var(--b-text);cursor:pointer;transition:translate .15s,border-color .15s}
.stone-slot:hover:not(:disabled){translate:0 -.2cqw;border-color:var(--c)}
.stone-slot[aria-pressed="true"]{border-color:var(--c);background:color-mix(in srgb,var(--c) 18%,#050f16);box-shadow:0 0 1.4cqw color-mix(in srgb,var(--c) 40%,transparent);translate:0 -.35cqw}
.stone-slot:disabled{opacity:.35;cursor:default}
.stone-glyph{grid-row:1/3;display:grid;place-items:center;width:max(26px,2.1cqw);aspect-ratio:1;font-size:max(14px,1.1cqw);color:#02080e;background:radial-gradient(circle at 35% 30%,#fff,var(--c) 50%,#02080e 130%);clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%)}
.stone-slot small{font-size:max(10px,.72cqw);letter-spacing:.06em;color:var(--b-muted);text-align:left}
.stone-slot b{font:max(13px,1cqw) Georgia,serif;color:#f6ecc9;text-align:left}
.forge-hint{min-height:1.5em;margin:.7cqw 0 0;font-size:max(10px,.72cqw);letter-spacing:.08em;color:var(--b-muted)}
.forge-hint.nudge{animation:f-nudge .5s ease-out;color:#ffe08a}
@keyframes f-nudge{0%,100%{translate:0}25%{translate:-.4cqw}75%{translate:.4cqw}}
.hand{position:absolute;left:0;top:0;z-index:30;display:flex;align-items:center;gap:.2cqw;pointer-events:none}
.hand:not([data-live]){opacity:0}
.hand span{display:grid;place-items:center;width:max(20px,1.5cqw);aspect-ratio:1;font-size:max(11px,.85cqw);color:#02080e;background:radial-gradient(circle at 35% 30%,#fff,var(--c) 50%,#02080e 130%);clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%)}
.hand b{font:max(11px,.8cqw) Georgia,serif;color:#fff4d6;text-shadow:0 0 .4cqw #000}

.rune-info{right:2%;top:9%;bottom:4%;width:24%;display:flex;flex-direction:column;--tier:#cfe3dc}
.rune-info[data-empty="true"]>*:not(.forge-log){visibility:hidden}
.rune-info-kicker{margin:0;font-size:max(10px,.72cqw);font-weight:700;letter-spacing:.2em;color:var(--tier)}
.rune-info h2{margin:.15cqw 0 .5cqw;font:700 max(17px,1.7cqw)/1.25 var(--serif);letter-spacing:.06em;color:#f6ecc9}
.rune-effect{display:flex;flex-wrap:wrap;align-items:baseline;gap:.4cqw;margin:0 0 .8cqw;font-size:max(11px,.85cqw);color:#cfe3dc}
.rune-effect i{font-style:normal;color:var(--b-muted)}
.rune-effect b{color:#ffe08a}
.rune-ladder{display:grid;grid-template-columns:repeat(15,1fr);align-items:end;gap:2px;height:4cqw;padding:.3cqw .3cqw 0;border-bottom:1px solid var(--b-line);cursor:help}
.rune-ladder i{height:calc(var(--h) * 100%);min-height:3px;background:#9cc0b855}
.rune-ladder i.drop{box-shadow:inset 0 2px 0 #ff9f8f99}
.rune-ladder i.drop2{box-shadow:inset 0 2px 0 #ff5d73}
.rune-ladder i.done{background:var(--tier)}
.rune-ladder i.next{background:#ffe08a;animation:l-next 1s ease-in-out infinite alternate}
@keyframes l-next{from{opacity:.55}to{opacity:1}}
.rune-owner{margin:.7cqw 0 .5cqw;font-size:max(11px,.78cqw);color:var(--b-muted)}
.rune-actions{display:grid;gap:.4cqw}
.forge-log{margin:auto 0 0;padding:.6cqw 0 0;list-style:none;border-top:1px solid var(--b-line);display:grid;gap:.2cqw}
.forge-log li{display:flex;justify-content:space-between;font-size:max(10px,.72cqw);color:var(--b-muted)}
.forge-log li b{font-family:Georgia,serif;font-weight:400}
.forge-log li.ok b{color:#ffe08a}.forge-log li.down b{color:#ff8a8a}.forge-log li.kept b{color:#9fb4c0}
.forge-log li:first-child{color:var(--b-text)}

/* Rune picker (growth slots). */
.rune-modal{max-width:560px}
.rune-modal h2{margin-bottom:10px}
.rune-pick{display:grid;gap:6px;max-height:50vh;overflow-y:auto;scrollbar-width:thin}
.rune-pick-row{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:12px;align-items:center;padding:8px 12px;border:1px solid var(--b-line);background:#050f16cc;text-align:left;color:var(--b-text);cursor:pointer}
.rune-pick-row:hover:not(:disabled){border-color:#ffe08a}
.rune-pick-row:disabled{opacity:.45;cursor:default}
.rune-pick-row.active{opacity:1;border-color:#ffe08a}
.rune-pick-row .rune-gem{width:36px}
.pick-text b{display:block;font-size:14px;color:#f6ecc9}
.pick-text small{font-size:12px;color:var(--b-muted)}
.rune-pick-row em{font-style:normal;font-size:11px;color:var(--b-gold)}
.rune-dialog-foot{display:flex;justify-content:space-between;align-items:center;margin-top:14px}
.rune-dialog-foot .ghost-button{padding:0 18px}
.rune-dialog-foot .text-button{margin:0;padding:0}

/* Result: what dropped. */
.result-drops{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:14px}
.drops-label{font-size:11px;letter-spacing:.2em;color:var(--b-gold);margin-right:4px}
.drop-chip{--c:#cfe3dc;display:inline-flex;align-items:center;gap:6px;padding:3px 10px 3px 4px;font-size:12px;color:#f6ecc9;border:1px solid color-mix(in srgb,var(--c) 45%,transparent);background:color-mix(in srgb,var(--c) 12%,#050f16);animation:d-drop .5s cubic-bezier(.2,1.6,.4,1) both}
.drop-chip i{display:grid;place-items:center;width:20px;height:20px;font-style:normal;font-size:12px;color:#02080e;background:radial-gradient(circle at 35% 30%,#fff,var(--c) 50%,#02080e 130%);clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%)}
.drop-chip.rune{box-shadow:0 0 12px color-mix(in srgb,var(--c) 45%,transparent)}
.drop-chip.rune i{clip-path:polygon(50% 0,100% 30%,100% 70%,50% 100%,0 70%,0 30%)}
@keyframes d-drop{from{opacity:0;translate:0 -10px;scale:.6}to{opacity:1;translate:0 0;scale:1}}
.summon-badge.variant{background:linear-gradient(90deg,#d3b4ff,#9fe9ff,#ffb4c8)}
/* Result (docs/result-ui.md): an old rite's record. A seal with a heptagram and a ring of runes turns behind an eye
   that opens gold for a win, red for a loss and pale for a draw; below, the tally, the offerings and the rank. */
.result-modal{--accent:#e8c46a;--eye:#ffcf5a;--glow:#ffb43a;padding:0;border:0;background:transparent;color:var(--b-text);width:min(980px,96vw);max-width:none;max-height:96vh;overflow:visible}
.result-modal[data-result="lose"]{--accent:#b8475a;--eye:#ff3b4f;--glow:#ff2440}
.result-modal[data-result="draw"]{--accent:#8fc9c4;--eye:#9fe9ff;--glow:#6fd8e8}
.result-modal::backdrop{background:radial-gradient(ellipse at 50% 40%,#02070bcc,#000000f2 75%);backdrop-filter:blur(3px) saturate(.6)}
.result-modal:focus{outline:none}
.rs-frame{position:relative;max-height:96vh;overflow-y:auto;scrollbar-width:thin;padding:20px 44px 22px;text-align:center;
  background:
    radial-gradient(ellipse 60% 45% at 50% 0,color-mix(in srgb,var(--glow) 16%,transparent),transparent 70%),
    radial-gradient(ellipse 80% 50% at 50% 115%,#0c4a4a55,transparent 70%),
    url(./assets/concepts/result-rite.webp) 50% 50%/cover no-repeat,
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='220' height='220'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 .6 0 0 0 0 .7 0 0 0 0 .65 0 0 0 .09 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E"),
    linear-gradient(180deg,#0a1317,#04080b 60%,#060a0c);
  border:1px solid color-mix(in srgb,var(--accent) 60%,#000);
  box-shadow:inset 0 0 0 5px #04080b,inset 0 0 0 6px color-mix(in srgb,var(--accent) 35%,transparent),inset 0 0 90px #000c,0 40px 120px #000e,0 0 70px color-mix(in srgb,var(--glow) 14%,transparent);
  animation:rs-open .55s cubic-bezier(.2,.9,.3,1) both}
@keyframes rs-open{from{opacity:0;transform:translateY(18px) scale(.97);filter:brightness(2.2) blur(2px)}to{opacity:1;transform:none;filter:none}}
.rs-corner{position:absolute;width:52px;height:52px;fill:none;stroke:var(--accent);stroke-width:1.4;opacity:.85;pointer-events:none}
.rs-corner circle{fill:var(--accent);stroke:none}
.rs-corner.tl{left:8px;top:8px}.rs-corner.tr{right:8px;top:8px;transform:scaleX(-1)}.rs-corner.bl{left:8px;bottom:8px;transform:scaleY(-1)}.rs-corner.br{right:8px;bottom:8px;transform:scale(-1)}

.rs-head{position:relative}
.rs-seal{position:relative;width:150px;height:150px;margin:0 auto -2px}
.rs-circle{position:absolute;inset:0;width:100%;height:100%;animation:rs-turn 40s linear infinite}
@keyframes rs-turn{to{rotate:360deg}}
.rs-line{fill:none;stroke:var(--accent);stroke-width:.9;opacity:.75}
.rs-line.faint{opacity:.35;stroke-dasharray:2 4}
.rs-star{fill:color-mix(in srgb,var(--glow) 7%,transparent);stroke:var(--accent);stroke-width:1;stroke-linejoin:round;opacity:.8}
.rs-runes{font:10.5px var(--serif);letter-spacing:2.2px;fill:var(--accent);opacity:.8}
.rs-eye{position:absolute;left:50%;top:50%;width:84px;height:42px;translate:-50% -50%;overflow:visible;filter:drop-shadow(0 0 10px var(--glow))}
.rs-lid{fill:#020507;stroke:var(--accent);stroke-width:2.2}
.rs-iris{fill:var(--eye);transform-origin:60px 30px;animation:rs-iris 3.2s ease-in-out infinite}
.rs-pupil{fill:#020507}
.rs-eye{animation:rs-wake 1.2s cubic-bezier(.3,.8,.3,1) .25s both}
@keyframes rs-wake{0%{transform:scaleY(.04);opacity:.4}45%{transform:scaleY(.04);opacity:1}70%{transform:scaleY(1.15)}100%{transform:scaleY(1)}}
@keyframes rs-iris{0%,100%{transform:translateX(0)}30%{transform:translateX(-5px)}60%{transform:translateX(4px)}}
.rs-kicker{position:relative;margin:0;font:700 11px Georgia,serif;letter-spacing:.55em;color:color-mix(in srgb,var(--accent) 80%,#fff)}
.result-modal h2{position:relative;margin:2px 0 0;font:700 clamp(40px,6vw,64px)/1.15 var(--serif);letter-spacing:.35em;text-indent:.35em;
  background:linear-gradient(180deg,#fff8dc 5%,color-mix(in srgb,var(--accent) 85%,#fff) 45%,color-mix(in srgb,var(--accent) 70%,#2a1600) 100%);-webkit-background-clip:text;background-clip:text;color:transparent;
  filter:drop-shadow(0 2px 0 #000) drop-shadow(0 0 18px color-mix(in srgb,var(--glow) 45%,transparent));animation:rs-stamp .7s cubic-bezier(.2,1.4,.4,1) .55s both}
@keyframes rs-stamp{0%{opacity:0;transform:scale(1.8);letter-spacing:.8em}100%{opacity:1;transform:none}}
.rs-epithet{margin:2px 0 0;font:500 15px/1.6 var(--serif);letter-spacing:.3em;color:#d8cfae;animation:rs-fade .8s ease-out 1s both}
.rs-epithet:before,.rs-epithet:after{content:"";display:inline-block;width:46px;height:1px;margin:0 14px;vertical-align:middle;background:linear-gradient(90deg,transparent,var(--accent))}
.rs-epithet:after{transform:scaleX(-1)}
.rs-copy{margin:4px 0 0;font-size:11px;letter-spacing:.08em;color:var(--b-muted);animation:rs-fade .8s ease-out 1.1s both}
@keyframes rs-fade{from{opacity:0;translate:0 6px}to{opacity:1;translate:0}}

.rs-body{display:grid;grid-template-columns:1fr 1.15fr 1fr;gap:14px;margin-top:16px;text-align:left}
.rs-card{position:relative;padding:12px 16px 14px;border:1px solid color-mix(in srgb,var(--accent) 30%,transparent);background:linear-gradient(180deg,#0b161bcc,#050b0ecc);box-shadow:inset 0 0 24px #000a;animation:rs-fade .6s ease-out both}
.rs-card:nth-child(1){animation-delay:1.15s}.rs-card:nth-child(2){animation-delay:1.3s}.rs-card:nth-child(3){animation-delay:1.45s}
.rs-card:before{content:"";position:absolute;inset:3px;border:1px solid color-mix(in srgb,var(--accent) 12%,transparent);pointer-events:none}
.rs-card h3{display:flex;align-items:center;gap:10px;margin:0 0 8px;font:700 13px var(--serif);letter-spacing:.6em;color:color-mix(in srgb,var(--accent) 85%,#fff)}
.rs-card h3:after{content:"";flex:1;height:1px;background:linear-gradient(90deg,color-mix(in srgb,var(--accent) 50%,transparent),transparent)}
.rs-ledger dl{display:grid;gap:5px;margin:0}
.rs-ledger dl div{display:flex;justify-content:space-between;align-items:baseline;padding-bottom:4px;border-bottom:1px dotted #9fb5b133}
.rs-ledger dt{font-size:11px;letter-spacing:.12em;color:var(--b-muted)}
.rs-ledger dd{margin:0;font:22px/1.1 Georgia,serif;color:#f1e8c8}
.rs-gain{display:flex;justify-content:space-between;align-items:baseline;margin-top:2px}
.rs-gain span{font-size:11px;letter-spacing:.15em;color:var(--b-muted)}
.rs-gain strong{font:26px/1.2 Georgia,serif;color:#9dffe6;text-shadow:0 0 12px #3fbfa855}
.rs-gold strong{color:#ffe08a;text-shadow:0 0 12px #d9a44166}
.rs-gold strong{display:inline-flex;align-items:center;gap:4px}.rs-gold strong b{font:inherit}
.rs-crystal{width:1.15em;height:1.15em;object-fit:contain;filter:drop-shadow(0 0 6px #b98cff66)}
.rs-parts{margin:2px 0 0;font-size:10.5px;line-height:1.6;letter-spacing:.04em;color:#b9ab80;text-align:right}
.rs-offering .result-drops{margin-top:8px}
.rs-rank-row{display:flex;align-items:center;gap:12px}
.rs-sigil{flex:none;width:58px;height:58px;filter:drop-shadow(0 0 8px var(--rank-glow,#7fd6c855))}
.rs-sigil svg{width:100%;height:100%}
.rs-rank-name{margin:0;font:700 17px var(--serif);letter-spacing:.2em;color:var(--rank-color,#f6ecc9)}
.rs-rating{margin:0;display:flex;align-items:baseline;gap:10px}
.rs-rating strong{font:28px/1.1 Georgia,serif;color:#f6ecc9}
.rs-rating em{font:700 15px Georgia,serif;font-style:normal;color:#9dffc9}
.rs-rating em.down{color:#ff8a8a}.rs-rating em.even{color:var(--b-muted)}
/* A win streak doubled the rise (src/rating.mjs STREAK_FROM). */
.rs-rating em .rs-streak{margin-left:8px;padding:1px 6px;border:1px solid #ffd77a88;font:700 11px "Yu Gothic UI",sans-serif;letter-spacing:.08em;color:#ffd77a;white-space:nowrap}
/* Two tags (a streak and an opponent who left) sit under the number. */
.rs-rating em{display:inline-flex;flex-wrap:wrap;align-items:baseline;row-gap:4px}
.rs-bar{height:5px;margin:10px 0 4px;background:#02080e;border:1px solid #9cc0b830}
.rs-bar i{display:block;height:100%;width:0;background:linear-gradient(90deg,color-mix(in srgb,var(--rank-color,#7fd6c8) 50%,#000),var(--rank-color,#7fd6c8));box-shadow:0 0 8px var(--rank-color,#7fd6c8);transition:width 1.2s cubic-bezier(.3,.8,.3,1)}
.rs-next{margin:0;font-size:10.5px;letter-spacing:.06em;color:var(--b-muted)}
.rs-stamp{position:absolute;right:10px;top:8px;margin:0;padding:2px 10px;font:700 15px var(--serif);letter-spacing:.4em;color:var(--rank-color,#ffe08a);border:2px solid currentColor;rotate:-8deg;text-shadow:0 0 10px currentColor;animation:rs-stamp .6s cubic-bezier(.2,1.6,.4,1) 2s both}
.rs-stamp.down{color:#9a8f86;text-shadow:none}
.rs-growth{min-height:18px;margin:12px 0 0;font:500 13px var(--serif);letter-spacing:.12em;color:#ffe9b0}
.rs-actions{display:flex;justify-content:center;align-items:center;gap:26px;margin-top:12px}
.rs-again{display:flex;align-items:center;gap:10px;min-width:240px;justify-content:center;padding:12px 30px;font:700 18px var(--serif);letter-spacing:.5em;text-indent:.5em;color:#1c1204;
  background:linear-gradient(180deg,#fff1c4,color-mix(in srgb,var(--accent) 80%,#fff) 40%,color-mix(in srgb,var(--accent) 65%,#3a2200));border:1px solid #fff4cf;
  clip-path:polygon(12px 0,calc(100% - 12px) 0,100% 50%,calc(100% - 12px) 100%,12px 100%,0 50%);box-shadow:0 0 30px color-mix(in srgb,var(--glow) 40%,transparent)}
.rs-again:hover{filter:brightness(1.12)}
.rs-again svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:2.2}
.rs-link{padding:6px 4px;font:500 13px var(--serif);letter-spacing:.3em;color:#bfb38f;border-bottom:1px solid transparent}
.rs-link:hover{color:#ffe9b0;border-bottom-color:currentColor}
@media(max-width:760px){.rs-body{grid-template-columns:1fr}.rs-frame{padding:18px 20px}.rs-again{min-width:0}}
@media(max-height:760px){.rs-seal{width:118px;height:118px;margin-bottom:-2px}.result-modal h2{font-size:44px}.rs-body{margin-top:10px}.rs-ledger dd{font-size:19px}.rs-gain strong{font-size:22px}}
/* Rated matches: the rank on the matching screen and in the growth records. */
.matching-rank{display:flex;align-items:center;justify-content:center;gap:.6cqw;margin:.4cqw 0 .2cqw;font-size:max(12px,.95cqw);letter-spacing:.12em}
.matching-rank .sigil{width:max(26px,2.1cqw);height:max(26px,2.1cqw)}
.matching-rank span{font:max(14px,1.15cqw) Georgia,serif;color:#f6ecc9}
.records .record-rank dt{display:flex}
.records .record-rank .sigil{width:max(16px,1.3cqw);height:max(16px,1.3cqw)}
/* The shopkeeper: Codex's picture when there is one, otherwise a shadow at the forge with ember eyes. */
.shop-keeper{position:absolute;z-index:4;left:1%;width:27%;top:9%;bottom:3%;display:flex;flex-direction:column;justify-content:flex-end}
.keeper-glow{position:absolute;left:10%;right:10%;bottom:18%;height:55%;border-radius:50%;background:radial-gradient(ellipse at 50% 70%,#ff7a2a55,#ff4a1a18 45%,transparent 70%);filter:blur(1cqw);animation:k-fire 2.6s ease-in-out infinite}
@keyframes k-fire{0%,100%{opacity:.75;scale:1}40%{opacity:1;scale:1.04}70%{opacity:.85}}
.keeper-figure{position:relative;flex:1;min-height:0}
.keeper-art,.keeper-shade{position:absolute;left:50%;bottom:0;height:100%;max-width:100%;width:auto;aspect-ratio:5/8;translate:-50% 0;object-fit:contain;transform-origin:50% 100%;animation:idle-human 4.6s ease-in-out infinite}
.keeper-art{filter:drop-shadow(0 1cqw .8cqw #000c)}
.shop-keeper:not(.no-art) .keeper-shade,.shop-keeper.no-art .keeper-art{display:none}
.keeper-shade *{stroke:none}
.keeper-shade .k-body,.keeper-shade .k-hood,.keeper-shade .k-arm{fill:#07090b}
.keeper-shade .k-apron{fill:#1a110a}.keeper-shade .k-beard{fill:#14100c}
.keeper-shade .k-handle{stroke:#2a1a0e;stroke-width:6;stroke-linecap:round}.keeper-shade .k-head{fill:#20252a;stroke:#ff9a4a55;stroke-width:1.5}
.keeper-shade .k-rim{fill:none;stroke:url(#keeper-rim);stroke-width:4}
.keeper-shade .k-eye{fill:#ffb45e;filter:drop-shadow(0 0 3px #ff7a2a);animation:k-blink 5.5s infinite}
@keyframes k-blink{0%,46%,50%,100%{opacity:1}48%{opacity:0}}
.keeper-talk{position:relative;margin-top:-1cqw;padding:.8cqw 1.1cqw 1cqw;border:1px solid #e8d49a55;background:linear-gradient(180deg,#0b0f12f2,#050709f2);box-shadow:0 1cqw 2cqw #000a}
.keeper-talk:before{content:"";position:absolute;left:18%;top:-.55cqw;width:1cqw;height:1cqw;rotate:45deg;background:#0b0f12;border-left:1px solid #e8d49a55;border-top:1px solid #e8d49a55}
.keeper-name{margin:0 0 .3cqw;font:700 max(11px,.8cqw) var(--serif);letter-spacing:.3em;color:#e8b86a}
.keeper-line{min-height:2.8em;margin:0;font:500 max(13px,1cqw)/1.55 var(--serif);letter-spacing:.06em;color:#f1e8d0}
.forge-hint.quip{color:#e8b86a;font-family:var(--serif);letter-spacing:.12em}
/* Evolution (docs/evolution.md): a full-screen rite that cannot be skipped. */
.evo-line{display:flex;flex-wrap:wrap;align-items:center;gap:.4cqw .7cqw;margin:.45cqw 0 0;font-size:max(10px,.72cqw);color:var(--b-muted);cursor:help}
.evo-line b{font-size:max(10px,.72cqw);letter-spacing:.2em;color:#cfe3dc}
.evo-line span{padding:0 .4cqw;border:1px solid #9cc0b840}
.evo-line span.met{color:#9dffc9;border-color:#9dffc980}
.evo-line.ready{color:#ffe08a}.evo-line.ready b{color:#ffe08a;text-shadow:0 0 .6cqw #ffb43a}
.rs-growth.omen{color:#d3b4ff;text-shadow:0 0 12px #8a5cff;animation:rs-omen 1.6s ease-in-out infinite}
@keyframes rs-omen{50%{opacity:.55}}
.evo-scene{--fx:#9fe9ff;--glow:#6a4cff;position:fixed;inset:0;z-index:300;overflow:hidden;background:radial-gradient(ellipse at 50% 55%,color-mix(in srgb,var(--glow) 16%,#04090d70),#010204c8 80%),url(./assets/concepts/evolution-rite.webp) center 65%/cover #010204;color:var(--b-text);animation:evo-in .8s ease-out;cursor:default;perspective:900px}
.evo-scene[hidden]{display:none}
@keyframes evo-in{from{opacity:0}}
.evo-scene canvas{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:3}
.evo-circle{position:absolute;left:50%;top:66%;width:min(78vh,82vw);aspect-ratio:1;translate:-50% -50%;transform:rotateX(70deg);fill:none;stroke:var(--fx);stroke-width:.8;opacity:0;filter:drop-shadow(0 0 6px var(--glow));transition:opacity 1s}
.evo-circle polygon{stroke-width:1.2}
.evo-scene.rite .evo-circle{opacity:.85;animation:evo-circle 14s linear infinite}
@keyframes evo-circle{to{transform:rotateX(70deg) rotate(360deg)}}
.evo-rays{position:absolute;left:50%;top:50%;width:160vmax;height:160vmax;translate:-50% -50%;background:repeating-conic-gradient(from 0deg,color-mix(in srgb,var(--fx) 30%,transparent) 0 4deg,transparent 4deg 16deg);-webkit-mask-image:radial-gradient(circle,#000 5%,transparent 45%);mask-image:radial-gradient(circle,#000 5%,transparent 45%);opacity:0;transition:opacity .6s}
.evo-scene.reveal .evo-rays{opacity:.8;animation:rs-turn 30s linear infinite}
.evo-stage{position:absolute;left:50%;top:52%;width:min(56vh,62vw);aspect-ratio:1;translate:-50% -50%;z-index:2}
.evo-sprite{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 1.5vh 1.2vh #000c);transition:opacity .05s}
.evo-to{opacity:0}
.evo-scene.glow .evo-sprite{filter:brightness(0) invert(1) drop-shadow(0 0 1.5vh var(--fx)) drop-shadow(0 0 4vh var(--glow))}
.evo-scene.glow .evo-stage{animation:evo-pulse .65s ease-in-out infinite}
@keyframes evo-pulse{50%{scale:1.05}}
.evo-scene.swap .evo-sprite:not(.evo-to){opacity:0}.evo-scene.swap .evo-to{opacity:1}
.evo-scene.reveal .evo-to{animation:evo-reveal 1.4s cubic-bezier(.2,.9,.3,1)}
@keyframes evo-reveal{0%{filter:brightness(6) drop-shadow(0 0 5vh #fff);scale:1.12}100%{filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 1.5vh 1.2vh #000c);scale:1}}
.evo-text{position:absolute;left:0;right:0;bottom:13%;z-index:4;margin:0;text-align:center;font:700 clamp(20px,3vw,34px) var(--serif);letter-spacing:.2em;color:#f6ecc9;text-shadow:0 0 18px var(--glow),0 2px 0 #000}
.evo-sub{position:absolute;left:0;right:0;bottom:8.5%;z-index:4;margin:0;text-align:center;font:500 clamp(12px,1.4vw,16px) var(--serif);letter-spacing:.25em;color:#cfe3dc}
.evo-next{position:absolute;left:0;right:0;bottom:4%;z-index:4;margin:0;text-align:center;font:700 12px Georgia,serif;letter-spacing:.3em;color:#b8b58e;animation:rs-omen 1.4s ease-in-out infinite}
/* Title (docs/account.md): the first screen. Starting from it also unlocks sound. */
.sanctum:not([data-view="title"]) .title-view,.sanctum:not([data-view="starter"]) .starter-view{display:none}
.sanctum[data-view="title"] .sanctum-top{visibility:hidden}
.sanctum[data-view="starter"] .top-left{visibility:hidden}
.sanctum[data-view="title"] .sanctum-bg,.sanctum[data-view="starter"] .sanctum-bg{background-image:url(./assets/concepts/summoning-vault.webp)}
.sanctum[data-view="title"] .sanctum-bg{filter:brightness(.42) saturate(.8)}
.title-view{position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center}
.title-seal{position:absolute;left:50%;top:44%;width:44cqw;aspect-ratio:1;translate:-50% -50%;border-radius:50%;border:1px solid #e8d49a40;box-shadow:0 0 6cqw #6a4cff33,inset 0 0 4cqw #7ff5e41a;background:repeating-conic-gradient(from 0deg,#e8d49a14 0 2deg,transparent 2deg 25.7deg);animation:rs-turn 60s linear infinite;pointer-events:none}
.title-logo{position:relative}
/* The β mark (2026-10-01: published as a beta). */
.title-beta{position:absolute;top:-.6cqw;right:-3.2cqw;padding:.1cqw .7cqw;border:1px solid #e8d49a99;font:700 max(14px,1.4cqw)/1.3 Georgia,serif;color:#f3d27f;background:#02080ecc;text-shadow:0 0 .8cqw #f0c35070;rotate:8deg}
.title-logo h1{margin:0;font:700 max(34px,5.3cqw)/1 var(--serif);letter-spacing:.3em;text-indent:.3em;background:linear-gradient(180deg,#fff8dc,#e8c46a 55%,#8a6420);-webkit-background-clip:text;background-clip:text;color:transparent;filter:drop-shadow(0 .3cqw 0 #000) drop-shadow(0 0 2cqw #ffb43a55)}
.title-logo p{margin:.6cqw 0 0;font:500 max(13px,1.3cqw) var(--serif);letter-spacing:.8em;text-indent:.8em;color:#cfc6a3}
.title-menu{position:relative;margin-top:4cqw;display:flex;flex-direction:column;align-items:center;gap:.8cqw}
.title-start{--accent:#e8c46a;--glow:#ffb43a;min-width:max(220px,20cqw)}
.title-who{margin:0;font-size:max(12px,.95cqw);letter-spacing:.15em;color:#cfe3dc}
.title-links{display:flex;gap:2cqw}
.title-note{min-height:1.2em;margin:0;font-size:max(11px,.8cqw);color:var(--b-muted)}
.title-press{position:absolute;bottom:6%;margin:0;font:700 max(11px,.85cqw) Georgia,serif;letter-spacing:.5em;color:#b8b58e;animation:rs-omen 1.8s ease-in-out infinite}
.title-credits{position:absolute;right:2.2%;bottom:3.5%;font-size:max(11px,.78cqw);letter-spacing:.2em;color:var(--b-muted);text-decoration:none}
.title-credits:hover,.title-credits:focus-visible{color:var(--b-gold)}
/* The first contract (docs/starter.md): three altars over one mire, a card under each. */
.starter-view{position:absolute;inset:0;z-index:4}
.starter-head{position:absolute;left:0;right:0;top:4%;text-align:center}
.starter-kicker{margin:0;font:700 max(10px,.75cqw) Georgia,serif;letter-spacing:.5em;color:#b8b58e}
.starter-head h2{margin:.2cqw 0;font:700 max(24px,2.8cqw) var(--serif);letter-spacing:.4em;text-indent:.4em;color:#f6ecc9;text-shadow:0 0 1.5cqw #6a4cff}
.starter-lead{min-height:1.4em;margin:0;font:500 max(13px,1.05cqw) var(--serif);letter-spacing:.2em;color:#d8cfae}
.starter-card.rare .stars{color:#ffe5a3;text-shadow:0 0 12px #e7b34855}
.starter-altar{top:73%}
/* Their feet rest in a soft light of their own colour, not on a dark hole. */
.starter-altar .altar-floor{width:14cqw;height:2cqw;background:radial-gradient(ellipse,color-mix(in srgb,var(--fx,#7ff5e4) 45%,transparent),transparent 70%);border:0;box-shadow:none;opacity:.75}.starter-altar.s0{left:20%}.starter-altar.s1{left:50%}.starter-altar.s2{left:80%}
.starter-altar .altar-halo,.starter-altar .altar-floor{width:16cqw}
.starter-altar.sink .altar-rig{animation:st-sink .8s ease-in forwards}
/* The first contract: no rising out of a pool. Each one takes shape out of the dark as a shadow, then the light finds it. */
.summon-altar.starter-altar.rise .altar-sprite{animation:st-appear 1.1s ease-out both;clip-path:none;transform:none;filter:brightness(0) drop-shadow(0 0 .35cqw color-mix(in srgb,var(--fx,#7ff5e4) 55%,transparent))}
.summon-altar.starter-altar.rise.lit .altar-sprite{animation:st-lit 1.3s ease-out;filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 1.2cqw .9cqw #000c)}
@keyframes st-appear{from{opacity:0;translate:0 2%}}
@keyframes st-lit{from{filter:hue-rotate(var(--hue,0deg)) brightness(0) drop-shadow(0 0 .35cqw var(--fx,#7ff5e4))}}
@keyframes st-sink{to{translate:calc(var(--cx) * -100%) 60%;opacity:0;filter:brightness(0)}}
.starter-altar.chosen .altar-halo{opacity:.55;filter:blur(3cqw)}
.starter-cards{position:absolute;left:6%;right:6%;bottom:10%;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8cqw;pointer-events:none}
.starter-card{--c:#9fe9ff;position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:.8cqw;padding:.45cqw .6cqw .45cqw 1cqw;border:1px solid color-mix(in srgb,var(--c) 40%,transparent);background:linear-gradient(180deg,#06131be6,#040a0ef2);box-shadow:0 1cqw 2cqw #000a;opacity:0;translate:0 1cqw;transition:opacity .5s,translate .5s,border-color .2s;pointer-events:auto}
.starter-card.shown{opacity:1;translate:0}
.starter-card:hover{border-color:var(--c)}
.starter-card .stars{margin:0 .4cqw 0 0;font-size:max(10px,.7cqw);color:#ffe7a0;letter-spacing:.1em}
.starter-card b{display:block;font:700 max(14px,1.25cqw) var(--serif);letter-spacing:.06em;color:#f6ecc9;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.starter-card small{display:block;font-size:max(10px,.72cqw);color:var(--b-muted)}
.starter-card p{margin:.2cqw 0 0;font-size:max(10px,.72cqw);line-height:1.45;color:#cfe3dc;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;cursor:help}
.starter-card .variant{display:inline-block;margin-left:.4cqw;padding:0 .4cqw;font-size:max(10px,.7cqw);color:#1c1204;background:linear-gradient(90deg,#d3b4ff,#9fe9ff,#ffb4c8)}
.starter-card .ghost-button{height:max(28px,2.1cqw);padding:0 1.3cqw;white-space:nowrap}
.starter-card .sc-text{min-width:0}
.starter-card.gone{opacity:0;translate:0 1cqw}
.starter-actions{position:absolute;left:0;right:0;bottom:2.5%;display:flex;justify-content:center;align-items:center;gap:2cqw}
.starter-actions .rs-again{--accent:#9fe9ff;--glow:#6a4cff;min-width:max(180px,14cqw)}
.starter-actions .ghost-button{padding:0 1.6cqw}
/* Account dialogs. */
.account-modal{max-width:440px}
.account-form{display:grid;gap:12px;margin-top:4px}
.account-form label{display:grid;gap:4px;font-size:12px;letter-spacing:.08em;color:var(--b-muted)}
.account-form label small{font-size:10.5px;color:#7d948f}
.account-form input{padding:9px 10px;border:1px solid var(--b-line);background:#040b10;color:#f1e8d0;font:15px Consolas,"Yu Gothic UI",monospace;letter-spacing:.05em}
.account-form input:focus{outline:1px solid #e8d49a;border-color:#e8d49a}
.account-error{min-height:1.2em;margin:0;font-size:12px;color:#ff9f8f}
.account-lead{margin:0 0 10px;font-size:13px;line-height:1.7;color:#cfe3dc}
.account-actions{display:flex;flex-wrap:wrap;gap:10px}.account-actions .ghost-button{padding:8px 14px;white-space:normal;height:auto;min-height:38px}
.account-code{margin-top:12px;padding:14px;border:1px solid #e8d49a80;background:#0b0f12;text-align:center}
.account-code p{margin:0 0 8px;font-size:12px;line-height:1.6;color:#d8cfae}
.account-code strong{display:block;margin:6px 0 12px;font:700 26px Consolas,monospace;letter-spacing:.12em;color:#ffe08a}
.account-fine{margin:14px 0 0;font-size:10.5px;color:#6f8581}
.account-email{margin:16px 0;text-align:left;font-size:12px;line-height:1.7}
.account-email summary{cursor:pointer;color:#ffe08a}
.account-email .account-form{margin:12px 0}
.account-open-game{text-align:center}
#account-code-value{user-select:text}
.input-mode-control{display:flex;align-items:center;justify-content:center;gap:6px;font-size:11px;color:var(--b-muted)}
.input-mode-control select{min-height:36px;max-width:135px;padding:5px;border:1px solid var(--b-line);background:#06131b;color:var(--b-text);font:inherit}
.title-input-mode{margin-top:14px}.title-input-note{font-size:11px;color:var(--b-muted);margin:5px 0}
.flick-pad{position:absolute;z-index:20;left:3%;right:3%;bottom:max(8px,env(safe-area-inset-bottom));height:36%;display:flex;flex-direction:column;gap:6px;touch-action:none;user-select:none;-webkit-user-select:none;background:#06121bf2;border:1px solid #9cc0b845;border-radius:12px;padding:10px}
.flick-toolbar{display:flex;align-items:center;gap:8px;height:44px;flex-shrink:0}
.flick-modifiers{display:flex;gap:6px}.flick-modifier{width:42px;min-height:42px;background:#132f3b;border:1px solid #9cc0b866;border-radius:6px;font-size:22px;touch-action:none}
.flick-modifier[aria-pressed="true"]{background:#e8c46a;color:#231600}
.flick-preview{flex:1;text-align:center;font-size:26px;font-weight:700;color:#ffe7a0}
#flick-skill{min-height:42px;padding:7px 12px;font-size:14px}
.flick-grid{flex:1;min-height:0;display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(4,1fr);gap:5px}
.flick-key{position:relative;min-height:40px;background:linear-gradient(#173440,#0c222c);border:1px solid #a2c6c166;border-radius:7px;touch-action:none}
.flick-key:last-child{grid-column:2}
.flick-key span{position:absolute;font-size:11px;color:#8baaa8;line-height:1;pointer-events:none}
.flick-key span:not([data-direction="0"]){display:none}
.flick-key [data-direction="0"]{left:50%;top:50%;translate:-50% -50%;font-size:24px;color:#fff2cf}
.flick-key [data-direction="1"]{left:9%;top:50%;translate:0 -50%}.flick-key [data-direction="2"]{left:50%;top:4px;translate:-50% 0}
.flick-key [data-direction="3"]{right:9%;top:50%;translate:0 -50%}.flick-key [data-direction="4"]{left:50%;bottom:4px;translate:-50% 0}
.flick-key[data-selected]{background:#37505b;border-color:#ffe7a0}
.flick-key[data-selected="0"] [data-direction="0"],.flick-key[data-selected="1"] [data-direction="1"],.flick-key[data-selected="2"] [data-direction="2"],.flick-key[data-selected="3"] [data-direction="3"],.flick-key[data-selected="4"] [data-direction="4"]{color:#ffe7a0;font-weight:700}
.flick-popup{position:fixed;z-index:400;width:156px;height:156px;display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);pointer-events:none;filter:drop-shadow(0 3px 8px #000b)}
.flick-popup[hidden]{display:none}
.flick-popup span{display:flex;align-items:center;justify-content:center;background:#173440;border:1px solid #adcfc8;border-radius:7px;color:#fff2cf;font:600 27px/1 var(--body)}
.flick-popup [data-direction="0"]{grid-area:2/2}.flick-popup [data-direction="1"]{grid-area:2/1}.flick-popup [data-direction="2"]{grid-area:1/2}.flick-popup [data-direction="3"]{grid-area:2/3}.flick-popup [data-direction="4"]{grid-area:3/2}
.flick-popup[data-selected="0"] [data-direction="0"],.flick-popup[data-selected="1"] [data-direction="1"],.flick-popup[data-selected="2"] [data-direction="2"],.flick-popup[data-selected="3"] [data-direction="3"],.flick-popup[data-selected="4"] [data-direction="4"]{background:#f1d788;color:#201b0f;border-color:#fff3c0}
.flick-hint{font-size:10px;line-height:1.4;margin:0;text-align:center;color:#abc5c0}
body[data-input="flick"] .arena{width:min(100vw,76vh);height:100dvh;aspect-ratio:auto}
body[data-input="flick"] .arena-scene{bottom:38%}
body[data-input="flick"] .rune-panel{bottom:39%;width:94%;padding:10px 12px}
body[data-input="flick"] .rune-panel h2{font-size:clamp(26px,6cqw,38px)}
body[data-input="flick"] .word-guide{font:600 22px/1.3 var(--body);min-height:29px}
body[data-input="flick"] .combo-dock{right:3%;bottom:54%;padding:0}
body[data-input="flick"] .combo-count strong{font-size:26px}
body[data-input="flick"] .battle-hud{left:2%;right:2%;grid-template-columns:minmax(0,1fr) 56px minmax(0,1fr);gap:4px}
body[data-input="flick"] .plate-name{display:block;white-space:normal}
body[data-input="flick"] .plate-identity strong{font-size:13px}
body[data-input="flick"] .plate-name .hp-num{display:block;font-size:10px}
body[data-input="flick"] .plate-name>small,body[data-input="flick"] .form-title,body[data-input="flick"] .gauge-name,body[data-input="flick"] .trait-chip{display:none}
body[data-input="flick"] .plate{padding:7px}
body[data-input="flick"] .clock{width:52px}body[data-input="flick"] .clock strong{font-size:16px}
body[data-input="flick"] .arena-icon{min-width:36px;height:36px}body[data-input="flick"] .arena-icon kbd{display:none}
body[data-input="flick"] #skill-button{display:none}
body[data-input="flick"] .battle-callout{font-size:22px;max-width:95%;white-space:normal;text-align:center}
@media(max-width:900px) and (orientation:portrait){
  body[data-input="flick"] .sanctum{width:100vw;height:100dvh;aspect-ratio:auto}
  body[data-input="flick"] .title-logo h1{font-size:clamp(23px,6.6vw,36px);letter-spacing:.14em}
  body[data-input="flick"] .title-logo p{letter-spacing:.3em}
  body[data-input="flick"] .title-seal{width:90cqw}
  body[data-input="flick"] .title-menu{gap:12px;margin-top:30px}
  body[data-input="flick"] .title-links button{min-height:44px}
  body[data-input="flick"] .sanctum-top{grid-template-columns:1fr auto;gap:5px;top:max(8px,env(safe-area-inset-top))}
  body[data-input="flick"] .sanctum-top>.input-mode-control{grid-row:2;grid-column:1/-1}
  body[data-input="flick"] .top-actions{gap:5px;justify-content:flex-end}
  body[data-input="flick"] .top-actions .arena-icon{width:36px;height:36px}
  body[data-input="flick"] .starter-card{gap:3px;padding:10px 4px}
  body[data-input="flick"] .starter-card strong{font-size:16px}
  body[data-input="flick"] .starter-card button{min-height:44px}
  body[data-input="flick"] .front-view{padding:100px 14px 18px;align-items:stretch}
  body[data-input="flick"] .front-heading{flex-shrink:0}
  body[data-input="flick"] .gates{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));gap:12px;width:100%}
  body[data-input="flick"] .gate-text{padding:12px}
  body[data-input="flick"] .gate-text b{font-size:22px}
  body[data-input="flick"] #gate-battle .gate-text b{font-size:19px;letter-spacing:.03em}
  body[data-input="flick"] .gate-art{bottom:35%;top:6%}
  body[data-input="flick"] .matching-box{width:90%}
  .modal{max-height:92dvh;padding:22px}
}
@media(max-height:550px) and (orientation:landscape){body[data-input="flick"] .arena{width:100vw}body[data-input="flick"] .flick-pad{left:52%;right:2%;height:90%;bottom:5%}body[data-input="flick"] .arena-scene{right:49%;bottom:0}body[data-input="flick"] .rune-panel{width:46%;left:25%;bottom:8%}body[data-input="flick"] .rune-panel h2{font-size:28px}body[data-input="flick"] .battle-hud{right:51%}body[data-input="flick"] .combo-dock{right:52%;bottom:30%}body[data-input="flick"] .duel{right:51%;top:29%}body[data-input="flick"] .battle-callout{left:25%;max-width:46%}}
/* Species values (種族値): the contract detail, the growth panel and the bestiary. */
.species-modal{max-width:560px;text-align:left}
.species-top{display:grid;grid-template-columns:150px 1fr;gap:16px;align-items:center}
.species-art{height:150px;display:grid;place-items:center;background:radial-gradient(ellipse at 50% 70%,color-mix(in srgb,var(--c,#9fe9ff) 25%,transparent),transparent 70%)}
.species-art img{max-width:100%;max-height:100%;object-fit:contain;filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 8px 8px #000c)}
.species-head h2{margin:0}
.species-title{margin:0;font-size:12px;letter-spacing:.1em;color:var(--b-gold)}
.species-desc{margin:8px 0 0;font-size:12px;line-height:1.7;color:#b9c9c4}
.species-block{margin-top:14px;padding-top:10px;border-top:1px solid var(--b-line)}
.species-block h3{margin:0 0 6px;font:700 13px var(--serif);letter-spacing:.4em;color:#e8d49a}
.species-stats{display:grid;gap:8px}
.species-stat{display:grid;grid-template-columns:3em 1fr auto;gap:10px;align-items:center;font-size:13px}
.species-stat b{letter-spacing:.2em;color:#cfe3dc}
.species-bar{position:relative;height:10px;background:#02080e;border:1px solid #9cc0b840}
.species-bar i{position:absolute;left:0;top:0;bottom:0;background:linear-gradient(90deg,color-mix(in srgb,var(--c) 45%,#000),var(--c))}
.species-bar i.next{background:repeating-linear-gradient(90deg,color-mix(in srgb,var(--c) 30%,transparent) 0 4px,transparent 4px 7px);border-right:1px dashed var(--c)}
.species-stat strong{font:16px Georgia,serif;color:#f6ecc9;white-space:nowrap}
.species-stat strong small{margin-left:6px;font-size:12px;color:#9dffc9}
.species-note{margin:8px 0 0;font-size:11.5px;line-height:1.6;color:var(--b-muted)}
.species-line{margin:0;font-size:13px;line-height:1.7;color:#e9e8d8}
.species-line small{display:block;font-size:11.5px;color:var(--b-muted)}
.species-tag{margin-left:10px;padding:0 6px;border:1px solid color-mix(in srgb,var(--c,#9fe9ff) 45%,transparent);font:400 10.5px var(--serif);font-style:normal;letter-spacing:.2em;color:color-mix(in srgb,var(--c,#9fe9ff) 70%,#fff);vertical-align:2px}
.species-evo{display:grid;grid-template-columns:120px 1fr;gap:16px;align-items:center}
.species-evo-art{height:110px;display:grid;place-items:center;background:radial-gradient(ellipse at 50% 75%,color-mix(in srgb,var(--c,#9fe9ff) 16%,transparent),transparent 70%)}
.species-evo-art img{max-width:100%;max-height:100%;object-fit:contain;filter:brightness(0) drop-shadow(0 0 3px color-mix(in srgb,var(--c,#9fe9ff) 55%,transparent));opacity:.92}
.species-evo .species-line{font:700 16px var(--serif);letter-spacing:.3em;color:#9fb5b1}
.species-evo small{letter-spacing:normal;font-family:inherit;font-weight:400}
.species-evo small.species-evo-lore{margin-top:2px;font-style:italic;color:#7f948f}
.species-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:16px}
.species-actions .ghost-button{padding:0 18px}.species-actions .primary-button{width:auto;padding:0 26px}
.starter-card .stats{display:flex;align-items:baseline;gap:.4cqw;margin:.15cqw 0 0;font-size:max(10px,.75cqw);color:#cfe3dc;white-space:nowrap}
.starter-card .stats i{font-style:normal;color:var(--b-muted);margin-right:.3cqw}
.starter-card .more{margin-left:auto;padding-left:.6cqw;font-size:max(10px,.68cqw);letter-spacing:.1em;color:var(--b-muted)}
.starter-card{cursor:pointer}
.species-row{display:flex;gap:.8cqw;margin:.35cqw 0 0;font-size:max(10px,.75cqw);color:var(--b-muted);cursor:help}
.species-row b{font-weight:400;color:#cfe3dc}
/* The lean meter (攻 ←→ 守). */
.lean-meter{display:inline-flex;align-items:center;gap:.4em;margin-left:.6em;vertical-align:middle}
.lean-meter em{font-style:normal;font-size:.85em;color:var(--b-muted)}
.lean-track{position:relative;display:inline-block;width:5.5em;height:.45em;border-radius:1em;background:linear-gradient(90deg,#ff9a6b,#3a4a50 45%,#3a4a50 55%,#7ff5e4)}
.lean-track i{position:absolute;top:50%;width:.8em;height:.8em;translate:-50% -50%;rotate:45deg;background:#fff4d6;box-shadow:0 0 .4em #fff8}
.lean-track i.later{background:transparent;border:1px dashed #fff4d6;box-shadow:none}
.species-lean{display:flex;align-items:baseline;gap:12px;font-size:13px;color:#cfe3dc}
.species-lean strong{font:700 17px var(--serif);letter-spacing:.1em;color:#f6ecc9}
.species-lean .lean-meter{font-size:15px}
.species-line.later{color:var(--b-muted)}
.starter-card .stats{align-items:center}
/* A clash (docs/clash.md): one dimming layer under both bands. The cut-in already playing holds in place and moves
   aside; the one that answers slides in and stays until the race begins. */
.clash-dim{position:absolute;inset:0;z-index:7;pointer-events:none}
.clash-dim.play{animation:c-dim 1.3s ease forwards}
.arena.clashing .cutin{animation:none!important;background:transparent}
.cutin .cutin-band,.cutin .cutin-name{transition:top .35s cubic-bezier(.2,.8,.2,1)}
.cutin.hold .cutin-band{animation:none!important;translate:0 0}
.cutin.hold .cutin-name{animation:none!important;opacity:1;scale:1}
.cutin.hold .cutin-art{animation:none!important;translate:0 0}
.cutin.hold .cutin-glint{animation:none!important;translate:100% 0}
.arena.clashing .cutin.enter .cutin-band{animation:c-band-in .45s cubic-bezier(.2,.8,.2,1) forwards}
.arena.clashing .cutin.rival.enter .cutin-band{animation-name:c-band-in-rival}
.arena.clashing .cutin.enter .cutin-name{animation:c-name-in .5s cubic-bezier(.2,1.3,.4,1) .1s forwards}
@keyframes c-band-in{from{translate:-110% 0}to{translate:0 0}}
@keyframes c-band-in-rival{from{translate:110% 0}to{translate:0 0}}
@keyframes c-name-in{from{opacity:0;scale:1.9}to{opacity:1;scale:1}}
/* The typing race after a clash: both specials meet as beams between the fighters. Every word finished pushes the
   meeting point toward the other side; five marks on each side count the words. */
.duel{--you:#7ff5e4;--rival:#ff6b86;--push:50%;position:absolute;z-index:7;left:2%;right:2%;top:25%;pointer-events:none;animation:d-in .35s ease-out}
@keyframes d-in{from{opacity:0;scale:1 .4}}
.duel-call{margin:0 auto .6cqw;text-align:center}
.duel-call b{display:block;font:800 max(22px,2.6cqw)/1.1 var(--serif);letter-spacing:.35em;text-indent:.35em;color:#fff4cf;text-shadow:0 0 1.2cqw #f0c350,0 .2cqw .3cqw #000}
.duel-call span{display:inline-block;margin-top:.3cqw;padding:.15cqw 1cqw;font-size:max(11px,.85cqw);letter-spacing:.12em;color:#f1e8d0;background:#02070bcc;border:1px solid #f3d27f66}
.duel-field{display:grid;grid-template-columns:minmax(0,15%) 1fr minmax(0,15%);align-items:center;gap:1cqw}
.duel-side{display:flex;flex-direction:column;align-items:center;gap:.4cqw}
.duel-side b{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:700 max(12px,1cqw) var(--serif);letter-spacing:.08em;color:#f6ecc9;text-shadow:0 .15cqw .3cqw #000}
.duel-side.you b{color:color-mix(in srgb,var(--you) 60%,#fff)}.duel-side.rival b{color:color-mix(in srgb,var(--rival) 60%,#fff)}
.duel-pips{display:flex;gap:.35cqw}
.duel-pips i{width:max(10px,.95cqw);aspect-ratio:1;rotate:45deg;border:1px solid #ffffff55;background:#02070bcc;transition:background .15s,box-shadow .15s}
.duel-side.you .duel-pips i.lit{background:var(--you);box-shadow:0 0 .8cqw var(--you)}
.duel-side.rival .duel-pips i.lit{background:var(--rival);box-shadow:0 0 .8cqw var(--rival)}
.duel-pips i.pop{animation:d-pip .35s ease-out}
@keyframes d-pip{50%{scale:1.8}}
.duel-rope{position:relative;height:max(18px,2.2cqw)}
.duel-beam{position:absolute;top:0;bottom:0;border-radius:2cqw;transition:width .25s cubic-bezier(.2,.8,.2,1),left .25s cubic-bezier(.2,.8,.2,1);background-size:3cqw 100%;animation:d-flow .35s linear infinite}
.duel-beam.you{left:0;width:var(--push);background-image:linear-gradient(90deg,color-mix(in srgb,var(--you) 30%,transparent),var(--you)),repeating-linear-gradient(90deg,#ffffff00 0 1.5cqw,#ffffff55 1.5cqw 2cqw);box-shadow:0 0 1.5cqw var(--you)}
.duel-beam.rival{left:var(--push);right:0;background-image:linear-gradient(90deg,var(--rival),color-mix(in srgb,var(--rival) 30%,transparent)),repeating-linear-gradient(90deg,#ffffff00 0 1.5cqw,#ffffff55 1.5cqw 2cqw);box-shadow:0 0 1.5cqw var(--rival);animation-direction:reverse}
@keyframes d-flow{to{background-position:3cqw 0}}
.duel-core{position:absolute;top:50%;left:var(--push);width:max(34px,4.2cqw);aspect-ratio:1;translate:-50% -50%;border-radius:50%;background:radial-gradient(circle,#fff 0 22%,#fff4cf 32%,color-mix(in srgb,var(--you) 50%,var(--rival)) 55%,transparent 72%);filter:drop-shadow(0 0 1cqw #fff);transition:left .25s cubic-bezier(.2,.8,.2,1);animation:d-core .3s ease-in-out infinite alternate}
@keyframes d-core{to{scale:1.18}}
.duel.won-you .duel-beam.you,.duel.won-rival .duel-beam.rival{filter:brightness(1.8)}
.duel.leaving{animation:d-out .45s ease-in forwards}
@keyframes d-out{to{opacity:0;scale:1.15 .2}}
/* The confirmation window (src/confirm.mjs): an old gilt frame, OK on the right. */
.confirm-modal{padding:0;border:0;background:transparent;color:var(--b-text);width:min(460px,92vw);max-width:none;overflow:visible}
.confirm-modal::backdrop{background:#01040acc;backdrop-filter:blur(2px)}
.confirm-modal:focus{outline:none}
.confirm-frame{position:relative;padding:22px 28px 20px;text-align:center;background:radial-gradient(ellipse 70% 50% at 50% 0,#e8c46a1f,transparent 70%),linear-gradient(180deg,#0b1418,#05090c);border:1px solid #b89a52;box-shadow:inset 0 0 0 4px #05090c,inset 0 0 0 5px #b89a5255,0 30px 90px #000d;animation:rs-open .3s cubic-bezier(.2,.9,.3,1) both}
.confirm-art{display:grid;place-items:center;height:120px;margin:-4px 0 6px}
.confirm-art img{max-height:120px;max-width:70%;object-fit:contain;filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 8px 8px #000c)}
.confirm-art span{display:grid;place-items:center;width:64px;aspect-ratio:1;font-size:28px;color:#02080e;background:radial-gradient(circle at 35% 30%,#fff,var(--c) 50%,#02080e 130%);clip-path:polygon(50% 0,100% 50%,50% 100%,0 50%);filter:drop-shadow(0 0 12px var(--c))}
.confirm-kicker{margin:0;font:700 11px Georgia,serif;letter-spacing:.4em;color:#b8b58e}
.confirm-modal h2{margin:4px 0 6px;font:700 21px/1.45 var(--serif);letter-spacing:.08em;color:#f6ecc9}
.confirm-body{margin:0;font-size:12.5px;line-height:1.7;color:#cfd9d4;white-space:pre-line}
.confirm-actions{display:flex;justify-content:center;align-items:center;gap:22px;margin-top:16px}
.confirm-actions .rs-again{--accent:#e8c46a;--glow:#ffb43a;min-width:150px;padding:10px 24px;font-size:16px;letter-spacing:.3em;text-indent:.3em}
.confirm-actions .rs-again:focus-visible{outline:2px solid #fff4cf;outline-offset:3px}
/* Eye and mouth lights (src/glints.mjs, from monster-motion.html): only while standing idle. */
.glint{position:absolute;left:var(--x);top:var(--y);width:var(--w);height:var(--h);translate:-50% -50%;border-radius:50%;background:radial-gradient(ellipse,var(--accent),transparent 67%);mix-blend-mode:screen;opacity:.36;filter:blur(2px) hue-rotate(var(--hue,0deg));pointer-events:none;animation:eye-glint 3.7s ease-in-out infinite}
.glint.eye2{animation-delay:-1.8s;opacity:.23}.glint.mouth{animation-duration:5.2s;opacity:.2}
@keyframes eye-glint{0%,100%{opacity:.16;scale:.8}42%{opacity:.59;scale:1.08}54%{opacity:.24;scale:.9}}
.altar[data-pose]:not([data-pose="idle"]) .glint,.altar.locked .glint,.summon-altar.rise:not(.lit) .glint,.fighter-rig.action-pose .glint,.fighter.ko .glint{display:none}
/* A read-only stat table (the contract detail): the same gauge, effect and points as the growth rows. */
.stat-table{display:grid;gap:6px}
.stat-line{--c:#ff9a6b;display:grid;grid-template-columns:18px 4.2em minmax(0,1fr) 7.5em 2em;align-items:center;gap:8px;font-size:13px;cursor:help}
.stat-line[data-skill="guard"]{--c:#7ff5e4}.stat-line[data-skill="dex"]{--c:#9fc9ff}.stat-line[data-skill="mystic"]{--c:#d3b4ff}
.stat-line b{letter-spacing:.12em;color:var(--c)}
.stat-line .stat-bar{margin:0;height:7px}
.stat-line em{font:normal 12px var(--serif);color:#f1e8d0;text-align:right;white-space:nowrap}
.stat-line strong{font:16px Georgia,serif;color:#f6ecc9;text-align:right}
/* Pictures from Codex (docs/asset-requests.md): items, runes, rank emblems, the currency and the keeper. */
.purse-icon{width:1.25em;height:1.25em;object-fit:contain;vertical-align:-.25em;filter:drop-shadow(0 0 .3em #b98cff88)}
.rune-gem .gem-art{position:relative;width:100%;height:100%;object-fit:contain}
.rune-gem:has(.gem-art):before{display:none}
.rune-gem:has(.gem-art){filter:drop-shadow(0 0 .25cqw var(--g)) drop-shadow(0 0 .7cqw var(--g)) drop-shadow(0 .2cqw .2cqw #000a)}
.item-icon{display:block;width:max(44px,3.6cqw);height:max(44px,3.6cqw);object-fit:contain;margin:.1cqw 0 .4cqw;filter:drop-shadow(0 .3cqw .3cqw #000c)}
img.item-glyph,img.stone-glyph{background:none;clip-path:none;object-fit:contain}
img.item-glyph{width:max(34px,2.8cqw);height:max(34px,2.8cqw)}
img.stone-glyph{width:max(30px,2.4cqw);height:max(30px,2.4cqw)}
.hand img{width:max(26px,2cqw);height:max(26px,2cqw);object-fit:contain;filter:drop-shadow(0 0 .4cqw #000)}
.shop-stock dt{display:flex;align-items:center;gap:.3cqw}
.shop-stock dt img{width:max(16px,1.2cqw);height:max(16px,1.2cqw);object-fit:contain}
.drop-chip img{width:22px;height:22px;object-fit:contain}
.confirm-art img[src*="/items/"],.confirm-art img[src*="/runes/"]{max-height:96px}
img.sigil{object-fit:contain;filter:drop-shadow(0 0 .4em color-mix(in srgb,var(--rank,#7fd6c8) 50%,transparent))}
.rs-sigil img.sigil{width:100%;height:100%}
.gate-tag img{width:max(16px,1.3cqw);height:max(16px,1.3cqw);object-fit:contain}
/* The keeper only blinks: the blinking picture lines up with the idle one and lies over it for a moment. */
.keeper-blink-art{opacity:0}
.shop-keeper.blinking .keeper-blink-art{opacity:1}
@media(prefers-reduced-motion:reduce){.sanctum *{animation:none!important}.altar-particles{display:none}}

/* Compact screens use readable panels and their own scrolling regions instead of shrinking the desktop columns. */
@media(max-width:900px){
  .sanctum,body[data-input="flick"] .sanctum{width:100vw;height:100dvh;aspect-ratio:auto}
  .sanctum-top,body[data-input="flick"] .sanctum-top{top:max(8px,env(safe-area-inset-top));left:12px;right:12px;grid-template-columns:minmax(0,1fr) auto;gap:6px}
  .sanctum-top>.input-mode-control{grid-row:2;grid-column:1/-1;justify-self:start}
  .top-actions{gap:5px}.top-actions .arena-icon{width:36px;height:36px}.top-left{min-width:0;gap:4px}.screen-title{font-size:18px;white-space:nowrap}
  .input-mode-control select{min-height:36px}.back-home{font-size:12px;padding:6px;min-height:36px}
  .toast{top:90px;max-width:calc(100% - 24px);white-space:normal;text-align:center;font-size:12px;pointer-events:none}
  .starter-head{top:var(--compact-head)}.starter-cards{left:12px;right:12px;bottom:62px;gap:10px}
  .starter-card{grid-template-columns:1fr;padding:10px;gap:10px}.starter-card b{font-size:15px;white-space:normal;line-height:1.5}
  .starter-card .stars{display:block}.starter-card .stats{flex-wrap:wrap;gap:4px;font-size:12px}.starter-card .more{padding:0;font-size:11px}
  .starter-card .ghost-button{width:100%;min-height:44px}.starter-altar{top:calc(100% - 225px)}
  .starter-actions{bottom:12px}.starter-actions button{min-height:44px}
  .front-view,body[data-input="flick"] .front-view{padding:var(--compact-head) 14px 14px;overflow-y:auto}
  .front-title{flex-shrink:0;margin-bottom:14px}.front-title h1{font-size:26px;letter-spacing:.15em}.front-links{display:grid;width:100%;grid-template-columns:repeat(6,minmax(0,1fr));flex-shrink:0;gap:8px;justify-content:center;margin-top:12px}.front-links button{grid-column:span 2;min-width:0;min-height:42px;padding:8px 7px;justify-content:center;letter-spacing:.04em}.front-links #front-story,.front-links #front-learning{grid-column:span 3;justify-content:flex-start;gap:9px;padding-left:12px}.front-link-copy{flex-direction:column;align-items:flex-start;gap:2px}.front-link-copy small{font-size:10px}
  .gates,body[data-input="flick"] .gates{grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(2,minmax(130px,1fr));gap:12px}.front-main{min-height:280px}
  .gate-text{padding:12px}.gate-text b,body[data-input="flick"] .gate-text b{font-size:20px}.gate-arena .gate-text b{font-size:19px;letter-spacing:.03em}
  .stele-view{padding:var(--compact-head) 12px 16px;overflow:auto}.stele-head{margin-bottom:16px}.stele-me{grid-template-columns:auto 22px minmax(0,1fr) auto;gap:8px;padding:10px}.stele-me .me-place{display:none}.stele-me img.sigil{width:22px;height:22px}
  .stele-rows{display:flex;flex-direction:column}.stele-rows li{flex-shrink:0;min-height:40px;grid-template-columns:32px 22px minmax(0,1fr) 48px;gap:8px;padding:4px 8px}.stele-rows img.sigil{width:22px;height:22px}.stele-rows .who{gap:8px}.stele-rows .name{font-size:14px}
  .story-head{top:var(--compact-head);flex-wrap:wrap;gap:10px}.story-online{align-items:start}.story-match-toggle{min-height:36px;padding:6px;font-size:12px}
  .story-copy{padding:20px 16px 50px;max-height:46%;overflow:auto;min-height:150px}.story-dialogue-box p{font-size:17px;line-height:1.8;max-width:100%}.story-next{min-height:38px}
  .story-stage{inset:160px 0 25%}.story-world-panel{left:4%;top:155px;max-width:65%;padding:10px}.story-route-detail{width:52%;right:3%;padding:12px}.story-route-help{font-size:11px;max-width:40%}
  .result-modal{overflow-y:auto;max-height:94dvh}.rs-actions{flex-wrap:wrap;gap:12px}.modal{max-width:calc(100vw - 24px);max-height:92dvh;overflow-y:auto}.confirm-actions{flex-wrap:wrap}
}
@media(max-width:600px), (max-width:900px) and (orientation:portrait){
  .title-logo h1{font-size:25px;letter-spacing:.14em}.title-logo p{letter-spacing:.3em}.title-menu{gap:10px;margin-top:30px}.title-press{bottom:40px;font-size:10px}.title-input-note{max-width:300px}
  .companion-panel{left:12px;right:12px;width:auto;top:260px;bottom:12px;padding:14px;gap:8px}
  #altar{left:50%;top:245px}#altar .altar-rig{height:min(var(--h),150px)}.evolve-prompt{left:auto;right:12px;top:185px;translate:none;padding:8px}
  .companion-panel .name-row h2{font-size:22px}.companion-panel .name-row h2 small{font-size:14px}.companion-panel .trait-line{font-size:14px}.companion-panel .trait-line small{font-size:12px;line-height:1.6}
  .skill-row{grid-template-columns:24px minmax(0,1fr) 34px 28px 34px;min-height:50px;gap:6px;padding:8px}.skill-row button{width:34px;height:34px}.skill-row-name b{font-size:14px}.build-foot{gap:10px;margin:10px 0}.build-foot button{min-height:42px}.rune-slots{gap:8px}.records{padding-top:12px;margin-top:14px}
  .codex-view{position:absolute;inset:var(--compact-head) 12px 12px;display:flex;flex-direction:column;gap:14px;overflow-y:auto;overscroll-behavior:contain}
  .codex-view:before,.codex-ring{display:none}.codex-list{position:relative;left:auto;top:auto;bottom:auto;width:auto;height:230px;flex-shrink:0;padding:12px;order:1}.codex-filter button{min-height:36px}.codex-grid{grid-template-columns:repeat(5,minmax(0,1fr));gap:6px}.codex-cell{padding:5px}.codex-cell img{height:40px}.codex-cell span{font-size:11px}
  .codex-altar{position:relative;left:auto;top:auto;width:100%;height:175px;flex-shrink:0;order:2}.codex-altar .altar-body{left:50%;top:100%}.codex-altar .altar-rig{height:min(var(--h),170px)}.codex-altar .altar-floor,.codex-altar .altar-halo{left:50%;top:100%}
  .codex-pose-label{position:relative;left:auto;top:auto;text-align:center;order:3}.codex-info{position:relative;right:auto;top:auto;width:auto;padding:14px;order:4;flex-shrink:0}.codex-info h2{font-size:24px}.codex-desc{font-size:14px;line-height:1.8}.codex-data div{font-size:14px;padding:6px 0}.codex-poses button{min-height:40px}
  .shop-keeper{display:none}.shop-main{left:12px;right:12px;top:var(--compact-head);bottom:12px;gap:12px}.shop-main .shop-panel{display:grid;grid-template-columns:minmax(0,1fr) auto;padding:12px;gap:12px}.shop-panel .shop-tabs{grid-column:1/-1}.shop-tabs{gap:6px}.shop-tabs button{min-height:40px;padding:6px;font-size:14px}.shop-stock{gap:4px 10px}.shop-stock div{font-size:12px}.shop-panel #shop-bag{min-height:40px}
  .shop-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.shop-card{padding:12px;gap:8px}.shop-card b{font-size:16px;line-height:1.5}.shop-card p{font-size:13px;line-height:1.7}.shop-actions{grid-template-columns:1fr;gap:6px}.shop-actions button{min-height:42px;height:auto;padding:8px}.shop-ally{height:110px}
  .bag-view{inset:var(--compact-head) 12px 12px;overflow-y:auto;display:flex;flex-direction:column;gap:14px;overscroll-behavior:contain}.bag-view:before{display:none}.bag-list{position:relative;left:auto;top:auto;bottom:auto;width:auto;height:240px;flex-shrink:0;padding:12px}.bag-grid{gap:8px}.bag-empty{font-size:14px;padding:24px}.bag-empty button{min-height:42px;padding:8px}.item-row{padding:10px;gap:8px}.item-actions button{min-height:40px;height:auto;padding:8px}.rune-cell .rune-gem{width:45px}
  .forge{position:relative;left:auto;right:auto;top:auto;bottom:auto;min-height:270px;flex-shrink:0}.forge-rate{width:70px}.forge-core{flex:none;height:130px}.forge-stones{width:100%;gap:6px;justify-content:center}.stone-slot{flex:1;min-width:0;padding:8px;grid-template-columns:1fr;gap:4px}.stone-slot small{font-size:11px;white-space:normal}.stone-glyph{grid-row:auto;width:26px}.forge-hint{font-size:12px}.rune-info{position:relative;right:auto;top:auto;bottom:auto;width:auto;padding:14px;flex-shrink:0}.rune-info[data-empty="true"]{display:none}.bag-view:has(.rune-info[data-empty="true"]) .forge{display:none}
  .summon-panel{top:var(--compact-head);left:12px;right:12px;width:auto;padding:14px;max-height:50%;overflow:auto}.summon-button{min-height:46px;font-size:18px;white-space:nowrap}.summon-rates{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px}.summon-rates div{flex-direction:column;gap:4px;font-size:12px}.summon-rates .stars{display:block}.summon-pity{font-size:12px;line-height:1.6}.summon-result{left:12px;right:12px;bottom:12px;width:auto;padding:14px}.summon-result h3{font-size:22px}.summon-actions button{min-height:42px}.summon-altar:not(.starter-altar){top:76%}.summon-altar:not(.starter-altar) .altar-rig{height:min(var(--h),230px)}
  .starter-card{padding:8px;gap:8px}.starter-card b{font-size:14px}.starter-card .stats{font-size:11px}.starter-card .more{margin:0;width:100%}.starter-altar .altar-rig{height:min(var(--h),130px)}
}
@media(min-width:601px) and (max-width:900px) and (orientation:landscape){
  .title-menu{gap:6px;margin-top:14px}.title-logo h1{font-size:30px}.title-logo p{font-size:12px}.title-note{display:none}.title-press{bottom:20px}.title-links button{min-height:32px}.title-input-note{margin:0;font-size:11px}
  .companion-panel,.codex-list,.codex-info,.shop-main,.bag-list,.forge,.rune-info{top:var(--compact-head);bottom:12px}.companion-panel{width:43%;padding:12px}#altar{left:75%;top:75%}.codex-list{width:38%;padding:12px}.codex-info{width:33%;overflow:auto;padding:12px}.codex-altar{left:56%;top:85%}.codex-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:5px}.codex-cell img{height:44px}.codex-poses{grid-template-columns:repeat(2,1fr)}
  .shop-main{left:26%}.shop-panel .shop-stock{display:none}.shop-panel .shop-tabs{flex:1}.shop-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.shop-card{padding:12px}.shop-actions{grid-template-columns:1fr}.shop-actions button{min-height:36px;height:auto;padding:6px}
  .bag-list{width:32%;padding:12px}.forge{left:36%;right:30%}.rune-info{width:27%;padding:12px;overflow:auto}.bag-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.summon-panel{top:var(--compact-head);width:33%;max-height:calc(100% - var(--compact-head) - 12px);overflow:auto;padding:12px}.starter-head{top:var(--compact-head)}.starter-head h2{font-size:24px}.starter-kicker{display:none}.starter-altar{top:calc(100% - 210px)}
}
@media(max-width:600px) and (max-height:550px){.companion-panel{top:var(--compact-head);width:auto}.sanctum[data-view="home"] #altar,.sanctum[data-view="home"] .evolve-prompt{display:none}}

/* Keep controls reachable with a full collection and a short viewport. */
@media(max-width:900px){
  .sanctum{--compact-head:calc(112px + env(safe-area-inset-top))}
  .top-actions .purse{position:absolute;right:0;top:50px;min-height:44px;align-items:center;padding:5px 10px}
  .top-actions .arena-icon,body[data-input="flick"] .top-actions .arena-icon{width:44px;height:44px}
  .back-home,.input-mode-control select{min-height:44px}.back-home{flex-shrink:0}.top-left{gap:6px}.screen-title{font-size:18px}
  .front-title h1{font-size:clamp(20px,4.6vw,26px)}
  .modal-close{width:44px;height:44px;right:8px;top:8px;padding:0;line-height:1}
  .modal h2{padding-right:20px}.small-modal h2{padding-right:0}
  .modal .text-button,.modal .ghost-button,.confirm-actions .rs-link{min-height:44px;padding:10px}
  .modal .account-form input{min-width:0;width:100%;min-height:44px;font-size:16px}
  .account-code{padding:12px}.account-code strong{font-size:clamp(17px,5vw,26px);letter-spacing:.06em;overflow-wrap:anywhere}
  .account-code button{height:auto;white-space:normal;min-height:44px}
  .roster-modal h2 small{display:inline-block}.roster-grid{grid-template-columns:repeat(auto-fill,minmax(120px,1fr))}.roster-card img{width:100%;max-width:110px}
  .skill-row{grid-template-columns:18px minmax(0,1fr) 44px 24px 44px;gap:5px;min-height:58px}.skill-row button{width:44px;height:44px;flex-shrink:0}.skill-row-top{flex-wrap:wrap;gap:0}.skill-row-top .skill-effect{overflow:visible;font-size:10px;line-height:1.4}.skill-row-name b{font-size:13px}
  .roster-text-button{min-height:44px;padding:6px}#rune-forge-link{min-height:44px;padding:8px}.rune-slot{min-height:44px}.variant-chip{width:36px;min-height:36px}.variant-row{gap:10px;flex-wrap:wrap}
  .rs-actions .rs-link{min-height:44px;padding:10px}.codex-filter button,.codex-poses button,.shop-tabs button,.shop-actions button,.item-actions button{min-height:44px;height:auto}
  .sanctum[data-view="starter"] .toast{top:calc(var(--compact-head) + 84px)}
  .rune-actions button{min-height:44px;padding:8px;white-space:normal;height:auto}.bag-tabs button{min-height:44px}
  .bag-grid:not([data-tab="item"]){grid-template-columns:repeat(auto-fill,minmax(60px,1fr))}.rune-cell .rune-gem{width:min(75%,60px)}
  .forge{overflow-y:auto;overscroll-behavior:contain;gap:8px;padding-bottom:8px}
  .forge-rate{flex-shrink:0;width:70px}.forge-core{flex:none;height:160px;min-height:160px}.forge-stones{flex-shrink:0;max-width:100%;gap:6px}.stone-slot{min-height:60px;min-width:0;padding:6px}.stone-slot small{white-space:normal}.forge-hint{flex-shrink:0;padding:0 8px;margin:0;text-align:center;line-height:1.7}.forge-anvil{flex-shrink:0}
  .story-party-button{min-height:44px;padding:6px 10px}.story-match-toggle{min-height:44px}.story-head>div:first-child{display:flex;flex-wrap:wrap;align-items:center;gap:6px}.story-head #story-chapter{width:100%;margin:0}
  .story-copy{overflow:visible;display:flex;flex-direction:column;min-height:160px;padding:14px 16px 12px;gap:8px}.story-dialogue-box{overflow-y:auto;min-height:0;flex:1}.story-dialogue-box p{margin:12px 0 0}.story-dialogue-box strong{top:-14px;left:16px}.story-copy h2{top:-20px;font-size:12px}.story-next,.story-next:not(.is-transition){position:static;align-self:flex-end;flex-shrink:0;min-height:44px;padding:8px 14px}
}
@media(max-width:600px), (max-width:900px) and (orientation:portrait){
  .species-top{grid-template-columns:1fr;gap:12px}.species-head{min-width:0}.species-head h2{font-size:24px;padding-right:0}.species-head .eyebrow{flex-wrap:wrap;letter-spacing:.1em;margin-bottom:8px}.species-desc{font-size:14px;line-height:1.8}.species-art{height:150px}.species-evo{grid-template-columns:90px minmax(0,1fr);gap:10px}.species-actions{flex-wrap:wrap;gap:10px}.species-actions button{flex:1;min-height:44px}
  .bag-list{order:1}.rune-info{order:2}.forge{order:3;overflow:visible;min-height:340px}
  .rune-info h2{font-size:21px}.rune-actions{grid-template-columns:1fr 1fr;gap:10px}.rune-actions button{font-size:14px}
  .codex-cell img{height:clamp(40px,10vw,68px)}
  .story-head{left:12px;right:12px}.story-online{width:100%}.story-search-status:empty{display:none}
  .story-view[data-world="true"] .story-head{position:relative;top:auto;left:auto;right:auto;margin:var(--compact-head) 12px 0}
  .story-view[data-world="true"]{overflow-y:auto;display:flex;flex-direction:column;gap:12px;overscroll-behavior:contain}
  .story-world{position:relative;inset:auto;order:2;overflow:visible;flex-shrink:0;display:flex;flex-direction:column;padding:0 12px 16px;gap:12px}
  .story-map-scroll{position:relative;inset:auto;overflow-x:auto;overflow-y:hidden;order:2;overscroll-behavior:contain;border:1px solid var(--b-line)}
  .story-map-stage{position:relative;inset:auto;width:100%;min-width:560px;height:auto;aspect-ratio:16/9;background:#06121a}
  .story-world-panel{position:relative;left:auto;top:auto;max-width:none;order:1;padding:12px}.story-world-panel h2{font-size:22px}.story-world-panel p{font-size:14px}
  .story-route-detail{position:relative;right:auto;bottom:auto;width:auto;order:3;padding:14px}.story-route-detail p{font-size:14px}.story-route-help{position:relative;left:auto;bottom:auto;max-width:none;order:4;margin:0;font-size:12px}
  .route-node{width:44px;height:44px;min-width:44px;min-height:44px}.route-node span{width:60px;font-size:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.5}.route-node small{top:calc(100% + 18px);font-size:9px}.story-route-marker{min-width:75px;min-height:60px;max-width:90px;max-height:72px}
  .story-world:after{display:none}
}
body[data-input="flick"] .arena{--pad-height:clamp(286px,36dvh,420px)}
body[data-input="flick"] .flick-pad{height:var(--pad-height)}
body[data-input="flick"] .arena-scene{bottom:calc(var(--pad-height) + 16px)}
body[data-input="flick"] .rune-panel{bottom:calc(var(--pad-height) + 20px)}
body[data-input="flick"] .combo-dock{left:3%;right:3%;width:auto;bottom:calc(var(--pad-height) + 150px);display:flex;gap:12px;align-items:center;justify-content:space-between;padding:4px 8px;white-space:nowrap}
body[data-input="flick"] .combo-count{display:flex;align-items:baseline;gap:4px}body[data-input="flick"] .combo-count strong{font-size:20px}body[data-input="flick"] .combo-count span{font-size:11px}
body[data-input="flick"] .combo-dock .combo-step,body[data-input="flick"] .combo-dock .ward{display:none}body[data-input="flick"] .combo-dock .accuracy{border:0;margin:0;padding:0;font-size:11px}
body[data-input="flick"] .flick-modifier{min-height:44px;width:44px}body[data-input="flick"] #flick-skill{min-height:44px}
@media(max-height:650px) and (orientation:portrait){
  body[data-input="flick"] .battle-hud{grid-template-columns:minmax(0,1fr) 76px minmax(0,1fr)}
  body[data-input="flick"] .side-tag{display:none}body[data-input="flick"] .clock{width:44px}body[data-input="flick"] .clock-col{gap:2px}
  body[data-input="flick"] .seek-tag{font-size:8px;padding:0}body[data-input="flick"] .seek-tag:before{display:none}
  body[data-input="flick"] .combo-dock{bottom:calc(var(--pad-height) + 145px)}
  body[data-input="flick"] .rune-panel{padding:8px 10px}body[data-input="flick"] .rune-panel h2{font-size:22px;letter-spacing:.05em}
  body[data-input="flick"] .word-guide{font-size:20px;letter-spacing:.04em}
}
@media(max-height:550px) and (orientation:landscape){
  .forge{gap:4px}.forge-rate{width:56px}.forge-core{height:130px;min-height:130px}.forge-gem{width:80px}.forge-plus{top:calc(50% + 44px);font-size:18px}.forge-stones{margin-top:0}.stone-slot{min-height:44px;padding:4px;column-gap:4px}.stone-glyph{width:22px}.stone-slot small{font-size:10px}.forge-hint{font-size:10px}
  .sanctum .starter-view{overflow-y:auto;overscroll-behavior:contain;padding-bottom:12px}
  .sanctum .starter-head{position:relative;top:auto;margin:var(--compact-head,60px) 12px 0}.sanctum .starter-cards{position:relative;left:auto;right:auto;bottom:auto;margin:155px 12px 0}.sanctum .starter-actions{position:relative;left:auto;right:auto;bottom:auto;margin:12px 0 0;justify-content:center}.sanctum .starter-altar{top:calc(var(--compact-head,60px) + 220px)}.sanctum .starter-altar .altar-rig{height:min(var(--h),110px)}
  body[data-input="flick"] .flick-pad{height:90%}body[data-input="flick"] .arena-scene{bottom:0}body[data-input="flick"] .rune-panel{bottom:8%}body[data-input="flick"] .combo-dock{left:2%;right:52%;bottom:45%}
}

/* The battle lab (index.html?lab, src/battle-lab.mjs): the battle screen shares the window with a control panel. */
body.battle-lab .battle-screen{right:300px}
body.battle-lab .arena{width:min(calc(100vw - 300px),177.78vh)}
.battle-lab-panel{position:fixed;top:0;right:0;bottom:0;z-index:30;width:300px;overflow:auto;padding:14px 14px 20px;background:linear-gradient(#08141b,#040a0f);border-left:1px solid #3b5456;color:#e9e8d8;font:13px "Yu Gothic UI","Meiryo",sans-serif}
.battle-lab-panel header{display:flex;align-items:baseline;justify-content:space-between}
.battle-lab-panel header b{font:600 17px "Yu Mincho",Georgia,serif;letter-spacing:.14em;color:#f6ecc9}
.battle-lab-panel header small{font:700 10px Georgia,serif;letter-spacing:.3em;color:#c9be91}
.lab-note{margin:6px 0 10px;font-size:11px;line-height:1.6;color:#8fa7a1}
.lab-pick{display:grid;gap:6px}
.lab-pick label{display:grid;grid-template-columns:5.5em 1fr;align-items:center;gap:6px;font-size:12px;color:#9fb5b1}
.lab-pick select{width:100%;padding:5px 6px;background:#050e14;color:#e9e8d8;border:1px solid #3b5456;font:inherit;font-size:12.5px}
.lab-row,.lab-toggles{display:flex;gap:6px}
.lab-row .lab-btn,.lab-toggles .lab-btn{flex:1}
.lab-btn{display:flex;align-items:center;justify-content:center;gap:6px;padding:7px 8px;border:1px solid #3b5456;background:#0e2530;color:#e9e8d8;cursor:pointer;font:inherit;font-size:12.5px}
.lab-btn:hover{border-color:#e8d49a}.lab-btn[aria-pressed="true"]{border-color:#e8d49a;background:#2a2410;color:#ffe9b0}
.lab-btn.foe{background:#26121a;border-color:#5a3440}
.lab-btn kbd{min-width:16px;padding:0 3px;border:1px solid #58706f;border-bottom-width:2px;font:10.5px Georgia,serif;color:#cfe3dc}
.lab-acts{display:grid;grid-template-columns:1fr 1fr;gap:6px;margin:12px 0 6px}
.lab-acts .lab-btn:nth-child(5){grid-column:1/-1}
.lab-toggles{margin-bottom:6px}
.lab-speed{display:flex;align-items:center;gap:6px;margin-bottom:10px;font-size:12px;color:#9fb5b1}.lab-speed .lab-btn{flex:1;padding:5px}
.lab-cards{display:grid;gap:8px}
.lab-card{padding:10px 11px;border:1px solid #2c4446;background:#081319}.lab-card.foe{border-color:#4a2c36;background:#140a0e}
.lab-card h3{margin:2px 0 0;font:600 16px "Yu Mincho",Georgia,serif;letter-spacing:.06em;color:#f6ecc9}
.lab-card-kicker{margin:0;font-size:10.5px;letter-spacing:.12em;color:#e8d49a}.lab-card-sub{margin:0 0 6px;font-size:11px;color:#9fb5b1}
.lab-line{display:grid;grid-template-columns:4.6em 1fr;gap:1px 6px;margin-top:5px;font-size:11.5px;line-height:1.5}
.lab-line span{grid-row:span 2;color:#8fa7a1}.lab-line b{font-weight:600;color:#e9e8d8}.lab-line small{color:#8fa7a1;font-size:10.5px}
.lab-links{display:flex;gap:12px;margin-top:12px;font-size:12px}.lab-links a{color:#d5ddc9}

.lab-notes{margin:4px 0 12px;padding:10px 10px 8px;border:1px solid #3b5456;background:#061017}
.lab-notes h4{margin:0 0 6px;font:600 14px "Yu Mincho",Georgia,serif;letter-spacing:.2em;color:#e8d49a}
.lab-note-target,.lab-topics{display:flex;flex-wrap:wrap;gap:4px;margin-bottom:6px}
.lab-chip{padding:3px 7px;border:1px solid #3b5456;background:#0b1c24;color:#cfe3dc;font:inherit;font-size:11px;cursor:pointer;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.lab-chip[aria-pressed="true"]{border-color:#e8d49a;background:#2a2410;color:#ffe9b0}.lab-chip.small{padding:0 5px;font-size:10px;cursor:default}
.lab-note-text{width:100%;box-sizing:border-box;padding:6px 7px;background:#030a0e;color:#e9e8d8;border:1px solid #3b5456;font:inherit;font-size:12px;line-height:1.5;resize:vertical}
.lab-note-send{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:6px}
.lab-btn.gold{border-color:#e8d49a;background:linear-gradient(#ffe7a0,#d9a441);color:#2a1a02;font-weight:700}
.lab-note-status{font-size:11px;color:#8fa7a1}
.lab-note-all{display:flex;align-items:center;gap:6px;margin:8px 0 4px;font-size:11px;color:#8fa7a1}
.lab-note-list{display:grid;gap:6px;max-height:320px;overflow:auto}
.lab-note-item{padding:7px 8px;border:1px solid #2c4446;background:#081319;font-size:11.5px;line-height:1.55}
.lab-note-item header{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px}.lab-note-item header b{font-weight:600;color:#f3ead0}
.lab-note-item time{font:10px Georgia,serif;color:#80979a}.lab-note-state{margin-left:auto;font-size:10px;color:#ffb3a3}
.lab-note-item.done{opacity:.72}.lab-note-item.done .lab-note-state{color:#9dffc9}
.lab-note-item p{margin:4px 0 0;white-space:pre-wrap;color:#e9e8d8}.lab-note-item .lab-note-reply{color:#9dffc9}
.lab-note-empty{margin:4px 0;font-size:11px;color:#80979a}
.lab-link{margin-top:4px;padding:0;border:0;background:none;color:#8fa7a1;font:inherit;font-size:10.5px;text-decoration:underline;cursor:pointer}
.lab-ask{padding:16px 18px;border:1px solid #e8d49a;background:#0b1418;color:#e9e8d8;font:13px "Yu Gothic UI","Meiryo",sans-serif}.lab-ask::backdrop{background:#000a}.lab-ask p{margin:0 0 8px}

/* The barrier (帳) round a fighter while a shield or a ward is up: a pale bubble of light that thins as it is used,
   shudders on a hit, and is gone when spent. A ward alone is a fainter shell with a pip for each hit it will soften. */
.fighter-barrier{position:absolute;left:50%;top:52%;z-index:2;width:max(118%,calc(var(--h) * .78));aspect-ratio:1/1.08;translate:-50% -50%;border-radius:50%;pointer-events:none;opacity:0;scale:.9;transition:opacity .35s,scale .35s;
  background:radial-gradient(ellipse at 50% 55%,transparent 52%,color-mix(in srgb,var(--fx,#9fe9ff) 16%,transparent) 66%,color-mix(in srgb,var(--fx,#9fe9ff) 48%,transparent) 71%,transparent 74%),
    repeating-conic-gradient(from 0deg,color-mix(in srgb,var(--fx,#9fe9ff) 12%,transparent) 0 3deg,transparent 3deg 15deg);
  -webkit-mask-image:radial-gradient(ellipse,#000 58%,transparent 74%);mask-image:radial-gradient(ellipse,#000 58%,transparent 74%);
  box-shadow:0 0 1.2cqw color-mix(in srgb,var(--fx,#9fe9ff) 30%,transparent) inset;animation:barrier-turn 9s linear infinite}
.fighter.shielded .fighter-barrier{opacity:calc(.35 + var(--left,1) * .65);scale:1}
.fighter.warded:not(.shielded) .fighter-barrier{opacity:.5;scale:.96;filter:saturate(.6) brightness(1.2)}
.fighter-barrier.hit{animation:barrier-turn 9s linear infinite,barrier-hit .32s ease-out}
.fighter-barrier b{position:absolute;left:50%;bottom:6%;translate:-50% 0;display:flex;gap:.3cqw}
.fighter-barrier b i{width:.55cqw;height:.55cqw;min-width:5px;min-height:5px;rotate:45deg;background:var(--fx,#9fe9ff);box-shadow:0 0 .5cqw var(--fx,#9fe9ff)}
@keyframes barrier-turn{to{rotate:360deg}}
@keyframes barrier-hit{0%{filter:brightness(2.4)}30%{scale:1.06}100%{filter:none;scale:1}}

/* ----- Online matches (docs/online.md) ----- */
/* The opponent's tag: a person's rank and name. */
.cpu-tag.person{display:inline-flex;align-items:center;gap:.3cqw;max-width:14cqw;overflow:hidden;text-overflow:ellipsis;letter-spacing:.06em;font-family:var(--serif)}
.cpu-tag.person .sigil{width:max(13px,1.1cqw);height:auto;filter:drop-shadow(0 0 .3cqw var(--rank))}
/* Practice goes on looking for a person: a small pulsing tag. */
.seek-tag{align-self:center;white-space:nowrap;font-size:max(10px,.72cqw);font-weight:700;letter-spacing:.12em;color:#9fe9ff;padding:.1cqw .45cqw;line-height:1.6;background:#030d14bb;border-radius:3px;animation:seek-pulse 1.6s ease-in-out infinite}
.seek-tag::before{content:"";display:inline-block;width:.45cqw;height:.45cqw;min-width:5px;min-height:5px;margin-right:.35cqw;border-radius:50%;background:currentColor;box-shadow:0 0 .6cqw currentColor;vertical-align:middle}
@keyframes seek-pulse{50%{opacity:.45}}
/* The opponent's connection dropped for a moment. */
.cpu-plate.waiting .hp-bar,.cpu-plate.waiting .plate-gauge,.cpu-plate.waiting strong{filter:saturate(.3) brightness(.7)}
.cpu-plate.waiting .plate-name::after{content:"通信待ち";align-self:center;font-size:max(10px,.72cqw);letter-spacing:.12em;color:#ffd77a;animation:seek-pulse 1s ease-in-out infinite}
/* 乱入: the challenger cuts into the practice match. */
.intrude{position:absolute;inset:0;z-index:12;overflow:hidden;pointer-events:none}
.intrude-dark{position:absolute;inset:0;background:radial-gradient(ellipse at 60% 50%,#3a0a14d9,#020407f2 70%);opacity:0}
.intrude-art{position:absolute;right:6%;bottom:8%;height:74%;max-width:46%;object-fit:contain;scale:var(--flip,1) 1;filter:hue-rotate(var(--hue,0deg)) brightness(0) drop-shadow(0 0 2cqw #ff3b5c);opacity:0}
.intrude-band{position:absolute;left:-10%;right:-10%;top:30%;height:30%;rotate:-6deg;display:flex;flex-direction:column;align-items:center;justify-content:center;
  background:linear-gradient(90deg,#1a0208f2,#5b0d1cf2 30%,#7a1424f2 50%,#5b0d1cf2 70%,#1a0208f2);border-block:.35cqw solid #f3d27f;box-shadow:0 0 4cqw #000,0 0 3cqw #ff3b5c80;translate:-120% 0}
.intrude-kicker{margin:0;font:700 max(11px,1.1cqw)/1.2 Georgia,serif;letter-spacing:.5em;color:#f3d27f}
.intrude-title{font:900 11cqw/1 var(--serif);letter-spacing:.3em;margin-right:-.3em;color:#fff4cf;text-shadow:0 0 2cqw #ff3b5c,0 0 5cqw #ff6a4d,0 .5cqw .8cqw #000}
.intrude-who{position:absolute;left:0;right:0;top:66%;margin:0;display:flex;align-items:center;justify-content:center;gap:1cqw;opacity:0}
.intrude-who strong{font:800 3.4cqw/1.2 var(--serif);letter-spacing:.12em;color:#fff4cf;text-shadow:0 0 1.4cqw #ff3b5c,0 .3cqw .5cqw #000}
.intrude-who em{font:600 max(13px,1.4cqw)/1.2 var(--serif);font-style:normal;letter-spacing:.1em;color:var(--b-gold)}
.intrude-who .sigil{width:3.4cqw;height:auto;filter:drop-shadow(0 0 .8cqw var(--rank))}
.intrude.play .intrude-dark{animation:intr-dark 2.4s ease forwards}
.intrude.play .intrude-band{animation:intr-band 2.4s cubic-bezier(.2,.9,.2,1) forwards}
.intrude.play .intrude-art{animation:intr-art 2.4s ease-out forwards}
.intrude.play .intrude-who{animation:intr-who 2.4s ease forwards}
@keyframes intr-dark{0%{opacity:0}8%{opacity:1}88%{opacity:1}100%{opacity:0}}
@keyframes intr-band{0%,4%{translate:-120% 0}16%{translate:0 0}84%{translate:0 0;opacity:1}100%{translate:30% 0;opacity:0}}
@keyframes intr-art{0%,14%{opacity:0;translate:12% 0}34%{opacity:1;translate:0 0;filter:hue-rotate(var(--hue,0deg)) brightness(0) drop-shadow(0 0 2cqw #ff3b5c)}
  56%{filter:hue-rotate(var(--hue,0deg)) brightness(1) drop-shadow(0 0 1.5cqw #ff3b5c)}88%{opacity:1}100%{opacity:0;filter:hue-rotate(var(--hue,0deg)) brightness(1)}}
@keyframes intr-who{0%,26%{opacity:0;translate:0 1cqw}40%{opacity:1;translate:0 0}88%{opacity:1}100%{opacity:0}}
/* The name: one line to type in, a roll of the dice beside it. */
/* ?soundlog (test only): the sounds as they play, newest first. */
.sound-log{position:fixed;left:8px;bottom:8px;z-index:99;margin:0;padding:6px 10px 6px 26px;max-width:320px;list-style:decimal;background:#000c;border:1px solid #7ff5e455;color:#9fe9ff;font:12px/1.5 Consolas,"Yu Gothic UI",monospace;pointer-events:none}
.sound-log li:first-child{color:#fff4cf}
/* Live opponent typing: current word only, in the opponent's plate. */
.opponent-input{margin-top:5px;padding:4px 0 2px;border:0;border-radius:0;background:linear-gradient(90deg,#06121c22,transparent 85%);font:11px/1.55 monospace;max-width:360px;overflow:hidden;text-shadow:0 1px 3px #000b}
.opponent-input small{font:9px sans-serif;color:#a8b7c16b;margin-right:8px}.opponent-input>span{color:#c6d5deaa}.opponent-input b{color:#a7d5cfbb;font-weight:400}.opponent-input div>span{color:#90a6b04d}.opponent-input.input-miss b{color:#d3aaa6aa}
.continuation{display:block;margin:10px auto;padding:10px 22px;border:1px solid #91cec9;border-radius:8px;color:#d3f1ed;background:#193e42;cursor:pointer}
@media(max-width:600px){.opponent-input{font-size:9px;padding:3px 0}}
.match-preview-controls{position:fixed;bottom:6px;left:50%;transform:translateX(-50%);z-index:10000;display:flex;align-items:center;gap:8px;max-width:98vw;padding:7px 10px;border:1px solid #7bcac4;border-radius:8px;background:#07191ef2;color:#c5e7e6;font:11px sans-serif;box-shadow:0 4px 18px #0008}.match-preview-controls button{padding:6px;border:1px solid #507c88;border-radius:4px;background:#163644;color:#d4eeee;cursor:pointer}.match-preview-controls span{max-width:230px}.match-preview-controls strong{white-space:nowrap}
@media(max-width:700px){.match-preview-controls{flex-wrap:wrap;width:94vw}.match-preview-controls span{max-width:none}}

/* The touch battle reserves separate rows for the field, chant and keyboard.
   Sprite bounds include transparent margins and off-centre pose anchors. */
body[data-input="flick"] .arena{--sprite-room:clamp(30px,calc(100dvh - var(--pad-height) - 252px),180px);--sprite-width-room:22cqw}
body[data-input="flick"] .fighter{top:calc(100% - 156px)}
body[data-input="flick"] .player-fighter{left:25%}
body[data-input="flick"] .cpu-fighter{left:75%}
body[data-input="flick"] .fighter-rig{height:min(calc(var(--h) * 1.6),var(--sprite-room),calc(var(--sprite-width-room) / (var(--ratio,1) * max(var(--cx,.5),calc(1 - var(--cx,.5))))))}
body[data-input="flick"] .fighter.floating .fighter-body{translate:0 -3px}
body[data-input="flick"] .rune-panel{height:96px;bottom:calc(var(--pad-height) + 20px);padding:7px 12px}
body[data-input="flick"] .rune-panel h2{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}
body[data-input="flick"] .word-guide{font-size:clamp(20px,6.2cqw,26px);line-height:1.2;min-height:32px;letter-spacing:.035em}
body[data-input="flick"] .kana-draft{font-size:.8em;color:#e8d49a}
body[data-input="flick"] .word-kicker{font-size:10px;line-height:1.4}
body[data-input="flick"] .next-word{font-size:10px;line-height:1.4;margin:3px 0 0}
body[data-input="flick"] .input-message{font-size:10px;line-height:1.3;min-height:0;margin:2px 0 0}
body[data-input="flick"] .input-message:empty{display:none}
body[data-input="flick"] .combo-dock{bottom:calc(var(--pad-height) + 132px)}
body[data-input="flick"] .plate{position:relative;padding:6px;clip-path:none}
body[data-input="flick"] .plate-name>.side-tag{display:none}
body[data-input="flick"] .plate-name>.cpu-tag[data-kind="ai"]{display:block;position:absolute;left:6px;top:6px;font-size:8px;padding:0;border:0;line-height:1.3}
body[data-input="flick"] .cpu-tag[data-kind="ai"] .sigil{display:none}
body[data-input="flick"] .plate-identity strong{font-size:12px;line-height:1.3}
body[data-input="flick"] .plate-name .hp-num{line-height:1.3}
body[data-input="flick"] .hp-bar{height:10px;margin-top:3px}
body[data-input="flick"] .plate-gauge{margin-top:4px}
body[data-input="flick"] .seek-tag{font-size:9px;letter-spacing:0;padding:0}
body[data-input="flick"] .seek-tag:before{display:none}
body[data-input="flick"] .battle-callout{top:calc(100dvh - var(--pad-height) - 172px - var(--sprite-room) / 2);font-size:18px}
body[data-input="flick"] .duel{top:96px}
body[data-input="flick"] .duel-call{margin:0 0 5px}
body[data-input="flick"] .duel-call b{font-size:18px;letter-spacing:.1em}
body[data-input="flick"] .duel-call span{display:none}
body[data-input="flick"] .duel-field{grid-template-columns:60px minmax(0,1fr) 60px;gap:6px}
body[data-input="flick"] .duel-pips{gap:3px}
body[data-input="flick"] .duel-pips i{width:7px}
body[data-input="flick"] .arena:has(.duel:not([hidden])) .combo-dock{visibility:hidden}
body[data-input="flick"] .arena:has(.duel:not([hidden])) .fighter{opacity:.3}
@media(max-height:650px){body[data-input="flick"] .opponent-input{display:none}}
@media(max-height:550px) and (orientation:landscape){
  body[data-input="flick"] .arena{--sprite-room:clamp(30px,calc(100dvh - 287px),150px);--sprite-width-room:11cqw}
  body[data-input="flick"] .fighter{top:calc(100% - 183px)}
  body[data-input="flick"] .rune-panel{bottom:8%}
  body[data-input="flick"] .combo-dock{bottom:calc(8% + 112px)}
  body[data-input="flick"] .battle-callout{top:calc(100dvh - 183px - var(--sprite-room) / 2)}
  body[data-input="flick"] .duel{top:100px}
}
/* Keep the cliff artwork at its authored 16:9 ratio. Feet and platforms share
   one scene coordinate system; cropping a tall scene would move the cliffs. */
body[data-input="flick"] .arena[data-story=""]{--cliff-floor:min(calc(100dvh - var(--pad-height) - 172px),calc(96px + 32cqw));--cliff-height:56.25cqw;--cliff-offset:32.0625cqw;--sprite-room:clamp(30px,calc(var(--cliff-floor) - 92px),150px);--sprite-width-room:16cqw}
body[data-input="flick"] .arena[data-story=""] .arena-scene{top:calc(var(--cliff-floor) - var(--cliff-offset));bottom:auto;height:var(--cliff-height)}
body[data-input="flick"] .arena[data-story=""] .arena-bg{inset:0}
body[data-input="flick"] .arena[data-story=""] .fighter{top:57%}
body[data-input="flick"] .arena[data-story=""] .player-fighter{left:17%}
body[data-input="flick"] .arena[data-story=""] .cpu-fighter{left:83%}
@media(min-height:651px){
  body[data-input="flick"] .arena[data-story=""]{--sprite-room:clamp(30px,calc(var(--cliff-floor) - 132px),150px)}
  body[data-input="flick"] .duel{top:130px}
}
@media(max-height:550px) and (orientation:landscape){
  body[data-input="flick"] .arena[data-story=""]{--cliff-floor:calc(100dvh - 183px);--cliff-height:28.6875cqw;--cliff-offset:16.351875cqw;--sprite-room:clamp(30px,calc(100dvh - 287px),150px);--sprite-width-room:8cqw}
}

/* Action controls: dark enamel in a worn iron frame, with brass only along the rim. */
:root{
  --action-face:repeating-linear-gradient(113deg,#e5d9bc04 0 1px,transparent 1px 7px),linear-gradient(180deg,#482d2b 0%,#2d1b1d 18%,#1a1012 66%,#281819 100%);
  --action-shadow:inset 0 1px 0 #c5aa7940,inset 0 -2px 0 #090708,inset 0 0 0 3px #0a080ab3,inset 0 0 0 4px #b49a5926,0 3px 5px #0009;
}
.primary-button:not(.story-next),.story-next.is-transition,.rs-again,.skill-button.ready,.evolve-prompt,.ghost-button.confirm,.reset-button.confirm,.lab-btn.gold{
  border:1px solid #89775b;border-bottom-color:#4e4237;border-radius:2px;
  background:var(--action-face);color:#eee3cc;text-shadow:0 1px 2px #000;
  box-shadow:var(--action-shadow);clip-path:none;filter:none;
}
.primary-button:not(.story-next):hover:not(:disabled),.story-next.is-transition:hover:not(:disabled),.rs-again:hover:not(:disabled),.skill-button.ready:hover:not(:disabled),.evolve-prompt:hover:not(:disabled),.ghost-button.confirm:hover:not(:disabled),.reset-button.confirm:hover:not(:disabled),.lab-btn.gold:hover:not(:disabled){
  border-color:#b69a70;color:#fff2d8;filter:brightness(1.1);
}
.primary-button:not(.story-next):active:not(:disabled),.story-next.is-transition:active:not(:disabled),.rs-again:active:not(:disabled),.skill-button.ready:active:not(:disabled),.evolve-prompt:active:not(:disabled),.ghost-button.confirm:active:not(:disabled),.reset-button.confirm:active:not(:disabled),.lab-btn.gold:active:not(:disabled){
  box-shadow:inset 0 2px 6px #000d,inset 0 0 0 3px #0a080ab3,inset 0 0 0 4px #b49a5926;
}
.primary-button:not(.story-next):disabled,.story-next.is-transition:disabled,.rs-again:disabled,.skill-button.ready:disabled,.evolve-prompt:disabled{
  background:linear-gradient(#242526,#141516);color:#a7a29a;border-color:#55514a;
  box-shadow:inset 0 0 0 3px #0a0b0bb3,inset 0 1px 0 #d0c9b31a;opacity:1;filter:none;animation:none;
}
.primary-button:focus-visible,.rs-again:focus-visible,.skill-button:focus-visible,.evolve-prompt:focus-visible{
  outline:2px solid #ead8b4;outline-offset:3px;
}
.skill-button.ready:not(:disabled),#flick-skill.ready:not(:disabled),.evolve-prompt:not(:disabled){
  border-color:#c39a6b;background:repeating-linear-gradient(113deg,#e5d9bc04 0 1px,transparent 1px 7px),linear-gradient(#572c27,#35191b 22%,#211114 70%,#3d1c1d);
  color:#fff0d5;animation:iron-ready 2.4s ease-in-out infinite;
}
@keyframes iron-ready{
  0%,100%{box-shadow:var(--action-shadow),0 0 4px #b44c3026}
  50%{box-shadow:var(--action-shadow),0 0 14px #c54c364a; border-color:#d1ac7d}
}
/* The phone controls share the iron material; their layout and touch targets stay the same. */
.flick-pad{background:#0d1012f5;border-color:#75695566;border-radius:4px;box-shadow:inset 0 1px 0 #cec3a519,0 5px 16px #0008}
.flick-key,.flick-modifier{background:repeating-linear-gradient(113deg,#ece3cc03 0 1px,transparent 1px 7px),linear-gradient(#292b2d,#181b1e);border-color:#81765e88;border-radius:3px;box-shadow:inset 0 1px 0 #d5c9ae24,inset 0 -2px 0 #070a0b99,0 1px 2px #0009}
.flick-key[data-selected],.flick-modifier[aria-pressed="true"]{background:linear-gradient(#463a30,#2b2420);border-color:#bda683;color:#f5e8cf}
.flick-popup span{background:linear-gradient(#2d2f31,#1a1c1e);border-color:#968a73;border-radius:3px;box-shadow:inset 0 1px 0 #d5c9ae24}
.flick-popup[data-selected="0"] [data-direction="0"],.flick-popup[data-selected="1"] [data-direction="1"],.flick-popup[data-selected="2"] [data-direction="2"],.flick-popup[data-selected="3"] [data-direction="3"],.flick-popup[data-selected="4"] [data-direction="4"]{background:#d6c3a1;color:#201b16;border-color:#f3e5ca}
@media(prefers-reduced-motion:reduce){.skill-button.ready,#flick-skill.ready,.evolve-prompt{animation:none}}
@media(max-width:600px){
  .help-modal{padding:22px}
  .help-cards{grid-template-columns:minmax(0,1fr);gap:8px}
  .help-cards li{display:grid;grid-template-columns:minmax(112px,.9fr) minmax(0,1fr);gap:8px;padding:8px}
  .help-pic{height:58px}.help-cards b{font-size:12px}
}

/* Cut-in figures share the same measured alpha bounds as the arena sprites. */
.cutin.story-king .cutin-art{background:none}
.starter-card.rare-reveal{animation:starter-rare-reveal 1.4s ease-out}
@keyframes starter-rare-reveal{0%{box-shadow:inset 0 0 45px #fff2c9,0 0 35px #e8b455;filter:brightness(1.7)}100%{box-shadow:inset 0 0 12px #d7ad4c33;filter:brightness(1)}}
body[data-input="flick"] .arena .cutin{--cut-top:clamp(90px,18dvh,150px);--cut-height:clamp(110px,24dvh,205px)}
body[data-input="flick"] .arena .cutin .cutin-band{left:0;right:0;top:var(--cut-top);height:var(--cut-height);rotate:-4deg;border-block-width:2px}
body[data-input="flick"] .arena .cutin.rival .cutin-band{rotate:4deg}
body[data-input="flick"] .arena .cutin .cutin-art{left:3%;right:auto;top:4px;bottom:4px;width:47%}
body[data-input="flick"] .arena .cutin.rival .cutin-art{left:auto;right:3%}
body[data-input="flick"] .arena .cutin .cutin-name{left:51%;right:4%;top:calc(var(--cut-top) + var(--cut-height) * .35);white-space:normal;rotate:-4deg}
body[data-input="flick"] .arena .cutin.rival .cutin-name{left:4%;right:51%;rotate:4deg;text-align:left}
body[data-input="flick"] .arena .cutin-name small{font-size:10px;letter-spacing:.1em}
body[data-input="flick"] .arena .cutin-name span{font-size:clamp(16px,5cqw,23px);letter-spacing:.04em;overflow-wrap:anywhere}
body[data-input="flick"] .arena.clashing .cutin{--cut-height:min(180px,calc((100dvh - var(--pad-height) - 116px) / 2));--cut-top:84px}
body[data-input="flick"] .arena.clashing .cutin:not(.rival){--cut-top:calc(92px + var(--cut-height))}
@media(max-height:550px) and (orientation:landscape){
  body[data-input="flick"] .arena .cutin{right:49%;--cut-top:100px;--cut-height:130px}
  body[data-input="flick"] .arena.clashing .cutin{--cut-top:82px;--cut-height:86px}
  body[data-input="flick"] .arena.clashing .cutin:not(.rival){--cut-top:176px}
}
.lab-fold{position:fixed;z-index:40;right:306px;top:8px;min-height:44px;padding:6px 12px;background:#1a2023;color:#e9dfc9;border:1px solid #827256}
body.lab-folded .battle-lab-panel{display:none}
body.lab-folded .lab-fold{right:8px}
body.battle-lab.lab-folded .battle-screen{right:0}
body.battle-lab.lab-folded .arena{width:min(100vw,177.78vh)}
body.battle-lab.lab-folded[data-input="flick"] .arena{width:min(100vw,76vh)}
@media(max-height:550px) and (orientation:landscape){body.battle-lab.lab-folded[data-input="flick"] .arena{width:100vw}}
@media(prefers-reduced-motion:reduce){.starter-card.rare-reveal{animation:none;border-color:#e8c779;box-shadow:inset 0 0 14px #d7ad4c55}}

.growth-item{padding:10px 0 12px;border-bottom:1px solid #68797744;margin-bottom:10px;flex-shrink:0}
.growth-item-head{display:flex;align-items:center;gap:7px;font-size:13px;color:#ece1c5}
.growth-item-head img{width:28px;height:28px;object-fit:contain}.growth-item-head span{color:var(--b-muted);margin-left:6px}
.growth-item p{font-size:12px;line-height:1.6;color:var(--b-muted);margin:5px 0 8px;overflow-wrap:anywhere}
.growth-item button{width:100%;min-height:40px}.growth-item #growth-tome-note{color:#d6e5d1;margin-bottom:0}

.arena-scene.shio-shake{animation:shio-shake .12s linear}
.arena-scene.shio-shake-finish{animation:shio-shake-finish .24s linear}
@keyframes shio-shake{15%{translate:-.14cqw 0}45%{translate:.12cqw 0}75%{translate:-.06cqw 0}100%{translate:0 0}}
@keyframes shio-shake-finish{10%{translate:0 .32cqw}30%{translate:.12cqw -.19cqw}55%{translate:-.09cqw .12cqw}80%{translate:0 -.04cqw}100%{translate:0 0}}

/* Hide the removed battle input heading without leaving an empty row. */
.word-kicker:empty{display:none}

/* Training entry and the two orb companions. */
.fighter.attacking[data-motion="lyuka-tail"]{animation:none}
.fighter.attacking[data-motion="lyuka-tail"] .fighter-rig{animation-name:lyuka-tail-turn;transform-origin:50% 65%}
@keyframes lyuka-tail-turn{0%,100%{rotate:0deg}18%{rotate:-7deg}45%{rotate:6deg}70%{rotate:-4deg}}
.fighter.attacking[data-motion="tail-thrust"]{animation:none}
.fighter.attacking[data-attack-pattern="homing-volley"]{animation:none}
.fighter.attacking[data-motion="tail-thrust"] .fighter-rig{animation-name:tail-lance-recoil;transform-origin:50% 90%}
/* Follow the release artwork's sleeve, with a small feather at native resolution.
   A rectangular cut leaves a visible stump. The body parent mirrors this mask. */
.fighter[data-dragon-form="human"][data-pose="attack-tail"][data-attack-pattern="tail-lance"] .fighter-sprite{mask-image:url('./assets/effects/lyuka-release-mask.svg');mask-size:100% 100%;mask-repeat:no-repeat}
.fighter.tail-windup .fighter-rig{animation:tail-lance-windup 1.2s ease-in-out infinite;transform-origin:50% 90%}
@keyframes tail-lance-recoil{0%{rotate:-4deg}30%{rotate:-5deg}45%{rotate:4deg}70%{rotate:1deg}100%{rotate:0deg}}
@keyframes tail-lance-windup{0%,100%{rotate:-2deg}50%{rotate:-4deg}}
.front-link-copy{display:flex;align-items:center;gap:.7cqw}
.front-link-copy>span{white-space:nowrap}
.front-links #front-learning{border-color:#ab97695c;background:linear-gradient(115deg,#28291ed9,#10202bd9)}

/* Local story/training invasion rest: quiet status in the existing HUD. */
.seek-tag[data-rest="true"]{animation:none;color:#aaa99d;font-weight:400;letter-spacing:0}
.seek-tag[data-rest="true"]::before{display:none}
.story-search-status[data-rest="true"]{color:#aaa99d}

.fighter[data-keep-footprint="true"] .fighter-shadow{left:0;width:15cqw;height:2.4cqw;background:radial-gradient(ellipse,#000000d0 30%,#00000000 70%);box-shadow:0 0 2cqw color-mix(in srgb,var(--fx,#7ff5e4) 22%,transparent)}

/* The new companions blink through a feathered eye-only overlay, on the unchanged idle canvas. */
:is(.fighter-blink,.altar-blink,.gate-blink)[src*="/female-blink-v1."]{clip-path:none;mask-image:radial-gradient(ellipse 6% 2.2% at 70% 11%,#000 70%,transparent 100%);-webkit-mask-image:radial-gradient(ellipse 6% 2.2% at 70% 11%,#000 70%,transparent 100%);transition:opacity 22ms linear}
:is(.fighter-blink,.altar-blink,.gate-blink)[src*="/white-male-blink-v1."]{clip-path:none;mask-image:radial-gradient(ellipse 6% 2.4% at 74% 10.5%,#000 70%,transparent 100%);-webkit-mask-image:radial-gradient(ellipse 6% 2.4% at 74% 10.5%,#000 70%,transparent 100%);transition:opacity 22ms linear}
.fighter.ko .fighter-blink[src*="/female-blink-v1."],.fighter.ko .fighter-blink[src*="/white-male-blink-v1."]{display:none}

/* The two wide-silhouette companions use small shadows at each boot. Relative canvas coordinates also fit mobile. */
.altar[data-footprints="true"] .altar-floor{display:none}
.altar[data-footprints="true"] .altar-rig{isolation:isolate}
.altar-footprints{position:absolute;inset:0;pointer-events:none;z-index:0}
.altar-footprints i{position:absolute;translate:-50% -38%;border-radius:50%;background:radial-gradient(ellipse,#010609a3 12%,#01060959 40%,#01060900 74%);filter:blur(.16cqw)}
.altar[data-footprints="true"] .altar-sprite{z-index:1}
.altar[data-footprints="true"] .altar-blink{z-index:2}
.codex-altar.locked .altar-footprints{opacity:.25}
#codex-rig{cursor:default}

/* Preserve contact, reduce full-screen camera travel and flashes during fast volleys. */
@keyframes b-shake{20%{translate:-.18cqw .09cqw}40%{translate:.16cqw -.09cqw}60%{translate:-.1cqw .05cqw}80%{translate:.06cqw 0}}
@keyframes b-shake-big{8%{scale:1.015;translate:-.45cqw .22cqw}22%{translate:.4cqw -.24cqw}40%{scale:1.008;translate:-.3cqw .16cqw}60%{translate:.18cqw -.09cqw}80%{scale:1;translate:-.08cqw 0}}
@keyframes c-dim{0%{background:#e7f0e31f}7%{background:#01050ac4}84%{background:#01050aa0}100%{background:#01050a00}}
.portrait-window{position:relative;overflow:hidden;container-type:size;isolation:isolate;scale:var(--portrait-flip,1) 1}
.portrait-actor{position:absolute;width:calc(var(--portrait-zoom,190) * 1cqw);aspect-ratio:var(--portrait-ratio,.667);left:50%;top:43%;translate:calc(var(--portrait-x,50) * -1%) calc(var(--portrait-y,12) * -1%)}
.portrait-rig{position:absolute;inset:0;transform-origin:calc(var(--portrait-x) * 1%) calc(var(--portrait-y) * 1%);animation:portrait-breath var(--portrait-breath,5s) ease-in-out infinite}
.portrait-rig img{position:absolute;inset:0;width:100%;height:100%;object-fit:contain;pointer-events:none}
.portrait-eyes{opacity:0;clip-path:var(--portrait-eye-mask);transition:opacity 20ms linear}
.portrait-window.blinking .portrait-eyes{opacity:1}
.portrait-window[data-character="rune-warden-human"] .portrait-eyes{clip-path:none;mask-image:radial-gradient(ellipse 6% 2.2% at 70% 11%,#000 70%,transparent 100%)}
.portrait-window[data-character="white-wing-sovereign"] .portrait-eyes{clip-path:none;mask-image:radial-gradient(ellipse 6% 2.4% at 74% 10.5%,#000 70%,transparent 100%)}
@keyframes portrait-breath{0%,100%{transform:scale(1)}45%{transform:scale(1.003,1.006) rotate(-.04deg)}}
@media(prefers-reduced-motion:reduce){.portrait-rig{animation:none}}

/* Portrait cut-ins retain the existing cut-in/clash clocks and animation timings. */
.arena .cutin.portrait-cutin .cutin-art::before{display:none}
.arena .cutin.portrait-cutin .cutin-band{top:30%;height:28%;border-block-width:1px;rotate:-4deg;background:linear-gradient(90deg,#02080d,color-mix(in srgb,var(--fx-glow) 55%,#02080d) 35%,color-mix(in srgb,var(--fx) 30%,#02080d) 70%,#02080d);box-shadow:0 8px 24px #0008}
.arena .cutin.portrait-cutin.rival .cutin-band{rotate:4deg}
.arena .cutin.portrait-cutin .cutin-art{left:11%;right:auto;width:48%;filter:hue-rotate(var(--hue,0deg)) drop-shadow(0 0 10px #0008);container-type:normal;scale:1}
.arena .cutin.portrait-cutin.rival .cutin-art{left:auto;right:11%}
.portrait-cutin .cutin-art>.portrait-window{position:absolute;inset:-10% 0;width:100%;height:120%;mask-image:linear-gradient(90deg,transparent,#000 9%,#000 86%,transparent)}
.portrait-cutin .cutin-art .portrait-actor{width:calc(var(--portrait-zoom,190) * 1cqw);top:42%}
.arena .cutin.portrait-cutin .cutin-name{top:44%;right:9%;rotate:-4deg;max-width:39%;white-space:normal;transform:translateY(-50%);line-height:1.1}
.arena .cutin.portrait-cutin.rival .cutin-name{left:9%;right:auto;rotate:4deg}
.arena .cutin.portrait-cutin .cutin-name span{font-size:clamp(13px,3.05cqw,40px);line-height:1.18;letter-spacing:.06em;overflow-wrap:anywhere}
.arena .cutin.portrait-cutin .cutin-name small{font-size:clamp(9px,.9cqw,13px);letter-spacing:.12em;color:#dcc798}
.cutin-character-name{display:block;font-size:clamp(10px,1.12cqw,15px);font-weight:400;letter-spacing:.06em;margin-bottom:5px;color:#d4dfd4}
.cutin-character-name[hidden]{display:none}
.arena.clashing .cutin.portrait-cutin:not(.rival) .cutin-band{top:53%}
.arena.clashing .cutin.portrait-cutin.rival .cutin-band{top:16%}
.arena.clashing .cutin.portrait-cutin:not(.rival) .cutin-name{top:67%}
.arena.clashing .cutin.portrait-cutin.rival .cutin-name{top:30%}
@media(max-width:650px){.arena .cutin.portrait-cutin .cutin-name span{font-size:clamp(13px,3.7cqw,22px)}.arena .cutin.portrait-cutin .cutin-name{max-width:42%;right:5%}.arena .cutin.portrait-cutin.rival .cutin-name{left:5%;right:auto}}

/* Phone cut-ins share one coordinate system, including portrait/creature clashes.
   These positions take precedence over the older per-art percentage rules. */
body[data-input="flick"] .arena .cutin{--cut-angle:-3deg;--cut-gap:clamp(24px,7cqw,38px)}
body[data-input="flick"] .arena .cutin.rival{--cut-angle:3deg}
body[data-input="flick"] .arena.clashing .cutin{--cut-top:84px;--cut-height:clamp(56px,calc((100dvh - var(--pad-height) - 204px - var(--cut-gap)) / 2),164px)}
body[data-input="flick"] .arena.clashing .cutin:not(.rival){--cut-top:calc(84px + var(--cut-height) + var(--cut-gap))}
body[data-input="flick"] .arena .cutin .cutin-band{top:var(--cut-top)!important;height:var(--cut-height)!important;rotate:var(--cut-angle)!important}
body[data-input="flick"] .arena .cutin .cutin-name{top:calc(var(--cut-top) + var(--cut-height) / 2)!important;left:51%!important;right:4%!important;max-width:45%!important;transform:translateY(-50%);rotate:var(--cut-angle)!important;line-height:1.1}
body[data-input="flick"] .arena .cutin.rival .cutin-name{left:4%!important;right:51%!important;text-align:left}
body[data-input="flick"] .arena .cutin.portrait-cutin .cutin-art{left:3%;right:auto;width:47%}
body[data-input="flick"] .arena .cutin.portrait-cutin.rival .cutin-art{left:auto;right:3%}
body[data-input="flick"] .arena .cutin .cutin-name span{font-size:clamp(14px,4.3cqw,21px);line-height:1.15;letter-spacing:.03em}
body[data-input="flick"] .arena .cutin .cutin-name small{font-size:9px;letter-spacing:.06em}
body[data-input="flick"] .arena .cutin-character-name{font-size:10px;line-height:1.1;margin-bottom:3px}
@media(max-height:600px){
 body[data-input="flick"] .arena .cutin .cutin-name span{font-size:clamp(12px,3.6cqw,17px)}
 body[data-input="flick"] .arena .cutin .cutin-character-name{display:none}
}
@media(max-height:550px) and (orientation:landscape){
 body[data-input="flick"] .arena .cutin{right:49%;--cut-top:100px;--cut-height:130px;--cut-gap:26px}
 body[data-input="flick"] .arena.clashing .cutin{--cut-top:76px;--cut-height:clamp(56px,22dvh,86px)}
 body[data-input="flick"] .arena.clashing .cutin:not(.rival){--cut-top:calc(76px + var(--cut-height) + var(--cut-gap))}
 body[data-input="flick"] .arena .cutin .cutin-name span{font-size:clamp(12px,1.9cqw,17px)}
}

/* The lower corners confirm or discard the editable kana, like a phone kana pad. */
.flick-key[data-row="9"]{grid-column:2;grid-row:4}
.flick-control{min-height:40px;touch-action:none;user-select:none;color:#ddd5c2;border:1px solid #81765e88;border-radius:3px;background:linear-gradient(#292b2d,#181b1e);font-size:23px}
.flick-confirm{grid-column:1;grid-row:4}.flick-delete{grid-column:3;grid-row:4}
.flick-control:disabled{opacity:.3}.flick-hint{display:flex;justify-content:space-between;align-items:center;gap:5px;min-height:24px}
.flick-pad[data-composing="true"] .flick-preview{text-decoration:underline;text-underline-offset:5px}

.word-guide .next.composing{background:#3b3830;color:#ffe4a2;text-decoration:underline;box-shadow:none;animation:none}

/* Keep the familiar 3 x 4 kana positions. Editing controls sit outside that grid. */
.flick-grid>.flick-modifiers{grid-column:1;grid-row:4;display:block;min-width:0}
.flick-grid>.flick-modifiers .flick-modifier-cycle{width:100%;height:100%;min-height:40px;font-size:19px;letter-spacing:.04em}
.flick-key[data-row="9"]{grid-column:2;grid-row:4}.flick-key[data-row="10"]{grid-column:3;grid-row:4}
.flick-key[data-row="10"] [data-direction="0"]{font-size:16px;letter-spacing:.03em}
.flick-toolbar>.flick-edit-actions{display:flex;gap:5px;flex-shrink:0}.flick-edit-actions .flick-control{width:44px;min-height:44px;grid-column:auto;grid-row:auto;font-size:21px}
.flick-grid>.flick-key,.flick-grid .flick-modifier-cycle{background:linear-gradient(#383b3e,#2a2d30);border:1px solid #65686a88;border-radius:7px;box-shadow:inset 0 1px #ffffff0c,0 1px 2px #0006}
.flick-grid>.flick-key[data-selected]{background:#4f5356;border-color:#d6c59b}
.flick-modifier-cycle:disabled{opacity:.5}.flick-hint{justify-content:center}
/* Players on the game now (src/app.mjs showHere): under the battle gate's rating, and in the search panel. */
.gate-here{display:block;margin-top:.35cqw;font:max(11px,.9cqw) Georgia,serif;letter-spacing:.08em;color:#cfe3d4}
.gate-here::before,.matching-here::before{content:"";display:inline-block;width:.55em;height:.55em;margin-right:.45em;border-radius:50%;background:#7fd6a0;box-shadow:0 0 6px #7fd6a0aa;vertical-align:.05em}
.matching-here{margin:.3cqw 0 0;font-size:max(11px,.85cqw);letter-spacing:.08em;color:#cfe3d4}
/* The counts while a match waits for a person (src/app.mjs hereText): under the search tag. */
.seek-count{align-self:center;white-space:nowrap;font-size:max(9px,.62cqw);letter-spacing:.06em;color:#cfe3d4;padding:0 .3cqw;line-height:1.4;background:#030d14bb;border-radius:3px}
body[data-input="flick"] .seek-count{font-size:8px;letter-spacing:0;padding:0}
/* The battle gate's second line: the others looking for an opponent (src/app.mjs showHere). */
.gate-waiting{margin-top:.15cqw}
.gate-waiting::before{background:#e8c46a;box-shadow:0 0 6px #e8c46aaa}
