Components
Button
A button component that can be used anywhere.
Source Code
Copy the following code into your project.
<template>
<component
:is="elType"
:to="to"
:disabled="disabled"
:href="href"
@click="onClick"
:class="cn(variants({ size, variant, class: props.class }))"
>
<slot />
</component>
</template>
<script setup lang="ts">
import { RouteLocationRaw } from "#vue-router";
import { cva, type VariantProps } from "class-variance-authority";
const variants = cva(
"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium ring-offset-background transition focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
{
variants: {
variant: {
default: "bg-primary text-primary-foreground hover:bg-primary/90",
destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
ghost: "hover:bg-accent hover:text-accent-foreground",
link: "text-primary underline-offset-4 hover:underline",
},
size: {
default: "h-10 px-4 py-2",
sm: "h-9 rounded-md px-3",
lg: "h-11 rounded-md px-8",
icon: "h-10 w-10",
"icon-sm": "h-9 w-9",
},
},
defaultVariants: {
variant: "default",
size: "default",
},
}
);
type Props = VariantProps<typeof variants>;
const props = defineProps<{
/** Custom class to add to the button */
class?: any;
/** The page the button should route to */
to?: string | RouteLocationRaw;
/** The URL that the button should go to */
href?: string;
/** Whether the button is disabled */
disabled?: boolean;
/** Style of the button */
variant?: Props["variant"];
/** Size of the button */
size?: Props["size"];
/**Click handler */
onClick?: (e: MouseEvent) => void;
}>();
const elType = computed(() => {
if (props.to || props.href) return resolveComponent("NuxtLink");
return "button";
});
</script>
Examples
Variants
Sizes
Table of contents