{"product_id":"airway-x-mx-airway-heights-wa-july-8-2026","title":"Airway X MX | Airway Heights, WA | July 8, 2026","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       WASHINGTON            — e.g. \"NEW YORK\"\n       Airway X MX       — e.g. \"Sick Bros MX\"\n       Airway Heights, WA       — e.g. \"Cohocton, NY\"\n            — e.g. \"1234 Track Rd\"\n       July 08, 2026        — e.g. \"June 9, 2026\"\n       july 8       — e.g. \"june 9\" (lowercase, no year)\n       2026-07-08         — e.g. \"2026-06-09\"  (for schema)\n       Tyler Livesay            — e.g. \"Tyler Livesay\"\n       297            — e.g. \"297\"\n       https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/gate-lineup_1920x.jpg?v=1778193529      — full Shopify CDN URL of track action photo\n       airway-x-mx-airway-heights-wa-july-8-2026   — e.g. \"the-technique-tour-sick-bros-mx-cohocton-ny\"\n       https:\/\/themxfactory.com\/products\/airway-x-mx-airway-heights-wa-july-8-2026      — full URL of this product page\n       A regional The Technique Tour stop in Airway Heights. Tyler coaches every rider personally.      — 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=\"The Technique Tour · Airway X MX, Airway Heights, WA · July 08, 2026\"\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;\n    --red: #d72525;\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  .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\/gate-lineup_1920x.jpg?v=1778193529\") 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     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 #d72525;\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: #d72525;\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: #d72525; }\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 #d72525;\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: #d72525;\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\/gate-lineup_1920x.jpg?v=1778193529\") 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\"\u003ethe technique tour\u003c\/span\u003e\n  \u003cdiv class=\"hero-grid\"\u003e\n    \u003ch1 class=\"h-display\"\u003eWASHINGTON\u003c\/h1\u003e\n    \u003cdiv class=\"meta-line\"\u003e\n      coach Tyler Livesay \u003cspan class=\"sep\"\u003e|\u003c\/span\u003e Airway X MX \u003cspan class=\"sep\"\u003e|\u003c\/span\u003e july 8\n    \u003c\/div\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$297\u003c\/span\u003e\n      \u003cspan class=\"lab\"\u003ePer rider\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 – 2:30 PM\u003c\/span\u003e\n    \u003c\/div\u003e\n    \u003cdiv class=\"stat\"\u003e\n      \u003cspan class=\"num\"\u003e30\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!-- 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=\"30\" data-current-inventory=\"10\" data-low-threshold=\"5\" data-show-threshold=\"70\" data-poll-seconds=\"120\" data-handle=\"airway-x-mx-airway-heights-wa-july-8-2026\" style=\"display:none; box-sizing:border-box; margin:18px 0; padding:18px 22px; background:#0e0e0c; color:#fff; border-left:6px solid #d72525; 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:#d72525; 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:#d72525; 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  .tt .tt-scarcity.is-low { border-left-color: #FFE872 !important; }\n  .tt .tt-scarcity.is-low .dot { background: #FFE872 !important; }\n  .tt .tt-scarcity.is-low .bar .fill { background: #FFE872 !important; }\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 .label .accent { color: var(--red); }\n  .tt .tt-scarcity.is-low .label .accent { color: #FFE872; }\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 { animation: none !important; }\n  }\n\u003c\/style\u003e\n\n\n\u003c!-- ============================================================\n     SECTION 2 — TICKER (continuous outcomes)\n     ============================================================ --\u003e\n\u003cdiv class=\"ticker\" aria-hidden=\"true\"\u003e\n  \u003cdiv class=\"ticker__track\"\u003e\n    \u003c!-- Duplicated content for seamless loop --\u003e\n    \u003cdiv style=\"display:flex; flex: 0 0 auto;\"\u003e\n      \u003cspan class=\"ticker__item\"\u003eMore technique\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\n      \u003cspan class=\"ticker__item\"\u003eMore fast\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\n      \u003cspan class=\"ticker__item\"\u003eMore consistency\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\n      \u003cspan class=\"ticker__item\"\u003eMore confidence\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\n      \u003cspan class=\"ticker__item\"\u003eMore safety\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\n      \u003cspan class=\"ticker__item\"\u003eMore fun\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\"\u003eMore technique\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\n      \u003cspan class=\"ticker__item\"\u003eMore fast\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\n      \u003cspan class=\"ticker__item\"\u003eMore consistency\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\n      \u003cspan class=\"ticker__item\"\u003eMore confidence\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\n      \u003cspan class=\"ticker__item\"\u003eMore safety\u003cspan class=\"bullet\"\u003e●\u003c\/span\u003e\u003c\/span\u003e\n      \u003cspan class=\"ticker__item\"\u003eMore fun\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 — WHAT YOU'LL WORK ON\n     ============================================================ --\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;\"\u003eSix fundamentals.\u003cbr\u003eOne full day.\u003c\/h2\u003e\n      \u003cp class=\"body-lg\"\u003eThe drills you do at Airway X MX are the same drills our students still run five years later. Build the habits in a controlled environment, then apply them at speed.\u003c\/p\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"work-grid\"\u003e\n      \u003carticle class=\"work-card\"\u003e\n        \u003ch3\u003eBody position\u003c\/h3\u003e\n        \u003cp\u003eThe single biggest source of lost time and missed lines. We rebuild it from scratch using our flat-ground drill sequence.\u003c\/p\u003e\n      \u003c\/article\u003e\n      \u003carticle class=\"work-card\"\u003e\n        \u003ch3\u003eVision\u003c\/h3\u003e\n        \u003cp\u003eWhere the eyes go, the bike follows. Drills to train your scan pattern through corners and over jumps.\u003c\/p\u003e\n      \u003c\/article\u003e\n      \u003carticle class=\"work-card\"\u003e\n        \u003ch3\u003eThrottle control\u003c\/h3\u003e\n        \u003cp\u003eSmooth roll-on, hard hits, and clutch work. The mechanical fundamentals that compound across every section of the track.\u003c\/p\u003e\n      \u003c\/article\u003e\n      \u003carticle class=\"work-card\"\u003e\n        \u003ch3\u003eCornering\u003c\/h3\u003e\n        \u003cp\u003eInside, outside, ruts, flat turns. Entry, apex, exit. The pieces of cornering that separate fast from comfortable.\u003c\/p\u003e\n      \u003c\/article\u003e\n      \u003carticle class=\"work-card\"\u003e\n        \u003ch3\u003eJumps\u003c\/h3\u003e\n        \u003cp\u003eApproach, takeoff, body position in the air, landing. Build the mental and mechanical pattern that takes the gamble out.\u003c\/p\u003e\n      \u003c\/article\u003e\n      \u003carticle class=\"work-card\"\u003e\n        \u003ch3\u003eRuts \u0026amp; lines\u003c\/h3\u003e\n        \u003cp\u003eHow to read a track that changes by the lap. Line selection, rut commitment, and how to set up the corners that follow.\u003c\/p\u003e\n      \u003c\/article\u003e\n    \u003c\/div\u003e\n  \u003c\/div\u003e\n\u003c\/div\u003e\n\n\n\u003c!-- ============================================================\n     SECTION 4 — BUILT FOR ALL SKILL LEVELS\n     ============================================================ --\u003e\n\u003cdiv class=\"section\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003eall skill levels\u003c\/span\u003e\n      \u003ch2 class=\"h-section\" style=\"margin-top: 18px;\"\u003eBuilt for every rider.\u003c\/h2\u003e\n      \u003cp class=\"body-lg\"\u003eBeginners build correct habits from day one. Vet and intermediate riders break the bad habits that have plateaued them. Expert riders find the time they didn't know they were leaving on the table.\u003c\/p\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"levels\"\u003e\n      \u003cdiv class=\"level\"\u003e\n        \u003cspan class=\"red-tag\"\u003ebeginner\u003c\/span\u003e\n        \u003ch3\u003eAre you a beginner?\u003c\/h3\u003e\n        \u003cp\u003eThis camp is perfect for you, because you'll be creating correct technical habits from the beginning. (A beginner is not a first-time rider. A beginner should be able to navigate a track without assistance successfully.)\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"level\"\u003e\n        \u003cspan class=\"red-tag\"\u003evet \/ intermediate\u003c\/span\u003e\n        \u003ch3\u003eAre you a vet or intermediate rider?\u003c\/h3\u003e\n        \u003cp\u003eThis camp is perfect for you, because you'll be breaking bad habits, creating new ones, and getting instant feedback to take your riding to the next level.\u003c\/p\u003e\n      \u003c\/div\u003e\n      \u003cdiv class=\"level\"\u003e\n        \u003cspan class=\"red-tag\"\u003eexpert\u003c\/span\u003e\n        \u003ch3\u003eAre you an expert rider?\u003c\/h3\u003e\n        \u003cp\u003eThis camp is perfect for you because you'll create a better understanding of how the body and the bike work together, as well as learn drill sequences that you can use forever to hone your technique into near perfection.\u003c\/p\u003e\n      \u003c\/div\u003e\n    \u003c\/div\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\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003ea day at the technique tour\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 Tyler 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 Technique Tour — 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 5 — WHAT TO EXPECT (six outcomes)\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 every rider leaves with.\u003c\/h2\u003e\n      \u003cp class=\"body-lg\"\u003eEvery drill, every rep, every conversation on the side of the track ladders up to one of these six outcomes.\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\"\u003eSafety\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\"\u003eSpeed\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\"\u003eConsistency\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\"\u003eConfidence\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\"\u003eLess anxiety\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\"\u003eMore fun\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 Technique Tour.\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 on the tour\u003c\/span\u003e\n        \u003ch3 class=\"card-heading\"\u003eWhat 9 AM to 2:30 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\"\u003eRiders meeting\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cspan class=\"time\"\u003e9:15\u003c\/span\u003e\u003cspan class=\"what\"\u003eWarmup\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cspan class=\"time\"\u003e9:45\u003c\/span\u003e\u003cspan class=\"what\"\u003eMoto theory · technique, ruts, jumps\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cspan class=\"time\"\u003e10:15\u003c\/span\u003e\u003cspan class=\"what\"\u003eDrill block 1 + ruts\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\"\u003eDrill block 2 + ruts\u003csup\u003e*\u003c\/sup\u003e\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cspan class=\"time\"\u003e1:45 PM\u003c\/span\u003e\u003cspan class=\"what\"\u003eJumps\u003c\/span\u003e\n\u003c\/div\u003e\n\u003cdiv class=\"row\"\u003e\n\u003cspan class=\"time\"\u003e2:30 PM\u003c\/span\u003e\u003cspan class=\"what\"\u003eClass end\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\"\u003eSpeed is a side effect\u003cbr\u003eof \u003cspan class=\"accent\"\u003etechnique.\u003c\/span\u003e\n\u003c\/h3\u003e\n        \u003cp class=\"card-body\"\u003eMore technique = \u003cstrong\u003emore fast\u003c\/strong\u003e, more consistency, more fun, and more safety. We don't teach you to send it harder. We teach you to ride the bike better. For parents worried about reckless riding, this is the answer.\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 Tyler.\u003c\/h3\u003e\n        \u003cp class=\"card-body\" style=\"margin-bottom: clamp(14px, 2vw, 20px);\"\u003eTyler Livesay is the owner of The MX Factory. You might've seen him on our YouTube channel with over 475,000 subscribers or giving riding tips on Instagram. He has been racing and winning dirt bike races since he was 5 years old.\u003c\/p\u003e\n        \u003cdiv class=\"card-creds\"\u003e\n          \u003cdiv class=\"item\"\u003e\n\u003cspan class=\"n\"\u003e128\u003c\/span\u003e\u003cspan class=\"l\"\u003eAmateur wins\u003c\/span\u003e\n\u003c\/div\u003e\n          \u003cdiv class=\"item\"\u003e\n\u003cspan class=\"n\"\u003e6×\u003c\/span\u003e\u003cspan class=\"l\"\u003eAMA Outdoor Nationals\u003c\/span\u003e\n\u003c\/div\u003e\n          \u003cdiv class=\"item\"\u003e\n\u003cspan class=\"n\"\u003e5K+\u003c\/span\u003e\u003cspan class=\"l\"\u003eRiders taught\u003c\/span\u003e\n\u003c\/div\u003e\n          \u003cdiv class=\"item\"\u003e\n\u003cspan class=\"n\"\u003e40+\u003c\/span\u003e\u003cspan class=\"l\"\u003eStates traveled\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\"\u003eAirway X MX.\u003cbr\u003eAirway Heights, WA.\u003c\/h3\u003e\n        \u003cp class=\"card-body\"\u003eA regional The Technique Tour stop in Airway Heights. Tyler coaches every rider personally.\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\/tyler-carousel-5_1080x.jpg?v=1779916647\" srcset=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/tyler-carousel-5_480x.jpg?v=1779916647 480w, https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/tyler-carousel-5_720x.jpg?v=1779916647 720w, https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/tyler-carousel-5_1080x.jpg?v=1779916647 1080w, https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/tyler-carousel-5_1600x.jpg?v=1779916647 1600w\" sizes=\"(max-width: 720px) 100vw, 1080px\" alt=\"Rider working a corner at a clinic\" 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\/tyler-carousel-6_1080x.jpg?v=1779916649\" srcset=\"https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/tyler-carousel-6_480x.jpg?v=1779916649 480w, https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/tyler-carousel-6_720x.jpg?v=1779916649 720w, https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/tyler-carousel-6_1080x.jpg?v=1779916649 1080w, https:\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/tyler-carousel-6_1600x.jpg?v=1779916649 1600w\" sizes=\"(max-width: 720px) 100vw, 1080px\" alt=\"Group of riders at a Technique Tour stop\" 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 — OUR TRAINING METHODOLOGY (long-form, preserved verbatim)\n     ============================================================ --\u003e\n\u003cdiv class=\"section\"\u003e\n  \u003cdiv class=\"container\"\u003e\n    \u003cdiv class=\"section-head\"\u003e\n      \u003cspan class=\"red-tag\"\u003eour methodology\u003c\/span\u003e\n      \u003ch2 class=\"h-section\" style=\"margin-top: 18px;\"\u003eSpeed is a side effect of technique.\u003c\/h2\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"method\"\u003e\n      \u003cp\u003e\u003cstrong\u003eAre you hitting a plateau in your riding, struggling with arm pump, or want to shave significant time off your laps?\u003c\/strong\u003e Discover a training methodology designed for riders serious about real, lasting improvement, not just quick fixes. (Some students have dropped up to 10 seconds off their lap time.)\u003c\/p\u003e\n\n      \u003cp\u003e\u003cstrong\u003eOur approach is different.\u003c\/strong\u003e We move beyond the \"old school\" method of just pounding out laps. We build your technique from the ground up using our pro-level drill sequence, starting on flat ground.\u003c\/p\u003e\n\n      \u003cp\u003e\u003cstrong\u003eWhy flat ground?\u003c\/strong\u003e To build correct habits effectively, you need the easiest possible environment. When pressure hits (fight or flight mode), you default to habits. We instill the \u003cem\u003eright\u003c\/em\u003e habits first, then systematically apply them on the track through rotating drills and application motos, letting you truly feel what correct technique is like.\u003c\/p\u003e\n\n      \u003cp\u003e\u003cstrong\u003eImagine riding faster while feeling more comfortable and in control.\u003c\/strong\u003e Our students experience tangible results: significant lap time reductions, less fatigue and arm pump, increased confidence at speed. This isn't about \u003cem\u003emaybe\u003c\/em\u003e getting faster; it's about building a solid, repeatable foundation that leads to sustainable progress and prepares you to challenge yourself effectively on the track and eventually in competition. This class specifically focuses on solidifying that technique and applying it on the track.\u003c\/p\u003e\n\n      \u003cp\u003e\u003cstrong\u003eThis class demands commitment.\u003c\/strong\u003e We are looking exclusively for open-minded riders dedicated to learning and applying our methodology. If you believe you're \"too good\" for foundational drills or aren't serious about refining your technique, this isn't the right fit.\u003c\/p\u003e\n\n      \u003cp\u003e\u003cstrong\u003eReady to invest in your technique and unlock your potential?\u003c\/strong\u003e If you're committed to the process and eager to improve the right way, sign up for our class today.\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 the method we teach.\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 Tyler.\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\/Tyler_Livesey_portrait_photo_smiling_720x.jpg?v=1778194695\" alt=\"Coach Tyler Livesay 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;\"\u003eTyler Livesay is the owner of The MX Factory. You might've seen him on our YouTube channel with over 475,000 subscribers or giving riding tips on Instagram. He has been racing and winning dirt bike races since he was 5 years old.\u003c\/p\u003e\n          \u003cp class=\"body\"\u003eHe's trained with the likes of James and Malcolm Stewart and a slew of fast professional riders. Tyler began his coaching journey teaching motocross lessons at Cycle Ranch MX near San Antonio in 2012, where he transformed the local riding scene by pushing riders to reach their potential and beyond. He's also known as the dirtiest scrub thrower east and west of the Mississippi River.\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\"\u003e128\u003c\/span\u003e\u003cspan class=\"l\"\u003eAmateur wins\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"credential\"\u003e\n\u003cspan class=\"n\"\u003e6×\u003c\/span\u003e\u003cspan class=\"l\"\u003eAMA Outdoor Nationals\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"credential\"\u003e\n\u003cspan class=\"n\"\u003e2014\u003c\/span\u003e\u003cspan class=\"l\"\u003eHouston Supercross\u003c\/span\u003e\n\u003c\/div\u003e\n        \u003cdiv class=\"credential\"\u003e\n\u003cspan class=\"n\"\u003e5K+\u003c\/span\u003e\u003cspan class=\"l\"\u003eRiders taught\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      \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\"\u003eTrain with him directly.\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;\"\u003eAirway X MX.\u003c\/h2\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"venue\"\u003e\n      \u003cp class=\"body-lg\"\u003eA regional The Technique Tour stop in Airway Heights. Tyler coaches every rider personally.\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\"\u003eJuly 08, 2026\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 – 2:30 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\"\u003eAirway Heights, WA\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$297 per rider\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=Airway+X+MX%2C+Airway+Heights%2C+WA\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 Airway X MX in Airway Heights, WA\"\u003e\u003c\/iframe\u003e\n        \u003ca class=\"loc-directions\" href=\"https:\/\/www.google.com\/maps\/dir\/?api=1\u0026amp;destination=Airway+X+MX%2C+Airway+Heights%2C+WA\" 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 (semantic \u003cdetails\u003e for SEO + AI scraping)\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\u003eWhat is the age limit for riders?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eNo age limit or minimum. However, we ask that young riders be able to go through the track and ride without parent help. Ideally, they can pick up their own bikes 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\u003eUnfortunately, for any camps outside of our home base of Austin, Texas, we do not rent bikes. However, 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 absolutely 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\u003eIs this class only for racers?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eBecause we take a technique-first approach, we are able to cater to all skill levels and all riding styles.\u003c\/p\u003e\u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eIs this beneficial for woods riders?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eYes. Yes. Yes. Woods riders might honestly have MORE to gain from this class.\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\n          \u003cp\u003eMotocross is an outdoor sport. Camps will proceed unless conditions are deemed unsafe. All decisions regarding safety, continuation, relocation, or cancellation due to weather are made at the sole discretion of The MX Factory staff. If a camp is canceled due to weather, your registration converts to a Training Credit redeemable at any future MXF clinic.\u003c\/p\u003e\n        \u003c\/div\u003e\n      \u003c\/details\u003e\n\n      \u003cdetails\u003e\n        \u003csummary\u003eWait, is this clinic during the week?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eYes — the date on the site is correct. We often schedule clinics during the week because scheduling on the weekend with tracks is very difficult. A lot of our students play hooky to get out of school or work to join us for the day.\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\u003eTyler Livesay, owner of The MX Factory. Former AMA pro — 128 amateur wins, six AMA Outdoor Nationals, qualified for the 2014 Houston Supercross. Since 2012 he's coached 5,000+ riders across 40+ states. You can also catch him on YouTube (475K+ subscribers) and Instagram.\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 the date is posted 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\n      \u003cdetails\u003e\n        \u003csummary\u003eAre there still spots available?\u003c\/summary\u003e\n        \u003cdiv class=\"answer\"\u003e\u003cp\u003eIf the live spots counter above shows availability, there are spots for you. Once you see \"Sold out · join the waitlist,\" that means it's full — but a waitlist spot is worth grabbing in case of cancellation.\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!-- (Refund \u0026 Weather Policy section intentionally removed — handled at the\n     site-wide policy page level, not on every product page.) --\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\u003eWASHINGTON\u003cbr\u003ejuly 8\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$297 per rider · 30 spots only · 9 AM – 2:30 PM\u003c\/div\u003e\n\u003c\/div\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=\"airway-x-mx-airway-heights-wa-july-8-2026\"\u003e\n  \u003cdiv class=\"lhs\"\u003e\n    \u003cdiv class=\"label\"\u003eAirway X MX · july 8\u003c\/div\u003e\n    \u003cdiv class=\"title\"\u003e$297 · 30 spots\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 STRUCTURED DATA (Product + Course + FAQPage + Place)\n     For LLM\/AI scraping + SEO. JSON-LD inline.\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\/airway-x-mx-airway-heights-wa-july-8-2026#course\",\n      \"name\": \"The Technique Tour · Airway X MX, Airway Heights, WA\",\n      \"description\": \"One-day motocross technique clinic with Coach Tyler Livesay. Flat-ground drill sequence, body position, vision, throttle control, cornering, jumps, and ruts. All skill levels — beginner through expert.\",\n      \"provider\": {\n        \"@type\": \"Organization\",\n        \"name\": \"The MX Factory\",\n        \"url\": \"https:\/\/themxfactory.com\",\n        \"sameAs\": [\n          \"https:\/\/www.youtube.com\/@TheMXFactory\",\n          \"https:\/\/www.instagram.com\/themxfactory\"\n        ]\n      },\n      \"instructor\": {\n        \"@type\": \"Person\",\n        \"name\": \"Tyler Livesay\",\n        \"jobTitle\": \"Head Coach, founder of The MX Factory; former AMA pro\"\n      },\n      \"courseMode\": \"in-person\",\n      \"educationalLevel\": \"All levels\",\n      \"timeRequired\": \"PT5H30M\",\n      \"hasCourseInstance\": {\n        \"@type\": \"CourseInstance\",\n        \"courseMode\": \"in-person\",\n        \"startDate\": \"2026-07-08T09:00:00-05:00\",\n        \"endDate\": \"2026-07-08T14:30:00-05:00\",\n        \"location\": {\n          \"@type\": \"Place\",\n          \"name\": \"Airway X MX\",\n          \"address\": {\n            \"@type\": \"PostalAddress\",\n            \"streetAddress\": \"\",\n            \"addressLocality\": \"Airway Heights, WA\",\n            \"addressCountry\": \"US\"\n          }\n        },\n        \"instructor\": { \"@type\": \"Person\", \"name\": \"Tyler Livesay\" },\n        \"offers\": {\n          \"@type\": \"Offer\",\n          \"price\": \"297.00\",\n          \"priceCurrency\": \"USD\",\n          \"availability\": \"https:\/\/schema.org\/InStock\",\n          \"url\": \"https:\/\/themxfactory.com\/products\/airway-x-mx-airway-heights-wa-july-8-2026\",\n          \"validFrom\": \"2026-07-08\"\n        }\n      }\n    },\n    {\n      \"@type\": \"FAQPage\",\n      \"@id\": \"https:\/\/themxfactory.com\/products\/airway-x-mx-airway-heights-wa-july-8-2026#faq\",\n      \"mainEntity\": [\n        {\"@type\":\"Question\",\"name\":\"What is the age limit for riders?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"No age limit or minimum. However, we ask that young riders be able to go through the track and ride without parent help. Ideally, they can pick up their own bikes if they fall.\"}},\n        {\"@type\":\"Question\",\"name\":\"Do you rent bikes?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Unfortunately, for any camps outside of our home base of Austin, Texas, we do not rent bikes. However, you can contact us and we can try to source you a bike from the local area.\"}},\n        {\"@type\":\"Question\",\"name\":\"Do you offer refunds?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"60 or more 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 time: No refunds or credits.\"}},\n        {\"@type\":\"Question\",\"name\":\"Do you provide lunch?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Lunch and water are the rider's responsibility.\"}},\n        {\"@type\":\"Question\",\"name\":\"Is this class only for racers?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Because we take a technique-first approach, we are able to cater to all skill levels and all riding styles.\"}},\n        {\"@type\":\"Question\",\"name\":\"Is this beneficial for woods riders?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes. Woods riders might honestly have MORE to gain from this class.\"}},\n        {\"@type\":\"Question\",\"name\":\"What if it rains?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Motocross is an outdoor sport. Camps will proceed unless conditions are deemed unsafe. All decisions regarding safety, continuation, relocation, or cancellation due to weather are made at the sole discretion of The MX Factory staff.\"}},\n        {\"@type\":\"Question\",\"name\":\"Wait, is this clinic during the week?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Yes, the date on the site is correct. We often schedule clinics during the week because scheduling on the weekend with tracks is very difficult.\"}},\n        {\"@type\":\"Question\",\"name\":\"Who is the trainer?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"Tyler Livesay, owner of The MX Factory. Former AMA pro with 128 amateur wins, six AMA Outdoor Nationals, qualified for the 2014 Houston Supercross. Since 2012 he has coached 5,000+ riders across 40+ states.\"}},\n        {\"@type\":\"Question\",\"name\":\"How long is registration open for?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"You can register from the time the date is posted until the night before the clinic as long as it is not sold out.\"}},\n        {\"@type\":\"Question\",\"name\":\"Are there still spots available?\",\"acceptedAnswer\":{\"@type\":\"Answer\",\"text\":\"If the live spots counter on the product page shows availability, there are spots open. Once it shows sold out, the clinic is full but a waitlist signup is available.\"}}\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    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\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 , so the\n     page never renders a broken embed.\n     ============================================================ --\u003e\n\u003cscript\u003e\n(function(){\n  var FORM_ID   = '';\n  var FORM_HOST = 'link.coursecreator360.com';\n  var RELEASE   = Date.parse('2026-06-12T16: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,.06)';\n    b.innerHTML =\n      '\u003cdiv style=\"display:inline-block;background:#d72525;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=\"font:700 20px\/1.25 Arial,sans-serif;color:#111;margin-bottom:6px\"\u003eRegistration opens Friday, June 12 at 11am CT.\u003c\/div\u003e' +\n      '\u003cdiv style=\"font:400 15px\/1.45 Arial,sans-serif;color:#555;margin-bottom:16px\"\u003eJoin the waitlist now for first access and early-bird pricing the moment doors open.\u003c\/div\u003e' +\n      \/\/ the GHL embed lags a beat (esp. from paid traffic) — show a labeled\n      \/\/ spinner over the frame so visitors see WHERE the waitlist is while it loads\n      '\u003cdiv style=\"position:relative;min-height:560px\"\u003e' +\n        '\u003cdiv id=\"tt-ebwl-loader\" style=\"position:absolute;inset:0;z-index:2;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;background:#fff;color:#555;border-radius:6px;transition:opacity .35s ease\"\u003e' +\n          '\u003cdiv style=\"width:42px;height:42px;border:4px solid #ececec;border-top-color:#d72525;border-radius:50%;animation:tt-ebwl-spin .8s linear infinite\"\u003e\u003c\/div\u003e' +\n          '\u003cdiv style=\"font:600 14px\/1.35 Arial,sans-serif;text-align:center\"\u003eLoading the Early-Bird Waitlist…\u003c\/div\u003e' +\n        '\u003c\/div\u003e' +\n        '\u003ciframe src=\"https:\/\/' + FORM_HOST + '\/widget\/form\/' + FORM_ID + '\"' +\n          ' id=\"inline-' + FORM_ID + '\" data-layout=\"{\\'id\\':\\'INLINE\\'}\"' +\n          ' data-trigger-type=\"alwaysShow\" data-trigger-value=\"\"' +\n          ' data-activation-type=\"alwaysActivated\" data-activation-value=\"\"' +\n          ' data-deactivation-type=\"neverDeactivate\" data-deactivation-value=\"\"' +\n          ' data-form-name=\"Early-Bird Waitlist\" data-height=\"560\"' +\n          ' data-layout-iframe-id=\"inline-' + FORM_ID + '\" data-form-id=\"' + FORM_ID + '\"' +\n          ' title=\"Early-Bird Waitlist signup\"' +\n          ' style=\"position:relative;z-index:1;width:100%;min-height:560px;border:none;border-radius:6px;background:#fff;display:block\"\u003e\u003c\/iframe\u003e' +\n      '\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 (!document.getElementById('tt-ghl-embed-js')){\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 does\n  \/\/ NOT, so hide it (and restore it) explicitly during the waitlist.\n  var QTY_SELECTORS = '.product__quantity, .product-single__quantity, .product-form__quantity, .tt-qty-selector';\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":46728330838170,"sku":null,"price":297.0,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0328\/4582\/4139\/files\/airway-x-mx-airway-heights-wa-july-8-2026-square.png?v=1780256385","url":"https:\/\/themxfactory.com\/products\/airway-x-mx-airway-heights-wa-july-8-2026","provider":"The MX Factory","version":"1.0","type":"link"}