, 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); })(); Outdoor Athletics Construction at app | app

app

Skip to main content

Outdoor Athletics

A team pours the concrete foundation for app's new soccer and football buildings.

Outdoor athletics expansion at Gainey Athletic Complex

Outdoor Athletics construction projects are currently in phase 2.

Phase 1

During the fall of 2023, the following Phase 1 outdoor athletics construction projects were completed:

  • New Zudiema Soccer Field (map and directions).
  • New track and adjacent spaces for various field throwing events at Gainey Athletic Fields.
  • Cross country course redesign and a new practice soccer and lacrosse field.

The Zuidema Soccer Field as seen from above on August 31, 2023.
Pedestrian pathways are highlighted by gold dashed lines.

Phase 2 ← We are here

Construction began on a soccer stadium including locker rooms for men’s and women’s soccer, along with a building to house app’s new football program; the football building will include a permanent football locker room, outdoor athletic training facilities, laundry, equipment storage, as well as mechanical space. The heating and cooling of the soccer stadium and football buildings will be to be provided by a new geothermal energy system, advancing app’s commitment to creation care and sustainability. Its underground vertical loop site will be adjacent to the soccer stadium.


Approximate location of app’s football field and building.

Phase 3

A new football and lacrosse stadium with a turf field will be built adjacent to the football building and soccer stadium. Until this phase is complete, men’s and women’s lacrosse will play on the new soccer field and the football team will play home games at Grand Rapids Christian High School’s stadium at , three miles west of campus.