<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
  • Content:
    // 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;
    			}
    		}
    	}
    }
    
  • URL: /components/raw/osu-navbar/_osu-navbar.scss
  • Filesystem Path: src/components/osu-navbar/_osu-navbar.scss
  • Size: 3.2 KB
  • Content:
    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);
            }
        }
    }
    
  • URL: /components/raw/osu-navbar/osu-navbar.ts
  • Filesystem Path: src/components/osu-navbar/osu-navbar.ts
  • Size: 3.9 KB

No notes defined.