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>Berges Institute Spanish Classes</title> 10 11 <meta name="description" content=""> 12 13 <link rel="canonical" href="https://www.bergesinstitutespanish.com/levels-and-schedule"> 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 <style> 64 html, body { 65 height: 100%; 66 overflow: hidden; 67 } 68 69 #app { 70 height: 100vh; 71 overflow: hidden; 72 } 73 74 #app-content { 75 flex: 1; 76 min-height: 0; 77 overflow-y: auto; 78 } 79 80 @media (pointer: fine) { 81 #app-content, 82 .fixed-side-menus { 83 scrollbar-gutter: stable; 84 } 85 } 86 87 .fixed-side-menus { 88 height: 100vh; 89 overflow-y: auto; 90 pointer-events: none; 91 } 92 93 .fixed-side-menus .side-section { 94 pointer-events: auto; 95 } 96 97 .electron-app .border-bottom { 98 border-bottom: none !important; 99 } 100 101 /** Disable context menu in mobile */ 102 .nocontext { 103 -webkit-touch-callout: none; /* Safari Touch */ 104 -webkit-user-select: none; /* Webkit */ 105 -moz-user-select: none; /* Firefox */ 106 -ms-user-select: none; /* Edge*/ 107 user-select: none; /* Future-proof*/ 108 -webkit-user-drag: none; 109 -moz-user-drag: none; 110 -o-user-drag: none;
111 user-drag: none; 112 } 113 114 .my-logo-section { 115 position: fixed; 116 top: 0; 117 left: 0; 118 width: 100vw; 119 height: 100vh; 120 background-color: white; 121 z-index: 9999; 122 display: flex; 123 justify-content: center; 124 align-items: center; 125 /* Full screen white overlay */ 126 } 127 128 .my-logo { 129 opacity: 0; 130 transform: scale(0.5) translateY(50px); 131 transition: all 0.3s ease; 132 display: flex; 133 justify-content: center; 134 } 135 136 .my-logo img { 137 max-width: 300px; 138 height: auto; 139 display: block; 140 } 141 142 @media only screen and (max-width: 575px) { 143 .center-div { 144 border-right: none !important; 145 border-left: none !important; 146 } 147 } 148 149 .side-section { 150 display: none; 151 } 152 153 .side-section-container { 154 display: none; 155 } 156 157 @media only screen and (min-width: 993px) { 158 .left-menu-container { 159 display: block; 160 } 161 162 .left-menu { 163 display: block; 164 padding-top: 64px; 165 max-width: 280px !important; 166 } 167 } 168 169 @media only screen and (min-width: 1401px) { 170 .right-menu-container { 171 display: block; 172 } 173 174 .right-menu { 175 display: block; 176 padding-top: 64px; 177 max-width: 300px !important; 178 } 179 } 180 </style> 181 182 <meta property="og:image" content="https://www.bergesinstitutespanish.com/img/app.jpg"/> 183 184 <meta property="og:title" content="Berges Institute Spanish Classes"> 185 <meta property="og:description" content=""> 186 <meta property="og:url" content="https://www.bergesinstitutespanish.com/levels-and-schedule"> 187 <meta property="og:type" content="website"> 188 <meta property="og:site_name" content="Berges Institute Spanish Classes"> 189 <meta property="og:locale" content="en_US"> 190 <meta property="og:image" content="https://www.bergesinstitutespanish.com/img/app.jpg"> 191 <meta name="twitter:card" content="summary_large_image"> 192 <meta name="twitter:title" content="Berges Institute Spanish Classes"> 193 <meta name="twitter:description" content=""> 194 <meta name="twitter:image" content="https://www.bergesinstitutespanish.com/img/app.jpg"> 195 196 <!-- Favicon --> 197 <link rel="icon" href="https://www.bergesinstitutespanish.com/img/favicon.png"> 198</head> 199<body class="bg-white"> 200 201 <div class="my-logo-section" style="display: flex"> 202 <div class="my-logo"> 203 <img alt="Berges Institute" width="300" height="31" src="https://www.bergesinstitutespanish.com/img/berges_logo.svg"> 204 </div> 205 </div> 206 207 <div id="app" class="d-flex flex-column"> 208 <header> 209 <navbar></navbar> 210 </header> 211 212 <div id="app-content" class="w-100 d-flex justify-content-center flex-grow-1"> 213 <div class="row mx-0 flex-grow-1" style="max-width: 1600px"> 214 <div class="side-section-container left-menu-container col-lg-3 px-0"></div> 215 <div class="mx-auto col-12 col-sm-11 col-md-10 mx-lg-0 col-lg-8 col-xl-7 col-xxl-6 px-0 border-end border-start center-div" 216 style="z-index: 1"> 217 <main role="main" class="w-100"> 218 <not-found-handler class="w-100"></not-found-handler> 219 220 <router-view v-slot="{ Component }"> 221 <keep-alive exclude="Menu,Account" max="1"> 222 <component :is="Component" class="w-100"></component> 223 </keep-alive> 224 </router-view> 225 </main> 226 </div> 227 <div class="side-section-container right-menu-container col-xxl-3 px-0"></div> 228 </div> 229 </div> 230 231 <div class="position-fixed top-0 start-0 w-100 d-flex justify-content-center fixed-side-menus"> 232 <div class="row mx-0 flex-grow-1" style="max-width: 1600px"> 233 <div class="side-section-container left-menu-container col-lg-3 px-0"> 234 <left-menu class="side-section left-menu ms-auto"></left-menu> 235 </div> 236 <div class="col-xxl-6" style="z-index: 0"></div> 237 <div class="side-section-container right-menu-container col-xxl-3 px-0"> 238 <right-menu class="side-section right-menu me-auto"></right-menu> 239 </div> 240 </div> 241 </div> 242 </div> 243 244
244<script> 245 // Set currency 246 (function () { 247 if (!window.localStorage.getItem('bergesCurrency')) { 248 const currencyCode = "USD"; 249 const availableCurrencies = ["USD","AED","AUD","CAD","EUR","GBP","INR","NZD","SGD","ZAR"]; 250 251 if (currencyCode && availableCurrencies.includes(currencyCode)) { 252 window.localStorage.setItem('bergesCurrency', currencyCode); 253 } else { 254 window.localStorage.setItem('bergesCurrency', 'USD'); 255 } 256 } 257 })(); 258 </script>
258 259 260
260<script> 261 // Splash 262 (function () { 263 // Scoped CSS for logo animation 264 const logoStyles = ` 265 @keyframes myLogoEntrance { 266 0% { 267 opacity: 0; 268 transform: scale(0.5) translateY(50px); 269 } 270 50% { 271 opacity: 0.8; 272 transform: scale(1.1) translateY(0); 273 } 274 100% { 275 opacity: 1; 276 transform: scale(1) translateY(0); 277 } 278 } 279 280 @keyframes myLogoFloat { 281 0%, 100% { 282 transform: translateY(0); 283 } 284 50% { 285 transform: translateY(-10px); 286 } 287 } 288 289 @keyframes myLogoPulse { 290 0%, 100% { 291 transform: scale(1); 292 } 293 50% { 294 transform: scale(1.05); 295 } 296 } 297 `; 298 299 // Inject styles only if they don't exist 300 if (!document.querySelector('#my-logo-styles')) { 301 const style = document.createElement('style'); 302 style.id = 'my-logo-styles'; 303 style.textContent = logoStyles; 304 document.head.appendChild(style); 305 } 306 307 // Animation functions 308 function animateMyLogo(options = {}) { 309 const { 310 selector = '.my-logo', 311 duration = 500, 312 delay = 0, 313 type = 'entrance' 314 } = options; 315 316 const logo = document.querySelector(selector); 317 if (!logo) return; 318 319 setTimeout(() => { 320 switch (type) { 321 case 'entrance': 322 logo.style.animation = `myLogoEntrance ${duration / 1000}s ease-out forwards`; 323 break; 324 case 'float': 325 logo.style.animation = `myLogoFloat ${duration / 1000}s ease-in-out infinite`; 326 break; 327 case 'pulse': 328 logo.style.animation = `myLogoPulse ${duration / 1000}s ease-in-out infinite`; 329 break; 330 } 331 }, delay); 332 } 333 334 // Add click interaction and auto-hide 335 function addAutoHide() { 336 const logo = document.querySelector('.my-logo'); 337 const section = document.querySelector('.my-logo-section'); 338 if (!logo || !section) return; 339 340 // Auto-hide the splash screen after animation 341 setTimeout(() => { 342 section.style.transition = 'opacity 1s ease-out'; 343 section.style.opacity = '0'; 344 345 // Remove from DOM after fade out 346 setTimeout(() => { 347 section.remove(); 348 }, 500); 349 }, 1000); // Hide after 1 second 350 } 351 352 // Initialize when DOM is ready 353 function initMyLogo() { 354 animateMyLogo({type: 'entrance'}); 355 addAutoHide(); 356 357 // Add floating animation after entrance 358 setTimeout(() => { 359 animateMyLogo({type: 'float', duration: 800}); 360 }, 800); 361 } 362 363 // Wait for DOM or run immediately if already loaded 364 if (document.readyState === 'loading') { 365 document.addEventListener('DOMContentLoaded', initMyLogo); 366 } else { 367 initMyLogo(); 368 } 369 })(); 370 </script>
370 371 372 373 374 375
375<script> 376 window.Tests = [{"id":13,"name":"Level 1 Copy 2023-05-17 15:58:33","display_name":"Beginners","slug":"level-1","buleria_level_id":3,"description":"\u003Cp\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EPlease note once you start you will have to complete the test in one session, as you will not be able to save it and continue at a later time.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cstrong style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EScoring:\u0026nbsp;\u003C\/strong\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003E+1 point for every correct answer; 0 points subtracted for incorrect answers; 0 points subtracted for questions you don\u2019t answer.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cstrong style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EPassing score:\u0026nbsp;\u003C\/strong\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003E55 points\u003C\/span\u003E\u003C\/p\u003E","is_active":1,"created_at":"2023-05-17T15:58:33.000000Z","updated_at":"2026-02-24T14:49:18.000000Z","results_text":null,"passing_score":55,"website":1,"adds_to_newsletter":0},{"id":14,"name":"Level 2 Copy 2023-05-17 17:25:20","display_name":"Level 2","slug":"level-2","buleria_level_id":4,"description":"\u003Cp\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EPlease note once you start you will have to complete the test in one session, as you will not be able to save it and continue at a later time.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cstrong style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EScoring:\u0026nbsp;\u003C\/strong\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003E+1 point for every correct answer; 0 points subtracted for incorrect answers; 0 points subtracted for questions you don\u2019t answer.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cstrong style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EPassing score:\u0026nbsp;\u003C\/strong\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003E55 points\u003C\/span\u003E\u003C\/p\u003E","is_active":1,"created_at":"2023-05-17T17:25:20.000000Z","updated_at":"2026-02-24T14:49:29.000000Z","results_text":null,"passing_score":55,"website":1,"adds_to_newsletter":0},{"id":15,"name":"Level 3 Copy 2023-05-18 15:48:34","display_name":"Level 3","slug":"level-3","buleria_level_id":5,"description":"\u003Cp\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EPlease note once you start you will have to complete the test in one session, as you will not be able to save it and continue at a later time.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cstrong style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EScoring:\u0026nbsp;\u003C\/strong\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003E+1 point for every correct answer; 0 points subtracted for incorrect answers; 0 points subtracted for questions you don\u2019t answer.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cstrong style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EPassing score:\u0026nbsp;\u003C\/strong\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003E55 points\u003C\/span\u003E\u003C\/p\u003E","is_active":1,"created_at":"2023-05-18T15:48:34.000000Z","updated_at":"2026-02-24T14:49:39.000000Z","results_text":null,"passing_score":55,"website":1,"adds_to_newsletter":0},{"id":17,"name":"Level 4 Copy 2023-05-18 15:58:27","display_name":"Level 4","slug":"level-4","buleria_level_id":6,"description":"\u003Cp\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EPlease note once you start you will have to complete the test in one session, as you will not be able to save it and continue at a later time.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cstrong style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EScoring:\u0026nbsp;\u003C\/strong\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003E+1 point for every correct answer; 0 points subtracted for incorrect answers; 0 points subtracted for questions you don\u2019t answer.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cstrong style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EPassing score:\u0026nbsp;\u003C\/strong\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003E55 points\u003C\/span\u003E\u003C\/p\u003E","is_active":1,"created_at":"2023-05-18T15:58:27.000000Z","updated_at":"2026-02-24T14:49:50.000000Z","results_text":null,"passing_score":55,"website":1,"adds_to_newsletter":0},{"id":18,"name":"Level 5 Copy 2023-05-18 16:00:30","display_name":"Level 5","slug":"level-5","buleria_level_id":8,"description":"\u003Cp\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EPlease note once you start you will have to complete the test in one session, as you will not be able to save it and continue at a later time.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cstrong style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EScoring:\u0026nbsp;\u003C\/strong\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003E+1 point for every correct answer; 0 points subtracted for incorrect answers; 0 points subtracted for questions you don\u2019t answer.\u003C\/span\u003E\u003C\/p\u003E\u003Cp\u003E\u003Cstrong style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003EPassing score:\u0026nbsp;\u003C\/strong\u003E\u003Cspan style=\u0022color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);\u0022\u003E55 points\u003C\/span\u003E\u003C\/p\u003E","is_active":1,"created_at":"2023-05-18T16:00:30.000000Z","updated_at":"2026-02-24T14:50:01.000000Z","results_text":null,"passing_score":55,"website":1,"adds_to_newsletter":0}]; 377 window.Timezones = ["Africa\/Abidjan","Africa\/Accra","Africa\/Addis_Ababa","Africa\/Algiers","Africa\/Asmara","Africa\/Bamako","Africa\/Bangui","Africa\/Banjul","Africa\/Bissau","Africa\/Blantyre","Africa\/Brazzaville","Africa\/Bujumbura","Africa\/Cairo","Africa\/Casablanca","Africa\/Ceuta","Africa\/Conakry","Africa\/Dakar","Africa\/Dar_es_Salaam","Africa\/Djibouti","Africa\/Douala","Africa\/El_Aaiun","Africa\/Freetown","Africa\/Gaborone","Africa\/Harare","Africa\/Johannesburg","Africa\/Juba","Africa\/Kampala","Africa\/Khartoum","Africa\/Kigali","Africa\/Kinshasa","Africa\/Lagos","Africa\/Libreville","Africa\/Lome","Africa\/Luanda","Africa\/Lubumbashi","Africa\/Lusaka","Africa\/Malabo","Africa\/Maputo","Africa\/Maseru","Africa\/Mbabane","Africa\/Mogadishu","Africa\/Monrovia","Africa\/Nairobi","Africa\/Ndjamena","Africa\/Niamey","Africa\/Nouakchott","Africa\/Ouagadougou","Africa\/Porto-Novo","Africa\/Sao_Tome","Africa\/Tripoli","Africa\/Tunis","Africa\/Windhoek","America\/Adak","America\/Anchorage","America\/Anguilla","America\/Antigua","America\/Araguaina","America\/Argentina\/Buenos_Aires","America\/Argentina\/Catamarca","America\/Argentina\/Cordoba","America\/Argentina\/Jujuy","America\/Argentina\/La_Rioja","America\/Argentina\/Mendoza","America\/Argentina\/Rio_Gallegos","America\/Argentina\/Salta","America\/Argentina\/San_Juan","America\/Argentina\/San_Luis","America\/Argentina\/Tucuman","America\/Argentina\/Ushuaia","America\/Aruba","America\/Asuncion","America\/Atikokan","America\/Bahia","America\/Bahia_Banderas","America\/Barbados","America\/Belem","America\/Belize","America\/Blanc-Sablon","America\/Boa_Vista","America\/Bogota","America\/Boise","America\/Cambridge_Bay","America\/Campo_Grande","America\/Cancun","America\/Caracas","America\/Cayenne","America\/Cayman","America\/Chicago","America\/Chihuahua","America\/Ciudad_Juarez","America\/Costa_Rica","America\/Coyhaique","America\/Creston","America\/Cuiaba","America\/Curacao","America\/Danmarkshavn","America\/Dawson","America\/Dawson_Creek","America\/Denver","America\/Detroit","America\/Dominica","America\/Edmonton","America\/Eirunepe","America\/El_Salvador","America\/Fort_Nelson","America\/Fortaleza","America\/Glace_Bay","America\/Goose_Bay","America\/Grand_Turk","America\/Grenada","America\/Guadeloupe","America\/Guatemala","America\/Guayaquil","America\/Guyana","America\/Halifax","America\/Havana","America\/Hermosillo","America\/Indiana\/Indianapolis","America\/Indiana\/Knox","America\/Indiana\/Marengo","America\/Indiana\/Petersburg","America\/Indiana\/Tell_City","America\/Indiana\/Vevay","America\/Indiana\/Vincennes","America\/Indiana\/Winamac","America\/Inuvik","America\/Iqaluit","America\/Jamaica","America\/Juneau","America\/Kentucky\/Louisville","America\/Kentucky\/Monticello","America\/Kralendijk","America\/La_Paz","America\/Lima","America\/Los_Angeles","America\/Lower_Princes","America\/Maceio","America\/Managua","America\/Manaus","America\/Marigot","America\/Martinique","America\/Matamoros","America\/Mazatlan","America\/Menominee","America\/Merida","America\/Metlakatla","America\/Mexico_City","America\/Miquelon","America\/Moncton","America\/Monterrey","America\/Montevideo","America\/Montserrat","America\/Nassau","America\/New_York","America\/Nome","America\/Noronha","America\/North_Dakota\/Beulah","America\/North_Dakota\/Center","America\/North_Dakota\/New_Salem","America\/Nuuk","America\/Ojinaga","America\/Panama","America\/Paramaribo","America\/Phoenix","America\/Port-au-Prince","America\/Port_of_Spain","America\/Porto_Velho","America\/Puerto_Rico","America\/Punta_Arenas","America\/Rankin_Inlet","America\/Recife","America\/Regina","America\/Resolute","America\/Rio_Branco","America\/Santarem","America\/Santiago","America\/Santo_Domingo","America\/Sao_Paulo","America\/Scoresbysund","America\/Sitka","America\/St_Barthelemy","America\/St_Johns","America\/St_Kitts","America\/St_Lucia","America\/St_Thomas","America\/St_Vincent","America\/Swift_Current","America\/Tegucigalpa","America\/Thule","America\/Tijuana","America\/Toronto","America\/Tortola","America\/Vancouver","America\/Whitehorse","America\/Winnipeg","America\/Yakutat","Antarctica\/Casey","Antarctica\/Davis","Antarctica\/DumontDUrville","Antarctica\/Macquarie","Antarctica\/Mawson","Antarctica\/McMurdo","Antarctica\/Palmer","Antarctica\/Rothera","Antarctica\/Syowa","Antarctica\/Troll","Antarctica\/Vostok","Arctic\/Longyearbyen","Asia\/Aden","Asia\/Almaty","Asia\/Amman","Asia\/Anadyr","Asia\/Aqtau","Asia\/Aqtobe","Asia\/Ashgabat","Asia\/Atyrau","Asia\/Baghdad","Asia\/Bahrain","Asia\/Baku","Asia\/Bangkok","Asia\/Barnaul","Asia\/Beirut","Asia\/Bishkek","Asia\/Brunei","Asia\/Chita","Asia\/Colombo","Asia\/Damascus","Asia\/Dhaka","Asia\/Dili","Asia\/Dubai","Asia\/Dushanbe","Asia\/Famagusta","Asia\/Gaza","Asia\/Hebron","Asia\/Ho_Chi_Minh","Asia\/Hong_Kong","Asia\/Hovd","Asia\/Irkutsk","Asia\/Jakarta","Asia\/Jayapura","Asia\/Jerusalem","Asia\/Kabul","Asia\/Kamchatka","Asia\/Karachi","Asia\/Kathmandu","Asia\/Khandyga","Asia\/Kolkata","Asia\/Krasnoyarsk","Asia\/Kuala_Lumpur","Asia\/Kuching","Asia\/Kuwait","Asia\/Macau","Asia\/Magadan","Asia\/Makassar","Asia\/Manila","Asia\/Muscat","Asia\/Nicosia","Asia\/Novokuznetsk","Asia\/Novosibirsk","Asia\/Omsk","Asia\/Oral","Asia\/Phnom_Penh","Asia\/Pontianak","Asia\/Pyongyang","Asia\/Qatar","Asia\/Qostanay","Asia\/Qyzylorda","Asia\/Riyadh","Asia\/Sakhalin","Asia\/Samark
377and","Asia\/Seoul","Asia\/Shanghai","Asia\/Singapore","Asia\/Srednekolymsk","Asia\/Taipei","Asia\/Tashkent","Asia\/Tbilisi","Asia\/Tehran","Asia\/Thimphu","Asia\/Tokyo","Asia\/Tomsk","Asia\/Ulaanbaatar","Asia\/Urumqi","Asia\/Ust-Nera","Asia\/Vientiane","Asia\/Vladivostok","Asia\/Yakutsk","Asia\/Yangon","Asia\/Yekaterinburg","Asia\/Yerevan","Atlantic\/Azores","Atlantic\/Bermuda","Atlantic\/Canary","Atlantic\/Cape_Verde","Atlantic\/Faroe","Atlantic\/Madeira","Atlantic\/Reykjavik","Atlantic\/South_Georgia","Atlantic\/St_Helena","Atlantic\/Stanley","Australia\/Adelaide","Australia\/Brisbane","Australia\/Broken_Hill","Australia\/Darwin","Australia\/Eucla","Australia\/Hobart","Australia\/Lindeman","Australia\/Lord_Howe","Australia\/Melbourne","Australia\/Perth","Australia\/Sydney","Europe\/Amsterdam","Europe\/Andorra","Europe\/Astrakhan","Europe\/Athens","Europe\/Belgrade","Europe\/Berlin","Europe\/Bratislava","Europe\/Brussels","Europe\/Bucharest","Europe\/Budapest","Europe\/Busingen","Europe\/Chisinau","Europe\/Copenhagen","Europe\/Dublin","Europe\/Gibraltar","Europe\/Guernsey","Europe\/Helsinki","Europe\/Isle_of_Man","Europe\/Istanbul","Europe\/Jersey","Europe\/Kaliningrad","Europe\/Kirov","Europe\/Kyiv","Europe\/Lisbon","Europe\/Ljubljana","Europe\/London","Europe\/Luxembourg","Europe\/Madrid","Europe\/Malta","Europe\/Mariehamn","Europe\/Minsk","Europe\/Monaco","Europe\/Moscow","Europe\/Oslo","Europe\/Paris","Europe\/Podgorica","Europe\/Prague","Europe\/Riga","Europe\/Rome","Europe\/Samara","Europe\/San_Marino","Europe\/Sarajevo","Europe\/Saratov","Europe\/Simferopol","Europe\/Skopje","Europe\/Sofia","Europe\/Stockholm","Europe\/Tallinn","Europe\/Tirane","Europe\/Ulyanovsk","Europe\/Vaduz","Europe\/Vatican","Europe\/Vienna","Europe\/Vilnius","Europe\/Volgograd","Europe\/Warsaw","Europe\/Zagreb","Europe\/Zurich","Indian\/Antananarivo","Indian\/Chagos","Indian\/Christmas","Indian\/Cocos","Indian\/Comoro","Indian\/Kerguelen","Indian\/Mahe","Indian\/Maldives","Indian\/Mauritius","Indian\/Mayotte","Indian\/Reunion","Pacific\/Apia","Pacific\/Auckland","Pacific\/Bougainville","Pacific\/Chatham","Pacific\/Chuuk","Pacific\/Easter","Pacific\/Efate","Pacific\/Fakaofo","Pacific\/Fiji","Pacific\/Funafuti","Pacific\/Galapagos","Pacific\/Gambier","Pacific\/Guadalcanal","Pacific\/Guam","Pacific\/Honolulu","Pacific\/Kanton","Pacific\/Kiritimati","Pacific\/Kosrae","Pacific\/Kwajalein","Pacific\/Majuro","Pacific\/Marquesas","Pacific\/Midway","Pacific\/Nauru","Pacific\/Niue","Pacific\/Norfolk","Pacific\/Noumea","Pacific\/Pago_Pago","Pacific\/Palau","Pacific\/Pitcairn","Pacific\/Pohnpei","Pacific\/Port_Moresby","Pacific\/Rarotonga","Pacific\/Saipan","Pacific\/Tahiti","Pacific\/Tarawa","Pacific\/Tongatapu","Pacific\/Wake","Pacific\/Wallis","UTC"]; 378 window.Website = 1; 379 window.Locale = "en"; 380 window.WebsiteName = 'Berges Institute Spanish Classes'; 381 window.HelpCenterUrl = 'https://www.bergesinstitutespanish.com/help'; 382 window.SpaSlugs = {"home":"\/home","how-it-works":"\/how-it-works","levels-and-schedule":"\/levels-and-schedule","browse-courses":"\/browse-courses","browse-classes":"\/browse-classes","course":"\/course","prices":"\/prices","private-lessons":"\/private-lessons","buy-packages":"\/buy-packages","gift-cards":"\/gift-cards","deal-for-beginners":"\/deal-for-beginners","affiliate-program":"\/affiliate-program","confirm-purchase":"\/confirm-purchase","subscribe":"\/subscribe","video":"\/video","people":"\/people","profile":"\/profile","force-password-reset":"\/force-password-reset","select-timezone":"\/select-timezone","attribution-survey":"\/attribution-survey","roadmap":"\/roadmap","upcoming":"\/upcoming","billing":"\/billing","past-visits":"\/past-visits","comments":"\/comments","private-lesson-discussion":"\/private-lesson-discussion","notifications":"\/notifications","study-groups":"\/study-groups","study-group-discussion":"\/study-group-discussion","new-study-group":"\/new-study-group","edit-study-group":"\/edit-study-group","schedule-meeting":"\/schedule-meeting","menu":"\/menu","account":"\/account"}; 383 window.Cashback = {"USD":30,"AED":100,"AUD":40,"CAD":40,"EUR":30,"GBP":20,"INR":2500,"NZD":50,"SGD":40,"ZAR":500}; 384 window.HowItWorks = {"sections":[{"heading":"Our Spanish courses","body":"\u003Cp\u003EEach course consists of ten 90-minute live classes, taught via Zoom.\u003C\/p\u003E\u003Cp\u003EClass dates are flexible: click Change on any date to see alternatives, before or after enrolling.\u003C\/p\u003E"},{"heading":"Production practice","body":"\u003Cp\u003EProduction (speaking and writing) is the hardest part of learning a language. Most learners practice it far less than reading and listening. We flip that. Our courses aim to supercharge your production abilities through three pillars:\u003C\/p\u003E\u003Cul\u003E\u003Cli\u003E\u003Cstrong\u003EGrammar.\u003C\/strong\u003E The rules are presented clearly, so the language makes sense.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003ETranslation.\u003C\/strong\u003E You translate lots of sentences, so your brain starts recognizing patterns.\u003C\/li\u003E\u003Cli\u003E\u003Cstrong\u003ESpeaking.\u003C\/strong\u003E You use what you\u0027ve learned in live conversations with your instructor and classmates, scoped to what you know.\u003C\/li\u003E\u003C\/ul\u003E\u003Cp\u003EMost classes include all three. Some lean toward one: conversation classes, for example, are mostly speaking.\u003C\/p\u003E"},{"heading":"Levels build on each other","body":"\u003Cp\u003EEach level builds on the one before it, so nothing gets skipped. If you\u0027re new to Spanish, you start at the Beginners level. If you already know some Spanish, a short placement test helps you find your level. If you sign up for the wrong level, just tell us and we\u0027ll move you to the correct one.\u003C\/p\u003E"},{"heading":"Why we teach grammar first","body":"\u003Cp\u003EMost apps ask you to guess the patterns from examples. That\u0027s how children pick up their first language, but adults are different: research shows we learn faster when we\u0027re taught the rules first, then practice them. Once you understand the rules, you can build correct sentences from your first class, instead of waiting for the language to click.\u003C\/p\u003E"},{"heading":"The Graf Method","body":"\u003Cp\u003EThe Graf Method is a modern twist on the classic grammar-translation approach. It keeps the translation work, but shifts the weight toward writing and speaking. We\u0027ve refined it over ten-plus years of teaching adults.\u003C\/p\u003E"}],"about":{"paragraphs":["I opened Berges Institute in 2013, after running a small Spanish tutoring studio on New York\u0027s Upper East Side for a few years. My business partner Vanessa and I had met in Barcelona back in 2004, playing in a pop-jazz band that rehearsed in the suburbs and booked very few gigs. Teaching turned out to work better than the band. ","We started with two classrooms at 36th Street and Fifth Avenue, in a beautiful building from 1920, and wrote our own textbooks: the five volumes of the Graf Method, our grammar-first approach to teaching adults. In 2018 we opened a second school in the Chicago Loop, right next to City Hall. At our peak we had two campuses, 25 teachers, and over 1,200 monthly students.","Then Covid hit, and we moved everything online. We\u0027d already been teaching online classes for a
384while, so the transition was smooth. It also revealed something: given the choice, most students preferred live online classes. No commute, and you can attend from an office in Los Angeles or a hotel lobby in Bali. We reopened the physical classrooms in 2021, but in 2022 we followed our students and went fully online. Today we teach almost 2,000 students every month, more than we ever did in person. ","That freed me to move back home to Madrid, and the company came with me. Berges is now headquartered just north of the city, in Alcobendas. Coming home also sparked our newest project: Berges English, live English classes taught with the same philosophy behind our Spanish classes since 2013.","Thousands of students have learned with us, and many have gone from zero to conversational and from conversational to fluent. Watching that happen never gets old.","Un saludo,","Dan Berges"],"image":"\/img\/dan3.webp","imageAlt":"Dan Berges, founder of Berges Institute","aboutMe":{"heading":"About me (Dan Berges)","body":"I am, among other things, a teacher, \u003Ca href=\u0022https:\/\/a.co\/d\/6s2A8lf\u0022 target=\u0022_blank\u0022\u003Eauthor\u003C\/a\u003E, programmer, and Linux sysadmin. Apart from my work at Berges Institute, I also make content about descriptive grammar, semantics, and pragmatics on \u003Ca href=\u0022https:\/\/www.instagram.com\/danberges\/\u0022 target=\u0022_blank\u0022\u003EInstagram\u003C\/a\u003E, \u003Ca href=\u0022https:\/\/www.youtube.com\/@danberges\u0022 target=\u0022_blank\u0022\u003EYouTube\u003C\/a\u003E, and \u003Ca href=\u0022https:\/\/www.tiktok.com\/@dan_berges\u0022 target=\u0022_blank\u0022\u003ETikTok\u003C\/a\u003E."}}}; 385 window.Faqs = [["How long does it take to learn Spanish with Berges?","Most students become conversational after completing five levels (about 12-15 months of regular classes)."],["I\u0027ve never studied Spanish before. Is this right for me?","Yes! We designed our Beginners level specifically for people with zero Spanish experience."],["Will I be embarrassed in class as a beginner?","No. All Beginners students start at zero. Our instructors create a supportive environment where making mistakes is part of learning."],["How is this different from Spanish apps?","We teach grammar rules first, then practice. Apps make you guess patterns. Our method is faster for adults."],["Do you teach Castilian or Latin American Spanish?","Spanish is one language with regional differences (mostly accent and a handful of everyday words). We teach standard Spanish, so what you learn works wherever Spanish is spoken."],["Are classes recorded?","No. Classes are live only, which protects everyone\u0027s privacy and keeps students comfortable speaking up. "],["Do I need to keep my camera on?","Yes. Classes are live and interactive. Your instructor and classmates need to see you, just as you see them."],["How old do I need to be to enroll?","Our classes are for adults. If you\u0027re 16 or 17, you can enroll as long as a parent or legal guardian accepts our terms on your behalf."]]; 386 window.CourseDiscountPercentage = 20; 387 </script>
387 388 389 <link rel="preload" as="style" href="https://www.bergesinstitutespanish.com/build/assets/app-Bv3iErd9.css" /><link rel="modulepreload" as="script" href="https://www.bergesinstitutespanish.com/build/assets/app-CEQWladX.js" /><link rel="modulepreload" as="script" href="https://www.bergesinstitutespanish.com/build/assets/online-tools-Ce_6Y_KH.js" /><link rel="modulepreload" as="script" href="https://www.bergesinstitutespanish.com/build/assets/_commonjsHelpers-_d1bhYXs.js" /><link rel="modulepreload" as="script" href="https://www.bergesinstitutespanish.com/build/assets/bootstrap.esm-CjE0EDlS.js" /><link rel="modulepreload" as="script" href="https://www.bergesinstitutespanish.com/build/assets/vue-router-CSEP06dd.js" /><link rel="modulepreload" as="script" href="https://www.bergesinstitutespanish.com/build/assets/en-DhIVTV6R.js" /><link rel="modulepreload" as="script" href="https://www.bergesinstitutespanish.com/build/assets/vue-feather.esm-CuFuH1hV.js" /><link rel="modulepreload" as="script" href="https://www.bergesinstitutespanish.com/build/assets/_plugin-vue_export-helper-DlAUqK2U.js" /><link rel="stylesheet" href="https://www.bergesinstitutespanish.com/build/assets/app-Bv3iErd9.css" data-navigate-track="reload" />
389<script type="module" src="https://www.bergesinstitutespanish.com/build/assets/app-CEQWladX.js" data-navigate-track="reload"></script>
389 390
390<script> 391 // Disable context button and dragging 392 393 const body = document.querySelector('body'); 394 body.addEventListener('contextmenu', e => { 395 if (e.target.classList.contains('nocontext')) { 396 e.preventDefault(); 397 return false; 398 } 399 }); 400 401 body.addEventListener('dragstart', e => { 402 e.preventDefault(); 403 return false; 404 }); 405 406 // End of disable context button and dragging 407 </script>
vendor: 1 bytes, line 407
407
408<script> 409 (function () { 410 const popImages = document.querySelectorAll('.pop'); 411 412 pop(); 413 414 window.addEventListener('scroll', () => pop()); 415 416 function pop() { 417 popImages.forEach(item => { 418 if (item.getBoundingClientRect().top < window.innerHeight && item.getBoundingClientRect().bottom >= 0) { 419 if (!item.classList.contains('top')) item.classList.add('img-popup'); 420 } 421 }); 422 } 423 424 const zoomEls = document.querySelectorAll('.zoom'); 425 426 zoom(); 427 428 window.addEventListener('scroll', () => zoom()); 429 430 function zoom() { 431 zoomEls.forEach(item => { 432 if (item.getBoundingClientRect().top < window.innerHeight && item.getBoundingClientRect().bottom >= 0) { 433 item.classList.add('el-zoom'); 434 } 435 }); 436 } 437 438 // No zoom on iOS Safari 439 if (navigator.userAgent.indexOf('iPhone') > -1) { 440 document.querySelector("[name=viewport]") 441 .setAttribute("content", "width=device-width, initial-scale=1, maximum-scale=1"); 442 } 443 })(); 444</script>
444 445 446 447
447<script> 448 if (window.electronAPI?.isElectron) { 449 // Electron app: no analytics, no cookie banner 450 window.dataLayer = window.dataLayer || []; 451 window.gtag = function() {}; 452 } 453</script>
453 454 455<style> 456 body { padding-bottom: var(--cookie-bar-height, 0); } 457 #consent-bar .consent-configure { display: none; } 458 #consent-bar.is-configuring .consent-configure { display: block; } 459 #consent-bar.is-configuring #consent-configure-btn { display: none; } 460 #consent-bar.is-configuring .consent-primary-actions #cookie-consent-btn, 461 #consent-bar.is-configuring .consent-primary-actions #cookie-reject-btn { display: none; } 462</style> 463<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"> 464 <div> 465 <div class="small mb-3"> 466 We use our own and third-party cookies for analytics and advertising. You can accept, reject, or configure them. 467 <a href="https://www.bergesinstitutespanish.com/cookie-policy" target="_blank" rel="noopener">Cookie policy</a>. 468 </div> 469 <div class="d-flex gap-2 flex-wrap consent-primary-actions"> 470 <a href="#" id="consent-configure-btn" class="btn btn-sm btn-outline-dark">Manage</a> 471 <a href="#" id="cookie-reject-btn" class="btn btn-sm btn-primary">Reject</a> 472 <a href="#" id="cookie-consent-btn" class="btn btn-sm btn-primary">Accept</a> 473 </div> 474 </div> 475 <div class="consent-configure"> 476 <div class="small"> 477 <div class="mb-2"> 478 <label class="d-flex align-items-center gap-2"> 479 <input type="checkbox" disabled checked> 480 <span><strong>Strictly necessary</strong> â always on</span> 481 </label> 482 </div> 483 <div class="mb-2"> 484 <label class="d-flex align-items-center gap-2"> 485 <input type="checkbox" id="consent-analytics"> 486 <span><strong>Analytics</strong> â Google Analytics, Microsoft Clarity</span> 487 </label> 488 </div> 489 <div class="mb-3"> 490 <label class="d-flex align-items-center gap-2"> 491 <input type="checkbox" id="consent-advertising"> 492 <span><strong>Advertising</strong> â Google Ads, Meta Pixel</span> 493 </label> 494 </div> 495 </div> 496 <div> 497 <a href="#" id="consent-save-btn" class="btn btn-sm btn-primary">Save preferences</a> 498 </div> 499 </div> 500</div> 501
502<script> 503 document.addEventListener('DOMContentLoaded', () => { 504 if (window.electronAPI?.isElectron) return; 505 506 const GA_ID = "G-ZSV58WYSZ0"; 507 const CLARITY_ID = "u2fd8n3b0i"; 508 const FB_PIXEL_ID = "2327647080993486"; 509 510 // Load GA script dynamically 511 const gaScript = document.createElement('script'); 512 gaScript.defer = true; 513 gaScript.src = 'https://www.googletagmanager.com/gtag/js?id=' + GA_ID; 514 document.head.appendChild(gaScript); 515 516 window.dataLayer = window.dataLayer || []; 517 window.gtag = function() {dataLayer.push(arguments);} 518 519 gtag('consent', 'default', { 520 'ad_storage': 'denied', 521 'ad_user_data': 'denied', 522 'ad_personalization': 'denied', 523 'analytics_storage': 'denied' 524 }); 525 526 gtag('js', new Date()); 527 gtag('config', GA_ID); 528 529 const consentBarEl = document.getElementById('consent-bar'); 530 const acceptBtn = document.getElementById('cookie-consent-btn'); 531 const rejectBtn = document.getElementById('cookie-reject-btn'); 532 const configureBtn = document.getElementById('consent-configure-btn'); 533 const saveBtn = document.getElementById('consent-save-btn'); 534 const analyticsToggle = document.getElementById('consent-analytics'); 535 const advertisingToggle = document.getElementById('consent-advertising'); 536 537 // Consent storage â JSON shape {v:1, analytics, advertising, ts}. 538 // Legacy values ('granted'/'denied') are migrated on first read. 539 const readPrefs = () => { 540 const raw = window.localStorage.getItem('cookieConsent'); 541 if (!raw) return null; 542 if (raw === 'granted') return { v: 1, analytics: true, advertising: true, ts: Date.now() }; 543 if (raw === 'denied') return { v: 1, analytics: false, advertising: false, ts: Date.now() }; 544 try { 545 const parsed = JSON.parse(raw); 546 if (parsed && typeof parsed === 'object') return parsed; 547 } catch (_) {} 548 return null; 549 }; 550 551 const writePrefs = (prefs) => { 552 const payload = { v: 1, analytics: !!prefs.analytics, advertising: !!prefs.advertising, ts: Date.now() }; 553 window.localStorage.setItem('cookieConsent', JSON.stringify(payload)); 554 const cats = []; 555 if (payload.analytics) cats.push('analytics'); 556 if (payload.advertising) cats.push('advertising'); 557 const cookieValue = cats.length ? cats.join(',') : 'none'; 558 document.cookie = `cookie_consent=${cookieValue}; max-age=31536000; path=/; SameSite=Lax; Secure`; 559 }; 560 561 // Honor Global Privacy Control: treat as reject-all, never show the bar. 562 const gpcEnabled = navigator.globalPrivacyControl === true; 563 564 const stored = readPrefs(); 565 566 // Re-affirm the server-visible cookie on every load so it can't drift 567 // from localStorage (cookie expires after a year, localStorage forever). 568 if (stored) writePrefs(stored); 569 570 const updateBarHeight = () => { 571 document.documentElement.style.setProperty('--cookie-bar-height', consentBarEl.offsetHeight + 'px'); 572 }; 573 const barResizeObserver = new ResizeObserver(updateBarHeight); 574 575 const hideBar = () => { 576 barResizeObserver.unobserve(consentBarEl); 577 consentBarEl.classList.add('d-none'); 578 consentBarEl.classList.remove('is-configuring'); 579 document.documentElement.style.removeProperty('--cookie-bar-height'); 580 }; 581 582 const showBar = (prefill) => { 583 analyticsToggle.checked = !!(prefill && prefill.analytics); 584 advertisingToggle.checked = !!(prefill && prefill.advertising); 585 consentBarEl.classList.remove('d-none'); 586 consentBarEl.classList.remove('is-configuring'); 587 updateBarHeight(); 588 barResizeObserver.observe(consentBarEl); 589 }; 590 591 const commit = (prefs) => { 592 writePrefs(prefs); 593 applyConsent(prefs); 594 hideBar(); 595 }; 596 597 acceptBtn.addEventListener('click', (e) => { 598 e.preventDefault(); 599 commit({ analytics: true, advertising: true }); 600 }); 601 602 rejectBtn.addEventListener('click', (e) => { 603 e.preventDefault();
604 commit({ analytics: false, advertising: false }); 605 }); 606 607 configureBtn.addEventListener('click', (e) => { 608 e.preventDefault(); 609 consentBarEl.classList.add('is-configuring'); 610 updateBarHeight(); 611 }); 612 613 saveBtn.addEventListener('click', (e) => { 614 e.preventDefault(); 615 commit({ analytics: analyticsToggle.checked, advertising: advertisingToggle.checked }); 616 }); 617 618 // Fetch geo client-side so the response cache can't freeze it to one visitor's location. 619 const resolveCountry = () => { 620 const cached = window.sessionStorage.getItem('geoCountry'); 621 if (cached) return Promise.resolve(cached); 622 623 return fetch('https://www.bergesinstitutespanish.com/geo', { headers: { 'Accept': 'application/json' } }) 624 .then((res) => res.json()) 625 .then((data) => { 626 if (data.country) { 627 window.sessionStorage.setItem('geoCountry', data.country); 628 } 629 return data.country || null; 630 }) 631 .catch(() => null); 632 }; 633 634 if (gpcEnabled && !stored) { 635 // GPC: record a reject and move on without showing the bar. 636 writePrefs({ analytics: false, advertising: false }); 637 } else if (stored) { 638 applyConsent(stored); 639 } else { 640 resolveCountry().then((country) => { 641 if (country === 'US' || country === 'MX') { 642 // Outside GDPR scope â treat auto-skip as implicit consent for ad attribution. 643 const prefs = { analytics: true, advertising: true }; 644 writePrefs(prefs); 645 applyConsent(prefs); 646 } else { 647 showBar(null); 648 } 649 }); 650 } 651 652 // Footer "Cookie preferences" link calls this. 653 window.showCookiePreferences = () => { 654 const current = readPrefs() || { analytics: false, advertising: false }; 655 showBar(current); 656 consentBarEl.classList.add('is-configuring'); 657 updateBarHeight(); 658 }; 659 660 function applyConsent(prefs) { 661 gtag('consent', 'update', { 662 'analytics_storage': prefs.analytics ? 'granted' : 'denied', 663 'ad_storage': prefs.advertising ? 'granted' : 'denied', 664 'ad_user_data': prefs.advertising ? 'granted' : 'denied', 665 'ad_personalization': prefs.advertising ? 'granted' : 'denied' 666 }); 667 668 if (prefs.analytics && !window.__clarityLoaded) { 669 window.__clarityLoaded = true; 670 (function(c,l,a,r,i,t,y){ 671 c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)}; 672 t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i; 673 y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y); 674 })(window, document, "clarity", "script", CLARITY_ID); 675 } 676 677 if (prefs.advertising && !window.__fbPixelLoaded) { 678 window.__fbPixelLoaded = true; 679 !function(f,b,e,v,n,t,s) 680 {if(f.fbq)return;n=f.fbq=function(){n.callMethod? 681 n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 682 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 683 n.queue=[];t=b.createElement(e);t.async=!0; 684 t.src=v;s=b.getElementsByTagName(e)[0]; 685 s.parentNode.insertBefore(t,s)}(window, document,'script', 686 'https://connect.facebook.net/en_US/fbevents.js'); 687 fbq('init', FB_PIXEL_ID); 688 fbq('track', 'PageView'); 689 } 690 } 691 }); 692</script>
vendor: 1 bytes, line 692
692
693<script> 694 if (window.electronAPI?.isElectron) { 695 const s = document.createElement('script'); 696 s.defer = true; 697 s.src = 'https://cloud.umami.is/script.js'; 698 s.dataset.websiteId = '2e842327-995f-40ff-96f6-f13f98e2bd08'; 699 document.head.appendChild(s); 700 } 701</script>
vendor: 1 bytes, line 701
701
702<script defer src="https://unpkg.com/feather-icons" onload="feather.replace()"></script>
702 703</body> 704</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.