/* Client-side validation feedback (Bootstrap-compatible) */
.was-validated .form-control.is-invalid,
.was-validated .form-select.is-invalid,
.form-control.is-invalid,
.form-select.is-invalid {
    border-color: var(--bs-form-invalid-border-color, #dc3545);
}

.is-invalid ~ .invalid-feedback,
.is-invalid + .invalid-feedback,
.was-validated .is-invalid ~ .invalid-feedback {
    display: block;
}

.invalid-feedback[data-fv-generated] {
    width: 100%;
    margin-top: 0.25rem;
    font-size: 0.875em;
    color: var(--bs-form-invalid-color, #dc3545);
}

.form-control.is-invalid:focus,
.form-select.is-invalid:focus {
    border-color: var(--bs-form-invalid-border-color, #dc3545);
    box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
}

/* Keep invalid fields visible below fixed headers when scrolling */
.form-control.is-invalid,
.form-select.is-invalid,
textarea.form-control.is-invalid {
    scroll-margin-top: 6rem;
    scroll-margin-bottom: 2rem;
}

/* Searchable dropdown invalid state */
.ssd-wrap:has(select.is-invalid) .ssd-input,
.ssd-input.is-invalid {
    border-color: var(--bs-form-invalid-border-color, #dc3545) !important;
}

.ssd-input.is-invalid:focus {
    border-color: var(--bs-form-invalid-border-color, #dc3545) !important;
    box-shadow: 0 0 0 0.25rem rgba(220, 53, 69, 0.25);
}
