Skip to content

Mobile navigation

On a phone, WerkOS keeps its workspaces in a glass bar at the bottom of the screen, within reach of the thumb. Each tab opens a screen with the modules of that workspace.

The bar

The bar shows on the home screen, on the list of modules of each workspace and on the team pages. Inside a module such as Global Projects, the module's own bar takes its place, or none, and the back arrow in the header takes you out.

When to use it

Use the bar for the top level of WerkOS on a phone: the workspaces a recruiter moves between many times a day. From 1024 px the rail on the left does this job.

Keep actions out of the workspace bar. A module that needs one, such as Add candidate, puts it in its own bar, as the one tab with color.

Anatomy

One glass bar spans the screen above the home indicator. Each tab is an icon in a 36 px box with its label underneath.

Bar height
69 px at rest, 52 px compact
Radius
26 px
Inner padding
6 px, 4 px above and below when compact
Bottom offset
14 px plus the safe area
Side margin
8 px or the safe area, whichever is larger
Icon box
36 by 36 px
Glyph
21 px
Label
9 px, weight 500, 4 px under the icon
Selected tab
Full ink, glyph stroke 2
--text
Selected capsule
Fills the icon box
--nav-tab-chip
Idle tab
Muted ink, glyph stroke 1.75
--text-muted

Glass

The bar is real glass: a thin fill under a heavy blur, so the color of the page comes through. A soft shadow alone sets it apart from the content, with no border and no halo on icons or labels.

Where the browser cannot blur, or when the phone asks for less transparency, the bar turns opaque.

Fill
Navigation glass
--glass-fill-nav
Blur
48 px, saturation 220 percent light, 210 percent dark
--glass-blur-nav
Shadow
Three layered drops
--glass-shadow-nav
Opaque fallback
White in light, deep blue gray in dark, no blur

Behavior

Scrolling down folds the labels away in 200 ms and the bar shrinks. The first scroll up brings them back. Lists that scroll inside the page count too.

The capsule glides to the tab you tap, and the tab presses in slightly under your finger. With reduced motion both happen at once.

The page keeps room for the tallest height of the bar, so nothing jumps when it folds. Floating buttons, such as the chat launcher, follow its live height. While you type a note, the bar steps aside so it does not cover the field.

Keyboard and screen readers

The bar is a navigation landmark named Main navigation. A tab carries aria-current only on its own screen. On a team page the capsule still shows the workspace you came from, but no tab claims to be the current page. Folded labels stay in the name of each tab.

Tab
Moves from one workspace to the next
Enter
Opens the workspace
Touch target
At least 44 by 44 px
Focus
2 px ring inside the tab
--focus-ring

Permitted and not permitted

Permitted

  • Ink and stroke weight for the selected tab

    The capsule behind it is a hint, not the signal.

  • A module's own bar inside the module

    With the back arrow as the way out.

  • Labels of one word

    Home, Projects, Intranet, Werkbook, Finance, Network.

Not permitted

  • Actions in the workspace bar

    The bar only takes you places.

  • A border or a halo on the glass

    The shadow alone separates the bar from the page.

NextCommand palette

Mobile navigation

The floating glass bar at the bottom of a phone screen that switches between WerkOS workspaces.

  • Kind: component
  • Page: https://design.werklist.com/components/mobile-navigation
  • Version: 2.1.2

When to use it

  • Below 1024 px, on the home screen, the module list of each workspace and the team pages.
  • Inside a module: the module's own bar in the same place, or none, with the back arrow in the header.

When not to use it

  • Actions in the workspace bar.
  • From 1024 px: the rail replaces it.
  • The workspace bar and a module bar on the same screen.

Rules

  • No border or halo on the glass. The shadow alone separates the bar from the page.
  • Pad the page with --bottom-nav-h. Place floating buttons with --bottom-nav-live-h.

Anatomy

  • Place: fixed to the bottom of the screen, 14 px above the bottom safe area, 8 px or the side safe area from each edge, whichever is larger. Hidden from 1024 px (--layer-header)
  • Room kept: the page keeps room for the tallest height of the bar. Floating buttons follow its current height (--bottom-nav-h, --bottom-nav-live-h)
  • Bar: 69 px at rest, 52 px compact, radius 26 px. Padding 6 px, 4 px above and below when compact, 2 px between tabs (--glass-fill-nav, --glass-blur-nav, --glass-shadow-nav)
  • Tab: a link that shares the width equally, radius 16 px, at least 44 px wide. 57 px high at rest, 44 px compact
  • Icon box: 36 by 36 px
  • Glyph: 21 px, stroke 2 when selected, 1.75 when idle
  • Label: 9 px, weight 500, 4 px under the icon box. Folds away in 200 ms when the bar is compact
  • Selected capsule: fills the icon box and glides to the tab you tap (--nav-tab-chip)
  • Opaque fallback: white in light, deep blue gray in dark, no blur

Variants

  • Workspace bar: The top level on a phone, with no color.
  • Module bar: The views of one module, in the same glass and tabs. Its Add tab keeps the blue disc.

States

  • Rest: Labels shown, bar 69 px
  • Compact: After 24 px of scrolling down, once 40 px from the top, the labels fold and the bar is 52 px. The first scroll up brings them back
  • Selected: Capsule, full ink, stroke 2. The tab carries aria-current page only on its own screen (--nav-tab-chip, --text)
  • Idle: Muted ink, stroke 1.75 (--text-muted)
  • Pressed: Scales to 0.92, or holds still with reduced motion
  • Focus: 2 px ring inside the tab (--focus-ring)
  • Typing: On a touch screen the bar steps aside while a field has focus
  • No blur, or reduced transparency: The opaque fallback

Keyboard

  • Tab: Next workspace tab
  • Enter: Opens the workspace screen

Accessibility

  • The bar is a navigation landmark named Main navigation.
  • A tab carries aria-current page only on its own screen. On a team page the capsule shows the workspace you came from, and no tab claims the page.
  • Folded labels stay in the name of each tab.
  • Targets at least 44 by 44 px.
  • Idle ink meets 4.5 to 1 in both themes. The capsule is a faint fill, so ink and stroke weight carry the selection.

Content

  • One word per workspace label: Home, Projects, Intranet, Werkbook, Finance, Network.
  • A longer label ends in an ellipsis.

Tokens

  • --layer-header
  • --glass-fill-nav
  • --glass-blur-nav
  • --glass-shadow-nav
  • --nav-tab-chip
  • --text
  • --text-muted
  • --focus-ring
  • --bottom-nav-h
  • --bottom-nav-live-h

JSON

{
  "title": "Mobile navigation",
  "path": "/components/mobile-navigation",
  "url": "https://design.werklist.com/components/mobile-navigation",
  "text": "https://design.werklist.com/agent/components/mobile-navigation",
  "summary": "The glass bar at the bottom of a phone screen that switches between WerkOS workspaces.",
  "version": "2.1.2",
  "kind": "component",
  "name": "Mobile navigation",
  "purpose": "The floating glass bar at the bottom of a phone screen that switches between WerkOS workspaces.",
  "use": [
    "Below 1024 px, on the home screen, the module list of each workspace and the team pages.",
    "Inside a module: the module's own bar in the same place, or none, with the back arrow in the header."
  ],
  "avoid": [
    "Actions in the workspace bar.",
    "From 1024 px: the rail replaces it.",
    "The workspace bar and a module bar on the same screen."
  ],
  "anatomy": [
    {
      "part": "Place",
      "measure": "fixed to the bottom of the screen, 14 px above the bottom safe area, 8 px or the side safe area from each edge, whichever is larger. Hidden from 1024 px",
      "token": "--layer-header"
    },
    {
      "part": "Room kept",
      "measure": "the page keeps room for the tallest height of the bar. Floating buttons follow its current height",
      "token": "--bottom-nav-h, --bottom-nav-live-h"
    },
    {
      "part": "Bar",
      "measure": "69 px at rest, 52 px compact, radius 26 px. Padding 6 px, 4 px above and below when compact, 2 px between tabs",
      "token": "--glass-fill-nav, --glass-blur-nav, --glass-shadow-nav"
    },
    {
      "part": "Tab",
      "measure": "a link that shares the width equally, radius 16 px, at least 44 px wide. 57 px high at rest, 44 px compact"
    },
    {
      "part": "Icon box",
      "measure": "36 by 36 px"
    },
    {
      "part": "Glyph",
      "measure": "21 px, stroke 2 when selected, 1.75 when idle"
    },
    {
      "part": "Label",
      "measure": "9 px, weight 500, 4 px under the icon box. Folds away in 200 ms when the bar is compact"
    },
    {
      "part": "Selected capsule",
      "measure": "fills the icon box and glides to the tab you tap",
      "token": "--nav-tab-chip"
    },
    {
      "part": "Opaque fallback",
      "measure": "white in light, deep blue gray in dark, no blur"
    }
  ],
  "variants": [
    {
      "name": "Workspace bar",
      "use": "The top level on a phone, with no color."
    },
    {
      "name": "Module bar",
      "use": "The views of one module, in the same glass and tabs. Its Add tab keeps the blue disc."
    }
  ],
  "states": [
    {
      "name": "Rest",
      "change": "Labels shown, bar 69 px"
    },
    {
      "name": "Compact",
      "change": "After 24 px of scrolling down, once 40 px from the top, the labels fold and the bar is 52 px. The first scroll up brings them back"
    },
    {
      "name": "Selected",
      "change": "Capsule, full ink, stroke 2. The tab carries aria-current page only on its own screen",
      "tokens": [
        "--nav-tab-chip",
        "--text"
      ]
    },
    {
      "name": "Idle",
      "change": "Muted ink, stroke 1.75",
      "tokens": [
        "--text-muted"
      ]
    },
    {
      "name": "Pressed",
      "change": "Scales to 0.92, or holds still with reduced motion"
    },
    {
      "name": "Focus",
      "change": "2 px ring inside the tab",
      "tokens": [
        "--focus-ring"
      ]
    },
    {
      "name": "Typing",
      "change": "On a touch screen the bar steps aside while a field has focus"
    },
    {
      "name": "No blur, or reduced transparency",
      "change": "The opaque fallback"
    }
  ],
  "keys": [
    {
      "key": "Tab",
      "action": "Next workspace tab"
    },
    {
      "key": "Enter",
      "action": "Opens the workspace screen"
    }
  ],
  "accessibility": [
    "The bar is a navigation landmark named Main navigation.",
    "A tab carries aria-current page only on its own screen. On a team page the capsule shows the workspace you came from, and no tab claims the page.",
    "Folded labels stay in the name of each tab.",
    "Targets at least 44 by 44 px.",
    "Idle ink meets 4.5 to 1 in both themes. The capsule is a faint fill, so ink and stroke weight carry the selection."
  ],
  "content": [
    "One word per workspace label: Home, Projects, Intranet, Werkbook, Finance, Network.",
    "A longer label ends in an ellipsis."
  ],
  "rules": [
    "No border or halo on the glass. The shadow alone separates the bar from the page.",
    "Pad the page with --bottom-nav-h. Place floating buttons with --bottom-nav-live-h."
  ],
  "tokens": [
    "--layer-header",
    "--glass-fill-nav",
    "--glass-blur-nav",
    "--glass-shadow-nav",
    "--nav-tab-chip",
    "--text",
    "--text-muted",
    "--focus-ring",
    "--bottom-nav-h",
    "--bottom-nav-live-h"
  ]
}

Raw file: https://design.werklist.com/agent/components/mobile-navigation