Files
pictureFrame-webApp/templates/security/login.html.twig
T
football2801 0e4d78471b
CI / test (push) Has been cancelled
fix(design-v2): apply v2 styles to login template
Twig login page was hardcoded with v1 cream/terracotta colors and had
no [data-design=v2] overrides. Cookie + html attribute injection were
working but had nothing to style off. Adding v2 overrides inline so
the login page matches the v2 register the rest of the app uses.

Default v2 palette on login uses ocean-dusk values (navy + cream text +
yellow V brand) since user isn't logged in yet so we can't read their
theme preference.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 15:19:41 -04:00

164 lines
6.2 KiB
Twig

<!DOCTYPE html>
<html lang="en" data-design="{{ app.request.cookies.get('wevisto_design')|default('v1') }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/svg+xml" href="/build/favicon.svg?v=20260515-vviewfinder">
<link rel="icon" type="image/png" sizes="32x32" href="/build/icons/favicon-32.png?v=20260515-vviewfinder">
<link rel="icon" type="image/png" sizes="16x16" href="/build/icons/favicon-16.png?v=20260515-vviewfinder">
<link rel="apple-touch-icon" sizes="180x180" href="/build/icons/apple-touch-icon.png?v=20260515-vviewfinder">
<title>Sign in — WeVisto</title>
<style>
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
font-family: system-ui, sans-serif;
display: flex;
align-items: center;
justify-content: center;
min-height: 100dvh;
background: #fdf6ee;
color: #3a2e22;
}
.card {
width: 100%;
max-width: 380px;
margin: 1rem;
padding: 2rem;
background: #fff9f2;
border-radius: 16px;
border: 1px solid #e8d9c4;
}
h1 { font-size: 1.4rem; font-weight: 700; margin-bottom: 1.5rem; }
.field { margin-bottom: 1rem; }
label { display: block; font-size: 0.8125rem; font-weight: 600; color: #8a7060; margin-bottom: 0.375rem; }
input[type="email"],
input[type="password"] {
width: 100%;
min-height: 44px;
padding: 0 0.875rem;
border: 1px solid #e8d9c4;
border-radius: 10px;
background: #fff;
font-size: 1rem;
color: #3a2e22;
transition: border-color 0.15s;
}
input:focus { outline: none; border-color: #c97c3a; }
input[aria-invalid="true"] { border-color: #c0392b; }
.field-error {
margin-top: 0.25rem;
font-size: 0.8125rem;
color: #c0392b;
min-height: 1.2em;
}
.btn {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
min-height: 44px;
margin-top: 1.25rem;
background: #c97c3a;
color: #fff;
border: none;
border-radius: 9999px;
font-size: 1rem;
font-weight: 700;
cursor: pointer;
transition: opacity 0.15s;
}
.btn:hover { opacity: 0.9; }
.register-link { display: block; text-align: center; margin-top: 1rem; font-size: 0.875rem; color: #8a7060; }
.register-link a { color: #c97c3a; text-decoration: none; font-weight: 600; }
.logo-badge { display: block; width: 88px; height: 88px; margin: 0 auto 1.25rem; border-radius: 14px; overflow: hidden; border: 1px solid #e8d9c4; box-shadow: 0 2px 10px rgba(0,0,0,.06); }
.logo-badge img { display: block; width: 100%; height: 100%; }
/* ── v2 (atmospheric dusks) overrides ── */
@import url('https://fonts.googleapis.com/css2?family=Marcellus&family=Cormorant+Garamond:ital@0;1&display=swap');
[data-design="v2"] body {
background: radial-gradient(ellipse 90% 70% at 50% 30%, #142a40 0%, transparent 70%), #06121f;
color: #f4eed8;
}
[data-design="v2"] .card {
background: #0e2030;
border: 1px solid rgba(180,210,235,0.20);
box-shadow: 0 24px 48px -16px rgba(0,0,0,0.6);
}
[data-design="v2"] h1 {
font-family: 'Marcellus', Georgia, serif;
font-weight: 400;
color: #f4eed8;
}
[data-design="v2"] label {
color: #b8c8d8;
font-size: 0.7rem;
letter-spacing: 0.18em;
text-transform: uppercase;
}
[data-design="v2"] input[type="email"],
[data-design="v2"] input[type="password"] {
background: rgba(0,0,0,0.3);
border-color: rgba(180,210,235,0.20);
color: #f4eed8;
}
[data-design="v2"] input:focus { border-color: #f0d000; }
[data-design="v2"] .btn {
background: #4e9fc8;
color: #06121f;
}
[data-design="v2"] .field-error { color: #e08070; }
[data-design="v2"] .register-link { color: #b8c8d8; font-family: 'Cormorant Garamond', Georgia, serif; font-style: italic; }
[data-design="v2"] .register-link a { color: #f0d000; font-style: normal; }
[data-design="v2"] .logo-badge {
border-color: rgba(180,210,235,0.20);
box-shadow: 0 6px 18px -4px rgba(0,0,0,0.5);
}
</style>
</head>
<body>
<div class="card">
<a href="/" class="logo-badge" aria-label="WeVisto"><img src="/build/logo.svg" alt=""></a>
<h1>Sign in</h1>
<form method="post" novalidate>
<div class="field">
<label for="inputEmail">Email address</label>
<input
type="email"
id="inputEmail"
name="_username"
value="{{ last_username }}"
autocomplete="email"
aria-describedby="login-error"
{% if error %}aria-invalid="true"{% endif %}
autofocus
>
</div>
<div class="field">
<label for="inputPassword">Password</label>
<input
type="password"
id="inputPassword"
name="_password"
autocomplete="current-password"
aria-describedby="login-error"
{% if error %}aria-invalid="true"{% endif %}
>
{% if error %}
<p id="login-error" class="field-error" role="alert">Incorrect email or password</p>
{% else %}
<p id="login-error" class="field-error"></p>
{% endif %}
</div>
<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
<button type="submit" class="btn">Sign in</button>
</form>
<p class="register-link">Don't have an account? <a href="/register">Create one</a></p>
</div>
</body>
</html>