CatPtain's picture
Upload 339 files
89ce340 verified
<template>
<button
class="button"
:class="{
'disabled': disabled,
'checked': !disabled && checked,
'default': !disabled && type === 'default',
'primary': !disabled && type === 'primary',
'checkbox': !disabled && type === 'checkbox',
'radio': !disabled && type === 'radio',
'small': size === 'small',
'first': first,
'last': last,
}"
@click="handleClick()"
>
<slot></slot>
</button>
</template>
<script lang="ts" setup>
const props = withDefaults(defineProps<{
checked?: boolean
disabled?: boolean
type?: 'default' | 'primary' | 'checkbox' | 'radio'
size?: 'small' | 'normal'
first?: boolean
last?: boolean
}>(), {
checked: false,
disabled: false,
type: 'default',
size: 'normal',
first: false,
last: false,
})
const emit = defineEmits<{
(event: 'click'): void
}>()
const handleClick = () => {
if (props.disabled) return
emit('click')
}
</script>
<style lang="scss" scoped>
.button {
height: 32px;
line-height: 32px;
outline: 0;
font-size: 13px;
padding: 0 15px;
text-align: center;
color: $textColor;
border-radius: $borderRadius;
user-select: none;
letter-spacing: 1px;
cursor: pointer;
&.small {
height: 24px;
line-height: 24px;
padding: 0 7px;
letter-spacing: 0;
font-size: 12px;
}
&.default {
background-color: #fff;
border: 1px solid #d9d9d9;
color: $textColor;
&:hover {
color: $themeColor;
border-color: $themeColor;
}
}
&.primary {
background-color: $themeColor;
border: 1px solid $themeColor;
color: #fff;
&:hover {
background-color: $themeHoverColor;
border-color: $themeHoverColor;
}
}
&.checkbox, &.radio {
background-color: #fff;
border: 1px solid #d9d9d9;
color: $textColor;
&:not(.checked):hover {
color: $themeColor;
}
}
&.checked {
color: #fff;
background-color: $themeColor;
border-color: $themeColor;
&:hover {
background-color: $themeHoverColor;
border-color: $themeHoverColor;
}
}
&.disabled {
background-color: #f5f5f5;
border: 1px solid #d9d9d9;
color: #b7b7b7;
cursor: default;
}
}
</style>