236 lines
5.7 KiB
Vue
236 lines
5.7 KiB
Vue
<template>
|
|
<button
|
|
:type="nativeType"
|
|
class="md-button"
|
|
:class="[
|
|
type,
|
|
inactive ? 'inactive' : 'active',
|
|
inline ? 'inline' : 'block',
|
|
round ? 'round' : '',
|
|
plain ? 'plain' : '',
|
|
size === 'small' ? 'small' : ''
|
|
]"
|
|
:disabled="inactive || type === 'disabled'"
|
|
v-on="$listeners"
|
|
>
|
|
<div class="md-button-inner">
|
|
<template v-if="loading">
|
|
<md-activity-indicator-rolling class="md-button-loading"></md-activity-indicator-rolling>
|
|
</template>
|
|
<template v-else-if="icon">
|
|
<md-icon :name="icon" :svg="iconSvg"></md-icon>
|
|
</template>
|
|
<div class="md-button-content">
|
|
<slot></slot>
|
|
</div>
|
|
</div>
|
|
</button>
|
|
</template>
|
|
|
|
<script>
|
|
import ActivityIndicatorRolling from '../activity-indicator/roller'
|
|
import Icon from '../icon'
|
|
export default {
|
|
name: 'md-button',
|
|
|
|
components: {
|
|
[ActivityIndicatorRolling.name]: ActivityIndicatorRolling,
|
|
[Icon.name]: Icon,
|
|
},
|
|
|
|
props: {
|
|
type: {
|
|
type: String,
|
|
default: 'default', // default, primary, warning, disabled, link
|
|
},
|
|
nativeType: {
|
|
type: String,
|
|
default: 'button',
|
|
},
|
|
icon: {
|
|
type: String,
|
|
default: '',
|
|
},
|
|
iconSvg: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
size: {
|
|
type: String,
|
|
default: 'large', // large, small
|
|
},
|
|
plain: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
round: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
inline: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
inactive: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
loading: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
},
|
|
}
|
|
|
|
</script>
|
|
|
|
<style lang="stylus">
|
|
.md-button
|
|
position relative
|
|
display block
|
|
height button-height
|
|
line-height button-height
|
|
font-size button-font-size
|
|
font-weight button-font-weight
|
|
font-family font-family-normal
|
|
text-align center
|
|
border none
|
|
border-radius button-radius
|
|
box-sizing border-box
|
|
outline none
|
|
transition all .3s
|
|
-webkit-appearance none
|
|
-webkit-user-select none
|
|
-webkit-tap-highlight-color transparent
|
|
overflow visible
|
|
|
|
.md-button-inner
|
|
display flex
|
|
align-items center
|
|
justify-content center
|
|
width 100%
|
|
height 100%
|
|
overflow hidden
|
|
text-overflow ellipsis
|
|
word-break break-word
|
|
white-space nowrap
|
|
|
|
.md-button-loading
|
|
.md-activity-indicator-svg
|
|
width 35px !important
|
|
height 35px !important
|
|
margin-right 10px
|
|
|
|
.md-button-content
|
|
display flex
|
|
align-items center
|
|
padding 0 6px
|
|
.md-icon
|
|
padding 0
|
|
|
|
.md-button
|
|
position relative
|
|
.md-icon
|
|
display flex
|
|
align-items center
|
|
justify-content center
|
|
padding 0 6px
|
|
// type
|
|
&.default
|
|
background button-default-fill
|
|
color button-default-color
|
|
hairline(all, color-border-element, button-radius, 3px)
|
|
&.active:active
|
|
background button-default-active-fill
|
|
.md-button-loading .md-activity-indicator-svg .circle circle
|
|
stroke button-default-color !important
|
|
&.primary
|
|
background button-primary-fill
|
|
color button-primary-color
|
|
hairline(all, button-primary-fill, button-radius, 3px)
|
|
&.active:active
|
|
background button-primary-active-fill
|
|
.md-button-loading .md-activity-indicator-svg .circle circle
|
|
stroke button-primary-color !important
|
|
&.warning
|
|
background button-warning-fill
|
|
color button-warning-color
|
|
hairline(all, button-warning-fill, button-radius, 3px)
|
|
&.active:active
|
|
background button-warning-active-fill
|
|
.md-button-loading .md-activity-indicator-svg .circle circle
|
|
stroke button-warning-color !important
|
|
&.disabled
|
|
background button-disabled-fill
|
|
color button-disabled-color
|
|
hairline(all, button-disabled-fill, button-radius, 3px)
|
|
.md-button-loading .md-activity-indicator-svg .circle circle
|
|
stroke button-disabled-color !important
|
|
|
|
&.plain
|
|
background transparent
|
|
|
|
&.default
|
|
color button-default-plain-color
|
|
hairline(all, color-border-element, button-radius, 3px)
|
|
&.active:active
|
|
background button-default-plain-active-fill
|
|
.md-button-loading .md-activity-indicator-svg .circle circle
|
|
stroke button-default-plain-color !important
|
|
&.primary
|
|
color button-primary-plain-color
|
|
hairline(all, button-primary-fill, button-radius, 3px)
|
|
&.active:active
|
|
background button-primary-plain-active-fill
|
|
.md-button-loading .md-activity-indicator-svg .circle circle
|
|
stroke button-primary-plain-color !important
|
|
&.warning
|
|
color button-warning-plain-color
|
|
hairline(all, button-warning-fill, button-radius, 3px)
|
|
&.active:active
|
|
background button-warning-plain-active-fill
|
|
.md-button-loading .md-activity-indicator-svg .circle circle
|
|
stroke button-warning-plain-color !important
|
|
&.disabled
|
|
color button-disabled-plain-color
|
|
hairline(all, color-border-element, button-radius, 3px)
|
|
.md-button-loading .md-activity-indicator-svg .circle circle
|
|
stroke button-disabled-plain-color !important
|
|
|
|
&.round
|
|
border-radius button-height
|
|
&:after
|
|
border-radius button-height !important
|
|
|
|
&.inline
|
|
display inline-block
|
|
padding 0 h-gap-md
|
|
&.block
|
|
width 100%
|
|
|
|
&.small
|
|
height button-small-height
|
|
line-height button-small-height
|
|
font-size button-small-font-size
|
|
&.round
|
|
border-radius button-small-height
|
|
&:after
|
|
border-radius button-small-height
|
|
|
|
&.link
|
|
display inline
|
|
width auto
|
|
height auto
|
|
line-height normal
|
|
font-size button-small-font-size
|
|
font-weight font-weight-normal
|
|
color button-primary-fill
|
|
background transparent
|
|
&.inactive
|
|
color color-text-disabled
|
|
opacity 1
|
|
|
|
&.inactive
|
|
opacity opacity-disabled
|
|
&.disabled
|
|
opacity 1
|
|
</style>
|