<nav id="osu-navbar" class="bux-osu-nav" aria-label="Ohio State links">
<div class="bux-osu-nav__overlay"></div>
<div class="bux-osu-nav__wrapper">
<div class="bux-container">
<div id="osu-navname-block">
<a class="bux-osu-nav__osu-logo-link" href="https://osu.edu" rel="noopener">
<img class="bux-osu-nav__osu-logo-img" src="/images/osu-logos/navbar/osu-navbar.svg" alt="The Ohio State University Homepage" />
</a>
</div>
<div id="osu-navlinks-block">
<button type="button" id="osu-nav-trigger" aria-controls="osu-navlinks" aria-expanded="false">
<span class="visually-hidden">Show Links</span>
</button>
<ul id="osu-navlinks" aria-labelledby="osu-nav-trigger" class="bux-osu-nav__links">
<li class="bux-osu-nav__link">
<a class="bux-link" href="https://maps.osu.edu" rel="noopener">
<span class="bux-link__text">Map</span>
</a>
</li>
<li class="bux-osu-nav__link">
<a class="bux-link" href="https://buckeyelink.osu.edu" rel="noopener">
<span class="bux-link__text">Buckeye Link</span>
</a>
</li>
<li class="bux-osu-nav__link">
<a class="bux-link" href="https://email.osu.edu" rel="noopener">
<span class="bux-link__text">Webmail</span>
</a>
</li>
<li class="bux-osu-nav__link">
<a class="bux-link" href="https://www.osu.edu/search" rel="noopener">
<span class="bux-link__text">Search Ohio State</span>
</a>
</li>
</ul>
</div>
</div>
</div>
</nav>
<nav id="osu-navbar" class="bux-osu-nav" aria-label="Ohio State links">
<div class="bux-osu-nav__overlay"></div>
<div class="bux-osu-nav__wrapper">
<div class="bux-container">
<div id="osu-navname-block">
{% embed '@link' with {
base_class: 'bux-osu-nav__osu-logo-link',
link_url: 'https://osu.edu'
} %}
{% block content %}
<img class="bux-osu-nav__osu-logo-img" src="{{ base_path ~ directory ~ bux }}/images/osu-logos/navbar/osu-navbar.svg" alt="The Ohio State University Homepage"/>
{% endblock %}
{% endembed %}
</div>
<div id="osu-navlinks-block">
<button type="button" id="osu-nav-trigger" aria-controls="osu-navlinks" aria-expanded="false">
<span class="visually-hidden">Show Links</span>
</button>
<ul id="osu-navlinks" aria-labelledby="osu-nav-trigger" class="bux-osu-nav__links">
{% set navlinks = {
'Map': 'https://maps.osu.edu',
'Buckeye Link': 'https://buckeyelink.osu.edu',
'Webmail': 'https://email.osu.edu',
'Search Ohio State': 'https://www.osu.edu/search'
} %}
{% set show_underline = false %}
{% for text, url in navlinks %}
<li class="bux-osu-nav__link">
{% include '@link' with {
link_url: url,
link_text: text,
} %}
</li>
{% endfor %}
</ul>
</div>
</div>
</div>
</nav>
site_name_prefix: Office of
site_name: Learning Relations Excellence
site_slogan: Additional text or site slogan
address_1: 100 Building Name
address_2: 1 Oval Mall
city: Columbus
state: OH
zip: '43210'
contact_email: email@osu.edu
contact_phone: 614-292-OHIO
contact_tty: 614-688-8605
// Set breakpoint value for displaying links without toggle.
$navbar-bp: lg;
.bux-osu-nav {
background-color: $white;
font-family: $sans;
padding: 10px 0;
position: relative;
border-bottom: 2px solid $gray-light-60;
.bux-container {
display: flex;
justify-content: space-between;
align-items: center;
}
@include breakpoint($navbar-bp) {
padding: $sp-12 0;
}
&__overlay {
display: none;
height: 100vh;
left: 0;
position: fixed;
top: 0;
width: 100vw;
z-index: 999;
}
&__wrapper {
position: relative;
z-index: 1000;
}
}
.bux-osu-nav__osu-logo-link {
display: inline-block;
&:focus {
outline: 2px solid $focus;
}
}
#osu-navname-block, .bux-osu-nav__osu-logo-img {
height: 35px;
@include breakpoint($navbar-bp) {
height: 50px;
}
}
// Only display links at md and above, unless #osu-nav-trigger is clicked.
#osu-navlinks {
display: none;
text-align: right;
@include breakpoint($navbar-bp) {
display: block;
}
}
// Menu trigger for navlinks at smaller breakpoints.
#osu-navlinks-block button {
background: none;
display: inline-block;
width: 44px;
height: 44px;
position: relative;
right: -12px;
z-index: 99;
text-align: center;
border: none;
border-left: 2px solid $gray-light-20;
padding-top: 10px;
padding-left: 14px;
z-index: 100;
&::after {
font-family: $icon;
content: "\f00e";
color: $gray-dark-80;
font-size: 20px;
cursor: pointer;
font-weight: 700;
}
// Don't display trigger at designated breakpoint and above.
@include breakpoint($navbar-bp) {
display: none;
}
}
// Show links if trigger is clicked.
#osu-nav-trigger[aria-expanded="true"] ~ #osu-navlinks {
display: block;
background-color: $white;
padding: rem-calc(55 20 20);
left: 0;
width: 100%;
margin: 0;
top: 0;
position: absolute;
z-index: 99;
@include breakpoint($navbar-bp) {
background-color: $clear;
padding: 0;
margin: 0;
}
}
// Change button icon if menu is open.
#osu-nav-trigger[aria-expanded="true"] {
position: relative;
border-left: none;
z-index: 999;
@include breakpoint(md) {
margin-right: -2px;
}
&::after {
content: "\f105";
}
&::before {
color: $gray-dark-80;
content: "";
font-family: $sans;
font-weight: 700;
position: absolute;
right: 50px;
top: 10px;
}
}
// Style links.
.bux-osu-nav__link {
@include breakpoint($navbar-bp) {
padding: $sp-12;
}
border-bottom: 2px solid $gray-light-60;
&:first-child {
border-top: 2px solid $gray-light-60;
}
a {
@include link-base(light, no);
border-bottom: none;
color: $gray-dark-60;
display: block;
padding: $sp-12;
font-weight: 700;
@include breakpoint($navbar-bp) {
display: inline;
padding: 0;
}
&:hover,
&:focus {
border-left: 4px solid #3f4443;
padding-left: 8px;
color: $scarlet;
@include breakpoint($navbar-bp) {
border-left: none;
padding-left: 0;
}
}
}
@include breakpoint($navbar-bp) {
display: inline-block;
margin: 0;
margin-left: $sp-8;
border-bottom: none;
&:first-child {
border-top: none;
}
a {
font-size: $ts-base;
&:hover {
color: $scarlet;
border-bottom: 1px solid $scarlet;
}
}
}
}
function initOsuNav(navRoot: HTMLElement) {
const triggerButton = navRoot.querySelector<HTMLButtonElement>("#osu-nav-trigger");
const navLinks = [...navRoot.querySelectorAll<HTMLAnchorElement>(".bux-osu-nav__link > a")];
const overlay = navRoot.querySelector<HTMLElement>(".bux-osu-nav__overlay");
const navMenu = navRoot.querySelector<HTMLElement>("#osu-navlinks-block");
const navContainer = document.querySelector<HTMLElement>("#osu-navlinks");
if (!triggerButton || !overlay || !navMenu || !navContainer) {
console.error("Buckeye UX OSU Navbar: Required elements missing in instance", navRoot);
return;
}
let isMobile = false;
let isOpen = false;
const openMenu = () => {
triggerButton.setAttribute("aria-expanded", "true");
navMenu.setAttribute("aria-modal", "true");
overlay.style.display = "block";
const menuLinksHeight = navContainer ? (navContainer.clientHeight - 55) : 0;
navRoot.style.marginBottom = `${menuLinksHeight}px`;
isOpen = true;
};
const closeMenu = () => {
triggerButton.setAttribute("aria-expanded", "false");
navMenu.removeAttribute("aria-modal");
overlay.style.display = "none";
navRoot.style.marginBottom = "0";
isOpen = false;
triggerButton.focus();
};
const toggleMenu = () => {
const isExpanded = triggerButton.getAttribute("aria-expanded") === "true";
return isExpanded ? closeMenu() : openMenu();
};
const updateViewportState = () => {
const triggerStyle = globalThis.getComputedStyle(triggerButton);
const currentlyMobile = triggerStyle.display !== "none";
if (isMobile !== currentlyMobile) {
isMobile = currentlyMobile;
if (isMobile) {
navRoot.setAttribute("aria-labelledby", "osu-nav-trigger");
} else {
navRoot.removeAttribute("aria-labelledby");
closeMenu();
}
}
};
const handleTriggerKeydown = (event: KeyboardEvent) => {
switch (event.key) {
case 'Enter': {
event.preventDefault();
toggleMenu();
break;
}
case 'Escape': {
closeMenu();
break;
}
case 'Tab': {
if (event.shiftKey && isOpen) {
event.preventDefault();
if (navLinks.length > 0) {
const previousNavLink = navLinks.at(-1);
if (previousNavLink) {
previousNavLink.focus();
}
}
}
break;
}
}
};
const handleNavKeydown = (event: KeyboardEvent) => {
if (!isMobile) return;
switch (event.key) {
case 'Escape': {
closeMenu();
break;
}
case 'Tab': {
const lastLink = navLinks.at(-1);
if (event.target === lastLink && !event.shiftKey) {
event.preventDefault();
triggerButton.focus();
}
break;
}
}
};
triggerButton.addEventListener("click", () => toggleMenu());
triggerButton.addEventListener("keydown", handleTriggerKeydown);
navRoot.addEventListener("keydown", handleNavKeydown);
overlay.addEventListener("click", closeMenu);
window.addEventListener("resize", updateViewportState);
updateViewportState();
}
const navs = document.querySelectorAll(".bux-osu-nav");
if (navs.length > 0) {
for (const nav of navs) {
if (nav instanceof HTMLElement) {
initOsuNav(nav);
}
}
}
No notes defined.