ButtonBase Component 
The ButtonBase component is a versatile button component designed with Vue 3 and Tailwind CSS. It includes customizable color options, size variants, and additional configuration options to adapt to different use cases.
Basic Usage 
Import and use ButtonBase in your Vue components as follows:
<template>
  <ButtonBase label="Click Me" />
</template>
<script setup>
import { ButtonBase } from '@robuust-digital/vue-components/core';
</script>Props 
Below are the props supported by ButtonBase, which allow you to customize its appearance and behavior:
| Prop | Type | Default | Description | 
|---|---|---|---|
| as | String,Object,Function | button | Defines the element type or component to render. | 
| bindAs | String | '' | In some cases (e.g. when using Inertia links) where you need to render a different element, you can use this prop to bind the component to a different element. | 
| label | String | '' | Sets the text label for the button. | 
| icon | Object,Function | null | Specifies an icon to display within the button. @heroicons/vue can be used, or you can import your own .svgfiles. | 
| iconLeft | Boolean | false | Displays the icon on the left side of the button text if true. | 
| size | String | base | Specifies the button size. Options: smandbase. | 
| spinning | Boolean | false | Shows a loading spinner in place of the icon when true. | 
| color | String | primary | Sets the button's color variant. Accepts predefined values and custom formats ( red-soft,primaryandcustom-*). Learn more about color variants in the next section. | 
| iconOnly | Boolean | false | Renders a button with only an icon. When enabled, an icon should be provided either via the iconprop or icon slot. | 
Color Variants 
The color prop supports both predefined and custom values. Default colors include:
- primary
- secondary
- tertiary
- light
- dark
- red
- red-soft
- yellow
- yellow-soft
- green
- green-soft
- blue
- blue-soft
- clear
- custom-*
Custom Colors
If you don't find a color variant that suits your needs, you can create custom color variants.
Use custom-* color formats to add unique colors directly from your tailwind.config.js file.
Slots 
Default Slot 
Provides a way to customize the button content with access to the label prop:
<template>
  <ButtonBase label="Click Me" v-slot="{ label }">
    {{ label }} <!-- Access to label prop -->
  </ButtonBase>
</template>Icon Slot 
Customize the icon section with access to the icon prop:
<template>
  <ButtonBase label="Click Me">
    <template #icon="{ icon }">
      <div class="flex items-center gap-1">
        <Component :is="icon" class="size-4" /> <!-- Access to icon prop -->
        <StarIcon class="size-4" />
      </div>
    </template>
  </ButtonBase>
</template>Icon Placement
The icon slot respects the iconLeft prop, so you can control whether your custom icon content appears on the left or right side of the button text.
Spinner Slot 
Customize the spinner with access to the spinning state:
<template label="Save Changes">
  <ButtonBase :spinning="isLoading">
    <template #spinner="{ spinning }">
      <div v-if="spinning" class="custom-loader">
        <CustomSpinnerComponent />
      </div>
    </template>
  </ButtonBase>
</template>Spinner Visibility
The spinner slot content will only be visible when the spinning prop is true, replacing either the icon (if present) or appearing before the button text.
Sizes 
The ButtonBase component supports different sizes through the size prop:
Base size (default) 
Show code
<ButtonBase color="primary" label="Base Button" />Small size 
Show code
<ButtonBase color="primary" size="sm" label="Small Button" />Examples 
Basic Colors 
Show code
<ButtonBase color="primary" label="Primary" />
<ButtonBase color="secondary" label="Secondary" />
<ButtonBase color="tertiary" label="Tertiary" />
<ButtonBase color="light" label="Light" />
<ButtonBase color="dark" label="Dark" />System Colors 
Show code
<ButtonBase color="green" label="Green" />
<ButtonBase color="red" label="Red" />
<ButtonBase color="yellow" label="Yellow" />
<ButtonBase color="blue" label="Blue" />Soft System Colors 
Show code
<ButtonBase color="green-soft" label="Green Soft" />
<ButtonBase color="red-soft" label="Red Soft" />
<ButtonBase color="yellow-soft" label="Yellow Soft" />
<ButtonBase color="blue-soft" label="Blue Soft" />Clear Button 
Show code
<ButtonBase color="clear" label="Clear Button" />
<ButtonBase color="clear" label="Clear Button with Icon" icon-left :icon="BeakerIcon" />
<ButtonBase color="clear" icon-only label="Clear Button with Icon" :icon="BeakerIcon" />Button with Icon 
Show code
<ButtonBase label="Button Icon" :icon="BeakerIcon" />
<ButtonBase label="Delete" color="red-soft" :icon="TrashIcon" icon-left />Loading Button 
Use spinning to show a loading spinner:
Show code
<ButtonBase color="tertiary" label="Loading Button" :icon="BeakerIcon" spinning />
<ButtonBase color="dark" size="sm" label="Loading Button" :icon="BeakerIcon" spinning />Custom Button 
Show code
<ButtonBase color="custom-foo" label="Custom Button" />:root {
  --rvc-button-bg-color-custom-foo: var(--color-pink-600);
  --rvc-button-color-custom-foo: var(--color-white);
  --rvc-button-bg-color-custom-foo-hover: var(--color-pink-500);
  --rvc-button-color-custom-foo-hover: var(--color-white);
  --rvc-button-border-color-custom-foo: transparent;
  --rvc-button-border-color-custom-foo-hover: transparent;
  --rvc-button-icon-color-custom-foo: --alpha(var(--color-white) / 80%);
  --rvc-button-icon-color-custom-foo-hover: var(--color-white);
}
@layer components {
  .rvc-button.rvc-button-custom-foo {
    --rvc-button-bg-color: var(--rvc-button-bg-color-custom-foo);
    --rvc-button-color: var(--rvc-button-color-custom-foo);
    --rvc-button-bg-color-hover: var(--rvc-button-bg-color-custom-foo-hover);
    --rvc-button-color-hover: var(--rvc-button-color-custom-foo-hover);
    --rvc-button-border-color: var(--rvc-button-border-color-custom-foo);
    --rvc-button-border-color-hover: var(--rvc-button-border-color-custom-foo-hover);
    --rvc-button-icon-color: var(--rvc-button-icon-color-custom-foo);
    --rvc-button-icon-color-hover: var(--rvc-button-icon-color-custom-foo-hover);
    @apply rounded-full;
  }
}Icon Only Button 
Show code
<ButtonBase label="Icon Only Button" color="green-soft" :icon="BeakerIcon" icon-only />CSS Customization ⚡️ 
To customize the button styles global
:root {
  /* Base Button variables */
  --rvc-button-border-radius: var(--rvc-base-border-radius);
  --rvc-button-transition-duration: var(--rvc-base-transition-duration);
  --rvc-button-transition-timing-function: var(--rvc-base-transition-timing-function);
  --rvc-button-icon-loading-animation: var(--rvc-base-loading-animation);
  --rvc-button-border-width: var(--rvc-base-border-width);
  --rvc-button-box-shadow: var(--rvc-base-box-shadow);
  --rvc-button-height: calc(var(--spacing) * 9);
  --rvc-button-padding-x: calc(var(--spacing) * 3);
  --rvc-button-gap: calc(var(--spacing) * 1.5);
  --rvc-button-font-weight: var(--font-weight-semibold);
  --rvc-button-font-size: var(--text-base);
  --rvc-button-transition-property: color, background-color, border-color;
  --rvc-button-icon-size: calc(var(--spacing) * 5);
  --rvc-button-icon-loading-size: calc(var(--spacing) * 4);
  --rvc-button-bg-color: var(--color-primary-500);
  --rvc-button-color: var(--color-black);
  --rvc-button-bg-color-hover: var(--color-primary-600);
  --rvc-button-color-hover: var(--color-black);
  --rvc-button-border-color: transparent;
  --rvc-button-border-color-hover: transparent;
  --rvc-button-icon-color: var(--color-slate-500);
  --rvc-button-icon-color-hover: var(--color-slate-950);
  /* Secondary variant */
  --rvc-button-bg-color-secondary: var(--color-secondary-600);
  --rvc-button-color-secondary: var(--color-white);
  --rvc-button-bg-color-secondary-hover: var(--color-secondary-500);
  --rvc-button-color-secondary-hover: var(--color-white);
  --rvc-button-border-color-secondary: transparent;
  --rvc-button-border-color-secondary-hover: transparent;
  --rvc-button-icon-color-secondary: --alpha(var(--color-white) / 80%);
  --rvc-button-icon-color-secondary-hover: var(--color-white);
  /* Tertiary variant */
  --rvc-button-bg-color-tertiary: var(--color-tertiary-600);
  --rvc-button-color-tertiary: var(--color-white);
  --rvc-button-bg-color-tertiary-hover: var(--color-tertiary-500);
  --rvc-button-color-tertiary-hover: var(--color-white);
  --rvc-button-border-color-tertiary: transparent;
  --rvc-button-border-color-tertiary-hover: transparent;
  --rvc-button-icon-color-tertiary: --alpha(var(--color-white) / 80%);
  --rvc-button-icon-color-tertiary-hover: var(--color-white);
  /* Light variant */
  --rvc-button-bg-color-light: var(--color-white);
  --rvc-button-color-light: var(--color-black);
  --rvc-button-bg-color-light-hover: var(--color-slate-50);
  --rvc-button-color-light-hover: var(--color-black);
  --rvc-button-border-color-light: var(--color-slate-200);
  --rvc-button-border-color-light-hover: var(--color-slate-200);
  --rvc-button-icon-color-light: var(--color-slate-500);
  --rvc-button-icon-color-light-hover: var(--color-slate-950);
  /* Dark variant */
  --rvc-button-bg-color-dark: var(--color-slate-950);
  --rvc-button-color-dark: var(--color-white);
  --rvc-button-bg-color-dark-hover: var(--color-slate-800);
  --rvc-button-color-dark-hover: var(--color-white);
  --rvc-button-border-color-dark: transparent;
  --rvc-button-border-color-dark-hover: transparent;
  --rvc-button-icon-color-dark: --alpha(var(--color-white) / 80%);
  --rvc-button-icon-color-dark-hover: var(--color-white);
  /* Red variant */
  --rvc-button-bg-color-red: var(--color-red-600);
  --rvc-button-color-red: var(--color-white);
  --rvc-button-bg-color-red-hover: var(--color-red-500);
  --rvc-button-color-red-hover: var(--color-white);
  --rvc-button-border-color-red: transparent;
  --rvc-button-border-color-red-hover: transparent;
  --rvc-button-icon-color-red: --alpha(var(--color-white) / 80%);
  --rvc-button-icon-color-red-hover: var(--color-white);
  /* Red-soft variant */
  --rvc-button-bg-color-red-soft: var(--color-red-50);
  --rvc-button-color-red-soft: var(--color-red-700);
  --rvc-button-bg-color-red-soft-hover: var(--color-red-200);
  --rvc-button-color-red-soft-hover: var(--color-red-700);
  --rvc-button-border-color-red-soft: var(--color-red-200);
  --rvc-button-border-color-red-soft-hover: var(--color-red-200);
  --rvc-button-icon-color-red-soft: var(--color-red-500);
  --rvc-button-icon-color-red-soft-hover: var(--color-red-700);
  /* Yellow variant */
  --rvc-button-bg-color-yellow: var(--color-yellow-300);
  --rvc-button-color-yellow: var(--color-slate-950);
  --rvc-button-bg-color-yellow-hover: var(--color-yellow-400);
  --rvc-button-color-yellow-hover: var(--color-slate-950);
  --rvc-button-border-color-yellow: transparent;
  --rvc-button-border-color-yellow-hover: transparent;
  --rvc-button-icon-color-yellow: var(--color-slate-700);
  --rvc-button-icon-color-yellow-hover: var(--color-slate-950);
  /* Yellow-soft variant */
  --rvc-button-bg-color-yellow-soft: var(--color-yellow-50);
  --rvc-button-color-yellow-soft: var(--color-yellow-700);
  --rvc-button-bg-color-yellow-soft-hover: var(--color-yellow-200);
  --rvc-button-color-yellow-soft-hover: var(--color-yellow-700);
  --rvc-button-border-color-yellow-soft: var(--color-yellow-200);
  --rvc-button-border-color-yellow-soft-hover: var(--color-yellow-200);
  --rvc-button-icon-color-yellow-soft: var(--color-yellow-500);
  --rvc-button-icon-color-yellow-soft-hover: var(--color-yellow-700);
  /* Green variant */
  --rvc-button-bg-color-green: var(--color-green-600);
  --rvc-button-color-green: var(--color-white);
  --rvc-button-bg-color-green-hover: var(--color-green-500);
  --rvc-button-color-green-hover: var(--color-white);
  --rvc-button-border-color-green: transparent;
  --rvc-button-border-color-green-hover: transparent;
  --rvc-button-icon-color-green: --alpha(var(--color-white) / 80%);
  --rvc-button-icon-color-green-hover: var(--color-white);
  /* Green-soft variant */
  --rvc-button-bg-color-green-soft: var(--color-green-50);
  --rvc-button-color-green-soft: var(--color-green-700);
  --rvc-button-bg-color-green-soft-hover: var(--color-green-200);
  --rvc-button-color-green-soft-hover: var(--color-green-700);
  --rvc-button-border-color-green-soft: var(--color-green-200);
  --rvc-button-border-color-green-soft-hover: var(--color-green-200);
  --rvc-button-icon-color-green-soft: var(--color-green-500);
  --rvc-button-icon-color-green-soft-hover: var(--color-green-700);
  /* Blue variant */
  --rvc-button-bg-color-blue: var(--color-blue-600);
  --rvc-button-color-blue: var(--color-white);
  --rvc-button-bg-color-blue-hover: var(--color-blue-500);
  --rvc-button-color-blue-hover: var(--color-white);
  --rvc-button-border-color-blue: transparent;
  --rvc-button-border-color-blue-hover: transparent;
  --rvc-button-icon-color-blue: --alpha(var(--color-white) / 80%);
  --rvc-button-icon-color-blue-hover: var(--color-white);
  /* Blue-soft variant */
  --rvc-button-bg-color-blue-soft: var(--color-blue-50);
  --rvc-button-color-blue-soft: var(--color-blue-700);
  --rvc-button-bg-color-blue-soft-hover: var(--color-blue-200);
  --rvc-button-color-blue-soft-hover: var(--color-blue-700);
  --rvc-button-border-color-blue-soft: var(--color-blue-200);
  --rvc-button-border-color-blue-soft-hover: var(--color-blue-200);
  --rvc-button-icon-color-blue-soft: var(--color-blue-500);
  --rvc-button-icon-color-blue-soft-hover: var(--color-blue-700);
  /* Clear variant */
  --rvc-button-bg-color-clear: transparent;
  --rvc-button-color-clear: var(--color-indigo-600);
  --rvc-button-bg-color-clear-hover: transparent;
  --rvc-button-color-clear-hover: var(--color-indigo-700);
  --rvc-button-border-color-clear: transparent;
  --rvc-button-border-color-clear-hover: transparent;
  --rvc-button-icon-color-clear: var(--color-indigo-600);
  --rvc-button-icon-color-clear-hover: var(--color-indigo-700);
  /* Small variant */
  --rvc-button-height-sm: 1.875rem;
  --rvc-button-padding-x-sm: calc(var(--spacing) * 2.5);
  --rvc-button-font-size-sm: var(--text-sm);
  --rvc-button-icon-size-sm: calc(var(--spacing) * 4);
  --rvc-button-icon-loading-size-sm: calc(var(--spacing) * 3);
}
/* Or customize the class with CSS props (not recommended) */
.rvc-button {
  @apply cursor-pointer;
}