Compare commits
5 Commits
Author | SHA1 | Date | |
---|---|---|---|
4c3dccfc0b | |||
1075e3a005 | |||
dad8fff12d | |||
a6a175ede1 | |||
a01607fd97 |
@ -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:
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
meta:
|
||||||
|
lang: "日本語"
|
||||||
|
divider: ""
|
||||||
|
|
||||||
common:
|
common:
|
||||||
misskey: "Misskeyで皆と共有しよう。"
|
misskey: "Misskeyで皆と共有しよう。"
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
19
src/client/app/common/views/components/acct.vue
Normal file
19
src/client/app/common/views/components/acct.vue
Normal 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>
|
@ -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
|
||||||
};
|
};
|
||||||
|
@ -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);
|
||||||
|
@ -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)`,
|
||||||
|
@ -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)`
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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">
|
||||||
|
@ -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>
|
||||||
|
@ -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
|
||||||
|
@ -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">
|
||||||
|
@ -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%)
|
||||||
|
|
||||||
|
@ -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 })`
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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(',') })`
|
||||||
} : {};
|
} : {};
|
||||||
}
|
}
|
||||||
|
@ -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)`
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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)`
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -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%)
|
||||||
|
|
||||||
|
@ -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 })`
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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 () => {
|
||||||
|
Reference in New Issue
Block a user