/* SNAP mechanism finish: decorative skin only. No controller, movement,
 * blade transforms, STOP timing, hit geometry or Android swing overrides.
 * Original rail image is kept for rollback; its decorative replacement is
 * axis-aligned and inset within the same 260px playfield, behind the carriage.
 */
.game .rail-layer .rail { visibility:hidden; }
.game .snap-rail-track {
    position:absolute;left:10px;top:46px;width:240px;height:26px;
    border:1px solid #111b24;border-radius:4px;overflow:hidden;
    background:linear-gradient(180deg,#b4c3cb 0,#e4edf1 4%,#455969 12%,#1d2a34 22%,#0a131d 49%,#344658 55%,#7c8e9e 72%,#d4e0e4 78%,#425566 86%,#101b28 100%);
    box-shadow:inset 0 1px #fff9,inset 0 -1px #000c,0 2px 2px #0007;
    pointer-events:none;
}
.game .snap-rail-track::before,.game .snap-rail-track::after {
    content:'';position:absolute;top:0;width:8px;height:100%;z-index:1;
    border:1px solid #07101b;border-radius:3px;
    background:radial-gradient(circle at 50% 24%,#050a13 0 1px,#becdd2 1.2px 1.8px,transparent 2px),radial-gradient(circle at 50% 76%,#050a13 0 1px,#becdd2 1.2px 1.8px,transparent 2px),linear-gradient(90deg,#263847,#8394a0 35%,#344352 70%,#111d29);
    box-shadow:inset 1px 0 #c3e2ee66,1px 0 1px #0008;
}
.game .snap-rail-track::before {left:0;}
.game .snap-rail-track::after {right:0;}
.game .snap-rail-channel {
    position:absolute;left:8px;right:8px;top:9px;height:7px;
    border-top:1px solid #070c14;border-bottom:1px solid #a5bbc766;
    background:linear-gradient(180deg,#070c14,#243443);
    box-shadow:0 -6px 0 -2.5px #87e5fba6,0 8px 0 -2.5px #d67ac770;
}
/* Explicit old dimensions: generated art must not move its cutter or hitbox. */
.game .carriage {height:28px;object-fit:fill;}
/* Static light lift on the individual sprites only. No filter on moving
 * containers, no animated filter, and no change to blade transforms/pivots. */
.game .carriage {filter:brightness(1.25) contrast(.95);}
.game .cutter-base,.game .blade {filter:brightness(1.5) contrast(.9);}

/* Same 180ms controller flash, now a restrained lens glint instead of four
 * yellow blobs. No extra timer or outcome signal: it occurs on every close. */
.game .cutter-flash::before {
    content:'';position:absolute;inset:2px 5px;border-radius:50%;
    background:radial-gradient(ellipse,#efffffbb 0,#74edff55 24%,#b43cb81c 55%,transparent 72%);
}
.game .cutter-flash::after {
    content:'';position:absolute;left:4px;right:4px;top:7px;height:1px;
    background:linear-gradient(90deg,transparent,#90efff,#fff,#f2b4eb,transparent);
    box-shadow:0 0 3px #b7f5ff88;
}
.game .cutter-flash span {
    width:5px;height:1px;border-radius:50%;
    background:linear-gradient(90deg,transparent,#eaffff,#8dedff);
    box-shadow:0 0 2px #85e6ff88;
}
.game .cutter-flash span:nth-child(even) {background:linear-gradient(90deg,#ffc5f1,#fff,transparent);}

/* Reuse the existing bounded, server-confirmed burst. Plan/count/duration and
 * cleanup remain in unchanged snap-impact-v1.js; no new particles or loops. */
.snap-impact-burst {--impact-color:#93efff;--impact-accent:#e296ef;}
.snap-impact-burst[data-stage='2'] {--impact-color:#ffe4ac;--impact-accent:#a5efff;}
.snap-impact-burst[data-stage='3'] {--impact-color:#ffe7ae;--impact-accent:#c7ff9c;}
.snap-impact-ring {border-width:1px;border-color:var(--impact-color);box-shadow:inset 0 0 2px #fff5,0 0 4px var(--impact-color);}
.snap-impact-core {background:radial-gradient(circle,#fff 0 22%,#fff2d9 40%,transparent 72%);box-shadow:0 0 5px var(--impact-color);}
.snap-impact-ray {height:1.5px;width:7px;background:linear-gradient(90deg,#fff,var(--impact-color),transparent);box-shadow:0 0 2px var(--impact-color);}
.snap-impact-ray[data-tint='1'] {background:linear-gradient(90deg,#fff,var(--impact-accent),transparent);box-shadow:0 0 2px var(--impact-accent);}

/* Existing result classes/text remain authoritative. This removes the large
 * red blur stack and the compressed Rubik Mono lettering, not the messages. */
.game #topStatus.top-status {
    left:50px;top:80px;width:260px;min-height:38px;
    padding:6px 10px;border:0;border-radius:0;
    background:none;
    box-shadow:none;
    color:var(--status-ink,#d2f6ff);
    font-family:'Nunito',Arial,sans-serif;font-size:22px;font-weight:900;
    line-height:1.12;letter-spacing:.7px;white-space:normal;overflow-wrap:anywhere;
    -webkit-text-stroke:3px #170b24;paint-order:stroke fill;
    text-shadow:0 2px 0 #0a0614,0 3px 4px #0008;filter:none;
    --text-scale-x:1;pointer-events:none;
}
/* Saturated SNAP ink: red = time/end/error, pink = miss, yellow = near,
 * cyan = damage, lime = prize, mint = restored, pale blue = waiting.
 * Text and timing carry the meaning too; no new flashing or urgency timer. */
.game #topStatus.status-miss {--status-ink:#ff5bbd;}
.game #topStatus.status-near {--status-ink:#ffe600;}
.game #topStatus.status-damage {--status-ink:#00f5ff;}
.game #topStatus.status-win {--status-ink:#b6ff00;}
.game #topStatus.status-end {--status-ink:#ff3658;font-size:19px;}
.game #topStatus.status-restore {--status-ink:#48ffbb;font-size:16px;}
.game #topStatus.status-warning {--status-ink:#ff9d00;}
.game #topStatus.status-info {--status-ink:#d6e9ff;}
.game #topStatus.show {animation:snapResultPanelIn .2s ease-out both;}
.game #topStatus:empty {display:none;}
@keyframes snapResultPanelIn {
    from {opacity:0;transform:translate3d(0,-4px,0) scale(.98);}
    to {opacity:1;transform:translate3d(0,0,0) scale(1);}
}
@media(prefers-reduced-motion:reduce) {
    .game #topStatus.show {animation:none;}
    .game .cutter-flash {visibility:hidden;}
}
