component

TuxButton

Wraps UButton. The intent prop picks one of four TTI-conventional combinations — primary, secondary, ghost, destructive — so call sites don't have to remember that "destructive" means outline + error + btn-fill-on-hover. Every other UButton prop still works (size, icon, loading, to, disabled).

intents

Four semantic roles

<tux-button intent="primary">Primary</tux-button>
<tux-button intent="secondary">Secondary</tux-button>
<tux-button intent="ghost">Ghost</tux-button>
<tux-button intent="destructive">Destructive</tux-button>

Hover the destructive button — outline fills solid red with white text.

with icon

Leading & trailing icons

<tux-button intent="primary" icon="lucide:play">Run</tux-button>
<tux-button intent="secondary" icon="lucide:download">Export CSV</tux-button>
<tux-button intent="ghost" trailing-icon="lucide:arrow-right">Next</tux-button>
<tux-button intent="destructive" icon="lucide:trash-2">Delete</tux-button>

states

Loading & disabled

<tux-button intent="primary" :loading="isLoading" icon="lucide:refresh-cw">
  {{ isLoading ? "Working…" : "Reload" }}
</tux-button>
<tux-button intent="secondary" disabled>Disabled</tux-button>
<tux-button intent="destructive" disabled>Disabled destructive</tux-button>

sizes

All sizes

<tux-button intent="primary" size="xs">Size xs</tux-button>
<tux-button intent="primary" size="sm">Size sm</tux-button>
<tux-button intent="primary" size="md">Size md</tux-button>
<tux-button intent="primary" size="lg">Size lg</tux-button>
<tux-button intent="primary" size="xl">Size xl</tux-button>

as link

With `to` prop

Pass to and TuxButton renders as NuxtLink under the hood.

<tux-button intent="primary" to="/tokens" trailing-icon="lucide:arrow-right">
  Browse tokens
</tux-button>
<tux-button intent="secondary" to="/components" icon="lucide:layers">
  All components
</tux-button>