/* Shotcraft wall-reveal-moves, bento-light-up: 20-frame lead, one cell
   every 12 frames and an 8-frame sweep. Adapted for readable light paper:
   existing chapter content stays visible and a short coral rule travels once. */
.ms-chapters-list a { position: relative; }
.ms-chapters-list a::after { content: ''; position: absolute; top: -1px; left: 0; width: 28%; height: 2px; background: var(--ch-orange); opacity: 0; pointer-events: none; }
.ms-chapters-list.is-lighting a::after { animation: model-chapter-sweep .34s cubic-bezier(.2,.75,.3,1) both; animation-delay: calc(.667s + var(--chapter) * .4s); }
@keyframes model-chapter-sweep { 0% { transform: translateX(0); opacity: 0; } 15% { opacity: 1; } 80% { opacity: 1; } 100% { transform: translateX(257%); opacity: 0; } }
/* Shotcraft type-rhythm-sync, karaoke-fill-sync: the five senses light up in
   sequence with a left-to-right reading bar while keeping the rail readable. */
.ip-senses li { position: relative; }
.ip-senses li::after { content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 3px; background: var(--ch-orange); transform: scaleX(0); transform-origin: left; opacity: 0; pointer-events: none; }
.ip-senses.is-relaying li { animation: sense-fill .72s cubic-bezier(.3,0,.2,1) calc(.2s + var(--sense) * .52s) both; }
.ip-senses.is-relaying li::after { animation: sense-bar .72s cubic-bezier(.3,0,.2,1) calc(.2s + var(--sense) * .52s) both; }
@keyframes sense-fill { 0%, 100% { background-color: var(--ch-band); } 35%, 65% { background-color: #f6efe0; } }
@keyframes sense-bar { 0% { transform: scaleX(0); opacity: 1; } 70% { transform: scaleX(1); opacity: 1; } 100% { transform: scaleX(1); opacity: 0; } }
/* Shotcraft gauge-readout-moves, needle-sweep-selftest: each fact cell runs a
   full-span top sweep, rebounds, and pops its readout into place. */
.ip-fact { position: relative; }
.ip-fact::before { content: ''; position: absolute; left: 0; right: 0; top: 0; height: 2px; background: var(--ch-orange); transform: scaleX(0); transform-origin: left; opacity: 0; pointer-events: none; }
.ip-facts-inner.is-testing .ip-fact::before { animation: fact-selftest .84s cubic-bezier(.22,.82,.24,1) calc(.1s + var(--fact) * .16s) both; }
.ip-facts-inner.is-testing .ip-fact dd { animation: fact-pop .42s cubic-bezier(.18,1.35,.32,1) calc(.38s + var(--fact) * .16s) both; transform-origin: left center; }
@keyframes fact-selftest { 0% { transform: scaleX(0); opacity: 1; } 38% { transform: scaleX(1); opacity: 1; } 64% { transform: scaleX(.32); opacity: 1; } 82% { transform: scaleX(.42); opacity: 1; } 100% { transform: scaleX(0); opacity: 0; } }
@keyframes fact-pop { 0%, 100% { transform: scale(1); } 45% { transform: scale(1.045); } }
/* Shotcraft spotlight-sweep-moves, slide-spotlight-pan: an edge-anchored light
   bar travels strictly linearly across the top edge of the dark closing panel. */
.ip-plate-copy { position: relative; overflow: hidden; }
.ip-plate-copy::before { content: ''; position: absolute; top: 0; left: 0; width: 34%; height: 2px; background: var(--ip-accent-on-ink); opacity: 0; pointer-events: none; }
.ip-plate-copy.is-waking { animation: plate-wake-flash 1.1s linear .08s both; }
.ip-plate-copy.is-waking::before { animation: plate-edge-pan 1.1s linear .08s both; }
@keyframes plate-edge-pan { 0% { transform: translateX(-105%); opacity: 1; } 90% { opacity: 1; } 100% { transform: translateX(305%); opacity: 0; } }
@keyframes plate-wake-flash { 0%, 100% { background-color: var(--ch-ink); } 45% { background-color: #213766; } }
/* Shotcraft stroke-segment-build: two opposing coral stroke segments race
   outward from the center of each entry's top rule while the index number snaps. */
.ip-entry { position: relative; }
.ip-entry::before { content: ''; position: absolute; left: 0; right: 0; top: -1px; height: 2px; background: var(--ch-orange); transform: scaleX(0); transform-origin: center; opacity: 0; pointer-events: none; }
.ip-register.is-building .ip-entry::before { animation: entry-stroke-build .58s cubic-bezier(.3,0,.2,1) calc(.08s + var(--entry) * .28s) both; }
.ip-register.is-building .ip-entry .ip-num { animation: entry-num-snap .42s cubic-bezier(.18,1.35,.32,1) calc(.16s + var(--entry) * .28s) both; transform-origin: left center; }
@keyframes entry-stroke-build { 0% { transform: scaleX(0); opacity: 1; } 55% { transform: scaleX(1); opacity: 1; } 100% { transform: scaleX(1); opacity: 0; } }
@keyframes entry-num-snap { 0%, 100% { transform: scale(1); color: var(--ch-ink); } 45% { transform: scale(1.16); color: #91391e; } }
@media (prefers-reduced-motion: reduce) { .ms-chapters-list.is-lighting a::after, .ip-senses.is-relaying li, .ip-senses.is-relaying li::after, .ip-facts-inner.is-testing .ip-fact dd, .ip-plate-copy.is-waking, .ip-register.is-building .ip-entry .ip-num { animation: none; } .ip-facts-inner.is-testing .ip-fact::before, .ip-plate-copy.is-waking::before, .ip-register.is-building .ip-entry::before { animation: none; opacity: 0; } }
