/* update variables when header is on dark background*/
.on-dark-bg {
   --header-bg: var(--current-header-bg);
   --chevron-clr: white;
   --menu-item-clr: white;
   --menu-item-hover-bg: #172235;
   --menu-item-hover-clr: #bc92e6;
   --menu-toggle-clr: var(--menu-item-clr);
   --dropdown-content-border: solid 1px rgb(220 220 220 / 20%);
   --mobile-menu-bg: var(--header-bg);
 }

 .on-light-bg {
   --menu-item-clr: black;
   /* update variables when header is on light background*/
 }


 /* update variable when on dark or light background */
 .on-dark-bg,
 .on-light-bg {
   --overlay-header-bg-active: var(--current-header-bg);
   --dropdown-content-bg: var(--current-header-bg);
 }

 .on-video-section {
   /* update variables when header is on video section*/
   --menu-item-clr: white;
   --chevron-clr: white;
   --menu-item-hover-bg: rgb(0 0 0 / 30%);
   --menu-item-hover-clr: #bc92e6;
   --dropdown-content-bg: rgb(0 0 0 / 70%);
   --overlay-header-bg: rgb(0 0 0 / 25%);
   --overlay-header-bg-active: var(--dropdown-content-bg);
   --dropdown-content-border: solid 1px rgb(220 220 220 / 20%);
   --current-header-bg: rgb(0 0 0 / 14%) !important;
   --header-bg: rgb(0 0 0 / 70%);
   --menu-toggle-clr: white;
   --mobile-menu-bg: rgb(0 0 0 / 95%);
   --menu-cta-border: var(--dropdown-content-border)
 }


 .on-hero-section {
   /* update variables when header is on hero section*/
 }

 /* header bg blure when on video section */
 html:not(.dwc-mobile) .dwc-nest-header.on-video-section {
   backdrop-filter: blur(var(--overlay-header-blur));
 }

 /* overlay header border when on video section or dark background*/
 .dwc-nest-header:is(.on-dark-bg, .on-video-section)[data-overlay-header="true"] {
   border: 1px solid rgba(255, 255, 255, 0.2);
 }

 /* header bottom border when on dark background or video section*/
 .dwc-nest-header:is(.on-dark-bg, .on-video-section) {
   border-bottom: 1px solid rgba(255, 255, 255, 0.2);
 }


 /* logo color when on dark background*/
 .on-dark-bg .dwc-nest-menu__logo path {
   fill: white;
 }

 /* logo color when on light background*/
 .on-dark-bg .dwc-nest-menu__logo path {
   /*define svg fill when logo is on light background */
 }

 /* logo color when on video background*/
 .on-video-section .dwc-nest-menu__logo path {
   fill: white;
 }

/*custom */

.on-dark-bg .mega-menu-magic__menu-icon-large{
   background-color: var(--current-header-bg);
    fill: #bc92e6;
    color: #bc92e6;
}

.on-video-section .mega-menu-magic__menu-icon-large{
   background-color: var(--current-header-bg);
    fill: #bc92e6;
    color: #bc92e6;
}

.on-video-section .mega-menu-magic__dropdown-title,
.on-dark-bg .mega-menu-magic__dropdown-title{
    color: rgb(210 210 210);   
}
// Constants
const BREAKPOINT_DESKTOP = 0;
const DEBOUNCE_DELAY = 50;

// Configuration object for all header-related selectors
const HEADER_CONFIG = {
  // Main header element
  headerElement: '.dwc-nest-header',
  // Wrapper element selectors (can be classes, IDs, or data attributes)
  wrapperSelectors: [
    // '.dwc-nest-header__container'
  ],
  // Elements to monitor for header styling (can include any CSS selector)
  // Default monitors sections, but you can add footer, divs, or any element
  monitoredElements: 'section, [data-header-zone]',
  // Store original header background color
  originalHeaderBgColor: null
};

// Unified section type configuration
// Add new data attributes here - they will be automatically mapped to header classes
const SECTION_TYPES = {
  'data-hero': 'on-hero-section',
  'data-video': 'on-video-section',
  'data-custom': 'on-custom-section',
  'data-sticky': 'on-media-section'
  // Add new: 'data-feature': 'on-feature-section'
};

// Configuration for excluded sections
const EXCLUSION_CONFIG = {
  // Data attribute that identifies sections to exclude from header styling
  sectionAttribute: 'data-exclude-header'
};

// Text color classes
const TEXT_CLASSES = {
  light: 'on-dark-bg',
  dark: 'on-light-bg'
};

// Generate classes to remove dynamically from SECTION_TYPES and text classes
const ALL_CLASSES_TO_REMOVE = [
  // Add all header classes from section types
  ...Object.values(SECTION_TYPES),
  // Add text color classes
  TEXT_CLASSES.light,
  TEXT_CLASSES.dark
];

// Performance optimization: Cache DOM elements and computed values
const CACHE = {
  headerElement: null,
  wrapperElement: null,
  sections: [],
  sectionsData: new Map(),
  colorCache: new Map(),
  tempColorElement: null,
  lastKnownSection: null,
  isUpdating: false,
  pendingColorUpdate: false
};

// Initialize cache
function initializeCache() {
  // Cache header elements
  CACHE.headerElement = document.querySelector(HEADER_CONFIG.headerElement);
  
  // Try each wrapper selector until one is found
  for (const selector of HEADER_CONFIG.wrapperSelectors) {
    CACHE.wrapperElement = document.querySelector(selector);
    if (CACHE.wrapperElement) break;
  }
  
  // Cache sections and their positions
  CACHE.sections = Array.from(document.querySelectorAll(HEADER_CONFIG.monitoredElements));
  
  // Create reusable element for color calculations
  CACHE.tempColorElement = document.createElement('div');
  CACHE.tempColorElement.style.position = 'absolute';
  CACHE.tempColorElement.style.visibility = 'hidden';
  CACHE.tempColorElement.style.pointerEvents = 'none';
  document.body.appendChild(CACHE.tempColorElement);
  
  // Cache section metadata
  updateSectionsCache();
}

// Update sections cache (call when DOM changes)
function updateSectionsCache() {
  CACHE.sections = Array.from(document.querySelectorAll(HEADER_CONFIG.monitoredElements));
  CACHE.sectionsData.clear();
  
  CACHE.sections.forEach((section, index) => {
    const sectionData = {
      index,
      isExcluded: section.hasAttribute(EXCLUSION_CONFIG.sectionAttribute)
    };
    
    // Dynamically check for all section types defined in SECTION_TYPES
    Object.keys(SECTION_TYPES).forEach(attribute => {
      sectionData[attribute] = section.hasAttribute(attribute);
    });
    
    CACHE.sectionsData.set(section, sectionData);
  });
}

// Function to remove all section classes from :root only
function removeAllSectionClasses() {
  const rootElement = document.documentElement;
  
  // Remove classes from :root only
  rootElement.classList.remove(...ALL_CLASSES_TO_REMOVE);
}

// Function to update the CSS variable on :root
function updateRootBackgroundVariable(color) {
  document.documentElement.style.setProperty('--current-header-bg', color);
}

// Function to apply classes to :root only
function applyClassesToRoot(headerClass, textClass) {
  const rootElement = document.documentElement;
  
  // Apply header class to :root only
  if (headerClass) {
    rootElement.classList.add(headerClass);
  }
  
  // Apply text class to :root only
  if (textClass) {
    rootElement.classList.add(textClass);
  }
}

// Optimized color conversion using cached temp element
function getRGBValues(color) {
  const cacheKey = color;
  if (CACHE.colorCache.has(cacheKey)) {
    return CACHE.colorCache.get(cacheKey);
  }
  
  CACHE.tempColorElement.style.color = color;
  const computedColor = window.getComputedStyle(CACHE.tempColorElement).color;
  
  // Extract RGB values
  const match = computedColor.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);
  const result = match ? {
    r: parseInt(match[1]),
    g: parseInt(match[2]),
    b: parseInt(match[3])
  } : { r: 255, g: 255, b: 255 };
  
  // Cache the result
  CACHE.colorCache.set(cacheKey, result);
  return result;
}

// Function to check if a background color is transparent or empty
function isBackgroundTransparent(color) {
  if (!color) return true;
  
  const transparentValues = [
    'transparent',
    'rgba(0, 0, 0, 0)',
    'rgba(0,0,0,0)',
    'initial',
    'inherit',
    ''
  ];
  
  return transparentValues.includes(color.toLowerCase().replace(/\s/g, ''));
}

// Function to determine if a color is dark or light
function isColorDark(color) {
  if (color === 'transparent' || color === 'rgba(0, 0, 0, 0)') {
    return false;
  }
  
  const rgb = getRGBValues(color);
  const luminance = (0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b) / 255;
  return luminance < 0.5;
}

// Optimized section detection using cached data
function getCurrentSection() {
  if (!CACHE.headerElement || CACHE.sections.length === 0) return null;
  
  const headerHeight = CACHE.headerElement.offsetHeight;
  
  // Quick check if we're still in the same section
  if (CACHE.lastKnownSection) {
    const rect = CACHE.lastKnownSection.getBoundingClientRect();
    if (rect.top <= headerHeight && rect.bottom > headerHeight) {
      return CACHE.lastKnownSection;
    }
  }
  
  // Binary search would be ideal here, but simple loop is sufficient for most cases
  for (const section of CACHE.sections) {
    const rect = section.getBoundingClientRect();
    if (rect.top <= headerHeight && rect.bottom > headerHeight) {
      CACHE.lastKnownSection = section;
      return section;
    }
  }
  
  const firstSection = CACHE.sections[0] || null;
  CACHE.lastKnownSection = firstSection;
  return firstSection;
}

// Function to get computed background color with caching
function getComputedBackgroundColor(element) {
  const cacheKey = element;
  if (CACHE.colorCache.has(cacheKey)) {
    return CACHE.colorCache.get(cacheKey);
  }
  
  const bgColor = window.getComputedStyle(element).backgroundColor;
  CACHE.colorCache.set(cacheKey, bgColor);
  return bgColor;
}

// Function to initialize original header background color
function initializeOriginalHeaderBgColor() {
  if (CACHE.headerElement) {
    HEADER_CONFIG.originalHeaderBgColor = window.getComputedStyle(CACHE.headerElement).backgroundColor;
  }
}

// Function to determine header style configuration based on section
function determineHeaderConfig(section) {
  if (!section) return null;
  
  const sectionData = CACHE.sectionsData.get(section);
  if (!sectionData) return null;
  
  // If section is excluded, return null to skip styling
  if (sectionData.isExcluded) {
    return null;
  }
  
  // Dynamically check for any section type defined in SECTION_TYPES
  for (const [attribute, headerClass] of Object.entries(SECTION_TYPES)) {
    if (sectionData[attribute]) {
      return {
        backgroundColor: null,
        headerClass: headerClass,
        needsWhiteText: null,
        isSpecialSection: true
      };
    }
  }
  
  // Get the actual background color of the section
  const sectionBgColor = getComputedBackgroundColor(section);
  
  if (isBackgroundTransparent(sectionBgColor)) {
    return {
      backgroundColor: HEADER_CONFIG.originalHeaderBgColor || 'rgb(255, 255, 255)',
      headerClass: null,
      needsWhiteText: isColorDark(HEADER_CONFIG.originalHeaderBgColor || 'rgb(255, 255, 255)'),
      isSpecialSection: false
    };
  }
  
  const needsWhiteText = isColorDark(sectionBgColor);
  
  return {
    backgroundColor: sectionBgColor,
    headerClass: null,
    needsWhiteText: needsWhiteText,
    isSpecialSection: false
  };
}

// Function to apply styles (background color to header, classes to :root only)
function applyHeaderStyles(config) {
  if (!CACHE.headerElement || !config) return;
  
  const elementsToStyle = [CACHE.headerElement, CACHE.wrapperElement].filter(Boolean);
  
  // Use requestAnimationFrame for smooth visual updates
  requestAnimationFrame(() => {
    // First, remove all section classes and text classes from :root only
    removeAllSectionClasses();
    
    // Update the root CSS variable with background color
    if (config.backgroundColor !== null) {
      const appliedBgColor = config.backgroundColor || '';
      updateRootBackgroundVariable(appliedBgColor);
    } else {
      updateRootBackgroundVariable('');
    }
    
    // Determine text class to apply
    const textClass = config.needsWhiteText !== null 
      ? (config.needsWhiteText ? TEXT_CLASSES.light : TEXT_CLASSES.dark)
      : null;
    
    // Apply classes to :root only
    applyClassesToRoot(config.headerClass, textClass);
    
    // Handle background color on header elements only
    elementsToStyle.forEach(element => {
      if (config.backgroundColor !== null) {
        const appliedBgColor = config.backgroundColor || '';
        element.style.backgroundColor = appliedBgColor;
      } else {
        element.style.backgroundColor = '';
      }
    });
    
    // For special sections, allow CSS to apply first, then get computed background color
    if (config.isSpecialSection && config.headerClass) {
      // Use setTimeout(0) to ensure CSS has been applied, but batch multiple calls
      if (!CACHE.pendingColorUpdate) {
        CACHE.pendingColorUpdate = true;
        setTimeout(() => {
          // Process all elements that need color updates in this batch
          elementsToStyle.forEach(el => {
            // Check if element has any of the section classes (though they're not applied anymore)
            const hasSectionClass = Object.values(SECTION_TYPES).some(className => 
              el.classList.contains(className)
            );
            
            if (hasSectionClass) {
              const computedBgColor = getComputedBackgroundColor(el);
              updateRootBackgroundVariable(computedBgColor);
            }
          });
          CACHE.pendingColorUpdate = false;
        }, 50);
      }
    }
    
    CACHE.isUpdating = false;
  });
}

// Throttled update function using requestAnimationFrame
function updateHeaderStyles() {
  // Prevent multiple updates in the same frame
  if (CACHE.isUpdating) return;
  
  // Apply only on screens larger than the breakpoint
  if (window.innerWidth <= BREAKPOINT_DESKTOP) {
    return;
  }
  
  CACHE.isUpdating = true;
  
  const currentSection = getCurrentSection();
  if (!currentSection) {
    CACHE.isUpdating = false;
    return;
  }
  
  const headerConfig = determineHeaderConfig(currentSection);
  if (!headerConfig) {
    CACHE.isUpdating = false;
    return;
  }
  
  applyHeaderStyles(headerConfig);
}

// Debounce function for resize events (less frequent)
function debounce(func, wait) {
  let timeout;
  return function executedFunction(...args) {
    const later = () => {
      clearTimeout(timeout);
      func(...args);
    };
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
  };
}

// RAF-based throttle for scroll events
let rafId = null;
function throttleWithRAF(func) {
  return function(...args) {
    if (rafId) return;
    
    rafId = requestAnimationFrame(() => {
      func.apply(this, args);
      rafId = null;
    });
  };
}

// Initialize everything
function initialize() {
  initializeCache();
  initializeOriginalHeaderBgColor();
  updateHeaderStyles();
}

// Cleanup function
function cleanup() {
  if (CACHE.tempColorElement && CACHE.tempColorElement.parentNode) {
    CACHE.tempColorElement.parentNode.removeChild(CACHE.tempColorElement);
  }
  if (rafId) {
    cancelAnimationFrame(rafId);
  }
}

// Initialize on page load
if (document.readyState === 'loading') {
  document.addEventListener('DOMContentLoaded', initialize);
} else {
  initialize();
}

// Create optimized event handlers
const throttledUpdateHeaderStyles = throttleWithRAF(updateHeaderStyles);
const debouncedUpdateHeaderStyles = debounce(() => {
  updateSectionsCache(); // Refresh cache on resize
  updateHeaderStyles();
}, DEBOUNCE_DELAY);

// Add event listeners with passive option for better performance
window.addEventListener('scroll', throttledUpdateHeaderStyles, { passive: true });
window.addEventListener('resize', debouncedUpdateHeaderStyles, { passive: true });

// Cleanup on page unload
window.addEventListener('beforeunload', cleanup);

Case studies

Hotel Gyms vs Apartment Gyms: Equipment and Layout Differences

At first glance, hotel gyms and apartment gyms might seem similar: both are fitness spaces attached to buildings where people live or stay. In practice, their equipment choices, layout logic, and overall goals are quite different. From our experience with hundreds of fitness facility projects, understanding these differences is essential for the success of any project. 

Hotel Gyms vs Apartment Gyms: Key Takeaways

  • Hotel gyms prioritize broad appeal and essential functionality, while apartment gyms prioritize long-term resident needs with a mix of trending and future-proofed equipment.
  • Equipment selection in hotels typically leans toward foundational fitness equipment; apartment gyms often include a wider variety.
  • Layout constraints differ: hotel gyms usually have smaller footprints and are designed for quick, efficient workouts, while apartment gyms often include more space for dedicated training zones that support residents’ regular routines.
  • Ease of maintenance, durability, and user behavior directly impact equipment choices and spatial planning in both environments.

Hotel Gym & an Apartment gym

At first glance, hotel gyms and apartment gyms might seem similar: both are fitness spaces attached to buildings where people live or stay. In practice, their equipment choices, layout logic, and overall goals are quite different. From our experience with hundreds of fitness facility projects, understanding these differences is essential for the success of any project. 

The Purpose of a Hotel Gym vs. an Apartment Gym?

You might think that “a gym is a gym,” but a well-designed fitness center is tailored to its primary target audience of exercisers, making the core purpose of a hotel gym pretty different from apartment gyms. 

The Goal of a Hotel Gym

A hotel gym is designed to serve a wide range of short-term guests with different fitness levels and limited time. Travelers are often unfamiliar with the space and prioritize convenience. Hotel operators also rely on guest feedback and local competition to guide equipment choices and amenities.

Gym set up

In many hospitality projects, the fitness center must align with the hotel’s brand standards and overall guest experience, ensuring the space both visually and functionally reflects the property’s positioning. From our experience designing hotel fitness centers, the goal is to create an elevated, universally accessible workout environment that feels complete without overwhelming a transient user. This typically means prioritizing foundational equipment, clean aesthetics, and an optimized layout that makes the most of often limited space.

Apartment Gym: What Is Its Core Goal?

An apartment complex’s gym serves long-term residents who typically use the space repeatedly as part of a weekly routine, lifestyle habit, or rehab plan. Residents expect a space that supports different goals over time, such as strength, cardio, functional fitness, and recovery.

Apartment gyms are often designed for deeper engagement, like a more comprehensive machinery selection, flexible training zones, and future-proofed equipment that adapts to the trends. Planning here takes into account regular use patterns and resident retention goals.

How is Equipment Different Between Hotel and Apartment Gyms?

What Equipment Is Most Common in Hotel Gyms?

Hotel gym equipment often prioritizes fundamental versatility and ease of use. Common considerations our experts recommend for hotel gym design include:

  • Treadmill, elliptical, and stationary bike.
  • Adjustable cable machine or multi-station unit.
  • A small selection of dumbbells and kettlebells.
  • Heavy-duty protective gym flooring.

Why this pattern? Because hotel operators want equipment that:

  • Appeals to all fitness levels.
  • Requires minimal supervision or instruction.
  • Does not intimidate inexperienced users.
  • Offers a touch of variety without a huge footprint.

Heavy strength equipment, power racks, and specialized gear are less common because they can be underused or pose a greater need for supervision and maintenance. Because space is often limited, equipment selection must be efficient and versatile.

“Hotels typically prioritize high-usage equipment that aligns with the age range and fitness levels of their guests,” Watson says. “Cardio equipment like treadmills and bikes are usually essential, while multi-use strength equipment allows guests to complete a full-body workout without requiring a large footprint.”

Gym set up

Many hospitality projects incorporate solutions like multi-station systems or functional training equipment, which provide strength training versatility within compact spaces.

What Equipment Is Typically in Apartment Gyms?

Apartment facilities often include a broader and deeper equipment set. Based on ASF’s project experience, many resident gym spaces include:

Gym set up
  • Full strength area with squat rack(s), bench press, and free weights.
  • Multiple cardio machines with a wider variety (rowers, bikes, treadmills).
  • Functional training tools (from full frames to accessories).
  • Multi-use cable machines and selectorized strength units.
  • Optional wellness add-ons like stretching areas or yoga zones.

Residents are not just passing through; they are building routines. This justifies investment in equipment that supports strength progression, flexibility training, and even advanced workouts.

Why Is Layout Planning Different Between Hotels and Apartments?

How Do Hotel Gyms Approach Layout and Flow?

Hotel gyms are often constrained by limited square footage (and often small budgets). Their layout must maximize perceived openness and maintain adequate spacing for multiple exercisers at once. This leads to:

  • Compact equipment arrangements
  • Clear walkways
  • Minimal dedicated zones

With our industry knowledge, hotel gym design is a balancing act between functionality and accessibility. Layouts should feel intuitive, allowing guests to understand the space immediately without needing instructions.

Gym set up

As Christine Watson, Hospitality Sales Manager at Advantage Sport & Fitness, explains:

“Hotel guests are often short on time and unfamiliar with the property, so the fitness center should be easy to navigate and immediately comfortable to use. Guests should be able to walk in, see the equipment clearly, and begin their workout without confusion.”

This approach often results in compact equipment arrangements, open sightlines, and clearly visible equipment zones that make the space feel approachable and easy to use.

How Are Apartment Gym Zones Structured?

Apartment gym design often allows more flexibility to meet the preferences of the developer or management company. In many cases, these fitness centers are planned with distinct zones for different activities, including:

  • Strength training zone with free weights and racks.
  • Cardio zone with machines spaced for comfort.
  • Functional training area with open floor space and accessories.
  • Stretching, yoga, or recovery space for mobility.

Because residents are recurring users, layouts can support circuits, cross-training, and multi-user flow. Equipment is arranged to minimize interference (such as separating cardio from heavy lifts) and create intuitive workout paths.

In our projects, we often advocate for flexible zones and future-proofed equipment in apartment gyms: spaces that can transform for group fitness, pilates, or community events. This enhances perceived resident value and space usability over time.

What Are the Maintenance and Durability Considerations?

Do Hotel Gyms Require Different Durability Standards?

Yes. Hotel gyms frequently experience variable user ability, including guests who may not be familiar with equipment etiquette. This requires:

  • Equipment that is durable, low-maintenance, and easy to clean.
  • Intuitive  interfaces and adjustments on machines.
  • Strategic placement of high-traffic items to avoid wear on the flooring.
  • Preventative maintenance to keep equipment running smoothly.

In hotels, we recommend equipment that can withstand inconsistent use and is forgiving for first-time users. Foundational, well-known fitness equipment is often best for this reason.

How About Apartment Gym Equipment Longevity?

Apartment gyms generally have more predictable wear patterns because residents use the space repeatedly as part of their routine. That said, durability still matters, especially in high-end or competitive rental markets. For apartment fitness centers, we recommend:

Gym set up
  • Commercial-grade strength and cardio equipment with warranty support.
  • Modular systems that can be expanded or updated.
  • Enhanced flooring and elevated cleaning protocols to support frequent use.
  • Preventative maintenance to ensure reliability and increase the lifespan of equipment.

From our expert perspective, the trend in apartment gyms is toward longevity in user experience, because residents associate facility quality with property value.

Can Hotel and Apartment Gyms Share Design Principles?

Despite being fundamentally different designs, both hotel and apartment gyms should be built with these foundational principles:

  • Cleanliness and accessibility (easy to maintain, ADA-compliant, and well-lit, with strategically-placed outlets).
  • Intuitive design (users should immediately understand where and how to exercise).
  • Exerciser safety (clear pathways, stable equipment, adequate spacing).
  • Appropriate scale (equipment selection and layout should match space size and expected usage).

Every gym (regardless of type) must support a positive experience for exercisers. A poorly planned gym will be underutilized, regardless of the equipment you choose.

Expert Insight: What Makes a Fitness Space Actually Work?

From ASF’s gym design experience, we know the most successful hotel and apartment gyms are not those that simply cram more equipment into the space. They are the ones asking, “Who is using this? What experience do they expect? How will they feel when they walk in?”

Gym set up

In hotel or vacation property gyms (such as Serenité at Camelback), exercisers often want a workout they can finish in 20–30 minutes that feels efficient and not intimidating. Meanwhile, in apartment communities (like Eight Winds), users want comfort, choice, progression, and space to grow their fitness habits.

We’ve seen hotel gyms succeed when they invest in accessible, easy-to-understand equipment, paired with layouts that keep traffic flowing and minimize confusion. Conversely, apartment gyms succeed when they provide structured zones and robust, varied gear that residents can rely on for the long haul.

Industry Expertise Across Hospitality and Multifamily Fitness Spaces

At ASF, fitness facility design is supported by specialized expertise across different industries. Our team includes dedicated Hospitality Sales Managers who focus exclusively on hotel fitness amenities, as well as specialists in multifamily fitness center design. This industry-specific knowledge helps ensure each fitness space is aligned with how it will actually be used.

In the hospitality market, ASF also works closely with hotel brands to ensure installations meet brand standards and guest experience expectations.

“One of the biggest advantages we bring to hospitality projects is our experience navigating hotel brand standards,” Watson says. “We help ensure every fitness center meets those requirements while also creating a space that maximizes guest satisfaction.”

From early planning through equipment selection, installation, and preventative maintenance, ASF provides end-to-end support for fitness spaces across hospitality and multifamily markets.

Choose ASF for Professional Gym Design Services

Hotel and apartment gyms both offer a place for exercisers to work out, but their equipment choices, layout logic, and usage expectations differ dramatically. With expertise in the unique needs and challenges of each of these spaces, ASF’s gym designers offer trusted support for any project. 

Whether you’re redesigning a compact hotel fitness center or planning a comprehensive apartment community gym, our experts offer the end-to-end support you need to make your vision a reality, from design to installation and ongoing maintenance. Contact us to get started today. 

FAQs

What is the main difference between a hotel gym and an apartment gym?

The primary difference is the user profile and frequency of use. Hotel gyms are designed for short-term guests who need efficient, easy-to-use equipment for quick workouts. Apartment gyms serve long-term residents who use the space regularly, which requires more diverse equipment, dedicated training zones, and a layout that supports ongoing fitness routines.

How big should a hotel fitness center be?

Hotel fitness centers are typically designed to maximize functionality within a compact footprint. While size varies by property tier and brand standards, most hotel gyms prioritize space-efficient cardio machines, multi-use strength equipment, and clear walkways to maintain an open, welcoming feel. The goal is not maximum size but optimal usability for transient guests.

What equipment is essential in a multifamily or apartment gym?

A well-designed apartment gym usually includes a balanced mix of cardio machines, free weights, selectorized strength equipment, and functional training space. Because residents use the facility repeatedly, multifamily gyms often benefit from squat racks, cable systems, and flexible training areas that support strength progression, group workouts, and long-term engagement.

Do hotel gyms need commercial-grade fitness equipment?

Yes. Even though hotel guests may use the space less frequently than apartment residents, hospitality fitness centers still require commercial-grade equipment for durability, safety, and brand consistency. Equipment should be intuitive, low-maintenance, and capable of handling variable user experience levels.

Can the same gym design work for both hotels and apartment communities?

While some foundational principles overlap, a one-size-fits-all approach rarely performs well. Hotel gyms must prioritize simplicity, quick access, and broad appeal, while apartment gyms should support progression, variety, and repeat use. The most successful projects tailor equipment selection, layout, and finishes to the specific user environment and property goals.

Ready to start your next project? Reach out to the Advantage team today.

Our services

We are ready to support your facility in every phase.

Partner Brands

Explore our collection of partner brands.

All Partner Brands
Case Studies

Examples of our work.

All Case Studies