SERVICES

Our Services

Everything you need, all in one place. Explore our expert services designed to keep your spa running smoothly and your experience stress-free.

VIEW SERVICES
CALL US
BOISE | MERIDIAN | NAMPA | TWIN FALLS
(208) 468-8827
Boise showroom
BOISE
1340 S Orchard St,
Boise, ID 83705

Mon-Sat: 10:00AM - 6:00PM
Sunday: 11:00AM - 4:00PM

(208) 468-8827
Get Directions
Meridian showroom
MERIDIAN
3490 E Tecate Ln,
Meridian, ID 83646

Mon-Sat: 10:00AM - 6:00PM
Sunday: 11:00AM - 4:00PM

(208) 468-8827
Get Directions
Nampa showroom
NAMPA
16553 N Marketplace Blvd,
Nampa, ID 83687

Mon-Sat: 10:00AM - 6:00PM
Sunday: 11:00AM - 4:00PM

(208) 468-8827
Get Directions
Twin Falls showroom
TWIN FALLS
960 Blue Lakes Blvd N,
Twin Falls, ID 83301

Mon-Sat: 10:00AM - 6:00PM
Sunday: 11:00AM - 4:00PM

(208) 468-8827
Get Directions
Hailey showroom
HAILEY
221 S River St, Suite 1A
Hailey, ID 83333

Mon-Fri: 9:00AM - 5:00PM
Sunday: Closed

(208) 726-8899
Get Directions
Shop Hailey: Swim Spas · Endless Pools · Saunas

Saunas

We only carry the top selling brands in the industry.

Step 1 of 2

Where will your new sauna go?
What type of sauna do you prefer?

Benefits of a Sauna

From boosting heart health and speeding up muscle recovery to giving your skin that radiant glow, regular sauna sessions do more for your body and mind than you might expect.

.gform_wrapper.gravity-theme .gf_progressbar_title { font-size:18px !important; color:#000 !important; font-weight: 900 !important; margin:0 !important; margin-bottom:5px !important; font-family:Arial, Helvetica, sans-serif !important; } /* Gravity Form % completed fix */ .gform_wrapper.gravity-theme .gf_progressbar_percentage span { float:left !important; display: block; font-size: 15px !important; line-height: 21px !important; margin-left: 8px !important; margin-right: 8px !important; min-width: 2em !important; width: auto !important; } /* Gravity Form completed bar fix */ .gf_progressbar_percentage { background-color: rgb(9, 102, 149); padding-left: 10px; padding-right: 10px; color: #fff; border-radius: 30px; height:100%; } .gform_wrapper fieldset { border:none !important; padding:0 !important; margin: 15px 0px !important; } .gf_progressbar.gf_progressbar_blue { border-radius: 30px; background-color: #ddd; margin-bottom: 1em; width: 100%; height: 20px; } .gf_progressbar_percentage { background-color: rgb(9, 102, 149); padding-left: 10px; padding-right: 10px; color: #fff; border-radius: 30px; z-index: 1000; position: relative; height: 100%; } /* Gravity Forms overrides - high specificity under wrapper */ .gform_wrapper { font-family: inherit; color: #222; } .gform_wrapper .gfield_label { font-weight:800; margin-bottom:0px; font-family: Arial, Helvetica, sans-serif; } .gform_wrapper input[type="text"], .gform_wrapper input[type="email"], .gform_wrapper input[type="tel"], .gform_wrapper textarea, .gform_wrapper select { width:100%; padding:10px 12px; box-sizing:border-box; border:1px solid #d9d9d9; border-radius:2px; font-size:18px; } /* Larger checkboxes and radios */ .gform_wrapper .gfield_checkbox input[type="checkbox"], .gform_wrapper .gfield_radio input[type="radio"], .gform_wrapper input[type="radio"], .gform_wrapper input[type="checkbox"] { transform: scale(1.35); -webkit-transform: scale(1.35); margin-right:8px; } /* Make labels bigger for readability */ .gform_wrapper .gfield_label, .gform_wrapper .choice_label { font-size:18px; } /* Progress bar styling for multi-page Gravity Forms */ .gform_wrapper .gform_progress { margin-bottom:16px; } .gform_wrapper .gform_progress_bar { background:#0d6a80; height:10px; border-radius:3px; } /* Buttons */ .gform_wrapper .gform_footer .gform_button { background:#0b6b82; color:#fff; padding:10px 20px; border:none; border-radius:2px; cursor:pointer; } .gform_wrapper .gform_footer .gform_button:hover { opacity:0.95; } /* Make sure the form doesn't inherit theme container widths */ .gform_wrapper { max-width:100%; } /* Responsive */ @media (max-width: 900px) { #dsn-leadgen-wrapper.dsn-leadgen-wrap { flex-direction:column; padding:20px; } .dsn-left, .dsn-right { flex: 1 1 100%; } .dsn-image { height:320px; } } /* Design polish to match provided mockups */ .dsn-left { position: relative; } .dsn-logo { position: absolute; left: 50%; transform: translateX(-50%); top: -50px; background: #fff; padding:0; border-radius:4px; box-shadow:0 6px 18px rgba(0,0,0,0.08); z-index:3; } .dsn-logo img{ width:100%; max-width:300px; display:block; } .dsn-left .dsn-image { margin-top:46px; } .dsn-left-content h1, .dsn-left-content h2 { margin:0 0 8px 0; font-weight:700; color:#111; } .dsn-left-content { margin-top:20px; color:#222; line-height:1.4; font-size:18px; } /* Right column layout and heading */ .dsn-right-inner { max-width:520px; margin:0 auto; } .dsn-right .gform_wrapper { position:relative; } .dsn-right .gform_wrapper .gform_heading { display:flex; align-items:center; justify-content:space-between; gap:12px; margin-bottom:12px; position: absolute; right: 0; top: -15px; } .dsn-right .gform_wrapper .gform_heading .gform_description { color:#666; font-size:13px; } /* Stylized progress bar (step indicator) */ .gform_wrapper .gform_progress { background: transparent; padding: 6px 0 14px 0; } .gform_wrapper .gform_progress_inner { background:#eee; border-radius:10px; height:12px; overflow:hidden; } .gform_wrapper .gform_progress_bar { background:#0b6b82; height:12px; border-radius:10px; } .gform_wrapper .gform_page_steps { font-size:13px; color:#444; margin-bottom:8px; } /* Custom checkboxes and radios (clean, larger tappable targets) */ .gform_wrapper .gfield_checkbox li, .gform_wrapper .gfield_radio li { margin-bottom:10px; list-style:none; } /* Ensure various choice containers are positioned so our absolute pseudo-elements stay contained */ .gform_wrapper .gfield_checkbox li, .gform_wrapper .gfield_checkbox .gchoice, .gform_wrapper .gfield_checkbox .gfield_choice, .gform_wrapper .gfield_radio li, .gform_wrapper .gfield_radio .gchoice, .gform_wrapper .gfield_radio .gfield_choice { position: relative; padding-left:0px; margin:0px; } .gform_wrapper .gfield_checkbox label, .gform_wrapper .gfield_radio label { position: relative; padding-left:38px; margin:0px; font-size:18px; } .gform_wrapper .gfield_checkbox li label, .gform_wrapper .gfield_radio li label { cursor:pointer; display:inline-block; color:#222; } /* Make native inputs visually hidden but still present for accessibility and focus handling. Position absolute so they sit inside container. */ .gform_wrapper .gfield_checkbox input[type="checkbox"], .gform_wrapper .gfield_radio input[type="radio"]{ position: absolute; opacity: 0; width: 22px; height: 22px; margin: 0; left: 0px; top: 50%; transform: translateY(-50%); } /* Checkbox square: black border, gray background when unchecked; blue background with white check when checked */ /* Support different GF choice markup: li, .gchoice, .gfield_choice, and label-wrapped inputs */ .gform_wrapper .gfield_checkbox li label::before, .gform_wrapper .gfield_checkbox .gchoice label::before, .gform_wrapper .gfield_checkbox .gfield_choice label::before, .gform_wrapper .gfield_checkbox label > input + span::before, .gform_wrapper .gfield_checkbox label::before { content: ''; position: absolute; left: 0px; top: 50%; transform: translateY(-50%); width: 22px; height: 22px; border-radius: 3px; border: 2px solid #000; /* black border */ background: #eee; /* light gray background when unchecked */ box-sizing: border-box; } /* Checked state: blue background with white check Only apply blue when the label has an explicit check indicator. We treat two structural variants as having an indicator: - label contains a span (label > span) — we style span::before/after */ .gform_wrapper .gfield_checkbox li input[type="checkbox"]:checked + label.dsn-has-after::before, .gform_wrapper .gfield_checkbox .gchoice input[type="checkbox"]:checked + label.dsn-has-after::before, .gform_wrapper .gfield_checkbox .gfield_choice input[type="checkbox"]:checked + label.dsn-has-after::before, .gform_wrapper .gfield_checkbox li.dsn-checked label.dsn-has-after::before, .gform_wrapper .gfield_checkbox .gchoice.dsn-checked label.dsn-has-after::before, .gform_wrapper .gfield_checkbox .gfield_choice.dsn-checked label.dsn-has-after::before, .gform_wrapper .gfield_checkbox .gchoice.dsn-checked label::before, .gform_wrapper .gfield_checkbox label > input:checked + span::before, .gform_wrapper .gfield_checkbox label input[type="checkbox"]:checked + span::before { background: #0b6b82; /* blue */ border-color: #0b6b82; } /* Checkmark (only where the after/dot exists) */ .gform_wrapper .gfield_checkbox li input[type="checkbox"]:checked + label.dsn-has-after::after, .gform_wrapper .gfield_checkbox .gchoice input[type="checkbox"]:checked + label.dsn-has-after::after, .gform_wrapper .gfield_checkbox .gfield_choice input[type="checkbox"]:checked + label.dsn-has-after::after, .gform_wrapper .gfield_checkbox li.dsn-checked label.dsn-has-after::after, .gform_wrapper .gfield_checkbox .gchoice.dsn-checked label.dsn-has-after::after, .gform_wrapper .gfield_checkbox .gfield_choice.dsn-checked label.dsn-has-after::after, .gform_wrapper .gfield_checkbox .gchoice.dsn-checked label::after, .gform_wrapper .gfield_checkbox label > input:checked + span::after, .gform_wrapper .gfield_checkbox label input[type="checkbox"]:checked + span::after { content: ''; position: absolute; left: 9px; top: 50%; transform: translateY(-60%) rotate(45deg); width: 6px; height: 12px; border-right: 2px solid #fff; border-bottom: 2px solid #fff; } /* Hover/focus states */ .gform_wrapper .gfield_radio, .gform_wrapper .gfield_checkbox { cursor: pointer; } .gform_wrapper .gfield_checkbox li label:hover::before, .gform_wrapper .gfield_checkbox li label:focus::before { box-shadow: 0 0 0 3px rgba(11,107,130,0.06); } /* Mirror checkbox selectors for radio variants (round) to cover all GF markup patterns */ .gform_wrapper .gfield_radio li label::before, .gform_wrapper .gfield_radio .gchoice label::before, .gform_wrapper .gfield_radio .gfield_choice label::before, .gform_wrapper .gfield_radio label > input + span::before, .gform_wrapper .gfield_radio label::before { content: ''; position: absolute; left: 6px; top: 50%; transform: translateY(-50%); width: 20px; height: 20px; border-radius: 50%; border: 2px solid #000; /* black border */ background: #eee; /* light gray background when unchecked */ box-sizing: border-box; } /* Radio checked state: blue background with white inner dot */ .gform_wrapper .gfield_radio li input[type="radio"]:checked + label::before, .gform_wrapper .gfield_radio .gchoice input[type="radio"]:checked + label::before, .gform_wrapper .gfield_radio .gfield_choice input[type="radio"]:checked + label::before, .gform_wrapper .gfield_radio li.dsn-checked label::before, .gform_wrapper .gfield_radio .gchoice.dsn-checked label::before, .gform_wrapper .gfield_radio .gfield_choice.dsn-checked label::before { background: #0b6b82; border-color: #0b6b82; } .gform_wrapper .gfield_radio li input[type="radio"]:checked + label::after, .gform_wrapper .gfield_radio .gchoice input[type="radio"]:checked + label::after, .gform_wrapper .gfield_radio .gfield_choice input[type="radio"]:checked + label::after, .gform_wrapper .gfield_radio li.dsn-checked label::after, .gform_wrapper .gfield_radio .gchoice.dsn-checked label::after, .gform_wrapper .gfield_radio .gfield_choice.dsn-checked label::after { content: ''; position: absolute; left: 6px; top: 50%; transform: translateY(-50%); width: 6px; height: 6px; border-radius: 50%; background: #fff; } /* Radio circle: support different GF markup variants */ .gform_wrapper .gfield_radio li label::before, .gform_wrapper .gfield_radio .gchoice label::before, .gform_wrapper .gfield_radio .gfield_choice label::before, .gform_wrapper .gfield_radio label > input + span::before, .gform_wrapper .gfield_radio label::before { content: ''; position: absolute; left: 0px; top: 50%; transform: translateY(-50%); width: 20px; height: 20px; border-radius: 50%; border: 2px solid #000; /* black border */ background: #eee; /* light gray background when unchecked */ box-sizing: border-box; } /* Radio checked state - covers input+label and JS-driven container.dsn-checked */ .gform_wrapper .gfield_radio li input[type="radio"]:checked + label::before, .gform_wrapper .gfield_radio .gchoice input[type="radio"]:checked + label::before, .gform_wrapper .gfield_radio .gfield_choice input[type="radio"]:checked + label::before, .gform_wrapper .gfield_radio li.dsn-checked label::before, .gform_wrapper .gfield_radio .gchoice.dsn-checked label::before, .gform_wrapper .gfield_radio .gfield_choice.dsn-checked label::before { background: #0b6b82; border-color: #0b6b82; } /* Radio inner dot */ .gform_wrapper .gfield_radio li input[type="radio"]:checked + label::after, .gform_wrapper .gfield_radio .gchoice input[type="radio"]:checked + label::after, .gform_wrapper .gfield_radio .gfield_choice input[type="radio"]:checked + label::after, .gform_wrapper .gfield_radio li.dsn-checked label::after, .gform_wrapper .gfield_radio .gchoice.dsn-checked label::after, .gform_wrapper .gfield_radio .gfield_choice.dsn-checked label::after { content: ''; position: absolute; left: 6px; top: 50%; transform: translateY(-50%); width: 6px; height: 6px; border-radius: 50%; background: #fff; } /* Input and help text styling */ .gform_wrapper .gfield_description { color:#666; font-size:13px; margin-top:6px; } .gform_wrapper input[type="text"], .gform_wrapper input[type="email"], .gform_wrapper textarea { border:1px solid #e0e0e0; padding:12px; font-size:14px; } /* Buttons: Next (primary) and Previous (secondary) */ .gform_wrapper .gform_footer .gform_button { border-radius:2px; padding:11px 20px; font-weight:600; } .gform_wrapper .gform_footer .gform_next_button, .gform_wrapper .gform_footer .gform_submit_button { background:#0b6b82; color:#fff; border:none; } .gform_wrapper .gform_footer .gform_previous_button { background:#6f6f6f; color:#fff; border:none; } /* Form inner spacing */ .gform_wrapper .gform_body { padding-top:6px; } /* Small screens adjustments */ @media (max-width: 600px) { .dsn-left .dsn-image { height:260px; } .dsn-logo { top:12px; padding:12px 16px; } { padding:18px; } } .gform_previous_button { background-color: #777 !important; border-color: #777 !important; color:#fff !important; } .gform_hidden { display:none; } .gfield--type-honeypot { display:none !important; } .gfield { margin-bottom:15px !important; } .ginput_container { margin:0 !important; } .dsn-leadgen-top h1 { border-bottom:1px solid #000; padding-bottom:10px; } .gform_wrapper.gravity-theme .gform_footer, .gform_wrapper.gravity-theme .gform_page_footer { display:flex; } /* Fix: prevent persistent blue background on radios/checkboxes after click */ /* - Remove mobile tap highlight and touch callout on choice labels */ .gform_wrapper .gfield_checkbox label, .gform_wrapper .gfield_radio label { -webkit-tap-highlight-color: transparent; -webkit-touch-callout: none; -webkit-user-select: none; -ms-user-select: none; user-select: none; } /* Keep a visible focus/active ring for keyboard and touch users, but don't override the checked color */ .gform_wrapper .gfield_radio input[type="radio"]:focus + label::before, .gform_wrapper .gfield_radio label:focus::before, .gform_wrapper .gfield_checkbox input[type="checkbox"]:focus + label::before, .gform_wrapper .gfield_checkbox label:focus::before, .gform_wrapper .gfield_radio label:active::before, .gform_wrapper .gfield_checkbox label:active::before { box-shadow: 0 0 0 3px rgba(11,107,130,0.06); outline: none; } /* Keep a visible focus ring for keyboard users but don't change the indicator color */ .gform_wrapper .gfield_radio input[type="radio"]:focus-visible + label::before, .gform_wrapper .gfield_checkbox input[type="checkbox"]:focus-visible + label::before { box-shadow: 0 0 0 3px rgba(11,107,130,0.12); } /* Ensure checked states cover label-wrapped inputs (label > input + span) and other GF markup variants */ .gform_wrapper .gfield_radio label > input:checked + span::before, .gform_wrapper .gfield_radio label > input:checked + label::before, .gform_wrapper .gfield_radio label input[type="radio"]:checked + span::before, .gform_wrapper .gfield_checkbox label > input:checked + span::before, .gform_wrapper .gfield_checkbox label input[type="checkbox"]:checked + span::before { background: #0b6b82 !important; border-color: #0b6b82 !important; } /* Keep a visible focus/active ring for keyboard and touch users, but don't override the checked color */ .gform_wrapper .gfield_radio input[type="radio"]:focus + label::before, .gform_wrapper .gfield_radio label:focus::before, .gform_wrapper .gfield_checkbox input[type="checkbox"]:focus + label::before, .gform_wrapper .gfield_checkbox label:focus::before, .gform_wrapper .gfield_radio label:active::before, .gform_wrapper .gfield_checkbox label:active::before { box-shadow: 0 0 0 3px rgba(11,107,130,0.06); outline: none; } /* Keep a visible focus ring for keyboard users but don't change the indicator color */ .gform_wrapper .gfield_radio input[type="radio"]:focus-visible + label::before, .gform_wrapper .gfield_checkbox input[type="checkbox"]:focus-visible + label::before { box-shadow: 0 0 0 3px rgba(11,107,130,0.12); } /* Ensure checked states cover label-wrapped inputs (label > input + span) and other GF markup variants */ .gform_wrapper .gfield_radio label > input:checked + span::before, .gform_wrapper .gfield_radio label input[type="radio"]:checked + span::before, .gform_wrapper .gfield_checkbox label > input:checked + span::before, .gform_wrapper .gfield_checkbox label input[type="checkbox"]:checked + span::before { background: #0b6b82 !important; border-color: #0b6b82 !important; } /* Also reinforce the checked pseudo-element for label::after dot/check variants when inputs are inside labels */ .gform_wrapper .gfield_radio label > input:checked + span::after, .gform_wrapper .gfield_checkbox label > input:checked + span::after, .gform_wrapper .gfield_radio label input[type="radio"]:checked + span::after, .gform_wrapper .gfield_checkbox label input[type="checkbox"]:checked + span::after { background: #fff !important; } .gform_wrapper .gform_page_footer .button.gform_previous_button, .gform_wrapper .gform_page_footer .button.gform_next_button { max-height:0px; margin-top:10px !important; } input[type="submit"] { height:40px; background-color: #2262ab !important; } // Minimal front-end JS for DSN LeadGen Template // Kept intentionally tiny — available for small DOM tweaks if needed later. (function(){ 'use strict'; document.addEventListener('DOMContentLoaded', function(){ // Ensure custom checkbox/radio visuals toggle correctly across GF markup variants. var wrapper = document.getElementById('dsw-brand-custom-hero-content-wrap'); if ( ! wrapper ) { return; } function findChoiceContainer(el){ // Look for common GF choice container patterns return el.closest('li') || el.closest('.gchoice') || el.closest('.gfield_choice') || el.closest('label') || el.parentElement; } function initChoices(){ var inputs = wrapper.querySelectorAll('input[type="checkbox"], input[type="radio"]'); inputs.forEach(function(input){ var container = findChoiceContainer(input); function update(){ if ( ! container ) { return; } if ( input.type === 'radio' ) { if ( input.checked ) { // remove checked class from other radios in the same group try { var groupName = input.name; var group = wrapper.querySelectorAll('input[type="radio"][name="' + groupName.replace(/"/g, '\\"') + '"]'); group.forEach(function(r){ var c = findChoiceContainer(r); if ( c && c !== container ) { c.classList.remove('dsn-checked'); } }); } catch (e) { // fallback: ignore } container.classList.add('dsn-checked'); } else { container.classList.remove('dsn-checked'); } } else { if ( input.checked ) { container.classList.add('dsn-checked'); } else { container.classList.remove('dsn-checked'); } } } input.addEventListener('change', update); // Allow radio buttons to be deselected by clicking the selected option again. if ( input.type === 'radio' ) { // record state before click input.addEventListener('mousedown', function(){ input.dataset.wasChecked = input.checked ? 'true' : 'false'; }); input.addEventListener('click', function(e){ if ( input.dataset.wasChecked === 'true' ) { // if it was already checked, uncheck and fire change e.preventDefault(); input.checked = false; var ev = new Event('change', { bubbles: true }); input.dispatchEvent(ev); } }); } // Also handle clicks on labels (some GF markup toggles input before change event) var label = container && (container.querySelector('label') || container.querySelector('span.choice_label')); if ( label ) { // ensure visuals update after normal clicks label.addEventListener('click', function(){ setTimeout(update, 10); }); // record state on mousedown so we know if the user clicked the already-selected radio label.addEventListener('mousedown', function(){ label.dataset.wasChecked = input.checked ? 'true' : 'false'; }); // if the user clicks the already-checked radio's label, deselect it label.addEventListener('click', function(e){ if ( input.type === 'radio' && label.dataset.wasChecked === 'true' ) { e.preventDefault(); input.checked = false; var ev = new Event('change', { bubbles: true }); input.dispatchEvent(ev); } }); } // initialize update(); }); } // Run once on load and also when GF may update the form (basic fallback) initChoices(); // If Gravity Forms updates fields via AJAX, try to re-init after a short delay document.addEventListener('gform_post_render', function(){ setTimeout(initChoices, 30); }); }); })();