:root {
	--fv-error: #ff4d4f;
	--fv-error-ring: rgba(255, 77, 79, 0.2);
	--fv-success: #52c41a;
	--fv-success-ring: rgba(82, 196, 26, 0.2);
	--fv-ease: cubic-bezier(0.645, 0.045, 0.355, 1);
}

/* เส้นขอบเปลี่ยนแบบนุ่ม ไม่กระชากตอนสลับสถานะ */
.form-control,
.form-select {
	transition: border-color 0.3s var(--fv-ease), box-shadow 0.3s var(--fv-ease);
}

/* ---------- สถานะผิดพลาด ---------- */

/* .form-control ของเว็บนี้ตั้ง border-width: 0 ไว้ ถ้าไม่คืนความหนาให้ กรอบสีจะไม่ขึ้นเลย */
.form-control.is-invalid,
.form-select.is-invalid {
	border-width: 1px;
	border-style: solid;
	border-color: var(--fv-error);
	/* ตัดไอคอนเครื่องหมายตกใจของ Bootstrap ออก ให้เรียบแบบ AntD */
	background-image: none;
	padding-right: 15px;
}

/* checkbox / radio วาดจุด-เครื่องหมายถูกด้วย background-image จึงแตะได้แค่สีเส้นขอบ */
.form-check-input.is-invalid {
	border-color: var(--fv-error);
}

.form-select.is-invalid {
	/* select ยังต้องเหลือลูกศร จึงคืน background เดิมของ Bootstrap ให้ */
	background-image: var(--bs-form-select-bg-img, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"));
	padding-right: 2.25rem;
}

.form-control.is-invalid:focus,
.form-select.is-invalid:focus {
	border-color: var(--fv-error);
	box-shadow: 0 0 0 2px var(--fv-error-ring);
}

/* ---------- สถานะถูกต้อง ---------- */

.form-control.is-valid,
.form-select.is-valid {
	border-width: 1px;
	border-style: solid;
	border-color: var(--fv-success);
	background-image: none;
	padding-right: 15px;
}

.form-check-input.is-valid {
	border-color: var(--fv-success);
}

.form-select.is-valid {
	background-image: var(--bs-form-select-bg-img, url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"));
	padding-right: 2.25rem;
}

.form-control.is-valid:focus,
.form-select.is-valid:focus {
	border-color: var(--fv-success);
	box-shadow: 0 0 0 2px var(--fv-success-ring);
}

/* ---------- ข้อความใต้ช่อง ---------- */

.invalid-feedback {
	font-size: 12px;
	line-height: 1.5;
	margin-top: 4px;
	color: var(--fv-error);
}

/* เฟดลงมาเบา ๆ ตอนขึ้น error ครั้งแรก */
.is-invalid ~ .invalid-feedback {
	animation: fv-fade-in 0.25s var(--fv-ease);
}

@keyframes fv-fade-in {
	from {
		opacity: 0;
		transform: translateY(-2px);
	}
	to {
		opacity: 1;
		transform: none;
	}
}

@media (prefers-reduced-motion: reduce) {
	.form-control,
	.form-select {
		transition: none;
	}

	.is-invalid ~ .invalid-feedback {
		animation: none;
	}
}
