Skip to content

Bottom Tabs

Live Preview

Beranda
Tugas Hari Ini
5
Stok Rendah
12
Beranda
Stok
Tugas
Lainnya

Bottom tab navigation is the primary navigation pattern for all RetailOS mobile applications. It provides thumb-friendly access to top-level screens.

Anatomy

+------------------------------------------------+
|                                                  |
|              (Screen Content)                    |
|                                                  |
+--------------------------------------------------+
|  ┌──────────────────────────────────────────┐    |
|  │  [icon]    [icon]    [icon]    [icon]    │    |  <- Tab bar
|  │  Beranda   Stok      Tugas    Lainnya    │    |  <- Labels
|  └──────────────────────────────────────────┘    |
|              (Safe Area Padding)                  |
+--------------------------------------------------+

Specifications

PropertyValue
Total height84px (includes safe area inset)
Tab bar height50px (content area)
Safe area bottom34px (iPhone) / varies (Android)
Backgroundbg-card (#FFFFFF / dark: #262420)
Top border1px solid border (#E5E2DB / dark: #3D3A35)
Max tabs5
Min tabs3

Tab Item

PropertyValue
Icon size24px
Label size10px
Label fontPlus Jakarta Sans, weight 500
Gap (icon to label)4px
Active colorbrand (#2D6B4A / dark: #4A9E72)
Inactive colortext-3 (#A8A29E / dark: #6E6A64)

React Native Implementation

Use platform-native tab components where available for the best performance and native feel.

tsx
import { Tabs } from 'expo-router';
import { Home, Package, ClipboardList, MoreHorizontal } from 'lucide-react-native';

export default function TabLayout() {
  return (
    <Tabs
      screenOptions={{
        tabBarActiveTintColor: '#2D6B4A',
        tabBarInactiveTintColor: '#A8A29E',
        tabBarStyle: {
          backgroundColor: '#FFFFFF',
          borderTopColor: '#E5E2DB',
          borderTopWidth: 1,
          height: 84,
          paddingBottom: 34, // safe area
          paddingTop: 8,
        },
        tabBarLabelStyle: {
          fontFamily: 'PlusJakartaSans-Medium',
          fontSize: 10,
        },
      }}
    >
      <Tabs.Screen
        name="index"
        options={{
          title: 'Beranda',
          tabBarIcon: ({ color }) => <Home size={24} color={color} />,
        }}
      />
      <Tabs.Screen
        name="stock"
        options={{
          title: 'Stok',
          tabBarIcon: ({ color }) => <Package size={24} color={color} />,
        }}
      />
      <Tabs.Screen
        name="tasks"
        options={{
          title: 'Tugas',
          tabBarIcon: ({ color }) => <ClipboardList size={24} color={color} />,
        }}
      />
      <Tabs.Screen
        name="more"
        options={{
          title: 'Lainnya',
          tabBarIcon: ({ color }) => <MoreHorizontal size={24} color={color} />,
        }}
      />
    </Tabs>
  );
}

Per-App Tab Configurations

Stock App (Warehouse / Store Staff)

TabIconLabel
1HomeBeranda
2PackageStok
3ClipboardListTugas
4MoreHorizontalLainnya

Customer App

TabIconLabel
1HomeBeranda
2GiftPromo
3ReceiptRiwayat
4UserProfil

Store Admin (Mobile Web)

TabIconLabel
1LayoutDashboardDashboard
2BanknoteKeuangan
3PackageInventori
4UsersStaf
5SettingsPengaturan

Badge on Tab

For notification indicators, use a small dot or count badge.

tsx
<Tabs.Screen
  name="tasks"
  options={{
    title: 'Tugas',
    tabBarIcon: ({ color }) => <ClipboardList size={24} color={color} />,
    tabBarBadge: 3, // Shows count
    tabBarBadgeStyle: {
      backgroundColor: '#C4463A',
      fontSize: 10,
      fontWeight: '600',
      minWidth: 18,
    },
  }}
/>

DO and DON'T

DO

  • Use platform-native tab components (expo-router Tabs, NativeTabs) for native feel
  • Keep tab labels short --- one word (Indonesian) is ideal
  • Use the brand green for active tab color
  • Include safe area padding for notched devices

DON'T

  • Don't exceed 5 tabs --- use a "Lainnya" (More) tab for additional screens
  • Don't use text-only tabs without icons
  • Don't animate tab switches --- content should swap instantly
  • Don't use the tab bar for contextual actions (use a floating action button or action bar instead)

RetailOS - Sistem ERP Retail Modern untuk Indonesia