/* Motion for static copies of Framer pages (scripts/capture-framer-static.mjs).
   Ticker lists hold their items twice; shifting by one copy plus half a gap loops seamlessly. */
.fs-ticker { will-change: transform; }
/* Size the list to its content so -50% is exactly one copy of the items. */
.fs-ticker-x { width: max-content !important; max-width: none !important; flex: none !important; animation: fs-ticker-x var(--fs-duration, 30s) linear infinite; }
.fs-ticker-y { height: max-content !important; max-height: none !important; flex: none !important; animation: fs-ticker-y var(--fs-duration, 30s) linear infinite; }
.fs-ticker:hover { animation-play-state: paused; }
@keyframes fs-ticker-x { to { transform: translateX(calc(-50% - var(--fs-gap, 0px) / 2)); } }
@keyframes fs-ticker-y { to { transform: translateY(calc(-50% - var(--fs-gap, 0px) / 2)); } }
@media (prefers-reduced-motion: reduce) { .fs-ticker { animation: none; } }
/* Framer marks some wide blocks (the pricing table) overscroll-behavior: contain. On phones
   they have nothing to scroll vertically, and iOS then stops the page scrolling under a finger
   on them. Let vertical swipes reach the page. */
[data-framer-name] { overscroll-behavior-y: auto !important; }
/* Timed variant cycles (states.js): animate the size changes between variants. */
[data-fs-cycle] [class*="-container"], [data-fs-cycle] [data-framer-name] { transition: width .6s cubic-bezier(.25,.8,.25,1), height .6s cubic-bezier(.25,.8,.25,1), opacity .4s ease; }
