/components/UI/Button.vue
<template>
<button
@click.prevent="onClick"
:disabled="props.disabled"
:class="classes"
class="
text-white
bg-green
hover:bg-blue-800
focus:ring-4
focus:outline-none
font-medium
px-5
py-4
text-md text-center
cursor-pointer
whitespace-nowrap
"
>
<slot></slot>
</button>
</template>
<script setup lang="ts">
const props = defineProps({
disabled: {
type: Boolean,
default: false,
},
size: {
type: String,
default: "md",
},
liquid: {
type: Boolean,
default: false,
},
rounded: {
type: Boolean,
default: false,
},
})
const emits = defineEmits(["onclick"])
enum ButtonSizes {
"xs" = "px-[10px] py-[6px]",
"sm" = "px-[15px] py-[10px]",
"md" = "py-3 px-3",
"lg" = "px-12 py-3",
}
enum TextSizes {
"xs" = "text-xs",
"sm" = "text-sm",
"md" = "text-md",
"lg" = "text-lg",
}
const paddingClasses = computed(() => {
return ButtonSizes[props.size as keyof typeof ButtonSizes]
})
const textClass = computed(() => {
return TextSizes[props.size as keyof typeof ButtonSizes]
})
const widthClass = computed(() => {
return props.liquid ? "w-full" : "w-min"
})
const roundedClass = computed(() => {
return props.rounded ? "rounded-md" : ""
})
const classes = computed(
() =>
`${paddingClasses.value} ${textClass.value} ${widthClass.value} ${roundedClass.value}`
)
const onClick = (event: Event) => {
emits("onclick", event)
}
</script>
Usage:
<UIButton
@onclick="$emit('dosomething')"
size="lg"
:liquid="false"
:rounded="true"
>
Do something
</UIButton>
Top comments (0)