Cookie Settings
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
Your browser does not support the video tag.
Saunas
We only carry the top selling brands in the industry.
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); });
});
})();