PageSourceSearch

https://crunchplus.com/accounts/login

html crunchplus.com collected 2026-10-01 14:03:38 UTC 106,780 bytes, 3,708 lines download raw bytes

1
2
3<!DOCTYPE html>
4<html lang="en">
5  <head>
6    
7
8
9<script>(function(){try{var b=['_hsmi','ver','_hsenc','hsCtaTracking','mc_eid','refemail'];var u=window.location.href;if(b.some(function(p){return u.indexOf(p+'=')!==-1;})){var url=new URL(u);b.forEach(function(p){url.searchParams.delete(p);});window.history.replaceState({},'',url.toString());}}catch(e){}})();</script>
9
10
11<!-- Google Tag Manager -->
12<script>
vendor: 438 bytes, lines 12-26
12
13  (function(w, d, s, l, i) {
14    w[l] = w[l] || [];
15    w[l].push({
16      "gtm.start":
17        new Date().getTime(),
18      event: "gtm.js"
19    });
20    var f = d.getElementsByTagName(s)[0],
21      j = d.createElement(s), dl = l != "dataLayer" ? "&l=" + l : "";
22    j.async = true;
23    j.src =
24      "https://www.googletagmanager.com/gtm.js?id=" + i + dl;
25    f.parentNode.insertBefore(j, f);
26  })(window, document, "script", "dataLayer", "
26GTM-53V6DZZ7
vendor: 5 bytes, line 26
26"); 
27</script>
27
28
29
30
31<meta charset="utf-8" />
32<meta name="viewport"
33      content="width=device-width initial-scale=1.0 maximum-scale=2.0, user-scalable=yes" />
34
35
36  <title>Crunch+ by Crunch Fitness |  Best Online Workout Program: Virtual Fitness &amp; Exercise Classes</title>
37
38
39
40  <meta name="description"
41        content="Crunch+ offers live fitness classes, on-demand streaming classes, and workout plans to keep you motivated and having fun. Get fit on the fly!">
42
43
44
45  <meta name="keywords"
46        content="online workout program, online fitness classes, best online workout program, online exercise classes, virtual fitness classes, virtual workouts, online gym classes, virtual exercise classes, virtual gym classes, streaming workout program, live fitness class, live workout class">
47
48
49
50  
51    <meta property="og:title"
52          content="Crunch+ by Crunch Fitness |  Best Online Workout Program: Virtual Fitness &amp;amp; Exercise Classes" />
53
54    
55    
56      <meta property="og:image"
57            content="https://crunchplus-prod-cdn2.imgix.net/2154/images/cYr0wCx3QjmdxlaaZJnh_1718014609416_Account_2154?ixlib=rb-0.3.4&amp;s=dd67a19726d873f88b00d02c3d3867d6&amp;auto=compress" />
58    
59
60    
61    <meta property="og:description"
62          content="Crunch+ offers live fitness classes, on-demand streaming classes, and workout plans to keep you motivated and having fun. Get fit on the fly!" />
63    
64    <meta property="og:type"
65          content="video.movie" />
66    <meta property="og:url"
67          content="https://crunchplus.com/accounts/login" />
68  
69
70
71<link rel="canonical" href="https://crunchplus.com/accounts/login" />
72
73<meta name="csrf-param" content="authenticity_token" />
74<meta name="csrf-token" content="fbQdjceyXthVL3+/AklR0X5UibTyDl3mfq2CkWQ9nkQ8xUF6NswECkVIwNdNgD8ncM2gzAYsLLllDYOSEqh0XQ==" />
75
76
77
78
79
80	<link rel="icon" href="//crunchplus-prod-cdn2.imgix.net/2154/images/22y8qTISDmU083gk72hT_1790657852363_Account_2154?ixlib=rb-0.3.4&amp;s=7bd34255255e0b50083101dff173dfb7&amp;auto=compress" type="image/x-icon">
81	<link rel="shortcut icon" href="//crunchplus-prod-cdn2.imgix.net/2154/images/22y8qTISDmU083gk72hT_1790657852363_Account_2154?ixlib=rb-0.3.4&amp;s=7bd34255255e0b50083101dff173dfb7&amp;auto=compress" type="image/x-icon" />
82	<link rel="apple-touch-icon" href="//crunchplus-prod-cdn2.imgix.net/2154/images/22y8qTISDmU083gk72hT_1790657852363_Account_2154?ixlib=rb-0.3.4&amp;s=7bd34255255e0b50083101dff173dfb7&amp;auto=compress">
83
84
85
86<link rel="stylesheet" media="screen" href="//dbjtwsnsmnuln.cloudfront.net/assets/pink_essence/all-99bc76d8ddcea7fdc8a234e6f03c593284401488941518c36b6410d25b935d7a.css" />
87
88
89
90
91<style>
92  
93
94  
95  .modal h2 {
96    color: #ffffff;
97  }
98
99  header .button.secondary {
100    border-color: #ffffff;
101    color: #ffffff;
102  }
103
104  h2.custom-font, .content h2, .main-content h2, #home_page h2, .page-subscribe h2, #favorite_media.active span.fa {
105    color: #ffffff;
106  }
107
108  .fave-corner {
109    border-color: rgba(255, 255, 255, 0) #ffffff rgba(255, 255, 255, 0) rgba(255, 255, 255, 0);
110  }
111
112  
113
114
115  
116  
117
118  
119  
120
121  header nav ul li.active a {
122    border-bottom: 2px solid #4a4a4a;
123  }
124
125  
126  
127  
128  
129
130  
131  
132  .button.primary,
133  .nu-list.cards li .button.primary,
134  .nu-list.week-calendar li.current-date, .nu-list.week-calendar li.current-date.here,
135  .modal input[type='submit'] {
136    background: #DE325B;
137    border-color: #DE325B;
138  }
139
140  .number {
141    color: ;
142    background-color: ;
143    border-color: 
144  }
145
146  .number:focus,
147  .number:hover,
148  .number:active,
149  .number--active {
150    color: #ffffff;
151    border-color: #ffffff !important;
152  }
153
154  .number--current {
155    color: #DE325B;
156  }
157
158  .number--current-active {
159    background-color: #DE325B !important;
160    color: white;
161  }
162
163  .number--current:hover,
164  .number--current-active:hover,
165  .number--current-active:focus,
166  .number--current-active:active {
167    border-color: transparent !important;
168    background-color: #DE325B !important;
169    color: white;
170  }
171
172  .dots__dot, .my-calendar-events__legend .dot {
173    background-color: #ffffff !important;
174  }
175
176  .my-calendar-events__list__cards__card {
177    border-left: solid 4px#DE325B;
178  }
179
180  
181
182  
183  
184  header nav ul li.has-dropdown:hover .dropdown-arrow {
185    border-bottom: 6px solid #E1456A !important;
186  }
187
188  
189
190  
191  
192  
193  
194  
195  
196  
197  
198  
199  
200  
201  
202  
203  
204  
205  
206  
207  
208  
209  
210  
211  
212  
213  
214  
215  
216  
217  
218  
219  
220
221  
222  
223  .page-index .image-feature,
224  .page-index .image-feature .button.plain,
225  .page-index header nav.site-nav-header-login ul li a,
226  .page-index header nav.site-nav-header-login ul li a.button.plain,
227  .page-index header nav.site-nav-header ul li a,
228  .page-index header nav.site-nav-header ul li span {
229    color: #ffffff;
230  }
231
232  .page-index header nav.site-nav-header ul li.has-dropdown > a:hover,
233  .page-index header nav ul li.has-dropdown:hover > a {
234    color: #ffffff !important;
235  }
236
237  .page-index header nav.site-nav-header-login ul li a.button.plain,
238  .page-index .image-feature .button.plain {
239    border-color: #ffffff;
240    
241  }
242
243  .page-index header nav ul li.has-dropdown .dropdown-arrow {
244    border-top: 6px solid#ffffff;
245  }
246
247  
248
249  
250  
251
252  
253  
254
255  
256  .page-about .custom-section.logo-soup h2 {
257   color: #fff;
258  
259  }
260
261  /* -- Marketing Modal -- */
262  
263  
264
265  
266  
267
268  /* -- Pre-Launch Page -- */
269  
270  
271  
272  
273
274  
275  
276
277  /* -- Advanced - Custom CSS -- */
278  
279  
280
281</style>
282
283
284<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
vendor: 1 bytes, line 284
284
285<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"></script>
285
286
287
288
289
290
291
292
293<script>
294  var client = parseInt("2154");
295</script>
295
296
297
298
299
300
301
302  </head>
303
304  
305  
306  
307  
308  
309  
310
311  
312  
313  
314
315  <div class="vue-app">
316    <global_paused-subscription-banner></global_paused-subscription-banner>
317  </div>
318
319  
320    
321
322<body class="iv-pink_essence page-login login-page not-rounded interstate default-delivery public-view">
323
324<!-- Google Tag Manager -->
vendor: 65 bytes, lines 324-326
324
325<noscript>
326  <iframe src="//www.googletagmanager.com/ns.html?id=
326GTM-53V6DZZ7
vendor: 114 bytes, lines 326-330
326"
327          height="0"
328          width="0"
329          style="display:none;visibility:hidden"></iframe>
330</noscript>
331<script>
332  window.dataLayer = window.dataLayer || [];
333  var payloadPageView = {
334      "event": "VirtualPageview",
335      "user_id": ("" || "none").trim() || "none",
336      "membership_plan": ("" || "none").trim() || "none",
337      "crunch_fitness_member": ("false" || "none").trim() || "none"
338  };
339    dataLayer.push(payloadPageView);
340</script>
vendor: 1 bytes, line 340
340
341<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
341
342<!-- End Google Tag Manager -->
343
344
345
346
347
348
349
350
351
352  <div class="modal-wrapper">
353    <div class="overlay">
354      <div class="modal">
355        <div class="close"
356             for="modal-preview"><!--Close <span class="fa fa-close"></span>--></div>
357
358        
359        <div class="header ">
360          
361          
362            <h2 class="custom-font">A pop up modal with title</h2>
363          
364          
365          
366          
367        </div>
368
369        
370        
371          <p>To add your form code here go to Theme Settings > Strategy > Forms >
372            <strong>Modal Pop Up</strong>
373          </p>
374
375          <!-- Begin MailChimp Signup Form -->
376          <div id="mc_embed_signup">
377            <form action="//crunchplus.us6.list-manage.com/subscribe/post?u=123&amp;id=123"
378                  method="post"
379                  id="mc-embedded-subscribe-form"
380                  name="mc-embedded-subscribe-form"
381                  class="validate"
382                  target="_blank" rel="noopener noreferrer" aria-label="Opens in a new tab"
383                  novalidate>
384              <div id="mc_embed_signup_scroll">
385
386                <div class="indicates-required">
387                  <span class="asterisk">*</span>
388                  indicates required
389                </div>
390                <div class="mc-field-group">
391                  <label for="mce-EMAIL">Email Address
392                    <span class="asterisk">*</span>
393                  </label>
394                  <input type="email"
395                         value=""
396                         name="EMAIL"
397                         class="required email"
398                         aria-label="Email"
399                         id="mce-EMAIL">
400                </div>
401                <div class="mc-field-group">
402                  <label for="mce-FNAME">First Name</label>
403                  <input type="text"
404                         tabindex="0"
405                         value=""
406                         name="FNAME"
407                         class=""
408                         aria-label="First name"
409                         id="mce-FNAME">
410                </div>
411                <div class="mc-field-group">
412                  <label for="mce-LNAME">Last Name</label>
413                  <input type="text"
414                         tabindex="0"
415                         value=""
416                         name="LNAME"
417                         aria-label="Last name"
418                         class=""
419                         id="mce-LNAME">
420                </div>
421                <div id="mce-responses"
422                     class="clear">
423                  <div class="response"
424                       id="mce-error-response"
425                       style="display:none"></div>
426                  <div class="response"
427                       id="mce-success-response"
428                       style="display:none"></div>
429                </div>
430                <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
431                <div style="position: absolute; left: -5000px;"
432                     aria-hidden="true">
433                  <input type="text"
434                         tabindex="0"
435                         name="b_25487b8f7ec655d5fba97f7fd_b4a9c11fdd"
436                         tabindex="-1"
437                         value="">
438                </div>
439                <div class="clear">
440                  <input type="submit"
441                         value="Subscribe"
442                         name="subscribe"
443                         id="mc-embedded-subscribe"
444                         class="button">
445                </div>
446              </div>
447            </form>
448          </div>
449          <!--End mc_embed_signup-->
450        
451      </div>
452    </div>
453  </div>
454
455
456<div class="video-modal">
457  <div id="video-modal-content" class="video-modal-content">
458     <iframe
459        id="video_player"
460        width="100%"
461        height="100%"
462        frameborder="0"
463        allowfullscreen
464        src=
465      ></iframe>
466      <a href="#" class="close-video-modal">
467        <svg
468          version="1.1"
469          xmlns="http://www.w3.org/2000/svg"
470          xmlns:xlink="http://www.w3.org/1999/xlink"
471          x="0"
472          y="0"
473          viewBox="0 0 32 32"
474          style="enable-background:new 0 0 32 32;"
475          xml:space="preserve"
476          width="24"
477          height="24"
478          role="presentation"
479        >
480          <g id="icon-x-close">
481            <path fill="#ffffff" d="M30.3448276,31.4576271 C29.9059965,31.4572473 29.4852797,31.2855701 29.1751724,30.980339 L0.485517241,2.77694915 C-0.122171278,2.13584324 -0.104240278,1.13679247 0.52607603,0.517159487 C1.15639234,-0.102473494 2.17266813,-0.120100579 2.82482759,0.477288136 L31.5144828,28.680678 C31.9872448,29.1460053 32.1285698,29.8453523 31.8726333,30.4529866 C31.6166968,31.0606209 31.0138299,31.4570487 30.3448276,31.4576271 Z" id="Shape"></path>
482            <path fill="#ffffff" d="M1.65517241,31.4576271 C0.986170142,31.4570487 0.383303157,31.0606209 0.127366673,30.4529866 C-0.12856981,29.8453523 0.0127551942,29.1460053 0.485517241,28.680678 L29.1751724,0.477288136 C29.8273319,-0.120100579 30.8436077,-0.102473494 31.473924,0.517159487 C32.1042403,1.13679247 32.1221713,2.13584324 31.5144828,2.77694915 L2.82482759,30.980339 C2.51472031,31.2855701 2.09400353,31.4572473 1.65517241,31.4576271 Z" id="Shape"></path>
483          </g>
484        </svg>
485      </a>
486  </div>
487  <div class="overlay"></div>
488</div>
489
490
491  <a href="javascript:"
492     id="anchor"
493     aria-label="Back to Top"> <span class="fa fa-chevron-up"></span> </a>
494
495  
496<div class="site-nav-drawer hidden">
497  <div class="inner">
498    <p class="title">&nbsp;
499      <span class="close"></span>
500    </p>
501
502    <form class="search-bar global-search"
503          role="search"
504          id="search-form">
505      <input type="search"
506             id="term"
507             name="term"
508             aria-label="Search Term"
509             placeholder="Enter search term"
510             value="" />
511      <button type="submit">
512        <span>SEARCH</span>
513      </button>
514    </form>
515
516    <nav role="navigation">
517      <ul>
518        
519        
520        
521
522          
523          
524            <li class="toggle-item"
525                id="nav_dt_browse">
526              <span class="label toggle">Workouts
527                <span class="fa fa-caret-down"></span>
528              </span>
529              <ul class="toggle-wrapper">
530                <li>
531                  <a href="/categories" class="workouts-dropdown__link workouts-dropdown__link--ondemand">On-Demand</a>
532                </li>
533                <li>
534                  <a href="/gym_workouts" class="workouts-dropdown__link workouts-dropdown__link--gym" aria-label="Gym Workouts — New">
535                    <span class="workouts-dropdown__gym-text">Gym Workouts</span>
536                    <span class="workouts-dropdown__new-badge">NEW</span>
537                  </a>
538                </li>
539              </ul>
540            </li>
541
542          
543        
544        
545          <li class="live-stream-link nav_dt_browse"
546              aria-label="Explore live streams">
547            <a href="/live_streams" aria-label="Livestream">Livestream</a>
548          </li>
549        
550
551        
552
553        
554        
555
556        
557        
558        
559        
560
561
562        
563          
564          <li class="toggle-item" id="nav_dt_browse">
565            <span class="label toggle">Subscribe
566              <span class="fa fa-caret-down"></span>
567            </span>
568            <ul class="toggle-wrapper">
569              <li>
570                <a href="/orders/retail_account">All - Access</a>
571              </li>
572              <li>
573                <a href="/accounts/signup/">Crunch Members</a>
574              </li>
575            </ul>
576          </li>
577          <li id="nav_dt_start_free_trial">
578            <a href="/crunch_subscriptions" aria-label="Start free trail for retail user">Start Free Trial</a>
579          </li>
580        
581        <li 
582            id="nav_dt_ia">
583          <a href="/instantaccess">Apps</a>
584        </li>
585        <li id="nav_sn_support">
586          <a href="javascript:zE.activate({hideOnClose: true})">Support</a>
587        </li>
588        
589        
590        
591        
592          <li class="active"
593                id="nav_sn_login">
594            <a href="/accounts/login" aria-label="Log into your account">Log In</a>
595          </li>
596        
597      </ul>
598    </nav>
599
600    <div class="site-nav-drawer-footer">
601      <p>
602        Let's be social
603        <span class="social-icons">
604          
605          
606            <a class="fa fa-twitter"
607               rel="external"
608               href="https://twitter.com/crunchgym"
609               aria-label="Twitter"></a>
610          
611          
612          
613            <a class="fa fa-facebook"
614               rel="external"
615               href="https://www.facebook.com/CRUNCH/"
616               aria-label="Facebook"></a>
617          
618          
619          
620            <a class="fa fa-instagram"
621               rel="external"
622               href="https://www.instagram.com/crunchgym/"
623               aria-label="Instagram"></a>
624          
625          
626          
627        </span>
628      </p>
629
630      <p>
631        &copy; 2026 Crunch+. All Rights Reserved. </p>
632    </div>
633  </div>
634</div>
635
636<style>
637  .toggle .fa-caret-down {
638  color: #333;
639  transition: transform 0.3s ease, color 0.3s ease;
640  }
641
642  .toggle-item.open > .toggle .fa-caret-down {
643    transform: rotate(180deg);
644    color: #E1456A;
645  }
646</style>
647
648<script>
649   document.addEventListener("DOMContentLoaded", function () {
650    document.querySelectorAll(".toggle-item .toggle").forEach(function (toggle) {
651      toggle.addEventListener("click", function () {
652        const parent = this.closest(".toggle-item");
653        parent.classList.toggle("open");
654      });
655    });
656  });
657</script>
657
658
659
660  
661
662
663
664
665
666
667
668
669
670
671
672
673
674<!-- OneTrust Cookies Consent Notice -->
675<script type="text/javascript">
676  (function () {
677    if (window.location.hostname === "crunchplus.com") {
678      loadOptanonScripts(
679        "https://cdn.cookielaw.org/consent/01949038-adfa-7a50-a000-2f9d149c8771/OtAutoBlock.js",
680        "https://cdn.cookielaw.org/scripttemplates/otSDKStub.js",
681        "01949038-adfa-7a50-a000-2f9d149c8771"
682      );
683    } else {
684      loadOptanonScripts(
685        "https://cdn.cookielaw.org/consent/01949038-adfa-7a50-a000-2f9d149c8771-test/OtAutoBlock.js",
686        "https://cdn.cookielaw.org/scripttemplates/otSDKStub.js",
687        "01949038-adfa-7a50-a000-2f9d149c8771-test"
688      );
689    }
690
691    function loadOptanonScripts(autoBlockUrl, sdkStubUrl, domainScript) {
692      var otScript1 = document.createElement('script');
693      otScript1.src = autoBlockUrl;
694      document.head.appendChild(otScript1);
695
696      var otScript2 = document.createElement('script');
697      otScript2.src = sdkStubUrl;
698      otScript2.setAttribute('data-domain-script', domainScript);
699      document.head.appendChild(otScript2);
700
701      var optanonScript = document.createElement('script');
702      optanonScript.type = "text/javascript";
703      optanonScript.innerHTML = "function OptanonWrapper() { }";
704      document.head.appendChild(optanonScript);
705    }
706  })();
707</script>
707
708<!-- OneTrust Cookies Consent Notice End -->
709
710<style>
711  div#onetrust-close-btn-container {
712    display: none;
713  }
714
715  @media screen and (max-width: 1024px){
716    .login-button-mobile {
717      background-color: white;
718      color: #000;
719      display: flex;
720      width: 70px;
721      border-radius: 100px;
722      padding: 8px;
723      justify-content: center;
724      text-decoration: none;
725      font-family: 'Interstate-Black' !important;
726    }
727
728    header .inner .single.branding {
729      display: flex;
730      margin: 1em;
731    }
732
733    body header .inner {
734      padding: 0;
735    }
736
737    .menu-drawer .fa.fa-bars {
738      font-size: 20px !important;
739    }
740
741    .mobile-show {
742        align-self: center;
743    }
744
745    body .header--right {
746      display: -webkit-flex;
747      display: flex;
748      -webkit-justify-content: flex-end;
749      justify-content: flex-end;
750      -webkit-align-self: center;
751      align-self: center;
752      gap: 1rem;
753    }
754
755    body button.mobile-login {
756      padding: 0;
757    }
758
759    body header .logo img {
760      max-height: 45px !important;
761    }
762  }
763
764  .whats-new__notification {
765    background: linear-gradient(90deg, #E33B89 0%, #5B32AC 100%);
766  }
767
768  @media screen and (min-width: 1025px){
769    body .hide-header-right-section { 
770      display: none; 
771    }
772
773    body button.mobile-login {
774      display: none;
775    }
776  }
777
778  @keyframes popupAnimation {
779    0% {
780      top: -100%; /* Start position off-screen */
781      left: 50%;
782      transform: translateX(-50%);
783    }
784    45% {
785      top: 50%; /* Move to the center */
786    }
787    80% {
788      top: 48%; /* Slight bounce */
789    }
790    100% {
791      top: 50%; /* End position centered */
792      left: 50%;
793      transform: translate(-50%, -50%);
794    }
795  }
796
797
798  .popup {
799    display: none;
800    position: fixed;
801    top: 50%; 
802    left: 50%;
803    transform: translate(-50%, -50%); 
804    width: auto;
805    max-width: 96%;
806    
807    max-height: 90%; 
808    animation: popupAnimation 1s ease-in-out;
809    background-color: #fff;
810    padding: 20px;
811    border-radius: 10px;
812    box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1);
813    z-index: 99999;
814  }
815
816  .popup-content {
817    text-align: center;
818    color: #000;
819  }
820
821  .popup h2 {
822    font-family: "Interstate-Black" !important;
823    font-size: 25px;
824    word-spacing: -3px;
825    animation: none;
826    text-align: center;
827    margin: 0 auto 10px;
828    display: block;
829  }
830
831  .popup p {
832    margin-bottom: 20px;
833  }
834
835  .popup .button {
836    display: flex;
837    justify-content: center;
838    background-color: #fff;
839    font-size: 14px;
840    gap: 14px;
841    cursor: pointer;
842  }
843
844  .popup button {
845    border: none;
846  }
847
848  #close-btn {
849    font-family: "Interstate-Black" !important;
850  }
851
852  #install-btn {
853    font-family: "Interstate-Black" !important;
854    width: 120px;
855    justify-content: center;
856    display: flex;
857    background: linear-gradient(90deg, #E33B89 0%, #5B32AC 100%);
858  }
859
860  .close-button {
861    background: none;
862    top: 0;
863    right: 0;
864  }
865
866  .close-button.close::before, .close-button.close::after {
867    background: #000;
868    height: 1em;
869    margin-right: 7px;
870    margin-top: 2px;
871    left: unset;
872  }
873
874  .backdrop {
875    display: none;
876    position: fixed;
877    top: 0;
878    left: 0;
879    width: 100%;
880    height: 100%;
881    background-color: rgba(0, 0, 0, 0.5);
882    z-index: 999;
883  }
884
885  @media screen and (max-width: 380px){
886    #close-btn {
887      font-size: 11px;
888    }
889
890    #install-btn {
891      font-size: 11px;
892    }
893
894    .popup h2 {
895      font-size: 20px;
896    }
897  }
898
899  @media screen and (max-width: 319px){
900    .popup .button {
901      display: grid;
902    }
903  }
904
905  .show {
906    display: block;
907  }
908
909  header .inner.search.show-search {
910    margin-bottom: 0px !important
911  }
912  
913</style>
914
915
916
917
918<header class="site-header">
919  
920    <input type="hidden"
921         id="show_location_login"
922         value="false" />
923
924  
925  <input type="hidden"
926         id="content_delivery_preference"
927         value="" />
928         
929  <input type="hidden"
930         id="general_messaging_restricted_button_link"
931         value="" />   
932         
933    <body>
934    <div id="install-popup" class="popup">
935      <button type="button" class="close close-button close-button-event-class" aria-label="Close">
936      </button>
937      <div class="popup-content">
938        <h2>Workout With The Crunch+ App</h2>
939        <p>Live & on-demand workouts are better on the app.</p>
940      </div>
941        <div class="button">
942          <button type="button" aria-label="Install an app" tabindex="0" id="install-btn" style="background: linear-gradient(90deg, #E33B89 0%, #5B32AC 100%);">Install Now</button>
943          <button type="button" tabindex="0" id="close-btn" aria-label="Continue on website">Continue on website</button>
944        </div>
945    </div>
946    <div id="backdrop" class="backdrop"></div>
947    </body>         
948  <div class="inner restricted">
949    <div class="single left">
950      
951      
952
953      <nav style="width: 100%" role="navigation" class="site-nav-header mobile-hide"
954           aria-label="Top Primary">
955        <ul>
956          
957          
958          
959            
960              <li class="has-dropdown">
961                <a href="/categories" aria-label="Browse all categories" aria-haspopup="true" aria-expanded="false">Workouts
962                    <span class="dropdown-arrow"></span>
963                </a>
964                <ul class="dropdown workouts-dropdown"
965                    role="menu">
966                  <li class="workouts-dropdown__row">
967                    <a href="/categories" class="workouts-dropdown__link workouts-dropdown__link--ondemand">On-Demand</a>
968                  </li>
969                  <li class="workouts-dropdown__row">
970                    <a href="/gym_workouts" class="workouts-dropdown__link workouts-dropdown__link--gym" aria-label="Gym Workouts — New">
971                      <span class="workouts-dropdown__gym-text">Gym Workouts</span>
972                      <span class="workouts-dropdown__new-badge">NEW</span>
973                    </a>
974                  </li>
975                </ul>
976              </li>
977            
978            
979          
980
981          
982
983          
984
985          
986            <li class="live-stream-link" aria-label="Explore live streams">
987              <a href="/live_streams" aria-label="Livestream">Livestream</a>
988            </li>
989          
990
991          
992
993          <li>
994              <a href="/instantaccess" aria-label="Explore instant access devices">APPS</a>
995          </li>
996
997          
998          
999          
1000          
1001        </ul>
1002      </nav>
1003      
1004    </div>
1005    
1006
1007    <div class="single branding">
1008      <nav role="navigation" class="site-nav-header-login mobile-show"
1009           aria-label="Mobile">
1010        <ul>
1011          <li class="menu-drawer">
1012            <a href="#"
1013               data-transition="ease"
1014               aria-label="Show Mobile Menu"
1015               title="Mobile Menu">
1016              <i class="fa fa-bars"></i>
1017            </a>
1018          </li>
1019        </ul>
1020      </nav>
1021
1022      
1023          <a href="/"
1024             class="logo">
1025            
1026
1027            
1028            
1029                <img src="//dbjtwsnsmnuln.cloudfront.net/assets/pink_essence/White-logo-by-crunch-fitness-c841aa3d48b47c06bcf40f3220d37c5b51798893b59ce9da0071eab149654685.png"
1030                     alt="Pink Essence theme logo" />
1031             
1032
1033          </a>
1034
1035        
1036          <div class="header--right hide-header-right-section">
1037            
1038              
1039                <button type="button" tabindex="0" class="mobile-login">
1040                  <a href="/accounts/login/"
1041                    aria-label="Login into your account"
1042                    class="login-button-mobile">LOGIN
1043                  </a>
1044                </button>
1045              
1046            
1047          </div>
1048        
1049    </div>
1050
1051    <div class="single right">
1052      <div class="inner">
1053        <nav role="navigation" class="site-nav-header-login "
1054             aria-label="Top Secondary">
1055          <ul>
1056            
1057              <li id="nav_dt_search"
1058                  class="toggle-search"
1059                  aria-label="Search"
1060                  tabindex="0">
1061                <span class="toggle open">
1062                  <span class="fa fa-search"></span>
1063                </span>
1064              </li>
1065            
1066            
1067              <li class="has-dropdown">
1068                <a href="/crunch_subscriptions"
1069                  aria-label="View subscription plans"
1070                  aria-haspopup="true"
1071                  aria-expanded="false">
1072                  Subscribe <span class="dropdown-arrow"></span>
1073                </a>
1074
1075                <ul class="dropdown subscribe" role="menu">
1076                  <li id="sub_all_access">
1077                    <a href="/orders/retail_account"
1078                      aria-label="Subscribe to the All‑Access plan">
1079                      ALL ‑ Access
1080                    </a>
1081                  </li>
1082                  <li id="sub_crunch_member">
1083                    <a href="/accounts/signup/"
1084                      aria-label="Subscribe as a Crunch Member">
1085                      Crunch Members
1086                    </a>
1087                  </li>
1088                </ul>
1089              </li>
1090             
1091
1092            
1093
1094            
1095              
1096                
1097                  <li id="dt_login">
1098                    <a href="/accounts/login/"
1099                       aria-label="Login to your account"
1100                       >LOGIN
1101                    </a>
1102                  </li>
1103                
1104              
1105            
1106
1107            
1108              <li>
1109                <a href="/crunch_subscriptions" class="button plain" aria-label="Explore retail member plans">TRY FOR FREE</a>
1110              </li>
1111            
1112          </ul>
1113          <ul><li id="nav_dt_search_left"
1114                    class="toggle-search"><div class="inner search">
1115                <form class="search-bar global-search"
1116                      role="search"
1117                      id="search-form">
1118                  <input type="search"
1119                         id="term"
1120                         name="term"
1121                         placeholder="Enter search term"
1122                         aria-label="Search"
1123                         value="" />
1124                  <button type="submit" aria-label="Search">
1125                    <span>SEARCH</span>
1126                  </button>
1127                </form>
1128              </div>
1129              <span class="toggle fa fa-close"></span>
1130            </li></ul>
1131        </nav>
1132      </div>
1133    </div>
1134  </div>
1135
1136</header>
1137
1138<script>
1139  function setCookie(name, value, days) {
1140    let expires = "";
1141    if (days) {
1142      const date = new Date();
1143      date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
1144      expires = "; expires=" + date.toUTCString();
1145    }
1146    document.cookie = name + "=" + value + expires + "; path=/";
1147  }
1148
1149  function getCookie(name) {
1150    const nameEQ = name + "=";
1151    const ca = document.cookie.split(';');
1152    for(let i = 0; i < ca.length; i++) {
1153      let c = ca[i];
1154      while (c.charAt(0) === ' ') c = c.substring(1, c.length);
1155      if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
1156    }
1157    return null;
1158  }
1159  var params = new URLSearchParams(window.location.search);
1160
1161  if (params.has("term")) {
1162    var payloadSearch = {
1163          'event': 'search',
1164          'search_term': params.get("term"),
1165        }
1166    dataLayer.push(payloadSearch);
1167  }
1168
1169  function isIOS() {
1170    return /iPhone|iPad|iPod/i.test(navigator.userAgent);
1171  }
1172
1173  function isSafariOnIPad() {
1174    return navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1;
1175  }
1176
1177  function isMobileOrTablet() {
1178    const userAgent = navigator.userAgent;
1179    return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(userAgent) || isSafariOnIPad();
1180  }
1181
1182  function showInstallPopup() {
1183    const installPopup = document.getElementById("install-popup");
1184    const backdrop = document.getElementById("backdrop");
1185
1186    if (getCookie('installPopup') !== 'false' && isMobileOrTablet()) {
1187      backdrop.classList.add("show");
1188      installPopup.classList.add("show");
1189    }
1190  }
1191
1192  document.addEventListener("DOMContentLoaded", function() {
1193    const action = "login";
1194    const excludedActions = ['new_account', 'payment', 'thank_you', 'password', 'crunch_subscriptions', 'user_signup', 'tlc_90dayfiance'];  // Excluded list of pages
1195
1196    if (!excludedActions.includes(action)) {
1197      setTimeout(showInstallPopup, 10000); // Show popup after 10 seconds of page load
1198    }
1199
1200    // Prevent the popup from being shown on scroll or click
1201    window.addEventListener("scroll", function(event) {
1202      event.stopPropagation();
1203    });
1204
1205    window.addEventListener("click", function(event) {
1206      event.stopPropagation();
1207    });
1208
1209    const installPopup = document.getElementById("install-popup");
1210    const installBtn = document.getElementById("install-btn");
1211    const closeBtn = document.querySelectorAll(".close-button-event-class, #close-btn");
1212    const backdrop = document.getElementById("backdrop");
1213
1214
1215    closeBtn.forEach((el) => {
1216      el.addEventListener("click", function() {
1217        installPopup.classList.remove("show");
1218        backdrop.classList.remove("show");
1219        setCookie('installPopup', 'false', 90); // Set cookie to expire in 3 months (approximately 90 days)
1220      });
1221    })
1222
1223    installBtn.addEventListener("click", function() {
1224      const appUrlIOS = "https://apps.apple.com/us/app/crunch/id6443678389";
1225      const appUrlAndroid = "https://play.google.com/store/apps/details?id=com.crunchplus";
1226
1227      if (isIOS() || isSafariOnIPad()) {
1228        window.location.href = appUrlIOS;
1229      } else {
1230        window.location.href = appUrlAndroid;
1231      }
1232      setCookie('installPopup', 'false', 90); // Set cookie to expire in 3 months (approximately 90 days)
1233      installPopup.classList.remove("show");
1234      backdrop.classList.remove("show");
1235    });
1236  });
1237</script>
1237
1238
1239
1240  
1241
1242
1243
1244
1245
1246
1247
1248
1249<style>
1250  .text-section.social-feeds,
1251  header,
1252  footer {
1253    display: none;
1254  }
1255
1256  .interstate h1 {
1257    font-size: 28px !important;
1258    font-family: Interstate-Black !important;
1259    color: #000 !important;
1260    margin: 0;
1261  }
1262
1263  .bold-btn{
1264    margin-top: 0px; 
1265    height: 45px; 
1266    font-size: 17px; 
1267    text-transform: capitalize;
1268    font-family: 'Interstate-Black' !important;
1269  }
1270
1271  body.login-page:before {
1272  
1273    background-image: url("//crunchplus-prod-cdn2.imgix.net/2154/images/mJJwh6xpSSKQQG7fkhGS_1703501760997_ThemeSetting_2845?ixlib=rb-0.3.4&amp;s=635451ec0afa328df6bd615a5de93ef4&amp;auto=compress");
1274    background-size: cover;
1275    background-position: center;
1276    background-repeat: no-repeat;
1277    width: 100%;
1278    height: 100vh;
1279    left: 0;
1280    top: 0;
1281    position: fixed;
1282    z-index: -1;
1283  
1284  }
1285  .login-errors, .login-errors a {
1286    font-size: 14px;
1287    color: red !important;
1288  }
1289  .form-error.customer_login {
1290    font-size: small !important;
1291    height: auto;
1292    width: 100%;
1293    overflow: hidden;
1294  }
1295
1296  .small {
1297    padding-top: 10px; 
1298    font-weight: bold;    
1299    a {
1300      color: #000000 !important; 
1301      font-size: 11px;"
1302    }
1303  }
1304
1305  .page-login .no-pad-no-margin {
1306    padding-top: 0; 
1307    margin-bottom: 0;
1308  }
1309
1310  .fa-angle-left {
1311    color: #333333
1312  }
1313
1314  .login-submit {
1315    padding-top: 10px !important;
1316  }
1317
1318#loginSelect {
1319         background: url(data:image/svg+xml;base64,PHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0Ljk1IDEwIj48ZGVmcz48c3R5bGU+LmNscy0xe2ZpbGw6I2ZmZjt9LmNscy0ye2ZpbGw6IzQ0NDt9PC9zdHlsZT48L2RlZnM+PHRpdGxlPmFycm93czwvdGl0bGU+PHJlY3QgY2xhc3M9ImNscy0xIiB3aWR0aD0iNC45NSIgaGVpZ2h0PSIxMCIvPjxwb2x5Z29uIGNsYXNzPSJjbHMtMiIgcG9pbnRzPSIxLjQxIDQuNjcgMi40OCAzLjE4IDMuNTQgNC42NyAxLjQxIDQuNjciLz48cG9seWdvbiBjbGFzcz0iY2xzLTIiIHBvaW50cz0iMy41NCA1LjMzIDIuNDggNi44MiAxLjQxIDUuMzMgMy41NCA1LjMzIi8+PC9zdmc+) no-repeat;
1320        background-position: right 5px top; /* Change the px value here to change the distance */
1321        -moz-appearance: none;
1322        -webkit-appearance: none;
1323        appearance: none;
1324            padding : 4px 20px
1325}
1326
1327  .country-select {
1328    height:50px;
1329    width:100%;
1330    background-color: #E9E9E9;
1331    border-radius: 8px;
1332    margin-bottom: 10px;
1333    font-size: 16px;
1334    text-align: left;
1335    cursor: pointer;
1336    position: relative;
1337  }
1338  .country-select:hover {
1339    background-color: #d9d9d9;
1340  }
1341  .country-select.active {
1342    background-color: #79BDE9;
1343    color: #000000bd;
1344  }
1345  .country-select-icon {
1346    height: 50px;
1347    display: inline-block;
1348    position: relative;
1349    padding-left: 10px;
1350  }
1351  .country-select-text {
1352    transform: translateY(30%);
1353    display: inline-block;
1354    position: relative;
1355    padding-left: 20px;
1356    font-weight: 400;
1357    font-weight: bold;
1358  }
1359
1360  .logo {
1361    height: 60px;
1362    width: 160px;
1363  }
1364
1365  .country-select img {
1366    height: 36px;
1367    width: 36px;
1368    transform: translateY(20%);
1369  }
1370    @media only screen and (max-width: 600px) {
1371    .country-select {
1372      font-size: 14px;
1373    }
1374    .country-select-text {
1375      transform: translateY(50%);
1376    }
1377    .country-select-icon, .country-select-icon img {
1378      display: none;
1379      transform: none;
1380    }
1381  }
1382
1383  .divider {
1384    text-align: center;
1385    margin: 10px 0;;
1386    position: relative;
1387  }
1388
1389  .divider span {
1390    background: #fff;
1391    padding: 0 16px;
1392    position: relative;
1393    z-index: 1;
1394    color: black;
1395    font-size: 14px;
1396    font-family: Interstate-Regular;
1397  }
1398
1399  .divider hr {
1400    position: absolute;
1401    top: 50%;
1402    left: 0;
1403    right: 0;
1404    margin: 0;
1405    border: none;
1406    border-top: 1px solid #e0e0e0;
1407  }
1408
1409  .social-login {
1410    display: flex;
1411    flex-direction: row;
1412    gap: 12px;
1413    justify-content: space-between;
1414  }
1415
1416  .social-login button {
1417    font-size: 14px;
1418    font-weight: 500;
1419    flex: 1;
1420    background-color: white !important
1421  }
1422
1423  .social-btn {
1424    display: flex;
1425    align-items: center;
1426    justify-content: center;
1427    padding: 12px;
1428    border: 1px solid #e0e0e0;
1429    border-radius: 100px;
1430    background: white;
1431    cursor: pointer;
1432    width: 100%;
1433    font-size: 14px;
1434    transition: background-color 0.2s, border-color 0.2s;
1435    color: #000;
1436    min-width: 0;
1437  }
1438
1439  .social-btn:hover {
1440    background-color: #f8f8f8 !important;
1441    border-color: #d0d0d0;
1442  }
1443
1444  .social-btn img {
1445    margin-right: 2px;
1446    width: 20px;
1447    height: 20px;
1448    object-fit: contain;
1449  }
1450
1451  .social-btn span {
1452    font-family: Interstate-Black;
1453    text-transform: none;
1454  }
1455
1456
1457  /* Override theme's general form button styles for social buttons */
1458  form .social-btn,
1459  form button.social-btn,
1460  form [type="button"].social-btn {
1461    background: white !important;
1462    background-color: white !important;
1463    background-image: none !important;
1464    border: 1px solid #989898 !important;
1465    color: #000 !important;
1466    padding: 10px;
1467    font-family: inherit !important;
1468  }
1469
1470  form .social-btn:hover,
1471  form button.social-btn:hover,
1472  form [type="button"].social-btn:hover {
1473    background: #f8f8f8 !important;
1474    background-color: #f8f8f8 !important;
1475    background-image: none !important;
1476    border: 1px solid #989898 !important;
1477    padding: 10px;
1478    color: #000 !important;
1479  }
1480
1481  .apple {
1482    width: 26px !important;
1483    height: 24px !important;
1484    margin-top: -5px;
1485  }
1486
1487  .google {
1488    width: 29px !important;
1489    height: 28px !important;
1490  }
1491
1492  .meta {
1493    width: 26px !important;
1494    height: 16px !important;
1495
1496  }
1497
1498  /* Add vertical spacing between login section and "Available On" section */
1499  .image-section.apps .text-section {
1500    margin-top: 60px !important;
1501    padding-top: 20px !important;
1502  }
1503
1504  /* More specific targeting for login page text-section */
1505  .page-login .text-section {
1506    margin-top: 60px !important;
1507    padding-top: 20px !important;
1508  }
1509
1510  /* Add bottom margin to the login content section */
1511  .page-login .image-section .content {
1512    margin-bottom: 60px !important;
1513  }
1514
1515    /* Mobile-specific styles for social login */
1516      /* Mobile-specific styles for social login */
1517  @media only screen and (max-width: 480px) {
1518    .social-login {
1519      display: flex;
1520      flex-direction: row;
1521      gap: 8px;
1522      width: 100%;
1523      padding: 0;
1524    }
1525
1526    .social-login .social-btn,
1527    .social-login button.social-btn,
1528    form .social-login .social-btn,
1529    form .social-login button.social-btn,
1530    .social-login .social-btn:hover,
1531    .social-login button.social-btn:hover,
1532    form .social-login .social-btn:hover,
1533    form .social-login button.social-btn:hover {
1534      display: flex;
1535      flex-direction: column;
1536      align-items: center;
1537      justify-content: center;
1538      padding: 6px;
1539      border: 1px solid #989898 !important;
1540      border-radius: 25px !important;
1541      background: white;
1542      flex: 1;
1543      min-height: 40px;
1544      min-width: 0;
1545      box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1) !important;
1546      transition: all 0.2s ease-in-out;
1547    }
1548
1549    .social-btn img {
1550      width: 20px;
1551      height: 20px;
1552      margin-right: 0;
1553      margin-bottom: 2px;
1554      object-fit: contain;
1555    }
1556
1557    .social-btn span {
1558      font-size: 10px;
1559      color: #000;
1560      font-weight: 500;
1561      text-align: center;
1562      white-space: nowrap;
1563    }
1564
1565    .social-btn .apple {
1566      width: 18px !important;
1567      height: 18px !important;
1568      margin-top: 0;
1569    }
1570
1571    .social-btn .google {
1572      width: 18px !important;
1573      height: 18px !important;
1574    }
1575
1576    .social-btn .meta {
1577      width: 18px !important;
1578      height: 18px !important;
1579    }
1580  }
1581  @media only screen and (max-width: 1024px) {
1582    .page-login .text-section,
1583    .page-login .device-image {
1584      display: none !important;
1585    }
1586  }
1587
1588  /* Landscape mode optimizations */
1589  @media only screen and (orientation: landscape) and (max-height: 600px) {
1590    /* Force viewport to start at top */
1591    html {
1592      scroll-behavior: smooth !important;
1593      overflow-x: hidden !important;
1594    }
1595
1596    body.login-page {
1597      height: auto !important;
1598      min-height: 100vh !important;
1599      overflow-y: auto !important;
1600      -webkit-overflow-scrolling: touch !important;
1601      position: relative !important;
1602      margin: 0 !important;
1603      padding: 0 !important;
1604    }
1605
1606    body.login-page:before {
1607      position: fixed !important;
1608      height: 100vh !important;
1609      z-index: -1 !important;
1610    }
1611
1612    .image-section.apps {
1613      height: auto !important;
1614      min-height: 100vh !important;
1615      overflow-y: visible !important;
1616      overflow-x: hidden !important;
1617      display: block !important;
1618      padding: 0 !important;
1619      box-sizing: border-box;
1620      position: relative !important;
1621      top: 0 !important;
1622      margin: 0 !important;
1623    }
1624
1625    .image-section.apps .content {
1626      margin: 15px auto !important;
1627      max-width: 400px;
1628      margin: 0 auto;
1629      width: 100%;
1630      height: auto !important;
1631      min-height: auto !important;
1632      box-sizing: border-box;
1633      display: block !important;
1634      position: relative !important;
1635      top: 0 !important;
1636    }
1637
1638    .image-section.apps .content .inner {
1639      padding: 0;
1640      position: relative !important;
1641      top: 0 !important;
1642      height: auto !important;
1643    }
1644
1645    /* Ensure logo has proper top space */
1646    .logo {
1647      height: 60px !important;
1648      width: 160px !important;
1649      margin-bottom: 15px !important;
1650      margin-top: 10px !important;
1651      display: block;
1652      position: relative !important;
1653      z-index: 10 !important;
1654    }
1655
1656    .logo img {
1657      height: 60px !important;
1658      width: auto !important;
1659    }
1660
1661    /* Ensure bucket starts right after logo */
1662    .bucket {
1663      background: rgba(255, 255, 255, 0.95);
1664      border-radius: 15px;
1665      padding: 15px;
1666      margin: 0px 0 5px 0 !important;
1667      backdrop-filter: blur(10px);
1668      position: relative !important;
1669      z-index: 10 !important;
1670      height: auto !important;
1671    }
1672
1673    .bold-text, .interstate h1 {
1674      font-size: 28px !important;
1675      margin-bottom: 10px !important;
1676      margin-top: 5px !important;
1677    }
1678
1679    .small {
1680      padding-top: 10px !important;
1681      margin-bottom: 5px !important;
1682      margin-top: 0px !important;
1683    }
1684
1685    .small a {
1686      font-size: 11px !important;
1687    }
1688
1689    .form__field {
1690      margin-bottom: 10px !important;
1691    }
1692
1693    .form__field input {
1694      height: 45px !important;
1695      font-size: 16px !important;
1696    }
1697
1698    .form__field label {
1699      font-size: 16px !important;
1700      margin-bottom: 5px !important;
1701    }
1702
1703    .bold-btn {
1704      height: 45px !important;
1705      font-size: 17px !important;
1706    }
1707
1708    .social-login {
1709      margin-top: 15px !important;
1710      margin-bottom: 25px !important;
1711    }
1712
1713    .social-btn {
1714      padding: 12px !important;
1715      font-size: 14px !important;
1716    }
1717
1718    .social-btn img {
1719      width: 20px !important;
1720      height: 20px !important;
1721    }
1722
1723    .divider {
1724      margin: 15px 0 !important;
1725    }
1726
1727    .divider span {
1728      font-size: 14px !important;
1729    }
1730
1731    .text-end {
1732      margin: 8px 0 !important;
1733    }
1734
1735    .text-end a {
1736      font-size: 12px !important;
1737    }
1738
1739    /* Hide text section in landscape to make more room */
1740    .text-section {
1741      display: none !important;
1742    }
1743
1744    .device-image {
1745      display: none !important;
1746    }
1747  }
1748
1749  /* Additional mobile landscape optimizations */
1750  @media only screen and (orientation: landscape) and (max-height: 480px) {
1751    /* Force viewport to start at top */
1752    html {
1753      scroll-behavior: smooth !important;
1754      overflow-x: hidden !important;
1755    }
1756
1757    body.login-page {
1758      height: auto !important;
1759      min-height: 100vh !important;
1760      overflow-y: auto !important;
1761      -webkit-overflow-scrolling: touch !important;
1762      position: relative !important;
1763      margin: 0 !important;
1764      padding: 0 !important;
1765    }
1766
1767    .image-section.apps {
1768      height: auto !important;
1769      min-height: 100vh !important;
1770      padding: 0 !important;
1771      position: relative !important;
1772      top: 0 !important;
1773      margin: 0 !important;
1774      overflow-y: visible !important;
1775      overflow-x: hidden !important;
1776    }
1777
1778    .image-section.apps .content {
1779      margin: 10px auto !important;
1780      height: auto !important;
1781      min-height: auto !important;
1782      position: relative !important;
1783      top: 0 !important;
1784    }
1785
1786    .bucket {
1787      padding: 15px;
1788      margin: 0px 0 5px 0 !important;
1789      position: relative !important;
1790      z-index: 10 !important;
1791      height: auto !important;
1792    }
1793
1794    /* Ensure logo has proper top space */
1795    .logo {
1796      height: 60px !important;
1797      width: 160px !important;
1798      margin-bottom: 15px !important;
1799      margin-top: 10px !important;
1800      position: relative !important;
1801      z-index: 10 !important;
1802    }
1803
1804    .logo img {
1805      height: 60px !important;
1806      width: auto !important;
1807    }
1808
1809    .bold-text, .interstate h1 {
1810      font-size: 28px !important;
1811      margin-bottom: 10px !important;
1812      margin-top: 5px !important;
1813    }
1814
1815    .form__field {
1816      margin-bottom: 10px !important;
1817    }
1818
1819    .form__field input {
1820      height: 45px !important;
1821      font-size: 16px !important;
1822    }
1823
1824    .form__field label {
1825      font-size: 16px !important;
1826      margin-bottom: 5px !important;
1827    }
1828
1829    .bold-btn {
1830      height: 45px !important;
1831      font-size: 17px !important;
1832    }
1833
1834    .small {
1835      padding-top: 10px !important;
1836      margin-top: 0px !important;
1837    }
1838
1839    .small a {
1840      font-size: 11px !important;
1841    }
1842
1843    .divider {
1844      margin: 15px 0 !important;
1845    }
1846
1847    .divider span {
1848      font-size: 14px !important;
1849    }
1850
1851    .social-login {
1852      margin-top: 15px !important;
1853      margin-bottom: 25px !important;
1854    }
1855
1856    .social-btn {
1857      padding: 12px !important;
1858      font-size: 14px !important;
1859    }
1860
1861    .social-btn img {
1862      width: 20px !important;
1863      height: 20px !important;
1864    }
1865
1866    .text-end {
1867      margin: 8px 0 !important;
1868    }
1869
1870    .text-end a {
1871      font-size: 12px !important;
1872    }
1873
1874    /* Hide text section in landscape to make more room */
1875    .text-section {
1876      display: none !important;
1877    }
1878
1879    .device-image {
1880      display: none !important;
1881    }
1882  }
1883
1884  /* Modal scroll prevention */
1885  body.modal-open {
1886    overflow: hidden !important;
1887    position: fixed !important;
1888    width: 100% !important;
1889    height: 100% !important;
1890  }
1891
1892  /* Hide login form content when modal is open */
1893  body.modal-open .image-section.apps > .content > .inner > *:not(#oauth-login-modal) {
1894    display: none !important;
1895  }
1896
1897  /* Hide the main content container background when modal is open */
1898  body.modal-open .image-section.apps > .content {
1899    background: transparent !important;
1900  }
1901
1902  body.modal-open .image-section.apps > .content > .inner {
1903    background: transparent !important;
1904  }
1905
1906  /* Ensure modal covers full screen and prevents background interaction */
1907  #oauth-login-modal {
1908    position: fixed !important;
1909    top: 0 !important;
1910    left: 0 !important;
1911    width: 100vw !important;
1912    height: 100vh !important;
1913    background-color: rgba(0, 0, 0, 0.5) !important;
1914    display: none;
1915    justify-content: center;
1916    align-items: center;
1917    z-index: 9999 !important;
1918    overflow: auto;
1919  }
1920
1921  /* Modal content styling */
1922  #oauth-login-modal > div {
1923    background: white;
1924    padding: 30px;
1925    border-radius: 8px;
1926    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
1927    max-width: 400px;
1928    width: 90%;
1929    max-height: 90vh;
1930    overflow-y: auto;
1931    position: relative;
1932  }
1933
1934  /* Landscape mode modal adjustments */
1935  @media only screen and (orientation: landscape) and (max-height: 600px) {
1936    #oauth-login-modal {
1937      align-items: flex-start !important;
1938      padding: 20px 0 !important;
1939      overflow-y: auto !important;
1940      -webkit-overflow-scrolling: touch !important;
1941    }
1942
1943    #oauth-login-modal > div {
1944      max-height: calc(100vh - 40px) !important;
1945      height: auto !important;
1946      margin: auto !important;
1947      overflow-y: auto !important;
1948      -webkit-overflow-scrolling: touch !important;
1949    }
1950  }
1951</style>
1952  <div class="image-section apps">
1953    <section class="content">
1954      <div class="inner">
1955        
1956        
1957
1958        <a href="/" aria-label="Back to request url">
1959          
1960            <span class="logo">                
1961              <img src="//crunchplus-prod-cdn2.imgix.net/2154/images/0zdrDkiuRBmGsWgVzewz_1738229798587_ThemeSetting_2845?ixlib=rb-0.3.4&amp;s=2fedb4690203a5d002fee0abf502aa09&amp;auto=compress"
1962              alt="Crunch+" /></span>
1963          
1964        </a>
1965        <div
1966          class="bucket"
1967          id="customer_login_form"
1968          style="display: block;">
1969          <p class="small no-pad-no-margin">
1970            <span class="fa fa-angle-left"></span>
1971            <a onclick="history.back()">Back</a>
1972          </p>
1973          <h1 class="bold-text">Login</h1>
1974          
1975          
1976      <form accept-charset="UTF-8" id="customer_login" method="post" action="/login?c">
1977
1978        <input name="utf8" type="hidden" value="&#x2713;" />
1979
1980        <input name="authenticity_token" type="hidden" value="PUPnJpHYF3yZEHPHbzXEh3+c+oUgzi458N2DvqYaEVU=" />
1981
1982        
1983          <input type="hidden" name="user[merchant_id]" value="2154" />
1984
1985        
1986        
1987            <div class="form__wrapper">
1988              
1989              <input type="hidden" id="authenticity_token" value="O7CglXTcpBpD/U4+34vuo9nFsK0Pm6RqeXgy++otlVR6wfxihaL+yFOa8VaQQoBV11yZ1fu51TVi2DP4nLh/TQ==" />
1990              <input type="hidden" id="customer_sign_up" name="customer_sign_up" value="" />
1991              <input type="hidden" id="price_id" name="price_id" value="" />
1992              <input type="hidden" id="code" name="code" value="" />
1993
1994              <fieldset class="form__field">
1995                <label for="CustomerEmail">Email</label>
1996                <input
1997                  type="email"
1998                  name="user[email]"
1999                  id="CustomerEmail"
2000                  placeholder=""
2001                  class="mandatory_field"
2002                  autocorrect="off"
2003                  autocapitalize="off"
2004                  autocomplete="off"
2005                  autofocus>
2006              </fieldset>
2007              <fieldset class="form__field">
2008                <label for="CustomerPassword">Password</label>
2009                <input
2010                  type="password"
2011                  value=""
2012                  name="user[password]"
2013                  id="CustomerPassword"
2014                  autocomplete="off"
2015                  placeholder="" 
2016                  class="mandatory_field">
2017              </fieldset>
2018              <p class="text-end">
2019                <a
2020                  href="#"
2021                  onclick="showRecoverPasswordForm();return false;">Forgot
2022                  password?</a>
2023              </p>
2024              <fieldset class="form__field">
2025                <button
2026                  tabindex="0"
2027                  class="button bold-btn checkMandatory"
2028                  type="submit"
2029                  aria-label="Log into your account"
2030                />Login</button>
2031              </fieldset>
2032
2033            </div>
2034            <div class="divider">
2035              <span>Or Login with</span>
2036            </div>
2037
2038            <div class="social-login">
2039              <button type="button" class="social-btn" id="apple-login" data-apple-client-id="com.crunchplus.signin" data-apple-redirect-uri="https://www.crunchplus.com/auth/apple/callback" data-state="apple_signin">
2040                <img src="https://crunchplus.com/assets/retail-signup/optimized/apple-e9b039947999c2a40f13b2481a1ddc861c2208c4394fd5abc11d90c3f8410b45.svg" alt="Apple" class="apple">
2041                <span>Apple</span>
2042              </button>
2043              <button type="button" class="social-btn" id="google-login" data-google-url="/auth/google_oauth2?state=google_signin">
2044                <img src="//dbjtwsnsmnuln.cloudfront.net/assets/retail-signup/optimized/google-50d9c4358b5626026eeb8d65dc872fc3fabb758aa3d73c974de9c0ef2670beea.webp" alt="Google" class="google">
2045                <span>Google</span>
2046              </button>
2047              <button id="facebook-signin" type="button" class="social-btn" data-facebook-app-id="2425241290982063" data-facebook-redirect-uri="https://www.crunchplus.com/auth/facebook/callback" data-state="facebook_signin">
2048                <img src="//dbjtwsnsmnuln.cloudfront.net/assets/retail-signup/optimized/meta-9d714faa7ce97b21fce91bf782a23865be5cf7a45ed7ea5c757338bc1515e80b.webp" alt="Meta" class="meta">
2049                <span>Meta</span>
2050              </button>
2051            </div>
2052            
2053
2054      </form>
2055    
2056          </div>
2057        <div
2058          class="bucket"
2059          id="recover_password"
2060          style="display: none;">
2061
2062          <p style="font-weight: bold; font-size:12px;">
2063          <span class="fa fa-angle-left"></span>
2064            <a
2065              href="#"
2066              class="cancel-btn login-btn"
2067              style="text-decoration: none;"
2068              onclick="hideRecoverPasswordForm();return false;">Back</a>
2069          </p>
2070
2071          <h1>Password</h1>
2072
2073          
2074      <form accept-charset="UTF-8" id="recover_customer_password" method="post" action="/password?c">
2075
2076        <input name="utf8" type="hidden" value="&#x2713;" />
2077
2078        <input name="authenticity_token" type="hidden" value="PUPnJpHYF3yZEHPHbzXEh3+c+oUgzi458N2DvqYaEVU=" />
2079
2080        <input type="hidden" name="user[merchant_id]" value="2154" />
2081
2082        
2083          <div class="form__wrapper">
2084            <div
2085              class="note flash-success"
2086              id="resetSuccess"
2087              style="display:none;">
2088              We've sent you an email with a link to update your password.
2089            </div>
2090
2091            <fieldset class="form__field">
2092              <label for="RecoverEmail">Email</label>
2093              <input
2094                type="email"
2095                value=""
2096                name="user[email]"
2097                id="RecoverEmail"
2098                placeholder="Email"
2099                autocorrect="off"
2100                autocapitalize="off">
2101            </fieldset>
2102
2103            <fieldset class="form__field login-submit">
2104              <input
2105                type="submit"
2106                class="button bold-btn"
2107                value="Submit">
2108            </fieldset>
2109
2110            
2111
2112      </form>
2113    
2114          </div>
2115        </div>
2116
2117        <!-- OAuth Login Modal (hidden by default) -->
2118        <div id="oauth-login-modal">
2119          <div style="position: relative;">
2120            <!-- Close button in top right corner -->
2121            <button id="close-modal" style="
2122              background: none;
2123              border: none;
2124              width: 32px;
2125              height: 32px;
2126              cursor: pointer;
2127              padding: 0;
2128              color: #666;
2129              display: flex;
2130              align-items: center;
2131              justify-content: center;
2132              border-radius: 50%;
2133              transition: all 0.2s ease;
2134              position: absolute;
2135              top: 10px;
2136              right: 10px;
2137              z-index: 10;
2138            " onmouseover="this.style.backgroundColor='#f0f0f0'; this.style.color='#333';" onmouseout="this.style.backgroundColor='transparent'; this.style.color='#666';">
2139              <svg width="20" height="20" viewBox="0 0 24 24" fill="currentColor">
2140                <path d="M18.3 5.71a.996.996 0 0 0-1.41 0L12 10.59 7.11 5.7A.996.996 0 1 0 5.7 7.11L10.59 12 5.7 16.89a.996.996 0 1 0 1.41 1.41L12 13.41l4.89 4.89a.996.996 0 0 0 1.41-1.41L13.41 12l4.89-4.89c.38-.38.38-1.02 0-1.4z"/>
2141              </svg>
2142            </button>
2143
2144            <!-- Crunch Logo -->
2145            <div style="text-align: center; margin: 0 0 5px 0;">
2146              <img
2147                src="//dbjtwsnsmnuln.cloudfront.net/assets/pink_essence/crunch-pink-logo-707dc5942165a82799bef57aa4a66d82d5159fce44af66426a1f47c3221168b0.png"
2148                alt="Crunch Fitness Logo"
2149                style="max-width: 200px; height: 55px;"
2150              />
2151            </div>
2152
2153            <!-- Modal message -->
2154            <div style="margin-bottom: 5px;">
2155              <p style="color: #000; margin: 0; font-weight: bold; line-height: 1.4; font-size: 14px;" id="modal-message">
2155Account already exists, login with your Crunch+ credentials to continue.</p>
2156            </div>
2157            <form id="oauth-login-form">
2158              <div id="oauth-error-message" style="
2159                color: #d32f2f;
2160                font-size: 14px;
2161                margin-bottom: 5px;
2162                display: none;
2163              "></div>
2164              <div style="margin-bottom: 20px;">
2165                <label for="oauth-email" style="display: block; margin-bottom: 5px; font-weight: bold; color: #000; font-size: 14px;">Email</label>
2166                <input type="email" id="oauth-email" name="email" required style="
2167                  width: 100%;
2168                  padding: 10px;
2169                  border: 1px solid #ddd;
2170                  border-radius: 4px;
2171                  font-size: 16px;
2172                  color: #000;
2173                  box-sizing: border-box;
2174                ">
2175              </div>
2176              <div style="margin-bottom: 20px;">
2177                <label for="oauth-password" style="display: block; margin-bottom: 5px; font-weight: bold; color: #000; font-size: 14px;">Password</label>
2178                <input type="password" id="oauth-password" name="password" required style="
2179                  width: 100%;
2180                  padding: 10px;
2181                  border: 1px solid #ddd;
2182                  border-radius: 4px;
2183                  font-size: 16px;
2184                  color: #000;
2185                  box-sizing: border-box;
2186                ">
2187              </div>
2188              <button type="submit" id="oauth-submit-btn" style="
2189                width: 100%;
2190                padding: 14px;
2191                background-color: #4285f4;
2192                color: white;
2193                border: none;
2194                border-radius: 4px;
2195                font-size: 16px;
2196                cursor: pointer;
2197                margin-top: 10px;
2198              ">Sign In</button>
2199            </form>
2200          </div>
2201        </div>
2202      </div>
2203    </section>
2204    <div class="text-section">
2205        <h2>Available On</h2>
2206        <div class="icons">
2207          <span><img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-apple-icon-white-0d2329e53e22636dd4f9a761df1690a70ed6ef28ba30a94edda24fc48bd7b5a2.png" class="ia-icon-apple-ios" alt="Watch our videos in our app on your Apple device" /></span>
2208<span><img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-android-white-073b48287baeb182a3ffbdb02b3d2375ebf8b0ec4c716d9f504b41585421d5fd.png" class="ia-icon-android" alt="Watch our videos in our app on your Android device" /></span>
2209<span><img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-apple-tv-white-bda23d665b1e50b216bc5255c2b2877093361d4318a8c8e7f5a61629a5dfddd9.png" class="ia-icon-apple-tv" alt="Watch our videos in our app on your Apple TV device" /></span>
2210<span><img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-android-tv-white-8f6c78200d3293de0bbeaf12312453b83afa95178e52d0025aee483c9a3b1c60.png" class="ia-icon-android-tv" alt="Watch our videos in our app on your AndroidTV device" /></span>
2211<span><img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-fire-tv-white-b55e0fdd0791467821acdfe002cb971a9389ae0a6dee477147a0f3443905015b.png" class="ia-icon-fire-tv" alt="Watch our videos in our app on your FireTV device" /></span>
2212<span><img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-roku-white-7ddb99c67c38050433c79c466f797df0cb074d63be9e2ff839345d4d992bea00.png" class="ia-icon-roku" alt="Watch our videos in our app on your Roku device" /></span>
2213
2214        </div>
2215      </div>
2216      
2217        <figure role="none" class="device-image device-image-tablet">
2218          
2219          <span
2220            class="device-image-screenshot"
2221            ></span>
2222        </figure>
2223      
2224    </div>
2225  </div>
2226
2227<script>
2228  /*
2229   Show/hide the recover password form when requested.
2230   */
2231  window.addEventListener("load", function () {
2232    $(document).ready(function () {
2233      // Clean up Facebook OAuth fragment if present
2234      if (window.location.hash === '#_=_') {
2235        if (window.history && window.history.replaceState) {
2236          window.history.replaceState({}, document.title, window.location.pathname + window.location.search);
2237        } else {
2238          // Fallback for older browsers
2239          window.location.hash = '';
2240        }
2241      }
2242
2243      var urlId = getParameter("id");
2244      var urlCode = getParameter("code");
2245
2246      if (urlId || urlCode) {
2247        $('#customer_sign_up').val('true');
2248        if (urlId) {
2249          $('#price_id').val(urlId);
2250        }
2251        if (urlCode) {
2252          $('#code').val(urlCode);
2253        }
2254      }
2255
2256      var email = getParameter("email");
2257      var lid = getParameter("lid");
2258      var loginSelect = document.getElementById('loginSelect');
2259      if(lid != false && loginSelect) {
2260        for(var i, j = 0; i = loginSelect.options[j]; j++) {
2261            if(i.value == lid) {
2262                loginSelect.selectedIndex = j;
2263                break;
2264            }
2265        }
2266      }
2267
2268      if (email != false) {
2269        $("#CustomerEmail")
2270          .val(email);
2271      }
2272
2273      $(".checkMandatory").click(async function(e){
2274        var email = $('#CustomerEmail').val();
2275        var form = $(this).closest('form');
2276        var mandatory_fields = $(form).find('.mandatory_field')
2277        var isValid = checkIfAllFieldsHaveValues(mandatory_fields);
2278        if (!isValid){
2279          e.preventDefault();
2280          $(mandatory_fields).each(function() {
2281            custom_validation(this);
2282          });
2283          $(form).find(".has-error").find('input').focus();
2284          $('#loader-image').hide();
2285        }
2286        await fetch('/get_membership_plan', {
2287          method: 'POST',
2288          headers: {
2289            'Content-Type': 'application/json',
2290          },
2291          body: JSON.stringify({
2292            email: email,
2293            authenticity_token: $('#authenticity_token').val()
2294          })
2295        })
2296        .then(response => response.json())
2297        .then(data => {
2298          var hashedUserId = CryptoJS.SHA256(email).toString();
2299          if(data.is_user === true ) { 
2300            var loginEventPayload = {
2301              'event': "login",
2302              'user_id': hashedUserId,
2303              'membership_plan': data.membership_plan,
2304              'crunch_fitness_member': !!data.membership_plan,
2305              "login_count": 1
2306            };
2307            dataLayer.push(loginEventPayload);
2308          }
2309        })
2310        .catch(error => {});
2311      });
2312
2313      $(".mandatory_field").keyup(function(e){
2314        custom_validation(this);
2315      });
2316    });
2317
2318    function checkIfAllFieldsHaveValues(elements) {
2319      var isValid = true;
2320      $(elements).each(function() {
2321        if ( !$(this).prop('disabled') && !$(this).prop('readonly') && $(this).val() === '' )
2322          isValid = false;
2323      });
2324      return isValid;
2325    }
2326
2327    function custom_validation(element){
2328      var form = $(element).closest('form');
2329      var fieldset_element = $(element).parent().closest('fieldset');
2330      if ($(element).val().length > 0){
2331        $(fieldset_element).removeClass('has-error');
2332        $(fieldset_element).find('small:eq(0)').remove();
2333        $(element).css("border", "1px solid #8c8c8c");
2334      } else {
2335        $(fieldset_element).addClass('has-error');
2336        $(fieldset_element).css("position", "relative");
2337        $(element).css("border", "1px solid red");
2338      }
2339      if ($(form).find(".has-error").length > 0){
2340        $(form).find("button[type='submit']").prop('disabled',true);
2341      } else {
2342        $(form).find("button[type='submit']").prop('disabled',false);
2343      }
2344    }
2345  });
2346
2347  function getParameter(theParameter) {
2348    var params = window.location.search.substr(1)
2349      .split("&");
2350    for (var i = 0; i < params.length; i++) {
2351      var p = params[i].split("=");
2352      if (p[0] == theParameter) {
2353        return decodeURIComponent(p[1]);
2354      }
2355    }
2356    return false;
2357  }
2358
2359  function showRecoverPasswordForm() {
2360    $("#recover_password")
2361      .show();
2362    $("#customer_login_form")
2363      .hide();
2364  }
2365
2366  function hideRecoverPasswordForm() {
2367    $("#recover_password")
2368      .hide();
2369    $("#customer_login_form")
2370      .show();
2371  }
2372
2373  // Allow deep linking to the recover password form
2374  if (window.location.hash == "#recover") {
2375    showRecoverPasswordForm();
2376  }
2377
2378  // reset_success is only true when the reset form is
2379  
2380
2381  async function storeOAuthParams() {
2382    const params = {};
2383    const urlId = getParameter("id");
2384    const urlCode = getParameter("code");
2385    
2386    if (urlId) {
2387      params.price_id = urlId;
2388    } else {
2389      const priceIdField = document.getElementById('price_id');
2390      if (priceIdField && priceIdField.value) {
2391        params.price_id = priceIdField.value;
2392      }
2393    }
2394    
2395    if (urlCode) {
2396      params.code = urlCode;
2397    } else {
2398      const codeField = document.getElementById('code');
2399      if (codeField && codeField.value) {
2400        params.code = codeField.value;
2401      }
2402    }
2403
2404    if (Object.keys(params).length > 0) {
2405      try {
2406        const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content');
2407        const response = await fetch('/orders/store_oauth_params', {
2408          method: 'POST',
2409          headers: {
2410            'Content-Type': 'application/json',
2411            'X-CSRF-Token': csrfToken || '',
2412            'Accept': 'application/json'
2413          },
2414          body: JSON.stringify(params)
2415        });
2416
2417        if (!response.ok) {
2418          return false;
2419        }
2420
2421        const result = await response.json();
2422        return result && result.success === true;
2423      } catch (error) {
2424        return false;
2425      }
2426    }
2427
2428    return true;
2429  }
2430
2431  function handleGoogleSignIn() {
2432    const googleBtn = document.getElementById('google-login');
2433    if (googleBtn) {
2434      googleBtn.addEventListener('click', async () => {
2435        await storeOAuthParams();
2436        const url = googleBtn.getAttribute('data-google-url');
2437        if (url) {
2438          window.location.href = url;
2439        }
2440      });
2441    }
2442  }
2443
2444  // Function to set up modal event listeners (called once on page load)
2445  function setupModalEventListeners() {
2446    // Add event listeners for modal
2447    document.getElementById('close-modal').addEventListener('click', hideLoginModal);
2448    document.getElementById('oauth-login-form').addEventListener('submit', handleOAuthLogin);
2449  }
2450
2451  // Function to prevent scrolling when modal is open
2452  function preventScroll(e) {
2453    // Allow scrolling within the modal
2454    if (e.target.closest('#oauth-login-modal')) {
2455      return true;
2456    }
2457
2458    e.preventDefault();
2459    e.stopPropagation();
2460    return false;
2461  }
2462
2463  // Function to show login modal (simplified since modal is already in DOM)
2464  function showLoginModal(message) {
2465    // Store current scroll position
2466    const scrollY = window.scrollY;
2467
2468    // Update message and show modal
2469    document.getElementById('modal-message').textContent = message;
2470    document.getElementById('oauth-login-modal').style.display = 'flex';
2471
2472    // Prevent background scrolling
2473    document.body.classList.add('modal-open');
2474    document.body.style.top = `-${scrollY}px`;
2475
2476    // Store scroll position for restoration
2477    document.body.setAttribute('data-scroll-y', scrollY);
2478
2479    // Add scroll prevention event listeners
2480    document.addEventListener('wheel', preventScroll, { passive: false });
2481    document.addEventListener('touchmove', preventScroll, { passive: false });
2482    document.addEventListener('keydown', function(e) {
2483      // Prevent arrow keys, page up/down, space, home, end
2484      if ([32, 33, 34, 35, 36, 37, 38, 39, 40].includes(e.keyCode)) {
2485        preventScroll(e);
2486      }
2487    });
2488  }
2489
2490  // Function to hide login modal
2491  function hideLoginModal() {
2492    const modal = document.getElementById('oauth-login-modal');
2493    if (modal) {
2494      modal.style.display = 'none';
2495
2496      // Restore background scrolling
2497      document.body.classList.remove('modal-open');
2498
2499      // Restore scroll position
2500      const scrollY = document.body.getAttribute('data-scroll-y');
2501      document.body.style.top = '';
2502      if (scrollY) {
2503        window.scrollTo(0, parseInt(scrollY, 10));
2504      }
2505      document.body.removeAttribute('data-scroll-y');
2506
2507      // Remove scroll prevention event listeners
2508      document.removeEventListener('wheel', preventScroll);
2509      document.removeEventListener('touchmove', preventScroll);
2510      document.removeEventListener('keydown', preventScroll);
2511
2512      // Clean up URL parameters to remove show_login_modal
2513      const url = new URL(window.location);
2514      url.searchParams.delete('show_login_modal');
2515      window.history.replaceState({}, document.title, url);
2516    }
2517  }
2518
2519  // Function to handle OAuth login form submission
2520  function handleOAuthLogin(e) {
2521    e.preventDefault();
2522
2523    const email = document.getElementById('oauth-email').value;
2524    const password = document.getElementById('oauth-password').value;
2525    const submitBtn = document.getElementById('oauth-submit-btn');
2526    const errorMessage = document.getElementById('oauth-error-message');
2527
2528    // Clear previous errors
2529    errorMessage.style.display = 'none';
2530
2531    // Disable submit button
2532    submitBtn.disabled = true;
2533    submitBtn.textContent = 'Signing in...';
2534
2535    // Get CSRF token
2536    const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
2537
2538    // Submit using fetch API
2539    const formData = new FormData();
2540    formData.append('email', email);
2541    formData.append('password', password);
2542
2543    fetch('/auth/google_oauth2/associate_account_with_sso', {
2544      method: 'POST',
2545      headers: {
2546        'X-CSRF-Token': csrfToken
2547      },
2548      body: formData
2549    })
2550    .then(response => response.json())
2551    .then(data => {
2552      if (data.success) {
2553        // Hide modal and redirect
2554        window.location.href = data.redirect_url;
2555      } else if (data.isRedirectUser && data.redirect_url) {
2556        // User account doesn't exist, show message and redirect after 3 seconds
2557        errorMessage.textContent = data.message || 'Account not found. Redirecting to signup page...';
2558        errorMessage.style.display = 'block';
2559        errorMessage.style.color = '#d32f2f';
2560        submitBtn.disabled = true;
2561        submitBtn.textContent = 'Redirecting...';
2562
2563        setTimeout(() => {
2564          window.location.href = data.redirect_url;
2565        }, 3000);
2566      } else {
2567        // Show error message
2568        errorMessage.textContent = data.message || data.error || 'Invalid email or password';
2569        errorMessage.style.display = 'block';
2570        errorMessage.style.color = '#d32f2f'; // Red color for error message
2571        submitBtn.disabled = false;
2572        submitBtn.textContent = 'Sign In';
2573      }
2574    })
2575    .catch(error => {
2576      errorMessage.textContent = 'An error occurred. Please try again.';
2577      errorMessage.style.display = 'block';
2578      submitBtn.disabled = false;
2579      submitBtn.textContent = 'Sign In';
2580    });
2581  }
2582
2583  function handleAppleSignIn() {
2584    const appleBtn = document.getElementById('apple-login');
2585    if (appleBtn) {
2586      appleBtn.addEventListener('click', async () => {
2587        await storeOAuthParams();
2588
2589        const clientId = appleBtn.getAttribute('data-apple-client-id');
2590        const redirectUri = appleBtn.getAttribute('data-apple-redirect-uri');
2591        const baseState = appleBtn.getAttribute('data-state');
2592        const oauthParams = {};
2593        const urlId = getParameter("id");
2594        const urlCode = getParameter("code");
2595
2596        if (urlId) {
2597          oauthParams.price_id = urlId;
2598        } else {
2599          const priceIdField = document.getElementById('price_id');
2600          if (priceIdField && priceIdField.value) {
2601            oauthParams.price_id = priceIdField.value;
2602          }
2603        }
2604
2605        if (urlCode) {
2606          oauthParams.code = urlCode;
2607        } else {
2608          const codeField = document.getElementById('code');
2609          if (codeField && codeField.value) {
2610            oauthParams.code = codeField.value;
2611          }
2612        }
2613
2614        let state = baseState;
2615        if (Object.keys(oauthParams).length > 0) {
2616          const encodedParams = btoa(JSON.stringify(oauthParams));
2617          state = baseState + '|' + encodedParams;
2618        }
2619
2620        if (clientId && redirectUri) {
2621          const appleAuthUrl = 'https://appleid.apple.com/auth/authorize' +
2622            '?client_id=' + encodeURIComponent(clientId) +
2623            '&redirect_uri=' + encodeURIComponent(redirectUri) +
2624            '&response_type=code' +
2625            '&scope=' + encodeURIComponent('name email') +
2626            '&response_mode=form_post' +
2627            '&state=' + encodeURIComponent(state) +
2628            '&nonce=' + encodeURIComponent(Math.random().toString(36).substring(2, 15));
2629
2630          window.location.href = appleAuthUrl;
2631        }
2632      });
2633    }
2634  }
2635
2636  function handleFacebookSignIn() {
2637    const facebookBtn = document.getElementById('facebook-signin');
2638    if (facebookBtn) {
2639      facebookBtn.addEventListener('click', async () => {
2640        await storeOAuthParams();
2641        const appId = facebookBtn.getAttribute('data-facebook-app-id');
2642        const redirectUri = facebookBtn.getAttribute('data-facebook-redirect-uri');
2643        const state = facebookBtn.getAttribute('data-state');
2644
2645        if (appId && redirectUri) {
2646          const facebookAuthUrl = 'https://www.facebook.com/v21.0/dialog/oauth' +
2647            '?client_id=' + encodeURIComponent(appId) +
2648            '&redirect_uri=' + encodeURIComponent(redirectUri) +
2649            '&response_type=code' +
2650            '&scope=' + encodeURIComponent('email,public_profile') +
2651            '&state=' + state;
2652
2653          window.location.href = facebookAuthUrl;
2654        }
2655      });
2656    }
2657  }
2658
2659  document.addEventListener('DOMContentLoaded', function() {
2660    handleGoogleSignIn();
2661    handleAppleSignIn();
2662    handleFacebookSignIn();
2663    setupModalEventListeners();
2664
2665    const urlParams = new URLSearchParams(window.location.search);
2666    if (urlParams.get('show_login_modal') === 'true') {
2667      const message = 'Account already exists, login with your Crunch+ credentials to continue.';
2668      showLoginModal(message);
2669    }
2670  });
2671
2672  // Function to display social auth error
2673  function handleSocialAuthError(errorMessage) {
2674    const socialErrorDiv = document.getElementById('social-auth-error');
2675    if (socialErrorDiv) {
2676      socialErrorDiv.innerHTML = `<div class="err_msg"><p class='msg_text'>${errorMessage}</p></div>`;
2677    }
2678  }
2679
2680  // Check for OAuth callback status
2681  const urlParams = new URLSearchParams(window.location.search);
2682  if (urlParams.get('oauth_success') === 'false') {
2683    const errorMessage = urlParams.get('oauth_error') || 'Social authentication failed. Please try again.';
2684    handleSocialAuthError(errorMessage);
2685  }
2686</script>
2686
2687
2688
2689  
2690    
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703<footer role="contentinfo" aria-label="Footer">
2704  <div class="inner">
2705    <section class="single third show-wrapper">
2706      <h5 style="font-size: 1.2em; text-decoration: none; font-weight: 600;" class="mobile-ui toggle">About</h5>
2707      <div class="mobile-wrapper">
2708        <nav role="navigation" class="site-nav-footer"
2709             aria-label="Bottom Contact">
2710          <ul>
2711            
2712              <li class="active"
2713                  id="nav_fn_login">
2714                <a href="/accounts/login" aria-label="Log into your account">Log In</a>
2715              </li>
2716            
2717            
2718            <li id="nav_fn_login">
2719              <a href="/crunch_subscriptions" aria-label="Free trial">Free Trial</a>
2720            </li>
2721            
2722              <li id="nav_fn_logout">
2723                <a href="/crunch_subscriptions" aria-label="Explore subscriptions">Subscriptions</a>
2724              </li>
2725            
2726            <li>
2727              <a href="/page/international-india" target="_blank" rel="noopener noreferrer" aria-label="Learn about Crunch India">Crunch India Coming Soon</a>
2728            </li>
2729          </ul>
2730      </div>
2731    </section>
2732
2733    <section class="single third show-wrapper">
2734      <h5 style="font-size: 1.2em; text-decoration: none; font-weight: 600;" class="mobile-ui toggle">Support</h5>
2735      <div class="mobile-wrapper">
2736        <nav role="navigation" class="site-nav-footer"
2737             aria-label="Bottom Account">
2738          <ul>
2739            <li>
2740              <a href="mailto:[email protected]"
2741                 alt="Support"
2742                 aria-label="Contact for support/help">Contact Us
2743              </a>
2744            </li>
2745            
2746            
2747            
2748            <li>
2749              <a href="/page/faq/"
2750                 target="_blank"
2751                 aria-label="Frequently asked questions"
2752                 rel="noopener noreferrer">FAQ
2753              </a>
2754            </li>
2755            <li>
2756              <a href="/page/terms-of-service/"
2757                 target="_blank"
2758                 aria-label="Check terms and conditions"
2759                 rel="noopener noreferrer">Terms &amp; Conditions
2760              </a>
2761            </li>
2762            <li>
2763              <a href="/page/privacy/"
2764                 target="_blank"
2765                 aria-label="Check privacy policy"
2766                 rel="noopener noreferrer">Privacy Policy
2767              </a>
2768            </li>
2769            <li>
2770              <a href="/instantaccess"
2771                 rel="noopener noreferrer"
2772                 aria-label="Get the crunch+ app"
2773                 id="nav_fn_ia">Get the Crunch+ App
2774              </a>
2775            </li>
2776            <p class="social-icons">
2777              
2778              
2779              
2780                
2781                  <a class="fa fa-twitter"
2782                    rel="external"
2783                    href="https://twitter.com/crunchgym"
2784                    aria-label="Twitter"></a>
2785                
2786              
2787              
2788              
2789              
2790                
2791                  <a class="fa fa-facebook"
2792                    rel="external"
2793                    href="https://www.facebook.com/CRUNCH/"
2794                    aria-label="Facebook"></a>
2795                
2796              
2797              
2798              
2799              
2800                
2801                  <a class="fa fa-instagram"
2802                    rel="external"
2803                    href="https://www.instagram.com/crunchgym/"
2804                    aria-label="Instagram"></a>
2805                
2806              
2807            </p>
2808            <div class="html-output">
2809                
2810                
2811                  <p>Account Inquiries: <a href="mailto: [email protected]">[email protected]</a></p>
2812                
2813            </div>
2814            <p class="custom-footer-font">&copy; 2026 Crunch+. All Rights Reserved. </p>
2815          </ul>
2816          <div class="logo-container">
2817            <div class="logo-container--left">
2818              <div> 
2819                
2820                <a href="https://apps.apple.com/us/app/crunch/id6443678389" target="_blank" rel="noopener noreferrer" aria-label="Apple TV">
2821                  <img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/download-on-the-app-store-apple-logo-svgrepo-com-09935af539d3592a5c0de0c2ab3cdb94e9f7269d53b1997fec9470cb8b4f093a.png" class="app-log" alt="Stream Club Pilates on Demand with your Ap
2821ple TV" />
2822                </a>
2823              </div>
2824              <div>
2825                
2826							  <a href="https://play.google.com/store/apps/details?id=com.crunchplus" target="_blank" rel="noopener noreferrer" aria-label="Google app store">
2827                  <img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/google-play-badge-logo-svgrepo-com-57d6e9263348d6ba13864facf643c1c05785ad75d4dfdd86ea5e0c1df1e1feac.png" class="app-log" alt="Stream Club Pilates on Demand with google app store" />
2828                </a>
2829              </div>
2830            </div>
2831            <div class="logo-container--right">
2832              <div>
2833                
2834							  <a href="https://play.google.com/store/apps/details?id=com.crunchplus" target="_blank" rel="noopener noreferrer" aria-label="Android TV">
2835                  <img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-android-tv-white-8f6c78200d3293de0bbeaf12312453b83afa95178e52d0025aee483c9a3b1c60.png" class="app-log" alt="Stream Club Pilates on Demand with android tv" />
2836                </a>
2837              </div>
2838              <div>
2839                
2840                <a href="https://apps.apple.com/us/app/crunch/id6443678389" target="_blank" rel="noopener noreferrer" aria-label="Apple TV">
2841                  <img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-apple-tv-white-bda23d665b1e50b216bc5255c2b2877093361d4318a8c8e7f5a61629a5dfddd9.png" class="app-log" alt="Stream Club Pilates on Demand with apple tv" />
2842                </a>
2843              </div>
2844              <div>
2845                
2846                
2847
2848								<a style="color: black !important;" href="https://www.amazon.com/Crunch-LLC/dp/B0BLHNPFBC" target="_blank" rel="noopener noreferrer" aria-label="Opens in a new tab">
2849                  <img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-fire-tv-white-b55e0fdd0791467821acdfe002cb971a9389ae0a6dee477147a0f3443905015b.png" class="app-log" alt="Stream Club Pilates on Demand with apple tv" />
2850                </a>
2851                <a href="https://channelstore.roku.com/details/b2cc77408e2efebb9f3024285d7b4b56/crunch+" target="_blank" rel="noopener noreferrer" aria-label="Stream Club Pilates on Demand with apple tv">
2852                  <img src="//dbjtwsnsmnuln.cloudfront.net/assets/master/instant-access/logo-roku-white-7ddb99c67c38050433c79c466f797df0cb074d63be9e2ff839345d4d992bea00.png" class="app-log roku-icon" alt="Watch our videos in our app on your Roku device" />
2853                </a>
2854              </div>
2855            </div>
2856          </div>
2857        </nav>
2858      </div>
2859    </section>
2860
2861    
2862    
2863    
2864  </div>
2865</footer>
2866  
2867
2868  
2869    
2869<script type="text/javascript" src="https://js.stripe.com/v3/"></script>
vendor: 1 bytes, line 2869
2869
2870<script
2871  type="text/javascript"
2872  
2873    src="https://js.authorize.net/v1/Accept.js"
2874  
2875  charset="utf-8"></script>
2875
2876
2877<div id="fb-root"></div>
2878<script>(function(d, s, id) {
2879  var js, fjs = d.getElementsByTagName(s)[0];
2880  if (d.getElementById(id)) return;
2881  js = d.createElement(s); js.id = id;
2882  js.src = "//connect.facebook.net/en_US/sdk.js#xfbml=1&version=v2.8&appId=130026020819382";
2883  fjs.parentNode.insertBefore(js, fjs);
2884}(document, 'script', 'facebook-jssdk'));</script>
2884
2885
2886<script>window.twttr = (function(d, s, id) {
2887  var js, fjs = d.getElementsByTagName(s)[0],
2888    t = window.twttr || {};
2889  if (d.getElementById(id)) return t;
2890  js = d.createElement(s);
2891  js.id = id;
2892  js.src = "https://platform.twitter.com/widgets.js";
2893  fjs.parentNode.insertBefore(js, fjs);
2894
2895  t._e = [];
2896  t.ready = function(f) {
2897    t._e.push(f);
2898  };
2899
2900  return t;
2901}(document, "script", "twitter-wjs"));</script>
2901
2902
2903
2904<script>
2905    
2906
2907		window.addEventListener("load", function () {
2908			$.query.SET("livestream", "false");
2909
2910			$(".close-notify").on("click", function () {
2911				$(".successful-update").hide(500);
2912			});
2913
2914			$(".toggle-the-content").click(function () {
2915				$(this).closest(".collapsable-content").toggleClass("hide");
2916			});
2917
2918			// sharing
2919			$(".fbshare").on("click", function () {
2920				var url = $(this).attr("data-url");
2921				console.log(url);
2922				var fbpopup = window.open("https://www.facebook.com/sharer/sharer.php?u=" + url, "pop", "width=500, height=350, scrollbars=no");
2923				return false;
2924			});
2925
2926			// mobile navigation
2927			$("aside .mobile-ui.toggle .label, aside .mobile-ui .close-toggle")
2928				.click(function () {
2929					$("aside").toggleClass("apply-mobile-ui");
2930				});
2931
2932			$(".toggle-nav .mobile-ui.toggle .label, .toggle-nav .mobile-ui .close")
2933				.click(function () {
2934					$(".toggle-nav").toggleClass("apply-mobile-ui");
2935					return false;
2936				});
2937
2938			$(".toggle-item .toggle").click(function () {
2939				$(this).parent(".toggle-item").toggleClass("show");
2940			});
2941
2942			$("span.favorite_media").click(function () {
2943				var id = $("span.favorite_media").attr("id");
2944				var favorited = $("span.favorite_media").hasClass("active");
2945
2946        if (favorited == false) {
2947          $(this).toggleClass("active");
2948          fetch(`/api/widget/v1/user/add_favorite/media/${id}`, {
2949            method: 'POST',
2950          })
2951          .then(response => response.json())
2952          .then(response => {
2953            var params = new URLSearchParams(window.location.search);
2954            var payloadAddToFavorites = {
2955              'event': "",
2956              'video_title': "",
2957              'video_duration': "",
2958              'video_category': params.get("category").replace(/^"|"$/g, ''),
2959              'video_rating': ''
2960            };
2961            dataLayer.push(payloadAddToFavorites);
2962          })
2963          .catch(error => console.error('Error:', error));
2964        } else if (favorited == true) {
2965          $(this).toggleClass("active");
2966          fetch(`/api/widget/v1/user/remove_favorite/media/${id}`, {
2967            method: 'DELETE',
2968            headers: {
2969              'Content-Type': 'application/json'
2970            }
2971          })
2972          .catch(error => console.error('Error:', error));
2973        }
2974      });
2975
2976			$(".show-cancellation-modal .modal-wrapper .overlay, .modal .close")
2977				.click(function () {
2978					$("body").removeClass("show-cancellation-modal");
2979				});
2980
2981			$(".cancel-link-modal").click(function () {
2982				$("body").addClass("show-cancellation-modal");
2983			});
2984
2985			// purchases table
2986			$(".table-purchases .fa.toggle-the-content").click(function () {
2987				$(this).parent(".collapsable-content").toggleClass("show");
2988				return false;
2989			});
2990
2991			// show purchased or all content dropdown
2992			$(function () {
2993				// bind change event to select
2994				$("#filter_content").on("change", function () {
2995					var url = $(this).val(); // get selected value
2996					if (url) { // require a URL
2997						window.location = url; // redirect
2998					}
2999					return false;
3000				});
3001			});
3002
3003			$(document).ready(function () {
3004				var status_hash = {};
3005				var handleArrows = function (arrows, index, visible, length) {
3006					if ((index + visible) >= length) {
3007						arrows.filter(".right").addClass("disabled");
3008					} else {
3009						arrows.filter(".right").removeClass("disabled");
3010					}
3011
3012					if (index == 0) {
3013						arrows.filter(".left").addClass("disabled");
3014					} else {
3015						arrows.filter(".left").removeClass("disabled");
3016					}
3017				};
3018				var categories = $(".browse, .category-products");
3019				$.each(categories, function (i) {
3020					status_hash[i] = {};
3021					status_hash[i]["items"] = $(this).find("ul.grid li");
3022					if (status_hash[i]["items"].length > 0) {
3023						status_hash[i]["width"] = status_hash[i]["items"][0].scrollWidth + 5;
3024						status_hash[i]["item"] = status_hash[i]["items"][0];
3025						status_hash[i]["length"] = status_hash[i]["items"].length;
3026						status_hash[i]["visible"] = 5;
3027						status_hash[i]["index"] = 0;
3028						status_hash[i]["endIndex"] = (status_hash[i]["length"] - status_hash[i]["visible"]);
3029						var arrows = $(this).find(".arrow");
3030						arrows.filter(".right").click(function () {
3031							if (status_hash[i]["index"] < status_hash[i]["endIndex"]) {
3032								status_hash[i]["index"]++;
3033								status_hash[i]["items"].animate({ "left": "-=" + status_hash[i]["width"] + "px" }, 500);
3034								handleArrows(arrows, status_hash[i]["index"], status_hash[i]["visible"], status_hash[i]["length"]);
3035							}
3036						});
3037						arrows.filter(".left").click(function () {
3038							if (status_hash[i]["index"] > 0) {
3039								status_hash[i]["index"]--;
3040								status_hash[i]["items"].animate({ "left": "+=" + status_hash[i]["width"] + "px" }, 500);
3041								handleArrows(arrows, status_hash[i]["index"], status_hash[i]["visible"], status_hash[i]["length"]);
3042							}
3043						});
3044					}
3045				});
3046
3047				// sitewide search
3048				$(".global-search").submit(function (e) {
3049					var delivery_only = '' === "delivery_only";
3050					var search_path = location.origin;
3051					if (delivery_only) {
3052						search_path += "/accounts/search_items/";
3053					} else {
3054						search_path += "/search_items/";
3055					}
3056					e.preventDefault();
3057					var termQuery = $.query.REMOVE("term");
3058					var pageTypeQuery = $.query.GET("page_type");
3059					var term = "";
3060					var $inputs = $(":input", this);
3061					$inputs.each(function () {
3062						if (this.name === "term") {
3063							term = $(this).val();
3064						}
3065					});
3066					if (term) {
3067						termQuery = $.query.SET("term", term);
3068					}
3069            
3070
3071            
3072
3073					location.href = search_path + termQuery;
3074				});
3075
3076				$(".dropdown-button").click(function () {
3077					var $button, $menu;
3078					$button = $(this);
3079					$menu = $button.siblings(".dropdown-menu");
3080					$menu.toggleClass("show-menu");
3081					$menu.children("li").click(function () {
3082						$menu.removeClass("show-menu");
3083						$button.html($(this).html());
3084					});
3085				});
3086			});
3087
3088			// search
3089        
3090			$("#custom-search-form").submit(function (e) {
3091				e.preventDefault();
3092				var termQuery = $.query.REMOVE("term");
3093				var pageType = $.query.GET("page_type");
3094
3095				if (!pageType) {
3096					pageType = '';
3097				}
3098				console.log(pageType);
3099				var term = "";
3100				var $inputs = $("#custom-search-form :input");
3101				$inputs.each(function () {
3102					if (this.name === "term") {
3103						term = $(this).val();
3104					}
3105				});
3106				if (term) {
3107					termQuery = $.query.SET("term", term);
3108				}
3109				location.search = termQuery;
3110			});
3111
3112			// search results type products or media
3113			$(".toggle-page-type").click(function () {
3114				var pageType = $.query.GET("page_type");
3115				var searchString = $.query.REMOVE("page");
3116				if (pageType == "") {
3117            
3118					searchString = $.query.SET("page_type", "products");
3119            
3120					location.search = searchString;
3121				} else if (pageType == "media") {
3122					searchString = $.query.SET("page_type", "products");
3123					location.search = searchString;
3124				} else {
3125					searchString = $.query.SET("page_type", "media");
3126					location.search = searchString;
3127				}
3128			});
3129
3130			// taxonomies or categories
3131			$(document).ready(function () {
3132				//For Filter Pages
3133				var filterIds = getParameterByName("filters");
3134				var filterIdArray = filterIds.split(",");
3135				if (filterIdArray[0] === "") {
3136					filterIdArray = [];
3137				}
3138
3139				for (var i = 0; i < filterIdArray.length; i++) {
3140					var currentTaxObj = $(".tax-filter-link[data-taxid='" + filterIdArray[i] + "']");
3141					currentTaxObj.addClass("selected");
3142				}
3143
3144				$(".tax-filter-link").click(function () {
3145					if ($(this).hasClass("selected")) {
3146						for (var i = 0; i < filterIdArray.length; i++) {
3147							if (filterIdArray[i] == $(this).data("taxid")) {
3148								filterIdArray.splice(i, 1);
3149							}
3150						}
3151					} else {
3152						filterIdArray.push($(this).data("taxid"));
3153					}
3154
3155					// if( filterIdArray.length > 0 ){
3156					href = window.location.href.split("?")[0];
3157
3158					window.location.href = href + "?filters=" + filterIdArray.join(",");
3159					return false;
3160					// }
3161				});
3162
3163				// responsive video iframe embeds
3164				$(function () {
3165					$("iframe.video").each(function () {
3166						var height = $(this).width() * .5625;
3167						$(this).css("height", height + "px");
3168					});
3169					$(window).resize(function () {
3170						$("iframe.video").each(function () {
3171							var height = $(this).width() * .5625;
3172							$(this).css("height", height + "px");
3173						});
3174					});
3175				});
3176
3177			});
3178
3179			// To grab url variables and separate them with commas
3180			// http://stackoverflow.com/questions/901115/how-can-i-get-query-string-values-in-javascript
3181			function getParameterByName(name) {
3182				name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
3183				var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
3184					results = regex.exec(location.search);
3185				return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
3186			}
3187
3188			// clean tabbed content
3189			$(document).ready(function() {
3190				$(".accordion-body").hide();
3191				
3192				$(".accordion-heading").bind("click", function(e) {
3193					$(this).parent().find(".accordion-body").slideToggle("fast");
3194					$(this).parent().toggleClass("is-expanded");
3195					e.preventDefault();
3196				});
3197
3198				if($(".accordion-body li .selected")) {
3199					const parentItem = $(".accordion-body li .selected").parent().parent();
3200					parentItem.show();
3201				} else {
3202					$(".accordion-body").hide();
3203				}
3204			});
3205
3206			// preview modal
3207			$(function () {
3208				$("#modal-teaser").on("change", function () {
3209					if ($(this).is(":checked")) {
3210						$("body").addClass("modal-open teaser");
3211					} else {
3212						$("body").removeClass("modal-open teaser");
3213					}
3214				});
3215
3216				$("#modal-preview").on("change", function () {
3217					if ($(this).is(":checked")) {
3218						$("body").addClass("modal-open preview");
3219					} else {
3220						$("body").removeClass("modal-open preview");
3221					}
3222				});
3223
3224				$(".modal .overlay, .modal .inner, .modal .close")
3225					.on("click", function () {
3226						$(".modal .state:checked").prop("checked", false).change();
3227						$("iframe.video").each(function () {
3228							var el_src = $(this).attr("src");
3229							$(this).attr("src", el_src);
3230						});
3231					});
3232
3233				$(".modal .inner").on("click", function (e) {
3234					e.stopPropagation();
3235				});
3236			});
3237
3238			// video modal
3239			$(document).ready(function () {
3240				function toggle_video_modal() {
3241					$(".js-trigger-video-modal").on("click", function (e) {
3242						e.preventDefault();
3243						var src = $(this).attr("href");
3244						$("#video_player").attr("src", src);
3245						$("body").addClass("show-video-modal noscroll");
3246					});
3247
3248					function close_video_modal() {
3249						event.preventDefault();
3250						$("body").removeClass("show-video-modal noscroll");
3251						$("#video_player").attr("src", "");
3252					}
3253
3254					$("body")
3255						.on("click", ".close-video-modal, .video-modal .overlay", function (event) {
3256							close_video_modal();
3257						});
3258
3259					$("body").keyup(function (e) {
3260						if (e.keyCode == 27) {
3261							close_video_modal();
3262						}
3263					});
3264				}
3265
3266				toggle_video_modal();
3267			});
3268		});
3269</script>
3269
3270
3271
3272<script type="text/javascript">
3273  (function() {
3274    var STORAGE_KEY = 'crunchplus_scroll_restore';
3275    function getScrollY() {
3276      return window.scrollY !== undefined
3277        ? window.scrollY
3278        : (document.documentElement && document.documentElement.scrollTop) || document.body.scrollTop || 0;
3279    }
3280    function saveScroll() {
3281      try {
3282        var y = getScrollY();
3283        if (y <= 0) return;
3284        sessionStorage.setItem(STORAGE_KEY, JSON.stringify({
3285          pathname: window.location.pathname,
3286          scrollY: y
3287        }));
3288      } catch (e) {}
3289    }
3290    function restoreScroll() {
3291      try {
3292        var raw = sessionStorage.getItem(STORAGE_KEY);
3293        if (!raw) return;
3294        var data = JSON.parse(raw);
3295        if (!data || data.pathname !== window.location.pathname) return;
3296        var y = parseInt(data.scrollY, 10);
3297        if (!y) return;
3298        sessionStorage.removeItem(STORAGE_KEY);
3299        function doScroll() {
3300          window.scrollTo(0, y);
3301          if (document.documentElement) document.documentElement.scrollTop = y;
3302          if (document.body) document.body.scrollTop = y;
3303        }
3304        doScroll();
3305        requestAnimationFrame(function() {
3306          doScroll();
3307          setTimeout(doScroll, 0);
3308        });
3309      } catch (e) {}
3310    }
3311    window.addEventListener('pagehide', saveScroll, { passive: true });
3312    window.addEventListener('pageshow', function(e) {
3313      if (e.persisted) {
3314        restoreScroll();
3315      }
3316    }, { passive: true });
3317    window.addEventListener('load', function() {
3318      setTimeout(function() {
3319        requestAnimationFrame(restoreScroll);
3320      }, 100);
3321    }, { passive: true });
3322  })();
3323</script>
3323
3324
3325<script type="text/javascript">
3326  window.addEventListener("load", function () {
3327    jQuery(document)
3328      .ready(function () {
3329        jQuery(".scrollbar-outer")
3330          .scrollbar();
3331      });
3332
3333
3334    var acc = document.getElementsByClassName("question");
3335    var i;
3336
3337    for (i = 0; i < acc.length; i++) {
3338      acc[i].addEventListener("click", function() {
3339        this.classList.toggle("active");
3340        var panel = this.nextElementSibling;
3341        var plusIcon = jQuery(this).find('.acc-icon');
3342        if (panel.style.display === "block") {
3343          panel.style.display = "none";
3344          plusIcon.removeClass('minus-icon');
3345          plusIcon.addClass('plus-icon');
3346        } else {
3347          panel.style.display = "block";
3348          plusIcon.addClass('minus-icon');
3349          plusIcon.removeClass('plus-icon');
3350        }
3351      });
3352    }
3353
3354    // Lead Gen Modal
3355    
3356    
3357    
3358
3359    
3360    
3361    
3362
3363
3364    
3365    
3366
3367    
3368    
3369
3370    
3371    
3372
3373
3374    
3375    
3376    
3377    
3378
3379    // slideshow
3380    jQuery(document)
3381      .ready(function ($) {
3382        $(".slider")
3383          .unslider({
3384            autoplay: true,
3385            speed: 1000,
3386            delay: 6000,
3387            animation: 'fade',
3388            arrows: {
3389              prev: "",
3390              next: ""
3391            }
3392          });
3393
3394        // Mobile Menu
3395        $(".menu-drawer a, .site-nav-drawer .close")
3396          .click(function () {
3397            $(".site-nav-drawer")
3398              .toggleClass("hidden")
3399              .animate("slow");
3400            $("body")
3401              .toggleClass("locked")
3402              .animate("slow");
3403          });
3404
3405        $(".sub-nav-toggle")
3406          .click(function () {
3407            $("ul.sub-nav")
3408              .toggleClass("hidden")
3409              .animate("slow");
3410          });
3411
3412        $(".bucket.testimonial:gt(3)")
3413          .parent()
3414          .addClass("fs");
3415      });
3416
3417    $(".search-toggle, .inner.search .fa-close")
3418      .click(function () {
3419        $(".inner.search")
3420          .toggleClass("show-search");
3421      });
3422
3423    // Select all links with hashes
3424    $("a[href*=\"#\"]")
3425      // Remove links that don't actually link to anything
3426      .not("[href=\"#\"]")
3427      .not("[href=\"#0\"]")
3428      .click(function (event) {
3429        // On-page links
3430        if (
3431          location.pathname.replace(/^\//, "") == this.pathname.replace(/^\//, "")
3432          &&
3433          location.hostname == this.hostname
3434        ) {
3435          // Figure out element to scroll to
3436          var target = $(this.hash);
3437          target = target.length ? target : $("[name=" + this.hash.slice(1) + "]");
3438          // Does a scroll target exist?
3439          if (target.length) {
3440            // Only prevent default if animation is actually gonna happen
3441            event.preventDefault();
3442            $("html, body")
3443              .animate({
3444                scrollTop: target.offset().top
3445              }, 1000, function () {
3446                // Callback after animation
3447                // Must change focus!
3448                var $target = $(target);
3449                $target.focus();
3450                if ($target.is(":focus")) { // Checking if the target was focused
3451                  return false;
3452                } else {
3453                  $target.attr("tabindex", "-1"); // Adding tabindex for elements not focusable
3454                  $target.focus(); // Set focus again
3455                }
3456
3457              });
3458          }
3459        }
3460      });
3461
3462    $(function () {
3463      var viewportWidth = $(window)
3464        .width();
3465
3466      if (viewportWidth > 1024) {
3467        $(".bg-video video")
3468          .each(function () {
3469            var height = $(".bg-video video")
3470              .width() * .5625;
3471            $(".bg-video")
3472              .css("height", height + "px");
3473          });
3474        $(window)
3475          .resize(function () {
3476            $(".bg-video video")
3477              .each(function () {
3478                var height = $(".bg-video video")
3479                  .width() * .5625;
3480                $(".bg-video")
3481                  .css("height", height + "px");
3482              });
3483          });
3484      }
3485    });
3486
3487    $("header nav .toggle.open, header nav .fa-close")
3488      .click(function () {
3489        $("#nav_dt_search,#nav_dt_search_left")
3490          .toggleClass("show-search");
3491          $(".inner.search")
3492          .toggleClass("show-search");
3493      });
3494  });
3495</script>
3495
3496
3497
3498<script src="//dbjtwsnsmnuln.cloudfront.net/assets/pink_essence/all-1975a51196b825a9805fcaef9408d8290dc366452d9e83a60a52df826d7082ce.js"></script>
3498
3499
3500
3501
3502<script src="//dbjtwsnsmnuln.cloudfront.net/assets/app-subscriber-8745873d46492a11423b82cc182aeb6ea5b82d8cca48f7141771630214dca1e7.js?hash=1790863416"></script>
3502
3503
3504    
3505    
3506    <div class="vue-app"
3507         style="position: relative">
3508      <global_toasts></global_toasts>
3509      <div id="global_modal--target"></div>
3510    </div>
3511
3512    <!-- Include the Sticky Footer Partial -->
3513    <style>
3514  .sticky-footer {
3515      position: fixed !important;
3516      bottom: 0;
3517      left: 0;
3518      width: 100%;
3519      background: linear-gradient(90deg, #E33B89, #5B32AC);
3520      padding: 20px;
3521      box-shadow: 0 -2px 5px rgba(0, 0, 0, 0.1);
3522      z-index: 1000;
3523      display: flex;
3524      justify-content: center;
3525      align-items: center;
3526      position: relative;
3527  }
3528
3529  .sticky-footer p {
3530      margin: 0;
3531      color: white;
3532      font-size: 16px;
3533      text-align: center;
3534  }
3535
3536  .sticky-footer a {
3537    color: white;
3538    text-decoration: underline;
3539  }
3540
3541  .close-footer {
3542      position: absolute;
3543      top: 50%;
3544      right: 20px;
3545      transform: translateY(-50%);
3546      background: none;
3547      border: none;
3548      color: white;
3549      font-size: 24px;
3550      cursor: pointer;
3551      padding: 0;
3552  }
3553
3554  @media (max-width: 768px) {
3555    .close-footer {
3556        top: 12px;
3557        right: 10px;
3558        font-size: 20px;
3559    }
3560
3561    .sticky-footer {
3562        padding: 15px;
3563        font-size: 14px;
3564    }
3565
3566    .footer-collapsed p {
3567      font-size: 14px;
3568    }
3569  }
3570
3571  .learn-more-link {
3572    color: white;
3573    text-decoration: underline;
3574    font-weight: normal;
3575    background: none;
3576    border: none;
3577    padding: 0;
3578    font-size: 14px;
3579    cursor: pointer;
3580  }
3581
3582  @media (min-width: 769px) {
3583    .footer-collapsed {
3584      display: none !important;
3585    }
3586    .footer-expanded {
3587      display: block !important;
3588    }
3589  }
3590</style>
3591
3592<div class="sticky-footer" id="sticky-footer">
3593  <div class="footer-collapsed" id="footer-collapsed">
3594    <p>
3595      We’ve updated our Terms and Privacy Policy.
3596      <a href="javascript:void(0);" onclick="expandFooter()" class="learn-more-link">Learn More</a>
3597    </p>
3598  </div>
3599
3600  <div class="footer-expanded" id="footer-expanded" style="display: none;">
3601    <p>We’ve updated our <a href="/page/terms-of-service/" target="_blank">Terms of Use</a> and
3602    <a href="/page/privacy/" target="_blank">Privacy Policy</a> to explain how we collect, use, and share your data, and your rights.</p>
3603    <p>By continuing to use this website, you acknowledge and consent to the revised terms.</p>
3604    <div class="close-footer" onclick="closeFooter()"><i class="fa fa-times" aria-hidden="true" style="font-size: large !important;"></i></div>
3605  </div>
3606</div>
3607
3608<script>
3609  // Function to check if the cookie is set for closing the footer
3610  function hideStickyFooterIfClosed() {
3611    if (getCookie('sticky_footer_closed') === 'true') {
3612        document.getElementById('sticky-footer').style.display = 'none';
3613    }
3614  }
3615
3616  // Call this function on page load to hide the footer if the cookie is set
3617  hideStickyFooterIfClosed();
3618  window.onload = hideStickyFooterIfClosed;
3619
3620  // Function to close the footer and set the cookie
3621  function closeFooter() {
3622      var footer = document.getElementById('sticky-footer');
3623      if (footer) {
3624          footer.style.display = 'none';
3625          setCookie('sticky_footer_closed', 'true', 0);
3626      }
3627  }
3628
3629  function expandFooter() {
3630    document.getElementById('footer-collapsed').style.display = 'none';
3631    document.getElementById('footer-expanded').style.display = 'block';
3632  }
3633
3634  function getCookie(name) {
3635      let nameEQ = name + "=";
3636      let ca = document.cookie.split(';');
3637      for (let i = 0; i < ca.length; i++) {
3638          let c = ca[i];
3639          while (c.charAt(0) == ' ') c = c.substring(1, c.length);
3640          if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
3641      }
3642      return null;
3643  }
3644
3645  // Function to set a cookie
3646  function setCookie(name, value, days) {
3647      let expires = "";
3648      if (days) {
3649          let date = new Date();
3650          date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
3651          expires = "; expires=" + date.toUTCString();
3652      }
3653      document.cookie = name + "=" + (value || "") + expires + "; path=/";
3654  }
3655</script>
3655
3656
3657
3658    
3658<script>
3659      (function() {
3660        var s = document.createElement('script');
3661        var h = document.querySelector('head') || document.body;
3662        s.src = 'https://acsbapp.com/apps/app/dist/js/app.js';
3663        s.async = true;
3664        s.onload = function() {
3665            var config = {
3666                statementLink: '',
3667                footerHtml: '',
3668                hideMobile: false,
3669                hideTrigger: false,
3670                disableBgProcess: false,
3671                language: 'en',
3672                position: 'left',
3673                leadColor: '#c35a96',
3674                triggerColor: '#c35a96',
3675                triggerRadius: '50%',
3676                triggerPositionX: 'left',
3677                triggerPositionY: 'bottom',
3678                triggerIcon: 'people',
3679                triggerSize: 'medium',
3680                triggerOffsetX: 20,
3681                triggerOffsetY: 110,
3682                mobile: {
3683                    triggerSize: 'small',
3684                    triggerPositionX: 'left',
3685                    triggerPositionY: 'center',
3686                    triggerOffsetX: 10,
3687                    triggerOffsetY: 0,
3688                    triggerRadius: '50%'
3689                }
3690            };
3691
3692            acsbJS.init(config);
3693        };
3694        h.appendChild(s);
3695      })();
3696    </script>
3696
3697
3698    <!-- AI Chat Widget -->
3699    
3700    
3700<script>
3701      window.AI_AGENT_CONFIG = {
3702        widgetID: "7f00e4eb-9276-4bfe-9c95-85b6733112bc"
3703      };
3704    </script>
3704
3705    
3705<script src="https://platform-js.omapagents.ai/widget.js"></script>
3705
3706    
3707  </body>
3708</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.