html { scroll-behavior: smooth; }

/* 1. Card/section entrance — slides in from the right, reverses on scroll up.
   Scoped to html.reveal-js so the page is never left invisible if the
   script cannot run. */
html.reveal-js [data-reveal] {
  opacity: 0;
  transform: translateX(90px);
  transition: opacity 0.8s cubic-bezier(0.16, 1, 0.3, 1),
              transform 0.8s cubic-bezier(0.16, 1, 0.3, 1);
  transition-delay: calc(var(--reveal-index, 0) * 100ms);
  will-change: transform, opacity;
}
html.reveal-js [data-reveal].is-visible {
  opacity: 1;
  transform: translateX(0);
}
@media (prefers-reduced-motion: reduce) {
  html.reveal-js [data-reveal] { opacity: 1; transform: none; transition: none; }
}

/* 2. Card hover — shadow + accent outline */
.card, .lift {
  transition: box-shadow 0.25s ease, outline-color 0.25s ease, transform 0.2s ease;
  outline: 2px solid transparent;
  outline-offset: 3px;
}
/* Cards set box-shadow inline, which beats an external rule — force it. */
.card:hover, .lift:hover {
  box-shadow: 0 24px 40px color-mix(in oklch, var(--color-text) 22%, transparent) !important;
  outline-color: var(--color-neutral-800);
  transform: translateY(-10px) !important;
}
.btn {
  border-radius: 14px;
  transition: box-shadow 0.2s ease, transform 0.2s ease, background 0.2s ease;
}
.btn:hover { box-shadow: var(--shadow-md) !important; transform: translateY(-3px) !important; }
.btn:active { transform: translateY(0); }

.input { border-radius: 10px; }

.blueprint { border: 0 !important; }
.corner { display: none !important; }

/* 3. Parallax image wrapper — the image needs slack to move within */
.parallax-wrap {
  overflow: hidden;
  position: relative;
}
.parallax-wrap img {
  position: absolute;
  top: -12%;
  left: 0;
  width: 100%;
  height: 124%;
  object-fit: cover;
  will-change: transform;
}


/* Deterministic scroll reveals: elements animate once when they enter view. */
[data-reveal],
[data-reveal-group] .reveal-child {
  will-change: opacity, transform;
}

[data-reveal-group] .reveal-child {
  transition-delay: calc(var(--reveal-index, 0) * 100ms);
}
