Tabs
Switch sibling views inside one page. The component is the tablist; you render the panel.
Default
v-model binds the active value. selected + setSelected is the Hesoyam-shaped alias.
Secondary
variant secondary is a compact pill. Use it in dense chrome, not as page-level navigation.
Disabled
disabled on Tabs locks the whole list. Pointer events drop and opacity falls to 50.
Disable a tab
disabled + tooltip on one item. The tooltip names the constraint, not the tab's purpose.
Icons
tabs[].icon is a Vue component or VNode. Build Hugeicons through Icon; never import icon data from @hugeicons/vue.
Badge
badge is a count chip. Omit it at zero — do not append (12) to the title.
Best practices
- Sibling views of one resource:
Overview,Logs,Settings. Unrelated pages belong in a sub-menu. - Cap the row at five to seven on desktop, three or four on mobile. Past that, fold extras into a Menu.
- Two or three compact peers of the same surface stay a
Switch. Tabs imply a larger view change. - Selecting a tab is instant. Do not toast or confirm the click. Persist the value in the URL so refresh restores it.
titleis Title Case, one or two nouns. Verbs belong on buttons.View Logsis wrong on a tab.- Disable a tab for permission or an empty state, and put the reason on
tooltipin sentence case. - Counts go in
badge, not the title. Drop the badge at zero. - Label the tablist with
aria-labelwhen no heading sits above it. Default isSections. - Arrows move focus. Enter and Space activate. Do not steal those keys for page shortcuts.