Vunix has a component called VButton which is used for calling actions or links.


Vunix <VButton> component generates either a <button> element, <a> element, a <router-link> for Vue.js, or a <nuxt-link> for Nuxt.js projects by default.


By default the component VButton is bundle with diffent variants included in the vunix preset. Check the commons configuration to add new variants.

Here's the ButtonConfig default configuration:

export interface ButtonConfig extends DefaultConfig {
loading: {
class: MethodOrStringType,
sizes: MethodOrObject,
icon: IconType

As you can see the VButton includes a loading object that is the configuration of the icon when the button prop loading prop is set to true.

Here the exemple from the default Button.config.ts vunix preset which is built on top of Tailwind CSS.

const config = {
class: ({ props }) => {
const fixed = 'inline-flex transition ease-in-out duration-150 items-center justify-center border disabled:cursor-not-allowed focus:outline-none focus:shadow-outline'
return `${fixed} ${(props.block) ? 'flex w-full' : 'inline-flex'}`
variants: {
default: 'bg-blue-100 text-blue-900 hover:bg-blue-200 focus:outline-none focus:ring focus:ring-blue-300 font-medium',
outline: 'border border-blue-500 text-blue-500 focus:outline-none focus:ring focus:ring-blue-300 font-medium',
text: ''
sizes: {
[SizeEnum.xs]: 'px-2 py-2 text-xs leading-4',
[SizeEnum.sm]: 'px-3 py-2 text-sm leading-4',
[SizeEnum.md]: 'px-4 py-2 text-sm leading-5',
[SizeEnum.lg]: 'px-4 py-2 text-base leading-6',
[SizeEnum.xl]: 'px-6 py-3 text-base leading-6'
loading: {
class: 'ml-3 animate-spin',
sizes: {
[SizeEnum.xs]: 'h-4 w-4',
[SizeEnum.sm]: 'h-4 w-4',
[SizeEnum.md]: 'h-5 w-5',
[SizeEnum.lg]: 'h-6 w-6',
[SizeEnum.xl]: 'h-6 w-6'
icon: ArrowPathIcon
} as ButtonConfig;

Check the commons section to see how to customize the DefaultConfig configuration fields.

Html tag type

The <VButton> generate a specific html tag according to the provided props. The default tag is the <button>. However, you can also render an <a> tag by providing an href prop value. You may also generate Vue Router <router-link> or Nuxt router<nuxt-link> from the to prop.


You can use size prop to adjust size of the button

<VButton size="sm">VButton sm</VButton>
<VButton size="md">VButton md</VButton>
<VButton size="lg">VButton lg</VButton>


You can use rounded prop to ajust border-radius of the button

<VButton rounded="xs">VButton xs</VButton>
<VButton rounded="sm">VButton sm</VButton>
<VButton rounded="md">VButton md</VButton>
<VButton rounded="lg">VButton lg</VButton>
<VButton rounded="xl">VButton xl</VButton>
<VButton rounded="full">VButton full</VButton>


Add block prop to fill available space

<VButton block>I'm a very large button</VButton>


You can use the native disabled attr.

<VButton disabled>I'm disabled</VButton>

If final html tag attribute is not a button (e.g. href or to), an aria-disabled will be injected.


You can use the prop loading to display a loading icon and set the button as disabled. When loading is set to true, the button will be disabled, and a spinning icon will be displayed next to the button text. The default loading icon can be customized in the loading.icon field of the ButtonConfig preset object.

<VButton loading>Submit</VButton>