Nav
Top level elements
bf-nav-side
<nav class="bf-nav bf-nav-side"> <div class="bf-nav-side-logo">{bf-nav-logo}</div> <div class="bf-nav-side-content-wrapper bf-scrollbar-small"> <div class="bf-nav-side-content">{nav items}</div> </div> </nav>
<nav class="bf-nav bf-nav-side"> <div class="bf-nav-side-logo">{bf-nav-logo}</div> <div class="bf-nav-side-content-wrapper bf-scrollbar-small"> <div class="bf-nav-side-content">{nav items}</div> </div> </nav>
bf-nav-top
<header class="bf-nav bf-nav-top"> <div class="bf-nav-top-logo">{bf-nav-logo}</div> <div class="bf-nav-top-content">{nav items}</div> </header>
<header class="bf-nav bf-nav-top"> <div class="bf-nav-top-logo">{bf-nav-logo}</div> <div class="bf-nav-top-content">{nav items}</div> </header>
main
A <main>
sibling following a .bf-nav-top
and/or .bf-nav-side
should get
placed appropriately (margin and padding in order to avoid overlapping with top
bar or side bar):
<header class="bf-nav bf-nav-top">{bf-nav-top}</header> <main>main content goes here</main>
<header class="bf-nav bf-nav-top">{bf-nav-top}</header> <main>main content goes here</main>
<nav class="bf-nav bf-nav-side">{bf-nav-side}</nav> <main>main content goes here</main>
<nav class="bf-nav bf-nav-side">{bf-nav-side}</nav> <main>main content goes here</main>
<header class="bf-nav bf-nav-top">{bf-nav-top}</header> <nav class="bf-nav bf-nav-side">{bf-nav-side}</nav> <main>main content goes here</main>
<header class="bf-nav bf-nav-top">{bf-nav-top}</header> <nav class="bf-nav bf-nav-side">{bf-nav-side}</nav> <main>main content goes here</main>
bf-nav-mobile
To get correct animation transitions and accessibility, use:
.bf-nav-mobile-open
to open the mobile nav.bf-nav-mobile-close
to close the mobile nav.bf-nav-mobile-gone
on load and after close animation end
To disable main scrollbar while mobile nav is open, apply
.bf-nav-mobile-is-open
to <html>
element.
<nav class="bf-nav bf-nav-mobile bf-nav-mobile-open bf-scrollbar-small"> <div class="bf-nav-mobile-content">{nav items}</div> </nav> <div class="bf-nav-mobile-overlay"></div>
<nav class="bf-nav bf-nav-mobile bf-nav-mobile-open bf-scrollbar-small"> <div class="bf-nav-mobile-content">{nav items}</div> </nav> <div class="bf-nav-mobile-overlay"></div>
bf-nav-top-hide-for-mobile
Apply .bf-nav-top-hide-for-mobile
to the top bar when scrolled down and mobile
nav is not open.
Logo and app name
bf-nav-logo
Replace the {logo}
below with any custom logo (either <svg>
or <img>
should work)
<div class="bf-nav-logo">
<div class="bf-nav-logo-graphic">{logo}</div>
<div class="bf-nav-logo-name">App name</div>
</div>
<div class="bf-nav-logo">
<div class="bf-nav-logo-graphic">{logo}</div>
<div class="bf-nav-logo-name">App name</div>
</div>
bf-nav-item
Links placed in the sidebar should have text and an icon:
<a href="#path">
<div class="bf-nav-item">
<i class="bf-nav-item-icon fa-solid fa-user"></i>
Profile
</div>
</a>
<a href="#path">
<div class="bf-nav-item">
<i class="bf-nav-item-icon fa-solid fa-user"></i>
Profile
</div>
</a>
For top bar, you can have the same as in sidebar (above), or an icon alone:
<a href="#path" aria-label="Profile">
<div class="bf-nav-item bf-nav-item-icon-only">
<i class="bf-nav-item-icon fa-solid fa-user"></i>
</div>
</a>
<a href="#path" aria-label="Profile">
<div class="bf-nav-item bf-nav-item-icon-only">
<i class="bf-nav-item-icon fa-solid fa-user"></i>
</div>
</a>
For direct actions (like opening a dropdown menu), use <button type="button">
instead of <a>
.
Skip to main button
Give the <main>
element an ID and link to it with an <a>
styled as a small
button. Place the button as the first content of the page to allow keyboard
users to skip the menu items when tabbing through the
page.
.bf-hide-until-focus
lets it stay out of the way until it gets focused.
<a href="#mainContent" class="bf-hide-until-focus bf-button bf-button-small">
Skip to main content
</a>
<main id="mainContent">main content goes here</main>
<a href="#mainContent" class="bf-hide-until-focus bf-button bf-button-small">
Skip to main content
</a>
<main id="mainContent">main content goes here</main>
Responsive menu
In order to show mobile menu for screens smaller than 1600px
and sidebar for
wider, you can use to-xl
and from-xl
class names. For instance:
<header class="bf-nav bf-nav-top"> <!-- bf-nav-mobile-toggle button visible up to 1600px --> <button type="button" class="bf-nav-mobile-toggle to-xl" aria-label="Open mobile nav" > <div class="bf-nav-item bf-nav-item-icon-only"> <i class="bf-nav-item-icon fa-solid fa-bars"></i> </div> </button> {rest of bf-nav-top always visible} </header> <nav class="bf-nav bf-nav-side from-xl">{bf-nav-side visible from 1600px}</nav> <nav class="bf-nav bf-nav-mobile to-xl"> {bf-nav-mobile visible up to 1600px, same for overlay below} </nav> <div class="bf-nav-mobile-overlay to-xl"></div> <main>main content</main>
<header class="bf-nav bf-nav-top"> <!-- bf-nav-mobile-toggle button visible up to 1600px --> <button type="button" class="bf-nav-mobile-toggle to-xl" aria-label="Open mobile nav" > <div class="bf-nav-item bf-nav-item-icon-only"> <i class="bf-nav-item-icon fa-solid fa-bars"></i> </div> </button> {rest of bf-nav-top always visible} </header> <nav class="bf-nav bf-nav-side from-xl">{bf-nav-side visible from 1600px}</nav> <nav class="bf-nav bf-nav-mobile to-xl"> {bf-nav-mobile visible up to 1600px, same for overlay below} </nav> <div class="bf-nav-mobile-overlay to-xl"></div> <main>main content</main>
All together now
<header class="bf-nav bf-nav-top"> <button type="button" class="bf-nav-mobile-toggle to-xl" aria-label="Open mobile nav" onclick=" mobileNav.classList.toggle('bf-nav-mobile-open'); mobileNav.classList.toggle('bf-nav-mobile-close'); " > <div class="bf-nav-item bf-nav-item-icon-only"> <i class="bf-nav-item-icon fa-solid fa-bars"></i> </div> </button> <div class="bf-nav-top-logo"> <div class="bf-nav-logo"> <div class="bf-nav-logo-graphic"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="25" viewBox="0 0 24 25" role="img" class="bf-it-logo" aria-labelledby="itLogoSvgTitle" > <title id="itLogoSvgTitle">Intility</title> <path d="M6.36516 2.97081C5.83471 3.49389 5.77787 3.84261 6.09994 4.48192C6.40305 5.06312 6.63039 5.19873 7.33136 5.19873C8.08915 5.19873 8.54383 4.67565 8.54383 3.78449C8.54383 2.5446 7.23663 2.06027 6.36516 2.97081Z" /> <path d="M13.2822 7.13248V8.29487H12.4297H11.5771V9.3604V10.4259H12.4297H13.2822V13.6419C13.2822 17.2066 13.4338 17.9815 14.2863 19.0664C15.1577 20.1513 16.086 20.5 18.17 20.5H19.9129V19.2601V18.0202L18.5868 17.9427C16.3134 17.8265 15.9345 17.1097 15.9345 12.9832V10.4259H17.9237H19.9129V9.3604V8.29487H17.9237H15.9345V7.13248V5.97009H14.6083H13.2822V7.13248Z" /> <path d="M4 9.45726V10.6197H4.94724H5.89449V15.5598V20.5H7.22063H8.54677V14.3974V8.29487H6.27339H4V9.45726Z" /> </svg> </div> <div class="bf-nav-logo-name">App name</div> </div> </div> <div class="bf-nav-top-content"> <a href="#path" aria-label="Profile"> <div class="bf-nav-item bf-nav-item-icon-only"> <i class="bf-nav-item-icon fa-solid fa-user"></i> </div> </a> </div> </header> <nav class="bf-nav bf-nav-side from-xl"> <div class="bf-nav-side-content-wrapper bf-scrollbar-small"> <div class="bf-nav-side-content"> <a href="#path"> <div class="bf-nav-item"> <i class="bf-nav-item-icon fa-solid fa-house"></i> Home </div> </a> </div> </div> </nav> <nav class="bf-nav bf-nav-mobile bf-nav-mobile-close to-xl" id="mobileNav"> <div class="bf-nav-mobile-content"> <a href="#path"> <div class="bf-nav-item"> <i class="bf-nav-item-icon fa-solid fa-house"></i> Home </div> </a> </div> </nav> <div class="bf-nav-mobile-overlay to-xl"></div> <main>main content</main>
<header class="bf-nav bf-nav-top"> <button type="button" class="bf-nav-mobile-toggle to-xl" aria-label="Open mobile nav" onclick=" mobileNav.classList.toggle('bf-nav-mobile-open'); mobileNav.classList.toggle('bf-nav-mobile-close'); " > <div class="bf-nav-item bf-nav-item-icon-only"> <i class="bf-nav-item-icon fa-solid fa-bars"></i> </div> </button> <div class="bf-nav-top-logo"> <div class="bf-nav-logo"> <div class="bf-nav-logo-graphic"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="25" viewBox="0 0 24 25" role="img" class="bf-it-logo" aria-labelledby="itLogoSvgTitle" > <title id="itLogoSvgTitle">Intility</title> <path d="M6.36516 2.97081C5.83471 3.49389 5.77787 3.84261 6.09994 4.48192C6.40305 5.06312 6.63039 5.19873 7.33136 5.19873C8.08915 5.19873 8.54383 4.67565 8.54383 3.78449C8.54383 2.5446 7.23663 2.06027 6.36516 2.97081Z" /> <path d="M13.2822 7.13248V8.29487H12.4297H11.5771V9.3604V10.4259H12.4297H13.2822V13.6419C13.2822 17.2066 13.4338 17.9815 14.2863 19.0664C15.1577 20.1513 16.086 20.5 18.17 20.5H19.9129V19.2601V18.0202L18.5868 17.9427C16.3134 17.8265 15.9345 17.1097 15.9345 12.9832V10.4259H17.9237H19.9129V9.3604V8.29487H17.9237H15.9345V7.13248V5.97009H14.6083H13.2822V7.13248Z" /> <path d="M4 9.45726V10.6197H4.94724H5.89449V15.5598V20.5H7.22063H8.54677V14.3974V8.29487H6.27339H4V9.45726Z" /> </svg> </div> <div class="bf-nav-logo-name">App name</div> </div> </div> <div class="bf-nav-top-content"> <a href="#path" aria-label="Profile"> <div class="bf-nav-item bf-nav-item-icon-only"> <i class="bf-nav-item-icon fa-solid fa-user"></i> </div> </a> </div> </header> <nav class="bf-nav bf-nav-side from-xl"> <div class="bf-nav-side-content-wrapper bf-scrollbar-small"> <div class="bf-nav-side-content"> <a href="#path"> <div class="bf-nav-item"> <i class="bf-nav-item-icon fa-solid fa-house"></i> Home </div> </a> </div> </div> </nav> <nav class="bf-nav bf-nav-mobile bf-nav-mobile-close to-xl" id="mobileNav"> <div class="bf-nav-mobile-content"> <a href="#path"> <div class="bf-nav-item"> <i class="bf-nav-item-icon fa-solid fa-house"></i> Home </div> </a> </div> </nav> <div class="bf-nav-mobile-overlay to-xl"></div> <main>main content</main>