From 9ef34b222062bfbc963f28b6b090e9073ce427ab Mon Sep 17 00:00:00 2001
From: tamaina <tamaina@hotmail.co.jp>
Date: Thu, 26 Sep 2019 04:23:48 +0900
Subject: [PATCH] Better broadcast widget mk2 (#5455)

* better broadcast widget

* :art:

* :art:

* :art:

* mk2 (left nav with chevron icons)

* fix

* button title
---
 locales/ja-JP.yml                             |   1 +
 .../app/common/views/widgets/broadcast.vue    | 206 +++++++++++-------
 2 files changed, 129 insertions(+), 78 deletions(-)

diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index 66200a7f5..a9d425126 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -878,6 +878,7 @@ common/views/widgets/broadcast.vue:
   no-broadcasts: "お知らせはありません"
   have-a-nice-day: "良い一日を!"
   next: "次"
+  prev: "前"
 
 common/views/widgets/calendar.vue:
   year: "{}年"
diff --git a/src/client/app/common/views/widgets/broadcast.vue b/src/client/app/common/views/widgets/broadcast.vue
index 6850ff7af..88b18a245 100644
--- a/src/client/app/common/views/widgets/broadcast.vue
+++ b/src/client/app/common/views/widgets/broadcast.vue
@@ -1,28 +1,36 @@
 <template>
 <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"
-			:data-found="announcements && announcements.length != 0"
+			:data-found="announcements && announcements.length !== 0"
 			:data-melt="props.design == 1"
 			:data-mobile="platform == 'mobile'"
 		>
-			<div class="icon">
-				<svg height="32" version="1.1" viewBox="0 0 32 32" width="32">
-					<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 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 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 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 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 class="broadcast-left" v-show="announcements && announcements.length !== 0">
+				<div class="icon">
+					<svg height="32" version="1.1" viewBox="0 0 32 32" width="32">
+						<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 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 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 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 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>
-			<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>
 	</ui-container>
 </div>
@@ -30,6 +38,7 @@
 
 <script lang="ts">
 import define from '../../../common/define-widget';
+import { faAngleLeft, faAngleRight } from '@fortawesome/free-solid-svg-icons';
 import i18n from '../../../i18n';
 
 export default define({
@@ -43,7 +52,8 @@ export default define({
 		return {
 			i: 0,
 			fetching: true,
-			announcements: []
+			announcements: [],
+			faAngleLeft, faAngleRight
 		};
 	},
 	mounted() {
@@ -54,14 +64,21 @@ export default define({
 	},
 	methods: {
 		next() {
-			if (this.i == this.announcements.length - 1) {
+			if (this.i === this.announcements.length - 1) {
 				this.i = 0;
 			} else {
 				this.i++;
 			}
 		},
+		prev() {
+			if (this.i === 0) {
+				this.i = this.announcements.length - 1;
+			} else {
+				this.i--;
+			}
+		},
 		func() {
-			if (this.props.design == 1) {
+			if (this.props.design === 1) {
 				this.props.design = 0;
 			} else {
 				this.props.design++;
@@ -74,82 +91,115 @@ export default define({
 
 <style lang="stylus" scoped>
 .anltbovirfeutcigvwgmgxipejaeozxi-body
+	display flex
 	padding 10px
 	background var(--announcementsBg)
 
 	&[data-melt]
 		background transparent
 
-	&[data-found]
-		padding-left 50px
+	> .broadcast-left
+		width 32px
+		margin-right 8px
 
 		> .icon
-			display block
+			> svg
+				fill currentColor
+				color var(--announcementsTitle)
 
-	&:after
-		content ""
-		display block
-		clear both
+				> .wave
+					opacity 1
 
-	> .icon
-		display none
-		float left
-		margin-left -40px
+					&.a
+						animation wave 20s ease-in-out 2.1s infinite
+					&.b
+						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
-			fill currentColor
-			color #4078c0
+					@keyframes wave
+						0%
+							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
-				opacity 1
+		> .broadcast-nav
+			display flex
+			flex-wrap wrap
+			padding 1px 0 2px
 
-				&.a
-					animation wave 20s ease-in-out 2.1s infinite
-				&.b
-					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
+			> .broadcast-page
+				width 100%
+				color var(--announcementsTitle)
+				text-align center
+				font-size .8rem
 
-				@keyframes wave
-					0%
-						opacity 1
-					1.5%
-						opacity 0
-					3.5%
-						opacity 0
-					5%
-						opacity 1
-					6.5%
-						opacity 0
-					8.5%
-						opacity 0
-					10%
-						opacity 1
+			> .broadcast-prev,
+			> .broadcast-next
+				flex 1
+				width 50%
+				display block
+				margin 0
+				padding 0
+				font-size .9rem
+				line-height 1.3em
+				color var(--link)
+				background transparent
+				cursor pointer
 
-	> h1
-		margin 0
-		font-size 0.95em
-		font-weight normal
-		color var(--announcementsTitle)
+				&:focus
+					&:after
+						top -1px
+						right -1px
+						bottom -1px
+						left -1px
 
-	> p
-		display block
-		z-index 1
-		margin 0
-		font-size 0.7em
-		color var(--announcementsText)
+				&.round:focus:after
+						border-radius 5px
 
-		&.fetching
-			text-align center
+			> .broadcast-prev
+				padding-right 3px
 
-	> a
-		display block
-		font-size 0.7em
+			> .broadcast-next
+				padding-left 3px
+
+	> .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
-			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>