Fix mobile password input issues and prevent iOS auto-zoom
Build And Push Image / docker (push) Successful in 3m21s
Details
Build And Push Image / docker (push) Successful in 3m21s
Details
- Add togglePasswordVisibility function with mobile-specific handling - Set font-size to 16px on password inputs to prevent iOS zoom - Add autocomplete="new-password" attribute to password fields - Increase tap target size for password visibility toggle on mobile - Configure viewport meta tag to disable zoom on iOS devices - Disable transitions on mobile for better performance
This commit is contained in:
parent
006d4cf1ff
commit
86a315f24c
|
|
@ -38,8 +38,10 @@
|
||||||
:rules="passwordRules"
|
:rules="passwordRules"
|
||||||
:error="!!errorMessage"
|
:error="!!errorMessage"
|
||||||
:append-inner-icon="showPassword ? 'mdi-eye' : 'mdi-eye-off'"
|
:append-inner-icon="showPassword ? 'mdi-eye' : 'mdi-eye-off'"
|
||||||
@click:append-inner="showPassword = !showPassword"
|
@click:append-inner="togglePasswordVisibility('password')"
|
||||||
class="mb-3"
|
class="mb-3 password-field"
|
||||||
|
autocomplete="new-password"
|
||||||
|
:autofocus="false"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<v-text-field
|
<v-text-field
|
||||||
|
|
@ -51,8 +53,10 @@
|
||||||
:rules="confirmPasswordRules"
|
:rules="confirmPasswordRules"
|
||||||
:error="!!errorMessage"
|
:error="!!errorMessage"
|
||||||
:append-inner-icon="showConfirmPassword ? 'mdi-eye' : 'mdi-eye-off'"
|
:append-inner-icon="showConfirmPassword ? 'mdi-eye' : 'mdi-eye-off'"
|
||||||
@click:append-inner="showConfirmPassword = !showConfirmPassword"
|
@click:append-inner="togglePasswordVisibility('confirm')"
|
||||||
class="mb-4"
|
class="mb-4 password-field"
|
||||||
|
autocomplete="new-password"
|
||||||
|
:autofocus="false"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<!-- Password Strength Indicator -->
|
<!-- Password Strength Indicator -->
|
||||||
|
|
@ -248,6 +252,28 @@ useHead({
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Toggle password visibility with debouncing on mobile
|
||||||
|
const togglePasswordVisibility = (field: 'password' | 'confirm') => {
|
||||||
|
// Prevent rapid toggling which can cause issues on mobile
|
||||||
|
if (mobileDetection.isMobile) {
|
||||||
|
// Use nextTick to defer the update
|
||||||
|
nextTick(() => {
|
||||||
|
if (field === 'password') {
|
||||||
|
showPassword.value = !showPassword.value;
|
||||||
|
} else {
|
||||||
|
showConfirmPassword.value = !showConfirmPassword.value;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// Immediate toggle on desktop
|
||||||
|
if (field === 'password') {
|
||||||
|
showPassword.value = !showPassword.value;
|
||||||
|
} else {
|
||||||
|
showConfirmPassword.value = !showConfirmPassword.value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Setup password function
|
// Setup password function
|
||||||
const setupPassword = async () => {
|
const setupPassword = async () => {
|
||||||
if (!formValid.value) return;
|
if (!formValid.value) return;
|
||||||
|
|
@ -311,6 +337,14 @@ onMounted(() => {
|
||||||
if (!email.value) {
|
if (!email.value) {
|
||||||
errorMessage.value = 'No email address provided. Please use the link from your verification email.';
|
errorMessage.value = 'No email address provided. Please use the link from your verification email.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Prevent auto-zoom on iOS when focusing input fields
|
||||||
|
if (mobileDetection.isIOS) {
|
||||||
|
const metaViewport = document.querySelector('meta[name="viewport"]');
|
||||||
|
if (metaViewport) {
|
||||||
|
metaViewport.setAttribute('content', 'width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no');
|
||||||
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
@ -405,4 +439,42 @@ onMounted(() => {
|
||||||
.v-progress-linear {
|
.v-progress-linear {
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Password field specific optimizations for mobile */
|
||||||
|
.password-field :deep(.v-field__input) {
|
||||||
|
font-size: 16px !important; /* Prevent zoom on iOS */
|
||||||
|
-webkit-text-fill-color: currentColor !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Prevent auto-zoom on focus for mobile Safari */
|
||||||
|
@media screen and (max-width: 768px) {
|
||||||
|
.password-field :deep(input) {
|
||||||
|
font-size: 16px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.password-field :deep(.v-field__append-inner) {
|
||||||
|
/* Make eye icon easier to tap on mobile */
|
||||||
|
min-width: 44px;
|
||||||
|
min-height: 44px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* iOS specific fixes to prevent zoom */
|
||||||
|
@supports (-webkit-touch-callout: none) {
|
||||||
|
.password-field :deep(input) {
|
||||||
|
font-size: 16px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disable transitions on mobile for better performance */
|
||||||
|
.is-mobile .password-field :deep(.v-field__append-inner) {
|
||||||
|
transition: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.is-mobile .password-field :deep(.v-icon) {
|
||||||
|
transition: none !important;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue