diff --git a/locales/en.yml b/locales/en.yml index e55984677..2cc857f69 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -654,6 +654,7 @@ mobile: mk-user-timeline: no-posts: "This user seems never post" no-posts-with-media: "There is no posts with media" + load-more: "More" mk-user: follows-you: "Follows you" diff --git a/locales/ja.yml b/locales/ja.yml index b60e9e3f4..86b594990 100644 --- a/locales/ja.yml +++ b/locales/ja.yml @@ -654,6 +654,7 @@ mobile: mk-user-timeline: no-posts: "このユーザーはまだ投稿していないようです。" no-posts-with-media: "メディア付き投稿はありません。" + load-more: "もっとみる" mk-user: follows-you: "フォローされています" diff --git a/src/web/app/common/views/components/images.vue b/src/web/app/common/views/components/images.vue deleted file mode 100644 index dc802a018..000000000 --- a/src/web/app/common/views/components/images.vue +++ /dev/null @@ -1,63 +0,0 @@ -<template> -<div class="mk-images"> - <mk-images-image v-for="image in images" ref="image" :image="image" :key="image.id"/> -</div> -</template> - -<script lang="ts"> -import Vue from 'vue'; - -export default Vue.extend({ - props: ['images'], - mounted() { - const tags = this.$refs.image as Vue[]; - - if (this.images.length == 1) { - (this.$el.style as any).gridTemplateRows = '1fr'; - - (tags[0].$el.style as any).gridColumn = '1 / 2'; - (tags[0].$el.style as any).gridRow = '1 / 2'; - } else if (this.images.length == 2) { - (this.$el.style as any).gridTemplateColumns = '1fr 1fr'; - (this.$el.style as any).gridTemplateRows = '1fr'; - - (tags[0].$el.style as any).gridColumn = '1 / 2'; - (tags[0].$el.style as any).gridRow = '1 / 2'; - (tags[1].$el.style as any).gridColumn = '2 / 3'; - (tags[1].$el.style as any).gridRow = '1 / 2'; - } else if (this.images.length == 3) { - (this.$el.style as any).gridTemplateColumns = '1fr 0.5fr'; - (this.$el.style as any).gridTemplateRows = '1fr 1fr'; - - (tags[0].$el.style as any).gridColumn = '1 / 2'; - (tags[0].$el.style as any).gridRow = '1 / 3'; - (tags[1].$el.style as any).gridColumn = '2 / 3'; - (tags[1].$el.style as any).gridRow = '1 / 2'; - (tags[2].$el.style as any).gridColumn = '2 / 3'; - (tags[2].$el.style as any).gridRow = '2 / 3'; - } else if (this.images.length == 4) { - (this.$el.style as any).gridTemplateColumns = '1fr 1fr'; - (this.$el.style as any).gridTemplateRows = '1fr 1fr'; - - (tags[0].$el.style as any).gridColumn = '1 / 2'; - (tags[0].$el.style as any).gridRow = '1 / 2'; - (tags[1].$el.style as any).gridColumn = '2 / 3'; - (tags[1].$el.style as any).gridRow = '1 / 2'; - (tags[2].$el.style as any).gridColumn = '1 / 2'; - (tags[2].$el.style as any).gridRow = '2 / 3'; - (tags[3].$el.style as any).gridColumn = '2 / 3'; - (tags[3].$el.style as any).gridRow = '2 / 3'; - } - } -}); -</script> - -<style lang="stylus" scoped> -.mk-images - display grid - grid-gap 4px - height 256px - - @media (max-width 500px) - height 192px -</style> diff --git a/src/web/app/common/views/components/index.ts b/src/web/app/common/views/components/index.ts index fbf9d22a0..b58ba37ec 100644 --- a/src/web/app/common/views/components/index.ts +++ b/src/web/app/common/views/components/index.ts @@ -11,7 +11,7 @@ import reactionIcon from './reaction-icon.vue'; import reactionsViewer from './reactions-viewer.vue'; import time from './time.vue'; import timer from './timer.vue'; -import images from './images.vue'; +import mediaList from './media-list.vue'; import uploader from './uploader.vue'; import specialMessage from './special-message.vue'; import streamIndicator from './stream-indicator.vue'; @@ -36,7 +36,7 @@ Vue.component('mk-reaction-icon', reactionIcon); Vue.component('mk-reactions-viewer', reactionsViewer); Vue.component('mk-time', time); Vue.component('mk-timer', timer); -Vue.component('mk-images', images); +Vue.component('mk-media-list', mediaList); Vue.component('mk-uploader', uploader); Vue.component('mk-special-message', specialMessage); Vue.component('mk-stream-indicator', streamIndicator); diff --git a/src/web/app/common/views/components/media-list.vue b/src/web/app/common/views/components/media-list.vue new file mode 100644 index 000000000..d0da584a4 --- /dev/null +++ b/src/web/app/common/views/components/media-list.vue @@ -0,0 +1,56 @@ +<template> +<div class="mk-media-list" :data-count="mediaList.length"> + <template v-for="media in mediaList"> + <mk-media-image :image="media" :key="media.id"/> + </template> +</div> +</template> + +<script lang="ts"> +import Vue from 'vue'; + +export default Vue.extend({ + props: ['mediaList'], +}); +</script> + +<style lang="stylus" scoped> +.mk-media-list + display grid + grid-gap 4px + height 256px + + @media (max-width 500px) + height 192px + + &[data-count="1"] + grid-template-rows 1fr + &[data-count="2"] + grid-template-columns 1fr 1fr + grid-template-rows 1fr + &[data-count="3"] + grid-template-columns 1fr 0.5fr + grid-template-rows 1fr 1fr + :nth-child(1) + grid-row 1 / 3 + :nth-child(3) + grid-column 2 / 3 + grid-row 2/3 + &[data-count="4"] + grid-template-columns 1fr 1fr + grid-template-rows 1fr 1fr + + :nth-child(1) + grid-column 1 / 2 + grid-row 1 / 2 + :nth-child(2) + grid-column 2 / 3 + grid-row 1 / 2 + :nth-child(3) + grid-column 1 / 2 + grid-row 2 / 3 + :nth-child(4) + grid-column 2 / 3 + grid-row 2 / 3 + +</style> diff --git a/src/web/app/desktop/views/components/index.ts b/src/web/app/desktop/views/components/index.ts index 52b9680ba..9bca603a5 100644 --- a/src/web/app/desktop/views/components/index.ts +++ b/src/web/app/desktop/views/components/index.ts @@ -11,8 +11,8 @@ import postFormWindow from './post-form-window.vue'; import repostFormWindow from './repost-form-window.vue'; import analogClock from './analog-clock.vue'; import ellipsisIcon from './ellipsis-icon.vue'; -import imagesImage from './images-image.vue'; -import imagesImageDialog from './images-image-dialog.vue'; +import mediaImage from './media-image.vue'; +import mediaImageDialog from './media-image-dialog.vue'; import notifications from './notifications.vue'; import postForm from './post-form.vue'; import repostForm from './repost-form.vue'; @@ -40,8 +40,8 @@ Vue.component('mk-post-form-window', postFormWindow); Vue.component('mk-repost-form-window', repostFormWindow); Vue.component('mk-analog-clock', analogClock); Vue.component('mk-ellipsis-icon', ellipsisIcon); -Vue.component('mk-images-image', imagesImage); -Vue.component('mk-images-image-dialog', imagesImageDialog); +Vue.component('mk-media-image', mediaImage); +Vue.component('mk-media-image-dialog', mediaImageDialog); Vue.component('mk-notifications', notifications); Vue.component('mk-post-form', postForm); Vue.component('mk-repost-form', repostForm); diff --git a/src/web/app/desktop/views/components/images-image-dialog.vue b/src/web/app/desktop/views/components/media-image-dialog.vue similarity index 94% rename from src/web/app/desktop/views/components/images-image-dialog.vue rename to src/web/app/desktop/views/components/media-image-dialog.vue index 60afa7af8..dec140d1c 100644 --- a/src/web/app/desktop/views/components/images-image-dialog.vue +++ b/src/web/app/desktop/views/components/media-image-dialog.vue @@ -1,5 +1,5 @@ <template> -<div class="mk-images-image-dialog"> +<div class="mk-media-image-dialog"> <div class="bg" @click="close"></div> <img :src="image.url" :alt="image.name" :title="image.name" @click="close"/> </div> @@ -34,7 +34,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -.mk-images-image-dialog +.mk-media-image-dialog display block position fixed z-index 2048 diff --git a/src/web/app/desktop/views/components/images-image.vue b/src/web/app/desktop/views/components/media-image.vue similarity index 89% rename from src/web/app/desktop/views/components/images-image.vue rename to src/web/app/desktop/views/components/media-image.vue index 5b7dc4173..bc02d0f9b 100644 --- a/src/web/app/desktop/views/components/images-image.vue +++ b/src/web/app/desktop/views/components/media-image.vue @@ -1,5 +1,5 @@ <template> -<a class="mk-images-image" +<a class="mk-media-image" :href="image.url" @mousemove="onMousemove" @mouseleave="onMouseleave" @@ -11,7 +11,7 @@ <script lang="ts"> import Vue from 'vue'; -import MkImagesImageDialog from './images-image-dialog.vue'; +import MkMediaImageDialog from './media-image-dialog.vue'; export default Vue.extend({ props: ['image'], @@ -39,7 +39,7 @@ export default Vue.extend({ }, onClick() { - (this as any).os.new(MkImagesImageDialog, { + (this as any).os.new(MkMediaImageDialog, { image: this.image }); } @@ -48,7 +48,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -.mk-images-image +.mk-media-image display block cursor zoom-in overflow hidden diff --git a/src/web/app/desktop/views/components/post-detail.sub.vue b/src/web/app/desktop/views/components/post-detail.sub.vue index bf6e3ac3b..c35a07d7c 100644 --- a/src/web/app/desktop/views/components/post-detail.sub.vue +++ b/src/web/app/desktop/views/components/post-detail.sub.vue @@ -18,7 +18,7 @@ <div class="body"> <mk-post-html v-if="post.ast" :ast="post.ast" :i="os.i" :class="$style.text"/> <div class="media" v-if="post.media"> - <mk-images :images="post.media"/> + <mk-media-list :media-list="post.media"/> </div> </div> </div> diff --git a/src/web/app/desktop/views/components/post-detail.vue b/src/web/app/desktop/views/components/post-detail.vue index 98777e224..5845ab4f8 100644 --- a/src/web/app/desktop/views/components/post-detail.vue +++ b/src/web/app/desktop/views/components/post-detail.vue @@ -40,7 +40,7 @@ <div class="body"> <mk-post-html :class="$style.text" v-if="p.ast" :ast="p.ast" :i="os.i"/> <div class="media" v-if="p.media"> - <mk-images :images="p.media"/> + <mk-media-list :media-list="p.media"/> </div> <mk-poll v-if="p.poll" :post="p"/> <mk-url-preview v-for="url in urls" :url="url" :key="url"/> diff --git a/src/web/app/desktop/views/components/posts.post.vue b/src/web/app/desktop/views/components/posts.post.vue index 073b89957..71cbbc68d 100644 --- a/src/web/app/desktop/views/components/posts.post.vue +++ b/src/web/app/desktop/views/components/posts.post.vue @@ -42,7 +42,7 @@ <a class="rp" v-if="p.repost">RP:</a> </div> <div class="media" v-if="p.media"> - <mk-images :images="p.media"/> + <mk-media-list :media-list="p.media"/> </div> <mk-poll v-if="p.poll" :post="p" ref="pollViewer"/> <div class="tags" v-if="p.tags && p.tags.length > 0"> diff --git a/src/web/app/desktop/views/components/sub-post-content.vue b/src/web/app/desktop/views/components/sub-post-content.vue index 7f4c3b4f6..8c8f42c80 100644 --- a/src/web/app/desktop/views/components/sub-post-content.vue +++ b/src/web/app/desktop/views/components/sub-post-content.vue @@ -8,7 +8,7 @@ </div> <details v-if="post.media"> <summary>({{ post.media.length }}つのメディア)</summary> - <mk-images :images="post.media"/> + <mk-media-list :media-list="post.media"/> </details> <details v-if="post.poll"> <summary>投票</summary> diff --git a/src/web/app/mobile/views/components/index.ts b/src/web/app/mobile/views/components/index.ts index 19135d08d..4743f50e0 100644 --- a/src/web/app/mobile/views/components/index.ts +++ b/src/web/app/mobile/views/components/index.ts @@ -4,7 +4,7 @@ import ui from './ui.vue'; import timeline from './timeline.vue'; import post from './post.vue'; import posts from './posts.vue'; -import imagesImage from './images-image.vue'; +import mediaImage from './media-image.vue'; import drive from './drive.vue'; import postPreview from './post-preview.vue'; import subPostContent from './sub-post-content.vue'; @@ -26,7 +26,7 @@ Vue.component('mk-ui', ui); Vue.component('mk-timeline', timeline); Vue.component('mk-post', post); Vue.component('mk-posts', posts); -Vue.component('mk-images-image', imagesImage); +Vue.component('mk-media-image', mediaImage); Vue.component('mk-drive', drive); Vue.component('mk-post-preview', postPreview); Vue.component('mk-sub-post-content', subPostContent); diff --git a/src/web/app/mobile/views/components/images-image.vue b/src/web/app/mobile/views/components/media-image.vue similarity index 82% rename from src/web/app/mobile/views/components/images-image.vue rename to src/web/app/mobile/views/components/media-image.vue index 6bc1dc0ae..faf8bad48 100644 --- a/src/web/app/mobile/views/components/images-image.vue +++ b/src/web/app/mobile/views/components/media-image.vue @@ -1,5 +1,5 @@ <template> -<a class="mk-images-image" :href="image.url" target="_blank" :style="style" :title="image.name"></a> +<a class="mk-media-image" :href="image.url" target="_blank" :style="style" :title="image.name"></a> </template> <script lang="ts"> @@ -19,7 +19,7 @@ export default Vue.extend({ </script> <style lang="stylus" scoped> -.mk-images-image +.mk-media-image display block overflow hidden width 100% diff --git a/src/web/app/mobile/views/components/post-detail.vue b/src/web/app/mobile/views/components/post-detail.vue index 4b0b59eff..9baa5de6d 100644 --- a/src/web/app/mobile/views/components/post-detail.vue +++ b/src/web/app/mobile/views/components/post-detail.vue @@ -43,7 +43,7 @@ <router-link v-for="tag in p.tags" :key="tag" :to="`/search?q=#${tag}`">{{ tag }}</router-link> </div> <div class="media" v-if="p.media"> - <mk-images :images="p.media"/> + <mk-media-list :media-list="p.media"/> </div> <mk-poll v-if="p.poll" :post="p"/> <mk-url-preview v-for="url in urls" :url="url" :key="url"/> diff --git a/src/web/app/mobile/views/components/post.vue b/src/web/app/mobile/views/components/post.vue index 8df4dbf22..d53649b11 100644 --- a/src/web/app/mobile/views/components/post.vue +++ b/src/web/app/mobile/views/components/post.vue @@ -41,7 +41,7 @@ <a class="rp" v-if="p.repost != null">RP:</a> </div> <div class="media" v-if="p.media"> - <mk-images :images="p.media"/> + <mk-media-list :media-list="p.media"/> </div> <mk-poll v-if="p.poll" :post="p" ref="pollViewer"/> <div class="tags" v-if="p.tags && p.tags.length > 0"> diff --git a/src/web/app/mobile/views/components/sub-post-content.vue b/src/web/app/mobile/views/components/sub-post-content.vue index b97f08255..389fc420e 100644 --- a/src/web/app/mobile/views/components/sub-post-content.vue +++ b/src/web/app/mobile/views/components/sub-post-content.vue @@ -7,7 +7,7 @@ </div> <details v-if="post.media"> <summary>({{ post.media.length }}個のメディア)</summary> - <mk-images :images="post.media"/> + <mk-media-list :media-list="post.media"/> </details> <details v-if="post.poll"> <summary>%i18n:mobile.tags.mk-sub-post-content.poll%</summary>