Modern Tab Navigation

Documentation for Design Patterns

Modern Tab Navigation Pattern

Session 111.2 - UI/UX Component Pattern

Overview

Standardized tab navigation pattern for consistent, accessible, modern UX across all Vitto AI components.

Design Principles

1. Visual Hierarchy 🎨

2. Floating Active State ✨

Active tabs "float" above the tab bar using:

3. Accessibility ♿

4. Micro-Interactions 🎭

Implementation

Quick Usage (Mixin)

@use 'libs/theme-system/theme-styles/src/lib/styles/scss/mixins' as mixins;

.my-tabs {
  @include mixins.modern-tabs;
}

Manual Implementation

.tab-container {
  display: flex;
  gap: var(--ux-spacing-2xs);
  border-bottom: 2px solid var(--ux-outline);
  padding: var(--ux-spacing-sm) var(--ux-spacing-lg);
  background: var(--ux-surface);
  border-radius: var(--ux-radius-xl) var(--ux-radius-xl) 0 0;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}

.tab-button {
  display: flex;
  align-items: center;
  gap: var(--ux-spacing-sm);
  padding: var(--ux-spacing-md) var(--ux-spacing-lg);
  border: 2px solid transparent;
  background: transparent;
  color: var(--ux-text-tertiary);
  cursor: pointer;
  border-radius: var(--ux-radius-lg) var(--ux-radius-lg) 0 0;
  font-size: var(--ux-text-sm);
  font-weight: 600;
  min-height: 48px;
  position: relative;
  transition: all var(--ux-transition-fast);

  // Icon within tab
  .material-icons {
    font-size: 22px;
    transition: all var(--ux-transition-fast);
  }

  // Hover state
  &:hover:not(.active) {
    color: var(--ux-text-primary);
    background: color-mix(in srgb, var(--ux-primary) 8%, transparent);
    border-color: color-mix(in srgb, var(--ux-primary) 20%, transparent);

    .material-icons {
      transform: scale(1.05);
      color: var(--ux-primary);
    }
  }

  // Active state
  &.active {
    background: var(--ux-background);
    color: var(--ux-primary);
    border-color: var(--ux-outline);
    border-bottom-color: var(--ux-background);
    box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.05);
    transform: translateY(2px);

    .material-icons {
      transform: scale(1.1);
      color: var(--ux-primary);
    }

    // Top gradient accent
    &::after {
      content: '';
      position: absolute;
      top: 0;
      left: 50%;
      transform: translateX(-50%);
      width: 40%;
      height: 3px;
      background: linear-gradient(90deg, transparent, var(--ux-primary), transparent);
      border-radius: 0 0 3px 3px;
    }
  }
}

HTML Structure

<nav class="tab-container">
  <button class="tab-button">
    <span class="material-icons">chat</span>
    <span>Chat</span>
  </button>
  
  <button class="tab-button active">
    <span class="material-icons">extension</span>
    <span>Skills</span>
  </button>
  
  <button class="tab-button">
    <span class="material-icons">memory</span>
    <span>Memory</span>
    <span class="badge">5</span>
  </button>
</nav>

Applied To

✅ Main Vitto Tabs - Primary navigation

✅ Observatory Sub-Tabs

✅ Cost Dashboard Sub-Tabs

✅ Skill Studio Tabs

CSS Variables Used

Variable Purpose
--ux-primary Active state brand color
--ux-text-tertiary Inactive tab text
--ux-text-primary Hover state text
--ux-background Active tab background
--ux-surface Tab container background
--ux-outline Borders and separators
--ux-spacing-* Consistent spacing tokens
--ux-radius-* Rounded corners
--ux-transition-fast Animation timing

Design Tokens

Spacing

Typography

Animation

Accessibility Checklist

Browser Support

Fallback: For older browsers, tabs will use solid colors instead of color-mix() blends.

Future Enhancements


Pattern Author: AI Agent (Claude + Cursor)
Created: Session 111.2
Status: ✅ Production Ready
Last Updated: 2026-02-17