Better broadcast widget mk2 (#5455)

* better broadcast widget

* 🎨

* 🎨

* 🎨

* mk2 (left nav with chevron icons)

* fix

* button title
This commit is contained in:
tamaina 2019-09-26 04:23:48 +09:00 committed by syuilo
parent 77bf9e2f9c
commit 9ef34b2220
2 changed files with 129 additions and 78 deletions

View File

@ -878,6 +878,7 @@ common/views/widgets/broadcast.vue:
no-broadcasts: "お知らせはありません" no-broadcasts: "お知らせはありません"
have-a-nice-day: "良い一日を!" have-a-nice-day: "良い一日を!"
next: "次" next: "次"
prev: "前"
common/views/widgets/calendar.vue: common/views/widgets/calendar.vue:
year: "{}年" year: "{}年"

View File

@ -1,28 +1,36 @@
<template> <template>
<div class="anltbovirfeutcigvwgmgxipejaeozxi"> <div class="anltbovirfeutcigvwgmgxipejaeozxi">
<ui-container :show-header="false" :naked="props.design == 1"> <ui-container :show-header="false" :naked="props.design === 1">
<div class="anltbovirfeutcigvwgmgxipejaeozxi-body" <div class="anltbovirfeutcigvwgmgxipejaeozxi-body"
:data-found="announcements && announcements.length != 0" :data-found="announcements && announcements.length !== 0"
:data-melt="props.design == 1" :data-melt="props.design == 1"
:data-mobile="platform == 'mobile'" :data-mobile="platform == 'mobile'"
> >
<div class="icon"> <div class="broadcast-left" v-show="announcements && announcements.length !== 0">
<svg height="32" version="1.1" viewBox="0 0 32 32" width="32"> <div class="icon">
<path class="tower" d="M16.04,11.24c1.79,0,3.239-1.45,3.239-3.24S17.83,4.76,16.04,4.76c-1.79,0-3.24,1.45-3.24,3.24 C12.78,9.78,14.24,11.24,16.04,11.24z M16.04,13.84c-0.82,0-1.66-0.2-2.4-0.6L7.34,29.98h2.98l1.72-2h8l1.681,2H24.7L18.42,13.24 C17.66,13.64,16.859,13.84,16.04,13.84z M16.02,14.8l2.02,7.2h-4L16.02,14.8z M12.04,25.98l2-2h4l2,2H12.04z"></path> <svg height="32" version="1.1" viewBox="0 0 32 32" width="32">
<path class="wave a" d="M4.66,1.04c-0.508-0.508-1.332-0.508-1.84,0c-1.86,1.92-2.8,4.44-2.8,6.94c0,2.52,0.94,5.04,2.8,6.96 c0.5,0.52,1.32,0.52,1.82,0s0.5-1.36,0-1.88C3.28,11.66,2.6,9.82,2.6,7.98S3.28,4.3,4.64,2.9C5.157,2.391,5.166,1.56,4.66,1.04z"></path> <path class="tower" d="M16.04,11.24c1.79,0,3.239-1.45,3.239-3.24S17.83,4.76,16.04,4.76c-1.79,0-3.24,1.45-3.24,3.24 C12.78,9.78,14.24,11.24,16.04,11.24z M16.04,13.84c-0.82,0-1.66-0.2-2.4-0.6L7.34,29.98h2.98l1.72-2h8l1.681,2H24.7L18.42,13.24 C17.66,13.64,16.859,13.84,16.04,13.84z M16.02,14.8l2.02,7.2h-4L16.02,14.8z M12.04,25.98l2-2h4l2,2H12.04z"></path>
<path class="wave b" d="M9.58,12.22c0.5-0.5,0.5-1.34,0-1.84C8.94,9.72,8.62,8.86,8.62,8s0.32-1.72,0.96-2.38c0.5-0.52,0.5-1.34,0-1.84 C9.346,3.534,9.02,3.396,8.68,3.4c-0.32,0-0.66,0.12-0.9,0.38C6.64,4.94,6.08,6.48,6.08,8s0.58,3.06,1.7,4.22 C8.28,12.72,9.1,12.72,9.58,12.22z"></path> <path class="wave a" d="M4.66,1.04c-0.508-0.508-1.332-0.508-1.84,0c-1.86,1.92-2.8,4.44-2.8,6.94c0,2.52,0.94,5.04,2.8,6.96 c0.5,0.52,1.32,0.52,1.82,0s0.5-1.36,0-1.88C3.28,11.66,2.6,9.82,2.6,7.98S3.28,4.3,4.64,2.9C5.157,2.391,5.166,1.56,4.66,1.04z"></path>
<path class="wave c" d="M22.42,3.78c-0.5,0.5-0.5,1.34,0,1.84c0.641,0.66,0.96,1.52,0.96,2.38s-0.319,1.72-0.96,2.38c-0.5,0.52-0.5,1.34,0,1.84 c0.487,0.497,1.285,0.505,1.781,0.018c0.007-0.006,0.013-0.012,0.02-0.018c1.139-1.16,1.699-2.7,1.699-4.22s-0.561-3.06-1.699-4.22 c-0.494-0.497-1.297-0.5-1.794-0.007C22.424,3.775,22.422,3.778,22.42,3.78z"></path> <path class="wave b" d="M9.58,12.22c0.5-0.5,0.5-1.34,0-1.84C8.94,9.72,8.62,8.86,8.62,8s0.32-1.72,0.96-2.38c0.5-0.52,0.5-1.34,0-1.84 C9.346,3.534,9.02,3.396,8.68,3.4c-0.32,0-0.66,0.12-0.9,0.38C6.64,4.94,6.08,6.48,6.08,8s0.58,3.06,1.7,4.22 C8.28,12.72,9.1,12.72,9.58,12.22z"></path>
<path class="wave d" d="M29.18,1.06c-0.479-0.502-1.273-0.522-1.775-0.044c-0.016,0.015-0.029,0.029-0.045,0.044c-0.5,0.52-0.5,1.36,0,1.88 c1.361,1.4,2.041,3.24,2.041,5.08s-0.68,3.66-2.041,5.08c-0.5,0.52-0.5,1.36,0,1.88c0.509,0.508,1.332,0.508,1.841,0 c1.86-1.92,2.8-4.44,2.8-6.96C31.99,5.424,30.98,2.931,29.18,1.06z"></path> <path class="wave c" d="M22.42,3.78c-0.5,0.5-0.5,1.34,0,1.84c0.641,0.66,0.96,1.52,0.96,2.38s-0.319,1.72-0.96,2.38c-0.5,0.52-0.5,1.34,0,1.84 c0.487,0.497,1.285,0.505,1.781,0.018c0.007-0.006,0.013-0.012,0.02-0.018c1.139-1.16,1.699-2.7,1.699-4.22s-0.561-3.06-1.699-4.22 c-0.494-0.497-1.297-0.5-1.794-0.007C22.424,3.775,22.422,3.778,22.42,3.78z"></path>
</svg> <path class="wave d" d="M29.18,1.06c-0.479-0.502-1.273-0.522-1.775-0.044c-0.016,0.015-0.029,0.029-0.045,0.044c-0.5,0.52-0.5,1.36,0,1.88 c1.361,1.4,2.041,3.24,2.041,5.08s-0.68,3.66-2.041,5.08c-0.5,0.52-0.5,1.36,0,1.88c0.509,0.508,1.332,0.508,1.841,0 c1.86-1.92,2.8-4.44,2.8-6.96C31.99,5.424,30.98,2.931,29.18,1.06z"></path>
</svg>
</div>
<div class="broadcast-nav" v-show="announcements && announcements.length > 1">
<div class="broadcast-page">{{ i + 1 }} / {{ announcements.length }}</div>
<ui-button class="broadcast-prev" @click="prev" :title="$t('next')"><fa :icon="faAngleLeft"/></ui-button>
<ui-button class="broadcast-next" @click="next" :title="$t('prev')"><fa :icon="faAngleRight"/></ui-button>
</div>
</div>
<div class="broadcast-right">
<p class="fetching" v-if="fetching">{{ $t('fetching') }}<mk-ellipsis/></p>
<h1 v-if="!fetching">{{ announcements.length == 0 ? $t('no-broadcasts') : announcements[i].title }}</h1>
<p v-if="!fetching">
<mfm v-if="announcements.length != 0" :text="announcements[i].text" :key="i"/>
<img v-if="announcements.length != 0 && announcements[i].image" :src="announcements[i].image" alt="" style="display: block; max-height: 130px; max-width: 100%;"/>
<template v-if="announcements.length == 0">{{ $t('have-a-nice-day') }}</template>
</p>
</div> </div>
<p class="fetching" v-if="fetching">{{ $t('fetching') }}<mk-ellipsis/></p>
<h1 v-if="!fetching">{{ announcements.length == 0 ? $t('no-broadcasts') : announcements[i].title }}</h1>
<p v-if="!fetching">
<mfm v-if="announcements.length != 0" :text="announcements[i].text" :key="i"/>
<img v-if="announcements.length != 0 && announcements[i].image" :src="announcements[i].image" alt="" style="display: block; max-height: 130px; max-width: 100%;"/>
<template v-if="announcements.length == 0">{{ $t('have-a-nice-day') }}</template>
</p>
<a v-if="announcements.length > 1" @click="next">{{ $t('next') }} &gt;&gt;</a>
</div> </div>
</ui-container> </ui-container>
</div> </div>
@ -30,6 +38,7 @@
<script lang="ts"> <script lang="ts">
import define from '../../../common/define-widget'; import define from '../../../common/define-widget';
import { faAngleLeft, faAngleRight } from '@fortawesome/free-solid-svg-icons';
import i18n from '../../../i18n'; import i18n from '../../../i18n';
export default define({ export default define({
@ -43,7 +52,8 @@ export default define({
return { return {
i: 0, i: 0,
fetching: true, fetching: true,
announcements: [] announcements: [],
faAngleLeft, faAngleRight
}; };
}, },
mounted() { mounted() {
@ -54,14 +64,21 @@ export default define({
}, },
methods: { methods: {
next() { next() {
if (this.i == this.announcements.length - 1) { if (this.i === this.announcements.length - 1) {
this.i = 0; this.i = 0;
} else { } else {
this.i++; this.i++;
} }
}, },
prev() {
if (this.i === 0) {
this.i = this.announcements.length - 1;
} else {
this.i--;
}
},
func() { func() {
if (this.props.design == 1) { if (this.props.design === 1) {
this.props.design = 0; this.props.design = 0;
} else { } else {
this.props.design++; this.props.design++;
@ -74,82 +91,115 @@ export default define({
<style lang="stylus" scoped> <style lang="stylus" scoped>
.anltbovirfeutcigvwgmgxipejaeozxi-body .anltbovirfeutcigvwgmgxipejaeozxi-body
display flex
padding 10px padding 10px
background var(--announcementsBg) background var(--announcementsBg)
&[data-melt] &[data-melt]
background transparent background transparent
&[data-found] > .broadcast-left
padding-left 50px width 32px
margin-right 8px
> .icon > .icon
display block > svg
fill currentColor
color var(--announcementsTitle)
&:after > .wave
content "" opacity 1
display block
clear both
> .icon &.a
display none animation wave 20s ease-in-out 2.1s infinite
float left &.b
margin-left -40px animation wave 20s ease-in-out 2s infinite
&.c
animation wave 20s ease-in-out 2s infinite
&.d
animation wave 20s ease-in-out 2.1s infinite
> svg @keyframes wave
fill currentColor 0%
color #4078c0 opacity 1
1.5%
opacity 0
3.5%
opacity 0
5%
opacity 1
6.5%
opacity 0
8.5%
opacity 0
10%
opacity 1
> .wave > .broadcast-nav
opacity 1 display flex
flex-wrap wrap
padding 1px 0 2px
&.a > .broadcast-page
animation wave 20s ease-in-out 2.1s infinite width 100%
&.b color var(--announcementsTitle)
animation wave 20s ease-in-out 2s infinite text-align center
&.c font-size .8rem
animation wave 20s ease-in-out 2s infinite
&.d
animation wave 20s ease-in-out 2.1s infinite
@keyframes wave > .broadcast-prev,
0% > .broadcast-next
opacity 1 flex 1
1.5% width 50%
opacity 0 display block
3.5% margin 0
opacity 0 padding 0
5% font-size .9rem
opacity 1 line-height 1.3em
6.5% color var(--link)
opacity 0 background transparent
8.5% cursor pointer
opacity 0
10%
opacity 1
> h1 &:focus
margin 0 &:after
font-size 0.95em top -1px
font-weight normal right -1px
color var(--announcementsTitle) bottom -1px
left -1px
> p &.round:focus:after
display block border-radius 5px
z-index 1
margin 0
font-size 0.7em
color var(--announcementsText)
&.fetching > .broadcast-prev
text-align center padding-right 3px
> a > .broadcast-next
display block padding-left 3px
font-size 0.7em
> .broadcast-right
flex 1
word-break break-word
> h1
margin 0
font-size .975em
font-weight normal
line-height 1.3em
color var(--announcementsTitle)
padding-bottom 2px
&[data-mobile]
> p > p
color #fff display block
z-index 1
margin 0
font-size .8em
color var(--announcementsText)
width 100%
&.fetching
text-align center
&[data-mobile]
> p
color #fff
</style> </style>