Nº 258 of 520
Gooey nav
Four yard links. A green pill slides under the current one and softens through a goo filter.
Preview
Use it
Free to use · credit appreciated1 Once, in your project
npx skills add SusanAcharya/Design-Lounge 2 Then ask
Using the Design Lounge skill, build "Gooey nav" (piece gooey-nav) in my stack. Match its brief; restyle it onto my product's theme.
No skill? Paste the brief instead. It carries the numbers, tokens and behaviour.
<!-- Design Lounge Nº 258 · "Gooey nav" · www.designlounge.live -->
# Gooey nav
> **Build brief for a coding agent.** Rebuild this piece in the reader's stack. If they haven't said which stack, ask once, then default to semantic HTML + CSS + a little vanilla JS. Match the numbers below; don't "improve" them.
## What it is
A row of four links: Yard, Holds, Night book, Month close. Yard starts current. A green pill matches the current link and slides when another is chosen. The pill is filtered so its edge softens. The words sit outside the filter. This is not a round action menu. That menu is `gooey-menu`. This is not a segmented control for a view. That control is `segmented-control-sliding`. These are navigation links.
## Reference behaviour
1. Yard is current. The pill sits under it.
2. Clicking a link prevents navigation and moves aria-current.
3. The pill width and x match the link.
4. The slide is 320ms.
5. Current text is #fffdf8. Other text is #161513.
6. Reduced motion removes the filter and the transition. The pill still jumps.
7. The links do not leave the page.
## Structure
```
pill row
Yard Holds Night book Month close
```
- Nav is a flex row, gap 8px, padding 8px.
- Links are 44px tall.
- The blob is absolute, height 44px, radius 999px, fill #1f4d3a.
- Filter stdDeviation is 6.
- Current link is aria-current page.
## Tokens
```css
:root { --bg:#f6f4ef; --primary:#1f4d3a; --ink:#161513; --on:#fffdf8; }
```
## Typography
… 131 more lines. Copy or download for the full brief. Loading the source…Brief
171 linesBuild brief for a coding agent. Rebuild this piece in the reader’s stack. If they haven’t said which stack, ask once, then default to semantic HTML + CSS + a little vanilla JS. Match the numbers below; don’t “improve” them.
What it is
A row of four links: Yard, Holds, Night book, Month close. Yard starts current. A green pill matches the current link and slides when another is chosen. The pill is filtered so its edge softens. The words sit outside the filter. This is not a round action menu. That menu is gooey-menu. This is not a segmented control for a view. That control is segmented-control-sliding. These are navigation links.
Reference behaviour
- Yard is current. The pill sits under it.
- Clicking a link prevents navigation and moves aria-current.
- The pill width and x match the link.
- The slide is 320ms.
- Current text is #fffdf8. Other text is #161513.
- Reduced motion removes the filter and the transition. The pill still jumps.
- The links do not leave the page.
Structure
pill row
Yard Holds Night book Month close
- Nav is a flex row, gap 8px, padding 8px.
- Links are 44px tall.
- The blob is absolute, height 44px, radius 999px, fill #1f4d3a.
- Filter stdDeviation is 6.
- Current link is aria-current page.
Tokens
:root { --bg:#f6f4ef; --primary:#1f4d3a; --ink:#161513; --on:#fffdf8; }
Typography
| Role | Family | Size | Weight |
|---|---|---|---|
| Link | IBM Plex Sans | 14px | 500 |
Motion
- Pill | click | old x and width | new x and width | 320ms cubic-bezier(0.16,1,0.3,1). Reduced motion jumps.
States
- Current: aria-current page, light text, pill underneath.
- Other links: dark text, no pill.
- Hover does not move the pill. Click does.
- Focus ring offset 4px.
Accessibility
- The nav is labelled Yard.
- The current link has aria-current page.
- Links are real anchors whose default is prevented in the demo.
- Text is outside the SVG filter so it stays sharp.
- Reduced motion still moves the current item.
- Focus ring is 2px #1f4d3a, offset 4px.
Responsive rules
- The row is content-sized and centered at 1280.
- Below 520 the links may wrap. The pill math uses getBoundingClientRect so it still tracks.
- Do not collapse this into a hamburger in the demo.
Acceptance checklist
Always
- One current link.
- The pill matches that link’s box.
- Words are not inside the filter.
- Click changes the current link.
- No route change in the demo.
This demo
- Labels are Yard, Holds, Night book, Month close.
- Yard starts current.
- Fill is #1f4d3a.
- Ground is #f6f4ef.
- Type is IBM Plex Sans.
Implementation notes
Measure the link against the nav, not the page.
blob.style.setProperty("--x", (r.left - nav.left - 8) + "px");
Keep the filter on the blob only.
Measurements to keep
- Link height 44px. Gap 8px. Padding 8px.
- Slide 320ms. Blur stdDeviation 6.
- Current text #fffdf8. Rest text #161513.
- Radius 999px.
- Focus offset 4px.
Wrong turns
- Do not put the filter on the words.
- Do not use light text on the resting links.
- Do not navigate away.
- Do not animate a wobble loop.
- Do not add a logo in this piece.
- Do not make every link current.
Fit with the rest of the library
- A round goo menu is
gooey-menu. - A segmented control is
segmented-control-sliding. - A shrinking pill bar is
navbar-floating-pill-shrink. - This is the melting current pill.
- One nav.
- Type is IBM Plex Sans.
Keyboard
- Enter activates the focused link.
- aria-current moves.
- Tab order is the four links.
- The blob is not a tab stop.
- Do not use a positive tabindex.
- Reduced motion jumps.
- Focus offset is 4px.
- There are four links.
- Yard starts current.
- Escape does nothing.
- No dropdown.
- Text stays outside the filter.
- Type is IBM Plex Sans.
- The nav name is Yard.
- Click preventDefault.
- The pill width follows the label.
Rebuild order
- Build step: Yard is current. The pill sits under it.
- Build step: Clicking a link prevents navigation and moves aria-current.
- Build step: The pill width and x match the link.
- Build step: The slide is 320ms.
- Build step: Current text is #fffdf8. Other text is #161513.
- Build step: Reduced motion removes the filter and the transition. The pill still jumps.
- Build step: The links do not leave the page.
-
Keep this measurement while rebuilding: Link height 44px. Gap 8px. Padding 8px.
-
Keep this measurement while rebuilding: Slide 320ms. Blur stdDeviation 6.
-
Keep this measurement while rebuilding: Current text #fffdf8. Rest text #161513.
-
Keep this measurement while rebuilding: Radius 999px.
-
Keep this measurement while rebuilding: Focus offset 4px.
-
While rebuilding, remember: Do not put the filter on the words.
-
While rebuilding, remember: Do not use light text on the resting links.
-
While rebuilding, remember: Do not navigate away.
-
While rebuilding, remember: Do not animate a wobble loop.
-
While rebuilding, remember: Do not add a logo in this piece.
-
While rebuilding, remember: Do not make every link current.
Details
- Palette
- Type
- IBM Plex Sans
- Motion
- Subtle motion
- Build
- One session
- Tags
Studied
Lama LamaA tiny nav bar can carry the voice. Change its one line for each section.
All sourcesOn the shelves