// content-buying-2.jsx — Outdoor sauna + accessories buying guides for InfraredSaunaSpot
// Depends on: components.jsx globals

// ═══════════════════════════════════════════════════════════
// 01. BEST OUTDOOR INFRARED SAUNA
// ═══════════════════════════════════════════════════════════

const outdoorProducts = [
  {
    rank: '01',
    id: 'clearlight-outdoor',
    name: 'Clearlight Sanctuary Outdoor 2',
    brand: 'Clearlight',
    tag: 'Best overall outdoor',
    tagEmber: true,
    price: 'From $6,995',
    score: '9.2',
    spectrum: 'Full spectrum',
    construction: 'Outdoor western cedar',
    capacity: '2 person',
    voltage: '240V',
    dimensions: '57x46 in',
    emf: '<0.3 mG',
    why: 'One of the only genuinely outdoor-rated infrared saunas with ultra-low EMF. IP-rated electrical connections, UV-resistant exterior finish, and a cedar roof panel rated for snow load. The control panel and all wiring use weatherproof enclosures - not aftermarket adaptations. Rated for ambient temperatures down to -20°F. Clearlight\'s True Wave II carbon/ceramic heaters deliver full-spectrum output with independently verified EMF under 0.3 mG at seated position.',
    pros: [
      'Genuinely outdoor-rated with IP-rated electrical connections throughout',
      'Ultra-low EMF under 0.3 mG - independently verified',
      'Lifetime warranty on cabin structure',
      'Western red cedar weathers naturally - no finish maintenance required',
    ],
    cons: [
      'Most expensive option in this category - $6,995 entry',
      '240V dedicated circuit required',
      'Level concrete pad required - not compatible with wood decking without structural reinforcement',
      '6-10 week lead time typical',
    ],
    cta: { href: '#clearlight-outdoor', label: 'See full details' },
    amazon: false,
  },
  {
    rank: '02',
    id: 'sunhome-outdoor',
    name: 'Sun Home Luminar Outdoor 2-Person',
    brand: 'Sun Home Saunas',
    tag: 'Best full-spectrum outdoor',
    tagEmber: false,
    price: 'From $5,495',
    score: '8.8',
    spectrum: 'Full spectrum',
    construction: 'Outdoor cedar',
    capacity: '2 person',
    voltage: '240V',
    dimensions: 'Contact for specs',
    emf: '0.5 mG',
    why: 'Sun Home\'s outdoor Luminar delivers full-spectrum heating, app control, chromotherapy, and genuine cedar construction at a lower price point than Clearlight. First-year owner reports are strong. Long-term durability data over 3-plus seasons is thinner than Clearlight given the shorter time on market. A strong choice if you want full-spectrum output and app control in an outdoor-rated package without the Clearlight price.',
    pros: [
      'Full-spectrum near, mid, and far infrared',
      'App control with session scheduling',
      'Chromotherapy included standard',
      'Cedar exterior with outdoor-rated hardware',
    ],
    cons: [
      'Less long-term durability data versus Clearlight - newer to market',
      '240V required',
      'Price still significant at $5,495 entry',
    ],
    cta: { href: '#sunhome-outdoor', label: 'See full details' },
    amazon: false,
  },
  {
    rank: '03',
    id: 'almostheaven',
    name: 'Almost Heaven Pinnacle Barrel Sauna',
    brand: 'Almost Heaven',
    tag: 'Best barrel design',
    tagEmber: false,
    price: '$3,500-$5,000',
    score: '8.6',
    spectrum: 'Traditional + infrared option',
    construction: 'Western red cedar barrel',
    capacity: '4-season outdoor',
    voltage: '240V',
    dimensions: 'Varies by model',
    emf: 'Not independently certified',
    why: 'Almost Heaven builds outdoor saunas from the ground up - outdoor performance is the core product, not an adaptation of an indoor unit. The barrel shape sheds rain and snow naturally without a separate roof structure. Cedar construction handles freeze-thaw cycles without special treatment. Infrared panel kits are available as an add-on to their traditional barrel design, letting you run infrared or traditional wood-fired depending on preference.',
    pros: [
      'Outdoor-native barrel design - engineered for weather from the start',
      'Natural snow and rain shedding with no roof add-on required',
      'Western red cedar throughout - proven outdoor durability',
      'Lower price point than dedicated infrared outdoor units',
    ],
    cons: [
      'EMF not independently certified for infrared add-on configuration',
      'Limited smart controls',
      'Assembly-intensive - plan for 4-8 hours with two people',
    ],
    cta: { href: '#almostheaven', label: 'See full details' },
    amazon: false,
  },
  {
    rank: '04',
    id: 'radiant-outdoor',
    name: 'Radiant Saunas 2-Person Outdoor',
    brand: 'Radiant Saunas',
    tag: 'Best budget outdoor',
    tagEmber: false,
    price: '$2,199-$2,799',
    score: '7.8',
    spectrum: 'Far infrared',
    construction: 'Cedar panels',
    capacity: '2 person outdoor',
    voltage: '240V',
    dimensions: 'Contact for specs',
    emf: 'Not independently certified',
    why: 'Most accessible outdoor-rated option at under $2,800. Cedar exterior panels, outdoor-rated electrical connections, and a solid entry-level build. Performance is functional for 4-season use in most US climates without extreme cold. Build quality is mid-tier - acceptable longevity with proper care. If budget is the primary constraint and you are not in a severe-cold climate, this is the credible starting point for outdoor infrared.',
    pros: [
      'Available on Amazon - straightforward purchase and return process',
      'Most affordable outdoor-rated option evaluated',
      'Cedar exterior panels',
    ],
    cons: [
      'Mid-tier build quality - thinner panels than premium options',
      'Shorter warranty than Clearlight or Sun Home',
      'Not rated for severe cold climates (-20°F or below)',
    ],
    cta: { href: 'https://www.amazon.com/s?k=radiant+saunas+outdoor+infrared&tag=infraspot00-20', label: 'Check on Amazon', amazon: true },
    amazon: true,
  },
];

const outdoorCompareRows = [
  { name: 'Clearlight Sanctuary Outdoor 2', emf: '<0.3 mG', construction: 'Western red cedar', capacity: '2 person', price: 'From $6,995', score: '9.2', best: true },
  { name: 'Sun Home Luminar Outdoor 2-Person', emf: '0.5 mG', construction: 'Outdoor cedar', capacity: '2 person', price: 'From $5,495', score: '8.8', best: false },
  { name: 'Almost Heaven Pinnacle Barrel', emf: 'Not certified', construction: 'Western red cedar barrel', capacity: '4-season outdoor', price: '$3,500-$5,000', score: '8.6', best: false },
  { name: 'Radiant Saunas 2-Person Outdoor', emf: 'Not certified', construction: 'Cedar panels', capacity: '2 person outdoor', price: '$2,199-$2,799', score: '7.8', best: false },
];

// Deeper outdoor-specific spec matrix. Figures marked (mfr) are manufacturer-reported.
const outdoorMatrixRows = [
  {
    model: 'Clearlight Sanctuary Outdoor 2',
    cap: '2 person',
    wood: 'Western red cedar',
    roof: 'Factory weather roof, sloped',
    heater: 'Full spectrum carbon/ceramic + near-IR',
    emf: 'Under 0.3 mG, third-party tested',
    cold: 'To -20°F ambient (mfr)',
    price: '$6,995+',
    best: true,
  },
  {
    model: 'Clearlight Sanctuary Outdoor 5',
    cap: '5 person',
    wood: 'Western red cedar',
    roof: 'Factory weather roof, sloped',
    heater: 'Full spectrum carbon/ceramic + near-IR',
    emf: 'Under 0.3 mG (mfr)',
    cold: 'To -20°F ambient (mfr)',
    price: '$10,000+',
    best: false,
  },
  {
    model: 'Sun Home Luminar Outdoor 2',
    cap: '2 person',
    wood: 'Outdoor-grade cedar',
    roof: 'Integrated roof panel',
    heater: 'Full spectrum, app controlled',
    emf: '0.5 mG (mfr)',
    cold: '4-season rated (mfr)',
    price: '$5,495+',
    best: false,
  },
  {
    model: 'Sunlighten Signature outdoor package',
    cap: '2-4 person',
    wood: 'Basswood or cedar, outdoor enclosure kit',
    roof: 'Requires covered structure or outdoor kit',
    heater: 'Far or full spectrum',
    emf: 'Low EMF (mfr, no public report)',
    cold: 'Not rated for fully exposed sites',
    price: '$6,000-$12,000',
    best: false,
  },
  {
    model: 'Almost Heaven Pinnacle barrel',
    cap: '4 person',
    wood: 'Western red cedar',
    roof: 'Barrel profile, no roof kit needed',
    heater: 'Traditional, infrared panel kit optional',
    emf: 'Not certified',
    cold: '4-season, cedar handles freeze-thaw',
    price: '$3,500-$5,000',
    best: false,
  },
  {
    model: 'Dundalk Leisurecraft CT Georgian',
    cap: '4-6 person',
    wood: 'Eastern white cedar or thermowood',
    roof: 'Shingle or metal roof included',
    heater: 'Traditional, infrared as retrofit only',
    emf: 'Not applicable',
    cold: 'Built for Ontario winters',
    price: '$6,000-$12,000',
    best: false,
  },
  {
    model: 'Medical Saunas outdoor series',
    cap: '2-6 person',
    wood: 'Sealed cedar',
    roof: 'Sloped shingle roof',
    heater: 'Far or full spectrum, hybrid on some models',
    emf: 'Low EMF (mfr, not third-party)',
    cold: '4-season (mfr)',
    price: '$6,000-$15,000',
    best: false,
  },
  {
    model: 'Radiant Saunas 2-Person Outdoor',
    cap: '2 person',
    wood: 'Cedar panels',
    roof: 'Sloped panel roof',
    heater: 'Far infrared carbon',
    emf: 'Not certified',
    cold: 'Mild winters only, not sub-zero',
    price: '$2,199-$2,799',
    best: false,
  },
  {
    model: 'Dynamic Barcelona / Gracia (Golden Designs)',
    cap: '1-2 person',
    wood: 'Canadian hemlock',
    roof: 'None, indoor cabinet',
    heater: 'Far infrared carbon',
    emf: 'Low EMF (mfr)',
    cold: 'Indoor only, needs a dry covered space',
    price: '$1,600-$2,400',
    best: false,
  },
];

const outdoorWoodRows = [
  {
    wood: 'Western red cedar (Canadian)',
    rot: 'High. Natural thujaplicin oils resist fungi and insects with no treatment',
    movement: 'Low. Among the most dimensionally stable softwoods through freeze-thaw',
    verdict: 'The default for outdoor cabins. Left bare it silvers to grey in 18-36 months, which is cosmetic, not structural.',
  },
  {
    wood: 'Thermowood (thermally modified aspen, pine or spruce)',
    rot: 'High. Heat treatment at 190-215°C removes the sugars fungi and insects feed on',
    movement: 'Very low. Roughly half the seasonal movement of untreated stock',
    verdict: 'The strongest technical choice for a fully exposed site, and it stays cooler to the touch. Costs about 15-30% more than spruce.',
  },
  {
    wood: 'Nordic spruce',
    rot: 'Moderate, and only when sealed',
    movement: 'Moderate. Checks and cups if it cycles wet to dry repeatedly',
    verdict: 'Acceptable under a roof or pergola with an annual UV oil coat. Not a fully uncovered wood.',
  },
  {
    wood: 'Canadian hemlock',
    rot: 'Low. No natural extractives to resist decay',
    movement: 'Low indoors, unpredictable once it takes on water',
    verdict: 'An indoor wood. Most hemlock cabins, including the popular Dynamic models, exclude outdoor placement from the warranty.',
  },
  {
    wood: 'Pressure-treated pine',
    rot: 'High against ground contact rot',
    movement: 'High. Prone to cupping and twisting as it dries',
    verdict: 'Use it for the base frame or deck under the cabin, never for benches or interior walls: treated lumber should not sit at 140°F next to bare skin.',
  },
];

const outdoorRoofOptions = [
  {
    name: 'Asphalt shingle over sheathing',
    detail: 'Cheapest factory option and the standard on Dundalk and Almost Heaven cabin roofs. 15-20 year service life, adds 120-200 lbs to the structure, and needs a 3/12 pitch or steeper to shed properly.',
  },
  {
    name: 'Standing-seam or corrugated metal',
    detail: 'Sheds snow best and lasts 40 years plus. Adds roughly $400-$900 as a factory upgrade. At a 4/12 pitch it mostly self-clears after a storm, which is the single biggest maintenance saving in snow country.',
  },
  {
    name: 'Cedar shake',
    detail: 'Matches the cabin visually and breathes well. Needs re-oiling every 2-3 years and is the least forgiving option if leaf litter sits on it through a wet autumn.',
  },
  {
    name: 'EPDM rubber membrane',
    detail: 'The common factory roof on low-slope Clearlight and Sun Home outdoor cabins. Watch the seam warranty, since seams, not the field of the membrane, are where these fail.',
  },
  {
    name: 'Barrel profile, no separate roof',
    detail: 'The curve sheds water without a roof kit. The two flat end walls are the weak point, so face the door end away from prevailing wind and driving rain.',
  },
];

const outdoorBaseRows = [
  {
    base: 'Poured concrete pad, 4 in. reinforced over 4 in. compacted gravel',
    cost: '$6-$12 per sq ft installed',
    verdict: 'The permanent answer in any climate. No settling, no rodent access under the floor, and it stays level through frost heave when the gravel base drains.',
  },
  {
    base: 'Compacted gravel with 2 in. concrete pavers',
    cost: '$3-$6 per sq ft, DIY in a weekend',
    verdict: 'Perfectly adequate for a 300-600 lb cabin. Plan to re-level it every two to three years anywhere the ground freezes.',
  },
  {
    base: 'Existing deck',
    cost: 'Free if the framing is sound',
    verdict: 'Run the number instead of guessing. A 580 lb cabin plus two occupants over a 6x7 ft footprint is about 23 lbs per sq ft, well under the 40 psf residential deck live load. The risk is point loading at the four corners and the age of the joists, so add blocking or a beam directly under the cabin footprint.',
  },
  {
    base: 'Deck blocks or helical piers with a treated frame',
    cost: '$500-$1,500',
    verdict: 'The right call on a sloped yard where a pad would need a retaining wall. Keep the frame 6 in. above grade so splashback does not reach the cabin sill.',
  },
];

const outdoorFaqItems = [
  {
    q: 'Can you put an infrared sauna outside?',
    a: 'Only if the unit is specifically rated for outdoor use. Standard indoor infrared saunas placed outside will void the warranty and typically fail within 1-2 seasons. Outdoor-rated units have IP-rated electrical connectors, weatherproof control panels, UV-resistant finishes, and drainage design. The four models in this guide are the only ones we evaluated with credible outdoor specifications.',
  },
  {
    q: 'How do outdoor infrared saunas handle winter?',
    a: 'Purpose-built units from Clearlight and Almost Heaven are rated to -20°F ambient. Heat-up times increase in cold weather - expect 5-10 minutes longer than the rated time when ambient temperatures are below 20°F. The cedar construction in quality outdoor units handles freeze-thaw cycles without warping when properly assembled. Clearlight and Almost Heaven have the most documented cold-climate use data from owner communities.',
  },
  {
    q: 'Do outdoor saunas need a cover?',
    a: 'Yes, for long-term wood finish preservation. UV exposure dulls cedar and hemlock finishes over 2-3 seasons without protection. Snow load management also matters in northern climates - most quality outdoor units include roof panels; barrel designs shed snow naturally. If your unit lacks a built-in roof, a pergola or retractable awning extends finish life significantly and protects the control panel.',
  },
  {
    q: 'Is outdoor infrared more expensive than indoor?',
    a: 'Yes, typically 40-80% more for comparable capacity and heater quality. Outdoor-rated construction - weatherproof electrical, UV-resistant finishes, drainage design, and cold-climate insulation - adds significant cost over indoor builds. Expect a minimum of $3,500 for a credible outdoor 2-person unit. Budget outdoor options under that price point typically use indoor construction with weatherproof finishes only - a meaningful difference in longevity.',
  },
  {
    q: 'Does an outdoor infrared sauna need a roof?',
    a: 'If the cabin sits under open sky, yes. Water sitting on a flat top panel is what kills outdoor saunas, not rain hitting the walls. Look for a factory roof with a 3/12 pitch or steeper, or a barrel profile that sheds water by shape. Metal roofing at a 4/12 pitch self-clears after most storms and lasts 40 years plus; asphalt shingle is cheaper and lasts 15-20 years; EPDM membrane is common on low-slope factory cabins, where the seams are the part that fails. If your unit ships without a roof, a pergola or deep eave over the top is not optional in a wet or snowy climate.',
  },
  {
    q: 'What is the best outdoor infrared sauna for a backyard?',
    a: 'For most backyards the Clearlight Sanctuary Outdoor 2 at $6,995 is the pick, because it is one of the few cabins with IP-rated exterior electrical, a factory weather roof, and EMF verified under 0.3 mG rather than claimed. Sun Home Luminar Outdoor at $5,495 is the value full-spectrum alternative. If you want a shape that handles snow without a roof kit, the Almost Heaven cedar barrel runs $3,500-$5,000. Before you choose, measure three things in the yard itself: distance from the electrical panel, whether the site can hold a level 6x7 ft base, and whether you can leave 24-36 inches of service clearance on three sides.',
  },
  {
    q: 'What wood is best for an outdoor infrared sauna?',
    a: 'Western red cedar is the default. Its natural thujaplicin oils resist rot and insects with no treatment, and it is among the most dimensionally stable softwoods through freeze-thaw cycles. Thermally modified wood, sold as thermowood, is the stronger technical choice for a fully exposed site: heat treatment at 190-215°C removes the sugars fungi feed on and cuts seasonal movement roughly in half. Nordic spruce works under a roof or pergola with an annual UV oil coat. Avoid Canadian hemlock outdoors: it has no natural decay resistance, and most hemlock cabins exclude outdoor placement from the warranty.',
  },
  {
    q: 'Do outdoor infrared saunas need a dedicated electrical circuit?',
    a: 'Yes. Most 2-person outdoor cabins draw 15-20A at 240V and are specified on a dedicated 240V/20A or 30A circuit. Even a 1,600-1,800W 120V unit needs its own 15-20A branch, because it will trip the breaker as soon as anything else shares the circuit. The branch needs GFCI protection under NEC 210.8, an in-use weatherproof cover if it ends in a receptacle, and a weatherproof disconnect within sight if the cabin is hardwired. Budget $200-$400 when the panel is on the same wall and $400-$1,200 for a trenched run of 60-120 feet, since runs past about 100 feet usually get upsized from 10 AWG to 8 AWG to hold voltage drop under 3%.',
  },
];

const outdoorTocItems = [
  'Can a standard sauna go outside?',
  'Top outdoor infrared saunas',
  'Side-by-side comparison',
  'Full outdoor spec matrix',
  'Wood, roof and cold-weather build',
  'Electrical and siting',
  'Installation requirements',
  'Covered vs uncovered, and winterizing',
  'Frequently asked',
];

function BestOutdoorInfraredSauna({ mobile = false }) {
  return mobile ? <BestOutdoorInfraredSaunaMobile /> : <BestOutdoorInfraredSaunaDesktop />;
}

function BestOutdoorInfraredSaunaDesktop() {
  return (
    <div style={{ background: 'var(--paper)', color: 'var(--text)', fontFamily: 'var(--sans)', minHeight: '100vh' }}>
      <SiteHeader />

      {/* Hero */}
      <section style={{ padding: '52px 40px 0' }}>
        <div style={{ maxWidth: 1180, margin: '0 auto' }}>
          <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 22 }}>
            <div className="mono" style={{ fontSize: 10.5, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--text-3)' }}>
              Best Of · Outdoor Infrared Saunas · Updated May 2026
            </div>
            <Disclose>Independent · affiliate supported</Disclose>
          </div>
          <div className="eyebrow" style={{ marginBottom: 14 }}>Best Of</div>
          <h1 style={{ fontSize: 54, lineHeight: 1.0, letterSpacing: '-0.024em', margin: 0, maxWidth: 900 }}>
            The Best Outdoor Infrared Saunas of 2026: Built for Year-Round Use
          </h1>
          <p style={{ fontFamily: 'var(--serif)', fontSize: 20, color: 'var(--text-2)', marginTop: 18, maxWidth: 780, lineHeight: 1.45 }}>
            Most infrared saunas are indoor-only. Here are the outdoor-rated units that survive freeze-thaw cycles, rain, and UV - and how to tell the difference.
          </p>
          <div style={{ display: 'flex', gap: 12, marginTop: 24, flexWrap: 'wrap' }}>
            <span className="chip ember">4 models evaluated</span>
            <span className="chip">9-model spec matrix</span>
            <span className="chip">Outdoor-rated only</span>
            <span className="chip">Wiring and siting included</span>
          </div>

          {/* Answer-first summary */}
          <div style={{
            marginTop: 30,
            padding: '24px 28px',
            background: 'var(--paper-2)',
            border: '1px solid var(--line)',
            borderRadius: 16,
            maxWidth: 900,
          }}>
            <div className="eyebrow" style={{ color: 'var(--ember-deep)', marginBottom: 12 }}>The short answer</div>
            <p style={{ fontSize: 15.5, color: 'var(--text-2)', lineHeight: 1.7, margin: '0 0 12px' }}>
              The best outdoor infrared sauna for most buyers is the <strong style={{ color: 'var(--text)' }}>Clearlight Sanctuary Outdoor 2</strong> at $6,995: western red cedar, IP-rated exterior electrical, a factory weather roof, and EMF measured under 0.3 mG by a third party instead of claimed on a spec sheet. The <strong style={{ color: 'var(--text)' }}>Sun Home Luminar Outdoor 2</strong> at $5,495 is the value full-spectrum pick, the <strong style={{ color: 'var(--text)' }}>Almost Heaven Pinnacle barrel</strong> at $3,500 to $5,000 is the choice when you want a shape that sheds snow without a roof kit, and the <strong style={{ color: 'var(--text)' }}>Radiant Saunas 2-Person Outdoor</strong> at $2,199 is the budget entry for mild winters.
            </p>
            <p style={{ fontSize: 15.5, color: 'var(--text-2)', lineHeight: 1.7, margin: 0 }}>
              The rest of this guide is the part roundups skip: which woods survive uncovered, what roof pitch actually sheds snow, how much longer a cabin takes to reach 140°F at 0°F ambient, what circuit and base the unit needs, and how to winterize it so it lasts past season three.
            </p>
          </div>
        </div>
      </section>

      {/* Two-column: TOC + Educational */}
      <section style={{ padding: '56px 40px 0' }}>
        <div style={{ maxWidth: 1180, margin: '0 auto', display: 'grid', gridTemplateColumns: '220px 1fr', gap: 56, alignItems: 'start' }}>
          <TOC items={outdoorTocItems} active={0} />

          <div>
            <div className="eyebrow">Background</div>
            <h2 style={{ fontSize: 36, letterSpacing: '-0.02em', margin: '10px 0 22px', lineHeight: 1.1 }}>Can a Standard Infrared Sauna Go Outside?</h2>

            {/* Callout box */}
            <div style={{
              background: 'var(--paper-2)',
              borderLeft: '4px solid var(--ember-deep)',
              borderRadius: '0 12px 12px 0',
              padding: '18px 22px',
              marginBottom: 28,
            }}>
              <p style={{ margin: 0, fontSize: 15, lineHeight: 1.65, color: 'var(--text-2)' }}>
                Most home infrared saunas are not outdoor-rated. The control panels, wiring, and wood joinery are designed for dry indoor conditions. Placing a standard unit outside voids most warranties and causes premature failure within 1-2 seasons.
              </p>
            </div>

            <p style={{ fontSize: 15, color: 'var(--text-2)', lineHeight: 1.65, marginTop: 0, marginBottom: 20 }}>
              A genuinely outdoor-rated infrared sauna is a different product category, not just a regular sauna with a water-resistant finish applied. The distinction matters for both safety and longevity.
            </p>

            <div className="eyebrow" style={{ marginBottom: 14 }}>What outdoor-rated means</div>
            <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 14 }}>
              {[
                { label: 'IP-rated electrical', desc: 'Ingress-protected connectors on all external electrical components. Prevents moisture damage to wiring and junction boxes.' },
                { label: 'Weatherproof control panel', desc: 'Sealed control panel rated for rain exposure and temperature cycling. Standard panels corrode or short within months outside.' },
                { label: 'Western red cedar or treated lumber', desc: 'Cedar weathers naturally without finish maintenance. Hemlock requires additional treatment for outdoor use. Check what is specified.' },
                { label: 'Drainage design', desc: 'Floor and base design accounts for rain, condensation, and snowmelt drainage rather than assuming a dry interior environment.' },
                { label: 'Cold-weather insulation', desc: 'Quality outdoor units are rated to at least -20°F. Standard indoor insulation is not sufficient for northern climates.' },
                { label: 'UV-resistant exterior', desc: 'UV-stable finishes or natural cedar prevent exterior degradation from sun exposure over multiple seasons.' },
              ].map(f => (
                <div key={f.label} style={{ padding: '16px 18px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 12 }}>
                  <div style={{ fontFamily: 'var(--serif)', fontSize: 15, letterSpacing: '-0.01em', marginBottom: 6 }}>{f.label}</div>
                  <p style={{ fontSize: 13, color: 'var(--text-2)', margin: 0, lineHeight: 1.55 }}>{f.desc}</p>
                </div>
              ))}
            </div>
          </div>
        </div>
      </section>

      {/* Ranked products */}
      <section style={{ padding: '64px 40px 0' }}>
        <div style={{ maxWidth: 1180, margin: '0 auto' }}>
          <h2 style={{ fontSize: 40, letterSpacing: '-0.022em', margin: '0 0 8px' }}>Top outdoor infrared saunas</h2>
          <p style={{ fontSize: 15, color: 'var(--text-2)', margin: '0 0 36px', lineHeight: 1.5 }}>Ranked by outdoor build quality, cold-weather ratings, EMF verification, and documented owner reports.</p>

          <div style={{ display: 'flex', flexDirection: 'column', gap: 28 }}>
            {outdoorProducts.map((p, i) => (
              <div key={p.rank} id={p.id} style={{
                border: '1px solid var(--line)',
                borderRadius: 18,
                overflow: 'hidden',
                background: i === 0 ? 'var(--paper-2)' : 'var(--paper)',
              }}>
                <div style={{ display: 'grid', gridTemplateColumns: '260px 1fr', minHeight: 280 }}>
                  {/* Left panel */}
                  <div style={{ background: 'var(--paper-2)', padding: 24, display: 'flex', flexDirection: 'column', gap: 14, borderRight: '1px solid var(--line)' }}>
                    <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start' }}>
                      <span style={{ fontFamily: 'var(--mono)', fontSize: 11, color: 'var(--text-3)', letterSpacing: '0.08em' }}>{p.rank}</span>
                      <span className={p.tagEmber ? 'chip ember' : 'chip'} style={{ fontSize: 9.5 }}>{p.tag}</span>
                    </div>
                    <Ph w="100%" h={160} label={p.name.split(' ').slice(0, 2).join(' ').toUpperCase()} />
                    <div>
                      <div style={{ fontFamily: 'var(--serif)', fontSize: 18, letterSpacing: '-0.014em', lineHeight: 1.2 }}>{p.name}</div>
                      <div style={{ fontSize: 12, color: 'var(--text-3)', marginTop: 3 }}>{p.brand}</div>
                    </div>
                    <div style={{ display: 'flex', justifyContent: 'space-between', paddingTop: 12, borderTop: '1px solid var(--line)' }}>
                      <div>
                        <div className="mono" style={{ fontSize: 9, letterSpacing: '0.14em', color: 'var(--text-3)' }}>PRICE</div>
                        <div style={{ fontFamily: 'var(--serif)', fontSize: 18, letterSpacing: '-0.016em' }}>{p.price}</div>
                      </div>
                      <div style={{ textAlign: 'right' }}>
                        <div className="mono" style={{ fontSize: 9, letterSpacing: '0.14em', color: 'var(--text-3)' }}>SCORE</div>
                        <div style={{ fontFamily: 'var(--serif)', fontSize: 20, color: 'var(--ember-deep)' }}>{p.score}<span style={{ fontSize: 11, color: 'var(--text-3)' }}>/10</span></div>
                      </div>
                    </div>
                    <a
                      href={p.amazon ? p.cta.href : p.cta.href}
                      className="btn btn-primary"
                      style={{ width: '100%', justifyContent: 'center', fontSize: 12.5 }}
                      {...(p.amazon ? { target: '_blank', rel: 'noopener sponsored' } : {})}
                    >
                      {p.cta.label} →
                    </a>
                  </div>

                  {/* Right panel */}
                  <div style={{ padding: '28px 32px', display: 'flex', flexDirection: 'column', gap: 18 }}>
                    <div style={{ display: 'flex', gap: 10, flexWrap: 'wrap' }}>
                      {[
                        { label: 'Spectrum', val: p.spectrum },
                        { label: 'Construction', val: p.construction },
                        { label: 'Capacity', val: p.capacity },
                        { label: 'Voltage', val: p.voltage },
                        { label: 'EMF', val: p.emf },
                      ].map(s => (
                        <div key={s.label} style={{ padding: '7px 12px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 8 }}>
                          <div className="mono" style={{ fontSize: 9, letterSpacing: '0.12em', color: 'var(--text-3)' }}>{s.label}</div>
                          <div style={{ fontFamily: 'var(--serif)', fontSize: 13.5, marginTop: 2 }}>{s.val}</div>
                        </div>
                      ))}
                    </div>
                    <p style={{ fontSize: 14.5, color: 'var(--text-2)', lineHeight: 1.65, margin: 0 }}>{p.why}</p>
                    <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16 }}>
                      <div>
                        <div className="eyebrow" style={{ color: 'var(--ember-deep)', marginBottom: 10 }}>Pros</div>
                        <ul style={{ margin: 0, padding: 0, listStyle: 'none', display: 'flex', flexDirection: 'column', gap: 8 }}>
                          {p.pros.map(x => (
                            <li key={x} style={{ display: 'flex', gap: 8, fontSize: 13.5, color: 'var(--text-2)', lineHeight: 1.45 }}>
                              <span style={{ color: 'var(--ember)', flexShrink: 0, fontFamily: 'var(--mono)' }}>+</span>{x}
                            </li>
                          ))}
                        </ul>
                      </div>
                      <div>
                        <div className="eyebrow" style={{ marginBottom: 10 }}>Cons</div>
                        <ul style={{ margin: 0, padding: 0, listStyle: 'none', display: 'flex', flexDirection: 'column', gap: 8 }}>
                          {p.cons.map(x => (
                            <li key={x} style={{ display: 'flex', gap: 8, fontSize: 13.5, color: 'var(--text-2)', lineHeight: 1.45 }}>
                              <span style={{ color: 'var(--text-3)', flexShrink: 0, fontFamily: 'var(--mono)' }}>-</span>{x}
                            </li>
                          ))}
                        </ul>
                      </div>
                    </div>
                  </div>
                </div>
              </div>
            ))}
          </div>
        </div>
      </section>

      {/* Comparison table */}
      <section style={{ padding: '64px 40px 0' }}>
        <div style={{ maxWidth: 1180, margin: '0 auto' }}>
          <h2 style={{ fontSize: 38, letterSpacing: '-0.02em', margin: '0 0 22px' }}>Side-by-side comparison</h2>
          <div style={{ borderRadius: 14, overflow: 'hidden', border: '1px solid var(--line)' }}>
            <table className="tbl" style={{ width: '100%' }}>
              <thead>
                <tr>
                  <th style={{ textAlign: 'left' }}>Model</th>
                  <th>EMF</th>
                  <th>Construction</th>
                  <th>Capacity</th>
                  <th>Price</th>
                  <th>Score</th>
                </tr>
              </thead>
              <tbody>
                {outdoorCompareRows.map((r, i) => (
                  <tr key={i} className={r.best ? 'best' : ''}>
                    <td>
                      <div style={{ fontFamily: 'var(--serif)', fontSize: 15 }}>{r.name}</div>
                    </td>
                    <td className="mono" style={{ fontSize: 12, textAlign: 'center' }}>{r.emf}</td>
                    <td style={{ fontSize: 13, textAlign: 'center', color: 'var(--text-2)' }}>{r.construction}</td>
                    <td style={{ fontSize: 13, textAlign: 'center', color: 'var(--text-2)' }}>{r.capacity}</td>
                    <td style={{ fontFamily: 'var(--serif)', fontSize: 15, textAlign: 'center' }}>{r.price}</td>
                    <td style={{ fontFamily: 'var(--serif)', fontSize: 18, textAlign: 'center', color: 'var(--ember-deep)' }}>{r.score}</td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        </div>
      </section>

      {/* Full outdoor spec matrix */}
      <section style={{ padding: '64px 40px 0' }}>
        <div style={{ maxWidth: 1180, margin: '0 auto' }}>
          <h2 style={{ fontSize: 38, letterSpacing: '-0.02em', margin: '0 0 10px' }}>Full outdoor spec matrix</h2>
          <p style={{ fontSize: 15, color: 'var(--text-2)', margin: '0 0 26px', lineHeight: 1.55, maxWidth: 780 }}>
            The columns that decide an outdoor purchase are not the ones on a generic sauna comparison. Capacity and price matter, but so do the wood species, the roof, and whether anyone has ever measured the EMF. The last row is included as a warning: it is one of the most-searched infrared cabins on the market and it is not an outdoor product.
          </p>
          <div style={{ borderRadius: 14, overflow: 'auto', border: '1px solid var(--line)' }}>
            <table className="tbl" style={{ width: '100%', minWidth: 980 }}>
              <thead>
                <tr>
                  <th style={{ textAlign: 'left' }}>Model</th>
                  <th>Capacity</th>
                  <th>Wood</th>
                  <th>Roof</th>
                  <th>Heater</th>
                  <th>EMF</th>
                  <th>Cold rating</th>
                  <th>Price band</th>
                </tr>
              </thead>
              <tbody>
                {outdoorMatrixRows.map((r, i) => (
                  <tr key={i} className={r.best ? 'best' : ''}>
                    <td><div style={{ fontFamily: 'var(--serif)', fontSize: 14.5, lineHeight: 1.25 }}>{r.model}</div></td>
                    <td style={{ fontSize: 12.5, textAlign: 'center', color: 'var(--text-2)' }}>{r.cap}</td>
                    <td style={{ fontSize: 12.5, textAlign: 'center', color: 'var(--text-2)' }}>{r.wood}</td>
                    <td style={{ fontSize: 12.5, textAlign: 'center', color: 'var(--text-2)' }}>{r.roof}</td>
                    <td style={{ fontSize: 12.5, textAlign: 'center', color: 'var(--text-2)' }}>{r.heater}</td>
                    <td className="mono" style={{ fontSize: 11, textAlign: 'center', color: 'var(--text-2)' }}>{r.emf}</td>
                    <td style={{ fontSize: 12.5, textAlign: 'center', color: 'var(--text-2)' }}>{r.cold}</td>
                    <td style={{ fontFamily: 'var(--serif)', fontSize: 14.5, textAlign: 'center' }}>{r.price}</td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
          <div style={{ marginTop: 16, padding: '14px 18px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 12 }}>
            <p style={{ fontSize: 13.5, color: 'var(--text-2)', margin: 0, lineHeight: 1.6 }}>
              Entries marked (mfr) are manufacturer-reported and have no published third-party test behind them. Clearlight is the only brand in this set that publishes an independent EMF report, which is why it holds the top spot despite costing $1,500 more than the next unit. Our <a href="/best/best-low-emf-infrared-sauna/" style={{ color: 'var(--ember-deep)' }}>low-EMF sauna guide</a> explains how those measurements are taken and why seated-position readings are the only ones worth comparing.
            </p>
          </div>
        </div>
      </section>

      {/* Wood, roof, cold-weather build */}
      <section style={{ padding: '64px 40px 0' }}>
        <div style={{ maxWidth: 1180, margin: '0 auto' }}>
          <h2 style={{ fontSize: 40, letterSpacing: '-0.022em', margin: '0 0 10px' }}>Wood, Roof and Cold-Weather Build</h2>
          <p style={{ fontSize: 15, color: 'var(--text-2)', margin: '0 0 30px', lineHeight: 1.6, maxWidth: 780 }}>
            An outdoor cabin fails in one of four places: the wood, the roof, the electrical, or the base. Three of those are decided before you buy. Here is how to read a spec sheet for each.
          </p>

          <h3 style={{ fontSize: 22, letterSpacing: '-0.014em', margin: '0 0 14px' }}>Wood species: what actually survives uncovered</h3>
          <div style={{ borderRadius: 14, overflow: 'auto', border: '1px solid var(--line)', marginBottom: 34 }}>
            <table className="tbl" style={{ width: '100%', minWidth: 860 }}>
              <thead>
                <tr>
                  <th style={{ textAlign: 'left' }}>Species</th>
                  <th style={{ textAlign: 'left' }}>Rot and insect resistance</th>
                  <th style={{ textAlign: 'left' }}>Freeze-thaw movement</th>
                  <th style={{ textAlign: 'left' }}>Verdict</th>
                </tr>
              </thead>
              <tbody>
                {outdoorWoodRows.map((w, i) => (
                  <tr key={i}>
                    <td><div style={{ fontFamily: 'var(--serif)', fontSize: 14.5, lineHeight: 1.25 }}>{w.wood}</div></td>
                    <td style={{ fontSize: 13, color: 'var(--text-2)', lineHeight: 1.5 }}>{w.rot}</td>
                    <td style={{ fontSize: 13, color: 'var(--text-2)', lineHeight: 1.5 }}>{w.movement}</td>
                    <td style={{ fontSize: 13, color: 'var(--text-2)', lineHeight: 1.5 }}>{w.verdict}</td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>

          <h3 style={{ fontSize: 22, letterSpacing: '-0.014em', margin: '0 0 8px' }}>Roof options and snow load</h3>
          <p style={{ fontSize: 15, color: 'var(--text-2)', margin: '0 0 18px', lineHeight: 1.65, maxWidth: 820 }}>
            Standing water on a flat top panel is what destroys outdoor cabins, not rain on the walls. Anything under a 3/12 pitch needs a membrane rather than shingles, and anything in snow country wants steeper.
          </p>
          <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 14, marginBottom: 20 }}>
            {outdoorRoofOptions.map(r => (
              <div key={r.name} style={{ padding: '16px 18px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 12 }}>
                <div style={{ fontFamily: 'var(--serif)', fontSize: 15.5, letterSpacing: '-0.01em', marginBottom: 6 }}>{r.name}</div>
                <p style={{ fontSize: 13, color: 'var(--text-2)', margin: 0, lineHeight: 1.6 }}>{r.detail}</p>
              </div>
            ))}
          </div>
          <div style={{
            background: 'var(--paper-2)',
            borderLeft: '4px solid var(--ember-deep)',
            borderRadius: '0 12px 12px 0',
            padding: '18px 22px',
            marginBottom: 34,
          }}>
            <p style={{ margin: 0, fontSize: 14.5, lineHeight: 1.7, color: 'var(--text-2)' }}>
              <strong style={{ color: 'var(--text)' }}>Do the snow-load arithmetic once.</strong> Design ground snow loads run about 20 psf across much of the mid-Atlantic and 40-70 psf through the Upper Midwest, New England and the mountain west. A 6x7 ft cabin footprint is 42 square feet, so at 50 psf a fully loaded roof is carrying roughly 2,100 lbs. If the manufacturer only says the roof is rated for "light snow" and will not give you a number in psf, treat that as a shoveling obligation after any storm over 8 inches.
            </p>
          </div>

          <h3 style={{ fontSize: 22, letterSpacing: '-0.014em', margin: '0 0 8px' }}>How cold-climate performance actually works</h3>
          <p style={{ fontSize: 15, color: 'var(--text-2)', margin: '0 0 16px', lineHeight: 1.7, maxWidth: 820 }}>
            Infrared heats the body directly rather than the air, so a cabin at 5°F still delivers a usable session. What changes is stabilization time and how cold the bench feels for the first few minutes. At 70°F ambient a 2-person cabin reaches 140°F in roughly 20 minutes. At 30°F, expect 30-35 minutes. At 0°F on a 240V unit, expect 40-50 minutes, and longer again on a 120V heater running half the wattage.
          </p>
          <p style={{ fontSize: 15, color: 'var(--text-2)', margin: '0 0 16px', lineHeight: 1.7, maxWidth: 820 }}>
            Three build details close most of that gap: 1.5 to 2 inches of foil-faced insulation in the wall cavity (roughly R-6 to R-8), double-pane tempered glass instead of a single sheet, and a gasketed or magnetic door seal rather than a plain wood-to-wood closure. Ask which of the three the unit has before you ask about the ambient rating.
          </p>
          <p style={{ fontSize: 15, color: 'var(--text-2)', margin: '0 0 34px', lineHeight: 1.7, maxWidth: 820 }}>
            A cabin advertised as rated to -20°F is a claim about the electronics and the enclosure surviving that ambient, not a promise that it heats as fast as it does indoors. If you live somewhere with real winter, the practical fix is scheduling: a controller or a smart pre-heat that starts the cabin 45 minutes before you walk out means the cold-start penalty never affects you.
          </p>

          <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 18 }}>
            <div style={{ padding: '20px 22px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 14 }}>
              <h3 style={{ margin: '0 0 10px', fontSize: 18, letterSpacing: '-0.012em' }}>UV exposure and fading</h3>
              <p style={{ fontSize: 14, color: 'var(--text-2)', margin: 0, lineHeight: 1.65 }}>
                Unfinished cedar shifts from red-brown to silver-grey in 18-36 months of direct sun. That is surface lignin breaking down in the top 0.1 mm, and it does not weaken the wall. If you want to keep the colour, use a penetrating UV oil rather than a film-forming varnish, once a year on the south and west faces only. Never apply oil, varnish or sealer to interior surfaces: those coatings off-gas at 140-160°F.
              </p>
            </div>
            <div style={{ padding: '20px 22px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 14 }}>
              <h3 style={{ margin: '0 0 10px', fontSize: 18, letterSpacing: '-0.012em' }}>Required clearances</h3>
              <p style={{ fontSize: 14, color: 'var(--text-2)', margin: 0, lineHeight: 1.65 }}>
                Manuals typically state a hard minimum of 4-6 inches of airflow gap behind and beside the cabin. Plan 24-36 inches on at least three sides anyway, because that is what it takes to re-oil the walls, inspect the roof-to-wall seam, and reach a service panel. Keep 36 inches clear at the electrical entry, and hold the cabin at least 24 inches off a fence so snow and leaf litter do not pack against the siding.
              </p>
            </div>
          </div>
        </div>
      </section>

      {/* Electrical and siting */}
      <section style={{ padding: '64px 40px 0' }}>
        <div style={{ maxWidth: 1180, margin: '0 auto' }}>
          <h2 style={{ fontSize: 40, letterSpacing: '-0.022em', margin: '0 0 10px' }}>Electrical and Siting</h2>
          <p style={{ fontSize: 15, color: 'var(--text-2)', margin: '0 0 26px', lineHeight: 1.7, maxWidth: 820 }}>
            An outdoor infrared sauna is a wiring job before it is a wellness purchase, and the wiring is where the quotes surprise people. Most 2-person outdoor cabins draw 15-20A at 240V and are specified on a dedicated 240V/20A or 30A circuit. Even the smaller 1,600-1,800W 120V units need their own 15-20A branch: a 1,700W heater sharing a circuit with anything else trips the breaker the first time a second load comes on. Our <a href="/how-to/infrared-sauna-electrical-requirements/" style={{ color: 'var(--ember-deep)' }}>infrared sauna electrical requirements guide</a> covers breaker sizing and wire gauge in detail.
          </p>
          <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 18, marginBottom: 30 }}>
            {[
              {
                title: 'GFCI and weatherproofing',
                body: 'NEC 210.8 requires GFCI protection on outdoor branch circuits, and Article 680 governs the wet-location rules around heated installations. If the circuit ends in a receptacle it needs an in-use "bubble" cover rated for a plug left in it. If the cabin is hardwired it needs a weatherproof disconnect within sight of the unit. Both details get flagged at inspection, so build them in rather than retrofitting.',
              },
              {
                title: 'Distance and voltage drop',
                body: 'A run to the back of the yard is where the budget moves. Past roughly 100 feet most electricians upsize from 10 AWG to 8 AWG to hold voltage drop under 3%, which raises material cost noticeably. Expect $200-$400 when the panel is on the same wall, and $400-$1,200 for a trenched run of 60-120 feet including the permit.',
              },
              {
                title: 'Trenching',
                body: 'Burial depth is set by NEC 300.5 and depends on the wiring method: typically 18-24 inches for direct-burial cable, shallower for PVC conduit or a GFCI-protected residential branch. Call 811 before digging and let the electrician pull the permit. Trenching by hand across 60 feet of clay is a weekend you will not get back.',
              },
              {
                title: 'Total installed cost',
                body: 'Add the electrical and the base to the sticker price before you compare models. A $5,495 cabin with a $900 trenched circuit and a $700 paver base is a $7,095 project. Our full cost breakdown covers running costs too, which for an outdoor unit sit 20-40% above the same cabin indoors in winter.',
                link: { href: '/guides/infrared-sauna-cost/', label: 'infrared sauna cost guide' },
              },
            ].map(g => (
              <div key={g.title} style={{ padding: '22px 24px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 14 }}>
                <h3 style={{ margin: '0 0 12px', fontSize: 18, letterSpacing: '-0.012em' }}>{g.title}</h3>
                <p style={{ fontSize: 14, color: 'var(--text-2)', margin: 0, lineHeight: 1.65 }}>
                  {g.body}
                  {g.link ? <span> See the <a href={g.link.href} style={{ color: 'var(--ember-deep)' }}>{g.link.label}</a>.</span> : null}
                </p>
              </div>
            ))}
          </div>

          <h3 style={{ fontSize: 22, letterSpacing: '-0.014em', margin: '0 0 14px' }}>Choosing the base</h3>
          <div style={{ borderRadius: 14, overflow: 'auto', border: '1px solid var(--line)' }}>
            <table className="tbl" style={{ width: '100%', minWidth: 820 }}>
              <thead>
                <tr>
                  <th style={{ textAlign: 'left' }}>Base</th>
                  <th style={{ textAlign: 'left' }}>Cost</th>
                  <th style={{ textAlign: 'left' }}>When to use it</th>
                </tr>
              </thead>
              <tbody>
                {outdoorBaseRows.map((b, i) => (
                  <tr key={i}>
                    <td><div style={{ fontFamily: 'var(--serif)', fontSize: 14.5, lineHeight: 1.25 }}>{b.base}</div></td>
                    <td className="mono" style={{ fontSize: 12, color: 'var(--text-2)' }}>{b.cost}</td>
                    <td style={{ fontSize: 13, color: 'var(--text-2)', lineHeight: 1.55 }}>{b.verdict}</td>
                  </tr>
                ))}
              </tbody>
            </table>
          </div>
        </div>
      </section>

      {/* Installation requirements */}
      <section style={{ padding: '64px 40px 0' }}>
        <div style={{ maxWidth: 1180, margin: '0 auto' }}>
          <h2 style={{ fontSize: 40, letterSpacing: '-0.022em', margin: '0 0 10px' }}>What Outdoor Installation Requires</h2>
          <p style={{ fontSize: 15, color: 'var(--text-2)', margin: '0 0 32px', lineHeight: 1.5, maxWidth: 720 }}>
            Outdoor infrared sauna installation involves more planning than indoor. These are the four requirements that determine whether an installation succeeds long-term.
          </p>
          <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 22 }}>
            {[
              {
                title: 'Foundation',
                body: 'A level concrete pad (4-inch minimum thickness) is the standard base. Most outdoor units weigh 300-580 lbs fully assembled. A properly rated deck is an alternative, but check load ratings - standard residential decking is typically rated for 40 lbs per square foot, often insufficient for heavier units without reinforcement.',
              },
              {
                title: 'Electrical',
                body: 'A 240V/30A outdoor-rated circuit run to the installation location. The circuit requires a weatherproof junction box and GFCI protection as required by NEC 680 for outdoor electrical near wet environments. Budget $200-600 for licensed electrician work depending on panel proximity.',
              },
              {
                title: 'Cover and weather protection',
                body: 'Some units include a roof panel rated for snow load; others require an external pergola or awning. In climates with over 30 inches of annual snowfall, verify the roof panel load rating before installation. UV protection from a pergola or retractable cover extends wood finish life by 3-5 years.',
              },
              {
                title: 'Clearance and permits',
                body: 'Most manufacturers recommend 3-6 feet of clearance on all sides for ventilation and maintenance access. Some municipalities classify permanent outdoor structures requiring electrical connections as permitted structures - check local building codes before installation. Freestanding units on temporary surfaces typically do not require permits.',
              },
            ].map(g => (
              <div key={g.title} style={{ padding: '22px 24px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 14 }}>
                <h3 style={{ margin: '0 0 12px', fontSize: 18, letterSpacing: '-0.012em' }}>{g.title}</h3>
                <p style={{ fontSize: 14, color: 'var(--text-2)', margin: 0, lineHeight: 1.65 }}>{g.body}</p>
              </div>
            ))}
          </div>
          <div style={{ marginTop: 22, padding: '16px 20px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 12 }}>
            <span className="mono" style={{ fontSize: 10, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--text-3)' }}>Note</span>
            <p style={{ fontSize: 14, color: 'var(--text-2)', margin: '6px 0 0', lineHeight: 1.6 }}>
              Expect heat-up times 5-10 minutes longer than rated specifications when ambient temperatures are below 32°F. This is normal - outdoor-rated units still perform as designed, they simply require additional time to stabilize cabin temperature against the cold ambient.
            </p>
          </div>
        </div>
      </section>

      {/* FAQ */}
      <section style={{ padding: '64px 40px 0' }}>
        <div style={{ maxWidth: 1180, margin: '0 auto' }}>
          <h2 style={{ fontSize: 38, letterSpacing: '-0.02em', margin: '0 0 28px' }}>Frequently asked</h2>
          <FAQ items={outdoorFaqItems} />
        </div>
      </section>

      <div style={{ maxWidth: 1180, margin: '0 auto', padding: '40px 40px 0' }}>
        <MethodologyBox />
      </div>
      <div style={{ maxWidth: 1180, margin: '0 auto', padding: '28px 40px 0' }}>
        <AuthorBox />
      </div>

      <SiteFooter />
    </div>
  );
}

function BestOutdoorInfraredSaunaMobile() {
  return (
    <div style={{ background: 'var(--paper)', color: 'var(--text)', fontFamily: 'var(--sans)', minHeight: '100vh' }}>
      <MobHeader />

      {/* Hero */}
      <section style={{ padding: '32px 18px 0' }}>
        <div className="mono" style={{ fontSize: 10, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--text-3)', marginBottom: 10 }}>
          Best Of · Outdoor Infrared Saunas · May 2026
        </div>
        <h1 style={{ fontSize: 30, lineHeight: 1.1, letterSpacing: '-0.02em', margin: '0 0 14px' }}>
          The Best Outdoor Infrared Saunas of 2026
        </h1>
        <p style={{ fontFamily: 'var(--serif)', fontSize: 16, color: 'var(--text-2)', margin: '0 0 16px', lineHeight: 1.5 }}>
          Most infrared saunas are indoor-only. Here are the outdoor-rated units that survive freeze-thaw cycles, rain, and UV - and how to tell the difference.
        </p>
        <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap', marginBottom: 4 }}>
          <span className="chip ember">4 models</span>
          <span className="chip">Outdoor-rated only</span>
        </div>
      </section>

      {/* Educational callout */}
      <section style={{ padding: '32px 18px 0' }}>
        <h2 style={{ fontSize: 22, letterSpacing: '-0.016em', margin: '0 0 14px' }}>Can a Standard Infrared Sauna Go Outside?</h2>
        <div style={{
          background: 'var(--paper-2)',
          borderLeft: '4px solid var(--ember-deep)',
          borderRadius: '0 10px 10px 0',
          padding: '14px 16px',
          marginBottom: 16,
        }}>
          <p style={{ margin: 0, fontSize: 14, lineHeight: 1.6, color: 'var(--text-2)' }}>
            Most home infrared saunas are not outdoor-rated. The control panels, wiring, and wood joinery are designed for dry indoor conditions. Placing a standard unit outside voids most warranties and causes premature failure within 1-2 seasons.
          </p>
        </div>
        <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
          {[
            'IP-rated electrical connectors on all external components',
            'Weatherproof control panel - sealed against rain and temperature cycling',
            'Western red cedar or treated lumber rated for outdoor exposure',
            'Drainage design for rain and condensation',
            'Cold-weather insulation rated to at least -20°F in quality units',
          ].map((f, i) => (
            <div key={i} style={{ display: 'flex', gap: 10, fontSize: 13.5, color: 'var(--text-2)', lineHeight: 1.5 }}>
              <span style={{ color: 'var(--ember)', fontFamily: 'var(--mono)', flexShrink: 0 }}>+</span>
              <span>{f}</span>
            </div>
          ))}
        </div>
      </section>

      {/* Products - mobile stack */}
      <section style={{ padding: '32px 18px 0' }}>
        <h2 style={{ fontSize: 22, letterSpacing: '-0.016em', margin: '0 0 20px' }}>Top outdoor infrared saunas</h2>
        <div style={{ display: 'flex', flexDirection: 'column', gap: 20 }}>
          {outdoorProducts.map((p, i) => (
            <div key={p.rank} style={{
              border: '1px solid var(--line)',
              borderRadius: 14,
              overflow: 'hidden',
              background: i === 0 ? 'var(--paper-2)' : 'var(--paper)',
            }}>
              <div style={{ padding: 18 }}>
                <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', marginBottom: 12 }}>
                  <span style={{ fontFamily: 'var(--mono)', fontSize: 11, color: 'var(--text-3)' }}>{p.rank}</span>
                  <span className={p.tagEmber ? 'chip ember' : 'chip'} style={{ fontSize: 9.5 }}>{p.tag}</span>
                </div>
                <Ph w="100%" h={140} label={p.name.split(' ').slice(0, 2).join(' ').toUpperCase()} style={{ marginBottom: 14 }} />
                <div style={{ fontFamily: 'var(--serif)', fontSize: 18, letterSpacing: '-0.014em', marginBottom: 4 }}>{p.name}</div>
                <div style={{ fontSize: 12, color: 'var(--text-3)', marginBottom: 12 }}>{p.brand}</div>
                <div style={{ display: 'flex', gap: 8, flexWrap: 'wrap', marginBottom: 14 }}>
                  {[
                    { label: 'EMF', val: p.emf },
                    { label: 'Voltage', val: p.voltage },
                    { label: 'Capacity', val: p.capacity },
                  ].map(s => (
                    <div key={s.label} style={{ padding: '6px 10px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 8 }}>
                      <div className="mono" style={{ fontSize: 9, letterSpacing: '0.12em', color: 'var(--text-3)' }}>{s.label}</div>
                      <div style={{ fontSize: 13, marginTop: 2 }}>{s.val}</div>
                    </div>
                  ))}
                </div>
                <p style={{ fontSize: 13.5, color: 'var(--text-2)', margin: '0 0 14px', lineHeight: 1.6 }}>{p.why}</p>
                <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', paddingTop: 14, borderTop: '1px solid var(--line)' }}>
                  <div style={{ fontFamily: 'var(--serif)', fontSize: 18 }}>{p.price}</div>
                  <a
                    href={p.cta.href}
                    className="btn btn-primary"
                    style={{ fontSize: 12.5 }}
                    {...(p.amazon ? { target: '_blank', rel: 'noopener sponsored' } : {})}
                  >
                    {p.cta.label} →
                  </a>
                </div>
              </div>
            </div>
          ))}
        </div>
      </section>

      {/* Installation - mobile */}
      <section style={{ padding: '32px 18px 0' }}>
        <h2 style={{ fontSize: 22, letterSpacing: '-0.016em', margin: '0 0 16px' }}>What Outdoor Installation Requires</h2>
        <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
          {[
            { title: 'Foundation', body: 'Level concrete pad (4-inch minimum) or rated deck. Most units weigh 300-580 lbs. Verify deck load ratings before installation.' },
            { title: 'Electrical', body: '240V/30A outdoor-rated circuit with weatherproof junction box and GFCI protection. Budget $200-600 for electrician work.' },
            { title: 'Cover', body: 'Some units include a roof panel. Others need a pergola or awning. Snow load management required in northern climates.' },
            { title: 'Clearance and permits', body: '3-6 feet on all sides. Check local codes - some municipalities require permits for outdoor structures with electrical connections.' },
          ].map(g => (
            <div key={g.title} style={{ padding: '16px 18px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 12 }}>
              <div style={{ fontFamily: 'var(--serif)', fontSize: 16, marginBottom: 6 }}>{g.title}</div>
              <p style={{ fontSize: 13.5, color: 'var(--text-2)', margin: 0, lineHeight: 1.6 }}>{g.body}</p>
            </div>
          ))}
          <div style={{ padding: '12px 16px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 10 }}>
            <p style={{ fontSize: 13, color: 'var(--text-2)', margin: 0, lineHeight: 1.6 }}>
              <strong>Heat-up time:</strong> expect 5-10 minutes longer in cold ambient conditions than the rated spec.
            </p>
          </div>
        </div>
      </section>

      {/* FAQ mobile */}
      <section style={{ padding: '32px 18px 0' }}>
        <h2 style={{ fontSize: 22, letterSpacing: '-0.016em', margin: '0 0 18px' }}>Frequently asked</h2>
        <FAQ items={outdoorFaqItems} />
      </section>

      <div style={{ padding: '28px 18px 0' }}>
        <MethodologyBox />
      </div>
      <div style={{ padding: '18px 18px 0' }}>
        <AuthorBox />
      </div>

      <SiteFooter />
    </div>
  );
}


// ═══════════════════════════════════════════════════════════
// 02. INFRARED SAUNA ACCESSORIES
// ═══════════════════════════════════════════════════════════

const essentialAccessories = [
  {
    name: 'Sauna Backrest (wooden)',
    price: '$25-$65',
    why: 'Most sauna benches have no lumbar support. A shaped wooden backrest - cedar or hemlock to match the cabin - lets you sit comfortably for 40 minutes versus 20. The single biggest session quality improvement for most users. Look for contoured versions with slat spacing that allows airflow.',
    href: 'https://www.amazon.com/s?k=wooden+sauna+backrest&tag=infraspot00-20',
    label: 'Check on Amazon',
  },
  {
    name: 'Absorbent Sauna Towels (cotton, high-GSM)',
    price: '$15-$35/set',
    why: 'One for the seat, one for wiping. 400+ GSM cotton. Have 4-6 on rotation. Thicker sauna-specific towels absorb more sweat and hold up better to repeated high-heat washing than standard bath towels.',
    href: 'https://www.amazon.com/s?k=sauna+towels+cotton+high+gsm&tag=infraspot00-20',
    label: 'Check on Amazon',
  },
  {
    name: 'Insulated Water Bottle (stainless)',
    price: '$20-$45',
    why: 'Keeps water cold for the full 45-minute session at 150°F. Uninsulated bottles reach cabin temperature within 15 minutes. You drink more when the water stays cold - relevant for session length and comfort.',
    href: 'https://www.amazon.com/s?k=insulated+stainless+steel+water+bottle&tag=infraspot00-20',
    label: 'Check on Amazon',
  },
  {
    name: 'Digital Thermometer + Hygrometer',
    price: '$12-$25',
    why: 'Most sauna control panels read +/- 10°F inaccurately. A digital thermometer placed at bench level gives the actual cabin temperature - useful for protocol tracking and confirming your unit performs as advertised.',
    href: 'https://www.amazon.com/s?k=digital+thermometer+hygrometer+sauna&tag=infraspot00-20',
    label: 'Check on Amazon',
  },
  {
    name: 'Sand Timer or Countdown Timer',
    price: '$10-$20',
    why: 'Losing track of time in a relaxed state is easy. A dedicated timer - not a phone screen - means no compulsive clock-checking and no interruption from notifications.',
    href: 'https://www.amazon.com/s?k=sand+timer+countdown+sauna&tag=infraspot00-20',
    label: 'Check on Amazon',
  },
  {
    name: 'Sauna Sandals (wood or rubber)',
    price: '$15-$30',
    why: 'Floor panels in heated saunas get warm. Some people find direct foot contact uncomfortable on wooden floors at operating temperature. Rubber or wooden sauna sandals solve this at low cost.',
    href: 'https://www.amazon.com/s?k=sauna+sandals+wooden+rubber&tag=infraspot00-20',
    label: 'Check on Amazon',
  },
];

const niceToHaveItems = [
  {
    label: 'EUCALYPTUS OIL',
    desc: 'A few drops on a small wooden diffuser block placed near (never on) the heater panels. Creates a mild aromatherapy effect. Eucalyptol has a mild bronchodilator effect at inhalation concentrations. $15-$25 for quality oil on Amazon. Never drop essential oils directly on carbon or ceramic heater panels - oil residue damages elements and creates fire risk.',
    href: 'https://www.amazon.com/s?k=eucalyptus+essential+oil+sauna&tag=infraspot00-20',
  },
  {
    label: 'SALT BLOCK (HIMALAYAN)',
    desc: 'Mild ambiance effect in the cabin. Claims about negative ion generation at block-size scale are poorly supported by measurement data. It is a nice visual addition, not a performance enhancer. $30-$80 on Amazon.',
    href: 'https://www.amazon.com/s?k=himalayan+salt+block+sauna&tag=infraspot00-20',
  },
  {
    label: 'CHROMOTHERAPY LED UPGRADE',
    desc: 'If your sauna lacks built-in color therapy, an aftermarket LED strip is $20-$50. The color therapy claims are mostly ambiance. Note: a proper near-infrared panel (630-850nm) is a different and meaningful product with photobiomodulation evidence behind it. A $20 RGB LED strip is not that product.',
    href: 'https://www.amazon.com/s?k=sauna+chromotherapy+led+strip&tag=infraspot00-20',
  },
  {
    label: 'WOODEN SAUNA BUCKET + LADLE SET',
    desc: 'More relevant for traditional saunas but compatible with infrared cabins too. Use with a damp cloth or steam stone for a brief steam effect. Cedar or spruce bucket. $25-$50 on Amazon.',
    href: 'https://www.amazon.com/s?k=wooden+sauna+bucket+ladle+set&tag=infraspot00-20',
  },
];

const skipItems = [
  {
    label: 'SKIP',
    desc: 'Branded "sauna enhancement kits" - the same items sold individually for 3-5x the price. No additional value in the bundle.',
  },
  {
    label: 'SKIP',
    desc: 'Anything claiming to increase infrared output - heating elements are fixed output by design, not upgradeable through accessories.',
  },
  {
    label: 'SKIP',
    desc: 'Essential oil diffusers designed for steam rooms - these are incompatible with dry infrared cabins and create condensation problems.',
  },
  {
    label: 'SKIP',
    desc: 'Heavy cotton bathrobes worn inside the sauna - counterproductive for infrared, which requires skin contact for effective heat absorption.',
  },
];

const accessoriesFaqItems = [
  {
    q: 'Do I need accessories for infrared sauna?',
    a: 'A wooden backrest and extra absorbent towels genuinely improve session comfort and are worth the $30-$70 combined investment. Everything else is optional. No accessory is required to get full benefit from the sauna itself - the heat and infrared exposure are the active components.',
  },
  {
    q: 'What is the best sauna backrest?',
    a: 'A cedar or hemlock shaped wooden backrest in the $30-$60 range on Amazon. Look for contoured designs with slat construction that allows air circulation rather than solid wood panels. Avoid plastic backrests - they get hot and uncomfortable at sauna temperatures.',
  },
  {
    q: 'Can you use essential oils in infrared sauna?',
    a: 'Yes, with a diffuser block placed near (not on) the heater panels. A few drops on a wooden block allows gentle aromatherapy without direct heater contact. Never apply essential oils directly to carbon or ceramic heater panels - oil residue degrades the elements over time and creates a fire risk at operating temperatures.',
  },
  {
    q: 'How do you clean an infrared sauna?',
    a: 'Wipe benches after every session with a damp cloth. Weekly: apply diluted white vinegar (1 part vinegar to 2 parts water) or sauna-specific cleaner to all wood surfaces and wipe dry. Annual or as-needed: light sanding with 120-220 grit sandpaper along the grain to restore grey or stained bench wood. Never use varnish, sealant, or oil inside the cabin - these release fumes at operating temperature.',
  },
  {
    q: 'What accessories do I actually need for an infrared sauna?',
    a: 'Only three things matter: a couple of thick cotton towels (one to sit on, one to wipe with), an insulated water bottle so your drink stays cold, and a shaped wooden backrest so you can sit comfortably past the 20-minute mark. That is roughly $60-$120 total. Everything else - speakers, foot heaters, aroma cups, timers - is comfort or ambiance, not a requirement. The infrared heat itself does the work, so do not let a long accessory list convince you the sauna needs add-ons to function.',
  },
  {
    q: 'What towel is best for an infrared sauna?',
    a: 'A 100% cotton towel in the 500-700 GSM range. Cotton absorbs sweat better than microfiber at high heat and survives repeated hot washing without going stiff. Buy a set of 4-6 so you always have a dry one on rotation, and keep a larger bath sheet as a full seat cover. Expect $20-$40 for a good set. Skip bamboo or microfiber blends marketed as "sauna towels" at a premium - plain high-GSM cotton outperforms them and costs less.',
  },
  {
    q: 'Are chromotherapy light add-ons worth it?',
    a: 'For relaxation and ambiance, sure, and a plug-in RGB LED kit is only $20-$50. But be clear about what you are buying: chromotherapy color light is a mood effect, not a treatment. It is not the same as a near-infrared red light panel (630-850nm), which has actual photobiomodulation research behind it. If you enjoy warm color light while you sit, it is a cheap upgrade. If you are hoping for a skin or recovery benefit, a color LED strip will not deliver it. See our infrared sauna color therapy guide for the full breakdown.',
  },
];

const accessoriesTocItems = [
  'Top 10 at a glance',
  'Essential accessories',
  'Nice-to-have accessories',
  'More accessories worth knowing',
  'What to skip',
  'Cleaning and maintenance',
  'Frequently asked',
];

const top10Glance = [
  { rank: '01', name: 'Wooden backrest', note: 'Sit comfortably past 20 minutes' },
  { rank: '02', name: 'High-GSM cotton towel set', note: 'One to sit on, one to wipe' },
  { rank: '03', name: 'Insulated water bottle', note: 'Keeps water cold for the full session' },
  { rank: '04', name: 'Digital thermometer + hygrometer', note: 'Verify real cabin temperature' },
  { rank: '05', name: 'Heat-safe Bluetooth speaker', note: 'Audio without bringing your phone in' },
  { rank: '06', name: 'Seat cushion / ergonomic pad', note: 'Softens hard bench slats' },
  { rank: '07', name: 'Sauna floor mat', note: 'Warm, non-slip footing' },
  { rank: '08', name: 'Aroma cup + essential oil', note: 'Safe aromatherapy away from panels' },
  { rank: '09', name: 'Smart plug / heating timer', note: 'Pre-heat before you walk in' },
  { rank: '10', name: 'Sauna cleaning supplies', note: 'Keep the wood fresh and odor-free' },
];

const moreAccessories = [
  {
    name: 'Heat-safe Bluetooth speaker',
    price: '$25-$60',
    worth: 'Worth it for most people',
    desc: 'A speaker rated to at least 130°F lets you play music or a podcast without carrying your phone into the cabin, where the heat can shorten battery life and warp the screen adhesive. Look for a waterproof, heat-tolerant model and leave it near the door rather than against a heater panel. Standard consumer speakers are not rated for sauna temperatures and can fail or swell their batteries, so check the spec before you buy.',
  },
  {
    name: 'Backrest cushion / ergonomic seat pad',
    price: '$20-$45',
    worth: 'Worth it if your benches are hard',
    desc: 'Separate from a wooden backrest, a thin heat-tolerant seat cushion softens bench slats that dig in during longer sits. Use a cotton or cork pad, not memory foam or vinyl, which can off-gas or get unpleasantly hot. It pairs well with the wooden backrest for anyone doing 40-minute sessions.',
  },
  {
    name: 'Sauna floor mat',
    price: '$15-$40',
    worth: 'Worth it for comfort and grip',
    desc: 'A cedar slat mat or a cork mat gives you warm, non-slip footing and keeps sweat off the cabin floor, which makes cleanup easier. Cedar mats look the part and drain well; cork is softer underfoot. Avoid rubber or foam mats that trap moisture and can smell over time.',
  },
  {
    name: 'Foot heater / heated foot pad',
    price: '$30-$70',
    worth: 'Situational',
    desc: 'Infrared cabins heat the air unevenly and feet often stay cool, especially in low-wattage units. A small heated foot pad or a secondary infrared foot panel evens this out. Genuinely useful if you run cold or have poor circulation, skippable if your floor already feels warm.',
  },
  {
    name: 'Magnetic sauna timer + thermometer + hygrometer',
    price: '$15-$30',
    worth: 'Worth it',
    desc: 'A combined analog gauge you mount on the wall shows temperature, humidity, and a countdown at a glance without a screen. Magnetic or hook-mounted versions are easy to reposition. It is a cheap way to track your session without staring at a phone, and it doubles as a check on whether your control panel reads accurately.',
  },
  {
    name: 'Essential-oil aroma cup',
    price: '$10-$20',
    worth: 'Worth it if you use oils',
    desc: 'A small metal or ceramic cup that holds a few drops of essential oil well away from the heating elements. This is the safe way to add aroma to an infrared cabin: never drip oil directly onto carbon or ceramic panels, which damages them and creates a fire risk. Pair it with a quality eucalyptus or cedarwood oil.',
  },
  {
    name: 'Phone or tablet holder',
    price: '$12-$25',
    worth: 'Situational',
    desc: 'A stand near the cool zone of the cabin lets you follow a session timer, breathwork video, or show without holding a hot device in your lap. Keep the device itself out of the hottest area; sustained heat above 95°F is hard on phone batteries. A simple magnetic or clamp mount is plenty.',
  },
  {
    name: 'Heating-time smart plug',
    price: '$12-$30',
    worth: 'Worth it',
    desc: 'If your sauna runs on a standard plug, a Wi-Fi smart plug lets you start pre-heating from your phone so the cabin is ready when you walk in, cutting the usual 15-20 minute wait. Confirm the plug is rated for your sauna amperage draw before relying on it, since saunas pull more current than a lamp. Some higher-wattage units are hardwired and cannot use one.',
  },
  {
    name: 'Sauna cleaning supplies',
    price: '$15-$30',
    worth: 'Essential over time',
    desc: 'A spray bottle, a purpose-made sauna cleaner or white vinegar, and a soft cloth keep the wood fresh and odor-free. Regular wiping stops sweat stains from setting and prevents that stale-cabin smell. Our full walkthrough covers the routine step by step.',
  },
  {
    name: 'Hydration bottle with electrolyte tabs',
    price: '$20-$45',
    worth: 'Worth it',
    desc: 'Beyond a plain insulated bottle, keeping electrolyte tablets on hand helps you replace what you sweat out during longer or back-to-back sessions. A wide-mouth insulated bottle keeps the mix cold and is easy to refill. This matters more the longer and hotter your sessions run.',
  },
];

function InfraredSaunaAccessories({ mobile = false }) {
  return mobile ? <InfraredSaunaAccessoriesMobile /> : <InfraredSaunaAccessoriesDesktop />;
}

function InfraredSaunaAccessoriesDesktop() {
  return (
    <div style={{ background: 'var(--paper)', color: 'var(--text)', fontFamily: 'var(--sans)', minHeight: '100vh' }}>
      <SiteHeader />

      {/* Hero */}
      <section style={{ padding: '52px 40px 0' }}>
        <div style={{ maxWidth: 1180, margin: '0 auto' }}>
          <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 22 }}>
            <div className="mono" style={{ fontSize: 10.5, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--text-3)' }}>
              Buying Guide · Accessories · Updated May 2026
            </div>
            <Disclose>Independent · affiliate supported</Disclose>
          </div>
          <div className="eyebrow" style={{ marginBottom: 14 }}>Buying Guide</div>
          <h1 style={{ fontSize: 54, lineHeight: 1.0, letterSpacing: '-0.024em', margin: 0, maxWidth: 860 }}>
            Infrared Sauna Accessories Worth Buying (and Which to Skip)
          </h1>
          <p style={{ fontFamily: 'var(--serif)', fontSize: 20, color: 'var(--text-2)', marginTop: 18, maxWidth: 760, lineHeight: 1.45 }}>
            Most accessories are optional. A few make sessions meaningfully better. Here is the honest breakdown - no filler products.
          </p>

          {/* Quick Answer box */}
          <div style={{
            marginTop: 28,
            background: 'var(--paper-2)',
            border: '1px solid var(--line)',
            borderRadius: 14,
            padding: '20px 24px',
            maxWidth: 760,
          }}>
            <div className="mono" style={{ fontSize: 10, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--ember-deep)', marginBottom: 10 }}>Quick answer</div>
            <p style={{ margin: 0, fontSize: 15, color: 'var(--text-2)', lineHeight: 1.65 }}>
              <strong style={{ color: 'var(--text)' }}>Essential:</strong> a wooden backrest, extra absorbent cotton towels, an insulated water bottle.{' '}
              <strong style={{ color: 'var(--text)' }}>Nice to have:</strong> digital thermometer, eucalyptus oil, sauna sandals.{' '}
              <strong style={{ color: 'var(--text)' }}>Skip:</strong> overpriced branded kits and anything claiming to boost infrared output.
            </p>
          </div>
        </div>
      </section>

      {/* Two-column layout: TOC + content */}
      <section style={{ padding: '56px 40px 0' }}>
        <div style={{ maxWidth: 1180, margin: '0 auto', display: 'grid', gridTemplateColumns: '220px 1fr', gap: 56, alignItems: 'start' }}>
          <TOC items={accessoriesTocItems} active={0} />

          <div>
            {/* Top 10 at a glance */}
            <div className="eyebrow" style={{ marginBottom: 14 }}>Start here</div>
            <h2 style={{ fontSize: 36, letterSpacing: '-0.02em', margin: '0 0 10px', lineHeight: 1.1 }}>Top 10 Must-Have Accessories at a Glance</h2>
            <p style={{ fontSize: 15, color: 'var(--text-2)', margin: '0 0 22px', lineHeight: 1.65, maxWidth: 680 }}>
              If you want the short version, here is the ranked list. The first three are genuinely worth buying up front. The rest are comfort and convenience upgrades you can add over time. Full detail on each is below.
            </p>
            <ol style={{ listStyle: 'none', margin: '0 0 56px', padding: 0, display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 10 }}>
              {top10Glance.map((t, i) => (
                <li key={i} style={{ display: 'flex', gap: 14, alignItems: 'baseline', padding: '12px 16px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 10 }}>
                  <span className="mono" style={{ fontSize: 13, color: 'var(--ember-deep)', flexShrink: 0 }}>{t.rank}</span>
                  <span>
                    <span style={{ fontFamily: 'var(--serif)', fontSize: 15.5, letterSpacing: '-0.01em' }}>{t.name}</span>
                    <span style={{ display: 'block', fontSize: 13, color: 'var(--text-2)', lineHeight: 1.5, marginTop: 2 }}>{t.note}</span>
                  </span>
                </li>
              ))}
            </ol>

            {/* Essential accessories */}
            <div className="eyebrow" style={{ marginBottom: 14 }}>What you actually need</div>
            <h2 style={{ fontSize: 36, letterSpacing: '-0.02em', margin: '0 0 28px', lineHeight: 1.1 }}>Essential Accessories</h2>

            <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16, marginBottom: 56 }}>
              {essentialAccessories.map((a, i) => (
                <div key={i} style={{
                  background: 'var(--paper-2)',
                  border: '1px solid var(--line)',
                  borderRadius: 14,
                  padding: 20,
                  display: 'flex',
                  flexDirection: 'column',
                  gap: 12,
                }}>
                  <Ph w={120} h={100} label={a.name.split(' ')[0].toUpperCase()} style={{ borderRadius: 8 }} />
                  <div>
                    <div style={{ fontFamily: 'var(--serif)', fontSize: 17, letterSpacing: '-0.012em', marginBottom: 4 }}>{a.name}</div>
                    <div className="mono" style={{ fontSize: 11, color: 'var(--ember-deep)', letterSpacing: '0.06em' }}>{a.price}</div>
                  </div>
                  <p style={{ fontSize: 13.5, color: 'var(--text-2)', margin: 0, lineHeight: 1.6, flex: 1 }}>{a.why}</p>
                  <a
                    href={a.href}
                    className="btn btn-ghost"
                    style={{ fontSize: 12.5, alignSelf: 'flex-start' }}
                    target="_blank"
                    rel="noopener sponsored"
                  >
                    {a.label} →
                  </a>
                </div>
              ))}
            </div>

            {/* Nice to have */}
            <div className="eyebrow" style={{ marginBottom: 14 }}>Worth considering</div>
            <h2 style={{ fontSize: 36, letterSpacing: '-0.02em', margin: '0 0 22px', lineHeight: 1.1 }}>Nice-to-Have Accessories</h2>

            <div style={{ display: 'flex', flexDirection: 'column', gap: 0, border: '1px solid var(--line)', borderRadius: 14, overflow: 'hidden', marginBottom: 56 }}>
              {niceToHaveItems.map((item, i) => (
                <div key={i} style={{
                  padding: '20px 24px',
                  borderBottom: i < niceToHaveItems.length - 1 ? '1px solid var(--line)' : 0,
                  display: 'grid',
                  gridTemplateColumns: '160px 1fr auto',
                  gap: 24,
                  alignItems: 'center',
                }}>
                  <div className="mono" style={{ fontSize: 11, letterSpacing: '0.1em', color: 'var(--text-3)' }}>{item.label}</div>
                  <p style={{ fontSize: 14, color: 'var(--text-2)', margin: 0, lineHeight: 1.6 }}>{item.desc}</p>
                  <a
                    href={item.href}
                    className="btn btn-ghost"
                    style={{ fontSize: 12, flexShrink: 0 }}
                    target="_blank"
                    rel="noopener sponsored"
                  >
                    Amazon →
                  </a>
                </div>
              ))}
            </div>

            {/* More accessories worth knowing */}
            <div className="eyebrow" style={{ marginBottom: 14 }}>The full roundup</div>
            <h2 style={{ fontSize: 36, letterSpacing: '-0.02em', margin: '0 0 10px', lineHeight: 1.1 }}>More Accessories Worth Knowing</h2>
            <p style={{ fontSize: 15, color: 'var(--text-2)', margin: '0 0 22px', lineHeight: 1.65, maxWidth: 700 }}>
              Once the three essentials are covered, these are the add-ons people ask about most. For each one, here is what it does, whether it is worth the money, and a rough price. A quick rule: buy the item that fixes an actual annoyance in your sessions, and skip the ones that only sound good on a product page. If you are curious about the color-light option in particular, our{' '}
              <a href="/guides/infrared-sauna-color-therapy/" style={{ color: 'var(--ember-deep)', textDecoration: 'underline' }}>infrared sauna color therapy guide</a>{' '}
              separates the ambiance effect from the near-infrared claims. And before you add anything that touches the wood, our{' '}
              <a href="/how-to/how-to-clean-infrared-sauna/" style={{ color: 'var(--ember-deep)', textDecoration: 'underline' }}>guide to cleaning an infrared sauna</a>{' '}
              covers what is safe to use inside a heated cabin.
            </p>

            <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16, marginBottom: 56 }}>
              {moreAccessories.map((m, i) => (
                <div key={i} style={{
                  background: 'var(--paper-2)',
                  border: '1px solid var(--line)',
                  borderRadius: 14,
                  padding: 20,
                  display: 'flex',
                  flexDirection: 'column',
                  gap: 8,
                }}>
                  <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline', gap: 12 }}>
                    <div style={{ fontFamily: 'var(--serif)', fontSize: 17, letterSpacing: '-0.012em' }}>{m.name}</div>
                    <div className="mono" style={{ fontSize: 11, color: 'var(--ember-deep)', letterSpacing: '0.06em', flexShrink: 0 }}>{m.price}</div>
                  </div>
                  <span className="chip" style={{ fontSize: 9.5, alignSelf: 'flex-start' }}>{m.worth}</span>
                  <p style={{ fontSize: 13.5, color: 'var(--text-2)', margin: 0, lineHeight: 1.6 }}>{m.desc}</p>
                </div>
              ))}
            </div>

            {/* What to skip */}
            <div className="eyebrow" style={{ marginBottom: 14 }}>Save your money</div>
            <h2 style={{ fontSize: 36, letterSpacing: '-0.02em', margin: '0 0 22px', lineHeight: 1.1 }}>What to Skip</h2>

            <div style={{ display: 'flex', flexDirection: 'column', gap: 10, marginBottom: 56 }}>
              {skipItems.map((item, i) => (
                <div key={i} style={{ display: 'flex', gap: 14, alignItems: 'flex-start', padding: '14px 18px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 12 }}>
                  <span className="chip" style={{ fontSize: 9.5, flexShrink: 0, marginTop: 2 }}>{item.label}</span>
                  <p style={{ fontSize: 14, color: 'var(--text-2)', margin: 0, lineHeight: 1.6 }}>{item.desc}</p>
                </div>
              ))}
            </div>

            {/* Cleaning and maintenance */}
            <div className="eyebrow" style={{ marginBottom: 14 }}>Keeping it clean</div>
            <h2 style={{ fontSize: 36, letterSpacing: '-0.02em', margin: '0 0 22px', lineHeight: 1.1 }}>Cleaning and Maintenance Accessories</h2>

            <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 16, marginBottom: 28 }}>
              {[
                {
                  name: 'White vinegar (diluted 1:2)',
                  note: '~$3 at any grocery store',
                  desc: 'Safe on cedar and hemlock, kills bacteria, and odor-free once dried. The standard cleaning solution for most infrared sauna owners. Mix one part white vinegar with two parts water in a spray bottle.',
                },
                {
                  name: 'Sauna-specific cleaner concentrate',
                  note: '$15-$25 on Amazon',
                  desc: 'More effective than vinegar on stubborn sweat stains and odors. Odor-free when dried. Useful for deep cleaning sessions or high-use cabins. Not necessary for light regular use.',
                },
                {
                  name: 'Fine sandpaper (120-220 grit)',
                  note: '$8-$15 on Amazon',
                  desc: 'For periodic light sanding of grey or stained hemlock benches. Restores clean wood appearance. Always sand with the grain. Annual or as-needed - not every session.',
                },
                {
                  name: 'Soft bench brush',
                  note: '$10-$20 on Amazon',
                  desc: 'For sweeping loose debris from the seat area between sessions. Natural bristle preferred - synthetic bristles can scratch softer wood finishes.',
                },
              ].map((c, i) => (
                <div key={i} style={{ padding: '18px 20px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 12 }}>
                  <div style={{ fontFamily: 'var(--serif)', fontSize: 16, letterSpacing: '-0.01em', marginBottom: 3 }}>{c.name}</div>
                  <div className="mono" style={{ fontSize: 10.5, color: 'var(--ember-deep)', letterSpacing: '0.06em', marginBottom: 8 }}>{c.note}</div>
                  <p style={{ fontSize: 13.5, color: 'var(--text-2)', margin: 0, lineHeight: 1.6 }}>{c.desc}</p>
                </div>
              ))}
            </div>

            <div style={{ padding: '16px 20px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 12, marginBottom: 4 }}>
              <div className="mono" style={{ fontSize: 10, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--text-3)', marginBottom: 8 }}>Cleaning frequency</div>
              <p style={{ fontSize: 14, color: 'var(--text-2)', margin: 0, lineHeight: 1.65 }}>
                Quick wipe after every session. Deep clean weekly with vinegar solution or sauna cleaner. Bench sanding annually or when grey wood appears. No sealant or varnish inside the cabin - releases fumes when heated.
              </p>
            </div>
          </div>
        </div>
      </section>

      {/* FAQ */}
      <section style={{ padding: '64px 40px 0' }}>
        <div style={{ maxWidth: 1180, margin: '0 auto' }}>
          <h2 style={{ fontSize: 38, letterSpacing: '-0.02em', margin: '0 0 28px' }}>Frequently asked</h2>
          <FAQ items={accessoriesFaqItems} />
        </div>
      </section>

      <div style={{ maxWidth: 1180, margin: '0 auto', padding: '40px 40px 0' }}>
        <MethodologyBox />
      </div>
      <div style={{ maxWidth: 1180, margin: '0 auto', padding: '28px 40px 0' }}>
        <AuthorBox />
      </div>

      <SiteFooter />
    </div>
  );
}

function InfraredSaunaAccessoriesMobile() {
  return (
    <div style={{ background: 'var(--paper)', color: 'var(--text)', fontFamily: 'var(--sans)', minHeight: '100vh' }}>
      <MobHeader />

      {/* Hero */}
      <section style={{ padding: '32px 18px 0' }}>
        <div className="mono" style={{ fontSize: 10, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--text-3)', marginBottom: 10 }}>
          Buying Guide · Accessories · May 2026
        </div>
        <h1 style={{ fontSize: 30, lineHeight: 1.1, letterSpacing: '-0.02em', margin: '0 0 14px' }}>
          Infrared Sauna Accessories Worth Buying (and Which to Skip)
        </h1>
        <p style={{ fontFamily: 'var(--serif)', fontSize: 16, color: 'var(--text-2)', margin: '0 0 16px', lineHeight: 1.5 }}>
          Most accessories are optional. A few make sessions meaningfully better. Here is the honest breakdown.
        </p>

        {/* Quick Answer */}
        <div style={{
          background: 'var(--paper-2)',
          border: '1px solid var(--line)',
          borderRadius: 12,
          padding: '14px 16px',
        }}>
          <div className="mono" style={{ fontSize: 10, letterSpacing: '0.14em', textTransform: 'uppercase', color: 'var(--ember-deep)', marginBottom: 8 }}>Quick answer</div>
          <p style={{ margin: 0, fontSize: 14, color: 'var(--text-2)', lineHeight: 1.6 }}>
            <strong style={{ color: 'var(--text)' }}>Essential:</strong> wooden backrest, absorbent cotton towels, insulated water bottle.{' '}
            <strong style={{ color: 'var(--text)' }}>Nice to have:</strong> digital thermometer, eucalyptus oil, sauna sandals.{' '}
            <strong style={{ color: 'var(--text)' }}>Skip:</strong> branded kits, anything claiming to boost infrared output.
          </p>
        </div>
      </section>

      {/* Top 10 at a glance - mobile */}
      <section style={{ padding: '32px 18px 0' }}>
        <h2 style={{ fontSize: 22, letterSpacing: '-0.016em', margin: '0 0 8px' }}>Top 10 Must-Have Accessories at a Glance</h2>
        <p style={{ fontSize: 14, color: 'var(--text-2)', margin: '0 0 16px', lineHeight: 1.55 }}>
          The short version, ranked. The first three are worth buying up front. The rest are comfort upgrades to add over time.
        </p>
        <ol style={{ listStyle: 'none', margin: 0, padding: 0, display: 'flex', flexDirection: 'column', gap: 8 }}>
          {top10Glance.map((t, i) => (
            <li key={i} style={{ display: 'flex', gap: 12, alignItems: 'baseline', padding: '12px 14px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 10 }}>
              <span className="mono" style={{ fontSize: 12, color: 'var(--ember-deep)', flexShrink: 0 }}>{t.rank}</span>
              <span>
                <span style={{ fontFamily: 'var(--serif)', fontSize: 15 }}>{t.name}</span>
                <span style={{ display: 'block', fontSize: 12.5, color: 'var(--text-2)', lineHeight: 1.5, marginTop: 2 }}>{t.note}</span>
              </span>
            </li>
          ))}
        </ol>
      </section>

      {/* Essential accessories - single column */}
      <section style={{ padding: '32px 18px 0' }}>
        <h2 style={{ fontSize: 22, letterSpacing: '-0.016em', margin: '0 0 18px' }}>Essential Accessories</h2>
        <div style={{ display: 'flex', flexDirection: 'column', gap: 14 }}>
          {essentialAccessories.map((a, i) => (
            <div key={i} style={{
              background: 'var(--paper-2)',
              border: '1px solid var(--line)',
              borderRadius: 12,
              padding: '16px 18px',
              display: 'flex',
              gap: 14,
              alignItems: 'flex-start',
            }}>
              <Ph w={72} h={72} label={a.name.split(' ')[0].toUpperCase()} style={{ borderRadius: 8, flexShrink: 0 }} />
              <div style={{ flex: 1, minWidth: 0 }}>
                <div style={{ fontFamily: 'var(--serif)', fontSize: 15, marginBottom: 3 }}>{a.name}</div>
                <div className="mono" style={{ fontSize: 11, color: 'var(--ember-deep)', marginBottom: 6 }}>{a.price}</div>
                <p style={{ fontSize: 13, color: 'var(--text-2)', margin: '0 0 10px', lineHeight: 1.55 }}>{a.why}</p>
                <a
                  href={a.href}
                  className="btn btn-ghost"
                  style={{ fontSize: 12 }}
                  target="_blank"
                  rel="noopener sponsored"
                >
                  Amazon →
                </a>
              </div>
            </div>
          ))}
        </div>
      </section>

      {/* Nice to have - mobile */}
      <section style={{ padding: '32px 18px 0' }}>
        <h2 style={{ fontSize: 22, letterSpacing: '-0.016em', margin: '0 0 16px' }}>Nice-to-Have Accessories</h2>
        <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
          {niceToHaveItems.map((item, i) => (
            <div key={i} style={{ padding: '14px 16px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 12 }}>
              <div className="mono" style={{ fontSize: 10, letterSpacing: '0.1em', color: 'var(--text-3)', marginBottom: 6 }}>{item.label}</div>
              <p style={{ fontSize: 13.5, color: 'var(--text-2)', margin: '0 0 10px', lineHeight: 1.6 }}>{item.desc}</p>
              <a href={item.href} className="btn btn-ghost" style={{ fontSize: 12 }} target="_blank" rel="noopener sponsored">Amazon →</a>
            </div>
          ))}
        </div>
      </section>

      {/* More accessories worth knowing - mobile */}
      <section style={{ padding: '32px 18px 0' }}>
        <h2 style={{ fontSize: 22, letterSpacing: '-0.016em', margin: '0 0 8px' }}>More Accessories Worth Knowing</h2>
        <p style={{ fontSize: 14, color: 'var(--text-2)', margin: '0 0 16px', lineHeight: 1.55 }}>
          Once the three essentials are covered, these are the add-ons people ask about most - what each does, whether it is worth it, and a rough price. Buy the ones that fix a real annoyance. Our{' '}
          <a href="/guides/infrared-sauna-color-therapy/" style={{ color: 'var(--ember-deep)', textDecoration: 'underline' }}>color therapy guide</a>{' '}
          covers the light options, and our{' '}
          <a href="/how-to/how-to-clean-infrared-sauna/" style={{ color: 'var(--ember-deep)', textDecoration: 'underline' }}>cleaning guide</a>{' '}
          covers what is safe inside a heated cabin.
        </p>
        <div style={{ display: 'flex', flexDirection: 'column', gap: 12 }}>
          {moreAccessories.map((m, i) => (
            <div key={i} style={{ padding: '14px 16px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 12 }}>
              <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'baseline', gap: 10, marginBottom: 4 }}>
                <div style={{ fontFamily: 'var(--serif)', fontSize: 15 }}>{m.name}</div>
                <div className="mono" style={{ fontSize: 10.5, color: 'var(--ember-deep)', flexShrink: 0 }}>{m.price}</div>
              </div>
              <span className="chip" style={{ fontSize: 9, marginBottom: 6, display: 'inline-block' }}>{m.worth}</span>
              <p style={{ fontSize: 13, color: 'var(--text-2)', margin: 0, lineHeight: 1.55 }}>{m.desc}</p>
            </div>
          ))}
        </div>
      </section>

      {/* What to skip - mobile */}
      <section style={{ padding: '32px 18px 0' }}>
        <h2 style={{ fontSize: 22, letterSpacing: '-0.016em', margin: '0 0 16px' }}>What to Skip</h2>
        <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
          {skipItems.map((item, i) => (
            <div key={i} style={{ display: 'flex', gap: 12, alignItems: 'flex-start', padding: '12px 14px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 10 }}>
              <span className="chip" style={{ fontSize: 9.5, flexShrink: 0, marginTop: 2 }}>{item.label}</span>
              <p style={{ fontSize: 13.5, color: 'var(--text-2)', margin: 0, lineHeight: 1.55 }}>{item.desc}</p>
            </div>
          ))}
        </div>
      </section>

      {/* Cleaning - mobile */}
      <section style={{ padding: '32px 18px 0' }}>
        <h2 style={{ fontSize: 22, letterSpacing: '-0.016em', margin: '0 0 16px' }}>Cleaning and Maintenance</h2>
        <div style={{ display: 'flex', flexDirection: 'column', gap: 10 }}>
          {[
            { name: 'White vinegar (1:2 dilution)', desc: 'Safe on cedar and hemlock, kills bacteria, odor-free when dried. ~$3 at any grocery store.' },
            { name: 'Sauna-specific cleaner concentrate', desc: '$15-$25 on Amazon. More effective on stubborn stains. Odor-free when dried.' },
            { name: 'Fine sandpaper 120-220 grit', desc: 'Annual or as-needed for grey/stained bench wood. Sand with the grain. Restores clean wood surface.' },
            { name: 'Soft bench brush', desc: 'For sweeping seat area between sessions. Natural bristle preferred.' },
          ].map((c, i) => (
            <div key={i} style={{ padding: '12px 14px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 10 }}>
              <div style={{ fontFamily: 'var(--serif)', fontSize: 15, marginBottom: 4 }}>{c.name}</div>
              <p style={{ fontSize: 13, color: 'var(--text-2)', margin: 0, lineHeight: 1.55 }}>{c.desc}</p>
            </div>
          ))}
        </div>
        <div style={{ marginTop: 12, padding: '12px 14px', background: 'var(--paper-2)', border: '1px solid var(--line)', borderRadius: 10 }}>
          <p style={{ fontSize: 13, color: 'var(--text-2)', margin: 0, lineHeight: 1.6 }}>
            Quick wipe after every session. Deep clean weekly. Light sanding annually. Never use varnish or sealant inside - releases fumes when heated.
          </p>
        </div>
      </section>

      {/* FAQ mobile - 3 items */}
      <section style={{ padding: '32px 18px 0' }}>
        <h2 style={{ fontSize: 22, letterSpacing: '-0.016em', margin: '0 0 18px' }}>Frequently asked</h2>
        <FAQ items={accessoriesFaqItems} />
      </section>

      <div style={{ padding: '28px 18px 0' }}>
        <MethodologyBox />
      </div>
      <div style={{ padding: '18px 18px 0' }}>
        <AuthorBox />
      </div>

      <SiteFooter />
    </div>
  );
}

Object.assign(window, { BestOutdoorInfraredSauna, InfraredSaunaAccessories });
