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:
Macky
2026-08-08 17:00:09 +07:00
parent b41bfee03b
commit a04bc2add8
32 changed files with 95 additions and 62 deletions

View File

@@ -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>

View File

@@ -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>