/* ============================================================
   ULTRAEASE — BASE
   Reset + shared motion primitives. Page-level type scale and
   layout (.wrap, headings) stay per-page — the homepage and the
   PDP intentionally run slightly different scales.
   ============================================================ */
*{box-sizing:border-box;margin:0;padding:0}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}
button{font-family:inherit}
::selection{background:rgba(23,187,176,.28)}

/* Keyboard focus — visible ring for tab navigation, none for mouse clicks */
:focus-visible{outline:2px solid var(--turq);outline-offset:3px;border-radius:2px}
:focus:not(:focus-visible){outline:none}

/* Reveal on scroll — slide + fade in (no blur). js/site.js adds .in via IntersectionObserver. */
.reveal{opacity:0;transform:translateY(30px);
  transition:opacity 1.1s cubic-bezier(.2,.8,.2,1),transform 1.1s cubic-bezier(.2,.8,.2,1)}
.reveal.in{opacity:1;transform:none}
/* Word-by-word reveal for headlines — staggered slide in */
.reveal-words .word{display:inline-block;opacity:0;transform:translateY(0.55em);
  transition:opacity 0.85s cubic-bezier(.2,.8,.2,1),transform 0.85s cubic-bezier(.2,.8,.2,1);
  transition-delay:calc(var(--w,0) * 70ms)}
.reveal-words.in .word{opacity:1;transform:none}
.ln{display:block;white-space:nowrap}

@media (prefers-reduced-motion:reduce){
  .reveal{opacity:1;transform:none;filter:none;transition:none}
  .reveal-words .word{opacity:1;transform:none;filter:none;transition:none}
}

/* iOS zooms the page when a focused input is under 16px — bump only on small screens
   so the desktop type scale stays untouched. */
@media (max-width:600px){
  form input[type="email"]{font-size:16px}
}

/* Form success state — js/site.js swaps the submit label and locks the form */
form.is-done button[type="submit"]{pointer-events:none;
  background:linear-gradient(135deg,#15A89F 0%,#0E665F 100%)}
form.is-done input{pointer-events:none;opacity:.6}
