/* Estados compartidos de formularios: respuesta inmediata y accesible. */
:where(.form-submit, .fin-btn, .cv-submit-btn, .re-btn, .submit-btn) {
  position: relative;
  isolation: isolate;
  transition: transform .2s ease, opacity .2s ease, filter .2s ease;
}

:where(.form-submit, .fin-btn, .cv-submit-btn, .re-btn, .submit-btn):not(:disabled):hover {
  transform: translateY(-2px);
}

:where(.form-submit, .fin-btn, .cv-submit-btn, .re-btn, .submit-btn):focus-visible,
:where(.form-inp, .fin-in, .re-input, .form-input, #cvComment):focus-visible {
  outline: 3px solid rgba(42, 156, 199, .35);
  outline-offset: 3px;
}

:where(.form-submit, .fin-btn, .cv-submit-btn, .re-btn, .submit-btn).is-loading {
  cursor: progress;
  pointer-events: none;
  padding-left: 2.9em;
}

:where(.form-submit, .fin-btn, .cv-submit-btn, .re-btn, .submit-btn).is-loading::before {
  content: '';
  position: absolute;
  left: 1.1em;
  top: 50%;
  z-index: 2;
  width: .85em;
  height: .85em;
  margin-top: -.48em;
  border: 2px solid currentColor;
  border-right-color: transparent;
  border-radius: 50%;
  animation: hekaFormSpin .7s linear infinite;
}

:where(.form-submit, .fin-btn, .cv-submit-btn, .re-btn, .submit-btn).is-loading > svg,
:where(.form-submit, .fin-btn, .cv-submit-btn, .re-btn, .submit-btn).is-loading > span {
  opacity: .55;
}

.form-feedback-status,
.contact-toast.ff-status-visible,
.fin-form-err.ff-status-visible,
.cv-error.ff-status-visible,
.re-error.ff-status-visible {
  animation: hekaFeedbackIn .35s cubic-bezier(.2, .8, .2, 1) both;
}

.contact-toast.ff-status-visible,
.fin-form-err.ff-status-visible,
.cv-error.ff-status-visible,
.re-error.ff-status-visible {
  padding: .7rem .85rem;
  border-radius: .5rem;
  border-left: 3px solid currentColor;
  background: rgba(226, 75, 75, .08);
}

#ct-success.ff-status-visible,
.cv-success.ff-status-visible,
.fin-form-ok.ff-status-visible {
  animation: hekaFeedbackIn .45s cubic-bezier(.2, .8, .2, 1) both, hekaSuccessGlow 2.4s ease-out 1;
}

#ct-success.ff-status-visible {
  background: rgba(42, 156, 199, .09);
  border-left-color: currentColor;
}

.inp-error, .fin-in-err, .re-input[aria-invalid='true'] {
  animation: hekaFieldNudge .34s ease both;
}

.cv-progress.ff-status-visible .cv-progress-bar {
  transition: width .35s ease;
}

@keyframes hekaFormSpin { to { transform: rotate(360deg); } }
@keyframes hekaFeedbackIn { from { opacity: 0; transform: translateY(-7px); } to { opacity: 1; transform: translateY(0); } }
@keyframes hekaSuccessGlow { 0% { box-shadow: 0 0 0 0 rgba(42, 156, 199, .32); } 100% { box-shadow: 0 0 0 14px rgba(42, 156, 199, 0); } }
@keyframes hekaFieldNudge { 0%,100% { transform: translateX(0); } 30% { transform: translateX(-4px); } 70% { transform: translateX(4px); } }

@media (prefers-reduced-motion: reduce) {
  :where(.form-submit, .fin-btn, .cv-submit-btn, .re-btn, .submit-btn),
  :where(.form-submit, .fin-btn, .cv-submit-btn, .re-btn, .submit-btn):not(:disabled):hover { transition: none; transform: none; }
  :where(.form-submit, .fin-btn, .cv-submit-btn, .re-btn, .submit-btn).is-loading::before,
  .contact-toast.ff-status-visible, .fin-form-err.ff-status-visible, .cv-error.ff-status-visible, .re-error.ff-status-visible,
  #ct-success.ff-status-visible, .cv-success.ff-status-visible, .fin-form-ok.ff-status-visible, .inp-error, .fin-in-err, .re-input[aria-invalid='true'] { animation: none; }
}
