, 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); })(); Silent Observer Campus Safety | app

app

Skip to main content

Silent Observer

“Silent Observer is a non-profit organization supported by contributions from concerned individuals, local business and community organizations.” ()
It is a non-app community based crime awareness organization.

Anonymously report a campus crime through Silent Observer

  • Phone: (616) 774-2345
    • Call Silent Observer with your information about a crime. The operator will not ask for your name.
    • Give the operator as much information as you can.
    • The operator will give you your confidential ID number.
  • Text Message: TXT CRIMES (274637) include Keyword Tip138 in MSG
    • The keyword TIP138 must appear on the first line of your text message in order to reach Silent Observer.
    • You will then receive an automatic text message reply that will contain your confidential ID number.
    • Silent Observer will be able to send text messages back to you without knowing your cell phone number to ask questions or gather more information.
  • By Web:
    • Give as much information as you can.
    • After submission you will receive your confidential ID number.
    • Silent Observer will be able to write you back without knowing your email address.

What happens after I contact Silent Observer?

After two days call (616)454-9110, between 8 a.m and 5 p.m., to see if your tip earned a reward. You will be asked the ID number of the tip, which is necessary to claim the reward.

If your tip leads to a confirmation of a student in violation of the law or to the solution of a crime, you will receive a $50 reward. If a weapon is recovered, the reward is $100.