{"product_id":"jumps-clinic-oak-hill-raceway-alvord-tx-january-18-2027","title":"Jumps Clinic: Oak Hill Raceway, Alvord, TX, January 18, 2027","description":"\u003c!-- ============================================================\n     THE TECHNIQUE TOUR · SHOPIFY PRODUCT PAGE\n     Drop-in Custom Liquid \/ HTML block for Technique Tour product\n     pages. Self-contained: scoped under .tt so nothing leaks\n     into the rest of the theme.\n\n     DESIGN LANGUAGE (distinct from More Fast More Fun Tour):\n       - Red accent (#d72525)\n       - Abolition (poster font) → Bebas Neue web fallback, tall condensed sans for display\n         while MFMF uses Fjalla One + IT Jellivox italic\n       - Lowercase styled eyebrow + meta line\n         (matches the new \"the technique tour\" poster look)\n       - Photographic background, lighter overlay than MFMF\n\n     CUSTOMIZE PER CLINIC — search\/replace these tokens:\n       TEXAS            — e.g. \"NEW YORK\"\n       Oak Hill Raceway       — e.g. \"Sick Bros MX\"\n       Alvord, TX       — e.g. \"Cohocton, NY\"\n            — e.g. \"1234 Track Rd\"\n       January 18, 2027        — e.g. \"June 9, 2026\"\n       january 18       — e.g. \"june 9\" (lowercase, no year)\n       2027-01-18         — e.g. \"2026-06-09\"  (for schema)\n       Tre McCollough            — e.g. \"Tyler Livesay\"\n       347            — e.g. \"297\"\n       https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/jumps-clinic_tre-DSC03983.jpg?v=1790801711      — full Shopify CDN URL of track action photo\n       jumps-clinic-oak-hill-raceway-alvord-tx-january-18-2027   — e.g. \"the-technique-tour-sick-bros-mx-cohocton-ny\"\n       https:\/\/themxfactory.com\/products\/jumps-clinic-oak-hill-raceway-alvord-tx-january-18-2027      — full URL of this product page\n       Oak Hill Raceway in Alvord, TX is the DFW area's go-to outdoor motocross track, about 45 minutes northwest of Fort Worth. Fast, flowing, and packed with corners and jumps, it has been our best-drawing Texas venue.      — 1-2 sentence venue intro\n\n     ARCHITECTURE:\n       Section 1  — HERO (photo bg, red eyebrow, state, meta, stat strip, scarcity)\n       Section 2  — TICKER (continuous outcomes)\n       Section 3  — WHAT YOU'LL WORK ON\n       Section 4  — BUILT FOR ALL SKILL LEVELS (3 cards: beginner\/vet\/expert)\n       Section 5  — WHAT TO EXPECT (6 outcomes)\n       Section 6  — OUR TRAINING METHODOLOGY (long-form)\n       Section 7  — TRAINED BY THE BEST (Tyler bio)\n       Section 8  — THE TRACK (venue)\n       Section 9  — FAQ (12 questions, semantic \u003cdetails\u003e)\n       Section 10 — REFUND POLICY (4 panels)\n       Section 11 — FINAL CTA\n       Section 12 — Schema.org structured data (Product + Course + FAQPage + Place)\n     ============================================================ --\u003e\n\n\u003csection class=\"tt \" aria-label=\"Jumps Clinic · Oak Hill Raceway, Alvord, TX · January 18, 2027\"\u003e\n\n\u003c!-- Preconnect: start TCP handshakes early to save 100-300ms on critical resources --\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\"\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/cdn.shopify.com\" crossorigin\u003e\n\u003clink rel=\"preconnect\" href=\"https:\/\/i.ytimg.com\" crossorigin\u003e\n\u003clink rel=\"dns-prefetch\" href=\"https:\/\/www.youtube.com\"\u003e\n\u003clink rel=\"dns-prefetch\" href=\"https:\/\/maps.google.com\"\u003e\n\u003clink rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=Bebas+Neue\u0026amp;family=Barlow:wght@400;500;600;700\u0026amp;family=Barlow+Condensed:wght@500;600;700;900\u0026amp;family=JetBrains+Mono:wght@400;500;700\u0026amp;display=swap\"\u003e\n\n\u003cstyle\u003e\n  @font-face {\n    font-family: 'Abolition';\n    \/* TODO: Upload Abolition-Regular.otf to Shopify Admin → Content → Files,\n       then replace this URL with the real one (right-click → Copy link). *\/\n    src: url('https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/Abolition-Regular.otf') format('opentype');\n    font-weight: normal; font-style: normal; font-display: swap;\n  }\n  @font-face {\n    font-family: 'Aero Matics';\n    \/* TODO: Upload AeroMatics-DisplayRegular.ttf to Shopify Admin → Content → Files. *\/\n    src: url('https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/AeroMatics-DisplayRegular.ttf') format('truetype');\n    font-weight: normal; font-style: normal; font-display: swap;\n  }\n\n  \/* ============================================================\n     UN-SCOPED — hides the Shopify product title since the gallery\n     poster already shows TRACK · CITY · DATE in big type. Targets\n     Impulse + Dawn + most common theme classes.\n     ============================================================ *\/\n  .product-single__title,\n  h1.product-single__title,\n  .product__title,\n  h1.product__title,\n  .product-meta__title { display: none !important; }\n\n  \/* ============================================================\n     UN-SCOPED — JS sets a transform on .product-single__meta below\n     to vertically center the price\/buy column with the poster.\n     Placeholder CSS just makes the JS-set transform smooth.\n     ============================================================ *\/\n  .product-single__meta { transition: transform 0.2s ease; }\n\n  \/* Push footer up so the sticky bottom CTA bar doesn't cover it.\n     Sticky bar is ~64-88px tall — adding 100px buffer is safe. *\/\n  body { padding-bottom: 100px !important; }\n  @media (max-width: 540px) { body { padding-bottom: 80px !important; } }\n\n  \/* Breathing room above + below the main poster in the product gallery —\n     so the poster doesn't feel squished against the sticky scarcity bar\n     at top or the pagination dots \/ quantity selector below. *\/\n  .page-content--product,\n  .product-single {\n    padding-top: clamp(24px, 3vw, 56px) !important;\n    padding-bottom: clamp(20px, 2.5vw, 40px) !important;\n  }\n  .product__photos,\n  .product__main-photos,\n  .product-image-main {\n    padding-top: clamp(8px, 1.5vw, 24px);\n    padding-bottom: clamp(8px, 1.5vw, 24px);\n  }\n\n  \/* ============================================================\n     UN-SCOPED — injected quantity selector that lives INSIDE the\n     Shopify cart-add form. Sits between the price\/payment area and\n     the ADD TO CART \/ Buy with Shop buttons.\n     ============================================================ *\/\n  .tt-qty-selector {\n    margin: 18px 0 22px;\n    font-family: 'Aero Matics', 'Barlow Condensed', 'Barlow', sans-serif;\n  }\n  .tt-qty-selector .tt-qty-label {\n    display: block;\n    font-weight: 700;\n    font-size: 12px;\n    letter-spacing: 0.22em;\n    text-transform: uppercase;\n    color: currentColor;\n    opacity: 0.65;\n    margin: 0 0 10px;\n    line-height: 1;\n  }\n  .tt-qty-selector .tt-qty-controls {\n    display: inline-flex;\n    align-items: stretch;\n    border: 1px solid currentColor;\n    overflow: hidden;\n  }\n  .tt-qty-selector .tt-qty-btn {\n    background: transparent;\n    border: 0;\n    width: 48px; height: 48px;\n    font-size: 22px;\n    line-height: 1;\n    cursor: pointer;\n    color: inherit;\n    padding: 0;\n    transition: background 0.15s ease;\n    -webkit-appearance: none;\n    appearance: none;\n  }\n  .tt-qty-selector .tt-qty-btn:hover { background: rgba(255,255,255,0.08); }\n  .tt-qty-selector .tt-qty-btn:focus-visible { outline: 2px solid currentColor; outline-offset: -2px; }\n  .tt-qty-selector .tt-qty-value {\n    width: 64px; height: 48px;\n    text-align: center;\n    border: 0;\n    border-left: 1px solid currentColor;\n    border-right: 1px solid currentColor;\n    background: transparent;\n    color: inherit;\n    font-family: 'Abolition', 'Bebas Neue', 'Anton', sans-serif;\n    font-size: 20px;\n    -moz-appearance: textfield;\n  }\n  .tt-qty-selector .tt-qty-value::-webkit-outer-spin-button,\n  .tt-qty-selector .tt-qty-value::-webkit-inner-spin-button {\n    -webkit-appearance: none; margin: 0;\n  }\n\n  \/* ============================================================\n     TECHNIQUE TOUR DESIGN TOKENS\n     ============================================================ *\/\n  .tt {\n    --ink: #0e0e0c;\n    --paper: #ffffff;\n    --red: #d72525;        \/* accent; overridden to gold by .theme-gold below *\/\n    --accent-soft: #FFE872;\/* low\/secondary accent highlight *\/\n    --muted: rgba(255,255,255,0.7);\n\n    \/* Match the poster — Abolition for big display, Aero Matics for everything else *\/\n    --ff-display: 'Abolition', 'Bebas Neue', 'Anton', sans-serif;\n    --ff-eyebrow: 'Aero Matics', 'Barlow Condensed', 'Barlow', sans-serif;\n    --ff-meta:    'Aero Matics', 'JetBrains Mono', ui-monospace, monospace;\n    --ff-body:    'Aero Matics', 'Barlow', system-ui, sans-serif;\n\n    background: var(--ink);\n    color: var(--paper);\n    font-family: var(--ff-body);\n    -webkit-font-smoothing: antialiased;\n    line-height: 1.55;\n    font-size: 17px;\n\n    \/* JS-managed full-bleed (works inside any column layout — see \u003cscript\u003e below) *\/\n    position: relative;\n    overflow: hidden;\n    \/* Bulletproof breathing room. The JS relocator also moves .tt OUT of the\n       Shopify right column so it never overlaps the (taller) gallery column.\n       This margin sits ON TOP of that — guaranteed gap regardless of theme. *\/\n    margin-top: clamp(80px, 12vw + 2vh, 220px);\n  }\n\n  \/* ============================================================\n     BLACK \u0026 GOLD THEME — premium flagship tier (Technique Intensive).\n     Only applied when the section carries .theme-gold (set per-product\n     via the tour profile). A single accent swap cascades to every\n     var(--red) usage; deepen the surface to near-pure black and warm\n     the highlight to gold. Red Technique Tour \/ Tre pages are untouched.\n     ============================================================ *\/\n  .tt.theme-gold {\n    --ink: #080808;\n    --red: #C9A227;          \/* gold accent *\/\n    --accent-soft: #E8C766;  \/* lighter gold for low-tier highlights *\/\n  }\n  \/* On gold, the LOW tier goes HOT: a red heat meter that throbs as spots run out. *\/\n  .tt.theme-gold .tt-scarcity.is-low { border-left-color: #ff3b2f !important; }\n  .tt.theme-gold .tt-scarcity.is-low .dot { background: #ff3b2f !important; }\n  .tt.theme-gold .tt-scarcity.is-low .bar .fill { background: linear-gradient(90deg,#ffbf3a 0%,#ff7a2c 55%,#ff2020 100%) !important; }\n  .tt.theme-gold .tt-scarcity.is-low .label .accent { color: #ff6a3c !important; }\n\n  .tt *, .tt *::before, .tt *::after { box-sizing: border-box; }\n  .tt a { color: inherit; }\n  .tt .container { max-width: 1180px; margin: 0 auto; padding: 0 clamp(20px, 5vw, 56px); }\n\n  \/* ---------- Atoms ---------- *\/\n\n  \/* Yellow eyebrow block — signature of the Technique Tour brand *\/\n  .tt .red-tag {\n    display: inline-block;\n    background: var(--red);\n    color: var(--ink);\n    font-family: var(--ff-eyebrow);\n    font-weight: 700;\n    font-size: clamp(13px, 1.2vw, 16px);\n    letter-spacing: 0.02em;\n    text-transform: lowercase;\n    padding: 8px 18px 7px;\n    margin: 0;\n    line-height: 1;\n  }\n  .tt .meta-line {\n    font-family: var(--ff-eyebrow);\n    font-weight: 500;\n    font-size: clamp(13px, 1.1vw, 17px);\n    letter-spacing: 0.02em;\n    text-transform: lowercase;\n    color: var(--paper);\n  }\n  .tt .meta-line .sep { color: var(--red); padding: 0 8px; opacity: 0.85; }\n  .tt .h-display {\n    font-family: var(--ff-display);\n    font-weight: 400; \/* Anton ships one weight *\/\n    text-transform: uppercase;\n    letter-spacing: -0.005em;\n    line-height: 0.86;\n    font-size: clamp(60px, 13vw, 220px);\n    margin: 0;\n    white-space: nowrap;\n  }\n  .tt .h-section {\n    font-family: var(--ff-display);\n    text-transform: uppercase;\n    letter-spacing: -0.005em;\n    line-height: 0.95;\n    font-size: clamp(38px, 6vw, 80px);\n    margin: 0 0 18px;\n  }\n  .tt .body-lg { font-size: clamp(17px, 1.4vw, 21px); line-height: 1.55; color: rgba(255,255,255,0.88); }\n  .tt .body    { font-size: clamp(15px, 1.15vw, 18px); line-height: 1.6; color: rgba(255,255,255,0.85); }\n  .tt .micro   {\n    font-family: var(--ff-meta);\n    font-size: clamp(11px, 1vw, 13px);\n    letter-spacing: 0.18em;\n    text-transform: uppercase;\n    color: rgba(255,255,255,0.7);\n  }\n\n  \/* CTA button *\/\n  .tt .cta {\n    display: inline-flex; align-items: center; gap: 14px;\n    background: var(--red);\n    color: var(--ink);\n    font-family: var(--ff-display);\n    font-size: clamp(20px, 2vw, 28px);\n    letter-spacing: 0.02em;\n    text-transform: uppercase;\n    padding: 18px clamp(28px, 4vw, 48px);\n    text-decoration: none;\n    border: 0;\n    cursor: pointer;\n    transition: filter 0.2s ease, transform 0.2s ease;\n  }\n  .tt .cta:hover { filter: brightness(0.92); transform: translateY(-1px); }\n  .tt .cta .arrow { display: inline-block; font-family: var(--ff-body); font-weight: 700; font-size: 0.85em; }\n\n\n  \/* ============================================================\n     SECTION 1 — HERO\n     ============================================================ *\/\n  .tt .hero {\n    position: relative; overflow: hidden;\n    min-height: clamp(480px, 68vh, 720px);\n    display: flex; flex-direction: column;\n    justify-content: space-between;  \/* red tag at top, state+meta at bottom *\/\n    padding: clamp(40px, 5vw, 70px) clamp(20px, 5vw, 56px) clamp(56px, 6vw, 96px);\n  }\n  .tt .hero::before {\n    content: \"\"; position: absolute; inset: 0;\n    background:\n      linear-gradient(180deg, rgba(0,0,0,0.30) 0%, rgba(0,0,0,0.20) 35%, rgba(0,0,0,0.55) 75%, rgba(0,0,0,0.92) 100%),\n      url(\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/jumps-clinic_tre-DSC03983.jpg?v=1790801711\") center 35% \/ cover no-repeat;\n    z-index: 0;\n  }\n  .tt .hero \u003e * { position: relative; z-index: 1; }\n  .tt .hero-grid {\n    display: grid;\n    grid-template-columns: 1fr;\n    gap: clamp(20px, 2.5vw, 32px);   \/* more space between state name and meta line *\/\n    max-width: 1180px;\n    width: 100%;\n    margin: 0 auto;\n  }\n  .tt .hero \u003e .red-tag {\n    align-self: flex-start;  \/* pin to top-left of hero *\/\n    margin-bottom: 0;\n  }\n  .tt .hero .red-tag {\n    justify-self: start;\n  }\n  .tt .hero .h-display {\n    color: var(--paper);\n    text-shadow: 2px 2px 0 rgba(0,0,0,0.35);\n  }\n  .tt .hero .meta-line { margin-top: clamp(14px, 1.6vw, 22px); }\n\n  \/* Stats strip beneath hero — $297 \/ 1 day \/ 30 spots *\/\n  .tt .stats {\n    background: var(--paper);\n    color: var(--ink);\n    border-top: 2px solid var(--ink);\n    border-bottom: 2px solid var(--ink);\n  }\n  .tt .stats-grid {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    max-width: 1180px;\n    margin: 0 auto;\n  }\n  .tt .stat {\n    text-align: center;\n    padding: clamp(28px, 4vw, 44px) clamp(16px, 3vw, 32px);\n    border-right: 2px solid var(--ink);\n  }\n  .tt .stat:last-child { border-right: 0; }\n  .tt .stat .num {\n    display: block;\n    font-family: var(--ff-display);\n    font-size: clamp(48px, 7vw, 96px);\n    line-height: 0.88;\n    letter-spacing: -0.01em;\n  }\n  .tt .stat .lab {\n    display: block;\n    margin-top: 10px;\n    font-family: var(--ff-eyebrow);\n    font-weight: 700;\n    font-size: clamp(11px, 1vw, 14px);\n    letter-spacing: 0.22em;\n    text-transform: uppercase;\n    color: rgba(0,0,0,0.65);\n  }\n\n  \/* ============================================================\n     TRACK WARNING — amber callout shown between stats strip\n     and scarcity widget. Hidden when no warning:* tags.\n     ============================================================ *\/\n  .tt .track-warning {\n    display: flex;\n    flex-direction: column;\n    gap: 14px;\n    margin: 0;\n    padding: clamp(14px, 1.8vw, 20px) clamp(16px, 2.4vw, 24px);\n    background: rgba(255, 232, 114, 0.07);\n    border-left: 6px solid #FFE872;\n    border-radius: 0;\n    color: var(--paper);\n    font-family: var(--ff-body);\n  }\n  .tt .track-warning .warn-row {\n    display: flex;\n    align-items: flex-start;\n    gap: 14px;\n  }\n  .tt .track-warning .warn-icon {\n    flex: 0 0 auto;\n    font-size: clamp(20px, 2.2vw, 26px);\n    line-height: 1.05;\n    color: #FFE872;\n    text-shadow: 0 1px 0 rgba(0,0,0,0.45);\n  }\n  .tt .track-warning .warn-text {\n    font-size: clamp(14px, 1.2vw, 16px);\n    line-height: 1.5;\n    color: rgba(255,255,255,0.92);\n  }\n  .tt .track-warning .warn-text strong {\n    color: #FFE872;\n    font-weight: 700;\n    letter-spacing: 0.02em;\n    margin-right: 4px;\n  }\n\n  \/* ============================================================\n     SECTION 2 — TICKER (continuous outcomes marquee)\n     ============================================================ *\/\n  @keyframes tt-marquee { from { transform: translateX(0); } to { transform: translateX(-50%); } }\n\n  .tt .ticker {\n    background: var(--red);\n    color: var(--ink);\n    overflow: hidden;\n    padding: 14px 0;\n  }\n  .tt .ticker__track {\n    display: flex; white-space: nowrap;\n    animation: tt-marquee 32s linear infinite;\n    will-change: transform;\n  }\n  @media (prefers-reduced-motion: reduce) {\n    .tt .ticker__track { animation: none; padding-left: 24px; }\n  }\n  .tt .ticker__item {\n    flex: 0 0 auto;\n    padding: 0 28px;\n    font-family: var(--ff-display);\n    font-size: clamp(18px, 2vw, 26px);\n    letter-spacing: 0.02em;\n    text-transform: uppercase;\n  }\n  .tt .ticker__item .bullet { color: rgba(0,0,0,0.4); margin-left: 28px; }\n\n  \/* ============================================================\n     SECTION 3 — WHAT YOU'LL WORK ON\n     ============================================================ *\/\n  .tt .section {\n    padding: clamp(56px, 8vw, 110px) 0;\n    border-top: 1px solid rgba(255,255,255,0.08);\n  }\n  .tt .section-head {\n    max-width: 760px;\n    margin: 0 auto clamp(36px, 5vw, 64px);\n    text-align: center;\n  }\n  .tt .work-grid {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);  \/* Force 3 columns so 6 cards = 3+3, not 4+2 *\/\n    gap: clamp(14px, 2vw, 24px);\n    max-width: 1080px;\n    margin: 0 auto;\n  }\n  @media (max-width: 720px) { .tt .work-grid { grid-template-columns: repeat(2, 1fr); } }\n  @media (max-width: 480px) { .tt .work-grid { grid-template-columns: 1fr; } }\n  .tt .work-card {\n    background: rgba(255,255,255,0.04);\n    border: 1px solid rgba(255,255,255,0.10);\n    border-top: 4px solid var(--red);\n    padding: clamp(20px, 2.5vw, 28px);\n    text-align: left;\n  }\n  .tt .work-card h3 {\n    font-family: var(--ff-display);\n    font-size: clamp(22px, 2.2vw, 32px);\n    text-transform: uppercase;\n    letter-spacing: -0.005em;\n    margin: 0 0 10px;\n    line-height: 1;\n  }\n  .tt .work-card p { margin: 0; font-size: 15px; line-height: 1.55; color: rgba(255,255,255,0.78); }\n\n  \/* ============================================================\n     SECTION 4 — LEVELS\n     ============================================================ *\/\n  .tt .levels {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: clamp(14px, 2vw, 24px);\n    max-width: 1180px;\n    margin: 0 auto;\n  }\n  @media (max-width: 900px) {\n    .tt .levels { grid-template-columns: 1fr; }\n  }\n  .tt .level {\n    background: var(--paper);\n    color: var(--ink);\n    padding: clamp(28px, 4vw, 44px);\n    position: relative;\n  }\n  .tt .level .red-tag {\n    position: absolute;\n    top: -16px; left: 24px;\n  }\n  .tt .level h3 {\n    font-family: var(--ff-display);\n    font-size: clamp(28px, 3vw, 44px);\n    text-transform: uppercase;\n    letter-spacing: -0.005em;\n    line-height: 0.95;\n    margin: 20px 0 16px;\n  }\n  .tt .level p { margin: 0; font-size: 16px; line-height: 1.6; color: rgba(0,0,0,0.78); }\n\n  \/* ============================================================\n     SECTION 5 — WHAT TO EXPECT (outcomes)\n     ============================================================ *\/\n  .tt .outcomes {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);  \/* Force 3 columns so 6 outcomes = 3+3 *\/\n    gap: clamp(14px, 2vw, 22px);\n    max-width: 1080px;\n    margin: 0 auto;\n  }\n  .tt .outcome {\n    text-align: center;\n    padding: clamp(24px, 3vw, 32px) 14px;\n    background: rgba(215,37,37,0.06);\n    border: 1px solid rgba(215,37,37,0.25);\n  }\n  .tt .outcome .ico {\n    display: block;\n    font-size: clamp(32px, 4vw, 44px);\n    margin-bottom: 12px;\n  }\n  .tt .outcome .name {\n    font-family: var(--ff-display);\n    font-size: clamp(20px, 2vw, 28px);\n    text-transform: uppercase;\n    letter-spacing: -0.005em;\n    line-height: 1;\n  }\n  @media (max-width: 720px) { .tt .outcomes { grid-template-columns: repeat(2, 1fr); } }\n  @media (max-width: 420px) { .tt .outcomes { grid-template-columns: 1fr; } }\n\n  \/* ============================================================\n     INLINE \"SECURE MY SPOT\" CTA — interspersed between sections\n     ============================================================ *\/\n  .tt .section-cta {\n    text-align: center;\n    margin: clamp(36px, 5vw, 60px) auto 0;\n    max-width: 720px;\n  }\n  .tt .section-cta .cta-eyebrow {\n    display: block;\n    font-family: var(--ff-eyebrow);\n    font-weight: 700;\n    font-size: clamp(11px, 1vw, 14px);\n    letter-spacing: 0.22em;\n    text-transform: uppercase;\n    color: rgba(255,255,255,0.55);\n    margin-bottom: 14px;\n  }\n  .tt .section-cta button.cta { border: 0; cursor: pointer; }\n\n  \/* ============================================================\n     STICKY TOP SCARCITY BAR — conditional, only on low tier\n     (≤5 spots remaining OR ≥90% sold out). Pure alarm, no CTA.\n     ============================================================ *\/\n  .tt-sticky-scarcity {\n    position: fixed;\n    top: 0; left: 0; right: 0;\n    z-index: 9997;\n    display: none;\n    align-items: center;\n    justify-content: center;\n    gap: 14px;\n    background: rgba(14,14,12,0.96);\n    border-bottom: 2px solid var(--red);\n    padding: clamp(10px, 1.2vw, 14px) clamp(14px, 3vw, 32px);\n    font-family: 'Aero Matics', 'Barlow Condensed', sans-serif;\n    backdrop-filter: blur(8px);\n    -webkit-backdrop-filter: blur(8px);\n    transform: translateY(-110%);\n    transition: transform 0.5s cubic-bezier(.22,.61,.36,1);\n    box-shadow: 0 6px 20px rgba(0,0,0,0.35);\n  }\n  .tt-sticky-scarcity.is-visible { display: flex; transform: translateY(0); }\n  .tt-sticky-scarcity .pulse {\n    width: 10px; height: 10px;\n    border-radius: 50%;\n    background: var(--red);\n    flex: 0 0 auto;\n    animation: tt-sticky-scarcity-pulse 1.3s ease-in-out infinite;\n  }\n  @keyframes tt-sticky-scarcity-pulse {\n    0%, 100% { opacity: 1; transform: scale(1); }\n    50%      { opacity: 0.55; transform: scale(0.8); }\n  }\n  @media (prefers-reduced-motion: reduce) {\n    .tt-sticky-scarcity .pulse { animation: none !important; }\n  }\n  .tt-sticky-scarcity .label {\n    font-weight: 700;\n    font-size: clamp(13px, 1.5vw, 17px);\n    letter-spacing: 0.18em;\n    text-transform: uppercase;\n    color: #fff;\n    line-height: 1;\n  }\n  .tt-sticky-scarcity .label .accent { color: var(--red); }\n  .tt-sticky-scarcity .sep { color: rgba(255,255,255,0.35); padding: 0 4px; }\n  .tt-sticky-scarcity .count {\n    font-family: 'JetBrains Mono', monospace;\n    font-weight: 500;\n    font-size: clamp(11px, 1.1vw, 13px);\n    letter-spacing: 0.18em;\n    text-transform: uppercase;\n    color: rgba(255,255,255,0.6);\n    line-height: 1;\n  }\n  @media (max-width: 480px) {\n    .tt-sticky-scarcity .count { display: none; }  \/* collapse on tiny screens *\/\n    .tt-sticky-scarcity .sep { display: none; }\n  }\n\n  \/* ============================================================\n     STICKY BOTTOM CTA — fixed-position \"secure my spot\" bar\n     ============================================================ *\/\n  .tt-sticky-cta {\n    position: fixed;\n    bottom: 0; left: 0; right: 0;\n    z-index: 9998;\n    background: rgba(14,14,12,0.96);\n    border-top: 2px solid var(--red);\n    padding: clamp(10px, 1.2vw, 16px) clamp(14px, 3vw, 32px);\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    gap: 14px;\n    transform: translateY(110%);\n    transition: transform 0.45s cubic-bezier(.22,.61,.36,1);\n    font-family: 'Barlow', system-ui, sans-serif;\n    backdrop-filter: blur(8px);\n    -webkit-backdrop-filter: blur(8px);\n    box-shadow: 0 -6px 20px rgba(0,0,0,0.35);\n  }\n  .tt-sticky-cta * { box-sizing: border-box; }\n  .tt-sticky-cta.is-visible { transform: translateY(0); }\n  .tt-sticky-cta .lhs { flex: 1 1 auto; min-width: 0; }\n  .tt-sticky-cta .lhs .label {\n    font-family: 'Barlow Condensed', 'Barlow', sans-serif;\n    font-weight: 700;\n    font-size: clamp(10px, 1vw, 12px);\n    letter-spacing: 0.22em;\n    text-transform: uppercase;\n    color: rgba(255,255,255,0.55);\n    margin: 0 0 2px;\n    line-height: 1;\n  }\n  .tt-sticky-cta .lhs .title {\n    font-family: 'Abolition', 'Bebas Neue', 'Anton', 'Barlow Condensed', sans-serif;\n    font-size: clamp(15px, 2vw, 22px);\n    letter-spacing: 0.005em;\n    text-transform: uppercase;\n    color: #fff;\n    line-height: 1.05;\n    white-space: nowrap;\n    overflow: hidden;\n    text-overflow: ellipsis;\n  }\n  .tt-sticky-cta .cta-btn {\n    background: var(--red);\n    color: #fff;\n    font-family: 'Abolition', 'Bebas Neue', 'Anton', sans-serif;\n    font-size: clamp(14px, 1.5vw, 18px);\n    letter-spacing: 0.03em;\n    text-transform: uppercase;\n    padding: clamp(10px, 1.2vw, 14px) clamp(18px, 2.5vw, 30px);\n    border: 0;\n    cursor: pointer;\n    text-decoration: none;\n    white-space: nowrap;\n    transition: filter 0.2s ease, transform 0.2s ease;\n    display: inline-flex;\n    align-items: center;\n    gap: 10px;\n  }\n  .tt-sticky-cta .cta-btn:hover { filter: brightness(0.92); transform: translateY(-1px); }\n  .tt-sticky-cta .cta-btn .arrow { font-family: 'Barlow', sans-serif; font-weight: 700; font-size: 0.85em; }\n  @media (max-width: 540px) {\n    .tt-sticky-cta .lhs .label { display: none; }\n    .tt-sticky-cta { padding: 10px 14px; }\n  }\n\n  \/* ============================================================\n     \"A DAY AT THE TECHNIQUE TOUR\" — YouTube embed\n     ============================================================ *\/\n  .tt .video-section { padding: clamp(56px, 8vw, 110px) 0; border-top: 1px solid rgba(255,255,255,0.08); }\n  .tt .video-wrap {\n    position: relative;\n    max-width: 1080px;\n    margin: 0 auto;\n    aspect-ratio: 16 \/ 9;\n    background: #000;\n    overflow: hidden;\n    cursor: pointer;\n  }\n  .tt .video-wrap iframe,\n  .tt .video-wrap img {\n    position: absolute; inset: 0;\n    width: 100%; height: 100%;\n    border: 0;\n  }\n  .tt .video-wrap img { object-fit: cover; }\n  .tt .video-wrap .play-btn {\n    position: absolute;\n    top: 50%; left: 50%;\n    transform: translate(-50%, -50%);\n    width: clamp(64px, 8vw, 96px); height: clamp(64px, 8vw, 96px);\n    background: var(--red);\n    border: 0; border-radius: 50%;\n    display: flex; align-items: center; justify-content: center;\n    cursor: pointer;\n    z-index: 2;\n    transition: transform 0.2s ease, background 0.2s ease;\n    box-shadow: 0 8px 24px rgba(0,0,0,0.4);\n  }\n  .tt .video-wrap:hover .play-btn { transform: translate(-50%, -50%) scale(1.08); }\n  .tt .video-wrap .play-btn svg { width: 40%; height: 40%; fill: #fff; margin-left: 6%; }\n\n  \/* ============================================================\n     SECTION 5.5 — CAROUSEL (camp photos \/ testimonial videos)\n     ============================================================ *\/\n  .tt .carousel-wrap { padding: 0; }\n  .tt-carousel {\n    position: relative;\n    width: 100%;\n    max-width: 1200px;\n    margin: clamp(28px, 4vw, 48px) auto 0;\n    overflow: hidden;\n    background: #050505;\n  }\n  .tt-carousel-track {\n    display: flex;\n    transition: transform 0.7s cubic-bezier(.22,.61,.36,1);\n    will-change: transform;\n  }\n  .tt-carousel-slide {\n    flex: 0 0 100%;\n    min-width: 100%;\n    position: relative;\n    aspect-ratio: 16 \/ 10;\n    background: #050505;\n    overflow: hidden;\n  }\n  .tt-carousel-slide img,\n  .tt-carousel-slide video {\n    width: 100%; height: 100%;\n    object-fit: cover;\n    display: block;\n  }\n  .tt-carousel-caption {\n    position: absolute;\n    left: 0; right: 0; bottom: 0;\n    padding: clamp(12px, 2vw, 18px) clamp(16px, 3vw, 28px);\n    background: linear-gradient(180deg, transparent 0%, rgba(0,0,0,0.85) 100%);\n    color: #fff;\n    font-family: var(--ff-eyebrow);\n    font-weight: 500;\n    font-size: clamp(13px, 1.1vw, 16px);\n    letter-spacing: 0.04em;\n    text-transform: lowercase;\n    pointer-events: none;\n  }\n  .tt-carousel-dots {\n    position: absolute;\n    bottom: clamp(14px, 2vw, 22px);\n    left: 50%;\n    transform: translateX(-50%);\n    display: flex;\n    gap: 8px;\n    z-index: 3;\n  }\n  .tt-carousel-dot {\n    width: 9px; height: 9px;\n    border-radius: 50%;\n    background: rgba(255,255,255,0.45);\n    border: 0;\n    padding: 0;\n    cursor: pointer;\n    transition: background 0.2s ease, transform 0.2s ease;\n  }\n  .tt-carousel-dot.is-active {\n    background: var(--red);\n    transform: scale(1.25);\n  }\n  .tt-carousel-arrow {\n    position: absolute;\n    top: 50%;\n    transform: translateY(-50%);\n    width: clamp(40px, 4vw, 52px);\n    height: clamp(40px, 4vw, 52px);\n    background: rgba(0,0,0,0.55);\n    color: #fff;\n    border: 0;\n    font-size: clamp(22px, 2.5vw, 28px);\n    line-height: 1;\n    cursor: pointer;\n    z-index: 4;\n    transition: background 0.2s ease;\n    font-family: var(--ff-body);\n  }\n  .tt-carousel-arrow:hover { background: var(--red); }\n  .tt-carousel-prev { left: clamp(8px, 1.5vw, 16px); }\n  .tt-carousel-next { right: clamp(8px, 1.5vw, 16px); }\n  @media (max-width: 600px) {\n    .tt-carousel-arrow { display: none; }  \/* Mobile = swipe only *\/\n    .tt-carousel-slide { aspect-ratio: 4 \/ 5; }  \/* Taller on mobile *\/\n  }\n\n  \/* ============================================================\n     CARD-STYLE CAROUSEL SLIDES — designed content panels\n     (Schedule, Philosophy, Coach, Track) instead of just photos\n     ============================================================ *\/\n  .tt-carousel-slide.tt-slide-card {\n    background: var(--ink);\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    padding: clamp(32px, 5vw, 72px);\n    text-align: left;\n    overflow: hidden;\n    position: relative;\n  }\n  .tt-carousel-slide.tt-slide-card::before {\n    content: \"\"; position: absolute; inset: 0;\n    background: radial-gradient(ellipse 80% 60% at top right, rgba(215,37,37,0.18) 0%, transparent 60%);\n    pointer-events: none;\n  }\n  .tt-carousel-slide.tt-slide-card \u003e * { position: relative; z-index: 1; }\n\n  .tt-carousel-slide .card-eyebrow {\n    display: inline-block;\n    background: var(--red);\n    color: #fff;\n    font-family: var(--ff-eyebrow);\n    font-weight: 700;\n    font-size: clamp(11px, 1vw, 13px);\n    letter-spacing: 0.22em;\n    text-transform: lowercase;\n    padding: 7px 14px 6px;\n    align-self: flex-start;\n    margin-bottom: clamp(14px, 2vw, 22px);\n    line-height: 1;\n  }\n  .tt-carousel-slide .card-heading {\n    font-family: var(--ff-display);\n    font-size: clamp(28px, 4vw, 56px);\n    text-transform: uppercase;\n    line-height: 0.95;\n    letter-spacing: -0.005em;\n    margin: 0 0 clamp(16px, 2vw, 26px);\n    color: #fff;\n  }\n  .tt-carousel-slide .card-body {\n    font-family: var(--ff-body);\n    font-size: clamp(13px, 1.2vw, 17px);\n    line-height: 1.55;\n    color: rgba(255,255,255,0.85);\n    max-width: 640px;\n    margin: 0;\n  }\n  .tt-carousel-slide .card-body strong { color: #fff; font-weight: 700; }\n\n  \/* Schedule card — timeline-style rows *\/\n  .tt-carousel-slide .card-schedule {\n    display: flex;\n    flex-direction: column;\n    font-family: var(--ff-meta);\n    font-size: clamp(12px, 1.1vw, 14px);\n    max-width: 640px;\n  }\n  .tt-carousel-slide .card-schedule .row {\n    display: grid;\n    grid-template-columns: clamp(80px, 12vw, 120px) 1fr;\n    gap: 16px;\n    align-items: baseline;\n    padding: clamp(8px, 1vw, 12px) 0;\n    border-top: 1px solid rgba(255,255,255,0.1);\n  }\n  .tt-carousel-slide .card-schedule .row:first-child { border-top: 0; }\n  .tt-carousel-slide .card-schedule .time {\n    color: var(--red);\n    font-weight: 700;\n    letter-spacing: 0.12em;\n    text-transform: uppercase;\n  }\n  .tt-carousel-slide .card-schedule .what {\n    color: rgba(255,255,255,0.88);\n    font-family: var(--ff-body);\n    font-size: clamp(13px, 1.2vw, 16px);\n    line-height: 1.4;\n  }\n  .tt-carousel-slide .card-schedule .what sup { color: var(--red); font-weight: 700; font-size: 0.7em; }\n  .tt-carousel-slide .card-footnote {\n    margin: clamp(14px, 1.5vw, 22px) 0 0;\n    font-size: clamp(11px, 1vw, 13px);\n    line-height: 1.4;\n    color: rgba(255,255,255,0.55);\n    font-style: italic;\n    max-width: 640px;\n  }\n\n  \/* Coach card — credentials grid *\/\n  .tt-carousel-slide .card-creds {\n    display: grid;\n    grid-template-columns: repeat(2, 1fr);\n    gap: clamp(14px, 2vw, 28px) clamp(20px, 3vw, 48px);\n    max-width: 560px;\n    margin-top: clamp(14px, 2vw, 22px);\n  }\n  .tt-carousel-slide .card-creds .item .n {\n    display: block;\n    font-family: var(--ff-display);\n    font-size: clamp(28px, 3.5vw, 48px);\n    color: var(--red);\n    line-height: 1;\n  }\n  .tt-carousel-slide .card-creds .item .l {\n    display: block;\n    margin-top: 6px;\n    font-family: var(--ff-eyebrow);\n    font-size: clamp(10px, 0.9vw, 12px);\n    letter-spacing: 0.18em;\n    text-transform: uppercase;\n    color: rgba(255,255,255,0.65);\n  }\n\n  \/* Philosophy card — pull-quote treatment *\/\n  .tt-carousel-slide.tt-slide-philosophy .card-heading {\n    font-size: clamp(36px, 5.5vw, 84px);\n  }\n  .tt-carousel-slide.tt-slide-philosophy .card-heading .accent { color: var(--red); }\n\n  \/* ============================================================\n     SECTION 6 — METHODOLOGY (long-form)\n     ============================================================ *\/\n  .tt .method {\n    max-width: 760px;\n    margin: 0 auto;\n    text-align: left;\n  }\n  .tt .method p { margin: 0 0 1.1em; font-size: clamp(16px, 1.25vw, 19px); line-height: 1.65; color: rgba(255,255,255,0.86); }\n  .tt .method p strong { color: var(--red); font-weight: 700; }\n  .tt .method p em { color: var(--paper); font-style: italic; }\n\n  \/* ============================================================\n     SECTION 7 — COACH\n     ============================================================ *\/\n  .tt .coach {\n    max-width: 1080px;\n    margin: 0 auto;\n  }\n  .tt .coach .coach-layout {\n    display: grid;\n    grid-template-columns: minmax(280px, 38%) 1fr;\n    gap: clamp(28px, 4vw, 56px);\n    align-items: center;\n  }\n  @media (max-width: 720px) {\n    .tt .coach .coach-layout { grid-template-columns: 1fr; }\n  }\n  .tt .coach .coach-photo {\n    width: 100%;\n    aspect-ratio: 4 \/ 5;\n    object-fit: cover;\n    display: block;\n    background: rgba(255,255,255,0.04);\n    border: 1px solid rgba(215,37,37,0.35);\n  }\n  .tt .coach .coach-text { text-align: left; }\n  .tt .coach .stat-row {\n    display: grid;\n    grid-template-columns: repeat(5, 1fr);\n    gap: 0;\n    margin: clamp(20px, 2.5vw, 32px) 0 clamp(20px, 2.5vw, 32px);\n    padding: 22px 0;\n    border-top: 1px solid rgba(255,255,255,0.12);\n    border-bottom: 1px solid rgba(255,255,255,0.12);\n  }\n  @media (max-width: 720px) {\n    .tt .coach .stat-row { grid-template-columns: repeat(3, 1fr); gap: 18px 0; }\n  }\n  @media (max-width: 480px) {\n    .tt .coach .stat-row { grid-template-columns: repeat(2, 1fr); }\n  }\n  .tt .coach .credential { text-align: center; }\n  .tt .coach .credential .n {\n    display: block;\n    font-family: var(--ff-display);\n    font-size: clamp(24px, 2.5vw, 38px);\n    color: var(--red);\n    line-height: 1;\n  }\n  .tt .coach .credential .l {\n    display: block;\n    margin-top: 6px;\n    font-family: var(--ff-eyebrow);\n    font-size: 11px;\n    letter-spacing: 0.18em;\n    text-transform: uppercase;\n    color: rgba(255,255,255,0.65);\n  }\n\n  \/* ============================================================\n     SECTION 8 — LOCATION (Day · Time · Where · Cost + Map)\n     ============================================================ *\/\n  .tt .venue {\n    max-width: 1080px;\n    margin: 0 auto;\n    text-align: center;\n  }\n  .tt .venue .body-lg {\n    max-width: 720px;\n    margin: 0 auto clamp(30px, 4vw, 48px);\n  }\n  .tt .venue .loc-grid {\n    display: grid;\n    grid-template-columns: repeat(4, 1fr);\n    gap: 0;\n    border: 1px solid rgba(255,255,255,0.12);\n    margin-bottom: clamp(28px, 4vw, 44px);\n  }\n  .tt .venue .loc-cell {\n    padding: clamp(18px, 2.5vw, 26px) clamp(12px, 2vw, 22px);\n    border-right: 1px solid rgba(255,255,255,0.12);\n    text-align: center;\n  }\n  .tt .venue .loc-cell:last-child { border-right: 0; }\n  .tt .venue .loc-label {\n    display: block;\n    font-family: var(--ff-eyebrow);\n    font-weight: 700;\n    font-size: clamp(10px, 1vw, 12px);\n    letter-spacing: 0.22em;\n    text-transform: uppercase;\n    color: rgba(255,255,255,0.55);\n    margin-bottom: 10px;\n  }\n  .tt .venue .loc-value {\n    display: block;\n    font-family: var(--ff-display);\n    font-size: clamp(16px, 1.6vw, 22px);\n    letter-spacing: 0.005em;\n    text-transform: uppercase;\n    color: var(--paper);\n    line-height: 1.15;\n  }\n  @media (max-width: 720px) {\n    .tt .venue .loc-grid { grid-template-columns: repeat(2, 1fr); }\n    .tt .venue .loc-cell { border-right: 0; border-bottom: 1px solid rgba(255,255,255,0.12); }\n    .tt .venue .loc-cell:nth-child(odd) { border-right: 1px solid rgba(255,255,255,0.12); }\n    .tt .venue .loc-cell:nth-last-child(-n+2) { border-bottom: 0; }\n  }\n  .tt .venue .loc-map {\n    position: relative;\n    border: 1px solid rgba(255,255,255,0.12);\n    overflow: hidden;\n    margin-bottom: 18px;\n  }\n  .tt .venue .loc-map iframe { display: block; filter: grayscale(0%) contrast(0.95); }\n  .tt .venue .loc-directions {\n    display: inline-flex; align-items: center; gap: 10px;\n    background: var(--red);\n    color: var(--paper);\n    font-family: var(--ff-display);\n    font-size: clamp(16px, 1.5vw, 20px);\n    letter-spacing: 0.03em;\n    text-transform: uppercase;\n    padding: clamp(12px, 1.5vw, 16px) clamp(22px, 3vw, 34px);\n    text-decoration: none;\n    transition: filter 0.2s ease, transform 0.2s ease;\n    margin-top: 14px;\n  }\n  .tt .venue .loc-directions:hover { filter: brightness(0.92); transform: translateY(-1px); }\n  .tt .venue .loc-directions .arrow { font-family: var(--ff-body); font-weight: 700; font-size: 0.85em; }\n\n  \/* ============================================================\n     SECTION 9 — FAQ\n     ============================================================ *\/\n  .tt .faq {\n    max-width: 820px;\n    margin: 0 auto;\n  }\n  .tt .faq details {\n    border-bottom: 1px solid rgba(255,255,255,0.12);\n    padding: 18px 0;\n  }\n  .tt .faq details[open] { border-bottom-color: var(--red); }\n  .tt .faq summary {\n    list-style: none;\n    cursor: pointer;\n    display: flex; align-items: center; gap: 16px;\n    font-family: var(--ff-display);\n    font-size: clamp(18px, 1.8vw, 24px);\n    text-transform: uppercase;\n    letter-spacing: -0.005em;\n    color: var(--paper);\n    transition: color 0.2s ease;\n  }\n  .tt .faq summary::-webkit-details-marker { display: none; }\n  .tt .faq summary::before {\n    content: \"+\";\n    flex: 0 0 28px;\n    width: 28px; height: 28px;\n    display: inline-flex; align-items: center; justify-content: center;\n    background: var(--red);\n    color: var(--ink);\n    font-weight: 700;\n    font-size: 22px;\n    line-height: 1;\n    transition: transform 0.2s ease;\n  }\n  .tt .faq details[open] summary::before { content: \"–\"; }\n  .tt .faq summary:hover { color: var(--red); }\n  .tt .faq .answer {\n    padding: 14px 0 4px 44px;\n    font-size: 16px;\n    line-height: 1.65;\n    color: rgba(255,255,255,0.82);\n  }\n  .tt .faq .answer p { margin: 0 0 0.8em; }\n  .tt .faq .answer a { color: var(--red); text-decoration: underline; }\n\n  \/* ============================================================\n     SECTION 10 — REFUND POLICY\n     ============================================================ *\/\n  .tt .policy-grid {\n    display: grid;\n    grid-template-columns: repeat(2, 1fr);\n    gap: clamp(14px, 2vw, 24px);\n    max-width: 1080px;\n    margin: 0 auto;\n  }\n  @media (max-width: 760px) {\n    .tt .policy-grid { grid-template-columns: 1fr; }\n  }\n  .tt .policy {\n    background: rgba(255,255,255,0.04);\n    border: 1px solid rgba(255,255,255,0.10);\n    border-left: 4px solid var(--red);\n    padding: clamp(22px, 2.5vw, 32px);\n  }\n  .tt .policy h3 {\n    font-family: var(--ff-eyebrow);\n    font-weight: 700;\n    font-size: clamp(13px, 1.2vw, 15px);\n    letter-spacing: 0.18em;\n    text-transform: uppercase;\n    color: var(--red);\n    margin: 0 0 14px;\n  }\n  .tt .policy p { margin: 0 0 0.8em; font-size: 15px; line-height: 1.6; color: rgba(255,255,255,0.82); }\n  .tt .policy strong { color: var(--paper); }\n\n  \/* ============================================================\n     SECTION 11 — FINAL CTA\n     ============================================================ *\/\n  .tt .final {\n    text-align: center;\n    padding: clamp(64px, 8vw, 120px) 0;\n    background:\n      linear-gradient(180deg, rgba(14,14,12,0.85), rgba(14,14,12,0.95)),\n      url(\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/jumps-clinic_tre-DSC03983.jpg?v=1790801711\") center \/ cover no-repeat;\n    border-top: 1px solid rgba(255,255,255,0.08);\n  }\n  .tt .final .red-tag { margin-bottom: 22px; }\n  .tt .final h2 {\n    font-family: var(--ff-display);\n    font-size: clamp(48px, 8vw, 120px);\n    line-height: 0.86;\n    letter-spacing: -0.01em;\n    text-transform: uppercase;\n    margin: 0 0 clamp(20px, 3vw, 32px);\n  }\n  .tt .final .micro { margin-top: 18px; }\n\n\u003c\/style\u003e\n\n\n\u003c!-- ============================================================\n     SECTION 1 — HERO\n     ============================================================ --\u003e\n\u003cdiv class=\"hero\"\u003e\n  \u003cspan class=\"red-tag\"\u003ejumps clinic\u003c\/span\u003e\n  \u003cdiv class=\"hero-grid\"\u003e\n    \u003ch1 class=\"h-display\"\u003eTEXAS\u003c\/h1\u003e\n    \u003cdiv class=\"meta-line\"\u003e\n      coach Tre McCollough \u003cspan class=\"sep\"\u003e|\u003c\/span\u003e Oak Hill Raceway \u003cspan class=\"sep\"\u003e|\u003c\/span\u003e january 18\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- Coach badge — make the coaching coach(es) unmistakable (Tre vs Tyler, plus optional co-coach) --\u003e\n\u003cdiv class=\"container\" style=\"padding-top:18px;\"\u003e\n  \u003cdiv style=\"display:inline-flex;align-items:center;gap:14px;background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.14);border-radius:999px;padding:8px 20px 8px 8px;\"\u003e\n    \u003cspan style=\"display:inline-flex;align-items:center;flex:none;\"\u003e\n      \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/Screenshot_2025-11-04_at_1.08.08_PM_720x.png?v=1768602726\" alt=\"Coach Tre McCollough\" width=\"54\" height=\"54\" loading=\"lazy\" decoding=\"async\" style=\"width:54px;height:54px;border-radius:50%;object-fit:cover;object-position:center top;flex:none;\"\u003e\n      \u003cimg src=\"\" alt=\"Coach \" width=\"54\" height=\"54\" loading=\"lazy\" decoding=\"async\" style=\"width:54px;height:54px;border-radius:50%;object-fit:cover;object-position:center center;flex:none;margin-left:-16px;border:2px solid #161616;display:none\"\u003e\n    \u003c\/span\u003e\n    \u003cspan style=\"line-height:1.15;\"\u003e\n      \u003cspan style=\"display:block;font-size:12px;letter-spacing:2px;text-transform:uppercase;color:var(--red);font-weight:700;\"\u003eYour coach\u003c\/span\u003e\n      \u003cspan style=\"display:block;font-size:21px;font-weight:800;color:#fff;\"\u003eCoach Tre McCollough\u003c\/span\u003e\n    \u003c\/span\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- Stats strip --\u003e\n\u003cdiv class=\"stats\"\u003e\n  \u003cdiv class=\"stats-grid\"\u003e\n    \u003cdiv class=\"stat\"\u003e\n      \u003cspan class=\"num\"\u003e$347\u003c\/span\u003e\n      \u003cspan class=\"lab\"\u003eEarly bird · $397 public\u003c\/span\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"stat\"\u003e\n      \u003cspan class=\"num\"\u003e1 Day\u003c\/span\u003e\n      \u003cspan class=\"lab\"\u003e9 AM to 3 PM\u003c\/span\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"stat\"\u003e\n      \u003cspan class=\"num\"\u003e20\u003c\/span\u003e\n      \u003cspan class=\"lab\"\u003eRider cap\u003c\/span\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- Track warning(s) — amber callout. Empty if no warning:* tags. ============= --\u003e\n\n\n\u003c!-- Scarcity widget (real Shopify inventory) ============================ --\u003e\n\u003cdiv class=\"container\" style=\"padding-top: 22px; padding-bottom: 6px;\"\u003e\n  \u003cdiv class=\"tt-scarcity\" role=\"status\" aria-live=\"polite\" data-max-spots=\"20\" data-current-inventory=\"20\" data-low-threshold=\"5\" data-show-threshold=\"70\" data-poll-seconds=\"120\" data-handle=\"jumps-clinic-oak-hill-raceway-alvord-tx-january-18-2027\" style=\"display:none; box-sizing:border-box; margin:18px 0; padding:18px 22px; background:#0e0e0c; color:#fff; border-left:6px solid var(--red); font-family:'Barlow',system-ui,sans-serif;\"\u003e\n    \u003cdiv class=\"row\" style=\"display:flex; align-items:center; gap:14px; flex-wrap:wrap;\"\u003e\n      \u003cspan class=\"dot\" aria-hidden=\"true\" style=\"width:10px; height:10px; border-radius:50%; background:var(--red); flex:0 0 auto;\"\u003e\u003c\/span\u003e\n      \u003cspan class=\"label\" style=\"font-family:'Barlow Condensed','Barlow',sans-serif; font-weight:700; font-size:15px; letter-spacing:0.16em; text-transform:uppercase;\"\u003e\u003c\/span\u003e\n      \u003cspan class=\"count\" style=\"font-family:'JetBrains Mono',monospace; font-size:12px; letter-spacing:0.18em; text-transform:uppercase; color:rgba(255,255,255,0.6); margin-left:auto;\"\u003e\u003c\/span\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"bar\" style=\"margin-top:14px; height:6px; background:rgba(255,255,255,0.10); overflow:hidden;\"\u003e\n      \u003cdiv class=\"fill\" style=\"height:100%; background:var(--red); width:0%; transition:width 0.8s cubic-bezier(.22,.61,.36,1);\"\u003e\u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cstyle\u003e\n  .tt .tt-scarcity.is-visible { display: block !important; }\n  \/* HEAT METER — the bar reads hotter as spots run out. *\/\n  .tt .tt-scarcity .bar { height: 12px !important; border-radius: 999px !important; background: rgba(255,255,255,0.09) !important; position: relative; overflow: hidden; }\n  .tt .tt-scarcity .bar .fill {\n    border-radius: 999px !important;\n    background: linear-gradient(90deg,#E8C766 0%,#ffc24a 42%,#ff8a3c 72%,#ff3b2f 100%) !important;\n    box-shadow: 0 0 10px rgba(255,110,50,0.55);\n    position: relative; overflow: hidden;\n  }\n  \/* light sweeps across the fill like rising heat *\/\n  .tt .tt-scarcity .bar .fill::after {\n    content: \"\"; position: absolute; inset: 0;\n    background: linear-gradient(90deg, transparent, rgba(255,255,255,0.38), transparent);\n    transform: translateX(-100%);\n    animation: tt-heat-shimmer 2.4s ease-in-out infinite;\n  }\n  @keyframes tt-heat-shimmer { 0% { transform: translateX(-100%); } 55%, 100% { transform: translateX(100%); } }\n  \/* LOW = HOT: throbbing red glow *\/\n  .tt .tt-scarcity.is-low { border-left-color: #ff3b2f !important; }\n  .tt .tt-scarcity.is-low .dot { background: #ff3b2f !important; }\n  .tt .tt-scarcity.is-low .bar .fill { animation: tt-heat-glow 1.1s ease-in-out infinite; }\n  @keyframes tt-heat-glow {\n    0%, 100% { box-shadow: 0 0 8px rgba(255,50,40,0.5); }\n    50%      { box-shadow: 0 0 22px rgba(255,50,40,0.95); }\n  }\n  .tt .tt-scarcity.is-soldout { border-left-color: rgba(255,255,255,0.4) !important; }\n  .tt .tt-scarcity.is-soldout .dot { background: rgba(255,255,255,0.4) !important; }\n  .tt .tt-scarcity.is-soldout .bar .fill { background: rgba(255,255,255,0.35) !important; animation: none !important; box-shadow: none; }\n  .tt .tt-scarcity.is-soldout .bar .fill::after { display: none; }\n  .tt .tt-scarcity .label .accent { color: var(--red); }\n  .tt .tt-scarcity.is-low .label .accent { color: #ff6a3c; }\n  @keyframes tt-scarcity-pulse {\n    0%, 100% { opacity: 1; transform: scale(1); }\n    50%      { opacity: 0.55; transform: scale(0.85); }\n  }\n  .tt .tt-scarcity .dot { animation: tt-scarcity-pulse 1.5s ease-in-out infinite; }\n  @media (prefers-reduced-motion: reduce) {\n    .tt .tt-scarcity .dot,\n    .tt .tt-scarcity .bar .fill,\n    .tt .tt-scarcity .bar .fill::after { animation: none !important; }\n  }\n\u003c\/style\u003e\n\n\n\u003c!-- ============================================================\n     SECTION 2: TICKER (jumps outcomes)\n     ============================================================ --\u003e\n\u003cdiv class=\"ticker\" aria-hidden=\"true\"\u003e\n  \u003cdiv class=\"ticker__track\"\u003e\n    \u003cdiv style=\"display:flex; flex: 0 0 auto;\"\u003e\n\u003cspan class=\"ticker__item\"\u003ePower forward\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\u003cspan class=\"ticker__item\"\u003eBrake back\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\u003cspan class=\"ticker__item\"\u003eNeutral standing\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\u003cspan class=\"ticker__item\"\u003eNeutral power approach\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\u003cspan class=\"ticker__item\"\u003eOn-throttle approach\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\u003cspan class=\"ticker__item\"\u003eOff-throttle approach\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n    \u003cdiv style=\"display:flex; flex: 0 0 auto;\" aria-hidden=\"true\"\u003e\n\u003cspan class=\"ticker__item\"\u003ePower forward\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\u003cspan class=\"ticker__item\"\u003eBrake back\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\u003cspan class=\"ticker__item\"\u003eNeutral standing\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\u003cspan class=\"ticker__item\"\u003eNeutral power approach\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\u003cspan class=\"ticker__item\"\u003eOn-throttle approach\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\u003cspan class=\"ticker__item\"\u003eOff-throttle approach\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- ============================================================\n     SECTION 3: THREE POSITIONS, THREE JUMPS (jumps, per Carson 2026-09-30)\n     ============================================================ --\u003e\n\u003cstyle\u003e\n  .jp-grid { display:grid; grid-template-columns:repeat(3,1fr); gap:20px; margin-top:34px; }\n  .jp-card { position:relative; background:#171717; border:1px solid #2a2a2a; border-top:4px solid #E4151B; padding:30px 26px 22px; display:flex; flex-direction:column; }\n  .jp-num { position:absolute; top:-20px; left:26px; width:40px; height:40px; border-radius:50%; background:#E4151B; color:#fff; font-weight:800; font-size:18px; display:flex; align-items:center; justify-content:center; }\n  .jp-lab { display:block; font-size:11px; letter-spacing:1.5px; text-transform:uppercase; color:#E4151B; font-weight:700; margin-bottom:4px; }\n  .jp-card h3 { margin:0 0 6px; }\n  .jp-card p { margin:0; opacity:.85; }\n  .jp-arrow { font-size:26px; color:#E4151B; text-align:center; margin:12px 0; line-height:1; }\n  .jp-row--jump { background:#0f0f0f; border:1px solid #2a2a2a; padding:16px; }\n  .jp-time { margin-top:auto; padding-top:16px; font-size:13px; font-weight:700; letter-spacing:.5px; opacity:.9; }\n  .jp-foundation { margin-top:26px; padding:18px 22px; border:1px dashed #444; font-size:15px; line-height:1.5; }\n  @media (max-width: 760px) { .jp-grid { grid-template-columns:1fr; gap:34px; } }\n\u003c\/style\u003e\n\u003cdiv class=\"section\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003ewhat we drill\u003c\/span\u003e\n      \u003ch2 class=\"h-section\" style=\"margin-top: 18px;\"\u003eThree positions.\u003cbr\u003eThree approaches.\u003c\/h2\u003e\n      \u003cp class=\"body-lg\"\u003eEvery jump is built on three positions you already use on flat ground. We spend the first hour dialing them in, then take each one to the tabletop as its own approach, one at a time.\u003c\/p\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"jp-grid\"\u003e\n      \u003carticle class=\"jp-card\"\u003e\n        \u003cdiv class=\"jp-num\"\u003e1\u003c\/div\u003e\n        \u003cdiv class=\"jp-row\"\u003e\n\u003cspan class=\"jp-lab\"\u003eOn flat ground\u003c\/span\u003e\u003ch3\u003eNeutral standing\u003c\/h3\u003e\n\u003cp\u003eBalanced and centered on flat ground.\u003c\/p\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"jp-arrow\" aria-hidden=\"true\"\u003e↓\u003c\/div\u003e\n        \u003cdiv class=\"jp-row jp-row--jump\"\u003e\n\u003cspan class=\"jp-lab\"\u003eThe approach\u003c\/span\u003e\u003ch3\u003eNeutral power approach\u003c\/h3\u003e\n\u003cp\u003eHolding your speed up the face. We start here and spend the most time here.\u003c\/p\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"jp-time\"\u003e1 to 2 hours + application moto\u003c\/div\u003e\n      \u003c\/article\u003e\n      \u003carticle class=\"jp-card\"\u003e\n        \u003cdiv class=\"jp-num\"\u003e2\u003c\/div\u003e\n        \u003cdiv class=\"jp-row\"\u003e\n\u003cspan class=\"jp-lab\"\u003eOn flat ground\u003c\/span\u003e\u003ch3\u003ePower forward\u003c\/h3\u003e\n\u003cp\u003eYour on-throttle position on flat ground.\u003c\/p\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"jp-arrow\" aria-hidden=\"true\"\u003e↓\u003c\/div\u003e\n        \u003cdiv class=\"jp-row jp-row--jump\"\u003e\n\u003cspan class=\"jp-lab\"\u003eThe approach\u003c\/span\u003e\u003ch3\u003eOn-throttle approach\u003c\/h3\u003e\n\u003cp\u003eThe same position while you drive the throttle up the face.\u003c\/p\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"jp-time\"\u003eAbout 1 hour + application moto\u003c\/div\u003e\n      \u003c\/article\u003e\n      \u003carticle class=\"jp-card\"\u003e\n        \u003cdiv class=\"jp-num\"\u003e3\u003c\/div\u003e\n        \u003cdiv class=\"jp-row\"\u003e\n\u003cspan class=\"jp-lab\"\u003eOn flat ground\u003c\/span\u003e\u003ch3\u003eBrake back\u003c\/h3\u003e\n\u003cp\u003eYour off-throttle position on flat ground.\u003c\/p\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"jp-arrow\" aria-hidden=\"true\"\u003e↓\u003c\/div\u003e\n        \u003cdiv class=\"jp-row jp-row--jump\"\u003e\n\u003cspan class=\"jp-lab\"\u003eThe approach\u003c\/span\u003e\u003ch3\u003eOff-throttle approach\u003c\/h3\u003e\n\u003cp\u003eThe same position when you are off the throttle up the face.\u003c\/p\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"jp-time\"\u003e30 to 45 minutes + application moto\u003c\/div\u003e\n      \u003c\/article\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"jp-foundation\"\u003e\n\u003cstrong\u003eLast hour: sections.\u003c\/strong\u003e A couple of sections that are more challenging than the training tabletop. Whips and scrubs only if it helps the whole group. Not guaranteed.\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- ============================================================\n     SECTION 4: KNOW BEFORE YOU GO (jumps, sets expectations)\n     ============================================================ --\u003e\n\u003cdiv class=\"section\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003eknow before you go\u003c\/span\u003e\n      \u003ch2 class=\"h-section\" style=\"margin-top: 18px;\"\u003eA structured class.\u003cbr\u003eHere is how it works.\u003c\/h2\u003e\n      \u003cp class=\"body-lg\"\u003eThis class is built to teach the mechanics of jumping. Please read this before you sign up, so the day is what you expect it to be.\u003c\/p\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"levels\"\u003e\n      \u003cdiv class=\"level\"\u003e\n        \u003cspan class=\"red-tag\"\u003ea set plan\u003c\/span\u003e\n        \u003ch3\u003eA group class, not a private lesson.\u003c\/h3\u003e\n        \u003cp\u003eUp to 20 riders follow one plan, and we stick to it. The day does not change to fit one rider's wish list. If you want a day built around just you, this is not that class.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"level\"\u003e\n        \u003cspan class=\"red-tag\"\u003eone tabletop\u003c\/span\u003e\n        \u003ch3\u003eWe train on one tabletop, on purpose.\u003c\/h3\u003e\n        \u003cp\u003eOne jump, one group, one plan: a controlled setup built for learning the mechanics. Everything you learn on it applies to any jump with a face, and application motos take it to the rest of the track.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"level\"\u003e\n        \u003cspan class=\"red-tag\"\u003enot guaranteed\u003c\/span\u003e\n        \u003ch3\u003eWhips and scrubs are not on the promise list.\u003c\/h3\u003e\n        \u003cp\u003eIf there is time at the end and it helps the whole group, we may cover them. If it only fits one rider out of twenty, we won't. Come for the fundamentals.\u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cp class=\"body\" style=\"margin-top: 22px; opacity: .85;\"\u003e\u003cstrong\u003eBefore you register:\u003c\/strong\u003e you should get around the track on your own and clear a small tabletop. This is not a first-jump class. New to The MX Factory? You are welcome here. At checkout you will confirm you understand this clinic may be harder without an MXF class first.\u003c\/p\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- ============================================================\n     SECTION 4.5 — \"A DAY AT THE TECHNIQUE TOUR\" (YouTube)\n     ============================================================ --\u003e\n\u003cdiv class=\"section video-section\" style=\"display:none\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003ea day at the jumps clinic\u003c\/span\u003e\n      \u003ch2 class=\"h-section\" style=\"margin-top: 18px;\"\u003eWatch what a day actually looks like.\u003c\/h2\u003e\n      \u003cp class=\"body-lg\"\u003eReal riders, real drills, real progress in real time. This is what training with Tre looks like.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003c!-- Facade pattern: light static thumbnail + play button.\n         Real YouTube iframe (~750KB JS) loads ONLY when user clicks.\n         Massive perf win — no embedded video player overhead on initial load. --\u003e\n    \u003cdiv class=\"video-wrap\" role=\"button\" tabindex=\"0\" aria-label=\"Play 'A Day at the Technique Tour' video\" data-yt-id=\"NI4F51Jq_zQ\" onclick=\"ttPlayVideo(this)\" onkeydown=\"if(event.key==='Enter'||event.key===' '){event.preventDefault();ttPlayVideo(this);}\"\u003e\n      \u003cimg src=\"https:\/\/i.ytimg.com\/vi\/NI4F51Jq_zQ\/maxresdefault.jpg\" alt=\"A day at the Jumps Clinic, preview\" loading=\"lazy\" decoding=\"async\"\u003e\n      \u003cbutton class=\"play-btn\" type=\"button\" aria-hidden=\"true\" tabindex=\"-1\"\u003e\n        \u003csvg viewbox=\"0 0 24 24\"\u003e\u003cpath d=\"M8 5v14l11-7z\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n      \u003c\/button\u003e\n    \u003c\/div\u003e\n    \u003cscript\u003e\n      function ttPlayVideo(el){\n        if (el.dataset.ttLoaded === '1') return;\n        el.dataset.ttLoaded = '1';\n        var id = el.dataset.ytId;\n        var ifr = document.createElement('iframe');\n        ifr.src = 'https:\/\/www.youtube.com\/embed\/' + id + '?rel=0\u0026showinfo=0\u0026vq=720\u0026autoplay=1';\n        ifr.title = 'A Day at The Technique Tour';\n        ifr.allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture';\n        ifr.allowFullscreen = true;\n        el.innerHTML = '';\n        el.appendChild(ifr);\n        el.style.cursor = 'default';\n      }\n    \u003c\/script\u003e\n    \u003cdiv class=\"section-cta\"\u003e\n      \u003cspan class=\"cta-eyebrow\"\u003eReady to live a day like this?\u003c\/span\u003e\n      \u003cbutton class=\"cta tt-secure-cta\" type=\"button\"\u003eSecure My Spot \u003cspan class=\"arrow\"\u003e→\u003c\/span\u003e\u003c\/button\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- ============================================================\n     SECTION 4.6 — COACHED BY TYLER (YouTube + Mad Skills)  [opt-in]\n     ============================================================ --\u003e\n\u003cstyle\u003e\n  .tt .tyler-cred-grid { display:grid; grid-template-columns:1.05fr 0.95fr; gap:clamp(26px,4vw,56px); align-items:center; }\n  @media (max-width:760px){ .tt .tyler-cred-grid{ grid-template-columns:1fr; } }\n  .tt .yt-stat { display:flex; align-items:center; gap:18px; margin:4px 0 24px; }\n  .tt .yt-logo { flex:0 0 auto; }\n  .tt .yt-count, .tt .yt-plus { font-family:var(--ff-display); color:var(--red); line-height:0.85; }\n  .tt .yt-count { font-size:clamp(60px,8vw,104px); }\n  .tt .yt-plus { font-size:clamp(40px,5vw,68px); }\n  .tt .yt-label { font-family:var(--ff-meta); text-transform:uppercase; letter-spacing:0.16em; font-size:12px; color:rgba(255,255,255,0.7); margin-top:6px; }\n  .tt .tyler-cred-photo img { width:100%; object-fit:cover; border-radius:8px; display:block; aspect-ratio:4\/3; }\n  .tt .tyler-cred .cta { margin-top:14px; }\n  .tt .photo-grid { display:grid; grid-template-columns:repeat(4,1fr); gap:12px; margin-top:34px; }\n  @media (max-width:760px){ .tt .photo-grid{ grid-template-columns:repeat(2,1fr); } }\n  .tt .photo-grid figure { margin:0; overflow:hidden; border-radius:8px; aspect-ratio:3\/2; }\n  .tt .photo-grid img { width:100%; height:100%; object-fit:cover; display:block; transition:transform .5s ease; }\n  .tt .photo-grid figure:hover img { transform:scale(1.045); }\n  .tt .photo-grid .pg-feature { grid-column:span 2; grid-row:span 2; aspect-ratio:auto; }\n\u003c\/style\u003e\n\u003cdiv class=\"section tyler-cred\" style=\"display:none\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003ecoached by tyler\u003c\/span\u003e\n      \u003ch2 class=\"h-section\" style=\"margin-top:18px;\"\u003eYou might already\u003cbr\u003etrain with Tyler.\u003c\/h2\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"tyler-cred-grid\"\u003e\n      \u003cdiv class=\"tyler-cred-copy\"\u003e\n        \u003cdiv class=\"yt-stat\"\u003e\n          \u003csvg class=\"yt-logo\" width=\"66\" height=\"47\" viewbox=\"0 0 28 20\" aria-hidden=\"true\"\u003e\u003crect width=\"28\" height=\"20\" rx=\"5\" fill=\"#FF0000\"\u003e\u003c\/rect\u003e\u003cpath d=\"M11.4 6 L19 10 L11.4 14 Z\" fill=\"#fff\"\u003e\u003c\/path\u003e\u003c\/svg\u003e\n          \u003cdiv\u003e\n\u003cspan class=\"yt-count\" data-target=\"500000\"\u003e0\u003c\/span\u003e\u003cspan class=\"yt-plus\"\u003e+\u003c\/span\u003e\u003cdiv class=\"yt-label\"\u003eYouTube subscribers\u003c\/div\u003e\n\u003c\/div\u003e\n        \u003c\/div\u003e\n        \u003cp class=\"body-lg\"\u003eTyler Livesay is a professional coach who has trained hundreds of thousands of riders, with more than half a million following him on YouTube.\u003c\/p\u003e\n        \u003cp class=\"body-lg\"\u003eAnd if you've played \u003cstrong\u003eMad Skills MX3\u003c\/strong\u003e, you may have already trained with Tyler without knowing it: he built the \u003cstrong\u003eMX Factory Challenge mode\u003c\/strong\u003e inside the game. This is your chance to do it for real, in person, on the same dirt. Five days. Eight riders. One coach.\u003c\/p\u003e\n        \u003ca class=\"cta tt-secure-cta\" href=\"#\" onclick=\"window.scrollTo({top:0,behavior:'smooth'});return false;\"\u003eJoin the Waitlist \u003cspan class=\"arrow\"\u003e→\u003c\/span\u003e\u003c\/a\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"tyler-cred-photo\"\u003e\n        \u003cimg src=\"\" alt=\"Tyler Livesay coaching at the Technique Intensive\" loading=\"lazy\" decoding=\"async\"\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ============================================================\n     SECTION 4.7 — INSIDE A REAL INTENSIVE (photo grid)  [opt-in]\n     ============================================================ --\u003e\n\u003cdiv class=\"section intensive-gallery\" style=\"\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003ecoach tre in the air\u003c\/span\u003e\n      \u003ch2 class=\"h-section\" style=\"margin-top:18px;\"\u003eLearn jumps from\u003cbr\u003ea rider who jumps.\u003c\/h2\u003e\n      \u003cp class=\"body-lg\"\u003eCoach Tre McCollough on the jumps at Spoaks Moto Park in Lockhart, Texas.\u003c\/p\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"photo-grid\"\u003e\n\u003cfigure class=\"pg-feature\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/jumps-clinic_tre-DSC04100.jpg?v=1790801711\" decoding=\"async\" alt=\"Coach Tre McCollough jumping\"\u003e\u003c\/figure\u003e\u003cfigure class=\"pg-item\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/jumps-clinic_tre-DSC04078.jpg?v=1790801711\" decoding=\"async\" alt=\"Coach Tre McCollough jumping\"\u003e\u003c\/figure\u003e\u003cfigure class=\"pg-item\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/jumps-clinic_tre-DSC03983.jpg?v=1790801711\" decoding=\"async\" alt=\"Coach Tre McCollough jumping\"\u003e\u003c\/figure\u003e\u003cfigure class=\"pg-item\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/jumps-clinic_tre-DSC03969.jpg?v=1790801711\" decoding=\"async\" alt=\"Coach Tre McCollough jumping\"\u003e\u003c\/figure\u003e\u003cfigure class=\"pg-item\"\u003e\u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/jumps-clinic_tre-DSC04033.jpg?v=1790801711\" decoding=\"async\" alt=\"Coach Tre McCollough jumping\"\u003e\u003c\/figure\u003e\n\u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var el=document.querySelector('.tt .yt-count'); if(!el) return;\n  var target=parseInt(el.getAttribute('data-target'),10)||0, done=false;\n  function fmt(n){ return n\u003e=1000 ? (Math.round(n\/1000))+'K' : String(n); }\n  function run(){ if(done) return; done=true; var start=null, dur=1800;\n    function step(ts){ if(start===null) start=ts; var p=Math.min((ts-start)\/dur,1);\n      el.textContent=fmt(Math.floor(p*target)); if(p\u003c1){ requestAnimationFrame(step); } else { el.textContent=fmt(target); } }\n    requestAnimationFrame(step);\n  }\n  if('IntersectionObserver' in window){ var io=new IntersectionObserver(function(es){ es.forEach(function(e){ if(e.isIntersecting){ run(); io.disconnect(); } }); },{threshold:0.35}); io.observe(el); }\n  else { run(); }\n})();\n\u003c\/script\u003e\n\n\n\u003c!-- ============================================================\n     SECTION 5: WHAT TO EXPECT (six outcomes, jumps)\n     ============================================================ --\u003e\n\u003cdiv class=\"section\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003ewhat to expect\u003c\/span\u003e\n      \u003ch2 class=\"h-section\" style=\"margin-top: 18px;\"\u003eSix things we cover.\u003c\/h2\u003e\n      \u003cp class=\"body-lg\"\u003eThe goal is simple: understand the mechanics of jumping, then use them on the track.\u003c\/p\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"outcomes\"\u003e\n      \u003cdiv class=\"outcome\"\u003e\n        \u003cspan class=\"ico\" aria-hidden=\"true\"\u003e🧍\u003c\/span\u003e\n        \u003cspan class=\"name\"\u003eThe three positions\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"outcome\"\u003e\n        \u003cspan class=\"ico\" aria-hidden=\"true\"\u003e⚖️\u003c\/span\u003e\n        \u003cspan class=\"name\"\u003eNeutral power approach\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"outcome\"\u003e\n        \u003cspan class=\"ico\" aria-hidden=\"true\"\u003e🚀\u003c\/span\u003e\n        \u003cspan class=\"name\"\u003eOn-throttle approach\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"outcome\"\u003e\n        \u003cspan class=\"ico\" aria-hidden=\"true\"\u003e🛑\u003c\/span\u003e\n        \u003cspan class=\"name\"\u003eOff-throttle approach\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"outcome\"\u003e\n        \u003cspan class=\"ico\" aria-hidden=\"true\"\u003e🏁\u003c\/span\u003e\n        \u003cspan class=\"name\"\u003eApplication motos\u003c\/span\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"outcome\"\u003e\n        \u003cspan class=\"ico\" aria-hidden=\"true\"\u003e🧩\u003c\/span\u003e\n        \u003cspan class=\"name\"\u003eJump sections\u003c\/span\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- ============================================================\n     SECTION 5.5 — CAROUSEL (camp photos + testimonial videos)\n     Each slide can be EITHER:\n       - \u003cimg src=\"...\"\u003e for a photo\n       - \u003cvideo src=\"...\" poster=\"...\" muted playsinline\u003e for a video\n     Auto-rotates every 4.5s, pauses on hover, swipe-friendly on mobile.\n     If a video starts playing, auto-rotate pauses until it ends.\n     ============================================================ --\u003e\n\u003cdiv class=\"section carousel-wrap\" style=\"padding-top: 0;\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003ewhat to expect\u003c\/span\u003e\n      \u003ch2 class=\"h-section\" style=\"margin-top: 18px;\"\u003eA day at the Jumps Clinic.\u003c\/h2\u003e\n      \u003cp class=\"body-lg\"\u003eSwipe through the schedule, philosophy, coach, and venue. Everything you need to know about this clinic before you reserve your spot.\u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003cdiv class=\"tt-carousel\" data-autoplay-ms=\"6500\" data-pause-on-hover=\"true\"\u003e\n    \u003cdiv class=\"tt-carousel-track\"\u003e\n\n      \u003c!-- Slide 1: Schedule (tour-aware — Technique Tour timeline \/ MFMF 3-day arc) --\u003e\n      \u003cdiv class=\"tt-carousel-slide tt-slide-card\"\u003e\n        \u003cspan class=\"card-eyebrow\"\u003ea day at the jumps clinic\u003c\/span\u003e\n        \u003ch3 class=\"card-heading\"\u003eWhat 9 AM to 3 PM\u003cbr\u003eactually looks like.\u003c\/h3\u003e\n        \u003cdiv class=\"card-schedule\"\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cspan class=\"time\"\u003e9:00 AM\u003c\/span\u003e\u003cspan class=\"what\"\u003eFlat ground · power forward, brake back, neutral\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cspan class=\"time\"\u003e10:00\u003c\/span\u003e\u003cspan class=\"what\"\u003eVisualize each position next to the jump\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cspan class=\"time\"\u003e10:15\u003c\/span\u003e\u003cspan class=\"what\"\u003eNeutral power approach + application moto\u003csup\u003e*\u003c\/sup\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cspan class=\"time\"\u003e11:45\u003c\/span\u003e\u003cspan class=\"what\"\u003eLunch\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cspan class=\"time\"\u003e12:15 PM\u003c\/span\u003e\u003cspan class=\"what\"\u003eOn-throttle approach + application moto\u003csup\u003e*\u003c\/sup\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cspan class=\"time\"\u003e1:15 PM\u003c\/span\u003e\u003cspan class=\"what\"\u003eOff-throttle approach + application moto\u003csup\u003e*\u003c\/sup\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cspan class=\"time\"\u003e2:00 PM\u003c\/span\u003e\u003cspan class=\"what\"\u003eSections · whips and scrubs only if the group fits\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cspan class=\"time\"\u003e3:00 PM\u003c\/span\u003e\u003cspan class=\"what\"\u003eClass ends\u003c\/span\u003e\n\u003c\/div\u003e\n\u003c\/div\u003e\n        \u003cp class=\"card-footnote\"\u003e* Schedule may shift based on the group's skillset and what the facility offers.\u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Slide 2: Philosophy --\u003e\n      \u003cdiv class=\"tt-carousel-slide tt-slide-card tt-slide-philosophy\"\u003e\n        \u003cspan class=\"card-eyebrow\"\u003ethe philosophy\u003c\/span\u003e\n        \u003ch3 class=\"card-heading\"\u003eSmooth jumps are a side effect\u003cbr\u003eof \u003cspan class=\"accent\"\u003etechnique.\u003c\/span\u003e\n\u003c\/h3\u003e\n        \u003cp class=\"card-body\"\u003eGood jumping is not about sending it harder. It is body position, throttle timing, and a takeoff you can repeat. Build those, and your jumps get \u003cstrong\u003esmoother\u003c\/strong\u003e, more consistent, and more fun.\u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Slide 3: Coach --\u003e\n      \u003cdiv class=\"tt-carousel-slide tt-slide-card\"\u003e\n        \u003cspan class=\"card-eyebrow\"\u003eYour coach\u003c\/span\u003e\n        \u003ch3 class=\"card-heading\"\u003eTrained by Tre.\u003c\/h3\u003e\n        \u003cp class=\"card-body\" style=\"margin-bottom: clamp(14px, 2vw, 20px);\"\u003eTre McCollough is The MX Factory's traveling Technique Tour coach. Based in Austin, TX, Tre brings the MX Factory technique system to riders across the country, teaching the same drill sequence Tyler designed, with the same dedication to building correct habits at every skill level.\u003c\/p\u003e\n        \u003cdiv class=\"card-creds\"\u003e\n          \u003cdiv class=\"item\"\u003e\n\u003cspan class=\"n\"\u003e20\u003c\/span\u003e\u003cspan class=\"l\"\u003eRiders per class\u003c\/span\u003e\n\u003c\/div\u003e\n          \u003cdiv class=\"item\"\u003e\n\u003cspan class=\"n\"\u003e9-3\u003c\/span\u003e\u003cspan class=\"l\"\u003eClass hours\u003c\/span\u003e\n\u003c\/div\u003e\n          \u003cdiv class=\"item\"\u003e\n\u003cspan class=\"n\"\u003e2\u003c\/span\u003e\u003cspan class=\"l\"\u003eYears on tour\u003c\/span\u003e\n\u003c\/div\u003e\n          \u003cdiv class=\"item\"\u003e\n\u003cspan class=\"n\"\u003e1.5K+\u003c\/span\u003e\u003cspan class=\"l\"\u003eRiders coached\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Slide 4: Track --\u003e\n      \u003cdiv class=\"tt-carousel-slide tt-slide-card\"\u003e\n        \u003cspan class=\"card-eyebrow\"\u003ethe track\u003c\/span\u003e\n        \u003ch3 class=\"card-heading\"\u003eOak Hill Raceway.\u003cbr\u003eAlvord, TX.\u003c\/h3\u003e\n        \u003cp class=\"card-body\"\u003eOak Hill Raceway in Alvord, TX is the DFW area's go-to outdoor motocross track, about 45 minutes northwest of Fort Worth. Fast, flowing, and packed with corners and jumps, it has been our best-drawing Texas venue.\u003c\/p\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Slide 5: Action photo --\u003e\n      \u003cdiv class=\"tt-carousel-slide\"\u003e\n        \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/jumps-clinic_tre-DSC03969.jpg?v=1790801711\" srcset=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/jumps-clinic_tre-DSC03969.jpg?v=1790801711 1600w\" sizes=\"(max-width: 720px) 100vw, 1080px\" alt=\"Coach Tre McCollough in the air on a tabletop\" loading=\"lazy\" decoding=\"async\"\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Slide 6: Action photo --\u003e\n      \u003cdiv class=\"tt-carousel-slide\"\u003e\n        \u003cimg src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/jumps-clinic_tre-DSC04033.jpg?v=1790801711\" srcset=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/jumps-clinic_tre-DSC04033.jpg?v=1790801711 1600w\" sizes=\"(max-width: 720px) 100vw, 1080px\" alt=\"Coach Tre McCollough jumping at Spoaks Moto Park\" loading=\"lazy\" decoding=\"async\"\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n    \u003cbutton class=\"tt-carousel-arrow tt-carousel-prev\" aria-label=\"Previous slide\" type=\"button\"\u003e‹\u003c\/button\u003e\n    \u003cbutton class=\"tt-carousel-arrow tt-carousel-next\" aria-label=\"Next slide\" type=\"button\"\u003e›\u003c\/button\u003e\n    \u003cdiv class=\"tt-carousel-dots\" role=\"tablist\" aria-label=\"Slide navigation\"\u003e\n      \u003cbutton class=\"tt-carousel-dot is-active\" data-index=\"0\" aria-label=\"Slide 1\" type=\"button\"\u003e\u003c\/button\u003e\n      \u003cbutton class=\"tt-carousel-dot\" data-index=\"1\" aria-label=\"Slide 2\" type=\"button\"\u003e\u003c\/button\u003e\n      \u003cbutton class=\"tt-carousel-dot\" data-index=\"2\" aria-label=\"Slide 3\" type=\"button\"\u003e\u003c\/button\u003e\n      \u003cbutton class=\"tt-carousel-dot\" data-index=\"3\" aria-label=\"Slide 4\" type=\"button\"\u003e\u003c\/button\u003e\n      \u003cbutton class=\"tt-carousel-dot\" data-index=\"4\" aria-label=\"Slide 5\" type=\"button\"\u003e\u003c\/button\u003e\n      \u003cbutton class=\"tt-carousel-dot\" data-index=\"5\" aria-label=\"Slide 6\" type=\"button\"\u003e\u003c\/button\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n(function(){\n  var carousels = document.querySelectorAll('.tt-carousel');\n  carousels.forEach(function(c){\n    var track = c.querySelector('.tt-carousel-track');\n    var slides = c.querySelectorAll('.tt-carousel-slide');\n    var dots = c.querySelectorAll('.tt-carousel-dot');\n    var prev = c.querySelector('.tt-carousel-prev');\n    var next = c.querySelector('.tt-carousel-next');\n    var autoplayMs = parseInt(c.dataset.autoplayMs || '4500', 10);\n    var pauseOnHover = (c.dataset.pauseOnHover || 'true') === 'true';\n    var n = slides.length;\n    var i = 0;\n    var timer = null;\n    var paused = false;\n\n    function go(idx) {\n      i = ((idx % n) + n) % n;\n      track.style.transform = 'translateX(' + (-i * 100) + '%)';\n      dots.forEach(function(d, di){ d.classList.toggle('is-active', di === i); });\n    }\n    function start() {\n      if (timer) return;\n      timer = setInterval(function(){ if (!paused) go(i + 1); }, autoplayMs);\n    }\n    function stop() { if (timer) { clearInterval(timer); timer = null; } }\n\n    prev.addEventListener('click', function(){ go(i - 1); });\n    next.addEventListener('click', function(){ go(i + 1); });\n    dots.forEach(function(d, di){\n      d.addEventListener('click', function(){ go(di); });\n    });\n\n    if (pauseOnHover) {\n      c.addEventListener('mouseenter', function(){ paused = true; });\n      c.addEventListener('mouseleave', function(){ paused = false; });\n    }\n\n    \/\/ Pause when a video inside is playing; resume when it ends\/pauses\n    c.querySelectorAll('video').forEach(function(v){\n      v.addEventListener('play',  function(){ paused = true; });\n      v.addEventListener('pause', function(){ paused = false; });\n      v.addEventListener('ended', function(){ paused = false; });\n    });\n\n    \/\/ Touch \/ swipe support\n    var startX = null;\n    c.addEventListener('touchstart', function(e){\n      startX = e.touches[0].clientX; paused = true;\n    }, { passive: true });\n    c.addEventListener('touchend', function(e){\n      if (startX === null) return;\n      var dx = e.changedTouches[0].clientX - startX;\n      if (Math.abs(dx) \u003e 40) { go(dx \u003c 0 ? i + 1 : i - 1); }\n      startX = null; paused = false;\n    });\n\n    \/\/ Pause when off-screen, resume when in view (saves CPU)\n    if ('IntersectionObserver' in window) {\n      new IntersectionObserver(function(entries){\n        entries.forEach(function(e){\n          if (e.isIntersecting) { start(); } else { stop(); }\n        });\n      }, { threshold: 0.25 }).observe(c);\n    } else {\n      start();\n    }\n  });\n})();\n\u003c\/script\u003e\n\n\u003c!-- Inline CTA after Carousel --\u003e\n\u003cdiv class=\"section\" style=\"padding-top: 0; border-top: 0;\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-cta\"\u003e\n      \u003cspan class=\"cta-eyebrow\"\u003eLike what you see?\u003c\/span\u003e\n      \u003cbutton class=\"cta tt-secure-cta\" type=\"button\"\u003eSecure My Spot \u003cspan class=\"arrow\"\u003e→\u003c\/span\u003e\u003c\/button\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ============================================================\n     SECTION 6: HOW THE DAY WORKS (jumps methodology, per Carson 2026-09-30)\n     ============================================================ --\u003e\n\u003cdiv class=\"section\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003ehow the day works\u003c\/span\u003e\n      \u003ch2 class=\"h-section\" style=\"margin-top: 18px;\"\u003eFlat ground first.\u003cbr\u003eThen the jump.\u003c\/h2\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"method\"\u003e\n      \u003cp\u003e\u003cstrong\u003eThis class teaches the mechanics of jumping.\u003c\/strong\u003e It is a structured day from 9 to 3 with a plan, and we follow it.\u003c\/p\u003e\n\n      \u003cp\u003e\u003cstrong\u003eThe first hour is on flat ground.\u003c\/strong\u003e Before anyone leaves the ground, every rider dials in three positions: power forward, brake back, and neutral standing. This is the foundation of jumping. Each one becomes an approach to the jump. Brake back is your off-throttle approach. Power forward is your on-throttle approach up the face. Neutral standing is your neutral power approach, holding your speed up the face.\u003c\/p\u003e\n\n      \u003cp\u003e\u003cstrong\u003eNext, we see it before we ride it.\u003c\/strong\u003e On flat ground next to the jump, Tre walks through where each position happens on the jump, so every rider can picture it before trying it.\u003c\/p\u003e\n\n      \u003cp\u003e\u003cstrong\u003eThen we jump, one approach at a time.\u003c\/strong\u003e One to two hours on the neutral power approach. About an hour on the on-throttle approach. Then 30 to 45 minutes on the off-throttle approach. All on one tabletop, so you can focus on your position and throttle instead of a new jump every lap.\u003c\/p\u003e\n\n      \u003cp\u003e\u003cstrong\u003eAfter each one, we take it to the track.\u003c\/strong\u003e Application motos: laps around the track where you use what you just learned on the rest of the jumps.\u003c\/p\u003e\n\n      \u003cp\u003e\u003cstrong\u003eThe last hour is sections.\u003c\/strong\u003e We work a couple of sections that are more challenging than the training tabletop. If it helps the whole group, some of that time may go to whips and scrubs. That is not guaranteed. If it only fits one rider out of twenty, we stay on the plan.\u003c\/p\u003e\n\n      \u003cp\u003e\u003cstrong\u003eAlready took the Technique Tour?\u003c\/strong\u003e This is a separate class. It goes deeper on one thing: jumps.\u003c\/p\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- Inline CTA after Methodology --\u003e\n\u003cdiv class=\"section\" style=\"padding-top: 0; border-top: 0;\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-cta\"\u003e\n      \u003cspan class=\"cta-eyebrow\"\u003eThis is how we teach jumps.\u003c\/span\u003e\n      \u003cbutton class=\"cta tt-secure-cta\" type=\"button\"\u003eSecure My Spot \u003cspan class=\"arrow\"\u003e→\u003c\/span\u003e\u003c\/button\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ============================================================\n     SECTION 7 — TRAINED BY THE BEST (Coach)\n     ============================================================ --\u003e\n\u003cdiv class=\"section\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003eYour coach\u003c\/span\u003e\n      \u003ch2 class=\"h-section\" style=\"margin-top: 18px;\"\u003eTrained by Tre.\u003c\/h2\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"coach\"\u003e\n      \u003cdiv class=\"coach-layout\"\u003e\n        \u003cimg class=\"coach-photo\" src=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/Screenshot_2025-11-04_at_1.08.08_PM_720x.png?v=1768602726\" alt=\"Coach Tre McCollough portrait\" loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"900\"\u003e\n        \u003cdiv class=\"coach-text\"\u003e\n          \u003cp class=\"body-lg\" style=\"margin-bottom: 18px;\"\u003eTre McCollough is The MX Factory's traveling Technique Tour coach. Based in Austin, TX, Tre brings the MX Factory technique system to riders across the country, teaching the same drill sequence Tyler designed, with the same dedication to building correct habits at every skill level.\u003c\/p\u003e\n          \u003cp class=\"body\"\u003eTre coaches both the Technique Tour and the Foundations Tour year-round, driving his van between clinic stops and putting every rider through the same proven curriculum that's transformed 30,000+ students. His patient, fundamentals-first coaching style is built for riders who want to break bad habits and build real, lasting technique.\u003c\/p\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003cdiv class=\"stat-row\"\u003e\n        \u003cdiv class=\"credential\"\u003e\n\u003cspan class=\"n\"\u003e20\u003c\/span\u003e\u003cspan class=\"l\"\u003eRiders per class\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"credential\"\u003e\n\u003cspan class=\"n\"\u003e9-3\u003c\/span\u003e\u003cspan class=\"l\"\u003eClass hours\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"credential\"\u003e\n\u003cspan class=\"n\"\u003e40+\u003c\/span\u003e\u003cspan class=\"l\"\u003eStates traveled\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"credential\"\u003e\n\u003cspan class=\"n\"\u003e2\u003c\/span\u003e\u003cspan class=\"l\"\u003eYears on tour\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"credential\"\u003e\n\u003cspan class=\"n\"\u003e1.5K+\u003c\/span\u003e\u003cspan class=\"l\"\u003eRiders coached\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n\n    \u003c!-- Co-coach sub-card (e.g. Charles). Hidden unless a cocoach:\u003ckey\u003e tag is set. --\u003e\n    \u003cdiv class=\"coach\" style=\"margin-top: 28px;padding-top: 28px;border-top: 1px solid rgba(0,0,0,0.08);display:none\"\u003e\n      \u003cspan class=\"red-tag\" style=\"display:inline-block;margin-bottom: 12px;\"\u003e\u003c\/span\u003e\n      \u003cdiv class=\"coach-layout\"\u003e\n        \u003cimg class=\"coach-photo\" src=\"\" alt=\"Coach  portrait\" loading=\"lazy\" decoding=\"async\" width=\"720\" height=\"900\" style=\"display:none\"\u003e\n        \u003cdiv class=\"coach-text\"\u003e\n          \u003ch3 class=\"h-section\" style=\"font-size: clamp(22px, 3vw, 30px);margin-bottom: 14px;\"\u003e\u003c\/h3\u003e\n          \u003cp class=\"body-lg\"\u003e\u003c\/p\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"stat-row\"\u003e\n        \u003cdiv class=\"credential\"\u003e\n\u003cspan class=\"n\"\u003e\u003c\/span\u003e\u003cspan class=\"l\"\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- Inline CTA after Coach --\u003e\n\u003cdiv class=\"section\" style=\"padding-top: 0; border-top: 0;\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-cta\"\u003e\n      \u003cspan class=\"cta-eyebrow\"\u003eSpend the day on jumps with Tre.\u003c\/span\u003e\n      \u003cbutton class=\"cta tt-secure-cta\" type=\"button\"\u003eSecure My Spot \u003cspan class=\"arrow\"\u003e→\u003c\/span\u003e\u003c\/button\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ============================================================\n     SECTION 8 — THE TRACK \/ VENUE\n     ============================================================ --\u003e\n\u003cdiv class=\"section\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003elocation\u003c\/span\u003e\n      \u003ch2 class=\"h-section\" style=\"margin-top: 18px;\"\u003eOak Hill Raceway.\u003c\/h2\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"venue\"\u003e\n      \u003cp class=\"body-lg\"\u003eOak Hill Raceway in Alvord, TX is the DFW area's go-to outdoor motocross track, about 45 minutes northwest of Fort Worth. Fast, flowing, and packed with corners and jumps, it has been our best-drawing Texas venue.\u003c\/p\u003e\n\n      \u003c!-- Location facts (no emoji icons, clean type) --\u003e\n      \u003cdiv class=\"loc-grid\"\u003e\n        \u003cdiv class=\"loc-cell\"\u003e\n          \u003cspan class=\"loc-label\"\u003eDay\u003c\/span\u003e\n          \u003cspan class=\"loc-value\"\u003eJanuary 18, 2027\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"loc-cell\"\u003e\n          \u003cspan class=\"loc-label\"\u003eTime\u003c\/span\u003e\n          \u003cspan class=\"loc-value\"\u003e9 AM to 3 PM\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"loc-cell\"\u003e\n          \u003cspan class=\"loc-label\"\u003eWhere\u003c\/span\u003e\n          \u003cspan class=\"loc-value\"\u003eAlvord, TX\u003c\/span\u003e\n        \u003c\/div\u003e\n        \u003cdiv class=\"loc-cell\"\u003e\n          \u003cspan class=\"loc-label\"\u003eCost\u003c\/span\u003e\n          \u003cspan class=\"loc-value\"\u003e$347 early bird, $397 public\u003c\/span\u003e\n        \u003c\/div\u003e\n      \u003c\/div\u003e\n\n      \u003c!-- Live map — Google Maps embed (no API key, place-name driven) --\u003e\n      \u003cdiv class=\"loc-map\"\u003e\n        \u003ciframe src=\"https:\/\/maps.google.com\/maps?q=Oak+Hill+Raceway%2C+Alvord%2C+TX\u0026amp;ll=\u0026amp;t=\u0026amp;z=13\u0026amp;ie=UTF8\u0026amp;iwloc=\u0026amp;output=embed\" width=\"100%\" height=\"380\" style=\"border:0; display: block;\" loading=\"lazy\" allowfullscreen=\"\" referrerpolicy=\"no-referrer-when-downgrade\" title=\"Map of Oak Hill Raceway in Alvord, TX\"\u003e\u003c\/iframe\u003e\n        \u003ca class=\"loc-directions\" href=\"https:\/\/www.google.com\/maps\/dir\/?api=1\u0026amp;destination=Oak+Hill+Raceway%2C+Alvord%2C+TX\" target=\"_blank\" rel=\"noopener\"\u003e\n          Get Directions \u003cspan class=\"arrow\"\u003e→\u003c\/span\u003e\n        \u003c\/a\u003e\n      \u003c\/div\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- Inline CTA after Venue --\u003e\n\u003cdiv class=\"section\" style=\"padding-top: 0; border-top: 0;\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-cta\"\u003e\n      \u003cspan class=\"cta-eyebrow\"\u003eReady to ride here?\u003c\/span\u003e\n      \u003cbutton class=\"cta tt-secure-cta\" type=\"button\"\u003eSecure My Spot \u003cspan class=\"arrow\"\u003e→\u003c\/span\u003e\u003c\/button\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\u003c!-- ============================================================\n     SECTION 9: FAQ (jumps)\n     ============================================================ --\u003e\n\u003cdiv class=\"section\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003efaq\u003c\/span\u003e\n      \u003ch2 class=\"h-section\" style=\"margin-top: 18px;\"\u003eBefore you sign up.\u003c\/h2\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"faq\"\u003e\n      \u003cdetails\u003e\n        \u003csummary\u003eWho is this clinic for?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eRiders who can already get around the track on their own and clear a small tabletop. This is not a first-jump or learn-to-ride class.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eDo I need to have taken an MXF class first?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eNo. Registration is open to everyone. If you have not taken an MXF class before, you will check a box at checkout confirming you understand this clinic may be harder without one.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eIs this a private lesson?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eNo. It is a group class of up to 20 riders with a set plan, and we follow it. Coach Tre gives feedback to riders throughout the day, but the plan does not change to fit one rider's goals.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eWhy do we train on one tabletop?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eEverything we teach applies to any jump with a face. Staying on one jump lets you focus on your position and throttle instead of learning a new jump every lap. Application motos let you use it on the rest of the track.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eWill we work on whips and scrubs?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eMaybe, in the last hour, and only if it makes sense for the whole group. It is not guaranteed. The class is built around the mechanics of jumping.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eHow is this different from the Technique Tour?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eThe Technique Tour covers the whole track: body position, cornering, ruts, and jumps. The Jumps Clinic spends the full day on jumps, so it won't be a repeat of what you've already done.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eWhy are there two prices?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003e$347 is the early-bird waitlist price. When registration opens to the public, the price is $397.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eDo I need to bring my own bike and gear?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eYes. Every rider brings their own dirt bike and their own riding gear, including a helmet, boots, goggles, gloves, and protective gear. We do not provide bikes or gear, so show up ready to ride.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eAre e-bikes welcome, and how do I keep mine charged?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eE-bikes are welcome. The one thing to plan for is power. You are responsible for keeping your bike charged for the full day, so come with a plan. You can bring your own generator or coordinate a power source with the track or your truck ahead of time.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eWhat is the age limit for riders?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eNo age minimum. Every rider needs to ride the track without parent help and clear a small tabletop on their own. Ideally, they can pick up their own bike if they fall.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eDo you rent bikes?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eFor camps outside of our home base of Austin, Texas, we do not rent bikes. You can contact us and we can try to source you a bike from the local area.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eDo you offer refunds?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\n\u003cp\u003eTo protect operational planning and nationwide event logistics, the following applies:\u003c\/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cstrong\u003e60+ days before camp date:\u003c\/strong\u003e Full refund available upon written request.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eWithin 60 days of camp date:\u003c\/strong\u003e Registration converts to Training Credit.\u003c\/li\u003e\n\u003cli\u003e\n\u003cstrong\u003eWithin 72 hours of camp start:\u003c\/strong\u003e No refunds or credits issued.\u003c\/li\u003e\n\u003c\/ul\u003e\n\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eDo you provide lunch?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eLunch and water are the rider's responsibility. Bring food, plenty of water, and snacks for a full day on the track.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eCan I drop my kids off with a friend?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eIf a minor will be receiving the lesson and the legal guardian will not be present, it is mandatory that this \u003ca href=\"https:\/\/docs.google.com\/document\/d\/1MpMZFTY3d0UWixs_ojvbKJHr70Gw8BMb-rrBq2mLYzI\/edit?usp=sharing\"\u003econsent form\u003c\/a\u003e is signed and notarized, or else we will not coach the minor.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eWhat if it rains?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eMotocross is an outdoor sport. Clinics go ahead unless track conditions make riding unworkable. All decisions on continuation, relocation, or cancellation due to weather are made at the sole discretion of The MX Factory staff. If a clinic is canceled due to weather, your registration converts to a Training Credit redeemable at any future MXF clinic.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eWho is the trainer?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eTre McCollough, The MX Factory's traveling Technique Tour coach. Tre has coached over 1,500 riders and trained for more than seven years under MX Factory owner Tyler Livesay, teaching the same proven drill system at every skill level across the country.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eHow long is registration open for?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eYou can register from the time registration opens until the night before the clinic, as long as it is not sold out.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- ============================================================\n     SECTION 11 — FINAL CTA\n     ============================================================ --\u003e\n\u003cdiv class=\"final\"\u003e\n  \u003cspan class=\"red-tag\"\u003ereserve your spot\u003c\/span\u003e\n  \u003ch2\u003eTEXAS\u003cbr\u003ejanuary 18\u003c\/h2\u003e\n  \u003cbutton class=\"cta tt-secure-cta\" type=\"button\"\u003e\n    Secure My Spot \u003cspan class=\"arrow\"\u003e→\u003c\/span\u003e\n  \u003c\/button\u003e\n  \u003cdiv class=\"micro\"\u003e$347 early bird · $397 public · 20 spots only · 9 AM to 3 PM\u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- ============================================================\n     STICKY COUNTDOWN HEADER — counts down to registration opening.\n     Opt-in via 0 (intensive only) + a future\n     EBWL release. Sits below the site header; gold bar, dark text.\n     ============================================================ --\u003e\n\u003cstyle\u003e\n  .tt-countdown {\n    position: fixed; top: 0; left: 0; right: 0; z-index: 9998;\n    display: none; align-items: center; justify-content: center; gap: 10px;\n    background: var(--red); color: var(--ink);\n    font-family: 'Aero Matics', 'Barlow Condensed', sans-serif; font-weight: 700;\n    letter-spacing: 0.05em; text-transform: uppercase; line-height: 1;\n    font-size: clamp(12px, 1.4vw, 15px);\n    padding: 9px clamp(12px, 3vw, 28px);\n    box-shadow: 0 4px 16px rgba(0,0,0,0.30);\n  }\n  .tt-countdown.is-visible { display: flex; }\n  .tt-countdown .cd-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--ink); flex: 0 0 auto; animation: tt-cd-pulse 1.3s ease-in-out infinite; }\n  @keyframes tt-cd-pulse { 0%,100% { opacity: 1; } 50% { opacity: .35; } }\n  .tt-countdown .cd-timer { font-weight: 900; font-variant-numeric: tabular-nums; }\n  \/* spinning microseconds (phase 2) — fixed width so the rapid digits never shift layout *\/\n  .tt-countdown .cd-us { font-weight: 900; font-variant-numeric: tabular-nums; display: none; min-width: 7ch; text-align: left; opacity: .82; }\n  .tt-countdown .cd-sep { opacity: .5; }\n  \/* phase 2 (early-bird closing) — faster dot pulse for extra urgency *\/\n  .tt-countdown.is-closing .cd-dot { animation-duration: .55s; }\n  @media (prefers-reduced-motion: reduce) { .tt-countdown .cd-dot { animation: none; } }\n  @media (max-width: 600px) { .tt-countdown .cd-when, .tt-countdown .cd-sep { display: none; } }\n\u003c\/style\u003e\n\u003cdiv class=\"tt-countdown\" id=\"tt-countdown\" role=\"status\" aria-live=\"off\" data-release=\"2099-01-01T00:00:00Z\" data-close=\"\" data-form=\"PREVIEW\" data-enabled=\"0\"\u003e\n  \u003cspan class=\"cd-dot\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\n  \u003cspan class=\"cd-label\" id=\"tt-cd-label\"\u003eRegistration opens in\u003c\/span\u003e\n  \u003cspan class=\"cd-timer\" id=\"tt-cd-timer\"\u003e\u003c\/span\u003e\n  \u003cspan class=\"cd-us\" id=\"tt-cd-us\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\n  \u003cspan class=\"cd-sep\"\u003e·\u003c\/span\u003e\n  \u003cspan class=\"cd-when\" id=\"tt-cd-when\"\u003edate TBD\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cscript\u003e\n(function(){\n  var bar = document.getElementById('tt-countdown'); if (!bar) return;\n  if (bar.getAttribute('data-enabled') !== '1') return;\n  var form = bar.getAttribute('data-form');\n  var hasForm = form \u0026\u0026 form.indexOf('{{') !== 0 \u0026\u0026 form.indexOf('}}') === -1;\n  var OPEN  = Date.parse(bar.getAttribute('data-release'));\n  var CLOSE = Date.parse(bar.getAttribute('data-close'));   \/\/ NaN\/empty =\u003e no phase 2\n  if (!hasForm || isNaN(OPEN)) return;\n  \/\/ The \"end\" of the whole widget is CLOSE (24h urgency) if present, else OPEN.\n  var END = isNaN(CLOSE) ? OPEN : CLOSE;\n  if (Date.now() \u003e= END) return;                            \/\/ entire window already passed\n\n  var labelEl = document.getElementById('tt-cd-label');\n  var timer   = document.getElementById('tt-cd-timer');\n  var usEl    = document.getElementById('tt-cd-us');\n  var whenEl  = document.getElementById('tt-cd-when');\n  var OPEN_LABEL  = 'Registration opens in';\n  var OPEN_WHEN   = 'date TBD';\n  var CLOSE_LABEL = 'Early-bird registration closes in';\n  var CLOSE_WHEN  = 'Then doors open to our 500,000+ YouTube subscribers \u0026 40,000-member email list';\n  var hasClose = !isNaN(CLOSE) \u0026\u0026 CLOSE \u003e OPEN;\n\n  \/\/ High-resolution clock so the microseconds field spins smoothly (Date.now is ms-only).\n  var t0 = Date.now(), hp = (window.performance \u0026\u0026 performance.now);\n  var p0 = hp ? performance.now() : 0;\n  function nowHR(){ return hp ? (t0 + (performance.now() - p0)) : Date.now(); }\n\n  function findHeader(){\n    var s=['#shopify-section-sections--header','.shopify-section-header','header.site-header','.site-header','header[role=\"banner\"]','header'];\n    for (var i=0;i\u003cs.length;i++){ var e=document.querySelector(s[i]); if (e \u0026\u0026 e.offsetHeight\u003e0) return e; }\n    return null;\n  }\n  var headerEl = findHeader();\n  function place(){ bar.style.top = (headerEl ? Math.max(0, headerEl.getBoundingClientRect().bottom) : 0) + 'px'; }\n  function p2(n){ return (n\u003c10?'0':'')+n; }\n  function p6(n){ n=String(n); while(n.length\u003c6) n='0'+n; return n; }\n\n  var raf, phase = null;\n  function frame(){\n    var now = nowHR();\n    if (now \u003e= END){ bar.classList.remove('is-visible'); if (raf) cancelAnimationFrame(raf); return; }\n    var closing = hasClose \u0026\u0026 now \u003e= OPEN;\n    var target  = closing ? CLOSE : OPEN;\n    var rem = target - now;                                 \/\/ float ms remaining\n    var d=Math.floor(rem\/86400000), h=Math.floor(rem\/3600000)%24,\n        m=Math.floor(rem\/60000)%60, s=Math.floor(rem\/1000)%60;\n    timer.textContent = (d\u003e0 ? d+'d ' : '') + p2(h)+'h '+p2(m)+'m '+p2(s)+'s';\n    if (closing){\n      \/\/ microseconds remaining inside the current second — spins 999999 -\u003e 000000 each sec\n      var us = Math.floor((rem % 1000) * 1000); us = ((us % 1000000) + 1000000) % 1000000;\n      usEl.textContent = '.' + p6(us);\n      if (phase !== 'close'){ phase='close'; usEl.style.display='inline-block'; labelEl.textContent=CLOSE_LABEL; whenEl.textContent=CLOSE_WHEN; bar.classList.add('is-closing'); }\n    } else if (phase !== 'open'){\n      phase='open'; usEl.style.display='none'; labelEl.textContent=OPEN_LABEL; whenEl.textContent=OPEN_WHEN; bar.classList.remove('is-closing');\n    }\n    raf = (window.requestAnimationFrame || function(f){ return setTimeout(f, 33); })(frame);\n  }\n  bar.classList.add('is-visible'); place();\n  raf = (window.requestAnimationFrame || function(f){ return setTimeout(f, 33); })(frame);\n  window.addEventListener('scroll', place, {passive:true});\n  window.addEventListener('resize', place);\n  window.addEventListener('load', function(){ headerEl = findHeader(); place(); });\n})();\n\u003c\/script\u003e\n\n\n\u003c!-- ============================================================\n     STICKY TOP SCARCITY BAR\n     Conditional — shows ONLY when scarcity tier is \"low\"\n     (≤ 5 spots remaining OR ≥ 90% sold out). Pure alarm, no CTA.\n     Wired to the same render() function as the in-page scarcity widget.\n     ============================================================ --\u003e\n\u003cdiv class=\"tt-sticky-scarcity\" id=\"tt-sticky-scarcity\" role=\"status\" aria-live=\"polite\"\u003e\n  \u003cspan class=\"pulse\" aria-hidden=\"true\"\u003e\u003c\/span\u003e\n  \u003cspan class=\"label\"\u003e\u003c\/span\u003e\n  \u003cspan class=\"sep\" aria-hidden=\"true\"\u003e·\u003c\/span\u003e\n  \u003cspan class=\"count\"\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- ============================================================\n     STICKY BOTTOM CTA BAR\n     Slides up from the bottom of viewport when the top buy box is\n     scrolled out of view. Click → smooth-scrolls back to the buy\n     box (quantity selector \/ Add to Cart form).\n     ============================================================ --\u003e\n\u003cdiv class=\"tt-sticky-cta\" id=\"tt-sticky-cta\" role=\"region\" aria-label=\"Reserve your spot\" data-handle=\"jumps-clinic-oak-hill-raceway-alvord-tx-january-18-2027\"\u003e\n  \u003cdiv class=\"lhs\"\u003e\n    \u003cdiv class=\"label\"\u003eOak Hill Raceway · january 18\u003c\/div\u003e\n    \u003cdiv class=\"title\"\u003e$347 · \u003cspan class=\"tt-sticky-remain\"\u003e20 of 20\u003c\/span\u003e spots left\u003c\/div\u003e\n  \u003c\/div\u003e\n  \u003cbutton class=\"cta-btn tt-secure-cta\" type=\"button\"\u003e\n    Secure My Spot \u003cspan class=\"arrow\"\u003e→\u003c\/span\u003e\n  \u003c\/button\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- ============================================================\n     SCROLL-TO-BUY-BOX JS — wires every .tt-secure-cta to smooth\n     scroll back up to the product buy form. Also handles sticky\n     bar visibility (slides in once buy form leaves viewport).\n     ============================================================ --\u003e\n\u003cscript\u003e\n(function(){\n  \/\/ Scroll ALL THE WAY to the top of the page. Simple + reliable — the user\n  \/\/ wants the buy section visible, and that section sits at the top of the\n  \/\/ product page just below the site nav. Going to top:0 always works.\n  function scrollToBuy() {\n    window.scrollTo({top: 0, behavior: 'smooth'});\n  }\n\n  \/\/ Wire all \"Secure My Spot\" CTAs (event delegation — works for any\n  \/\/ .tt-secure-cta added now or later, including the sticky bar)\n  document.addEventListener('click', function(e){\n    var btn = e.target.closest('.tt-secure-cta');\n    if (btn) { e.preventDefault(); scrollToBuy(); }\n  });\n\n  \/\/ Sticky bar visibility — show once the buy form scrolls out of view\n  var bar = document.getElementById('tt-sticky-cta');\n  if (!bar) return;\n  var watchSelectors = ['form[action*=\"\/cart\/add\"]', '.product__quantity', '.product-single__quantity', '.product-form__quantity'];\n  var watchEl = null;\n  for (var i = 0; i \u003c watchSelectors.length; i++) {\n    watchEl = document.querySelector(watchSelectors[i]);\n    if (watchEl) break;\n  }\n  if (watchEl \u0026\u0026 'IntersectionObserver' in window) {\n    new IntersectionObserver(function(entries){\n      entries.forEach(function(e){ bar.classList.toggle('is-visible', !e.isIntersecting); });\n    }, {threshold: 0}).observe(watchEl);\n  } else {\n    \/\/ Fallback: show once we've scrolled past 600px\n    window.addEventListener('scroll', function(){\n      bar.classList.toggle('is-visible', window.scrollY \u003e 600);\n    }, {passive: true});\n  }\n\n  \/\/ ----- SOLD OUT detection: swap all CTA text to \"Join the Waitlist\" -----\n  function getHandle() {\n    var dh = bar.dataset \u0026\u0026 bar.dataset.handle;\n    if (dh) return dh;\n    var m = location.pathname.match(\/\\\/products\\\/([^\/?#]+)\/);\n    return m ? m[1] : '';\n  }\n  function applySoldOutCTAs() {\n    var label = 'Join the Waitlist \u003cspan class=\"arrow\"\u003e→\u003c\/span\u003e';\n    document.querySelectorAll('.tt-secure-cta').forEach(function(btn){\n      btn.innerHTML = label;\n      btn.classList.add('is-waitlist');\n    });\n    \/\/ Also update sticky bar's left-side title block to read \"Sold out · join waitlist\"\n    var stickyTitle = bar.querySelector('.title');\n    var stickyLabel = bar.querySelector('.label');\n    if (stickyTitle) stickyTitle.textContent = 'Sold out. Join the waitlist';\n    if (stickyLabel) stickyLabel.textContent = 'Be first to know when a spot opens';\n  }\n  var handle = getHandle();\n  if (handle) {\n    fetch('\/products\/' + handle + '.js', {credentials: 'same-origin'})\n      .then(function(r){ return r.ok ? r.json() : null; })\n      .then(function(p){\n        if (!p || !p.variants) return;\n        var anyAvailable = p.variants.some(function(v){ return v.available === true; });\n        if (!anyAvailable) applySoldOutCTAs();\n      })\n      .catch(function(){});\n  }\n})();\n\u003c\/script\u003e\n\n\n\u003c!-- ============================================================\n     SECTION 12: SCHEMA.ORG (jumps)\n     ============================================================ --\u003e\n\u003cscript type=\"application\/ld+json\"\u003e\n{\n \"@context\": \"https:\/\/schema.org\",\n \"@graph\": [\n  {\n   \"@type\": \"Course\",\n   \"@id\": \"https:\/\/themxfactory.com\/products\/jumps-clinic-oak-hill-raceway-alvord-tx-january-18-2027#course\",\n   \"name\": \"Jumps Clinic · Oak Hill Raceway, Alvord, TX\",\n   \"description\": \"One-day motocross jumps clinic with Coach Tre McCollough: power forward, brake back, and neutral standing positions on flat ground, then the neutral power, on-throttle, and off-throttle approaches on a tabletop, with application motos and jump sections. For riders who can already clear a small tabletop.\",\n   \"provider\": {\n    \"@type\": \"Organization\",\n    \"name\": \"The MX Factory\",\n    \"url\": \"https:\/\/themxfactory.com\"\n   },\n   \"instructor\": {\n    \"@type\": \"Person\",\n    \"name\": \"Tre McCollough\"\n   },\n   \"courseMode\": \"in-person\",\n   \"timeRequired\": \"PT6H\",\n   \"hasCourseInstance\": {\n    \"@type\": \"CourseInstance\",\n    \"courseMode\": \"in-person\",\n    \"startDate\": \"2027-01-18T09:00:00-05:00\",\n    \"endDate\": \"2027-01-18T15:00:00-05:00\",\n    \"location\": {\n     \"@type\": \"Place\",\n     \"name\": \"Oak Hill Raceway\",\n     \"address\": {\n      \"@type\": \"PostalAddress\",\n      \"addressLocality\": \"Alvord, TX\",\n      \"addressCountry\": \"US\"\n     }\n    },\n    \"offers\": {\n     \"@type\": \"Offer\",\n     \"price\": \"347.00\",\n     \"priceCurrency\": \"USD\",\n     \"url\": \"https:\/\/themxfactory.com\/products\/jumps-clinic-oak-hill-raceway-alvord-tx-january-18-2027\"\n    }\n   }\n  },\n  {\n   \"@type\": \"FAQPage\",\n   \"@id\": \"https:\/\/themxfactory.com\/products\/jumps-clinic-oak-hill-raceway-alvord-tx-january-18-2027#faq\",\n   \"mainEntity\": [\n    {\n     \"@type\": \"Question\",\n     \"name\": \"Who is this clinic for?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Riders who can already get around the track on their own and clear a small tabletop. This is not a first-jump or learn-to-ride class.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"Do I need to have taken an MXF class first?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"No. Registration is open to everyone. If you have not taken an MXF class before, you will check a box at checkout confirming you understand this clinic may be harder without one.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"Is this a private lesson?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"No. It is a group class of up to 20 riders with a set plan, and we follow it. Coach Tre gives feedback to riders throughout the day, but the plan does not change to fit one rider's goals.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"Why do we train on one tabletop?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Everything we teach applies to any jump with a face. Staying on one jump lets you focus on your position and throttle instead of learning a new jump every lap. Application motos let you use it on the rest of the track.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"Will we work on whips and scrubs?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Maybe, in the last hour, and only if it makes sense for the whole group. It is not guaranteed. The class is built around the mechanics of jumping.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"How is this different from the Technique Tour?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"The Technique Tour covers the whole track: body position, cornering, ruts, and jumps. The Jumps Clinic spends the full day on jumps, so it won't be a repeat of what you've already done.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"Why are there two prices?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"$347 is the early-bird waitlist price. When registration opens to the public, the price is $397.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"Do I need to bring my own bike and gear?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Yes. Every rider brings their own dirt bike and their own riding gear, including a helmet, boots, goggles, gloves, and protective gear. We do not provide bikes or gear, so show up ready to ride.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"Are e-bikes welcome, and how do I keep mine charged?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"E-bikes are welcome. The one thing to plan for is power. You are responsible for keeping your bike charged for the full day, so come with a plan. You can bring your own generator or coordinate a power source with the track or your truck ahead of time.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"What is the age limit for riders?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"No age minimum. Every rider needs to ride the track without parent help and clear a small tabletop on their own. Ideally, they can pick up their own bike if they fall.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"Do you rent bikes?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"For camps outside of our home base of Austin, Texas, we do not rent bikes. You can contact us and we can try to source you a bike from the local area.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"Do you offer refunds?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"To protect operational planning and nationwide event logistics, the following applies:  60+ days before camp date: Full refund available upon written request.  Within 60 days of camp date: Registration converts to Training Credit.  Within 72 hours of camp start: No refunds or credits issued.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"Do you provide lunch?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Lunch and water are the rider's responsibility. Bring food, plenty of water, and snacks for a full day on the track.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"Can I drop my kids off with a friend?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"If a minor will be receiving the lesson and the legal guardian will not be present, it is mandatory that this consent form is signed and notarized, or else we will not coach the minor.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"What if it rains?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Motocross is an outdoor sport. Clinics go ahead unless track conditions make riding unworkable. All decisions on continuation, relocation, or cancellation due to weather are made at the sole discretion of The MX Factory staff. If a clinic is canceled due to weather, your registration converts to a Training Credit redeemable at any future MXF clinic.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"Who is the trainer?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"Tre McCollough, The MX Factory's traveling Technique Tour coach. Tre has coached over 1,500 riders and trained for more than seven years under MX Factory owner Tyler Livesay, teaching the same proven drill system at every skill level across the country.\"\n     }\n    },\n    {\n     \"@type\": \"Question\",\n     \"name\": \"How long is registration open for?\",\n     \"acceptedAnswer\": {\n      \"@type\": \"Answer\",\n      \"text\": \"You can register from the time registration opens until the night before the clinic, as long as it is not sold out.\"\n     }\n    }\n   ]\n  }\n ]\n}\n\u003c\/script\u003e\n\n\n\u003c!-- ============================================================\n     SCARCITY JS — runs after DOM ready, polls \/products\/{handle}.js\n     ============================================================ --\u003e\n\u003cscript\u003e\n(function(){\n  var el = document.querySelector('.tt .tt-scarcity');\n  if (!el) return;\n\n  var maxSpots      = parseInt(el.dataset.maxSpots || '30', 10);\n  var lowThreshold  = parseInt(el.dataset.lowThreshold || '3', 10);\n  var showThreshold = parseInt(el.dataset.showThreshold || '50', 10);\n  var pollSeconds   = parseInt(el.dataset.pollSeconds || '120', 10);\n  var handleOverride = (el.dataset.handle || '').trim().replace(\/^\\{\\{.*\\}\\}$\/, '');\n\n  function getHandle() {\n    if (handleOverride) return handleOverride;\n    var m = location.pathname.match(\/\\\/products\\\/([^\/?#]+)\/);\n    return m ? m[1] : '';\n  }\n\n  \/\/ SMART scarcity phrasing — picks whichever framing induces the most urgency:\n  \/\/   ≤3 remaining  → \"Only X spots left\" (concrete tiny number = panic)\n  \/\/   ≤5 remaining  → \"Only X spots left\"\n  \/\/   ≥90% full     → \"Almost full: X% sold out\"\n  \/\/   ≥70% full     → \"X% sold out\"  (works for both Tyler 30-cap and Tre 20-cap)\n  \/\/   under 70%     → hidden (no false urgency)\n  function tier(remaining, total) {\n    if (remaining \u003c= 0) return { state: 'soldout', label: 'Sold out. Join the waitlist', count: '0 of ' + total + ' spots' };\n    var pctFull = ((total - remaining) \/ total) * 100;\n    var pctText = Math.round(pctFull);\n\n    if (remaining \u003c= 3) {\n      return { state: 'low', label: '🔥 Only \u003cspan class=\"accent\"\u003e' + remaining + '\u003c\/span\u003e ' + (remaining === 1 ? 'spot' : 'spots') + ' left', count: pctText + '% sold out' };\n    }\n    if (remaining \u003c= lowThreshold) {  \/\/ default 5\n      return { state: 'low', label: '🔥 Only \u003cspan class=\"accent\"\u003e' + remaining + '\u003c\/span\u003e spots left', count: pctText + '% sold out' };\n    }\n    if (pctFull \u003e= 90) {\n      return { state: 'low', label: 'Almost full: \u003cspan class=\"accent\"\u003e' + pctText + '%\u003c\/span\u003e sold out', count: remaining + ' spots left' };\n    }\n    if (pctFull \u003e= showThreshold) {  \/\/ default 70\n      return { state: 'go-fast', label: '\u003cspan class=\"accent\"\u003e' + pctText + '%\u003c\/span\u003e sold out', count: remaining + ' spots left' };\n    }\n    if (total \u003c= 10) {  \/\/ small-cap classes (8-rider Intensive): always show the live spot count\n      return { state: (remaining \u003c= lowThreshold ? 'low' : 'go-fast'),\n               label: '🔥 Only \u003cspan class=\"accent\"\u003e' + remaining + '\u003c\/span\u003e ' + (remaining === 1 ? 'spot' : 'spots') + ' left',\n               count: remaining + ' of ' + total + ' spots' };\n    }\n    return null;  \/\/ hidden\n  }\n\n  function render(remaining, total) {\n    var t = tier(remaining, total);\n    var stickyTop = document.getElementById('tt-sticky-scarcity');\n    if (!t) {\n      el.classList.remove('is-visible');\n      if (stickyTop) stickyTop.classList.remove('is-visible');\n      return;\n    }\n    el.classList.add('is-visible');\n    el.classList.toggle('is-low',     t.state === 'low');\n    el.classList.toggle('is-soldout', t.state === 'soldout');\n    el.querySelector('.label').innerHTML = t.label;\n    el.querySelector('.count').textContent = t.count;\n    var pctFull = ((total - remaining) \/ total) * 100;\n    el.querySelector('.bar .fill').style.width = Math.max(0, Math.min(100, pctFull)) + '%';\n\n    \/\/ STICKY TOP SCARCITY BAR — shows whenever the in-page widget shows\n    \/\/ (≥70% full, ≤5 spots, or any state where tier() returned non-null).\n    \/\/ The label text reuses the exact same smart phrasing from tier() —\n    \/\/ \"X% sold out\" at moderate, \"Only X spots left\" at low, etc.\n    if (stickyTop) {\n      stickyTop.classList.add('is-visible');\n      stickyTop.classList.toggle('is-low',     t.state === 'low');\n      stickyTop.classList.toggle('is-soldout', t.state === 'soldout');\n      stickyTop.querySelector('.label').innerHTML = t.label;\n      stickyTop.querySelector('.count').textContent = t.count;\n    }\n  }\n\n  \/\/ FIRST: try baked-in inventory from data attribute (set by the generator at\n  \/\/ build time via Shopify Admin API). This is the reliable path — Shopify's\n  \/\/ public \/products\/{handle}.js endpoint hides inventory_quantity by default.\n  function getBakedInventory() {\n    var raw = (el.dataset.currentInventory || '').trim();\n    if (!raw) return null;\n    var n = parseInt(raw, 10);\n    return isNaN(n) ? null : n;\n  }\n\n  function fetchInventory() {\n    \/\/ 1. If generator baked inventory in, use that\n    var baked = getBakedInventory();\n    if (baked !== null) {\n      render(baked, maxSpots);\n      return;\n    }\n    \/\/ 2. Otherwise try the public storefront endpoint (works only if merchant\n    \/\/    has \"Show inventory count\" enabled on the storefront)\n    var handle = getHandle();\n    if (!handle) return;\n    fetch('\/products\/' + handle + '.js', { credentials: 'same-origin' })\n      .then(function(r){ return r.ok ? r.json() : null; })\n      .then(function(p){\n        if (!p || !p.variants || !p.variants.length) return;\n        var v = p.variants[0];\n        var qty = (typeof v.inventory_quantity === 'number') ? v.inventory_quantity : null;\n        if (qty === null || qty === undefined) { el.classList.remove('is-visible'); return; }\n        render(qty, maxSpots);\n      })\n      .catch(function(){});\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', fetchInventory);\n  } else {\n    fetchInventory();\n  }\n  \/\/ Only poll if we DON'T have baked-in inventory (otherwise no point polling)\n  if (pollSeconds \u003e 0 \u0026\u0026 getBakedInventory() === null) setInterval(fetchInventory, pollSeconds * 1000);\n})();\n\u003c\/script\u003e\n\n\u003c!-- ============================================================\n     BULLETPROOF LAYOUT FIX — RELOCATE .tt OUT OF THE RIGHT COLUMN\n\n     Shopify product pages render gallery (LEFT column) + title \/\n     price \/ buy form \/ description (RIGHT column) as a 2-column grid.\n     Our .tt section lives in the description, which is in the RIGHT\n     column. Right column is usually SHORTER than the gallery (because\n     gallery has thumbnails + tall poster). So .tt's full-bleed\n     section starts where the right column ends, which is vertically\n     BESIDE the lower portion of the gallery — causing visual overlap.\n\n     This script finds the product grid wrapper and MOVES the .tt\n     section so it becomes a sibling AFTER the grid. Now .tt lives\n     below both columns and can never overlap.\n\n     Safe + idempotent: runs on DOMContentLoaded and window.load,\n     and bails if already relocated.\n     ============================================================ --\u003e\n\u003cscript\u003e\n(function(){\n  function relocateTT() {\n    var tt = document.querySelector('section.tt');\n    if (!tt || tt.dataset.ttRelocated === '1') return;\n\n    \/\/ Find the product grid that contains both columns. Try multiple\n    \/\/ Impulse + Dawn + common-theme selectors in priority order.\n    var candidates = [\n      '.grid--product-images--partial',\n      '.product-single__container',\n      '.product-single',\n      '.product__container',\n      '.page-content--product .page-width',\n      '.page-content--product'\n    ];\n    var grid = null;\n    for (var i = 0; i \u003c candidates.length; i++) {\n      var el = document.querySelector(candidates[i]);\n      \/\/ Must contain the .tt AND be an ancestor (so moving past it is valid)\n      if (el \u0026\u0026 el.contains(tt) \u0026\u0026 el !== tt) { grid = el; break; }\n    }\n    if (!grid || !grid.parentNode) return;\n\n    \/\/ Insert .tt as a sibling AFTER the grid wrapper\n    grid.parentNode.insertBefore(tt, grid.nextSibling);\n    tt.dataset.ttRelocated = '1';\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', relocateTT);\n  } else {\n    relocateTT();\n  }\n  window.addEventListener('load', relocateTT);\n})();\n\u003c\/script\u003e\n\n\u003c!-- ============================================================\n     VERTICAL-CENTER the buy column with the poster gallery.\n     Impulse's `.grid--product-images--partial` is flexbox-ish but\n     the left column is `position: sticky`, so `align-items: center`\n     on the parent doesn't reliably work. JS measures heights and\n     applies a transform to the right column.\n     Desktop only (\u003e= 750px). Re-runs on resize + ResizeObserver.\n     ============================================================ --\u003e\n\u003cscript\u003e\n(function(){\n  var DESKTOP_BREAKPOINT = 750;\n  function alignBuyColumn() {\n    if (window.innerWidth \u003c DESKTOP_BREAKPOINT) {\n      var clear = document.querySelector('.product-single__meta');\n      if (clear) clear.style.transform = '';\n      return;\n    }\n    var grid = document.querySelector('.grid--product-images--partial');\n    if (!grid) return;\n    var gallery = grid.querySelector('.grid__item, .product-single__sticky, .product__media-list, [data-product-images]');\n    var meta = document.querySelector('.product-single__meta');\n    if (!gallery || !meta) return;\n    \/\/ Reset before measuring to avoid feedback loop\n    meta.style.transform = '';\n    var galleryH = gallery.getBoundingClientRect().height;\n    var metaH = meta.getBoundingClientRect().height;\n    if (galleryH \u003e metaH + 20) {\n      var offset = (galleryH - metaH) \/ 2;\n      meta.style.transform = 'translateY(' + offset + 'px)';\n    }\n  }\n\n  function schedule() {\n    requestAnimationFrame(alignBuyColumn);\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', schedule);\n  } else {\n    schedule();\n  }\n  window.addEventListener('load', schedule);\n  window.addEventListener('resize', schedule);\n\n  \/\/ Re-measure after late images \/ fonts settle\n  if (window.ResizeObserver) {\n    var ro = new ResizeObserver(schedule);\n    var grid = document.querySelector('.grid--product-images--partial');\n    if (grid) ro.observe(grid);\n  }\n  \/\/ One last nudge after a beat for slow-loading galleries\n  setTimeout(schedule, 800);\n  setTimeout(schedule, 2200);\n})();\n\u003c\/script\u003e\n\n\n\u003c!-- ============================================================\n     FULL-BLEED LAYOUT FIX\n     Shopify product descriptions live inside a constrained column\n     (not centered on the page), so the classic\n     `width: 100vw; margin-left: -50vw; left: 50%` trick gives\n     wrong results — the section bleeds left under the gallery and\n     overflows right past the viewport.\n\n     This script measures the section's true offset from the page\n     edges and applies precise negative margins so it always\n     stretches edge-to-edge regardless of which column it lives in.\n     Re-runs on resize, after fonts load, and via ResizeObserver\n     when the parent column shifts.\n     ============================================================ --\u003e\n\u003cscript\u003e\n(function(){\n  function bleed(el) {\n    \/\/ Reset before measuring (otherwise our previous values throw it off)\n    el.style.marginLeft = '0';\n    el.style.marginRight = '0';\n    el.style.width = '';\n    el.style.maxWidth = '';\n    var rect = el.getBoundingClientRect();\n    var docWidth = document.documentElement.clientWidth;\n    var leftOffset = rect.left;\n    var rightOffset = docWidth - rect.right;\n    el.style.marginLeft = -leftOffset + 'px';\n    el.style.marginRight = -rightOffset + 'px';\n    el.style.width = docWidth + 'px';\n    el.style.maxWidth = docWidth + 'px';\n  }\n  function bleedAll() {\n    document.querySelectorAll('.tt').forEach(bleed);\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', bleedAll);\n  } else {\n    bleedAll();\n  }\n  window.addEventListener('load', bleedAll);  \/\/ After fonts + images\n  window.addEventListener('resize', bleedAll);\n  \/\/ Watch for parent-column resize too (e.g. theme switches mobile\/desktop)\n  if ('ResizeObserver' in window) {\n    var ro = new ResizeObserver(bleedAll);\n    ro.observe(document.body);\n  }\n})();\n\u003c\/script\u003e\n\n\n\u003c!-- ============================================================\n     INJECT QUANTITY SELECTOR INTO THE BUY FORM\n     The Impulse theme doesn't render a quantity selector for this\n     product type. We inject a styled +\/- selector inside the\n     cart-add form, just above the ADD TO CART button, so users can\n     register multiple riders in one transaction.\n     ============================================================ --\u003e\n\u003cscript\u003e\n(function(){\n  function injectQty() {\n    var forms = document.querySelectorAll('form[action*=\"\/cart\/add\"]');\n    forms.forEach(function(form){\n      \/\/ Skip if inside our .tt section, or already injected\n      if (form.closest('.tt')) return;\n      if (form.querySelector('.tt-qty-selector')) return;\n\n      \/\/ Ensure a quantity input exists in the form so Shopify reads it\n      var hidden = form.querySelector('input[name=\"quantity\"]');\n      if (!hidden) {\n        hidden = document.createElement('input');\n        hidden.type = 'hidden';\n        hidden.name = 'quantity';\n        hidden.value = '1';\n        form.appendChild(hidden);\n      }\n\n      \/\/ Read coach's rider cap from the scarcity widget (data-max-spots)\n      var scarcityEl = document.querySelector('.tt-scarcity[data-max-spots]');\n      var maxQty = 30;  \/\/ sensible default (Tyler cap)\n      if (scarcityEl) maxQty = parseInt(scarcityEl.dataset.maxSpots, 10) || 30;\n\n      \/\/ Build the selector\n      var wrap = document.createElement('div');\n      wrap.className = 'tt-qty-selector';\n      wrap.innerHTML =\n        '\u003cspan class=\"tt-qty-label\"\u003eRiders\u003c\/span\u003e' +\n        '\u003cdiv class=\"tt-qty-controls\"\u003e' +\n          '\u003cbutton type=\"button\" class=\"tt-qty-btn\" data-delta=\"-1\" aria-label=\"Decrease quantity\"\u003e\u0026minus;\u003c\/button\u003e' +\n          '\u003cinput type=\"number\" class=\"tt-qty-value\" value=\"' + (hidden.value || '1') + '\" min=\"1\" max=\"' + maxQty + '\" inputmode=\"numeric\"\u003e' +\n          '\u003cbutton type=\"button\" class=\"tt-qty-btn\" data-delta=\"1\" aria-label=\"Increase quantity\"\u003e+\u003c\/button\u003e' +\n        '\u003c\/div\u003e';\n\n      \/\/ Insert BEFORE the first visible submit button (ADD TO CART)\n      var btn = form.querySelector('button[name=\"add\"], button[type=\"submit\"], input[type=\"submit\"]');\n      if (btn) {\n        var anchor = btn.closest('.product-form__buttons, .product-single__form, .product-form, fieldset') || btn;\n        (anchor === btn ? form : anchor).insertBefore(wrap, btn.closest('.product-form__buttons') || btn);\n      } else {\n        form.appendChild(wrap);\n      }\n\n      \/\/ Wire up controls\n      var valInput = wrap.querySelector('.tt-qty-value');\n      function commit(v) {\n        v = Math.max(1, Math.min(maxQty, parseInt(v, 10) || 1));\n        valInput.value = v;\n        hidden.value = v;\n        hidden.dispatchEvent(new Event('change', {bubbles: true}));\n      }\n      wrap.querySelectorAll('.tt-qty-btn').forEach(function(b){\n        b.addEventListener('click', function(e){\n          e.preventDefault();\n          var delta = parseInt(b.dataset.delta, 10);\n          commit((parseInt(valInput.value, 10) || 1) + delta);\n        });\n      });\n      valInput.addEventListener('input',  function(){ commit(valInput.value); });\n      valInput.addEventListener('change', function(){ commit(valInput.value); });\n    });\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', injectQty);\n  } else {\n    injectQty();\n  }\n  \/\/ Re-run on load too in case Impulse rebuilds the form async\n  window.addEventListener('load', injectQty);\n})();\n\n\/* ============================================================\n   REQUIRED ACKNOWLEDGMENT GATE\n   These are bring-your-own-bike Technique Tour classes, NOT\n   learn-to-ride and we do NOT provide bikes. Riders must\n   confirm they own a bike + gear and can navigate the track\n   before they can check out. Gates ADD TO CART + Shop Pay.\n   ============================================================ *\/\n(function () {\n  \/\/ 2026-07-09: re-enabled per Carson, but SKIP EBWL-gated pages. The checkbox was\n  \/\/ disabled store-wide on 2026-07-03 because it held up checkout on the intensive\n  \/\/ launch (an EBWL\/waitlist-gated page). Same detection idiom the gate script below\n  \/\/ uses: if this product has an ebwl:\u003cformId\u003e tag, PREVIEW resolves to a real\n  \/\/ id and we bail so the checkbox never touches the waitlist form.\n  var EBWL_FORM = 'PREVIEW';\n  var hasGate = EBWL_FORM \u0026\u0026 EBWL_FORM.indexOf('{{') !== 0 \u0026\u0026 EBWL_FORM.indexOf('}}') === -1;\n  var ACK_RELEASE = window.__ttPreviewOpen ? 0 : Date.parse('2099-01-01T00:00:00Z');\n  function inWaitlist(){ return hasGate \u0026\u0026 !isNaN(ACK_RELEASE) \u0026\u0026 Date.now() \u003c ACK_RELEASE; }\n  var ACK_TEXT = 'I own a dirt bike and the necessary gear, I can get around the track on my own and clear a small tabletop, and if I have not taken an MXF class before, I understand this clinic may be harder without one.';\n  var soldOut = false;   \/\/ set true once \/products\/{handle}.js reports no available variant\n  var syncs = [];        \/\/ re-run every form's sync() when availability resolves\n  function injectAck() {\n    if (inWaitlist()) return;\n    var forms = document.querySelectorAll('form[action*=\"\/cart\/add\"]');\n    forms.forEach(function (form) {\n      if (form.closest('.tt')) return;            \/\/ skip our own section\n      if (form.querySelector('.tt-ack')) return;  \/\/ already injected\n\n      var btn = form.querySelector('button[name=\"add\"], button[type=\"submit\"], input[type=\"submit\"]');\n      var dyn = form.querySelector('.shopify-payment-button');  \/\/ Shop Pay \/ dynamic checkout\n\n      var wrap = document.createElement('label');\n      wrap.className = 'tt-ack';\n      wrap.style.cssText = 'display:flex;align-items:flex-start;gap:10px;margin:14px 0;padding:12px 14px;border:1px solid #d72525;border-radius:8px;background:#fff7f7;font:600 13px\/1.45 Arial,sans-serif;color:#222;cursor:pointer';\n      wrap.innerHTML =\n        '\u003cinput type=\"checkbox\" class=\"tt-ack-cb\" style=\"margin-top:2px;width:18px;height:18px;flex:0 0 auto;accent-color:#d72525;cursor:pointer\"\u003e' +\n        '\u003cspan\u003e' + ACK_TEXT + '\u003c\/span\u003e';\n\n      if (btn) {\n        \/\/ robust insert: works regardless of how the theme nests the button\n        var grp = btn.closest('.product-form__buttons');\n        if (grp \u0026\u0026 grp.parentNode) { grp.parentNode.insertBefore(wrap, grp); }\n        else { btn.insertAdjacentElement('beforebegin', wrap); }\n      } else {\n        form.insertBefore(wrap, form.firstChild);\n      }\n\n      \/\/ Friendly animated nudge ABOVE the checkbox: a green shimmering pill with a\n      \/\/ pulsing dot + bouncing arrow pointing down at the box. Shows while the box\n      \/\/ is unchecked (Add to Cart locked); hides the instant they check it.\n      if (!document.getElementById('tt-ack-hint-style')) {\n        var hs = document.createElement('style');\n        hs.id = 'tt-ack-hint-style';\n        hs.textContent =\n          '.tt-ack-hint{display:flex;align-items:center;gap:9px;margin:14px 0 -2px;padding:10px 14px;border-radius:8px;' +\n            'background:linear-gradient(110deg,#0f9d58 0%,#27c97f 25%,#0f9d58 50%,#27c97f 75%,#0f9d58 100%);' +\n            'background-size:220% 100%;animation:tt-ack-shimmer 2.4s linear infinite;' +\n            'color:#fff;font:700 13px\/1.35 Arial,sans-serif;box-shadow:0 4px 14px rgba(15,157,88,.30)}' +\n          '@keyframes tt-ack-shimmer{0%{background-position:0 0}100%{background-position:-220% 0}}' +\n          '.tt-ack-hint .tt-ack-hint-dot{width:9px;height:9px;border-radius:50%;background:#fff;flex:0 0 auto;animation:tt-ack-dot 1.2s ease-in-out infinite}' +\n          '@keyframes tt-ack-dot{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(.7)}}' +\n          '.tt-ack-hint .tt-ack-hint-arrow{margin-left:auto;font-size:18px;line-height:1;animation:tt-ack-bounce 1s ease-in-out infinite}' +\n          '@keyframes tt-ack-bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(5px)}}' +\n          '@media (prefers-reduced-motion:reduce){.tt-ack-hint,.tt-ack-hint .tt-ack-hint-dot,.tt-ack-hint .tt-ack-hint-arrow{animation:none}}';\n        document.head.appendChild(hs);\n      }\n      var hint = document.createElement('div');\n      hint.className = 'tt-ack-hint';\n      hint.setAttribute('role', 'status');\n      hint.innerHTML =\n        '\u003cspan class=\"tt-ack-hint-dot\" aria-hidden=\"true\"\u003e\u003c\/span\u003e' +\n        '\u003cspan class=\"tt-ack-hint-txt\"\u003eSpots are available. Just check the box below to add to cart.\u003c\/span\u003e' +\n        '\u003cspan class=\"tt-ack-hint-arrow\" aria-hidden=\"true\"\u003e\u0026#128071;\u003c\/span\u003e';\n      if (wrap.parentNode) wrap.parentNode.insertBefore(hint, wrap);\n\n      var cb = wrap.querySelector('.tt-ack-cb');\n      function sync() {\n        \/\/ Sold out: the green \"spots available\" pill would be a lie and there is no\n        \/\/ Add to Cart to unlock, so hide the pill AND the now-pointless checkbox, and\n        \/\/ leave the theme's \"Sold out\" button untouched.\n        if (soldOut) { hint.style.display = 'none'; wrap.style.display = 'none'; return; }\n        wrap.style.display = '';\n        var on = cb.checked;\n        if (btn) { btn.disabled = !on; btn.style.opacity = on ? '' : '0.45'; btn.style.cursor = on ? '' : 'not-allowed'; }\n        if (dyn) { dyn.style.opacity = on ? '' : '0.45'; dyn.style.pointerEvents = on ? '' : 'none'; }\n        hint.style.display = on ? 'none' : 'flex';\n      }\n      syncs.push(sync);\n      cb.addEventListener('change', sync);\n      sync();\n\n      \/\/ Backstop: block submit (e.g. Enter key) if not acknowledged\n      form.addEventListener('submit', function (e) {\n        if (!cb.checked) {\n          e.preventDefault(); e.stopPropagation();\n          wrap.style.boxShadow = '0 0 0 3px rgba(215,37,37,.35)';\n          wrap.scrollIntoView({ behavior: 'smooth', block: 'center' });\n        }\n      }, true);\n    });\n  }\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', injectAck);\n  } else {\n    injectAck();\n  }\n  window.addEventListener('load', injectAck);\n\n  \/\/ Resolve real availability once (same source the scarcity widget trusts). If the\n  \/\/ class is sold out, hide the green pill + checkbox on every form.\n  (function resolveAvail(){\n    var m = location.pathname.match(\/\\\/products\\\/([^\/?#]+)\/);\n    var h = m ? m[1] : '';\n    if (!h) return;\n    fetch('\/products\/' + h + '.js', {credentials: 'same-origin'})\n      .then(function(r){ return r.ok ? r.json() : null; })\n      .then(function(p){\n        if (!p || !p.variants) return;\n        soldOut = !p.variants.some(function(v){ return v.available === true; });\n        if (soldOut) syncs.forEach(function(fn){ try { fn(); } catch(e){} });\n      })\n      .catch(function(){});\n  })();\n})();\n\u003c\/script\u003e\n\n\n\u003c!-- ============================================================\n     HEADER-AWARE STICKY TOP POSITIONING\n     The site header (logo \/ hamburger menu \/ cart icon) sits at the\n     top of the page. We position the sticky scarcity bar JUST BELOW\n     the visible bottom edge of that header — and slide it up to top:0\n     once the header has scrolled out of view.\n     ============================================================ --\u003e\n\u003cscript\u003e\n(function(){\n  var stickyTop = document.getElementById('tt-sticky-scarcity');\n  if (!stickyTop) return;\n\n  function findHeader() {\n    var sels = [\n      '#shopify-section-sections--header',\n      '.shopify-section-header',\n      'header.site-header',\n      '.site-header',\n      'header[role=\"banner\"]',\n      'header'\n    ];\n    for (var i = 0; i \u003c sels.length; i++) {\n      var el = document.querySelector(sels[i]);\n      if (el \u0026\u0026 el.offsetHeight \u003e 0) return el;\n    }\n    return null;\n  }\n\n  var headerEl = findHeader();\n\n  function updateStickyTop() {\n    if (!headerEl) { stickyTop.style.top = '0px'; return; }\n    var rect = headerEl.getBoundingClientRect();\n    \/\/ If header is partially or fully visible (its bottom \u003e 0), tuck the\n    \/\/ sticky bar below it. Otherwise pin to top.\n    var topOffset = Math.max(0, rect.bottom);\n    stickyTop.style.top = topOffset + 'px';\n  }\n\n  updateStickyTop();\n  window.addEventListener('scroll', updateStickyTop, {passive: true});\n  window.addEventListener('resize', updateStickyTop);\n  \/\/ Re-find header in case theme injects it asynchronously\n  window.addEventListener('load', function(){\n    headerEl = findHeader();\n    updateStickyTop();\n  });\n})();\n\u003c\/script\u003e\n\n\n\u003c!-- ============================================================\n     EBWL GATE — until the release timestamp, hide the theme buy form\n     and show the GoHighLevel waitlist form in its place; the \"Secure\n     My Spot\" CTAs become \"Join the Waitlist\" (they already scroll to\n     top:0, where the form sits). Auto-flips to buy mode at release.\n     No-op unless an ebwl:\u003cformId\u003e tag set PREVIEW, so the\n     page never renders a broken embed.\n     ============================================================ --\u003e\n\u003cscript\u003e\n(function(){\n  var FORM_ID   = 'PREVIEW';\n  var FORM_HOST = 'link.coursecreator360.com';\n  var ACCENT    = '#d72525';\n  var RELEASE   = window.__ttPreviewOpen ? 0 : Date.parse('2099-01-01T00:00:00Z');\n  var hasForm = FORM_ID \u0026\u0026 FORM_ID.indexOf('{{') !== 0 \u0026\u0026 FORM_ID.indexOf('}}') === -1;\n  if (!hasForm) return;\n\n  function isWaitlist(){ return Date.now() \u003c RELEASE; }\n\n  function buyForm(){\n    var forms = document.querySelectorAll('form[action*=\"\/cart\/add\"]');\n    for (var i = 0; i \u003c forms.length; i++){ if (!forms[i].closest('.tt')) return forms[i]; }\n    return null;\n  }\n\n  function ensureBlock(form){\n    var b = document.getElementById('tt-ebwl-block');\n    if (b) return b;\n    \/\/ spinner keyframes (injected once)\n    if (!document.getElementById('tt-ebwl-style')){\n      var st = document.createElement('style');\n      st.id = 'tt-ebwl-style';\n      st.textContent = '@keyframes tt-ebwl-spin{to{transform:rotate(360deg)}}';\n      document.head.appendChild(st);\n    }\n    b = document.createElement('div');\n    b.id = 'tt-ebwl-block';\n    b.style.cssText = 'margin:0 0 22px;padding:22px;border:1px solid #e3e3e3;border-radius:12px;background:#fff;box-shadow:0 6px 24px rgba(0,0,0,.18)';\n    b.innerHTML =\n      '\u003cdiv style=\"display:inline-block;background:' + ACCENT + ';color:#fff;font:700 12px\/1 Arial,sans-serif;letter-spacing:.16em;text-transform:uppercase;padding:8px 12px;border-radius:4px;margin-bottom:12px\"\u003eEarly-Bird Waitlist\u003c\/div\u003e' +\n      '\u003cdiv style=\"display:inline-block;background:#fff;color:' + ACCENT + ';border:1px solid ' + ACCENT + ';font:700 11px\/1 Arial,sans-serif;letter-spacing:.1em;text-transform:uppercase;padding:8px 12px;border-radius:4px;margin:0 0 12px 8px\"\u003eRider Must Bring Their Own Bike\u003c\/div\u003e' +\n      '\u003cdiv style=\"font:700 20px\/1.25 Arial,sans-serif;color:#111;margin-bottom:6px\"\u003eRegistration opens soon.\u003c\/div\u003e' +\n      '' +\n      '\u003cdiv style=\"font:800 22px\/1.2 Arial,sans-serif;color:#111;margin:2px 0 14px\"\u003e$347 for the early-bird waitlist. $397 when it opens to the public.\u003c\/div\u003e' +\n      '\u003cdiv style=\"font:400 15px\/1.45 Arial,sans-serif;color:#555;margin-bottom:16px\"\u003eOne full day on jumps with Coach Tre McCollough. Join the early-bird waitlist for first access before it opens to the public.\u003c\/div\u003e' +\n      '\u003cdiv style=\"border:2px dashed #bbb;border-radius:8px;padding:18px;font:500 14px\/1.4 Arial,sans-serif;color:#333\"\u003e' +'\u003cdiv style=\"font-weight:700;margin-bottom:10px\"\u003e[ GHL waitlist form goes here: not built yet ]\u003c\/div\u003e' +'\u003cinput disabled placeholder=\"First name\" style=\"display:block;width:100%;box-sizing:border-box;margin:0 0 8px;padding:10px;border:1px solid #ccc;border-radius:4px\"\u003e' +'\u003cinput disabled placeholder=\"Mobile phone\" style=\"display:block;width:100%;box-sizing:border-box;margin:0 0 8px;padding:10px;border:1px solid #ccc;border-radius:4px\"\u003e' +'\u003cinput disabled placeholder=\"Email\" style=\"display:block;width:100%;box-sizing:border-box;margin:0 0 12px;padding:10px;border:1px solid #ccc;border-radius:4px\"\u003e' +'\u003cbutton disabled style=\"width:100%;padding:14px;border:0;border-radius:4px;background:' + ACCENT + ';color:#fff;font-weight:800;letter-spacing:.08em;text-transform:uppercase\"\u003eJoin the Waitlist\u003c\/button\u003e' +'\u003c\/div\u003e';\n    form.parentNode.insertBefore(b, form);\n    \/\/ hide the spinner once the form iframe loads; fallback timeout so it never sticks\n    var loader = b.querySelector('#tt-ebwl-loader');\n    var frame = b.querySelector('iframe');\n    function hideLoader(){ if (loader){ loader.style.opacity = '0'; setTimeout(function(){ if (loader) loader.style.display = 'none'; }, 400); } }\n    if (frame) frame.addEventListener('load', hideLoader);\n    setTimeout(hideLoader, 12000);\n    \/\/ Robust auto-resize: GHL postMessages the form's content height — size the\n    \/\/ iframe to it so there is never an internal scrollbar (form_embed.js does not\n    \/\/ reliably resize a dynamically-injected iframe on its own).\n    if (frame) window.addEventListener('message', function(ev){\n      if (ev.source !== frame.contentWindow) return;\n      var d = ev.data;\n      if (typeof d === 'string'){ try { d = JSON.parse(d); } catch(e){ return; } }\n      if (d \u0026\u0026 +d.height \u003e 200) frame.style.height = (Math.ceil(+d.height) + 5) + 'px';\n    });\n    if (false){\n      var s = document.createElement('script');\n      s.id = 'tt-ghl-embed-js';\n      s.src = 'https:\/\/' + FORM_HOST + '\/js\/form_embed.js';\n      document.body.appendChild(s);\n    }\n    return b;\n  }\n\n  function relabelCTAs(waitlist){\n    document.querySelectorAll('.tt-secure-cta').forEach(function(btn){\n      if (waitlist){\n        if (!btn.dataset.buyLabel) btn.dataset.buyLabel = btn.innerHTML;\n        btn.innerHTML = 'Join the Waitlist \u003cspan class=\"arrow\"\u003e→\u003c\/span\u003e';\n        btn.classList.add('is-waitlist');\n      } else if (btn.dataset.buyLabel){\n        btn.innerHTML = btn.dataset.buyLabel;\n        btn.classList.remove('is-waitlist');\n      }\n    });\n  }\n\n  \/\/ Standalone quantity selector(s) the theme renders OUTSIDE the cart form.\n  \/\/ The buy buttons (ADD TO CART + Shop Pay) and the injected qty live INSIDE the\n  \/\/ form, so hiding the form covers them — but the theme's .product__quantity AND\n  \/\/ the variant\/option picker (e.g. the \"Bike Rental\" selector) can render OUTSIDE\n  \/\/ the form, so hide (and restore) them explicitly during the waitlist.\n  var QTY_SELECTORS = '.product__quantity, .product-single__quantity, .product-form__quantity, .tt-qty-selector, .product-form__controls-group, .selector-wrapper, .single-option-selector, .product-single__variants, .product-form__variants, .variant-input-wrap, .variant-wrapper, .variant__label, .product-form__option, .product__variants, [data-option-index]';\n  function apply(){\n    var form = buyForm();\n    if (!form) return;\n    var waitlist = isWaitlist();\n    var qtys = [].slice.call(document.querySelectorAll(QTY_SELECTORS)).filter(function(el){\n      return !el.closest('.tt') \u0026\u0026 !form.contains(el);\n    });\n    if (waitlist){\n      ensureBlock(form).style.display = '';\n      form.style.display = 'none';\n      qtys.forEach(function(el){ el.dataset.ttBuyhidden = '1'; el.style.display = 'none'; });\n    } else {\n      form.style.display = '';\n      var b = document.getElementById('tt-ebwl-block');\n      if (b) b.style.display = 'none';\n      qtys.forEach(function(el){ if (el.dataset.ttBuyhidden){ el.style.display = ''; delete el.dataset.ttBuyhidden; } });\n    }\n    relabelCTAs(waitlist);\n  }\n\n  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', apply);\n  else apply();\n  window.addEventListener('load', apply);\n  setTimeout(apply, 1500);  \/\/ re-assert after any async theme re-render of the form\n  if (isWaitlist()){\n    var ms = RELEASE - Date.now();\n    if (ms \u003e 0 \u0026\u0026 ms \u003c 2147483647) setTimeout(apply, ms + 500);  \/\/ auto-flip at release\n  }\n})();\n\u003c\/script\u003e\n\n\u003c\/section\u003e\n","brand":"The MX Factory","offers":[{"title":"Default Title","offer_id":67627511054490,"sku":null,"price":347.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/jumps-clinic_poster-jumps-oak-hill.png?v=1790801815","url":"https:\/\/themxfactory.com\/products\/jumps-clinic-oak-hill-raceway-alvord-tx-january-18-2027","provider":"The MX Factory","version":"1.0","type":"link"}