Compare commits

...

5 Commits

Author SHA1 Message Date
4c3dccfc0b 2.10.0 2018-05-18 15:32:11 +09:00
1075e3a005 透過画像のレンダリングを改善 2018-05-18 15:31:28 +09:00
dad8fff12d Fix ui 2018-05-18 14:41:44 +09:00
a6a175ede1 🎨 2018-05-18 14:31:30 +09:00
a01607fd97 ✌️ 2018-05-18 12:21:53 +09:00
22 changed files with 59 additions and 20 deletions

View File

@ -1,4 +1,7 @@
--- ---
meta:
lang: "English"
divider: " "
common: common:
misskey: "Share everything with others using Misskey." misskey: "Share everything with others using Misskey."
time: time:

View File

@ -1,3 +1,7 @@
meta:
lang: "日本語"
divider: ""
common: common:
misskey: "Misskeyで皆と共有しよう。" misskey: "Misskeyで皆と共有しよう。"

View File

@ -1,8 +1,8 @@
{ {
"name": "misskey", "name": "misskey",
"author": "syuilo <i@syuilo.com>", "author": "syuilo <i@syuilo.com>",
"version": "2.9.1", "version": "2.10.0",
"clientVersion": "1.0.5394", "clientVersion": "1.0.5406",
"codename": "nighthike", "codename": "nighthike",
"main": "./built/index.js", "main": "./built/index.js",
"private": true, "private": true,

View File

@ -0,0 +1,19 @@
<template>
<span class="mk-acct">
<span class="name">@{{ user.username }}</span>
<span class="host" v-if="user.host">@{{ user.host }}</span>
</span>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
props: ['user']
});
</script>
<style lang="stylus" scoped>
.mk-acct
> .host
opacity 0.5
</style>

View File

@ -23,7 +23,7 @@ export default Vue.extend({
computed: { computed: {
style(): any { style(): any {
return { return {
backgroundColor: this.user.avatarColor ? `rgb(${ this.user.avatarColor.join(',') })` : null, backgroundColor: this.user.avatarColor && this.user.avatarColor.length == 3 ? `rgb(${ this.user.avatarColor.join(',') })` : null,
backgroundImage: `url(${ this.user.avatarUrl }?thumbnail)`, backgroundImage: `url(${ this.user.avatarUrl }?thumbnail)`,
borderRadius: (this as any).clientSettings.circleIcons ? '100%' : null borderRadius: (this as any).clientSettings.circleIcons ? '100%' : null
}; };

View File

@ -3,6 +3,7 @@ import Vue from 'vue';
import signin from './signin.vue'; import signin from './signin.vue';
import signup from './signup.vue'; import signup from './signup.vue';
import forkit from './forkit.vue'; import forkit from './forkit.vue';
import acct from './acct.vue';
import avatar from './avatar.vue'; import avatar from './avatar.vue';
import nav from './nav.vue'; import nav from './nav.vue';
import noteHtml from './note-html'; import noteHtml from './note-html';
@ -29,6 +30,7 @@ import welcomeTimeline from './welcome-timeline.vue';
Vue.component('mk-signin', signin); Vue.component('mk-signin', signin);
Vue.component('mk-signup', signup); Vue.component('mk-signup', signup);
Vue.component('mk-forkit', forkit); Vue.component('mk-forkit', forkit);
Vue.component('mk-acct', acct);
Vue.component('mk-avatar', avatar); Vue.component('mk-avatar', avatar);
Vue.component('mk-nav', nav); Vue.component('mk-nav', nav);
Vue.component('mk-note-html', noteHtml); Vue.component('mk-note-html', noteHtml);

View File

@ -50,7 +50,7 @@ export default Vue.extend({
return `${this.file.name}\n${this.file.type} ${Vue.filter('bytes')(this.file.datasize)}`; return `${this.file.name}\n${this.file.type} ${Vue.filter('bytes')(this.file.datasize)}`;
}, },
background(): string { background(): string {
return this.file.properties.avgColor return this.file.properties.avgColor && this.file.properties.avgColor.length == 3
? `rgb(${this.file.properties.avgColor.join(',')})` ? `rgb(${this.file.properties.avgColor.join(',')})`
: 'transparent'; : 'transparent';
} }
@ -129,7 +129,7 @@ export default Vue.extend({
}, },
onThumbnailLoaded() { onThumbnailLoaded() {
if (this.file.properties.avgColor) { if (this.file.properties.avgColor && this.file.properties.avgColor.length == 3) {
anime({ anime({
targets: this.$refs.thumbnail, targets: this.$refs.thumbnail,
backgroundColor: `rgba(${this.file.properties.avgColor.join(',')}, 0)`, backgroundColor: `rgba(${this.file.properties.avgColor.join(',')}, 0)`,

View File

@ -26,7 +26,7 @@ export default Vue.extend({
computed: { computed: {
style(): any { style(): any {
return { return {
'background-color': this.image.properties.avgColor ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent', 'background-color': this.image.properties.avgColor && this.image.properties.avgColor.length == 3 ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent',
'background-image': this.raw ? `url(${this.image.url})` : `url(${this.image.url}?thumbnail&size=512)` 'background-image': this.raw ? `url(${this.image.url})` : `url(${this.image.url}?thumbnail&size=512)`
}; };
} }

View File

@ -5,7 +5,7 @@
<header> <header>
<div class="left"> <div class="left">
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link> <router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
<span class="username">@{{ note.user | acct }}</span> <span class="username"><mk-acct :user="note.user"/></span>
</div> </div>
<div class="right"> <div class="right">
<router-link class="time" :to="note | notePage"> <router-link class="time" :to="note | notePage">

View File

@ -28,7 +28,7 @@
<mk-avatar class="avatar" :user="p.user"/> <mk-avatar class="avatar" :user="p.user"/>
<header> <header>
<router-link class="name" :to="p.user | userPage" v-user-preview="p.user.id">{{ p.user | userName }}</router-link> <router-link class="name" :to="p.user | userPage" v-user-preview="p.user.id">{{ p.user | userName }}</router-link>
<span class="username">@{{ p.user | acct }}</span> <span class="username"><mk-acct :user="p.user"/></span>
<router-link class="time" :to="p | notePage"> <router-link class="time" :to="p | notePage">
<mk-time :time="p.createdAt"/> <mk-time :time="p.createdAt"/>
</router-link> </router-link>

View File

@ -4,7 +4,7 @@
<div class="main"> <div class="main">
<header> <header>
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link> <router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
<span class="username">@{{ note.user | acct }}</span> <span class="username"><mk-acct :user="note.user"/></span>
<router-link class="time" :to="note | notePage"> <router-link class="time" :to="note | notePage">
<mk-time :time="note.createdAt"/> <mk-time :time="note.createdAt"/>
</router-link> </router-link>
@ -59,17 +59,20 @@ root(isDark)
> .name > .name
margin 0 .5em 0 0 margin 0 .5em 0 0
padding 0 padding 0
overflow hidden
color isDark ? #fff : #607073 color isDark ? #fff : #607073
font-size 1em font-size 1em
font-weight bold font-weight bold
text-decoration none text-decoration none
white-space normal text-overflow ellipsis
&:hover &:hover
text-decoration underline text-decoration underline
> .username > .username
margin 0 .5em 0 0 margin 0 .5em 0 0
overflow hidden
text-overflow ellipsis
color isDark ? #606984 : #d1d8da color isDark ? #606984 : #d1d8da
> .time > .time

View File

@ -4,7 +4,7 @@
<div class="main"> <div class="main">
<header> <header>
<router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link> <router-link class="name" :to="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</router-link>
<span class="username">@{{ note.user | acct }}</span> <span class="username"><mk-acct :user="note.user"/></span>
<div class="info"> <div class="info">
<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span> <span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
<router-link class="created-at" :to="note | notePage"> <router-link class="created-at" :to="note | notePage">

View File

@ -17,7 +17,7 @@
<header> <header>
<router-link class="name" :to="p.user | userPage" v-user-preview="p.user.id">{{ p.user | userName }}</router-link> <router-link class="name" :to="p.user | userPage" v-user-preview="p.user.id">{{ p.user | userName }}</router-link>
<span class="is-bot" v-if="p.user.host === null && p.user.isBot">bot</span> <span class="is-bot" v-if="p.user.host === null && p.user.isBot">bot</span>
<span class="username">@{{ p.user | acct }}</span> <span class="username"><mk-acct :user="p.user"/></span>
<div class="info"> <div class="info">
<span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span> <span class="app" v-if="p.app">via <b>{{ p.app.name }}</b></span>
<span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span> <span class="mobile" v-if="p.viaMobile">%fa:mobile-alt%</span>
@ -350,6 +350,7 @@ root(isDark)
align-items center align-items center
padding 16px 32px padding 16px 32px
line-height 28px line-height 28px
white-space pre
color #9dbb00 color #9dbb00
background isDark ? linear-gradient(to bottom, #314027 0%, #282c37 100%) : linear-gradient(to bottom, #edfde2 0%, #fff 100%) background isDark ? linear-gradient(to bottom, #314027 0%, #282c37 100%) : linear-gradient(to bottom, #edfde2 0%, #fff 100%)

View File

@ -29,7 +29,7 @@ export default Vue.extend({
style(): any { style(): any {
if (this.user.bannerUrl == null) return {}; if (this.user.bannerUrl == null) return {};
return { return {
backgroundColor: this.user.bannerColor ? `rgb(${ this.user.bannerColor.join(',') })` : null, backgroundColor: this.user.bannerColor && this.user.bannerColor.length == 3 ? `rgb(${ this.user.bannerColor.join(',') })` : null,
backgroundImage: `url(${ this.user.bannerUrl })` backgroundImage: `url(${ this.user.bannerUrl })`
}; };
} }

View File

@ -86,7 +86,7 @@ export default Vue.extend({
return this.file.type.split('/')[0]; return this.file.type.split('/')[0];
}, },
style(): any { style(): any {
return this.file.properties.avgColor ? { return this.file.properties.avgColor && this.file.properties.avgColor.length == 3 ? {
'background-color': `rgb(${ this.file.properties.avgColor.join(',') })` 'background-color': `rgb(${ this.file.properties.avgColor.join(',') })`
} : {}; } : {};
} }

View File

@ -42,7 +42,7 @@ export default Vue.extend({
}, },
thumbnail(): any { thumbnail(): any {
return { return {
'background-color': this.file.properties.avgColor ? `rgb(${this.file.properties.avgColor.join(',')})` : 'transparent', 'background-color': this.file.properties.avgColor && this.file.properties.avgColor.length == 3 ? `rgb(${this.file.properties.avgColor.join(',')})` : 'transparent',
'background-image': `url(${this.file.url}?thumbnail&size=128)` 'background-image': `url(${this.file.url}?thumbnail&size=128)`
}; };
} }

View File

@ -18,7 +18,7 @@ export default Vue.extend({
computed: { computed: {
style(): any { style(): any {
return { return {
'background-color': this.image.properties.avgColor ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent', 'background-color': this.image.properties.avgColor && this.image.properties.avgColor.length == 3 ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent',
'background-image': this.raw ? `url(${this.image.url})` : `url(${this.image.url}?thumbnail&size=512)` 'background-image': this.raw ? `url(${this.image.url})` : `url(${this.image.url}?thumbnail&size=512)`
}; };
} }

View File

@ -69,8 +69,9 @@ root(isDark)
text-decoration underline text-decoration underline
> .username > .username
text-align left
margin 0 .5em 0 0 margin 0 .5em 0 0
overflow hidden
text-overflow ellipsis
color isDark ? #606984 : #d1d8da color isDark ? #606984 : #d1d8da
> .time > .time

View File

@ -268,6 +268,7 @@ root(isDark)
align-items center align-items center
padding 8px 16px padding 8px 16px
line-height 28px line-height 28px
white-space pre
color #9dbb00 color #9dbb00
background isDark ? linear-gradient(to bottom, #314027 0%, #282c37 100%) : linear-gradient(to bottom, #edfde2 0%, #fff 100%) background isDark ? linear-gradient(to bottom, #314027 0%, #282c37 100%) : linear-gradient(to bottom, #edfde2 0%, #fff 100%)

View File

@ -84,7 +84,7 @@ export default Vue.extend({
style(): any { style(): any {
if (this.user.bannerUrl == null) return {}; if (this.user.bannerUrl == null) return {};
return { return {
backgroundColor: this.user.bannerColor ? `rgb(${ this.user.bannerColor.join(',') })` : null, backgroundColor: this.user.bannerColor && this.user.bannerColor.length == 3 ? `rgb(${ this.user.bannerColor.join(',') })` : null,
backgroundImage: `url(${ this.user.bannerUrl })` backgroundImage: `url(${ this.user.bannerUrl })`
}; };
} }

View File

@ -3,7 +3,9 @@ import summaly from 'summaly';
module.exports = async (ctx: Koa.Context) => { module.exports = async (ctx: Koa.Context) => {
try { try {
const summary = await summaly(ctx.query.url); const summary = await summaly(ctx.query.url, {
followRedirects: false
});
summary.icon = wrap(summary.icon); summary.icon = wrap(summary.icon);
summary.thumbnail = wrap(summary.thumbnail); summary.thumbnail = wrap(summary.thumbnail);

View File

@ -171,6 +171,9 @@ const addFile = async (
log('calculate average color...'); log('calculate average color...');
const info = await prominence(gm(fs.createReadStream(path), name)).identify();
const isTransparent = info ? info['Channel depth'].Alpha != null : false;
const buffer = await prominence(gm(fs.createReadStream(path), name) const buffer = await prominence(gm(fs.createReadStream(path), name)
.setFormat('ppm') .setFormat('ppm')
.resize(1, 1)) // 1pxのサイズに縮小して平均色を取得するというハック .resize(1, 1)) // 1pxのサイズに縮小して平均色を取得するというハック
@ -182,7 +185,7 @@ const addFile = async (
log(`average color is calculated: ${r}, ${g}, ${b}`); log(`average color is calculated: ${r}, ${g}, ${b}`);
return [r, g, b]; return isTransparent ? [r, g, b, 255] : [r, g, b];
})(), })(),
// folder // folder
(async () => { (async () => {