Live: try it with the mouse and the keyboard (Tab, arrows, Escape).

Breadcrumbs UI component for websites and web apps, shown in Juniper Supply, a fictional commerce product. Shows a full breadcrumb trail with the current page, a long trail collapsed behind a show-more button, a mobile back-to-parent form, and every link state (default, hover, focus-visible, current, collapsed). Luxury style: muted gold and olive, Cormorant Garamond headlines with Manrope, wide-tracked uppercase labels, no shadows. Comes with copyable HTML, CSS and a few lines of plain JavaScript (keyboard support and ARIA per the WAI-ARIA Authoring Practices), a live demo, and a DESIGN.md with light and dark colour tokens.
#f7f8f2 · surface #ffffff · text #191a0f · muted #626555 · primary #775512 · accent #6e744c#0c0d06 · surface #1d1f14 · text #edeee9 · muted #b0b3a5 · primary #bc9c66 · accent #c8cfa3Paste the HTML where the component goes, the CSS into your stylesheet and the script before </body>. The tokens block holds the light and dark colours; swap in your own.
<div class="mgd-crumbs-demo">
<div><h3>Full trail (folds to a back link on phones)</h3>
<nav class="mgd-crumbs mgd-crumbs--fold" aria-label="Breadcrumb">
<ol>
<li><a class="mgd-crumbs__link" href="/">Home</a></li>
<li><a class="mgd-crumbs__link" href="/kitchen">Kitchen</a></li>
<li><a class="mgd-crumbs__link" href="/kitchen/coffee">Coffee & tea</a></li>
<li><a class="mgd-crumbs__link" href="/kitchen/coffee/pour-over">Pour-over</a></li>
<li><a class="mgd-crumbs__link" href="#" aria-current="page">Stoneware pour-over set</a></li>
</ol>
</nav></div>
<div><h3>Long trail, collapsed</h3>
<nav class="mgd-crumbs" aria-label="Breadcrumb, help centre">
<ol>
<li><a class="mgd-crumbs__link" href="/help">Help</a></li>
<li><button class="mgd-crumbs__more" type="button" aria-expanded="false" aria-label="Show 3 more levels">…</button></li>
<li data-crumb-hidden><a class="mgd-crumbs__link" href="/help/orders">Orders</a></li>
<li data-crumb-hidden><a class="mgd-crumbs__link" href="/help/orders/delivery">Delivery</a></li>
<li data-crumb-hidden><a class="mgd-crumbs__link" href="/help/orders/delivery/international">International</a></li>
<li><a class="mgd-crumbs__link" href="/help/orders/delivery/international/customs">Customs</a></li>
<li><a class="mgd-crumbs__link" href="#" aria-current="page">Duties on orders over $150</a></li>
</ol>
</nav></div>
</div>/* Tokens (light + dark) */
:root{--bg:#f7f8f2;--surface:#ffffff;--border:#d5d8ca;--text:#191a0f;--muted:#626555;--primary:#775512;--on-primary:#ffffff;--accent:#6e744c;--font-h:"Cormorant Garamond",Georgia,serif;--font-b:"Manrope",system-ui,sans-serif;--hw:500;
--c-bw:1px;--c-line:var(--border);--c-r:0;--c-pill:0;--c-sh:none;--c-pop:0 18px 40px rgb(0 0 0 / .10);--c-tt:uppercase;--c-ls:.14em;--c-fw:500;--c-fs:11px;--c-ring:1px solid var(--text);--c-ind:1px;color-scheme:light}
@media (prefers-color-scheme:dark){:root:not([data-theme="light"]){--bg:#0c0d06;--surface:#1d1f14;--border:#333529;--text:#edeee9;--muted:#b0b3a5;--primary:#bc9c66;--on-primary:#111111;--accent:#c8cfa3;color-scheme:dark}
}
:root[data-theme="dark"]{--bg:#0c0d06;--surface:#1d1f14;--border:#333529;--text:#edeee9;--muted:#b0b3a5;--primary:#bc9c66;--on-primary:#111111;--accent:#c8cfa3;color-scheme:dark}
/* Component */
.mgd-sr{position:absolute!important;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.mgd-crumbs{font:500 12px/1.4 var(--font-b);text-transform:var(--c-tt);letter-spacing:var(--c-ls)}
.mgd-crumbs ol{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;align-items:center;gap:6px}
.mgd-crumbs li{display:inline-flex;align-items:center;gap:6px;min-width:0}
.mgd-crumbs li+li::before{content:"";flex:none;width:7px;height:7px;border:solid var(--muted);border-width:1.5px 1.5px 0 0;transform:rotate(45deg);margin:0 6px 0 2px}
.mgd-crumbs__link{color:var(--muted);text-decoration:none;padding:4px 2px;border-radius:4px;transition:color .12s}
.mgd-crumbs__link:hover,.mgd-crumbs__link.is-hover{color:var(--text);text-decoration:underline;text-underline-offset:3px}
.mgd-crumbs__link:focus-visible,.mgd-crumbs__link.is-focus{outline:var(--c-ring);outline-offset:2px}
.mgd-crumbs [aria-current="page"],.mgd-crumbs__link.is-on{color:var(--text);font-weight:600;text-decoration:none;}
.mgd-crumbs__more{min-width:32px;height:28px;padding:0 8px;border:1px solid var(--muted);border-radius:var(--c-pill);background:var(--surface);color:var(--text);font:600 14px/1 var(--font-b);cursor:pointer}
.mgd-crumbs__more:hover,.mgd-crumbs__more.is-hover{background:color-mix(in oklab,var(--primary) 10%,var(--surface))}
.mgd-crumbs__more:focus-visible,.mgd-crumbs__more.is-focus{outline:var(--c-ring);outline-offset:2px}
.mgd-crumbs [data-crumb-hidden]{display:none}
.mgd-crumbs-demo{display:grid;gap:26px}
.mgd-crumbs-demo h3{margin:0 0 10px;font:600 12px var(--font-b);letter-spacing:.06em;text-transform:uppercase;color:var(--muted)}
@media (max-width:520px){.mgd-crumbs--fold li{display:none}
.mgd-crumbs--fold li:nth-last-child(2){display:inline-flex}
.mgd-crumbs--fold li:nth-last-child(2)::before{content:"";width:7px;height:7px;border:solid var(--muted);border-width:0 0 1.5px 1.5px;transform:rotate(45deg);margin:0 4px 0 2px}}
@media (prefers-reduced-motion:reduce){.mgd-crumbs,.mgd-crumbs *{transition:none!important;animation-duration:2.4s!important}}document.querySelectorAll(".mgd-crumbs__more").forEach(function (b) {
b.addEventListener("click", function () {
var hidden = [].slice.call(b.closest("ol").querySelectorAll("[data-crumb-hidden]"));
hidden.forEach(function (li) { li.removeAttribute("data-crumb-hidden"); });
var li = b.parentNode, first = hidden[0] && hidden[0].querySelector("a");
li.parentNode.removeChild(li);
if (first) first.focus();
});
});## Component: Breadcrumbs
Where the current page sits in the site. On narrow screens the middle levels fold into a back link to the parent.
- **Pattern:** WAI-ARIA Authoring Practices, Breadcrumb (https://www.w3.org/WAI/ARIA/apg/patterns/breadcrumb/)
- **Roles and attributes:** <nav aria-label="Breadcrumb"> around an ordered list of links; the last item is the current page with aria-current="page"; separators are drawn with CSS so screen readers do not read them.
- **States drawn:** default, hover, focus-visible, current, collapsed
- **Focus:** a visible `:focus-visible` outline (1px solid text), never removed
- **Style knobs (luxury):** border 1px, corners 0, shadow none, labels uppercase, tracked .14em
- **Motion:** transitions are short (≤160ms) and switched off under `prefers-reduced-motion: reduce`
- **Code:** HTML + CSS + a few lines of plain JavaScript (no libraries); colours come only from the tokens above, so light and dark both work
### Keyboard
- **Tab:** move between the links
- **Enter:** follow a link
### Licence
Original Made Good Designs code: free to use and adapt in any project, including commercial ones, with no credit needed. Fonts are Google Fonts under their own licences.Add the Made Good Designs library to your assistant once. Then ask for UI references, brand palettes, font pairings and design tokens in any chat.
https://madegooddesigns.com/inspiration/mcp?ref=ui-breadcrumbs-uiSettings → Connectors → Add custom connector → paste the URL.
Settings → Apps & Connectors → Advanced → Developer mode → Create → paste the URL.
One click, then confirm in Cursor.
One click, then confirm in VS Code (Copilot agent mode).
claude mcp add --transport http made-good-designs https://madegooddesigns.com/inspiration/mcp?ref=ui-breadcrumbs-ui
gemini mcp add --transport http made-good-designs https://madegooddesigns.com/inspiration/mcp?ref=ui-breadcrumbs-ui
Add this to the app's MCP config (Windsurf: mcp_config.json).
Fonts: Cormorant Garamond + Manrope (Google Fonts)
Prompt copied: paste it into the chat that just opened.
Writing about this component?
search_ui_screens (e.g. “billing settings, editorial style”), get_ui_flow for a whole journey, and get_ui_screen_code to pull the HTML and DESIGN.md straight into your project.