1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 7 8 9 <title>Sign in - Berges Institute Spanish Classes</title> 10 11 <meta name="description" content=""> 12 13 <link rel="canonical" href="https://www.bergesinstitutespanish.com/login"> 14 15 16 <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 17 <link rel="preconnect" href="https://unpkg.com" crossorigin> 18 19 <style> 20 /* latin-ext */ 21 @font-face { 22 font-family: 'Roboto'; 23 font-style: italic; 24 font-weight: 100 900; 25 font-stretch: 100%; 26 font-display: swap; 27 src: url(https://fonts.gstatic.com/s/roboto/v50/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkCHkaSTbQWt4N.woff2) format('woff2'); 28 unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; 29 } 30 /* latin */ 31 @font-face { 32 font-family: 'Roboto'; 33 font-style: italic; 34 font-weight: 100 900; 35 font-stretch: 100%; 36 font-display: swap; 37 src: url(https://fonts.gstatic.com/s/roboto/v50/KFO5CnqEu92Fr1Mu53ZEC9_Vu3r1gIhOszmkBnkaSTbQWg.woff2) format('woff2'); 38 unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 39 } 40 /* latin-ext */ 41 @font-face { 42 font-family: 'Roboto'; 43 font-style: normal; 44 font-weight: 100 900; 45 font-stretch: 100%; 46 font-display: swap; 47 src: url(https://fonts.gstatic.com/s/roboto/v50/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBHMdazTgWw.woff2) format('woff2'); 48 unicode-range: U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF; 49 } 50 /* latin */ 51 @font-face { 52 font-family: 'Roboto'; 53 font-style: normal; 54 font-weight: 100 900; 55 font-stretch: 100%; 56 font-display: swap; 57 src: url(https://fonts.gstatic.com/s/roboto/v50/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBHMdazQ.woff2) format('woff2'); 58 unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 59 } 60</style> 61 62 <link rel="preload" as="style" href="https://www.bergesinstitutespanish.com/build/assets/app-x_qLNQJa.css" /><link rel="stylesheet" href="https://www.bergesinstitutespanish.com/build/assets/app-x_qLNQJa.css" data-navigate-track="reload" /> 63 64 65 <meta property="og:title" content="Sign in - Berges Institute Spanish Classes"> 66 <meta property="og:description" content=""> 67 <meta property="og:url" content="https://www.bergesinstitutespanish.com/login"> 68 <meta property="og:type" content="website"> 69 <meta property="og:site_name" content="Berges Institute Spanish Classes"> 70 <meta property="og:locale" content="en_US"> 71 <meta property="og:image" content="https://www.bergesinstitutespanish.com/img/app.jpg"> 72 <meta name="twitter:card" content="summary_large_image"> 73 <meta name="twitter:title" content="Sign in - Berges Institute Spanish Classes"> 74 <meta name="twitter:description" content=""> 75 <meta name="twitter:image" content="https://www.bergesinstitutespanish.com/img/app.jpg"> 76 77 <!-- Favicon --> 78 <link rel="icon" href="https://www.bergesinstitutespanish.com/img/favicon.png"> 79</head> 80<body class="bg-white"> 81 <main role="main"> 82 <div class="min-vh-100 d-flex flex-column justify-content-center align-items-center px-3 py-4"> 83 <div class="w-100 border rounded-3 p-4" style="max-width: 440px;"> 84 <div class="mb-5 pt-1"> 85 <a href="https://www.bergesinstitutespanish.com" class="d-block"> 86 <img alt="Berges Institute" width="250" height="26" class="w-100 h-auto" src="https://www.bergesinstitutespanish.com/img/berges_logo.svg"> 87 </a> 88 </div> 89 90 <div class="mt-2"> 91 <a href="https://www.bergesinstitutespanish.com/google-redirect" class="btn btn-light bg-white border border-dark w-100 d-flex align-items-center justify-content-center">
92 <span class="d-flex align-items-center"><svg viewBox="0 0 24 24" width="20" height="20" xmlns="http://www.w3.org/2000/svg"> 93 <g transform="matrix(1, 0, 0, 1, 27.009001, -39.238998)"> 94 <path fill="#4285F4" d="M -3.264 51.509 C -3.264 50.719 -3.334 49.969 -3.454 49.239 L -14.754 49.239 L -14.754 53.749 L -8.284 53.749 C -8.574 55.229 -9.424 56.479 -10.684 57.329 L -10.684 60.329 L -6.824 60.329 C -4.564 58.239 -3.264 55.159 -3.264 51.509 Z"/> 95 <path fill="#34A853" d="M -14.754 63.239 C -11.514 63.239 -8.804 62.159 -6.824 60.329 L -10.684 57.329 C -11.764 58.049 -13.134 58.489 -14.754 58.489 C -17.884 58.489 -20.534 56.379 -21.484 53.529 L -25.464 53.529 L -25.464 56.619 C -23.494 60.539 -19.444 63.239 -14.754 63.239 Z"/> 96 <path fill="#FBBC05" d="M -21.484 53.529 C -21.734 52.809 -21.864 52.039 -21.864 51.239 C -21.864 50.439 -21.724 49.669 -21.484 48.949 L -21.484 45.859 L -25.464 45.859 C -26.284 47.479 -26.754 49.299 -26.754 51.239 C -26.754 53.179 -26.284 54.999 -25.464 56.619 L -21.484 53.529 Z"/> 97 <path fill="#EA4335" d="M -14.754 43.989 C -12.984 43.989 -11.404 44.599 -10.154 45.789 L -6.734 42.369 C -8.804 40.429 -11.514 39.239 -14.754 39.239 C -19.444 39.239 -23.494 41.939 -25.464 45.859 L -21.484 48.949 C -20.534 46.099 -17.884 43.989 -14.754 43.989 Z"/> 98 </g> 99</svg></span> 100 <span class="ms-2">Continue with Google</span> 101 </a> 102 </div> 103 104 <div class="d-flex justify-content-center align-items-center py-3"> 105 <div class="flex-grow-1 border-bottom border-dark"></div> 106 <div class="mx-1">or</div> 107 <div class="flex-grow-1 border-bottom border-dark"></div> 108 </div> 109 110 111 <form class="form" method="POST" action="https://www.bergesinstitutespanish.com/login"> 112 <input type="hidden" name="_token" value="hacjXna10Ltjxk8xBhCLCX2vDla8SvBCA7RD28qw" autocomplete="off"> 113 <div class="mb-3"> 114 <input type="text" class="form-control" id="email" name="email" value="" placeholder="[email protected]"> 115 </div> 116 117 <div class="mb-3"> 118 <div class="d-flex"> 119 <input type="password" class="form-control" id="password" name="password" placeholder="Password"> 120 <a href="" id="reveal-password" class="ms-2 align-items-center text-dark px-2 border" style="display: flex"> 121 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-eye"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"></path><circle cx="12" cy="12" r="3"></circle></svg></a> 122<a href="" id="hide-password" class="ms-2 align-items-center text-dark px-2 border" style="display:none"> 123 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-eye-off"><path d="M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24"></path><line x1="1" y1="1" x2="23" y2="23"></line></svg> 124</a> 125
126<script> 127 (function() { 128 let passwordShown = false; 129 const eyeOpen = document.querySelector('#reveal-password'); 130 const eyeClose = document.querySelector('#hide-password'); 131 const passwordInput = document.querySelector('#password'); 132 133 eyeOpen.addEventListener('click', e => { 134 e.preventDefault(); 135 passwordShown = true; 136 eyeOpen.style.display = 'none'; 137 eyeClose.style.display = 'flex'; 138 passwordInput.type = 'text'; 139 }); 140 141 eyeClose.addEventListener('click', e => { 142 e.preventDefault(); 143 passwordShown = false; 144 eyeOpen.style.display = 'flex'; 145 eyeClose.style.display = 'none'; 146 passwordInput.type = 'password'; 147 }); 148 }) (); 149</script>
149 </div> 150 </div> 151 152 <input type="submit" class="btn btn-dark w-100 mb-2" value="Sign in"> 153 154 <div class="d-flex align-items-center mt-1 small fw-bold"> 155 <a href="https://www.bergesinstitutespanish.com/forgot-password">Forgot password?</a> 156 </div> 157 158 <hr> 159 160 <div class="mt-3 text-start small"> 161 <span>Don't have an account yet?</span> 162 <a class="fw-bold" href="https://www.bergesinstitutespanish.com/register">Sign up!</a> 163 </div> 164 </form> 165 </div> 166 167 <footer class="d-flex justify-content-center align-items-center flex-wrap mt-3 text-xs"> 168 <div><a href="https://www.bergesinstitutespanish.com/privacy-policy" class="text-gray">Privacy Policy</a></div> 169 <div class="ms-2"><a href="https://www.bergesinstitutespanish.com/terms-of-service" class="text-gray">Terms of Service</a></div> 170 </footer> 171 </div> 172 </main> 173 174
174<script> 175 if (window.localStorage.getItem('bergesToken')) window.location.href = '/upcoming'; 176 </script>
vendor: 1 bytes, line 176
176
177<script> 178 (function () { 179 const popImages = document.querySelectorAll('.pop'); 180 181 pop(); 182 183 window.addEventListener('scroll', () => pop()); 184 185 function pop() { 186 popImages.forEach(item => { 187 if (item.getBoundingClientRect().top < window.innerHeight && item.getBoundingClientRect().bottom >= 0) { 188 if (!item.classList.contains('top')) item.classList.add('img-popup'); 189 } 190 }); 191 } 192 193 const zoomEls = document.querySelectorAll('.zoom'); 194 195 zoom(); 196 197 window.addEventListener('scroll', () => zoom()); 198 199 function zoom() { 200 zoomEls.forEach(item => { 201 if (item.getBoundingClientRect().top < window.innerHeight && item.getBoundingClientRect().bottom >= 0) { 202 item.classList.add('el-zoom'); 203 } 204 }); 205 } 206 207 // No zoom on iOS Safari 208 if (navigator.userAgent.indexOf('iPhone') > -1) { 209 document.querySelector("[name=viewport]") 210 .setAttribute("content", "width=device-width, initial-scale=1, maximum-scale=1"); 211 } 212 })(); 213</script>
213 214 215 216
216<script> 217 if (window.electronAPI?.isElectron) { 218 // Electron app: no analytics, no cookie banner 219 window.dataLayer = window.dataLayer || []; 220 window.gtag = function() {}; 221 } 222</script>
222 223 224<style> 225 body { padding-bottom: var(--cookie-bar-height, 0); } 226 #consent-bar .consent-configure { display: none; } 227 #consent-bar.is-configuring .consent-configure { display: block; } 228 #consent-bar.is-configuring #consent-configure-btn { display: none; } 229 #consent-bar.is-configuring .consent-primary-actions #cookie-consent-btn, 230 #consent-bar.is-configuring .consent-primary-actions #cookie-reject-btn { display: none; } 231</style> 232<div id="consent-bar" class="fixed-bottom bg-white border-top border-bottom d-none p-4" role="dialog" aria-live="polite" aria-label="Your privacy"> 233 <div> 234 <div class="small mb-3"> 235 We use our own and third-party cookies for analytics and advertising. You can accept, reject, or configure them. 236 <a href="https://www.bergesinstitutespanish.com/cookie-policy" target="_blank" rel="noopener">Cookie policy</a>. 237 </div> 238 <div class="d-flex gap-2 flex-wrap consent-primary-actions"> 239 <a href="#" id="consent-configure-btn" class="btn btn-sm btn-outline-dark">Manage</a> 240 <a href="#" id="cookie-reject-btn" class="btn btn-sm btn-primary">Reject</a> 241 <a href="#" id="cookie-consent-btn" class="btn btn-sm btn-primary">Accept</a> 242 </div> 243 </div> 244 <div class="consent-configure"> 245 <div class="small"> 246 <div class="mb-2"> 247 <label class="d-flex align-items-center gap-2"> 248 <input type="checkbox" disabled checked> 249 <span><strong>Strictly necessary</strong> â always on</span> 250 </label> 251 </div> 252 <div class="mb-2"> 253 <label class="d-flex align-items-center gap-2"> 254 <input type="checkbox" id="consent-analytics"> 255 <span><strong>Analytics</strong> â Google Analytics, Microsoft Clarity</span> 256 </label> 257 </div> 258 <div class="mb-3"> 259 <label class="d-flex align-items-center gap-2"> 260 <input type="checkbox" id="consent-advertising"> 261 <span><strong>Advertising</strong> â Google Ads, Meta Pixel</span> 262 </label> 263 </div> 264 </div> 265 <div> 266 <a href="#" id="consent-save-btn" class="btn btn-sm btn-primary">Save preferences</a> 267 </div> 268 </div> 269</div> 270
271<script> 272 document.addEventListener('DOMContentLoaded', () => { 273 if (window.electronAPI?.isElectron) return; 274 275 const GA_ID = "G-ZSV58WYSZ0"; 276 const CLARITY_ID = "u2fd8n3b0i"; 277 const FB_PIXEL_ID = "2327647080993486"; 278 279 // Load GA script dynamically 280 const gaScript = document.createElement('script'); 281 gaScript.defer = true; 282 gaScript.src = 'https://www.googletagmanager.com/gtag/js?id=' + GA_ID; 283 document.head.appendChild(gaScript); 284 285 window.dataLayer = window.dataLayer || []; 286 window.gtag = function() {dataLayer.push(arguments);} 287 288 gtag('consent', 'default', { 289 'ad_storage': 'denied', 290 'ad_user_data': 'denied', 291 'ad_personalization': 'denied', 292 'analytics_storage': 'denied' 293 }); 294 295 gtag('js', new Date()); 296 gtag('config', GA_ID); 297 298 const consentBarEl = document.getElementById('consent-bar'); 299 const acceptBtn = document.getElementById('cookie-consent-btn'); 300 const rejectBtn = document.getElementById('cookie-reject-btn'); 301 const configureBtn = document.getElementById('consent-configure-btn'); 302 const saveBtn = document.getElementById('consent-save-btn'); 303 const analyticsToggle = document.getElementById('consent-analytics'); 304 const advertisingToggle = document.getElementById('consent-advertising'); 305 306 // Consent storage â JSON shape {v:1, analytics, advertising, ts}. 307 // Legacy values ('granted'/'denied') are migrated on first read. 308 const readPrefs = () => { 309 const raw = window.localStorage.getItem('cookieConsent'); 310 if (!raw) return null; 311 if (raw === 'granted') return { v: 1, analytics: true, advertising: true, ts: Date.now() }; 312 if (raw === 'denied') return { v: 1, analytics: false, advertising: false, ts: Date.now() }; 313 try { 314 const parsed = JSON.parse(raw); 315 if (parsed && typeof parsed === 'object') return parsed; 316 } catch (_) {} 317 return null; 318 }; 319 320 const writePrefs = (prefs) => { 321 const payload = { v: 1, analytics: !!prefs.analytics, advertising: !!prefs.advertising, ts: Date.now() }; 322 window.localStorage.setItem('cookieConsent', JSON.stringify(payload)); 323 const cats = []; 324 if (payload.analytics) cats.push('analytics'); 325 if (payload.advertising) cats.push('advertising'); 326 const cookieValue = cats.length ? cats.join(',') : 'none'; 327 document.cookie = `cookie_consent=${cookieValue}; max-age=31536000; path=/; SameSite=Lax; Secure`; 328 }; 329 330 // Honor Global Privacy Control: treat as reject-all, never show the bar. 331 const gpcEnabled = navigator.globalPrivacyControl === true; 332 333 const stored = readPrefs(); 334 335 // Re-affirm the server-visible cookie on every load so it can't drift 336 // from localStorage (cookie expires after a year, localStorage forever). 337 if (stored) writePrefs(stored); 338 339 const updateBarHeight = () => { 340 document.documentElement.style.setProperty('--cookie-bar-height', consentBarEl.offsetHeight + 'px'); 341 }; 342 const barResizeObserver = new ResizeObserver(updateBarHeight); 343 344 const hideBar = () => { 345 barResizeObserver.unobserve(consentBarEl); 346 consentBarEl.classList.add('d-none'); 347 consentBarEl.classList.remove('is-configuring'); 348 document.documentElement.style.removeProperty('--cookie-bar-height'); 349 }; 350 351 const showBar = (prefill) => { 352 analyticsToggle.checked = !!(prefill && prefill.analytics); 353 advertisingToggle.checked = !!(prefill && prefill.advertising); 354 consentBarEl.classList.remove('d-none'); 355 consentBarEl.classList.remove('is-configuring'); 356 updateBarHeight(); 357 barResizeObserver.observe(consentBarEl); 358 }; 359 360 const commit = (prefs) => { 361 writePrefs(prefs); 362 applyConsent(prefs); 363 hideBar(); 364 }; 365 366 acceptBtn.addEventListener('click', (e) => { 367 e.preventDefault(); 368 commit({ analytics: true, advertising: true }); 369 }); 370 371 rejectBtn.addEventListener('click', (e) => { 372 e.preventDefault();
373 commit({ analytics: false, advertising: false }); 374 }); 375 376 configureBtn.addEventListener('click', (e) => { 377 e.preventDefault(); 378 consentBarEl.classList.add('is-configuring'); 379 updateBarHeight(); 380 }); 381 382 saveBtn.addEventListener('click', (e) => { 383 e.preventDefault(); 384 commit({ analytics: analyticsToggle.checked, advertising: advertisingToggle.checked }); 385 }); 386 387 // Fetch geo client-side so the response cache can't freeze it to one visitor's location. 388 const resolveCountry = () => { 389 const cached = window.sessionStorage.getItem('geoCountry'); 390 if (cached) return Promise.resolve(cached); 391 392 return fetch('https://www.bergesinstitutespanish.com/geo', { headers: { 'Accept': 'application/json' } }) 393 .then((res) => res.json()) 394 .then((data) => { 395 if (data.country) { 396 window.sessionStorage.setItem('geoCountry', data.country); 397 } 398 return data.country || null; 399 }) 400 .catch(() => null); 401 }; 402 403 if (gpcEnabled && !stored) { 404 // GPC: record a reject and move on without showing the bar. 405 writePrefs({ analytics: false, advertising: false }); 406 } else if (stored) { 407 applyConsent(stored); 408 } else { 409 resolveCountry().then((country) => { 410 if (country === 'US' || country === 'MX') { 411 // Outside GDPR scope â treat auto-skip as implicit consent for ad attribution. 412 const prefs = { analytics: true, advertising: true }; 413 writePrefs(prefs); 414 applyConsent(prefs); 415 } else { 416 showBar(null); 417 } 418 }); 419 } 420 421 // Footer "Cookie preferences" link calls this. 422 window.showCookiePreferences = () => { 423 const current = readPrefs() || { analytics: false, advertising: false }; 424 showBar(current); 425 consentBarEl.classList.add('is-configuring'); 426 updateBarHeight(); 427 }; 428 429 function applyConsent(prefs) { 430 gtag('consent', 'update', { 431 'analytics_storage': prefs.analytics ? 'granted' : 'denied', 432 'ad_storage': prefs.advertising ? 'granted' : 'denied', 433 'ad_user_data': prefs.advertising ? 'granted' : 'denied', 434 'ad_personalization': prefs.advertising ? 'granted' : 'denied' 435 }); 436 437 if (prefs.analytics && !window.__clarityLoaded) { 438 window.__clarityLoaded = true; 439 (function(c,l,a,r,i,t,y){ 440 c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; 441 t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; 442 y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); 443 })(window, document, "clarity", "script", CLARITY_ID); 444 } 445 446 if (prefs.advertising && !window.__fbPixelLoaded) { 447 window.__fbPixelLoaded = true; 448 !function(f,b,e,v,n,t,s) 449 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 450 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 451 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 452 n.queue=[];t=b.createElement(e);t.async=!0; 453 t.src=v;s=b.getElementsByTagName(e)[0]; 454 s.parentNode.insertBefore(t,s)}(window, document,'script', 455 'https://connect.facebook.net/en_US/fbevents.js'); 456 fbq('init', FB_PIXEL_ID); 457 fbq('track', 'PageView'); 458 } 459 } 460 }); 461</script>
vendor: 1 bytes, line 461
461
462<script> 463 if (window.electronAPI?.isElectron) { 464 const s = document.createElement('script'); 465 s.defer = true; 466 s.src = 'https://cloud.umami.is/script.js'; 467 s.dataset.websiteId = '2e842327-995f-40ff-96f6-f13f98e2bd08'; 468 document.head.appendChild(s); 469 } 470</script>
vendor: 1 bytes, line 470
470
471<script defer src="https://unpkg.com/feather-icons" onload="feather.replace()"></script>
471 472</body> 473</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.