2022-06-01 10:15:55 +03:00

71 lines
1.6 KiB
Vue

<template>
<component
:is="tag"
:type="tag === 'button' ? nativeType : ''"
:disabled="disabled || loading"
@click="handleClick"
class="btn"
:class="[
{ 'rounded-circle': round },
{ 'btn-block': block },
{ 'btn-wd': wide },
{ 'btn-icon btn-fab': icon },
{ [`btn-${type}`]: type && !outline },
{ [`btn-${size}`]: size },
{ [`btn-outline-${type}`]: outline && type },
{ 'btn-link': link },
{ disabled: disabled && tag !== 'button' }
]"
>
<slot name="loading">
<i v-if="loading" class="fas fa-spinner fa-spin"></i>
</slot>
<slot></slot>
</component>
</template>
<script>
export default {
name: 'base-button',
props: {
tag: {
type: String,
default: 'button',
description: 'Button html tag'
},
round: Boolean,
icon: Boolean,
block: Boolean,
loading: Boolean,
wide: Boolean,
disabled: Boolean,
type: {
type: String,
default: 'default',
description: 'Button type (primary|secondary|danger etc)'
},
nativeType: {
type: String,
default: 'button',
description: 'Button native type (e.g button, input etc)'
},
size: {
type: String,
default: '',
description: 'Button size (sm|lg)'
},
outline: {
type: Boolean,
description: 'Whether button is outlined (only border has color)'
},
link: {
type: Boolean,
description: 'Whether button is a link (no borders or background)'
}
},
methods: {
handleClick(evt) {
this.$emit('click', evt);
}
}
};
</script>