diff --git a/src/food-market.public/src/components/SignupForm.tsx b/src/food-market.public/src/components/SignupForm.tsx index 7356ef1..b3afd50 100644 --- a/src/food-market.public/src/components/SignupForm.tsx +++ b/src/food-market.public/src/components/SignupForm.tsx @@ -103,13 +103,15 @@ export default function SignupForm({ defaultPlan = 'start' }: Props) { const focusFirstError = (errs: FieldErrors) => { const firstKey = FIELD_ORDER.find((k) => errs[k]) if (!firstKey) return - // На 1280×665 верхние поля часто выше вьюпорта — сначала проскроллим к полю, - // затем сфокусируем (focus сам по себе прокручивает неплавно/неточно). const el = document.getElementById(`signup-${firstKey}`) if (el) { + // Фокус СИНХРОННО, в рамках пользовательского жеста (pointerup/click/Enter). + // iOS Safari игнорирует программный перенос фокуса, отложенный через + // setTimeout или с уже открытой клавиатурой в другом поле, — поэтому + // focus() вызываем сразу. preventScroll убирает резкий прыжок, а плавную + // прокрутку к полю делаем отдельно. + el.focus({ preventScroll: true }) el.scrollIntoView({ behavior: 'smooth', block: 'center' }) - // Фокус после старта прокрутки — иначе браузер перебьёт плавный скролл. - setTimeout(() => el.focus({ preventScroll: true }), 150) } }