[v-cloak] { display: none; }
* { font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif; box-sizing: border-box; }

html, body { overflow-x: hidden; }

.fade-enter-active, .fade-leave-active { transition: opacity 0.15s ease, transform 0.15s ease; }
.fade-enter-from, .fade-leave-to { opacity: 0; transform: translateY(-6px) scale(0.98); }

.project-card img { transition: transform 0.3s ease; }
.project-card:hover img { transform: scale(1.04); }

::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-track { background: transparent; }
::-webkit-scrollbar-thumb { background: #d1d5db; border-radius: 99px; }

/* Prevent iOS Safari auto-zoom on focus */
@media (max-width: 640px) {
  input, textarea, select { font-size: 16px !important; }
  /* Hide scrollbar but keep scrolling on horizontal step bar */
  .hide-scrollbar::-webkit-scrollbar { display: none; }
  .hide-scrollbar { -ms-overflow-style: none; scrollbar-width: none; }
}

/* Gift icon in the onboarding reward badge. A slow breathe rather than a
   bounce — it should pull the eye once, not compete with the CTA below it. */
@keyframes gift-pulse {
  0%, 100% { transform: scale(1)    rotate(0deg); }
  50%      { transform: scale(1.12) rotate(-5deg); }
}
.gift-pulse { animation: gift-pulse 2.4s ease-in-out infinite; transform-origin: center; }

/* Users who ask the OS for less motion get a static icon. */
@media (prefers-reduced-motion: reduce) {
  .gift-pulse { animation: none; }
}

/* Onboarding card: never taller than the viewport, so a long option list
   scrolls inside the card instead of running off the bottom of the screen.
   dvh where supported — on mobile 100vh includes the collapsing URL bar and
   overshoots the visible area by ~60px. */
.modal-viewport { max-height: calc(100vh - 2rem); }
@supports (height: 100dvh) {
  .modal-viewport { max-height: calc(100dvh - 2rem); }
}
