/*prevent FOUC on mobile when using sidebar */
.dwc-mobile :is(.bricks-is-frontend.brx-header-left, .bricks-is-frontend.brx-header-right) #brx-header {
  position: relative;
  inline-size: 100%;
  flex-direction: column;
}

.dwc-mobile .bricks-is-frontend:is(.brx-header-left, .brx-header-right) :is(#brx-content, #brx-footer) {
  margin-inline-start: 0;
}

/*prevent FOUC on desktop when using sidebar */
.bricks-is-frontend:is(.brx-header-left, .brx-header-right):not(.show-nav) .dwc-nav-wrapper {
  display: none;
}

/*=== sidebar css ===*/
html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header {
  flex-direction: column;
  box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.7);  
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]).no-scroll {
  overflow: visible;
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nest-menu.brxe-nav-nested .brx-nav-nested-items {
  max-block-size: 100dvb;
  padding-block-end: 12rem;
  overscroll-behavior: contain;
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nav-wrapper {
  position: relative;
  overflow: hidden;
  block-size: 100%;
  transform: translateX(0%);
  visibility: visible;
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) .dwc-nest-menu .brxe-toggle {
  display: none !important;
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nest-menu {
  display: flex;
  flex-direction: column;
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nest-header > div {
  display: flex;
  grid-template-columns: 1fr;
  block-size: 100%;
  flex-direction: column;
  justify-content: flex-start;
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-menu-wrap {
  inline-size: 100%;
  display: grid;
  grid-template-columns: 1fr;
  block-size: 100%;
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header :is(.brxe-code, .dwc-nest-menu-overlay) {
  display: none;
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nest-header {
  inline-size: 100%;
  padding-inline: 0;
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nest-menu-top {
  min-block-size: var(--top-offset);
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nest-menu:not( [data-hide-close-bar = 'true']) .brx-dropdown-content {
  inset-block-start: calc(var(--top-offset) + 1px) !important;

}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nest-menu:not( [data-submenu-reveal = 'slide']) .brx-dropdown-content:not([data-submenu-reveal = 'slide'] *) {  
  inset-inline-start: 0;
  inset-block-start: unset !important;
  overflow: hidden;
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nest-menu:not([data-submenu-reveal = 'slide']) .brxe-dropdown:not(.open.active) > .brx-dropdown-content > .brxe-dropdown:not([data-submenu-reveal = 'slide'] *){
  visibility: hidden;  
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nest-menu.brxe-nav-nested.brx-open .brxe-dropdown > .brx-dropdown-content {
  overscroll-behavior: contain;
  min-inline-size: var(--mobile-menu-width);

}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nest-menu .brxe-dropdown.open > .brx-submenu-toggle button:not([data-submenu-reveal = 'expand'] button)  {
  min-block-size: calc(var(--top-offset) - 1px);
  inset-block-start: 0;
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nest-menu .brxe-dropdown.open[data-submenu-reveal = 'slide'] > .brx-submenu-toggle button  {
  min-block-size: calc(var(--top-offset) - 1px);
  inset-block-start: 0;
}

html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nest-menu .brxe-dropdown .brx-submenu-toggle button {
  min-block-size: 0;    
}

/* sidebar css ends*/



/*sidebar in builder*/
/*=== sidebar css ===*/
:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header {
  flex-direction: column;
  box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.7);
  --top-offset: 40px;
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header .dwc-nest-menu.brxe-nav-nested .brx-nav-nested-items {
  max-block-size: 100dvb;
  padding-block-end: 12rem;
  overscroll-behavior: contain;
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header .dwc-nav-wrapper {
  position: relative;
  overflow: hidden;
  block-size: 100%;
  transform: translateX(0%);
  visibility: visible;
}

body:is(.brx-header-left, .brx-header-right)[data-builder-window] .dwc-nest-menu .brxe-toggle {
  display: none !important;
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header .dwc-nest-menu {
  display: flex;
  flex-direction: column;
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header .dwc-nest-header > div {
  display: flex;
  grid-template-columns: 1fr;
  block-size: 100%;
  flex-direction: column;
  justify-content: flex-start;
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header .dwc-menu-wrap {
  inline-size: 100%;
  display: grid;
  grid-template-columns: 1fr;
  block-size: 100%;
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header .dwc-nest-header {
  inline-size: 100%;
  padding-inline: 0;
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header .dwc-nest-menu-top {
  min-block-size: var(--top-offset);
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header .dwc-nest-menu .brx-dropdown-content {
  inset-block-start: calc(var(--top-offset) - 1px) !important;
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header .dwc-nest-menu.brxe-nav-nested.brx-open .brxe-dropdown > .brx-dropdown-content {
  overscroll-behavior: contain;  
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header .dwc-nest-menu .brxe-dropdown.open > .brx-submenu-toggle button {
  min-block-size: calc(var(--top-offset) - 1px);
  inset-block-start: 0;
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header .dwc-nest-menu .brxe-dropdown .brx-submenu-toggle button {
  min-block-size: 0;    
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] .dwc-nest-menu {
  margin: 0 !important;
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] .brx-nav-nested-items {  
  flex-direction: column !important;  
}
   
:is(.brx-header-left, .brx-header-right)[data-builder-window] .dwc-nest-toggle--open.brxe-toggle {
  display: flex !important;
}
 
:is(.brx-header-left, .brx-header-right)[data-builder-window] .dwc-nest-menu .brx-nav-nested-items {
  position: relative !Important;
  background: var(--mobile-menu-bg) !important;
  align-items: stretch;
  flex: 1;
}

:where(.brx-header-left, .brx-header-right)[data-builder-mode]:not(:has(.dwc-sidebar)) .dwc-nest-menu-top::before {
    content: 'this space is the back text bar';
    padding: 1rem;
    background-color: gray;
    color: white;
    width: 100%;
    text-transform: uppercase;
    font-size: 12px;
    font-weight: bold;
    letter-spacing: 1px;
}
 
/* MENU CTA (LAST BUTTON) */
:is(.brx-header-left, .brx-header-right)[data-builder-window] [data-last-item-is-button="true"].dwc-nest-menu .brx-nav-nested-items > .menu-item:last-of-type {
  padding-inline: var(--menu-item-inline-padding) !important;
  padding-block: var(--menu-item-block-padding) !important;
}
 
:is(.brx-header-left, .brx-header-right)[data-builder-window] .dwc-nest-menu-top {
  min-block-size: 80px !important;
}
 
:is(.brx-header-left, .brx-header-right)[data-builder-window] .dwc-nest-nav-items {
  overflow-y: scroll;
}

:is(.brx-header-left, .brx-header-right)[data-builder-mode] .brx-dropdown-content {
  min-inline-size: var(--mobile-menu-width);
  position: static;
}

:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header .dwc-nest-menu.brxe-nav-nested .brx-nav-nested-items {
  flex-wrap: nowrap;
}
:is(.brx-header-left, .brx-header-right)[data-builder-window] #brx-header .dwc-nest-menu .brx-dropdown-content {   
  visibility: visible !important;
  opacity: 1;
}

/*OVERLAY SIDEBAR*/


html:not(.dwc-mobile):has([data-overlay-sidebar=true])  {
 --mobile-menu-bg: rgb(255 255 255 / 0%);
  --menu-item-border: solid 1px rgb(255 255 255 / 50%);
 
}

html:not(.dwc-mobile):has([data-overlay-sidebar=true]) :is(.brx-header-left, .brx-header-right):not([data-builder-modee]) :is(main, footer){
  margin: 0 !important
}

html:not(.dwc-mobile):has([data-overlay-sidebar=true]) :is(.brx-header-left, .brx-header-right):not([data-builder-modee]) :is(main, footer) :where(section):not(section>section) {
  padding-inline-start: calc(var(--mobile-menu-width) + clamp(1.5rem, calc(0.625vw + 1.375rem), 1.875rem));
  max-inline-size: 100%
}

html:not(.dwc-mobile):has([data-overlay-sidebar=true]) :is(.brx-header-left, .brx-header-right):not([data-builder-modee]) #brx-header {
  border-radius: var(--overlay-sidebar-radius);
  overflow: hidden;
  background: var(--overlay-sidebar-bg);
  box-shadow: var(--overlay-sidebar-shadow) !important;
  inset: var(--overlay-sidebar-inset);
}

html:not(.dwc-mobile):has([data-overlay-sidebar=true]) :is(.brx-header-left, .brx-header-right):not([data-builder-modee]) .dwc-nest-header{
  backdrop-filter: blur(13px);
  background: transparent !important;
}

html:not(.dwc-mobile):has([data-overlay-sidebar=true]):not([data-builder-modee])  .brx-dropdown-content {
   background-color: rgb(255 255 255 / 100%);
}

/*NO BRX-OPEN STYLES*/
html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) #brx-header .dwc-nest-menu.brxe-nav-nested .brx-nav-nested-items {
  display: flex;
  flex-wrap: nowrap;
  flex-direction: column !important;
}


  html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) .dwc-nest-menu.brxe-nav-nested .brxe-dropdown .brx-dropdown-content {
      visibility: visible;
      min-inline-size: var(--mobile-menu-width) !important;
  }


  html:not(.dwc-mobile) :is(.brx-header-left, .brx-header-right):not([data-builder-window]) .dwc-nest-menu[data-submenu-reveal="expand"] .brxe-dropdown.open>.brx-dropdown-content {
   position: static;
}


class SidebarNavigation {
  constructor(options = {}) {
    // Basic configuration properties
    this.config = {
      minWidth: options.minWidth || MegaMenuCONFIG.minWidth, // Using external minWidth variable
      menuSelector: options.menuSelector || '.dwc-nest-menu',
      openClass: options.openClass || 'brx-open',
      activeClasses: options.activeClasses || ['open', 'active'],
      leftHeaderClass: options.leftHeaderClass || 'brx-header-left',
      rightHeaderClass: options.rightHeaderClass || 'brx-header-right',
      debounceDelay: options.debounceDelay || 100,
      menuItemClickDelay: options.menuItemClickDelay || 300
    };
    
    // Set dependent selectors
    const menuSelector = this.config.menuSelector;
    this.config.submenuToggleSelector = options.submenuToggleSelector || `${menuSelector} .brx-submenu-toggle`;
    this.config.dropdownSelector = options.dropdownSelector || `${menuSelector} .brxe-dropdown`;
    this.config.dropdownContentSelector = options.dropdownContentSelector || `${menuSelector} .brx-dropdown-content`;
    
    // State
    this.previousHeaderClass = null;
    this.dropdownClickHandlers = new Map();
    this.menuHoverHandlers = null;
    this.menuItemClickTimeout = null;
    this.keyboardNavHandler = null;
    this.cachedFocusableElements = null;
    this.cachedElements = {
      menuElement: null,
      navElement: null,
      dropdowns: null,
      dropdownToggles: null,
      menuItems: null
    };
    
    // Bind methods to this instance
    this.handleResize = this.debounce(this.handleMenu.bind(this), this.config.debounceDelay);
    this.handleOutsideClick = this.handleOutsideClick.bind(this);
  }
  
  // Initialize everything - called once
  init() {
    // Wait for DOM to be fully loaded before attaching events
    if (document.readyState === 'loading') {
      document.addEventListener('DOMContentLoaded', () => {
        this.initAfterDOMLoaded();
      }, { once: true });
    } else {
      this.initAfterDOMLoaded();
    }
    
    return this;
  }
  
  // Separate initialization method to run after DOM is loaded
  initAfterDOMLoaded() {
    // Cache DOM elements once
    this.cacheElements();
    
    // Setup resize event with passive flag
    window.addEventListener('resize', this.handleResize, { passive: true });
    
    // Setup mutation observer for critical class changes only
    this.setupMutationObserver();
    
    // Initial setup based on current screen size
    this.handleMenu();
    
    // Cache focusable elements once if header class is present
    if (this.hasHeaderClass()) {
      this.cacheFocusableElements();
      this.setupMenuFocusNavigation();
    }
  }
  
  // Cache all required DOM elements upfront
  cacheElements() {
    this.cachedElements.menuElement = document.querySelector(this.config.menuSelector);
    
    if (this.cachedElements.menuElement) {
      this.cachedElements.navElement = this.cachedElements.menuElement.querySelector('.dwc-nest-nav-items');
      this.cachedElements.dropdowns = Array.from(document.querySelectorAll(this.config.dropdownSelector));
      this.cachedElements.dropdownToggles = Array.from(document.querySelectorAll(this.config.submenuToggleSelector));
      this.cachedElements.menuItems = Array.from(document.querySelectorAll(`${this.config.menuSelector} .menu-item`));
    }
  }
  
  // Set up a focused mutation observer only for dropdown state changes
  setupMutationObserver() {
    if (!this.cachedElements.dropdowns || this.cachedElements.dropdowns.length === 0) return;
    
    const callback = (mutations) => {
      for (let mutation of mutations) {
        if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
          const target = mutation.target;
          const prevClassList = mutation.oldValue ? mutation.oldValue.split(' ') : [];
          const hadBothBefore = prevClassList.includes('open') && prevClassList.includes('active');
          const hasBothNow = target.classList.contains('open') && target.classList.contains('active');
    
          if (hadBothBefore !== hasBothNow) {
            this.updateDropdownAccessibility();
            break; // Only need to update once per batch
          }
        }
      }
    };
    
    // Create observer with optimized options
    this.classObserver = new MutationObserver(callback);
    
    // Observe only the dropdown elements
    this.cachedElements.dropdowns.forEach(dropdown => {
      this.classObserver.observe(dropdown, { 
        attributes: true, 
        attributeFilter: ['class'], 
        attributeOldValue: true 
      });
    });
  }
  
  // Cache focusable elements for keyboard navigation
  cacheFocusableElements() {
    if (!this.cachedElements.navElement) return;
    
    // Get direct children of nav
    const directChildren = Array.from(this.cachedElements.navElement.children);
    
    // Find the first focusable element within each direct child
    this.cachedFocusableElements = directChildren.map(child => {
      // Check if the child itself is focusable
      if (child.matches('a, button, input, select, textarea, [tabindex]:not([tabindex="-1"])')) {
        return child;
      }
      // Otherwise, find the first focusable element within this child
      return child.querySelector('a, button, input, select, textarea, [tabindex]:not([tabindex="-1"])');
    }).filter(Boolean); // Remove null/undefined values
  }
  
  // Clean up all event listeners and observers
  destroy() {
    // Clean up the mutation observer
    if (this.classObserver) {
      this.classObserver.disconnect();
      this.classObserver = null;
    }
    
    // Clean up resize listener
    window.removeEventListener('resize', this.handleResize);
    
    // Clean up click handlers
    if (this.dropdownClickHandlers.size > 0) {
      this.dropdownClickHandlers.forEach((handler, toggle) => {
        toggle.removeEventListener('click', handler);
      });
      this.dropdownClickHandlers.clear();
    }
    
    // Clean up hover handlers
    this.cleanupMenuHover();
    
    // Clean up menu item click handlers
    this.cleanupMenuItemClicks();
    
    // Clean up outside click handler
    document.removeEventListener('click', this.handleOutsideClick);
    
    // Clean up keyboard navigation
    if (this.keyboardNavHandler) {
      document.removeEventListener('keydown', this.keyboardNavHandler);
      this.keyboardNavHandler = null;
    }
    
    // Clear any pending timeouts
    if (this.menuItemClickTimeout) {
      clearTimeout(this.menuItemClickTimeout);
      this.menuItemClickTimeout = null;
    }
  }
  
  // Utility methods
  hasHeaderClass() {
    return document.body.classList.contains(this.config.leftHeaderClass) || 
           document.body.classList.contains(this.config.rightHeaderClass);
  }
  
  debounce(func, delay) {
    let timer;
    return (...args) => {
      clearTimeout(timer);
      timer = setTimeout(() => func(...args), delay);
    };
  }

  // Check if an element has all the required active classes
  hasAllActiveClasses(element) {
    return this.config.activeClasses.every(className => element.classList.contains(className));
  }
  
  // Toggle all active classes on an element
  toggleActiveClasses(element) {
    this.config.activeClasses.forEach(className => {
      element.classList.toggle(className);
    });
  }
  
  // Core functionality methods
  handleMenu() {
    if (!this.cachedElements.menuElement) return;
    if (!this.hasHeaderClass() && !this.previousHeaderClass) return;

    const screenWidth = window.innerWidth;
    const isLargeScreen = screenWidth >= this.config.minWidth;
    const menuElement = this.cachedElements.menuElement;

    if (!isLargeScreen) {
      // Save which class was present before removal
      if (this.hasHeaderClass()) {
        this.previousHeaderClass = document.body.classList.contains(this.config.leftHeaderClass) 
          ? this.config.leftHeaderClass 
          : this.config.rightHeaderClass;
        
        // Remove header classes
        document.body.classList.remove(this.config.leftHeaderClass, this.config.rightHeaderClass);
        menuElement.classList.remove(this.config.openClass);
        
        // Reset accessibility attributes
        this.resetAccessibilityAttributes();
      }
      
      // Clean up event handlers for mobile view
      this.cleanupMenuHover();
      this.cleanupMenuItemClicks();
      this.cleanupDropdownHandlers();
      document.removeEventListener('click', this.handleOutsideClick);
      
      return;
    }

    // Large screen behavior
    if (!this.hasHeaderClass() && this.previousHeaderClass) {
      document.body.classList.add(this.previousHeaderClass);
    }

    if (this.hasHeaderClass()) {
      if (!menuElement.classList.contains(this.config.openClass)) {
        menuElement.classList.add(this.config.openClass);
      }
      
      // Setup elements for large screen view
      this.setupMenuHover();
      this.setupMenuItemClicks();
      this.setupDropdownHandlers();
      this.setupMenuFocusNavigation();
      this.updateDropdownAccessibility();
      
      // Ensure outside click handler is set up
      document.removeEventListener('click', this.handleOutsideClick);
      document.addEventListener('click', this.handleOutsideClick, { passive: false });
    }
  }
  
  // Reset accessibility attributes when switching to mobile
  resetAccessibilityAttributes() {
    if (!this.cachedElements.dropdowns) return;
    
    // Remove all inert attributes from dropdown contents
    this.cachedElements.dropdowns.forEach(dropdown => {
      const content = dropdown.querySelector(this.config.dropdownContentSelector);
      if (content) {
        content.removeAttribute('inert');
      }
      
      const button = dropdown.querySelector('button');
      if (button) {
        button.setAttribute('aria-expanded', 'false');
      }
    });
  }
  
  setupMenuFocusNavigation() {
    // Only run if hasHeaderClass() is true and we have focusable elements
    if (!this.hasHeaderClass() || !this.cachedFocusableElements || this.cachedFocusableElements.length === 0) {
      return;
    }
    
    // Clean up previous handler if it exists
    if (this.keyboardNavHandler) {
      document.removeEventListener('keydown', this.keyboardNavHandler, true);
      this.keyboardNavHandler = null;
    }
    
    const navMenu = this.cachedElements.menuElement;
    const focusableElements = this.cachedFocusableElements;
    const firstFocusableElement = focusableElements[0];
    const lastFocusableElement = focusableElements[focusableElements.length - 1];
    
    // Find adjacent focusable elements outside the menu (only once during setup)
    const headerElement = navMenu.closest('header') || document.querySelector('header');
    
    // Prepare variables to hold adjacent elements
    let prevFocusableElement = null;
    let nextFocusableElement = null;
    let firstElementAfterHeader = null;
    
    if (headerElement) {
      // Get all focusable elements within the header - do this once and cache the result
      const headerFocusables = Array.from(
        headerElement.querySelectorAll('a:not([tabindex="-1"]), button:not([tabindex="-1"]), input:not([tabindex="-1"]), select:not([tabindex="-1"]), textarea:not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])')
      ).filter(el => window.getComputedStyle(el).display !== 'none');
      
      // Find the index of our first and last menu elements in one pass
      const menuStartIndex = headerFocusables.indexOf(firstFocusableElement);
      const menuEndIndex = headerFocusables.indexOf(lastFocusableElement);
      
      // Cache the adjacent elements
      if (menuStartIndex > 0) {
        prevFocusableElement = headerFocusables[menuStartIndex - 1];
      }
      
      if (menuEndIndex !== -1 && menuEndIndex < headerFocusables.length - 1) {
        nextFocusableElement = headerFocusables[menuEndIndex + 1];
      }
      
      // Pre-calculate the first element after header - but only if needed
      if (!nextFocusableElement) {
        // Use a more efficient selector that targets immediate children of body that aren't the header
        const selector = 'body > *:not(header)';
        const nonHeaderElements = document.querySelectorAll(selector);
        
        // Only process if we have elements
        if (nonHeaderElements.length > 0) {
          // Create a function to find the first focusable element (used later if needed)
          this.findFirstFocusableAfterHeader = () => {
            for (const element of nonHeaderElements) {
              const focusable = element.querySelector('a:not([tabindex="-1"]), button:not([tabindex="-1"]), input:not([tabindex="-1"]), select:not([tabindex="-1"]), textarea:not([tabindex="-1"]), [tabindex]:not([tabindex="-1"])');
              if (focusable && window.getComputedStyle(focusable).display !== 'none') {
                return focusable;
              }
            }
            return null;
          };
        }
      }
    }
    
    // Create keyboard navigation handler with closure over the cached elements
    this.keyboardNavHandler = (e) => {
      // Quick check for Tab key first
      if (e.key !== 'Tab') return;
      
      // Then check if focus is inside the menu
      if (!navMenu.contains(document.activeElement)) return;
      
      let targetElement = null;
      
      // Handle tab navigation at boundaries only
      if (!e.shiftKey && document.activeElement === lastFocusableElement) {
        // Forward tab from last element
        e.preventDefault();
        e.stopPropagation();
        
        if (nextFocusableElement) {
          targetElement = nextFocusableElement;
        } else if (this.findFirstFocusableAfterHeader) {
          // Only search for elements after header if needed and not already found
          firstElementAfterHeader = this.findFirstFocusableAfterHeader();
          targetElement = firstElementAfterHeader;
        }
        
        // Focus on the target or body as fallback
        setTimeout(() => {
          if (targetElement) {
            targetElement.focus();
          } else {
            document.body.setAttribute('tabindex', '-1');
            document.body.focus();
            document.body.removeAttribute('tabindex');
          }
        }, 10);
      } 
      else if (e.shiftKey && document.activeElement === firstFocusableElement) {
        // Backward tab from first element
        e.preventDefault();
        e.stopPropagation();
        
        setTimeout(() => {
          if (prevFocusableElement) {
            prevFocusableElement.focus();
          } else {
            document.body.setAttribute('tabindex', '-1');
            document.body.focus();
            document.body.removeAttribute('tabindex');
          }
        }, 10);
      }
    };
    
    // Use capture phase for the event
    document.addEventListener('keydown', this.keyboardNavHandler, true);
  }
  
  setupMenuHover() {
    const menuElement = this.cachedElements.menuElement;
    if (!menuElement) return;
    
    // Clean up existing hover handlers first
    this.cleanupMenuHover();
    
    // Create event handlers
    const mouseenterHandler = () => {
      menuElement.classList.add(this.config.openClass);
    };
    
    const mouseleaveHandler = () => {
      menuElement.classList.remove(this.config.openClass);
    };
    
    // Add event listeners with passive flag for better performance
    menuElement.addEventListener('mouseenter', mouseenterHandler, { passive: true });
    menuElement.addEventListener('mouseleave', mouseleaveHandler, { passive: true });
    
    // Store the handlers for cleanup
    this.menuHoverHandlers = {
      element: menuElement,
      mouseenter: mouseenterHandler,
      mouseleave: mouseleaveHandler
    };
  }
  
  cleanupMenuHover() {
    if (this.menuHoverHandlers) {
      const { element, mouseenter, mouseleave } = this.menuHoverHandlers;
      element.removeEventListener('mouseenter', mouseenter);
      element.removeEventListener('mouseleave', mouseleave);
      this.menuHoverHandlers = null;
    }
  }
  
  setupMenuItemClicks() {
    if (!this.cachedElements.menuItems || this.cachedElements.menuItems.length === 0) return;
    
    // Clean up existing handlers first
    this.cleanupMenuItemClicks();
    
    const menuElement = this.cachedElements.menuElement;
    const menuItemHandlers = new Map();
    
    this.cachedElements.menuItems.forEach(item => {
      const clickHandler = () => {
        if (this.hasHeaderClass()) {
          // Clear any existing timeout
          if (this.menuItemClickTimeout) {
            clearTimeout(this.menuItemClickTimeout);
          }
          
          // Set timeout before adding the class
          this.menuItemClickTimeout = setTimeout(() => {
            if (!menuElement.classList.contains(this.config.openClass)) {
              menuElement.classList.add(this.config.openClass);
            }
          }, this.config.menuItemClickDelay);
        }
      };
      
      menuItemHandlers.set(item, clickHandler);
      item.addEventListener('click', clickHandler);
    });
    
    this.menuItemClickHandlers = menuItemHandlers;
  }
  
  cleanupMenuItemClicks() {
    if (this.menuItemClickHandlers && this.menuItemClickHandlers instanceof Map) {
      this.menuItemClickHandlers.forEach((handler, item) => {
        item.removeEventListener('click', handler);
      });
      this.menuItemClickHandlers.clear();
    }
    
    if (this.menuItemClickTimeout) {
      clearTimeout(this.menuItemClickTimeout);
      this.menuItemClickTimeout = null;
    }
  }
  
  setupDropdownHandlers() {
    if (!this.hasHeaderClass() || !this.cachedElements.dropdownToggles) return;
    
    // Clean up existing handlers first
    this.cleanupDropdownHandlers();
    
    this.cachedElements.dropdownToggles.forEach(toggle => {
      const clickHandler = (event) => {
        event.stopPropagation();
        event.preventDefault();
        
        const dropdown = toggle.closest(this.config.dropdownSelector);
        if (dropdown) {
          this.toggleActiveClasses(dropdown);
          this.updateDropdownAccessibility();
        }
      };
      
      this.dropdownClickHandlers.set(toggle, clickHandler);
      toggle.addEventListener('click', clickHandler);
    });
  }
  
  cleanupDropdownHandlers() {
    if (this.dropdownClickHandlers.size > 0) {
      this.dropdownClickHandlers.forEach((handler, toggle) => {
        toggle.removeEventListener('click', handler);
      });
      this.dropdownClickHandlers.clear();
    }
  }
  
  handleOutsideClick(event) {
    if (event.target.tagName === 'A') return;
    if (!event.target.closest(this.config.dropdownSelector)) return;
    if (!event.target.closest(this.config.submenuToggleSelector)) {
      event.preventDefault();
      event.stopPropagation();
    }
  }
  
  updateDropdownAccessibility() {
    // Only run if hasHeaderClass() is true
    if (!this.hasHeaderClass() || !this.cachedElements.dropdowns) return;
    
    this.cachedElements.dropdowns.forEach(dropdown => {
      const content = dropdown.querySelector(this.config.dropdownContentSelector);
      const button = dropdown.querySelector('button');
      
      // Check if dropdown has all active classes
      const isOpen = this.hasAllActiveClasses(dropdown);
      
      if (content) {
        if (isOpen) {
          content.removeAttribute('inert');
        } else {
          content.setAttribute('inert', '');
        }
      }
      
      if (button) {
        button.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
      }
    });
  }
}


const sidebarNav = new SidebarNavigation().init();

REWORK THE HOME YOU HAVE

Comprehensive Home Renovations for Metro Vancouver Homes in 2026

Comprehensive home remodels that modernize interiors, improve efficiency, and enhance overall comfort and property value. A home renovation can improve room layout, access, building systems and everyday comfort without assuming the entire house must be rebuilt. VALROC reviews the existing home and defines the work room by room in a written plan.

The included rooms, structural changes, selections and living arrangements are confirmed in writing.

Complete home renovation in progress with exposed framing, scaffolding, and excavation
LIVING SPACE

Make the layout work harder

Review circulation, room use and future needs against the existing structure.

EXISTING HOME

Work from actual conditions

Identify structural and service constraints before committing to changes.

PROJECT CONTROL

Set clear renovation boundaries

Record allowances, selections and construction phases in the agreement.

FROM EXISTING HOME TO NEW USE

How a home renovation takes shape

Groundwork, permitting, bylaw compliance, and all construction phases handled in-house by our experienced team. The linked home renovation stages move from an onsite visit and scope definition through design, approved demolition, structural preparation and finishing. The extent of each stage depends on the existing home and the contract.

  1. Owner Dominic discussing retaining wall construction plans with homeowner

    Step 1

    Home Remodel Consultation

    We begin every whole home renovation by walking the space with you, discussing expectations, and developing a working budget that covers architectural, engineering, and Geotech needs.

    • Home site visit
    • Existing conditions
    • Renovation goals
  2. Owner and apprentice reviewing construction site plans

    Step 2

    Renovation Planning

    Once your building budget is confirmed, we define the renovation scope in detail, clarifying which rooms, systems, and structural changes are involved before design and permits move forward.

    • Renovation scope
    • Rooms and systems
    • Structural work
  3. Rolled construction drawings and demolition permit documents for a custom home project in Langley, British Columbia.

    Step 3

    Permit Coordination

    After the renovation scope is defined, we coordinate with your designer or ours to refine layout, finishes, and technical drawings, ensuring permit approvals are in place before construction begins.

    • Design coordination
    • Renovation permits
    • Approved plans
  4. Residential floor joist demolition during renovation

    Step 4

    Project Mobilization

    We mobilize quickly with fully equipped service trucks and demolition teams, ready to gut interiors, remove materials, and clear space for both interior and exterior rebuilds.

    • Interior demolition
    • Work area protection
    • Crew mobilization
  5. Framing and electrical work during fireplace remodel

    Step 5

    Structural Site Preparation

    Once demo is complete, we prepare the site for structural, mechanical, and layout changes, ensuring your home is ready for everything from framing to ground rework.

    • Structural preparation
    • Home rebuild
    • Site conditions
  6. Completed fireplace remodel with matte black feature wall and custom wood cabinetry

    Step 6

    Renovation Finishing

    The finishing stage brings your renovation to life, combining your design vision, our construction experience, and the flexibility to handle full-scale customization both inside and out.

    • Interior finishes
    • Exterior completion
    • Renovation handoff

Renovation Services Overview, Transforming Properties

This video documents several stages of residential renovation work completed by the VALROC Development Ltd. team, from interior demolition and structural modifications to new construction, equipment operation, and finished interior installations.

can you 

PLAN AROUND THE EXISTING HOME

Renovate for the way the home is used

Full-service home renovations that modernize living spaces while improving comfort, functionality, and long-term value. Experienced, hands-on construction management covering everything from structural changes and permits to final finishes.

VALROC Development Ltd. offers complete renovation services that transform homes into functional, modern, and deeply personal living spaces. Our expertise encompasses a wide range of renovation options tailored to meet diverse needs and preferences. Whether you’re upgrading for comfort, accessibility, or aesthetics, we guide your project from the initial concept to the final finishing touches.

Our team approaches each project with care, experience, and a deep respect for your space, ensuring your visions are brought to life. We also provide insights into the latest design trends and materials that can enhance your home’s value and livability.

LAYOUT

Review how rooms connect

Consider circulation, storage and household routines.

STRUCTURE

Investigate before changing

Confirm walls, openings and loads before demolition.

SYSTEMS

Coordinate work behind finishes

Identify electrical, plumbing and mechanical changes in the plan.

OCCUPANCY

Plan around daily life

Agree on access, protection and phasing when the home remains occupied.

SELECT WITH CONTEXT

Home renovation choices that need a decision

Home renovations can range from focused room upgrades to complete interior transformations. VALROC helps homeowners coordinate layout, structure, building systems, finishes, accessibility and exterior connections around the existing home.

Home renovation work we can coordinate

Included in our service:

  • • Whole home and multi room renovations

  • • Interior demolition and structural preparation

  • • Kitchen, bathroom and living space upgrades

  • • Layout changes and accessibility improvements

  • • Permit and engineered plan coordination

  • • Established supplier and trade scheduling

  • • Material ordering and delivery management

  • • Construction phase walkthroughs

  • • Municipal inspection coordination

  • • Detailed contract, warranty and final handoff

Room layouts, materials, energy upgrades, accessibility features and exterior connections can be considered during a home renovation. Suitability, cost and inclusion depend on the home’s condition, approved design and signed scope.

Keep decisions tied to the project

PLAN THE INTERFACES

Coordinate the renovation with surrounding work

Exterior updates available, including siding, decks, fencing, retaining walls, or drainage improvements. Outdoor integration options like patios, covered decks, or custom entertainment zones. Additional Services While On-Site We can add drainage grading, outdoor upgrades, or site-specific improvements as needed. Custom matching for exterior finishes and integration with existing landscaping or structures. A renovation may meet a home addition, new entrance, exterior stairs, patio, drainage system or driveway. Interfaces should be coordinated at the property level, but each separate Service needs its own defined scope.

Additions, landscaping, exterior concrete, drainage replacement and professional design services are not automatic home renovation inclusions.

  • Perimeter foundation drainage installed around footings

    Foundation waterproofing during whole home renovations

    • Renovation waterproofing
    • Basement moisture
    • Foundation protection

    Renovating a basement or lower level is an opportunity to solve exterior moisture problems before new finishes are installed. Drainage and waterproofing can help protect the comfort and value created inside.

    Explore foundation drainage and waterproofing
  • A freshly stripped concrete retaining wall at a luxury residential build in Brookswood, Langley, BC, showing the VALROC excavator and crew preparing the drainage trench behind the wall.

    Retaining walls that improve renovated properties

    • Renovation retaining wall
    • Usable yard space
    • Grade improvement

    Cutting back a slope and adding an engineered retaining wall can move wet soil away from the home, create access and open usable exterior space. This can be especially valuable during major property renovations.

    Explore engineered concrete retaining walls
  • Man working on staircase construction in Vancouver, BC, residential project, building new wooden steps.

    Concrete steps for renovated entrances

    • Renovated entrance steps
    • Home access
    • Concrete landing

    A renovation may change door locations, finished floors or the route from the driveway to the home. New concrete steps can improve entrance proportions, safety and connection to surrounding walkways.

    Explore concrete steps and staircases
  • Sidewalk leading up to the front door through engineered concrete walls. The sidewalk still have the wooden forms as they are freshly poured with concrete.

    Concrete sidewalks for improved home access

    • Renovation sidewalk
    • Accessible route
    • Entrance walkway

    Replacing an uneven or poorly routed sidewalk can make a renovated property easier to navigate. Walkway width, grades and connections can be coordinated with entrances, parking and outdoor living areas.

    Explore concrete sidewalk installation
  • Reinforcing steel for concrete patio installation in Vancouver.

    Concrete patios within whole home renovations

    • Renovation patio
    • Outdoor living
    • Backyard access

    A new patio can extend a renovation into the backyard and provide space for dining, gathering and everyday outdoor use. Door thresholds, drainage and yard circulation should be planned with the home improvements.

    Explore concrete patio installation
  • Wood footings a top of hard packed subbase and just starting to build foundational walls

    Foundation and footing changes for major renovations

    • Renovation foundation
    • Addition footings
    • Structural support

    Additions, structural alterations and new exterior features may require new foundations or footings. Coordinating the concrete work with the renovation design helps support the new loads and layout.

    Explore foundations and footings

DOCUMENTED EXPERIENCE

Home renovation experience across Metro Vancouver

VALROC renovates homes across Metro Vancouver with experience in demolition, structural preparation, additions, concrete, drainage and exterior improvements. This broader construction knowledge helps us connect each renovation decision to the condition of the existing property. From established homes in Brookswood, Walnut Grove and White Rock to properties in South Surrey, Burnaby and New Westminster, our team is familiar with municipal reviews, inspections and coordination with local engineers and architects.

DEFINE THE RENOVATION SCOPE

Discuss a home renovation proposal

Share the property, intended changes and available plans with VALROC. An onsite review can establish what work is required before a home renovation proposal is prepared.

  • Share the project

    Explain the existing space, intended use and known constraints.

  • Review the property

    Walk through the home to review existing conditions, rooms, systems, access, desired changes and available drawings before recommending a renovation scope.

  • Confirm the proposal

    Compare included work, selections, allowances and boundaries in writing.

  • What affects a home renovation estimate?

    Home size, condition, rooms affected, structural work, permit requirements, systems, protection, materials and living arrangements shape the estimate. A property review is needed before providing a specific price.

    What affects a home renovation estimate?

    Home size, condition, rooms affected, structural work, permit requirements, systems, protection, materials and living arrangements shape the estimate. A property review is needed before providing a specific price.

    Request Your Free On-site Estimate

    REVIEW THE EXISTING CONDITIONS

    Assess the home before defining the renovation

    Walk through the home to review existing conditions, rooms, systems, access, desired changes and available drawings before recommending a renovation scope.

  • 01

    Define the intended use

    Explain how the renewed space needs to function.

  • 02

    Review existing conditions

    Walk through the home to review existing conditions, rooms, systems, access, desired changes and available drawings before recommending a renovation scope.

  • 03

    Identify approvals

    Check drawings, permits and inspection responsibilities for the proposed changes.

  • 04

    Write the boundaries

    Record included areas, trades, selections and separately scoped work.

  • What needs confirmation

    Concealed conditions may only become clear after permitted investigation or demolition. Structural changes, hazardous materials and building system upgrades can require separate specialists, approvals or changes to the proposal.

    What needs confirmation

    Concealed conditions may only become clear after permitted investigation or demolition. Structural changes, hazardous materials and building system upgrades can require separate specialists, approvals or changes to the proposal.

    ANSWERS REQUIRE PROJECT CONTEXT

    Questions about whole home renovations

    The linked questions address renovation scope, phasing, structural changes, energy upgrades and budgeting. Answers must be checked against the particular home and written scope.

    How do you work around a client’s lifestyle during a renovation?

    Renovations impact daily routines, so we plan projects to reduce disruption and maintain livability wherever possible.

    • Scheduling work around client routines and high-use areas.
    • Phasing construction to preserve access to essential spaces.
    • Isolating work zones to control dust and noise.
    • Maintaining clean, organized job sites throughout the project.
    • Clear communication so clients know what to expect at each stage.

    Careful planning and organization help ensure the renovation process remains manageable and predictable.

    How do you work around a client’s lifestyle during a renovation?

    Renovations impact daily routines, so we plan projects to reduce disruption and maintain livability wherever possible.

    • Scheduling work around client routines and high-use areas.
    • Phasing construction to preserve access to essential spaces.
    • Isolating work zones to control dust and noise.
    • Maintaining clean, organized job sites throughout the project.
    • Clear communication so clients know what to expect at each stage.

    Careful planning and organization help ensure the renovation process remains manageable and predictable.

    Can Valroc work with existing engineered plans for my project?

    Yes, VALROC can build directly from existing engineered or pre-approved plans.

    • Reviewing plans with engineers and consultants.
    • Confirming alignment with local codes and site conditions.
    • Coordinating with architects or designers already involved.
    • Adjusting sequencing or construction methods where needed.

    This approach often helps reduce redesign time and keeps projects moving efficiently.

    Can Valroc work with existing engineered plans for my project?

    Yes, VALROC can build directly from existing engineered or pre-approved plans.

    • Reviewing plans with engineers and consultants.
    • Confirming alignment with local codes and site conditions.
    • Coordinating with architects or designers already involved.
    • Adjusting sequencing or construction methods where needed.

    This approach often helps reduce redesign time and keeps projects moving efficiently.

    What is included in a whole-home renovation?

    A whole-home renovation is a comprehensive upgrade that addresses structure, function, and finishes throughout the house.

    • Structural modifications such as wall removal or reinforcement.
    • Kitchen and bathroom renovations with updated layouts and fixtures.
    • New flooring, ceilings, and interior finishes.
    • Energy-efficient upgrades including windows, insulation, and systems.
    • Exterior improvements such as siding, roofing, decks, or landscaping.
    • Custom features like built-ins, staircases, or architectural details.

    VALROC manages the entire process from planning to completion to ensure a cohesive result.

    What is included in a whole-home renovation?

    A whole-home renovation is a comprehensive upgrade that addresses structure, function, and finishes throughout the house.

    • Structural modifications such as wall removal or reinforcement.
    • Kitchen and bathroom renovations with updated layouts and fixtures.
    • New flooring, ceilings, and interior finishes.
    • Energy-efficient upgrades including windows, insulation, and systems.
    • Exterior improvements such as siding, roofing, decks, or landscaping.
    • Custom features like built-ins, staircases, or architectural details.

    VALROC manages the entire process from planning to completion to ensure a cohesive result.

    How do I know if my home needs a whole-home renovation?

    A whole-home renovation may be the right solution when multiple areas of your home no longer function efficiently or safely.

    • The layout feels outdated and no longer suits modern living.
    • Major systems such as foundations, electrical, or plumbing require upgrades.
    • Energy efficiency is poor due to outdated insulation, windows, or mechanical systems.
    • You are preparing to sell and want to increase property value and appeal.
    • Your home lacks storage, functional kitchens, or properly sized living areas.

    VALROC evaluates your home’s condition and goals to determine whether a full renovation is the most effective path forward.

    How do I know if my home needs a whole-home renovation?

    A whole-home renovation may be the right solution when multiple areas of your home no longer function efficiently or safely.

    • The layout feels outdated and no longer suits modern living.
    • Major systems such as foundations, electrical, or plumbing require upgrades.
    • Energy efficiency is poor due to outdated insulation, windows, or mechanical systems.
    • You are preparing to sell and want to increase property value and appeal.
    • Your home lacks storage, functional kitchens, or properly sized living areas.

    VALROC evaluates your home’s condition and goals to determine whether a full renovation is the most effective path forward.

    What are the benefits of a whole-home renovation versus moving?

    Renovating your existing home can offer several advantages compared to purchasing a new property.

    • Lower overall cost compared to buying and relocating.
    • Customization tailored specifically to your needs and preferences.
    • Avoiding the stress and disruption of moving.
    • Remaining in your established neighbourhood and community.
    • Increased resale value through targeted improvements.

    A renovation allows homeowners to improve their living space without starting over.

    What are the benefits of a whole-home renovation versus moving?

    Renovating your existing home can offer several advantages compared to purchasing a new property.

    • Lower overall cost compared to buying and relocating.
    • Customization tailored specifically to your needs and preferences.
    • Avoiding the stress and disruption of moving.
    • Remaining in your established neighbourhood and community.
    • Increased resale value through targeted improvements.

    A renovation allows homeowners to improve their living space without starting over.

    Can a whole-home renovation be done in phases?

    Yes, whole-home renovations can be divided into logical phases to manage cost and disruption.

    • Structural and foundation upgrades.
    • Interior layout and wall modifications.
    • Kitchen, bathroom, and flooring renovations.
    • Electrical, plumbing, and mechanical upgrades.
    • Exterior and curb appeal improvements.

    Phased renovations allow flexibility while maintaining long-term planning consistency.

    Can a whole-home renovation be done in phases?

    Yes, whole-home renovations can be divided into logical phases to manage cost and disruption.

    • Structural and foundation upgrades.
    • Interior layout and wall modifications.
    • Kitchen, bathroom, and flooring renovations.
    • Electrical, plumbing, and mechanical upgrades.
    • Exterior and curb appeal improvements.

    Phased renovations allow flexibility while maintaining long-term planning consistency.

    What structural changes can be made in a whole-home renovation?

    Structural modifications allow homes to function better and adapt to modern lifestyles.

    • Removal or modification of load-bearing walls.
    • Home additions or extensions to increase square footage.
    • Vaulted, coffered, or raised ceiling designs.
    • Basement finishing or conversions.
    • Garage conversions into living or work spaces.

    All structural changes are engineered and permitted to ensure safety and compliance.

    What structural changes can be made in a whole-home renovation?

    Structural modifications allow homes to function better and adapt to modern lifestyles.

    • Removal or modification of load-bearing walls.
    • Home additions or extensions to increase square footage.
    • Vaulted, coffered, or raised ceiling designs.
    • Basement finishing or conversions.
    • Garage conversions into living or work spaces.

    All structural changes are engineered and permitted to ensure safety and compliance.

    What are the best energy-efficient upgrades to include in a home renovation?

    Energy-efficient upgrades improve comfort while reducing long-term operating costs.

    • High-efficiency windows and doors to minimize heat loss.
    • Improved insulation in walls, attics, and foundations.
    • Smart thermostats and LED lighting systems.
    • Solar-ready or solar-integrated electrical systems.
    • Low-flow plumbing fixtures that reduce water consumption.

    These upgrades are selected based on climate, budget, and long-term performance.

    What are the best energy-efficient upgrades to include in a home renovation?

    Energy-efficient upgrades improve comfort while reducing long-term operating costs.

    • High-efficiency windows and doors to minimize heat loss.
    • Improved insulation in walls, attics, and foundations.
    • Smart thermostats and LED lighting systems.
    • Solar-ready or solar-integrated electrical systems.
    • Low-flow plumbing fixtures that reduce water consumption.

    These upgrades are selected based on climate, budget, and long-term performance.

    Can VALROC modernize outdated homes while maintaining character?

    Yes! We specialize in blending modern updates with heritage elements, including:

    • Preserving original hardwood floors, trim, and beams while upgrading key features.

    • Matching new finishes with period-style architecture.

    • Retrofitting modern appliances into classic kitchen layouts.

    • Enhancing natural light while keeping traditional design elements.

    We ensure renovations respect the home’s history while improving functionality.

    Can VALROC modernize outdated homes while maintaining character?

    Yes! We specialize in blending modern updates with heritage elements, including:

    • Preserving original hardwood floors, trim, and beams while upgrading key features.

    • Matching new finishes with period-style architecture.

    • Retrofitting modern appliances into classic kitchen layouts.

    • Enhancing natural light while keeping traditional design elements.

    We ensure renovations respect the home’s history while improving functionality.

    How do I stay within budget during a whole-home renovation?

    Budget control starts with planning, prioritization, and clear decision-making.

    • Focusing on high-impact spaces like kitchens and bathrooms.
    • Selecting durable materials that reduce long-term maintenance.
    • Choosing strategic upgrades instead of full replacements when possible.
    • Phasing renovations to spread costs over time.
    • Working with an experienced contractor to avoid rework and delays.

    Transparent cost breakdowns help clients make informed choices at every stage.

    How do I stay within budget during a whole-home renovation?

    Budget control starts with planning, prioritization, and clear decision-making.

    • Focusing on high-impact spaces like kitchens and bathrooms.
    • Selecting durable materials that reduce long-term maintenance.
    • Choosing strategic upgrades instead of full replacements when possible.
    • Phasing renovations to spread costs over time.
    • Working with an experienced contractor to avoid rework and delays.

    Transparent cost breakdowns help clients make informed choices at every stage.

    METRO VANCOUVER RENOVATIONS

    Home renovation projects across Metro Vancouver

    VALROC manages home renovations from its Langley construction yard, supporting projects in Willoughby, Brookswood, Walnut Grove and neighbouring communities. Renovation work may connect demolition, structural preparation, drainage, concrete, material deliveries and interior construction around the condition of the existing home.

    Homes in Surrey, White Rock, Burnaby and Delta present different layouts, access constraints and municipal review requirements. VALROC coordinates the approved plans, established trades, inspections and construction walkthroughs while keeping the homeowner informed through each stage.