Navigation/DSTabBar
DSTabBar
navigationHorizontal scrollable tabs with animated underline indicator.
iOSmacOS
Purpose
Use for content segmentation with 3-8 tabs. Features smooth animated underline that follows selection.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| tabsreq | [String] | — | Array of tab labels |
| selectionreq | Binding<String> | — | Binding to selected tab |
| accessibilityLabel | String? | nil | Optional accessibility label |
Examples
Content tabs
Tabs for switching between content sections.
swift
@State var selectedTab = "Overview"
VStack {
DSTabBar(
tabs: ["Overview", "Activity", "Settings"],
selection: $selectedTab
)
// Content based on selection
switch selectedTab {
case "Overview": OverviewView()
case "Activity": ActivityView()
case "Settings": SettingsView()
default: EmptyView()
}
}Profile sections
Multiple tabs for user profile.
swift
@State var activeTab = "Posts"
VStack(spacing: 0) {
ProfileHeader(user: user)
DSTabBar(
tabs: ["Posts", "About", "Photos", "Videos", "Friends"],
selection: $activeTab
)
ScrollView {
TabContent(for: activeTab)
}
}Composition: Dashboard with tabs
Analytics dashboard with tab navigation.
swift
VStack(alignment: .leading, spacing: DSSpacing.md) {
HStack {
Text("Analytics")
.font(.system(size: 24, weight: .bold))
Spacer()
DSButton("Export", variant: .ghost, icon: "arrow.down.doc") {
exportData()
}
}
DSTabBar(
tabs: ["Overview", "Revenue", "Users", "Traffic", "Reports"],
selection: $selectedTab
)
AnalyticsContent(tab: selectedTab)
}Usage Guidelines
- Use for 3-8 tabs; fewer tabs use DSSegmentedControl instead
- Keep tab labels short (1-2 words)
- Tabs scroll horizontally when they don't fit
- Animated underline provides clear visual feedback
When to Use
✓ Use DSTabBar for:
- • Content sections with 3-8 options
- • Profile or detail screens with multiple views
- • Dashboard navigation between analytics sections
- • Horizontal scrolling when tabs don't fit on screen
✗ Avoid using for:
- • 2-3 options only (use DSSegmentedControl)
- • More than 8 tabs (consider dropdown or sidebar)
- • Mutually exclusive filters (use DSSegmentedControl)
- • App-level navigation (use native TabView)
Consider instead:
DSSegmentedControl
For 2-4 mutually exclusive options
DSSubnavigation
For lighter-weight secondary navigation
TabView
For app-level bottom tab navigation on iOS
Accessibility
VoiceOver
Announces 'Tab Bar, [selected tab], Tab, [position] of [total]'
Keyboard
- • Arrow keys to navigate tabs
- • Space or Return to select
- • Tab to focus control
Dynamic Type
✓ Supported
Contrast
WCAG AA compliant (underline 3:1, text 4.5:1)
Traits
.isButton for each tab.isSelected for active tabScrollable when needed