fix(ui): widen login/setup forms so inputs don't truncate text; line icons
- Login card 360->460px (max-width:100%), wider inputs (46px, 15px, more padding), mobile side padding; eye-toggles -> lucide Eye/EyeOff line icons (no emoji). - Setup card 380->460px (max-width:100%), wider inputs, Lock line icon instead of emoji. Rebuilt dist.
This commit is contained in:
@@ -1,19 +1,23 @@
|
||||
<template>
|
||||
<div class="login-wrap">
|
||||
<div class="card login-card">
|
||||
<h1>🎯 {{ i18n.t('app') }}</h1>
|
||||
<h1>{{ i18n.t('app') }}</h1>
|
||||
<p class="muted" style="margin-top:-8px">Sales training simulator</p>
|
||||
|
||||
<label>{{ i18n.t('username') }}</label>
|
||||
<input v-model="username" type="text" autocomplete="username" @keyup.enter="submit" />
|
||||
<input v-model="username" type="text" autocomplete="username" placeholder="username" class="wide" @keyup.enter="submit" />
|
||||
|
||||
<label>{{ i18n.t('password') }}</label>
|
||||
<div class="pw-wrap">
|
||||
<input v-model="password" :type="showPw ? 'text' : 'password'" autocomplete="current-password" @keyup.enter="submit" />
|
||||
<input v-model="password" :type="showPw ? 'text' : 'password'" autocomplete="current-password" placeholder="••••••••" class="wide" @keyup.enter="submit" />
|
||||
<button type="button" class="pw-toggle" @click="showPw = !showPw" :aria-label="showPw ? 'Hide password' : 'Show password'">
|
||||
{{ showPw ? '🙈' : '👁' }}
|
||||
<EyeOff v-if="showPw" :size="20" :stroke-width="1.8" />
|
||||
<Eye v-else :size="20" :stroke-width="1.8" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="error" role="alert" v-if="error">{{ error }}</div>
|
||||
<button class="primary" style="width:100%;margin-top:16px" :disabled="loading || !username || !password" @click="submit">
|
||||
<button class="primary" style="width:100%;margin-top:18px" :disabled="loading || !username || !password" @click="submit">
|
||||
<span v-if="loading" class="spinner"></span>
|
||||
<span v-else>{{ i18n.t('login') }}</span>
|
||||
</button>
|
||||
@@ -24,6 +28,7 @@
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
import { Eye, EyeOff } from 'lucide-vue-next'
|
||||
import { auth } from '../store/auth'
|
||||
import { i18n } from '../i18n'
|
||||
|
||||
@@ -55,12 +60,24 @@ async function submit() {
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.login-wrap { display: flex; justify-content: center; padding-top: 10vh; }
|
||||
.login-card { width: 360px; }
|
||||
h1 { margin-top: 0; }
|
||||
.login-wrap {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
padding-top: 8vh;
|
||||
padding-left: 16px;
|
||||
padding-right: 16px;
|
||||
}
|
||||
/* Wider card so inputs don't truncate / cut text */
|
||||
.login-card { width: 460px; max-width: 100%; padding: 28px 30px; }
|
||||
h1 { margin-top: 0; font-size: 24px; }
|
||||
/* Full-width, uncramped inputs (global input already width:100%) */
|
||||
.wide { width: 100%; min-height: 46px; font-size: 15px; padding: 12px 14px; }
|
||||
.pw-wrap { position: relative; }
|
||||
.pw-wrap input { padding-right: 48px; }
|
||||
.pw-toggle {
|
||||
position: absolute; right: 4px; top: 50%; transform: translateY(-50%);
|
||||
background: transparent; border: none; padding: 6px; min-height: 36px; cursor: pointer;
|
||||
background: transparent; border: none; padding: 8px; min-height: 40px; cursor: pointer;
|
||||
color: var(--muted);
|
||||
}
|
||||
.pw-toggle:hover { color: var(--ink); }
|
||||
</style>
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
<template>
|
||||
<div class="setup-wrap">
|
||||
<div class="card setup-card">
|
||||
<h1>🔐 {{ i18n.t('setupTitle') }}</h1>
|
||||
<h1><Lock :size="22" :stroke-width="1.8" style="vertical-align:-4px" /> {{ i18n.t('setupTitle') }}</h1>
|
||||
<p class="muted">{{ i18n.t('setupSubtitle') }} <strong>{{ auth.user?.name || auth.user?.username }}</strong></p>
|
||||
|
||||
<label>{{ i18n.t('email') }}</label>
|
||||
<input v-model="email" type="email" autocomplete="email" @keyup.enter="submit" />
|
||||
<input v-model="email" type="email" autocomplete="email" class="wide" @keyup.enter="submit" />
|
||||
|
||||
<label>{{ i18n.t('newPassword') }}</label>
|
||||
<input v-model="password" type="password" autocomplete="new-password" @keyup.enter="submit" />
|
||||
<input v-model="password" type="password" autocomplete="new-password" class="wide" @keyup.enter="submit" />
|
||||
|
||||
<label>{{ i18n.t('confirmPassword') }}</label>
|
||||
<input v-model="confirm" type="password" autocomplete="new-password" @keyup.enter="submit" />
|
||||
<input v-model="confirm" type="password" autocomplete="new-password" class="wide" @keyup.enter="submit" />
|
||||
|
||||
<div class="error" role="alert" v-if="error">{{ error }}</div>
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
<script setup>
|
||||
import { ref } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { Lock } from 'lucide-vue-next'
|
||||
import { auth } from '../store/auth'
|
||||
import { i18n } from '../i18n'
|
||||
|
||||
@@ -59,7 +60,11 @@ async function submit() {
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.setup-wrap { display: flex; justify-content: center; padding-top: 8vh; }
|
||||
.setup-card { width: 380px; }
|
||||
h1 { margin-top: 0; }
|
||||
.setup-wrap {
|
||||
display: flex; justify-content: center; padding-top: 8vh;
|
||||
padding-left: 16px; padding-right: 16px;
|
||||
}
|
||||
.setup-card { width: 460px; max-width: 100%; padding: 28px 30px; }
|
||||
h1 { margin-top: 0; font-size: 24px; }
|
||||
.wide { width: 100%; min-height: 46px; font-size: 15px; padding: 12px 14px; }
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user