Skip to content

Tabs API Reference ​

Props ​

PropTypeDefaultDescription
tabItemsArray[]Array of tab items to display
selectedArray/StringnullCurrently selected tab(s)
multipleBooleanfalseAllow selection of multiple tabs
isLabeli18StringBooleantrueWhether tab labels are i18n translation keys
singlePackedBooleanfalseWhether to display tabs in a single packed container
tabClassesArray[]Additional CSS classes to apply to the tabs container
bottomLineStyleBooleanfalseWhether to use the bottom line animation style

Tab Item Object Structure ​

Each item in the tabItems array should have this structure:

js
{
  value: 'tab1', // Unique identifier for the tab
  name: 'Tab 1', // Display name or i18n key
  icon: '<svg>...</svg>', // Optional: SVG icon as string
  prepend: '<svg>...</svg>', // Optional: Icon to prepend to the tab
  append: '<svg>...</svg>' // Optional: Icon to append to the tab
}

Events ​

EventPayloadDescription
item:clickedTab ItemEmitted when a tab is clicked

Slots ​

SlotPropsDescription
tab-icon{ item }Custom content for each tab
prepend{ item }Content to prepend to each tab
append{ item }Content to append to each tab

Methods ​

The component doesn't expose any methods via template refs.

Example Usage ​

Basic Usage ​

vue
<template>
  <OTabs
    :tabItems="tabs"
    :selected="selectedTab"
    @item:clicked="handleTabClick"
  />
  
  <div class="tab-content">
    <component :is="currentTabComponent" />
  </div>
</template>

<script setup>
import { ref, computed } from 'vue'
import { OTabs } from 'your-component-library'
import Tab1Content from './Tab1Content.vue'
import Tab2Content from './Tab2Content.vue'
import Tab3Content from './Tab3Content.vue'

const tabs = [
  { value: 'tab1', name: 'Tab 1' },
  { value: 'tab2', name: 'Tab 2' },
  { value: 'tab3', name: 'Tab 3' }
]

const selectedTab = ref('tab1')

const handleTabClick = (tab) => {
  selectedTab.value = tab.value
}

const currentTabComponent = computed(() => {
  switch (selectedTab.value) {
    case 'tab1': return Tab1Content
    case 'tab2': return Tab2Content
    case 'tab3': return Tab3Content
    default: return null
  }
})
</script>

With Bottom Line Style ​

vue
<template>
  <OTabs
    :tabItems="tabs"
    :selected="selectedTab"
    :bottomLineStyle="true"
    @item:clicked="handleTabClick"
  />
</template>

<script setup>
import { ref } from 'vue'
import { OTabs } from 'your-component-library'

const tabs = [
  { value: 'home', name: 'Home' },
  { value: 'favorites', name: 'Favorites' },
  { value: 'profile', name: 'Profile' }
]

const selectedTab = ref('home')

const handleTabClick = (tab) => {
  selectedTab.value = tab.value
}
</script>

Single Packed Style ​

vue
<template>
  <OTabs
    :tabItems="tabs"
    :selected="selectedTab"
    :singlePacked="true"
    @item:clicked="handleTabClick"
  />
</template>

<script setup>
import { ref } from 'vue'
import { OTabs } from 'your-component-library'

const tabs = [
  { value: 'option1', name: 'Option 1' },
  { value: 'option2', name: 'Option 2' },
  { value: 'option3', name: 'Option 3' }
]

const selectedTab = ref('option1')

const handleTabClick = (tab) => {
  selectedTab.value = tab.value
}
</script>

With Prepend and Append Icons ​

vue
<template>
  <OTabs
    :tabItems="tabs"
    :selected="selectedTab"
    @item:clicked="handleTabClick"
  >
    <template #prepend="{ item }">
      <div v-if="item.prepend" v-html="item.prepend"></div>
    </template>
    <template #append="{ item }">
      <div v-if="item.append" v-html="item.append"></div>
    </template>
  </OTabs>
</template>

<script setup>
import { ref } from 'vue'
import { OTabs } from 'your-component-library'

const tabs = [
  { 
    value: 'notifications', 
    name: 'Notifications',
    prepend: '<svg>...</svg>',
    append: '<svg>...</svg>'
  }
]

const selectedTab = ref('notifications')

const handleTabClick = (tab) => {
  selectedTab.value = tab.value
}
</script>