mand-mobile/components/button/index.vue

147 lines
3.2 KiB
Vue

<template>
<div
class="md-button"
:class="[type, size, disabled ? 'disabled' : '', icon ? 'with-icon' : '']"
@click="$_onBtnClick"
>
<div class="md-button-inner">
<template v-if="icon">
<md-icon :name="icon"></md-icon>
</template>
<slot></slot>
</div>
</div>
</template>
<script>
import Icon from '../icon'
export default {
name: 'md-button',
components: {
[Icon.name]: Icon,
},
props: {
type: {
type: String,
default: 'primary',
},
size: {
type: String,
default: 'large',
},
icon: {
type: String,
default: '',
},
disabled: {
type: Boolean,
default: false,
},
},
methods: {
$_onBtnClick(event) {
if (this.disabled) {
event.stopImmediatePropagation()
} else {
this.$emit('click', event)
}
},
},
}
</script>
<style lang="stylus">
.md-button
-webkit-user-select none
-webkit-tap-highlight-color transparent
position relative
text-align center
border-radius radius-normal
box-sizing border-box
overflow visible
&.disabled
&:active::before
display none
&::before
absolute-pos()
display none
content ''
position absolute
box-sizing border-box
&:active::before
display block
.md-button-inner
width 100%
height 100%
overflow hidden
text-overflow ellipsis
word-break break-word
white-space nowrap
// type
&.primary
background-color button-primary-fill
color color-text-base-inverse
&:active::before
background-color button-primary-fill-tap
&.disabled
background-color button-primary-fill-disabled
&.large, &.small
width button-primary-width
height button-primary-height
line-height button-primary-height
font-size button-primary-font-size
font-weight font-weight-medium
&.ghost
color button-ghost-color
hairline(all, button-ghost-color, true)
&:active::before
background-color button-ghost-fill-tap
&.ghost-primary
color button-ghost-primary-color
hairline(all, button-ghost-primary-color, true)
&:active::before
background-color button-ghost-primary-fill-tap
&.ghost, &.ghost-primary
&.disabled
opacity opacity-disabled
&.large
width button-ghost-width
height button-ghost-height
line-height button-ghost-height
font-size button-ghost-font-size
&.small
width button-ghost-width-sm
height button-ghost-height-sm
line-height button-ghost-height-sm
font-size button-ghost-font-size
&.link
background-color button-link-fill
color button-link-color
.md-button-inner
hairline(top, color-border-base)
hairline(bottom, color-border-base)
display flex
align-items center
justify-content center
&:active::before
background-color button-link-fill-tap
&.disabled
opacity opacity-disabled
&.large, &.small
width button-link-width
height button-link-height
font-size font-heading-normal
&.with-icon
.md-icon
display flex
align-items center
justify-content center
margin-right h-gap-sm
</style>