1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>Login - Cinnamon Brockley</title> 7 <link rel="manifest" href="/manifest.json"> 8 <meta name="theme-color" content="#006a4e"> 9 <meta name="mobile-web-app-capable" content="yes"> 10 <meta name="apple-mobile-web-app-status-bar-style" content="default"> 11 12 <meta name="description" content="Great tasting Indian takeaway and delivery. Cinnamon Brockley offers traditional and authentic Indian food for home deliery around South East London"> 13 <meta name="robots" content="noindex, nofollow"> 14 15 <link rel="icon" type="image/png" href="https://images.alaan.co.uk/cinnamon-brockley/branding/favicon-32.png"> 16 <link rel="apple-touch-icon" href="https://images.alaan.co.uk/cinnamon-brockley/branding/icon_192.png"> 17 18 19 <link rel="preconnect" href="https://fonts.googleapis.com"> 20 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 21 <link href="https://fonts.googleapis.com/css2?family=Fraunces:wght@400;600;700&family=Baloo+2:wght@300;400;500;600;700&display=swap" rel="stylesheet"> 22 <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"> 23 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.css"> 24 <link rel="stylesheet" href="/assets/css/custom.css?v=1.2.4"> 25 <link rel="stylesheet" href="/assets/css/fonts.css"> 26 <link rel="stylesheet" href="/assets/css/brand.css"> 27 <link rel="stylesheet" href="/assets/css/a2hs.css"> 28
28<script src="/assets/js/a2hs.js"></script>
28 29 30 <style> 31 :root { 32 --font-heading: Fraunces; 33 --font-body: Baloo 2; 34 /* Brand colors available as utility classes */ 35 --brand-color-one: #006a4e; 36 --brand-color-one-rgb: 0, 106, 78; 37 --brand-color-two: #e03a3e; 38 --brand-color-accent: #e0a526; 39 --brand-success: #38a169; 40 --brand-danger: #e53e3e; 41 --theme-text: #1f2a24; 42 --theme-text-light: #5c665f; 43 --theme-background: #ffffff; 44 --theme-background-alt: #f7f3ea; 45 /* Navbar-specific variables */ 46 --navbar-bg: #fff; 47 --navbar-text: #006a4e; 48 --navbar-hover: #0b3d2e; 49 --navbar-active: #0b3d2e; 50 --navbar-cta-bg: var(--brand-color-one); 51 --navbar-cta-text: var(--navbar-bg); 52 } 53 54 /* Brand color utility classes */ 55 .brand-color-one { color: var(--brand-color-one) !important; } 56 .bg-brand-color-one { background-color: var(--brand-color-one) !important; } 57 .border-brand-color-one { border-color: var(--brand-color-one) !important; } 58 59 .brand-color-two { color: var(--brand-color-two) !important; } 60 .bg-brand-color-two { background-color: var(--brand-color-two) !important; } 61 .border-brand-color-two { border-color: var(--brand-color-two) !important; } 62 63 .brand-color-accent { color: var(--brand-color-accent) !important; } 64 .bg-brand-color-accent { background-color: var(--brand-color-accent) !important; } 65 .border-brand-color-accent { border-color: var(--brand-color-accent) !important; } 66 67 /* Homepage-specific theme application */ 68 body.page-home .bg-primary { 69 background-color: var(--brand-color-one) !important; 70 } 71 body.page-home .btn-primary { 72 background-color: var(--brand-color-one); 73 border-color: var(--brand-color-one); 74 } 75 76 body.page-home .btn-primary:hover { 77 background-color: color-mix(in srgb, var(--brand-color-one) 85%, black); 78 border-color: color-mix(in srgb, var(--brand-color-one) 85%, black); 79 } 80 81 body.page-home .text-primary { 82 color: var(--brand-color-one) !important; 83 } 84 85 /* Navbar uses brand color on all pages */ 86 .navbar { 87 background-color: var(--navbar-bg) !important; 88 } 89 90 .navbar, 91 .navbar .navbar-brand, 92 .navbar .nav-link, 93 .navbar .navbar-text { 94 color: var(--navbar-text) !important; 95 } 96 97 .navbar .nav-link:hover, 98 .navbar .nav-link:focus { 99 color: var(--navbar-hover) !important; 100 } 101 102 .navbar .nav-link.active { 103 color: var(--navbar-active) !important; 104 } 105 106 /* Order button in the navbar - only rendered when navbar.order_button is true */ 107 .navbar .nav-link.nav-cta, 108 .navbar .nav-link.nav-cta.active { 109 background-color: var(--navbar-cta-bg); 110 color: var(--navbar-cta-text) !important; 111 border-radius: 6.25rem; 112 padding: 0.5rem 1.125rem; 113 font-weight: 700; 114 line-height: 1.2; 115 transition: background-color 0.15s ease; 116 } 117 .navbar .nav-link.nav-cta:hover, 118 .navbar .nav-link.nav-cta:focus { 119 background-color: color-mix(in srgb, var(--navbar-cta-bg) 85%, black); 120 color: var(--navbar-cta-text) !important; 121 } 122 @media (min-width: 992px) { 123 .navbar .nav-item:has(> .nav-cta) { 124 display: flex; 125 align-items: center; 126 margin-left: 0.5rem; 127 } 128 } 129 @media (max-width: 991.98px) { 130 .navbar .nav-link.nav-cta { 131 display: inline-block; 132 margin: 0.5rem 0; 133 } 134 } 135 136 /* Darker navbar, use the variable */ 137 /*.navbar { 138 background-color: color-mix(in srgb, var(--navbar-bg) 80%, black) !important; 139 }/* 140 141 /* Navbar color utilities */ 142 .text-navbar { color: var(--navbar-text) !important; } 143 .bg-navbar { background-color: var(--navbar-bg) !important; } 144 .text-navbar-hover:hover { color: var(--navbar-hover) !important; } 145 .navbar-toggler { background-color: var(--navbar-text) !important;} 146 /* Logo area â live-tune knobs: navbar padding, brand padding, logo height */ 147 .navbar { --bs-navbar-padding-y: 0.25rem; } 148 .navbar-brand { 149 display: inline-flex; 150 align-items: center; 151 gap: 0.625rem; 152 padding-top: 0.125rem; 153 padding-bottom: 0.125rem; 154 } 155 .navbar-logo { max-height: 3.5rem; width: auto; } 156 .navbar-brand-text { 157 font-family: var(--font-heading, serif); 158 font-size: 1.25rem; 159 font-weight: 600; 160 line-height: 1.1; 161 } 162 </style> 163
163<script> 164 const BASE_PATH = ""; 165 window.STORE_SLUG = null; 166 window.STORE_NAME = null; 167 window.IS_MULTI_STORE = false; 168 window.MENU_URL = "/order-online"; 169 window.STORE_PATH = window.STORE_SLUG ? BASE_PATH + '/' + window.STORE_SLUG : BASE_PATH; 170 </script>
170 171 172<style> 173.auth-page { 174 min-height: 60vh; 175 display: flex; 176 align-items: center; 177} 178 179.auth-card { 180 max-width: 28rem; 181 margin: 0 auto; 182} 183 184.auth-divider { 185 display: flex; 186 align-items: center; 187 margin: 1.5rem 0; 188} 189 190.auth-divider::before, 191.auth-divider::after { 192 content: ''; 193 flex: 1; 194 border-bottom: 0.0625rem solid #dee2e6; 195} 196 197.auth-divider span { 198 padding: 0 1rem; 199 color: #6c757d; 200 font-size: 0.875rem; 201} 202</style> 203</head> 204<body data-currency="£" class="bg-light page-login"> 205 206 <nav class="navbar navbar-expand-lg"> 207 <div class="container"> 208 <a class="navbar-brand" href="/"> 209 <img src="https://images.alaan.co.uk/cinnamon-brockley/branding/logo.png" alt="Cinnamon Brockley" class="navbar-logo"> 210 </a> 211 <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav"> 212 <span class="navbar-toggler-icon"></span> 213 </button> 214 <div class="collapse navbar-collapse" id="navbarNav"> 215 <ul class="navbar-nav ms-auto"> 216 <li class="nav-item"> 217 <a class="nav-link" href="/">Home</a> 218 </li> 219 <li class="nav-item"> 220 <a class="nav-link nav-cta" href="/order-online">Order Online</a> 221 </li> 222 <li class="nav-item"> 223 <a class="nav-link" href="/info">Info</a> 224 </li> 225 <li class="nav-item"> 226 <a class="nav-link active" href="/account/login">Login</a> 227 </li> 228 </ul> 229 </div> 230 </div> 231 </nav> 232 <main> 233<div class="auth-page"> 234 <div class="container py-5"> 235 <div class="auth-card"> 236 <div class="text-center mb-4"> 237 <h1 class="h3 mb-2">Welcome Back</h1> 238 <p class="text-muted">Sign in to your account</p> 239 </div> 240 241 <div class="card shadow-sm"> 242 <div class="card-body p-4"> 243 <div id="loginError" class="alert alert-danger d-none" role="alert"></div> 244 245 <form id="loginForm" novalidate> 246 <input type="hidden" name="csrf_token" value="34bdf5aa28fe5b8a8bf121d693e36544168cd30d82db805d992d57f715f671b0"> 247 248 <div class="mb-3"> 249 <label for="email" class="form-label">Email address</label> 250 <input type="email" class="form-control" id="email" name="email" required autofocus> 251 <div class="invalid-feedback">Please enter a valid email address</div> 252 </div> 253 254 <div class="mb-3"> 255 <label for="password" class="form-label">Password</label> 256 <div class="input-group"> 257 <input type="password" class="form-control" id="password" name="password" required minlength="8"> 258 <button class="btn btn-outline-secondary" type="button" id="togglePassword" aria-label="Toggle password visibility"> 259 <i class="bi bi-eye"></i> 260 </button> 261 </div> 262 <div class="invalid-feedback">Password is required</div> 263 </div> 264 265 <div class="d-flex justify-content-between align-items-center mb-4"> 266 <div class="form-check"> 267 <input class="form-check-input" type="checkbox" id="remember" name="remember"> 268 <label class="form-check-label" for="remember">Remember me</label> 269 </div> 270 <a href="/account/forgot-password" class="text-decoration-none small">Forgot password?</a> 271 </div> 272 273 <button type="submit" class="btn btn-primary w-100" id="loginBtn">
274 <span class="btn-text">Sign In</span> 275 <span class="btn-loading d-none"> 276 <span class="spinner-border spinner-border-sm me-2" role="status" aria-hidden="true"></span> 277 Signing in... 278 </span> 279 </button> 280 </form> 281 282 <div class="auth-divider"> 283 <span>or</span> 284 </div> 285 286 <div class="text-center"> 287 <p class="mb-0">Don't have an account? <a href="/account/register" class="text-decoration-none">Create one</a></p> 288 </div> 289 </div> 290 </div> 291 292 <div class="text-center mt-4"> 293 <a href="/order-online" class="text-muted text-decoration-none small"> 294 <i class="bi bi-arrow-left me-1"></i>Continue as guest 295 </a> 296 </div> 297 </div> 298 </div> 299</div> 300 </main> 301 <div class="cookie-notice" id="cookieNotice"> 302 <div class="container"> 303 <p>We use essential cookies to make ordering work. <a href="/privacy-policy">Learn more</a></p> 304 <button type="button" class="btn btn-sm btn-light" onclick="dismissCookieNotice()">OK</button> 305 </div> 306 </div> 307 <footer class="bg-dark text-white py-4"> 308 <div class="container text-center"> 309 <p class="mb-0">© 2026 Cinnamon Brockley. All rights reserved.</p> 310 <p class="mb-0 mt-2"> 311 <a href="/privacy-policy" class="text-white-50">Privacy</a> | 312 <a href="/terms-conditions" class="text-white-50">Terms</a> 313 | <a href="/subscribe" class="text-white-50">Subscribe</a> 314 </p> 315 <p class="mb-0 mt-2 small text-white-50"> 316 <span class="menyu-credit"> 317 tech by <a href="https://menyu.co.uk" target="_blank" rel="noopener">menyu</a> 318 <span class="menyu-popover">We love making tech that looks brilliant but works even better.</span> 319 </span> 320 </p> 321 </div> 322 </footer> 323 324
324<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
324 325
325<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
325 326
326<script src="/assets/js/cart.js?v=1.2.4"></script>
326 327
327<script> 328 function dismissCookieNotice() { 329 document.getElementById('cookieNotice').style.display = 'none'; 330 localStorage.setItem('cookieNoticeAck', '1'); 331 } 332 333 if (localStorage.getItem('cookieNoticeAck')) { 334 document.getElementById('cookieNotice').style.display = 'none'; 335 } 336 </script>
vendor: 1 bytes, line 336
336
337<script> 338document.addEventListener('DOMContentLoaded', function() { 339 const form = document.getElementById('loginForm'); 340 const errorAlert = document.getElementById('loginError'); 341 const loginBtn = document.getElementById('loginBtn'); 342 const togglePassword = document.getElementById('togglePassword'); 343 344 // Toggle password visibility 345 togglePassword.addEventListener('click', function() { 346 const passwordInput = document.getElementById('password'); 347 const icon = this.querySelector('i'); 348 349 if (passwordInput.type === 'password') { 350 passwordInput.type = 'text'; 351 icon.classList.remove('bi-eye'); 352 icon.classList.add('bi-eye-slash'); 353 } else { 354 passwordInput.type = 'password'; 355 icon.classList.remove('bi-eye-slash'); 356 icon.classList.add('bi-eye'); 357 } 358 }); 359 360 form.addEventListener('submit', async function(e) { 361 e.preventDefault(); 362 363 // Reset error state 364 errorAlert.classList.add('d-none'); 365 form.classList.remove('was-validated'); 366 367 // Validate form 368 if (!form.checkValidity()) { 369 form.classList.add('was-validated'); 370 return; 371 } 372 373 // Show loading state 374 loginBtn.disabled = true; 375 loginBtn.querySelector('.btn-text').classList.add('d-none'); 376 loginBtn.querySelector('.btn-loading').classList.remove('d-none'); 377 378 try { 379 const formData = new FormData(form); 380 381 const response = await fetch(BASE_PATH+'/account/login', { 382 method: 'POST', 383 body: new URLSearchParams(formData) 384 }); 385 386 const data = await response.json(); 387 388 if (data.success) { 389 window.location.href = BASE_PATH+data.redirect || BASE_PATH+'/account'; 390 } else { 391 errorAlert.textContent = data.error || 'Login failed. Please try again.'; 392 errorAlert.classList.remove('d-none'); 393 } 394 } catch (error) { 395 console.error('Login error:', error); 396 errorAlert.textContent = 'An error occurred. Please try again.'; 397 errorAlert.classList.remove('d-none'); 398 } finally { 399 // Reset button state 400 loginBtn.disabled = false; 401 loginBtn.querySelector('.btn-text').classList.remove('d-none'); 402 loginBtn.querySelector('.btn-loading').classList.add('d-none'); 403 } 404 }); 405}); 406</script>
406 407</body> 408</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.