misskey/src/web/app/desktop/tags/dialog.tag
2017-08-29 02:46:28 +09:00

145 lines
2.6 KiB
HTML

<mk-dialog>
<div class="bg" ref="bg" onclick={ bgClick }></div>
<div class="main" ref="main">
<header ref="header"></header>
<div class="body" ref="body"></div>
<div class="buttons">
<virtual each={ opts.buttons }>
<button onclick={ _onclick }>{ text }</button>
</virtual>
</div>
</div>
<style>
:scope
display block
> .bg
display block
position fixed
z-index 8192
top 0
left 0
width 100%
height 100%
background rgba(0, 0, 0, 0.7)
opacity 0
pointer-events none
> .main
display block
position fixed
z-index 8192
top 20%
left 0
right 0
margin 0 auto 0 auto
padding 32px 42px
width 480px
background #fff
opacity 0
> header
margin 1em 0
color $theme-color
// color #43A4EC
font-weight bold
&:empty
display none
> i
margin-right 0.5em
> .body
margin 1em 0
color #888
> .buttons
> button
display inline-block
float right
margin 0
padding 10px 10px
font-size 1.1em
font-weight normal
text-decoration none
color #888
background transparent
outline none
border none
border-radius 0
cursor pointer
transition color 0.1s ease
i
margin 0 0.375em
&:hover
color $theme-color
&:active
color darken($theme-color, 10%)
transition color 0s ease
</style>
<script>
import anime from 'animejs';
this.canThrough = opts.canThrough != null ? opts.canThrough : true;
this.opts.buttons.forEach(button => {
button._onclick = () => {
if (button.onclick) button.onclick();
this.close();
};
});
this.on('mount', () => {
this.refs.header.innerHTML = this.opts.title;
this.refs.body.innerHTML = this.opts.text;
this.refs.bg.style.pointerEvents = 'auto';
anime({
targets: this.refs.bg,
opacity: 1,
duration: 100,
easing: 'linear'
});
anime({
targets: this.refs.main,
opacity: 1,
scale: [1.2, 1],
duration: 300,
easing: [ 0, 0.5, 0.5, 1 ]
});
});
this.close = () => {
this.refs.bg.style.pointerEvents = 'none';
anime({
targets: this.refs.bg,
opacity: 0,
duration: 300,
easing: 'linear'
});
this.refs.main.style.pointerEvents = 'none';
anime({
targets: this.refs.main,
opacity: 0,
scale: 0.8,
duration: 300,
easing: [ 0.5, -0.5, 1, 0.5 ],
complete: () => this.unmount()
});
};
this.bgClick = () => {
if (this.canThrough) {
if (this.opts.onThrough) this.opts.onThrough();
this.close();
}
};
</script>
</mk-dialog>