← back to Dw Theme Hamburger
templates/customers/login.liquid
399 lines
<style>
/* ── DW Professional Login ─────────────────────────────────────────────── */
.dw-login-wrapper {
display: flex;
justify-content: center;
align-items: center;
min-height: 60vh;
padding: 40px 20px;
font-family: Lora, serif;
}
.dw-login-card {
width: 100%;
max-width: 440px;
background: #fff;
border: 1px solid #e4e4e4;
border-radius: 4px;
padding: 48px 40px;
box-shadow: 0 2px 12px rgba(0,0,0,0.06);
}
.dw-login-card h1 {
font-family: Lora, serif;
font-weight: 400;
font-size: 1.75rem;
color: #000;
text-align: center;
margin: 0 0 6px 0;
letter-spacing: 0.02em;
}
.dw-login-subtitle {
text-align: center;
font-size: 0.9rem;
color: #787878;
margin: 0 0 32px 0;
font-family: Lora, serif;
}
/* ── Google Button ──────────────────────────────────────────────────────── */
.dw-google-btn {
display: flex;
align-items: center;
justify-content: center;
gap: 10px;
width: 100%;
padding: 13px 20px;
background: #fff;
border: 1px solid #dadce0;
border-radius: 3px;
cursor: pointer;
font-family: Lora, serif;
font-size: 0.95rem;
color: #3c4043;
letter-spacing: 0.01em;
transition: background 0.15s ease, box-shadow 0.15s ease;
}
.dw-google-btn:hover {
background: #f7f8f8;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
.dw-google-btn svg {
flex-shrink: 0;
}
/* ── Divider ────────────────────────────────────────────────────────────── */
.dw-divider {
display: flex;
align-items: center;
margin: 28px 0;
gap: 16px;
}
.dw-divider-line {
flex: 1;
height: 1px;
background: #e4e4e4;
}
.dw-divider-text {
font-family: Lora, serif;
font-size: 0.8rem;
color: #999;
text-transform: uppercase;
letter-spacing: 0.1em;
}
/* ── Form Fields ────────────────────────────────────────────────────────── */
.dw-field {
margin-bottom: 20px;
}
.dw-field label {
display: block;
font-family: Lora, serif;
font-size: 0.82rem;
font-weight: 400;
color: #444;
margin-bottom: 6px;
letter-spacing: 0.03em;
text-transform: uppercase;
}
.dw-field input[type="text"],
.dw-field input[type="email"],
.dw-field input[type="password"] {
width: 100%;
padding: 12px 14px;
border: 1px solid #e4e4e4;
border-radius: 3px;
font-family: Lora, serif;
font-size: 0.95rem;
color: #444;
background: #fff;
transition: border-color 0.15s ease;
box-sizing: border-box;
}
.dw-field input:focus {
outline: none;
border-color: #b08212;
box-shadow: 0 0 0 1px #b08212;
}
.dw-field input::placeholder {
color: #bbb;
}
/* ── Submit Button ──────────────────────────────────────────────────────── */
.dw-submit-btn {
width: 100%;
padding: 14px 20px;
background: #b08212;
color: #fff;
border: none;
border-radius: 3px;
font-family: Lora, serif;
font-size: 0.9rem;
font-weight: 400;
text-transform: uppercase;
letter-spacing: 0.05em;
cursor: pointer;
transition: background 0.15s ease;
margin-top: 4px;
}
.dw-submit-btn:hover {
background: #96700f;
}
/* ── Links ──────────────────────────────────────────────────────────────── */
.dw-forgot-link {
display: block;
text-align: right;
font-family: Lora, serif;
font-size: 0.82rem;
color: #b08212;
text-decoration: none;
margin-top: -12px;
margin-bottom: 24px;
cursor: pointer;
transition: color 0.15s ease;
}
.dw-forgot-link:hover {
color: #96700f;
text-decoration: underline;
}
.dw-register-section {
text-align: center;
margin-top: 28px;
padding-top: 24px;
border-top: 1px solid #e4e4e4;
}
.dw-register-section p {
font-family: Lora, serif;
font-size: 0.88rem;
color: #787878;
margin: 0 0 12px 0;
}
.dw-register-link {
display: inline-block;
font-family: Lora, serif;
font-size: 0.85rem;
font-weight: 400;
color: #b08212;
text-decoration: none;
text-transform: uppercase;
letter-spacing: 0.05em;
padding: 10px 28px;
border: 1px solid #b08212;
border-radius: 3px;
transition: all 0.15s ease;
}
.dw-register-link:hover {
background: #b08212;
color: #fff;
}
/* ── Error Banner ───────────────────────────────────────────────────────── */
.dw-error {
background: #fef2f2;
border: 1px solid #fca5a5;
color: #991b1b;
font-family: Lora, serif;
font-size: 0.85rem;
padding: 12px 16px;
border-radius: 3px;
margin-bottom: 20px;
text-align: center;
}
.dw-success {
background: #f0fdf4;
border: 1px solid #86efac;
color: #166534;
font-family: Lora, serif;
font-size: 0.85rem;
padding: 12px 16px;
border-radius: 3px;
margin-bottom: 20px;
text-align: center;
}
/* ── Recover Password Panel ─────────────────────────────────────────────── */
.dw-recover-panel {
display: none;
}
.dw-recover-panel.active {
display: block;
}
.dw-login-panel.hidden {
display: none;
}
.dw-recover-panel p {
font-family: Lora, serif;
font-size: 0.88rem;
color: #787878;
text-align: center;
margin: 0 0 24px 0;
}
.dw-back-link {
display: block;
text-align: center;
font-family: Lora, serif;
font-size: 0.85rem;
color: #b08212;
text-decoration: none;
margin-top: 16px;
cursor: pointer;
}
.dw-back-link:hover {
text-decoration: underline;
}
/* ── Guest Checkout ─────────────────────────────────────────────────────── */
.dw-guest-section {
text-align: center;
margin-top: 20px;
}
.dw-guest-section p {
font-family: Lora, serif;
font-size: 0.85rem;
color: #787878;
margin: 0 0 10px 0;
}
.dw-guest-btn {
display: inline-block;
font-family: Lora, serif;
font-size: 0.85rem;
color: #444;
text-transform: uppercase;
letter-spacing: 0.05em;
padding: 10px 28px;
border: 1px solid #e4e4e4;
border-radius: 3px;
background: transparent;
cursor: pointer;
transition: all 0.15s ease;
}
.dw-guest-btn:hover {
border-color: #444;
}
/* ── Responsive ─────────────────────────────────────────────────────────── */
@media (max-width: 520px) {
.dw-login-card {
padding: 36px 24px;
}
.dw-login-card h1 {
font-size: 1.5rem;
}
}
</style>
<div class="dw-login-wrapper">
<div class="dw-login-card">
<!-- ── Login Panel ──────────────────────────────────────────────────── -->
<div class="dw-login-panel" id="dw-login-panel">
<h1>{{ 'customers.login.header' | t }}</h1>
<p class="dw-login-subtitle">Sign in to your Designer Wallcoverings account</p>
<!-- Google Login -->
<button type="button" class="dw-google-btn" onclick="window.location.href='/auth/login?provider=google';" aria-label="Sign in with Google">
<svg width="18" height="18" viewBox="0 0 48 48"><path fill="#EA4335" d="M24 9.5c3.54 0 6.71 1.22 9.21 3.6l6.85-6.85C35.9 2.38 30.47 0 24 0 14.62 0 6.51 5.38 2.56 13.22l7.98 6.19C12.43 13.72 17.74 9.5 24 9.5z"/><path fill="#4285F4" d="M46.98 24.55c0-1.57-.15-3.09-.38-4.55H24v9.02h12.94c-.58 2.96-2.26 5.48-4.78 7.18l7.73 6c4.51-4.18 7.09-10.36 7.09-17.65z"/><path fill="#FBBC05" d="M10.53 28.59a14.5 14.5 0 0 1 0-9.18l-7.98-6.19a24.01 24.01 0 0 0 0 21.56l7.98-6.19z"/><path fill="#34A853" d="M24 48c6.48 0 11.93-2.13 15.89-5.81l-7.73-6c-2.15 1.45-4.92 2.3-8.16 2.3-6.26 0-11.57-4.22-13.47-9.91l-7.98 6.19C6.51 42.62 14.62 48 24 48z"/><path fill="none" d="M0 0h48v48H0z"/></svg>
Continue with Google
</button>
<!-- Divider -->
<div class="dw-divider">
<div class="dw-divider-line"></div>
<span class="dw-divider-text">or sign in with email</span>
<div class="dw-divider-line"></div>
</div>
<!-- Standard Login Form -->
{% form 'customer_login' %}
{% if form.errors %}
<div class="dw-error">{{ 'customers.login.error' | t }}</div>
{% endif %}
<div class="dw-field">
<label for="customer_email">{{ 'general.general.email' | t }}</label>
<input type="email" id="customer_email" name="customer[email]" value="{{ form.email }}" placeholder="you@example.com" autocomplete="email" autofocus>
</div>
<div class="dw-field">
<label for="customer_password">{{ 'general.general.password' | t }}</label>
<input type="password" id="customer_password" name="customer[password]" placeholder="••••••••" autocomplete="current-password">
</div>
<a class="dw-forgot-link" id="dw-forgot-toggle">{{ 'customers.login.forgot_your_password' | t }}</a>
<input type="submit" class="dw-submit-btn" value="{{ 'customers.login.submit' | t }}">
{% endform %}
<!-- Register / New Customer -->
{% if shop.checkout.guest_login %}
<div class="dw-guest-section">
{% form 'guest_login' %}
<p>{{ 'customers.guest_checkout.message' | t }}</p>
<input type="submit" class="dw-guest-btn" value="{{ 'customers.guest_checkout.submit' | t }}">
{% endform %}
</div>
{% else %}
<div class="dw-register-section">
<p>Don't have an account?</p>
<a class="dw-register-link" href="{{ routes.account_register_url }}">{{ 'customers.register.submit' | t }}</a>
</div>
{% endif %}
</div>
<!-- ── Recover Password Panel ───────────────────────────────────────── -->
<div class="dw-recover-panel" id="dw-recover-panel">
<h1>Reset Your Password</h1>
{% form 'recover_customer_password' %}
{% if form.posted_successfully? %}
<div class="dw-success">We've sent you an email with a link to reset your password.</div>
{% endif %}
<p>{{ 'customers.login.recover_password_message' | t }}</p>
<div class="dw-field">
<label for="recover_email">{{ 'general.general.email' | t }}</label>
<input type="email" id="recover_email" name="email" value="{{ form.email }}" placeholder="you@example.com" autocomplete="email" class="{% if form.errors %}error{% endif %}">
{% if form.errors %}
<div class="dw-error" style="margin-top:8px">{{ form.errors.messages['form'] }}</div>
{% endif %}
</div>
<input type="submit" class="dw-submit-btn" value="{{ 'customers.reset_password.submit' | t }}">
{% endform %}
<a class="dw-back-link" id="dw-back-toggle">← Back to login</a>
</div>
</div>
</div>
<script>
(function() {
var loginPanel = document.getElementById('dw-login-panel');
var recoverPanel = document.getElementById('dw-recover-panel');
var forgotToggle = document.getElementById('dw-forgot-toggle');
var backToggle = document.getElementById('dw-back-toggle');
function showRecover() {
loginPanel.classList.add('hidden');
recoverPanel.classList.add('active');
}
function showLogin() {
recoverPanel.classList.remove('active');
loginPanel.classList.remove('hidden');
}
if (forgotToggle) forgotToggle.addEventListener('click', showRecover);
if (backToggle) backToggle.addEventListener('click', showLogin);
// Auto-show recover panel if reset was posted
if (recoverPanel.querySelector('[data-successful-reset]') || recoverPanel.querySelector('.dw-success')) {
showRecover();
}
// Also show recover panel if hash is #recover
if (window.location.hash === '#recover') {
showRecover();
}
})();
</script>