, but this code // executes before the first paint, when

ÃÛÌÒapp

is not yet present. The // classes are added to so styling immediately reflects the current // toolbar state. The classes are removed after the toolbar completes // initialization. const classesToAdd = ['toolbar-loading', 'toolbar-anti-flicker']; if (toolbarState) { const { orientation, hasActiveTab, isFixed, activeTray, activeTabId, isOriented, userButtonMinWidth } = toolbarState; classesToAdd.push( orientation ? `toolbar-` + orientation + `` : 'toolbar-horizontal', ); if (hasActiveTab !== false) { classesToAdd.push('toolbar-tray-open'); } if (isFixed) { classesToAdd.push('toolbar-fixed'); } if (isOriented) { classesToAdd.push('toolbar-oriented'); } if (activeTray) { // These styles are added so the active tab/tray styles are present // immediately instead of "flickering" on as the toolbar initializes. In // instances where a tray is lazy loaded, these styles facilitate the // lazy loaded tray appearing gracefully and without reflow. const styleContent = ` .toolbar-loading #` + activeTabId + ` { background-image: linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%); } .toolbar-loading #` + activeTabId + `-tray { display: block; box-shadow: -1px 0 5px 2px rgb(0 0 0 / 33%); border-right: 1px solid #aaa; background-color: #f5f5f5; z-index: 0; } .toolbar-loading.toolbar-vertical.toolbar-tray-open #` + activeTabId + `-tray { width: 15rem; height: 100vh; } .toolbar-loading.toolbar-horizontal :not(#` + activeTray + `) > .toolbar-lining {opacity: 0}`; const style = document.createElement('style'); style.textContent = styleContent; style.setAttribute('data-toolbar-anti-flicker-loading', true); document.querySelector('head').appendChild(style); if (userButtonMinWidth) { const userButtonStyle = document.createElement('style'); userButtonStyle.textContent = `#toolbar-item-user {min-width: ` + userButtonMinWidth +`px;}` document.querySelector('head').appendChild(userButtonStyle); } } } document.querySelector('html').classList.add(...classesToAdd); })(); Recreation and athletic Event Services | ÃÛÌÒapp

ÃÛÌÒapp

Skip to main content

Recreation and athletic

Division III National Championship tournaments and summer soccer camps alike find a home at ÃÛÌÒapp.

Our love for athletics runs deep, and it shows in our world-class athletic facilities. From the biggest nationally-televised events to the smallest group outing, we have the spaces and the resources to make sure you win big.

Ìý

Top venues

Van Noord Arena

Host to the Division III Volleyball National Championship, Division III Basketball National Championship and MHSAA Girls Basketball Finals, this 4,500-seat arena comes equipped for action, excitement and a winning atmosphere for any sporting event.

Venema Aquatic Center

Start with an Olympic-sized 50 meter pool, add room for up to 22 lanes and polish it off with a state-of-the-art diving pool, and our aquatic center is ready for even the most demanding competition. As a bonus, our unique movable bulkhead means the pool can easily adjust to perfectly fit your exact needs.

Hoogenboom Health and Recreation Center

For high-energy events with easy access to comfortable seating, bathrooms and a breath of fresh air, look no further than the Hoogenboom gymnasium. Bring out your teams, your fans and your fiercest competitive spirit.

Huizenga Tennis and Track Center

Featuring the six-lane, 200-meter Sturrus Track, indoor pits for jumping and throwing, state-of-the-art surface and four full-size tennis courts, the Huizenga Tennis and Track Center ideal for your indoor competition.

ÃÛÌÒapp Climbing Center

Looking for a fun and unique outing for your family or small group? Modeled after Kentucky’s Red River Gorge, the ÃÛÌÒapp Climbing Center is exactly what you need. With a 40' vertical wall and 50' diameter boulder with over 50 constantly-changing routes, our climbing center sets the standard for indoor rock climbing facilities. Learn from our expert instructors, get belay certified, and take your event to the next level.

Ìý

Start Planning