/* Pre-animation states exist only under html.js:not(.reduce). Reduced motion gets the finished page. */
html.js:not(.reduce) [data-fade] { opacity: 0; }
html.js:not(.reduce) .mh-t { clip-path: inset(0 100% 0 0); }
html.js:not(.reduce) .mast-rule { transform: scaleX(0); }
html.js:not(.reduce) .col-rule { transform: scaleY(0); }
html.js:not(.reduce) [data-settle] > :not(.col-rule) { opacity: 0; }
html.js:not(.reduce) [data-ink], html.js:not(.reduce) .sh-img { clip-path: inset(0 0 100% 0); }
html.js:not(.reduce) .strike, html.js:not(.reduce) .dbl { transform: scaleX(0); }
html.js:not(.reduce) .fb-b { opacity: 0; }
/* SplitText masks: keep descenders */
.wmask { padding-bottom: 0.16em; margin-bottom: -0.16em; }
/* Hero photograph: ink comes up as a CSS animation, so it starts at first paint */
html:not(.reduce) .photo-frame::after { animation: inkup 1100ms var(--ease-out) 250ms both; }
@keyframes inkup { from { opacity: 0.55; } to { opacity: 0; } }
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  .photo-frame::after { animation: none; }
  .tk-rail { animation: none !important; }
  .ticker[data-mode="single"] .tk-list li.on { animation: none; }
  .sticky-ear { transform: none; opacity: 0; transition: opacity 160ms ease, visibility 0s linear 160ms; }
  .sticky-ear[data-shown="true"] { opacity: 1; transition: opacity 160ms ease, visibility 0s; }
  dialog.slip, dialog.slip[open] { transform: none; transition-duration: 150ms; }
  @starting-style { dialog.slip[open] { transform: none; } }
  .blank { transition: none; }
  .buy, .btn-ink { transition: none; }
}
