/* pubx motion 1.0 — scroll-triggered reveals. Visible-by-default: nothing here applies unless the head gate added html.mo (IntersectionObserver present, no reduced-motion). Compositor-only properties. PUBXMO1 */
html.mo{--mo-y:14px;--mo-d:.6s;--mo-st:60ms;--mo-e:var(--ease-enter,cubic-bezier(.16,1,.3,1))}
.pub-docketjournal{--mo-y:10px;--mo-d:.72s;--mo-st:70ms}
.pub-siteworkjournal{--mo-y:20px;--mo-d:.5s;--mo-st:50ms;--mo-e:cubic-bezier(.2,.75,.2,1)}
.pub-servicecallwire{--mo-y:12px;--mo-d:.38s;--mo-st:40ms;--mo-e:cubic-bezier(.25,.9,.3,1)}
.pub-headcountjournal{--mo-y:14px;--mo-d:.78s;--mo-st:90ms}

/* hero text: hidden only until motion.js (or the head fail-safe timer) adds .mo-ready */
html.mo .hero-in{transition:opacity var(--mo-d) var(--mo-e),transform var(--mo-d) var(--mo-e)}
html.mo .hero-in--2{transition-delay:90ms}
html.mo .hero-in--3{transition-delay:180ms}
html.mo:not(.mo-ready) .hero-in{opacity:0 !important;transform:translate3d(0,8px,0) !important}

/* scroll reveals: motion.js marks below-fold elements .mo-el, IO adds .mo-in, both classes are removed after the transition */
html.mo .mo-el{opacity:0 !important;transform:translate3d(0,var(--mo-y),0) !important;transition:opacity var(--mo-d) var(--mo-e),transform var(--mo-d) var(--mo-e);transition-delay:calc(var(--mo-i,0) * var(--mo-st))}
html.mo .pub-headcountjournal .mo-el{transform:translate3d(0,var(--mo-y),0) scale(.985) !important}
html.mo .mo-el.mo-in{opacity:1 !important;transform:translate3d(0,0,0) !important}

/* article body blocks: small, quick, no stagger - reading must never wait on motion */
html.mo .article__body > .mo-el{--mo-y:6px;--mo-d:.32s;transition-delay:0s}

/* card artwork settles as its card reveals */
html.mo .mo-el .card__media img{transform:scale(1.045);transition:transform calc(var(--mo-d) * 1.6) var(--mo-e)}
html.mo .mo-el.mo-in .card__media img{transform:scale(1)}

/* section rules draw in with their heading */
html.mo .mo-el.section__head::after{transform:scaleX(0);transform-origin:left;transition:transform calc(var(--mo-d) * 1.4) var(--mo-e) 120ms}
html.mo .mo-el.mo-in.section__head::after{transform:scaleX(1)}

/* reading progress on articles (JS-driven, transform only) */
.mo-progress{position:fixed;left:0;top:0;height:2px;width:100%;background:var(--accent,#333);transform:scaleX(0);transform-origin:left;z-index:60;pointer-events:none}
.pub-servicecallwire .mo-progress{height:3px}

/* card hover (restored): lift + image drift, pointer devices only */
@media (hover:hover) and (prefers-reduced-motion:no-preference){
  .card{transition:transform .32s var(--mo-e,ease),box-shadow .32s ease}
  .card:hover{transform:translateY(-3px)}
  .pub-servicecallwire .card:hover{transform:translateY(-2px) rotate(-.15deg)}
  .card:hover .card__media img{transform:scale(1.03)}
  .card__media img{transition:transform .5s var(--mo-e,ease)}
  .signup__form button,.section__more,.launch__list a{transition:transform .22s ease,opacity .22s ease}
  .signup__form button:hover{transform:translateY(-1px)}
  .section__more:hover,.launch__list a:hover{transform:translateX(3px)}
}

@media (max-width:720px){html.mo{--mo-y:8px;--mo-d:.42s;--mo-st:40ms}html.mo .hero-in--2{transition-delay:60ms}html.mo .hero-in--3{transition-delay:120ms}}
@media (prefers-reduced-motion:reduce){html.mo .mo-el,html.mo:not(.mo-ready) .hero-in{opacity:1 !important;transform:none !important;transition:none !important}.mo-progress{display:none}}
@media print{html.mo .mo-el,html.mo:not(.mo-ready) .hero-in{opacity:1 !important;transform:none !important}.mo-progress{display:none}}