/* Admin form guard (see js/form-guard.js): submit spinner + required-field feedback. */

.btn.ss-btn-loading,
.btn.ss-btn-loading:disabled {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: .5em;
    cursor: progress;
    opacity: .85;
    pointer-events: none;
}

.ss-btn-spinner {
    display: inline-block;
    flex: none;
    width: 1em;
    height: 1em;
    border: .15em solid currentColor;
    border-right-color: transparent;
    border-radius: 50%;
    animation: ss-btn-spin .7s linear infinite;
}

@keyframes ss-btn-spin {
    to { transform: rotate(360deg); }
}

@media (prefers-reduced-motion: reduce) {
    .ss-btn-spinner { animation-duration: 1.6s; }
}

form[aria-busy="true"] { cursor: progress; }

/* Controls the browser hides behind a replacement widget. */
.bootstrap-select.is-invalid > .dropdown-toggle,
.bootstrap-select.is-invalid > .btn {
    border-color: var(--bs-form-invalid-border-color, #dc3545) !important;
    box-shadow: 0 0 0 .2rem rgba(220, 53, 69, .15);
}

.cke.is-invalid { border-color: var(--bs-form-invalid-border-color, #dc3545) !important; }

/* Bootstrap only shows .invalid-feedback as a sibling of the field; ours may sit
   after an .input-group or a bootstrap-select wrapper instead. */
.invalid-feedback.ss-invalid-msg {
    display: block;
    font-size: .8125rem;
}
