1<!DOCTYPE html> 2<html class="w-mod-js" lang="en" data-wf-page="694982bd2608af05ee3a3af8" data-wf-site="68e57f3a62c4bf057fb2e9ed"> 3<head> 4 <title> 5 Jillian Michaels 6 </title> 7 <meta name="viewport" content="width=device-width,initial-scale=1"> 8 <meta charset=utf-8 /> 9 <meta name="csrf-param" content="authenticity_token" /> 10<meta name="csrf-token" content="qHZETsyaUxn-fFqVDl0yMaxokdHzrZAqYm3j4DKTNkFfV8YtSCIZ0QvBqlXBG1XrZCatrT2kzeUIZlidpgnz0A" /> 11 <link rel="icon" type="image/x-icon" href="https://favicons.fitbox.io/jm/favicon.ico" /> 12 13 <link rel="stylesheet" href="/org/jm/css/normalize.css"> 14 <link rel="stylesheet" href="/org/jm/css/webflow.css"> 15 <link rel="stylesheet" href="/org/jm/css/jillian-michaels-2025.webflow.css"> 16 <link rel="stylesheet" href="https://use.typekit.net/xqk8lnt.css"> 17 <link rel="stylesheet" href="/org/jm/css/canela.css"> 18 <link rel="stylesheet" href="/org/jm/css/tokens.css?v=1790629836"> 19
19<script>!function(o,c){var n=c.documentElement,t=" w-mod-";n.className+=t+"js",("ontouchstart"in o||o.DocumentTouch&&c instanceof DocumentTouch)&&(n.className+=t+"touch")}(window,document);</script>
19 20 <style> 21 .no-scrollbar { 22 overflow-x: auto; 23 scrollbar-width: none; /* Firefox */ 24 } 25 .no-scrollbar::-webkit-scrollbar { 26 display: none; /* Chrome, Safari */ 27 } 28</style> 29<style> 30@media (max-width: 991px) { 31 /* 1. Keep 'Learn' aligned with list items and bundle the text + chevron close together */ 32 .w-dropdown-toggle, 33 .w-dropdown-toggle.w--open, 34 div[class*="Dropdown"].w-dropdown-toggle { 35 display: flex !important; 36 justify-content: flex-start !important; /* Forces text and icon to sit tight next to each other */ 37 align-items: center !important; 38 gap: 8px !important; /* Creates a clean, unmoving space right between Learn and the chevron */ 39 padding-left: 10px !important; 40 margin-left: 0px !important; 41 text-indent: 0px !important; 42 width: auto !important; /* Prevents the container from scaling to 100% width when active */ 43 box-sizing: border-box !important; 44 } 45 /* 2. Freeze the background variable properties when open */ 46 div[class*="Dropdown"].w-dropdown-toggle.w--open { 47 padding-left: 10px !important; 48 margin-left: 0px !important; 49 } 50 /* 3. Keep inner layout elements dead-still */ 51 .w-dropdown-toggle > div, 52 .w-dropdown-toggle.w--open > div, 53 .w-dropdown-toggle span { 54 margin-left: 0px !important; 55 padding-left: 0px !important; 56 text-indent: 0px !important; 57 display: inline-block !important; 58 } 59 /* 4. Ensure the actual icon graphic element doesn't inherit alignment margins */ 60 .w-dropdown-toggle .w-icon-dropdown-toggle, 61 .w-dropdown-toggle [class*="icon"], 62 .w-dropdown-toggle svg { 63 margin-left: 0px !important; 64 margin-right: 0px !important; 65 position: relative !important; 66 right: auto !important; 67 } 68 /* 5. Indent your 3 inner links relative to the 20px header mark */ 69 .w-dropdown-list.w--open, 70 div[class*="Dropdown-Slide-PD"] { 71 padding-left: 40px !important; 72 box-sizing: border-box !important; 73 } 74} 75</style> 76<style> 77@media (prefers-reduced-motion: reduce) { 78 /* 1. Force your custom Webflow play button to appear */ 79 .video-play-btn, #video-play-btn { 80 display: block !important; /* Change to 'flex' if you are using flexbox alignment inside your button layout */ 81 } 82 .hero-video.is-playing .video-play-btn { 83 display: none !important; 84 } 85 /* 2. Hide the video file by default for reduced motion */ 86 .hero-video video { 87 display: none !important; 88 } 89 /* 3. Force the video back to visible ONLY when we add the 'is-playing' class via JS */ 90 .hero-video.is-playing video { 91 display: block !important; 92 } 93 /* 4. Apply your preferred static image background fallback */ 94 .hero-video { 95 background-image: url('/org/jm/images/home_frame.jpg') !important; 96 background-size: cover; 97 background-position: center; 98 } 99 /* 5. Remove the background image once they hit play so it doesn't peek behind the video */ 100 .hero-video.is-playing { 101 background-image: none !important; 102 } 103} 104</style> 105 106 107
107<script> 108 window.dataLayer = window.dataLayer || []; 109 110 111<!-- window.dataLayer.push({--> 112<!-- event: "start_trial",--> 113<!-- start_trial: true--> 114<!-- });--> 115 116</script>
116 117 118<meta name="csrf-param" content="authenticity_token" /> 119<meta name="csrf-token" content="_X0xhMh9SD8ntnMjn-PjBzIG9IdcA1FDUDZtXQtmBFoKXLPnTMUC99ILg-NQpYTd-kjI-5IKDIw6PdYgn_zByw" /> 120 121 122
123<script src="/vite/assets/application-NKkzzMip.js" crossorigin="anonymous" type="module" data-turbo-track="reload"></script>
123<link rel="stylesheet" href="/vite/assets/application-CIfLU8oe.css" media="screen" data-turbo-track="reload" /> 124<link rel="stylesheet" href="/vite/assets/application-3JNrxUgr.css" media="screen" data-turbo-track="reload" /> 125<link rel="stylesheet" href="/vite/assets/application-3JNrxUgr.css" data-turbo-track="reload" /> 126 127<style> 128 :root { 129 --color-primary: 0, 0, 0; 130 --color-secondary: 0, 0, 0; 131 --color-tertiary: 0, 0, 0; 132 } 133</style> 134<!-- 135 If using a TypeScript entrypoint file: 136 vite_typescript_tag 'application' 137 138 If using a .jsx or .tsx entrypoint, add the extension: 139 vite_javascript_tag 'application.jsx' 140 141 Visit the guide for more information: https://vite-ruby.netlify.app/guide/rails 142--> 143
144<script> 145 window.dataLayer = window.dataLayer || []; 146 function gtag(){dataLayer.push(arguments);} 147 gtag('consent', 'default', { 148 ad_storage: 'granted', analytics_storage: 'granted', 149 ad_user_data: 'granted', ad_personalization: 'granted' 150 }); 151 gtag('consent', 'default', { 152 ad_storage: 'denied', analytics_storage: 'denied', 153 ad_user_data: 'denied', ad_personalization: 'denied', 154 wait_for_update: 500, 155 region: ['AT','BE','BG','HR','CY','CZ','DK','EE','FI','FR','DE','GR','HU','IE','IT','LV', 156 'LT','LU','MT','NL','PL','PT','RO','SK','SI','ES','SE','IS','LI','NO','GB','CH'] 157 }); 158</script>
vendor: 1 bytes, line 158
158
159<script src="https://cookie-cdn.cookiepro.com/scripttemplates/otSDKStub.js" type="text/javascript" charset="UTF-8" data-domain-script="093f909b-b07b-4ed4-9547-4dca95198ebd"></script>
159 160 161<!-- Google Tag Manager -->
162<script>
vendor: 438 bytes, lines 162-174
162(function (w, d, s, l, i) { 163 w[l] = w[l] || []; 164 w[l].push({ 165 'gtm.start': 166 new Date().getTime(), event: 'gtm.js' 167 }); 168 var f = d.getElementsByTagName(s)[0], 169 j = d.createElement(s), dl = l != 'dataLayer' ? '&l=' + l : ''; 170 j.async = true; 171 j.src = 172 'https://www.googletagmanager.com/gtm.js?id=' + i + dl; 173 f.parentNode.insertBefore(j, f); 174})(window, document, 'script', 'dataLayer', '
174GTM-MSZ7JJMJ
vendor: 3 bytes, line 174
174');
174</script>
vendor: 1 bytes, line 174
174
175<script> 176 document.addEventListener('turbo:load', function () { 177 if (!window.__gtmEntryPageSeen) { window.__gtmEntryPageSeen = true; return; } 178 if (document.documentElement.hasAttribute('data-turbo-preview')) return; 179 var path = location.pathname + location.search; 180 if (window.__gtmLastVirtualPath === path) return; 181 window.__gtmLastVirtualPath = path; 182 window.dataLayer.push({ event: 'page_view', page_path: path }); 183 }); 184</script>
184 185<!-- End Google Tag Manager --> 186 187</head> 188 189<body data-controller="cart-dialog"> 190<!-- Google Tag Manager (noscript) -->
vendor: 68 bytes, lines 190-191
190 191<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
191GTM-MSZ7JJMJ
vendor: 101 bytes, lines 191-192
191" 192 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
193<!-- End Google Tag Manager (noscript) --> 194 195<div id="jm-scam-notice" 196 data-controller="jm-scam-notice" 197 role="region" 198 aria-label="Important notice from Jillian" 199 style="border-left:4px solid #BA7517;background:#FAEEDA;padding:0.75rem 1.25rem;display:flex;gap:12px;align-items:center;justify-content:space-between;"> 200 <p style="margin:0;font-size:13px;color:#854F0B;line-height:1.5;"> 201 <strong style="color:#633806;">A Note from Jillian:</strong> 202 Please watch out for AI internet scams using my name and likeness. The only supplement company 203 I work with is <strong style="color:#633806;">Alaya Naturals</strong>. Everything else is a fake. 204 Also, I do not have a weight loss gelatin recipe. That is also a scam. Stay safe out there. 205 </p> 206 <button type="button" 207 data-action="jm-scam-notice#dismiss" 208 aria-label="Dismiss notice" 209 style="background:none;border:none;cursor:pointer;color:#854F0B;font-size:18px;flex-shrink:0;padding:0;line-height:1;">×</button> 210</div>
211<script> 212 // Runs during parse, before first paint: a visitor who already dismissed it never sees the 213 // banner flash in and out. Kept inline (not in the Stimulus controller) because controllers 214 // connect after paint, which would show the banner and then yank it away. 215 if (localStorage.getItem('jm-scam-notice') === 'dismissed') { 216 document.getElementById('jm-scam-notice').style.display = 'none'; 217 } 218</script>
218 219 220<section class="nav-bar"> 221 <div class="navbar-logo-center-copy"> 222 <div data-animation="default" data-collapse="medium" data-duration="400" data-easing="ease" data-easing2="ease" role="banner" class="navbar-logo-center-container shadow-three w-nav"> 223 <div class="navbar-wrapper-three"> 224 <a href="/" class="navbar-brand-three w-nav-brand"><img loading="lazy" src="/org/jm/images/JillianMichaels_Logo_Desktop.svg" alt="" class="image-3"></a> 225 <nav role="navigation" class="nav-menu-wrapper-three w-nav-menu"> 226 <section class="section"> 227 <div class="w-layout-hflex flex-block-26"> 228 <a href="#" class="link-block-4 w-inline-block"> 229 <div class="text-block-2">Newsletter</div> 230 </a> 231 </div> 232 <div class="w-layout-hflex flex-block-27"> 233 <a href="https://www.alayanaturals.com" class="text-block-2">Supplements</a> 234 <a href="https://www.alayanaturals.com" class="link-block-7 w-inline-block"><img loading="lazy" src="/org/jm/images/ExternalLink_Icon.svg" alt="" class="image"></a> 235 </div> 236 </section> 237 <div class="nav-menu-three"> 238 <ul role="list" class="nav-menu-block w-list-unstyled"> 239 <li class="list-item"> 240 <div data-delay="0" data-hover="true" data-w-id="d31428c2-5384-79d2-8dde-720476eda439" class="brix---dropdown-wrapper w-dropdown"> 241 <div class="brix---dropdown-toggle w-dropdown-toggle"> 242 <div class="text-block-29">WORKOUTS</div> 243<img alt="Icon Rounded Chevron Dark - BRIX Templates" src="/org/jm/images/line-rounded-chevron-down-black-brix-templates.svg" class="brix---dropdown-chevron"> 244 </div> 245 <nav class="brix---dropdown-card-wrapper-836px w-dropdown-list"> 246 <div class="brix---dropdown-card"> 247 <div class="brix---grid-2-columns-dropdown-2-sides"> 248 <div class="brix---dropdown-side-pd-copy"> 249 <div class="brix---mg-bottom-24px-2"> 250 <div class="brix---color-neutral-803"> 251 <h4 class="brix---heading-h4-size">THEÂ FITNESSÂ APP</h4> 252 </div> 253 </div> 254 <div class="brix---mg-bottom-40px-2-copy"> 255 <div class="w-layout-grid brix---grid-1-column-gap-row-24px"> 256 <div id="w-node-d31428c2-5384-79d2-8dde-720476eda448-76eda418" class="w-layout-hflex flex-block-25"> 257 <a href="/app" class="w-inline-block"><img loading="lazy" src="/org/jm/images/fitness_app_tile2_white.png" alt=""></a> 258 </div> 259 </div> 260 </div> 261 </div> 262 <div class="brix---dropdown-side-pd"> 263 <div class="brix---mg-bottom-24px-2"> 264 <div class="brix---color-neutral-803"> 265 <h4 class="brix---heading-h4-size">FEATUREDÂ PROGRAMS</h4> 266 <a href="/programs" class="brix---link-wrapper w-inline-block"> 267 <div class="brix---color-accent-2"> 268 <div class="brix---text-200-bold">VIEWÂ ALLÂ WORKOUTS</div> 269 </div> 270<img alt="" src="/org/jm/images/CarouselArrow.svg" class="brix---link-icon-right"> 271 </a> 272 </div> 273 </div> 274 <div class="brix---mg-bottom-40px-2"> 275 <div class="w-layout-grid brix---grid-1-column-gap-row-24px"> 276 <div id="w-node-d31428c2-5384-79d2-8dde-720476eda457-76eda418" class="w-layout-hflex flex-block-25"> 277 <a href="/programs/28-shred" class="w-inline-block"><img loading="lazy" src="/org/jm/images/Frame-12332.png" alt="" class="image-12"></a> 278 <a href="/programs/body-revolution" class="w-inline-block"><img loading="lazy" src="/org/jm/images/bodyrev_menu.png" alt=""></a> 279 <a href="/programs/bodyshred" class="w-inline-block"><img loading="lazy" src="/org/jm/images/Frame-12335.png" alt=""></a> 280 <a href="/programs" class="w-inline-block"><img loading="lazy" src="/org/jm/images/killer_cardio_menu.png" alt=""></a> 281 </div> 282 </div> 283 </div> 284 </div> 285 </div> 286 </div> 287 </nav> 288 </div> 289 </li> 290 <li> 291 <a href="/recipes" class="nav-link-2 nav-link">RECIPES</a> 292 </li> 293 <li> 294 <div data-delay="0" data-hover="true" data-w-id="d31428c2-5384-79d2-8dde-720476eda464" class="brix---dropdown-wrapper w-dropdown"> 295 <div class="brix---dropdown-toggle w-dropdown-toggle"> 296 <div class="text-block-30">LEARN</div> 297<img alt="Icon Rounded Chevron Dark - BRIX Templates" src="/org/jm/images/line-rounded-chevron-down-black-brix-templates.svg" class="brix---dropdown-chevron"> 298 </div> 299 <nav class="brix---dropdown-card-wrapper-836px-copy w-dropdown-list"> 300 <div class="brix---dropdown-card"> 301 <div class="brix---grid-2-columns-dropdown-2-sides"> 302 <div class="brix---dropdown-side-pd"> 303 <a href="/about" class="link-18">ABOUTÂ JILL</a> 304 <a href="/blog" class="link-19">BLOG</a> 305 </div> 306 </div> 307 </div> 308 </nav> 309 </div> 310 </li> 311 <li> 312 <a href="/transformations" class="nav-link-2">RESULTS</a> 313 </li> 314 </ul> 315 <ul role="list" class="nav-menu-block w-list-unstyled"> 316 <li> 317 <a href="/users/sign_in" class="jm-signin"> 318 <span class="nav-link-2 nav-link">SIGN IN</span> 319 </a> 320 321 <a href="/cart" class="jm-cart-icon link-block w-inline-block" aria-label="Cart" title="Cart" 322 data-action="click->
322cart-dialog#open"> 323 <img src="/org/jm/images/Cart_Icon.svg" loading="lazy" alt=""> 324 <span class="jm-cart-badge" data-cart-badge hidden></span> 325</a> 326 327 </li> 328 <li class="mobile-margin-top-11"> 329 <a href="/join" class="button-primary-2 w-button">FREEÂ APPÂ TRIAL</a> 330 </li> 331 </ul> 332 </div> 333 </nav> 334 <div class="menu-button-2 w-nav-button"> 335 <div class="w-icon-nav-menu"></div> 336 </div> 337 </div> 338 </div> 339 </div> 340 <div class="navbar-logo-center-2"> 341 <div data-animation="default" data-collapse="medium" data-duration="400" data-easing="ease" data-easing2="ease" role="banner" class="navbar-logo-center-container-2 shadow-three w-nav"> 342 <div class="container-22"> 343 <div class="navbar-wrapper-three-2"> 344 <div class="menu-button-3 w-nav-button"> 345 <div class="w-icon-nav-menu"></div> 346 </div> 347 <a href="/" class="navbar-brand-three-2 w-nav-brand"><img loading="lazy" src="/org/jm/images/Content.svg" alt=""></a> 348 <nav role="navigation" class="nav-menu-wrapper-three-2 w-nav-menu"> 349 <div class="nav-menu-three-2"> 350 <form action="/search" class="search w-form"> 351<input class="search-input w-input" maxlength="256" name="query" placeholder="Hinted search text" type="search" id="search" required=""><img loading="lazy" src="/org/jm/images/Icon.png" alt="" class="image-47"> 352</form> 353 <ul role="list" class="nav-menu-block-2 w-list-unstyled"> 354 <li class="list-item-3"> 355 <a href="/programs" class="nav-link-3">WORKOUTS</a> 356 </li> 357 <li> 358 <a href="/recipes" class="nav-link-3">RECIPES</a> 359 </li> 360 <li> 361 <div data-delay="0" data-hover="true" data-w-id="d31428c2-5384-79d2-8dde-720476eda499" class="brix---dropdown-wrapper w-dropdown"> 362 <div class="brix---dropdown-toggle w-dropdown-toggle"> 363 <div class="text-block-30-copy">LEARN</div> 364<img alt="Icon Rounded Chevron Dark - BRIX Templates" src="/org/jm/images/line-rounded-chevron-down-black-brix-templates.svg" class="brix---dropdown-chevron"> 365 </div> 366 <nav class="brix---dropdown-card-wrapper-836px-copy w-dropdown-list"> 367 <div class="brix---dropdown-card"> 368 <div class="brix---grid-2-columns-dropdown-2-sides"> 369 <div class="brix---dropdown-side-pd"> 370 <a href="/about" class="link-18">ABOUTÂ JILL</a> 371 <a href="/blog" class="link-19">BLOG</a> 372 </div> 373 </div> 374 </div> 375 </nav> 376 </div> 377 </li> 378 <li> 379 <a href="/transformations" class="nav-link-3">RESULTS</a> 380 </li> 381 </ul> 382 <ul role="list" class="nav-menu-block-2 w-list-unstyled"> 383 <li class="mobile-margin-top-12"> 384 <a href="/join" class="button-primary-7 w-button">FREEÂ APPÂ TRIAL</a> 385 </li> 386 <li> 387 <a href="/about" class="nav-link-accent-3">About</a> 388 </li> 389 <li> 390 <a href="#" class="nav-link-accent-3">Newsletter</a> 391 </li> 392 <li class="list-item-2"> 393 <a href="https://www.alayanaturals.com" class="nav-link-accent-3">Supplements</a> 394 <a href="https://www.alayanaturals.com" class="link-block-103 w-inline-block"><img loading="lazy" src="/org/jm/images/ExternalLink_Icon.svg" alt="" class="image-copy"></a> 395 </li> 396 </ul> 397 <div class="w-layout-vflex flex-block-88"> 398 <div class="w-layout-hflex flex-block-89"> 399 <a href="/users/sign_in" class="jm-signin-m">
400 <span class="nav-link-3">SIGN IN</span> 401 </a> 402</div> 403 404 <div class="w-layout-hflex flex-block-90"> 405 <a href="/cart" class="jm-cart-icon w-inline-block" aria-label="Cart" title="Cart" 406 data-action="click->cart-dialog#open"> 407 <img src="/org/jm/images/Cart_Icon.svg" loading="lazy" alt=""> 408 <span class="jm-cart-badge" data-cart-badge hidden></span> 409</a> 410 411 412 </div> 413 </div> 414 <div class="brix---color-neutral-802-mobile-copy"> 415 <div class="brix---paragraph-default-2-mobile-copy-copy">The most current fitness, nutrition, and wellness info & inspo straight to your inbox</div> 416 </div> 417 <div class="brix---mg-bottom-0-mobile-copy w-form"> 418 <form id="wf-form-BRIX---Footer-Subscribe---V15" name="wf-form-BRIX---Footer-Subscribe---V15" data-name="BRIX - Footer Subscribe - V15" method="get" data-wf-page-id="694982bd2608af05ee3a3af8" data-wf-element-id="d31428c2-5384-79d2-8dde-720476eda4d4"> 419 <div class="w-layout-grid brix---grid-subscribe-form-button-left-copy-mobile"> 420<input class="text-field w-input" maxlength="256" name="BRIX---Footer-Email---V15" data-name="BRIX - Footer Email - V15" placeholder="Enter your email" type="email" id="BRIX-Footer-Email-V15" required=""><input type="submit" data-wait="Please wait..." id="w-node-d31428c2-5384-79d2-8dde-720476eda4d7-76eda418" class="submit-button-copy w-button" value="SUBSCRIBE"> 421</div> 422 </form> 423 <div class="brix---success-message w-form-done"> 424 <div class="brix---success-message-horizontal"> 425<img alt="Check - Elements Webflow Library - BRIX Templates" src="/org/jm/images/line-rounded-check-circle-white-brix-templates.svg" class="brix---icon-success-message-left"> 426 <div>Thanks for joining our newsletter</div> 427 </div> 428 </div> 429 <div class="brix---error-message w-form-fail"> 430 <div>Oops! Something went wrong while submitting the form.</div> 431 </div> 432 </div> 433 <div class="w-layout-hflex flex-block-24-mobile-copy"> 434 <div class="text-block-28-copy">By subscribing you agree to with our</div> 435 <a href="/policies/privacy" class="link-9-copy">Privacy Policy</a> 436 </div> 437 <div class="div-block-16-copy"> 438 <div class="brix---footer-col-title-mobile-copy">FOLLOW</div> 439 <ul role="list" class="brix---footer-list-wrapper-copy-icons-mobile-copy"> 440 <li class="brix---footer-list-item"> 441 <a href="https://www.instagram.com/jillianmichaels/" class="brix---social-media-link-wrapper w-inline-block"> 442 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/Instagram_Icon.svg"></div> 443 </a> 444 </li> 445 <li class="brix---footer-list-item"> 446 <a href="https://www.facebook.com/jillianmichaels/" class="brix---social-media-link-wrapper w-inline-block"> 447 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/Facebook_Icon.svg"></div> 448 </a> 449 </li> 450 <li class="brix---footer-list-item"> 451 <a href="https://x.com/JillianMichaels" class="brix---social-media-link-wrapper w-inline-block"> 452 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/X_Icon.svg"></div> 453 </a> 454 </li> 455 <li class="brix---footer-list-item"> 456 <a href="https://www.tiktok.com/@jillianmichaels" class="brix---social-media-link-wrapper w-inline-block"> 457 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/Social-Icons.svg"></div> 458 </a> 459 </li> 460 <li class="brix---footer-list-item"> 461 <a href="https://www.youtube.com/c/JillianMichaels" class="brix---social-media-link-wrapper w-inline-block"> 462 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/Youtube_Icon.svg"></div> 463 </a> 464 </li> 465 </ul> 466 </div> 467 </div> 468 </nav> 469 <a href="/cart" class="jm-cart-icon w-inline-block" aria-label="Cart" title="Cart" 470 data-action="click->
470cart-dialog#open"> 471 <img src="/org/jm/images/Cart_Icon.svg" loading="lazy" alt=""> 472 <span class="jm-cart-badge" data-cart-badge hidden></span> 473</a> 474 475 </div> 476 </div> 477 </div> 478 </div> 479 </section> 480<turbo-frame id="flash"> 481 482</turbo-frame> 483<section class="pricing-section jm-cart-page"> 484 <div class="text-block-64">Your Cart</div> 485 <div class="text-block-65">Your cart is empty.</div> 486 <div class="jm-cart-actions"> 487 <a href="/programs" class="link-block-99 w-inline-block"> 488 <div class="text-block-69">BROWSE WORKOUTS</div> 489 </a> 490 </div> 491</section> 492<style> 493 .jm-cart-page { padding-bottom: 4rem; } 494 .jm-cart-list { max-width: 44rem; margin: 0 auto; } 495 .jm-cart-row { display: flex; align-items: center; gap: 1.25rem; padding: 1.25rem 0; border-bottom: 1px solid var(--color-surface-grey, #e5e5e5); } 496 .jm-cart-thumb { width: 84px; height: auto; display: block; } 497 .jm-cart-item { flex: 1; text-align: left; } 498 .jm-cart-item .text-block-66, .jm-cart-total .text-block-66 { margin: 0; } 499 .jm-cart-price { margin: 0; white-space: nowrap; font-family: var(--font-body, sans-serif); font-size: 1.125rem; font-weight: 600; } 500 .jm-cart-total .jm-cart-price { font-size: 1.375rem; } 501 .jm-cart-remove { font-family: var(--font-body, sans-serif); font-size: 12px; letter-spacing: .08em; text-decoration: underline; color: var(--color-dark-grey, #555); } 502 .jm-cart-total { max-width: 44rem; margin: 0 auto; border-bottom: 0; } 503 .jm-cart-actions { margin-top: 2rem; display: flex; justify-content: center; } 504</style> 505 506<section class="footer"> 507 <footer class="brix---footer-wrapper"> 508 <div class="brix---container-default-2 w-container"> 509 <div class="brix---footer-top"> 510 <div class="w-layout-grid brix---grid-footer-v1"> 511 <div> 512 <div class="brix---footer-col-title">PRODUCTS</div> 513 <ul role="list" class="brix---footer-list-wrapper"> 514 <li class="brix---footer-list-item"> 515 <a href="/programs" class="brix---footer-link">PROGRAMS</a> 516 </li> 517 <li class="brix---footer-list-item"> 518 <a href="/app" class="brix---footer-link">APP</a> 519 </li> 520 <li class="brix---footer-list-item"> 521 <a href="/join" class="brix---footer-link">APPÂ TRIALÂ &Â PRICING</a> 522 </li> 523 <li class="brix---footer-list-item"> 524 <a href="/recipes" class="brix---footer-link">RECIPES</a> 525 </li> 526 <li class="brix---footer-list-item"> 527 <a href="/blog" class="brix---footer-link">BLOGS</a> 528 </li> 529 <li class="brix---footer-list-item"> 530 <a href="/podcasts" class="brix---footer-link">PODCAST</a> 531 </li> 532 </ul> 533 </div> 534 <div> 535 <div class="brix---footer-col-title">ABOUT</div> 536 <ul role="list" class="brix---footer-list-wrapper"> 537 <li class="brix---footer-list-item"> 538 <a href="/form/contact" class="brix---footer-link">CONTACT</a> 539 </li> 540 <li class="brix---footer-list-item"> 541 <a href="/about" class="brix---footer-link">ABOUTÂ JILL</a> 542 </li> 543 <li class="brix---footer-list-item"> 544 <a href="/transformations" class="brix---footer-link">SUCCESSÂ STORIES</a> 545 </li> 546 </ul> 547 </div> 548 <div> 549 <div class="brix---footer-col-title">SUPPORT</div> 550 <ul role="list" class="brix---footer-list-wrapper"> 551 <li class="brix---footer-list-item"> 552 <a href="https://shop.id.me/stores/5152-jillian-michaels-the-fitness-app" class="brix---footer-link">DISCOUNTÂ PROGRAMS</a> 553 <a href="https://shop.id.me/stores/5152-jillian-michaels-the-fitness-app" class="w-inline-block"><img loading="lazy" src="/org/jm/images/ExternalLink_Icon.svg" alt="" class="image"></a> 554 </li> 555 <li class="brix---footer-list-item">
556 <a href="https://help.jillianmichaels.com" class="brix---footer-link">HELPÂ CENTER</a> 557 <a href="https://help.jillianmichaels.com" class="w-inline-block"><img loading="lazy" src="/org/jm/images/ExternalLink_Icon.svg" alt="" class="image"></a> 558 </li> 559 <li class="brix---footer-list-item"> 560 <a href="/truemed" class="brix---footer-link">HSA/FSA</a> 561 </li> 562 </ul> 563 </div> 564 <div> 565 <div class="brix---footer-col-title">FOLLOWÂ ALONG</div> 566 <ul role="list" class="brix---footer-list-wrapper"> 567 <li class="brix---footer-list-item"> 568 <a href="https://www.instagram.com/jillianmichaels" class="brix---social-media-link-wrapper w-inline-block"> 569 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/Instagram_Icon.svg"></div> 570 </a> 571 </li> 572 <li class="brix---footer-list-item"> 573 <a href="https://www.facebook.com/jillianmichaels" class="brix---social-media-link-wrapper w-inline-block"> 574 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/Facebook_Icon.svg"></div> 575 </a> 576 </li> 577 <li class="brix---footer-list-item"> 578 <a href="https://x.com/JillianMichaels" class="brix---social-media-link-wrapper w-inline-block"> 579 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/X_Icon.svg"></div> 580 </a> 581 </li> 582 <li class="brix---footer-list-item"> 583 <a href="https://www.tiktok.com/@jillianmichaels" class="brix---social-media-link-wrapper w-inline-block"> 584 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/Social-Icons.svg"></div> 585 </a> 586 </li> 587 <li class="brix---footer-list-item"> 588 <a href="https://www.youtube.com/c/JillianMichaels" class="brix---social-media-link-wrapper w-inline-block"> 589 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/Youtube_Icon.svg"></div> 590 </a> 591 </li> 592 </ul> 593 </div> 594 <div id="w-node-b6e9f271-b1ba-d944-02ac-e045780a382c-780a37d5"> 595 <div class="w-layout-grid grid-footer-2-cols---form---icon"> 596 <div class="brix---footer-cta-left"> 597 <div> 598 <div class="brix---color-neutral-802"> 599 <div class="brix---paragraph-default-2">The most current fitness, nutrition, and wellness info & inspo straight to your inbox</div> 600 </div> 601 </div> 602 </div> 603 <div class="brix---mg-bottom-0 w-form">
604 <form id="wf-form-BRIX---Footer-Subscribe---V15" name="wf-form-BRIX---Footer-Subscribe---V15" data-name="BRIX - Footer Subscribe - V15" method="get" data-wf-page-id="694982bd2608af05ee3a3af8" data-wf-element-id="b6e9f271-b1ba-d944-02ac-e045780a3834"> 605 <div class="w-layout-grid brix---grid-subscribe-form-button-left"> 606<input class="text-field w-input" maxlength="256" name="BRIX---Footer-Email---V15" data-name="BRIX - Footer Email - V15" placeholder="Enter your email" type="email" id="BRIX-Footer-Email-V15" required=""><input type="submit" data-wait="Please wait..." id="w-node-b6e9f271-b1ba-d944-02ac-e045780a3837-780a37d5" class="submit-button w-button" value="SUBSCRIBE"> 607</div> 608 </form> 609 <div class="brix---success-message w-form-done"> 610 <div class="brix---success-message-horizontal"> 611<img alt="Check - Elements Webflow Library - BRIX Templates" src="/org/jm/images/line-rounded-check-circle-white-brix-templates.svg" class="brix---icon-success-message-left"> 612 <div>Thanks for joining our newsletter</div> 613 </div> 614 </div> 615 <div class="brix---error-message w-form-fail"> 616 <div>Oops! Something went wrong while submitting the form.</div> 617 </div> 618 </div> 619 <div class="w-layout-hflex flex-block-24"> 620 <div class="text-block-28">By subscribing you agree to with our</div> 621 <a href="/policies/privacy" class="link-9">Privacy Policy</a> 622 </div> 623 <div class="brix---mg-bottom-8px-2"></div> 624 </div> 625 </div> 626 </div> 627 </div> 628 <div class="brix---footer-middle-v15"></div> 629 <div class="brix---footer-bottom"> 630 <p class="brix---mg-bottom-0">© 2026 Jillian Michaels. All rights reserved. Site Credit</p> 631 <div class="w-layout-hflex flex-block-81"> 632 <a href="/policies/privacy" class="link-15">Privacy Policy</a> 633 <a href="/policies/terms" class="link-16">Terms of Service</a> 634 <a href="/policies/cookies" class="link-17">Cookies</a> 635 </div> 636 </div> 637 </div> 638 </footer> 639 <div class="w-layout-blockcontainer mobile-footer-container w-container"> 640 <div class="brix---color-neutral-802-copy"> 641 <div class="brix---paragraph-default-2-copy">The most current fitness, nutrition, and wellness info & inspo straight to your inbox</div> 642 </div> 643 <div class="brix---mg-bottom-0-copy w-form">
644 <form id="wf-form-BRIX---Footer-Subscribe---V15" name="wf-form-BRIX---Footer-Subscribe---V15" data-name="BRIX - Footer Subscribe - V15" method="get" data-wf-page-id="694982bd2608af05ee3a3af8" data-wf-element-id="b6e9f271-b1ba-d944-02ac-e045780a3856"> 645 <div class="w-layout-grid brix---grid-subscribe-form-button-left-copy"> 646<input class="text-field w-input" maxlength="256" name="BRIX---Footer-Email---V15" data-name="BRIX - Footer Email - V15" placeholder="Enter your email" type="email" id="BRIX-Footer-Email-V15" required=""><input type="submit" data-wait="Please wait..." id="w-node-b6e9f271-b1ba-d944-02ac-e045780a3859-780a37d5" class="submit-button-copy w-button" value="SUBSCRIBE"> 647</div> 648 </form> 649 <div class="brix---success-message w-form-done"> 650 <div class="brix---success-message-horizontal"> 651<img alt="Check - Elements Webflow Library - BRIX Templates" src="/org/jm/images/line-rounded-check-circle-white-brix-templates.svg" class="brix---icon-success-message-left"> 652 <div>Thanks for joining our newsletter</div> 653 </div> 654 </div> 655 <div class="brix---error-message w-form-fail"> 656 <div>Oops! Something went wrong while submitting the form.</div> 657 </div> 658 </div> 659 <div class="w-layout-hflex flex-block-24-copy"> 660 <div class="text-block-28">By subscribing you agree to with our</div> 661 <a href="/policies/privacy" class="link-9">Privacy Policy</a> 662 </div> 663 <div class="div-block-14"> 664 <div class="brix---footer-col-title-copy">PRODUCTS</div> 665 <ul role="list" class="brix---footer-list-wrapper-copy"> 666 <li class="brix---footer-list-item-copy"> 667 <a href="/programs" class="brix---footer-link">PROGRAMS</a> 668 </li> 669 <li class="brix---footer-list-item-copy"> 670 <a href="/app" class="brix---footer-link">APP</a> 671 </li> 672 <li class="brix---footer-list-item-copy"> 673 <a href="/join" class="brix---footer-link">APPÂ TRIALÂ &Â PRICING</a> 674 </li> 675 <li class="brix---footer-list-item-copy"> 676 <a href="/recipes" class="brix---footer-link">RECIPES</a> 677 </li> 678 <li class="brix---footer-list-item-copy"> 679 <a href="/blog" class="brix---footer-link">BLOGS</a> 680 </li> 681 <li class="brix---footer-list-item-copy"> 682 <a href="/podcasts" class="brix---footer-link">PODCAST</a> 683 </li> 684 </ul> 685 </div> 686 <div class="div-block-12"></div> 687 <div class="div-block-13"> 688 <div class="brix---footer-col-title-copy">ABOUT</div> 689 <ul role="list" class="brix---footer-list-wrapper-copy"> 690 <li class="brix---footer-list-item-copy"> 691 <a href="/form/contact" class="brix---footer-link">CONTACT</a> 692 </li> 693 <li class="brix---footer-list-item-copy"> 694 <a href="/about" class="brix---footer-link">ABOUTÂ JILL</a> 695 </li> 696 <li class="brix---footer-list-item-copy"> 697 <a href="/press" class="brix---footer-link">PRESS</a> 698 </li> 699 <li class="brix---footer-list-item-copy"> 700 <a href="/transformations" class="brix---footer-link">SUCCESSÂ STORIES</a> 701 </li> 702 </ul> 703 </div> 704 <div class="div-block-15"> 705 <div class="brix---footer-col-title-copy">SUPPORT</div> 706 <ul role="list" class="brix---footer-list-wrapper-copy"> 707 <li class="brix---footer-list-item-copy"> 708 <a href="https://shop.id.me/stores/5152-jillian-michaels-the-fitness-app" class="brix---footer-link">DISCOUNTÂ PROGRAMS</a> 709 <a href="https://shop.id.me/stores/5152-jillian-michaels-the-fitness-app" class="w-inline-block"><img loading="lazy" src="/org/jm/images/ExternalLink_Icon.svg" alt="" class="image"></a> 710 </li> 711 <li class="brix---footer-list-item-copy"> 712 <a href="https://help.jillianmichaels.com" class="brix---footer-link">HELPÂ CENTER</a> 713 <a href="https://help.jillianmichaels.com" class="w-inline-block"><img loading="lazy" src="/org/jm/images/ExternalLink_Icon.svg" alt="" class="image"></a> 714 </li> 715 <li class="brix---footer-list-item-copy"> 716 <a href="/truemed" class="brix---footer-link">HSA/FSA</a> 717 </li> 718 </ul> 719 </div> 720 <div class="div-block-12"></div> 721 <div class="div-block-16"> 722 <div class="brix---footer-col-title-copy">FOLLOWÂ ALONG</div> 723 <ul role="list" class="brix---footer-list-wrapper-copy-icons-copy"> 724 <li class="brix---footer-list-item"> 725 <a href="https://www.instagram.com/jillianmichaels/" class="brix---social-media-link-wrapper w-inline-block"> 726 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/Instagram_Icon.svg"></div> 727 </a> 728 </li> 729 <li class="brix---footer-list-item"> 730 <a href="https://www.facebook.com/jillianmichaels/" class="brix---social-media-link-wrapper w-inline-block"> 731 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/Facebook_Icon.svg"></div> 732 </a> 733 </li> 734 <li class="brix---footer-list-item"> 735 <a href="https://x.com/JillianMichaels" class="brix---social-media-link-wrapper w-inline-block"> 736 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/X_Icon.svg"></div> 737 </a> 738 </li> 739 <li class="brix---footer-list-item"> 740 <a href="https://www.tiktok.com/@jillianmichaels" class="brix---social-media-link-wrapper w-inline-block"> 741 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/Social-Icons.svg"></div> 742 </a> 743 </li> 744 <li class="brix---footer-list-item"> 745 <a href="https://www.youtube.com/c/JillianMichaels" class="brix---social-media-link-wrapper w-inline-block"> 746 <div class="brix---icon-square-24px"><img alt="" src="/org/jm/images/Youtube_Icon.svg"></div> 747 </a> 748 </li> 749 </ul> 750 </div> 751 <div class="div-block-12"></div> 752 <div class="brix---footer-bottom-copy"> 753 <div class="w-layout-hflex flex-block-81-copy"> 754 <a href="/policies/privacy" class="link-15">Privacy Policy</a> 755 <a href="/policies/terms" class="link-16">Terms of Service</a>
756 <a href="/policies/cookies" class="link-17">Cookies</a> 757 </div> 758 <p class="brix---mg-bottom-0">2026 Jillian Michaels. All rights reserved. Site Credit</p> 759 </div> 760 </div> 761 </section> 762<dialog id="cart_dialog" data-cart-dialog-target="dialog" data-action="click->cart-dialog#backdropClose" 763 class="fixed inset-0 m-0 size-auto max-h-none max-w-none overflow-y-auto bg-transparent p-0"> 764 <div class="flex min-h-full items-stretch justify-center text-center sm:items-center sm:px-6 lg:px-8"> 765 <div data-cart-dialog-target="panel" class="flex w-full text-left text-base sm:my-8 sm:max-w-3xl"> 766 <div class="relative flex w-full flex-col overflow-hidden bg-white pb-8 pt-6 sm:rounded-lg sm:pb-6 lg:py-8"> 767 <div class="flex items-center justify-between px-4 sm:px-6 lg:px-8"> 768 <h2 class="text-lg font-medium text-gray-900">Shopping Cart</h2> 769 <button type="button" data-action="click->cart-dialog#close" class="text-gray-400 hover:text-gray-500"> 770 <span class="sr-only">Close</span> 771 <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" aria-hidden="true" class="size-6"> 772 <path d="M6 18 18 6M6 6l12 12" stroke-linecap="round" stroke-linejoin="round" /> 773 </svg> 774 </button> 775 </div> 776 <div id="cart_dialog_contents" data-cart-count="0" data-cart-product-ids="" class="flex flex-1 flex-col"> 777 <p class="px-4 py-10 text-center text-sm text-gray-500 sm:px-6 lg:px-8">Your cart is empty.</p> 778</div> 779 780 </div> 781 </div> 782 </div> 783</dialog> 784
785<script src="https://d3e54v103j8qbb.cloudfront.net/js/jquery-3.5.1.min.dc5e7f18c8.js?site=68e57f3a62c4bf057fb2e9ed" type="text/javascript"></script>
vendor: 1 bytes, line 785
785
786<script src="/org/jm/js/webflow.js" type="text/javascript"></script>
vendor: 1 bytes, line 786
786
787<script> 788function wfCustomReady(fn) { document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", fn) : fn(); } 789</script>
vendor: 1 bytes, line 789
789
790<script> 791wfCustomReady( function() { 792 // Only execute this logic if the user actually has Reduced Motion turned on 793 const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)").matches; 794 if (prefersReducedMotion) { 795 const videoWrapper = document.querySelector(".hero-video"); 796 const playBtn = document.querySelector(".video-play-btn") || document.getElementById("video-play-btn"); 797 if (videoWrapper && playBtn) { 798 const nativeVideo = videoWrapper.querySelector("video"); 799 if (nativeVideo) { 800 // 1. Fully halt Webflow's automated background video playback system 801 nativeVideo.autoplay = false; 802 nativeVideo.pause(); 803 // 2. Listen for the user to override and click your Webflow play button 804 playBtn.addEventListener("click", function(e) { 805 e.preventDefault(); 806 e.stopPropagation(); 807 // 3. Add the class that triggers our CSS overrides to show the video tag again 808 videoWrapper.classList.add("is-playing"); 809 // 4. Play the stream file 810 nativeVideo.play(); 811 // 5. Hide your Webflow play button component 812 playBtn.style.display = "none"; 813 }); 814 } 815 } 816 } 817}); 818</script>
818 819
820<script> 821 // Inline add-to-cart: intercept the tile forms marked data-cart-add (data-turbo=false keeps 822 // Turbo away), POST as JSON, then flip the tile's CTA row to IN CART, sync every nav badge, 823 // and refresh the cart modal's contents. Without JS the same forms plain-POST and bounce back. 824 function syncCartBadges(count) { 825 document.querySelectorAll("[data-cart-badge]").forEach(function (badge) { 826 badge.textContent = count > 0 ? String(count) : ""; 827 badge.hidden = count <= 0; 828 }); 829 } 830 // Removals INSIDE the modal go through Turbo Streams (Josh's OTT flow), which replace 831 // #cart_dialog_contents but not our badges or catalog tiles â the observer below resyncs 832 // badges from data-cart-count and reconciles any tile whose IN CART state no longer 833 // matches the cart (each stale tile re-fetches its CTA row from /programs/tile_ctas). 834 function reconcileCartTiles(idsCsv) { 835 var ids = idsCsv ? idsCsv.split(",") : []; 836 document.querySelectorAll("[data-cart-tile]").forEach(function (tile) { 837 var pid = tile.dataset.cartTile; 838 var showsInCart = !!tile.querySelector('a[href="/cart"]'); 839 if (showsInCart === ids.indexOf(pid) >= 0) return; 840 fetch("/programs/tile_ctas/" + pid, { credentials: "same-origin" }) 841 .then(function (r) { return r.ok ? r.text() : null; }) 842 .then(function (html) { if (html) tile.innerHTML = html; }); 843 }); 844 } 845 // Turbo Drive re-executes body scripts on every visit while the document (and its 846 // listeners) persists â unguarded, each navigation stacks another copy of every 847 // document-level listener, and one BUY click fires N simultaneous POSTs (the 848 // duplicate-cart-lines bug). Guard: document listeners bind once per real page load. 849 if (!window.__jmChromeWired) { 850 window.__jmChromeWired = true; 851 document.addEventListener("submit", function (event) { 852 var form = event.target.closest("form[data-cart-add]"); 853 if (!form) return; 854 event.preventDefault(); 855 if (form.dataset.cartInflight) return; // swallow double-clicks while a POST is out 856 form.dataset.cartInflight = "1"; 857 var token = document.querySelector('meta[name="csrf-token"]'); 858 fetch(form.action, { 859 method: "POST", 860 headers: { "Accept": "application/json", "X-CSRF-Token": token ? token.content : "" }, 861 body: new FormData(form), 862 credentials: "same-origin" 863 }).then(function (response) { 864 if (!response.ok) throw new Error("add failed"); 865 return response.json(); 866 }).then(function (data) { 867 syncCartBadges(data.count); 868 var contents = document.getElementById("cart_dialog_contents"); 869 if (contents && data.dialog_html) contents.outerHTML = data.dialog_html; 870 var tile = form.closest("[data-cart-tile]"); 871 if (tile) fetch("/programs/tile_ctas/" + tile.dataset.cartTile, { credentials: "same-origin" }) 872 .then(function (r) { return r.ok ? r.text() : null; }) 873 .then(function (html) { if (html) tile.innerHTML = html; }); 874 }).catch(function () { 875 form.submit(); // fall back to the plain POST + reload path 876 }).finally(function () { 877 delete form.dataset.cartInflight; 878 }); 879 }); 880 // Newsletter: the Webflow subscribe forms (footer x2 + drawer) post to our /newsletter 881 // proxy (-> Drupal -> SendGrid). Capture phase + stopPropagation beats webflow.js's own 882 // w-form handler, which would otherwise post to Webflow's dead endpoint. 883 document.addEventListener("submit", function (event) { 884 var form = event.target.closest('form[id^="wf-form-BRIX---Footer-Subscribe"]'); 885 if (!form) return; 886 event.preventDefault(); 887 event.stopPropagation(); 888 var token = document.querySelector('meta[name="csrf-token"]'); 889 var email = (form.querySelector('input[type="email"]') || {}).value || ""; 890 var wrap = form.parentElement; 891 function showFail() { 892 var fail = wrap.querySelector(".w-form-fail"); 893 if (fail) fail.style.display = "block"; 894 } 895 fetch("/newsletter", { 896 method: "POST", 897 headers: { "Accept": "application/json", "Content-Type": "application/x-www-form-urlencoded", 898 "X-CSRF-Token": token ? token.content : "" }, 899 body: "email=" + encodeURIComponent(email), 900 credentials: "same-origin" 901 }).then(function (r) { return r.json(); }).then(function (data) { 902 if (data.status !== "subscribed") return showFail(); 903 var done = wrap.querySelector(".w-form-done"); 904 form.style.display = "none"; 905 if (done) done.style.display = "block"; 906 }).catch(showFail); 907 }, true); 908 // Close the account dropdown when clicking anywhere outside it (native <details> keeps 909 // itself open otherwise). 910 document.addEventListener("click", function (event) { 911 document.querySelectorAll("details.jm-account-menu[open]").forEach(function (menu) { 912 if (!menu.contains(event.target)) menu.removeAttribute("open"); 913 }); 914 }); 915 } // end __jmChromeWired once-guard 916 // The observer, unlike the document listeners, MUST re-attach on every Turbo visit â 917 // each body swap replaces #cart_dialog with a new node. Disconnect the previous 918 // visit's observer so dead ones don't accumulate. 919 if (window.__jmCartObserver) window.__jmCartObserver.disconnect(); 920 var dialog = document.getElementById("cart_dialog"); 921 if (dialog) { 922 window.__jmCartObserver = new MutationObserver(function () { 923 var contents = document.getElementById("cart_dialog_contents"); 924 if (!contents) return; 925 if (contents.dataset.cartCount) syncCartBadges(parseInt(contents.dataset.cartCount, 10)); 926 reconcileCartTiles(contents.dataset.cartProductIds); 927 }); 928 window.__jmCartObserver.observe(dialog, { childList: true, subtree: true }); 929 } 930</script>
930 931</body> 932</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.