Concept

hover to spread · click to select

Production-ready

Real <a> links · keyboard accessible (Tab + Enter) · active state driven by the URL hash · respects reduced-motion · re-measures on resize · falls back to a tappable menu on narrow screens.

try the keyboard: Tab into it, Enter to navigate

About this concept

An organic navigation where the menu items are joined into a single continuous shape. Hovering (or focusing) an item spreads its neighbours apart and stretches the connecting “necks” between the pills, so the whole bar feels like one living, elastic object rather than a row of separate buttons.

Built for the Holos app · Holos teal on near-black · Montserrat UI / Fraunces headings.

What’s gone into it

True vector geometry (not a blur filter)

Early drafts used an SVG “gooey” blur filter to fuse the pills, but that reads soft and raster-y. This version generates one real SVG path every frame: each pill is a flat-topped stadium, and each neck is a pair of cubic Bézier curves that pinch to a waist and meet the pills with horizontal tangents (so the joins are perfectly smooth).

The neck maths came from a hand-drawn reference. With R = cap radius (= half the bar height) and s = half the gap between two pills:

So when a neck stretches on hover, both the span and its control handles grow by those rules — that’s what keeps the curve graceful at every length.

Motion & feel

Concept vs. production

The two mockups share one reusable component. The Concept is the pure visual study (click to select). The Production-ready one wraps the same visuals in real navigation plumbing: semantic <a> links, full keyboard support (Tab + Enter) with a focus ring, active state driven by the URL, prefers-reduced-motion, a resize re-measure, and a tappable fallback menu on narrow screens.

Editing

Everything is in one self-contained file. All tuning lives in the constants block at the top of the OrganicNav() function:

ConstantDefaultControls
H48Pill height. Drives cap radius R = H/2 and the entire waist proportion.
PAD2.4Horizontal padding inside each pill (space around the text).
GAP1.35·HResting neck length between pills.
SPREAD1.65·H·0.7Extra gap added beside the active item on hover.
DUR650Tween duration (ms). Higher = silkier. Auto-set to 0 under reduced-motion.
BASE_OP0.72Resting text opacity (kept high for readability). Brightens toward 1 near the cursor.
NEAR / FAR70 / 200Cursor distance for full / zero text brightening.
UL_MAX40Max width of the selected-item underline.
HIT_X10How far the clickable area extends past each pill.

Glow size lives on the two <circle> radii (mouse glow r=212, active glow r=150) and its strength on the gradient stop-opacities (0.31 / 0.13) plus .glow-active opacity (0.32).

Colours

Swap the brand colours in the :root block at the top of the stylesheet:

--bg:    #011012;   /* page background    */
--shape: #031d22;   /* the connected pill shape */
--ink:   #fffcfb;   /* label text         */
--teal:  #279DAF;   /* selected text + underline + glow */

Implementing

The component API

The nav is a single factory function. Drop a host element on the page, then:

OrganicNav(hostElement, {
  id: 'prod',                 // unique prefix for this instance's SVG ids
  items: [                    // your menu
    { label: 'Directory', href: '/directory' },
    { label: 'Map',       href: '/map' },
    /* ... */
  ],
  selectedIndex: 0,           // initial active item
  asLinks: true,              // real <a> links + keyboard + URL routing
  responsive: true            // resize re-measure + mobile fallback menu
});

You can place more than one on a page — just give each a unique id (it namespaces the SVG gradient/clip IDs so instances don’t collide).

In Webflow

Real (multi-page) routing

The production demo derives the active item from location.hash. For a normal multi-page site, point each item’s href at a real URL and match on the path instead — change indexFromHash() to compare location.pathname against item.href. Then the correct item lights up automatically on each page load.

Accessibility notes