Compare commits
63 Commits
Author | SHA1 | Date | |
---|---|---|---|
3b505709c6 | |||
af32d1f81e | |||
67d8773e38 | |||
e445d39c2f | |||
961ed969db | |||
e9a3495225 | |||
6c5a78aeb2 | |||
34e249317a | |||
6d8ea89f09 | |||
64f89ba13e | |||
f6b2f76bbf | |||
1235bef038 | |||
2e11f3a843 | |||
84b7e0bb7d | |||
9f5dc2c0df | |||
e640dbc501 | |||
85db090d9f | |||
9f2d8e1d51 | |||
0c98a90b75 | |||
0047920c1a | |||
e4bb534f20 | |||
3fc04fcdc5 | |||
e542dcac30 | |||
a0b13505a0 | |||
389f9bfea2 | |||
630a534cee | |||
5744c391e6 | |||
b9b05a7401 | |||
359470a263 | |||
3fe934ee62 | |||
3abe632f06 | |||
65961bc15b | |||
12f932d48a | |||
54e9147782 | |||
31b7626d01 | |||
200ebefe92 | |||
9d29a2e85a | |||
c62a225542 | |||
d5d995a3e6 | |||
b7f10fdc10 | |||
cbba03b376 | |||
f84e9c7dc8 | |||
a22ddb1fb9 | |||
0d23ce3d45 | |||
9719387bee | |||
dca110ebaa | |||
136f23c7ad | |||
0963e6d6e1 | |||
712802e682 | |||
abe99c3c73 | |||
d7a3b71028 | |||
10c434f24a | |||
fe46c53ea6 | |||
cdd123dfd3 | |||
a1a3ee44b5 | |||
4e7fbd8967 | |||
a86c419f95 | |||
e3ec0ad97e | |||
75791981ce | |||
e813fe16b9 | |||
42ac7b954d | |||
c1bbf5dab6 | |||
e16dc2a910 |
@ -23,6 +23,10 @@ jobs:
|
|||||||
executor: default
|
executor: default
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
|
- run:
|
||||||
|
name: Ensure package-lock.json
|
||||||
|
command: |
|
||||||
|
[ ! -e package-lock.json ] && echo '{}' > package-lock.json
|
||||||
- restore_cache:
|
- restore_cache:
|
||||||
name: Restore npm package caches
|
name: Restore npm package caches
|
||||||
keys:
|
keys:
|
||||||
@ -35,6 +39,7 @@ jobs:
|
|||||||
name: Install Dependencies
|
name: Install Dependencies
|
||||||
command: |
|
command: |
|
||||||
npm install
|
npm install
|
||||||
|
npm prune
|
||||||
- run:
|
- run:
|
||||||
name: Configure
|
name: Configure
|
||||||
command: |
|
command: |
|
||||||
@ -50,8 +55,8 @@ jobs:
|
|||||||
key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
|
key: npm-v1-arch-{{ arch }}-env-{{ .Environment.variableName }}-package-{{ checksum "package.json" }}-lock-{{ checksum "package-lock.json" }}-ls-{{ checksum "ls" }}
|
||||||
paths:
|
paths:
|
||||||
- node_modules
|
- node_modules
|
||||||
- store_artifacts:
|
# - store_artifacts:
|
||||||
path: built
|
# path: built
|
||||||
- persist_to_workspace:
|
- persist_to_workspace:
|
||||||
root: .
|
root: .
|
||||||
paths:
|
paths:
|
||||||
@ -98,7 +103,6 @@ jobs:
|
|||||||
name: Build
|
name: Build
|
||||||
command: |
|
command: |
|
||||||
docker build . | tee docker.log
|
docker build . | tee docker.log
|
||||||
tail -n 1 docker.log | read __Successfully __built tag
|
|
||||||
- when:
|
- when:
|
||||||
condition: <<parameters.with_deploy>>
|
condition: <<parameters.with_deploy>>
|
||||||
steps:
|
steps:
|
||||||
@ -107,6 +111,7 @@ jobs:
|
|||||||
command: |
|
command: |
|
||||||
if [ "$DOCKERHUB_USERNAME$DOCKERHUB_PASSWORD" ]
|
if [ "$DOCKERHUB_USERNAME$DOCKERHUB_PASSWORD" ]
|
||||||
then
|
then
|
||||||
|
tail -n 1 docker.log | read __Successfully __built tag
|
||||||
docker tag $tag misskey/misskey
|
docker tag $tag misskey/misskey
|
||||||
docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD
|
docker login -u $DOCKERHUB_USERNAME -p $DOCKERHUB_PASSWORD
|
||||||
docker push misskey/misskey
|
docker push misskey/misskey
|
||||||
@ -126,10 +131,13 @@ workflows:
|
|||||||
without_redis: "true"
|
without_redis: "true"
|
||||||
requires:
|
requires:
|
||||||
- build
|
- build
|
||||||
- docker:
|
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
ignore: master
|
only: master
|
||||||
|
# - docker:
|
||||||
|
# filters:
|
||||||
|
# branches:
|
||||||
|
# ignore: master
|
||||||
- docker:
|
- docker:
|
||||||
with_deploy: "true"
|
with_deploy: "true"
|
||||||
filters:
|
filters:
|
||||||
|
@ -167,6 +167,3 @@ drive:
|
|||||||
# external: true
|
# external: true
|
||||||
# engine: http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}
|
# engine: http://vinayaka.distsn.org/cgi-bin/vinayaka-user-match-misskey-api.cgi?{{host}}+{{user}}+{{limit}}+{{offset}}
|
||||||
# timeout: 300000
|
# timeout: 300000
|
||||||
|
|
||||||
# Max allowed note text length in charactors
|
|
||||||
maxNoteTextLength: 1000
|
|
||||||
|
41
.travis.yml
41
.travis.yml
@ -1,41 +0,0 @@
|
|||||||
# travis file
|
|
||||||
# https://docs.travis-ci.com/user/customizing-the-build
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email: false
|
|
||||||
|
|
||||||
branches:
|
|
||||||
except:
|
|
||||||
- l10n_master
|
|
||||||
|
|
||||||
language: node_js
|
|
||||||
|
|
||||||
node_js:
|
|
||||||
- 11.0.0
|
|
||||||
|
|
||||||
env:
|
|
||||||
- CXX=g++-4.8 NODE_ENV=production
|
|
||||||
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
packages:
|
|
||||||
- g++-4.8
|
|
||||||
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- node_modules
|
|
||||||
|
|
||||||
services:
|
|
||||||
- mongodb
|
|
||||||
- redis-server
|
|
||||||
|
|
||||||
before_script:
|
|
||||||
- npm install
|
|
||||||
|
|
||||||
# 設定ファイルを配置
|
|
||||||
- cp ./.ci/default.yml ./.config
|
|
||||||
- cp ./.ci/test.yml ./.config
|
|
||||||
|
|
||||||
- travis_wait npm run build
|
|
@ -23,5 +23,5 @@ Please use [Crowdin](https://crowdin.com/project/misskey) for localization.
|
|||||||
* Test codes are located in `/test`.
|
* Test codes are located in `/test`.
|
||||||
|
|
||||||
## Continuous integration
|
## Continuous integration
|
||||||
Misskey uses Travis for automated test.
|
Misskey uses CircleCI for automated test.
|
||||||
Configuration files are located in `/.travis`.
|
Configuration files are located in `/.circleci`.
|
||||||
|
@ -4,7 +4,6 @@
|
|||||||
================================================================
|
================================================================
|
||||||
|
|
||||||
[](https://circleci.com/gh/syuilo/misskey)
|
[](https://circleci.com/gh/syuilo/misskey)
|
||||||
[![][travis-badge]][travis-link]
|
|
||||||
[![][dependencies-badge]][dependencies-link]
|
[![][dependencies-badge]][dependencies-link]
|
||||||
[](http://makeapullrequest.com)
|
[](http://makeapullrequest.com)
|
||||||
|
|
||||||
@ -44,7 +43,7 @@ Easiest way to tell your emotions. Misskey allows you to add various type of rea
|
|||||||
|
|
||||||
<h3 align="left">Interface</h3>
|
<h3 align="left">Interface</h3>
|
||||||
<p align="left">
|
<p align="left">
|
||||||
No UI fits for everyone. Therefore, Misskey has a highly customizable UI for your taste. You can edit layouts of your timeline, place selectable widgets you can easily move and create your unique home as this place will be your home.
|
Highly customizable UI for your taste. We understand no UI fits for everyone. You can edit layouts of your timeline, place selectable widgets you can easily move and create your unique home as this place will be your home.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
---
|
---
|
||||||
@ -124,8 +123,6 @@ Misskey is an open-source software licensed under the [GNU AGPLv3](LICENSE).
|
|||||||
|
|
||||||
[agpl-3.0]: https://www.gnu.org/licenses/agpl-3.0.en.html
|
[agpl-3.0]: https://www.gnu.org/licenses/agpl-3.0.en.html
|
||||||
[agpl-3.0-badge]: https://img.shields.io/badge/license-AGPL--3.0-444444.svg?style=flat-square
|
[agpl-3.0-badge]: https://img.shields.io/badge/license-AGPL--3.0-444444.svg?style=flat-square
|
||||||
[travis-link]: https://travis-ci.org/syuilo/misskey
|
|
||||||
[travis-badge]: http://img.shields.io/travis/syuilo/misskey/master.svg?style=flat-square
|
|
||||||
[dependencies-link]: https://david-dm.org/syuilo/misskey
|
[dependencies-link]: https://david-dm.org/syuilo/misskey
|
||||||
[dependencies-badge]: https://img.shields.io/david/syuilo/misskey.svg?style=flat-square
|
[dependencies-badge]: https://img.shields.io/david/syuilo/misskey.svg?style=flat-square
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
Please install and setup these softwares:
|
Please install and setup these softwares:
|
||||||
|
|
||||||
#### Dependencies :package:
|
#### Dependencies :package:
|
||||||
* **[Node.js](https://nodejs.org/en/)**
|
* **[Node.js](https://nodejs.org/en/)** >= 10.0.0
|
||||||
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
|
||||||
|
|
||||||
##### Optional
|
##### Optional
|
||||||
|
@ -22,7 +22,7 @@ adduser --disabled-password --disabled-login misskey
|
|||||||
これらのソフトウェアをインストール・設定してください:
|
これらのソフトウェアをインストール・設定してください:
|
||||||
|
|
||||||
#### 依存関係 :package:
|
#### 依存関係 :package:
|
||||||
* **[Node.js](https://nodejs.org/en/)**
|
* **[Node.js](https://nodejs.org/en/)** (10.0.0以上)
|
||||||
* **[MongoDB](https://www.mongodb.com/)** (3.6以上)
|
* **[MongoDB](https://www.mongodb.com/)** (3.6以上)
|
||||||
|
|
||||||
##### オプション
|
##### オプション
|
||||||
|
@ -21,7 +21,6 @@ import * as htmlmin from 'gulp-htmlmin';
|
|||||||
const uglifyes = require('uglify-es');
|
const uglifyes = require('uglify-es');
|
||||||
|
|
||||||
const locales = require('./locales');
|
const locales = require('./locales');
|
||||||
import { fa } from './src/misc/fa';
|
|
||||||
|
|
||||||
const uglify = uglifyComposer(uglifyes, console);
|
const uglify = uglifyComposer(uglifyes, console);
|
||||||
|
|
||||||
@ -164,8 +163,7 @@ gulp.task('build:client:pug', [
|
|||||||
gulp.src('./src/client/app/base.pug')
|
gulp.src('./src/client/app/base.pug')
|
||||||
.pipe(pug({
|
.pipe(pug({
|
||||||
locals: {
|
locals: {
|
||||||
themeColor: constants.themeColor,
|
themeColor: constants.themeColor
|
||||||
facss: fa.dom.css()
|
|
||||||
}
|
}
|
||||||
}))
|
}))
|
||||||
.pipe(htmlmin({
|
.pipe(htmlmin({
|
||||||
|
@ -131,6 +131,7 @@ common:
|
|||||||
show-full-acct: "ユーザー名のホストを省略しない"
|
show-full-acct: "ユーザー名のホストを省略しない"
|
||||||
reduce-motion: "UIの動きを減らす"
|
reduce-motion: "UIの動きを減らす"
|
||||||
this-setting-is-this-device-only: "このデバイスのみ"
|
this-setting-is-this-device-only: "このデバイスのみ"
|
||||||
|
use-os-default-emojis: "OS標準の絵文字を使用"
|
||||||
|
|
||||||
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
do-not-use-in-production: 'これは開発ビルドです。本番環境で使用しないでください。'
|
||||||
|
|
||||||
@ -1077,10 +1078,12 @@ admin/views/instance.vue:
|
|||||||
instance-name: "インスタンス名"
|
instance-name: "インスタンス名"
|
||||||
instance-description: "インスタンスの紹介"
|
instance-description: "インスタンスの紹介"
|
||||||
banner-url: "バナー画像URL"
|
banner-url: "バナー画像URL"
|
||||||
disableRegistration: "ユーザー登録の受付を停止する"
|
max-note-text-length: "投稿の最大文字数"
|
||||||
disableLocalTimeline: "ローカルタイムラインを無効にする"
|
disable-registration: "ユーザー登録の受付を停止する"
|
||||||
|
disable-local-timeline: "ローカルタイムラインを無効にする"
|
||||||
invite: "招待"
|
invite: "招待"
|
||||||
save: "保存"
|
save: "保存"
|
||||||
|
saved: "保存しました"
|
||||||
|
|
||||||
admin/views/charts.vue:
|
admin/views/charts.vue:
|
||||||
title: "チャート"
|
title: "チャート"
|
||||||
@ -1132,10 +1135,15 @@ admin/views/emoji.vue:
|
|||||||
url: "絵文字画像URL"
|
url: "絵文字画像URL"
|
||||||
add: "追加"
|
add: "追加"
|
||||||
info: "50KB以下のPNG画像をおすすめします。"
|
info: "50KB以下のPNG画像をおすすめします。"
|
||||||
|
added: "絵文字を登録しました"
|
||||||
emojis:
|
emojis:
|
||||||
title: "絵文字一覧"
|
title: "絵文字一覧"
|
||||||
update: "更新"
|
update: "更新"
|
||||||
remove: "削除"
|
remove: "削除"
|
||||||
|
updated: "更新しました"
|
||||||
|
remove-emoji:
|
||||||
|
are-you-sure: "「$1」を削除しますか?"
|
||||||
|
removed: "削除しました"
|
||||||
|
|
||||||
admin/views/announcements.vue:
|
admin/views/announcements.vue:
|
||||||
announcements: "お知らせ"
|
announcements: "お知らせ"
|
||||||
@ -1144,6 +1152,10 @@ admin/views/announcements.vue:
|
|||||||
add: "追加"
|
add: "追加"
|
||||||
title: "タイトル"
|
title: "タイトル"
|
||||||
text: "内容"
|
text: "内容"
|
||||||
|
saved: "保存しました"
|
||||||
|
_remove:
|
||||||
|
are-you-sure: "「$1」を削除しますか?"
|
||||||
|
removed: "削除しました"
|
||||||
|
|
||||||
admin/views/hashtags.vue:
|
admin/views/hashtags.vue:
|
||||||
hided-tags: "Hidden Tags"
|
hided-tags: "Hidden Tags"
|
||||||
|
14
package.json
14
package.json
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"author": "syuilo <i@syuilo.com>",
|
"author": "syuilo <i@syuilo.com>",
|
||||||
"version": "10.38.6",
|
"version": "10.40.1",
|
||||||
"clientVersion": "1.0.11516",
|
"clientVersion": "1.0.11579",
|
||||||
"codename": "nighthike",
|
"codename": "nighthike",
|
||||||
"main": "./built/index.js",
|
"main": "./built/index.js",
|
||||||
"private": true,
|
"private": true,
|
||||||
@ -20,10 +20,11 @@
|
|||||||
"format": "gulp format"
|
"format": "gulp format"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@fortawesome/fontawesome-svg-core": "1.2.6",
|
"@fortawesome/fontawesome-svg-core": "1.2.8",
|
||||||
"@fortawesome/free-brands-svg-icons": "5.4.1",
|
"@fortawesome/free-brands-svg-icons": "5.5.0",
|
||||||
"@fortawesome/free-regular-svg-icons": "5.4.1",
|
"@fortawesome/free-regular-svg-icons": "5.5.0",
|
||||||
"@fortawesome/free-solid-svg-icons": "5.4.1",
|
"@fortawesome/free-solid-svg-icons": "5.5.0",
|
||||||
|
"@fortawesome/vue-fontawesome": "0.1.2",
|
||||||
"@koa/cors": "2.2.2",
|
"@koa/cors": "2.2.2",
|
||||||
"@prezzemolo/rap": "0.1.2",
|
"@prezzemolo/rap": "0.1.2",
|
||||||
"@prezzemolo/zip": "0.0.3",
|
"@prezzemolo/zip": "0.0.3",
|
||||||
@ -215,7 +216,6 @@
|
|||||||
"vue-content-loading": "1.5.3",
|
"vue-content-loading": "1.5.3",
|
||||||
"vue-cropperjs": "2.2.2",
|
"vue-cropperjs": "2.2.2",
|
||||||
"vue-js-modal": "1.3.26",
|
"vue-js-modal": "1.3.26",
|
||||||
"vue-json-tree-view": "2.1.4",
|
|
||||||
"vue-loader": "15.4.2",
|
"vue-loader": "15.4.2",
|
||||||
"vue-router": "3.0.1",
|
"vue-router": "3.0.1",
|
||||||
"vue-style-loader": "4.1.2",
|
"vue-style-loader": "4.1.2",
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="cdeuzmsthagexbkpofbmatmugjuvogfb">
|
<div class="cdeuzmsthagexbkpofbmatmugjuvogfb">
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">%fa:broadcast-tower% %i18n:@announcements%</div>
|
<div slot="title"><fa icon="broadcast-tower"/> %i18n:@announcements%</div>
|
||||||
<section v-for="(announcement, i) in announcements" class="fit-top">
|
<section v-for="(announcement, i) in announcements" class="fit-top">
|
||||||
<ui-input v-model="announcement.title" @change="save">
|
<ui-input v-model="announcement.title" @change="save">
|
||||||
<span>%i18n:@title%</span>
|
<span>%i18n:@title%</span>
|
||||||
@ -10,12 +10,12 @@
|
|||||||
<span>%i18n:@text%</span>
|
<span>%i18n:@text%</span>
|
||||||
</ui-textarea>
|
</ui-textarea>
|
||||||
<ui-horizon-group>
|
<ui-horizon-group>
|
||||||
<ui-button @click="save">%fa:save R% %i18n:@save%</ui-button>
|
<ui-button @click="save()"><fa :icon="['far', 'save']"/> %i18n:@save%</ui-button>
|
||||||
<ui-button @click="remove(i)">%fa:trash-alt R% %i18n:@remove%</ui-button>
|
<ui-button @click="remove(i)"><fa :icon="['far', 'trash-alt']"/> %i18n:@remove%</ui-button>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
</section>
|
</section>
|
||||||
<section>
|
<section>
|
||||||
<ui-button @click="add">%fa:plus% %i18n:@add%</ui-button>
|
<ui-button @click="add"><fa icon="plus"/> %i18n:@add%</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
</div>
|
</div>
|
||||||
@ -46,17 +46,36 @@ export default Vue.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
remove(i) {
|
remove(i) {
|
||||||
|
this.$swal({
|
||||||
|
type: 'warning',
|
||||||
|
text: '%i18n:@_remove.are-you-sure%'.replace('$1', this.announcements.find((_, j) => j == i).title),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(res => {
|
||||||
|
if (!res.value) return;
|
||||||
this.announcements = this.announcements.filter((_, j) => j !== i);
|
this.announcements = this.announcements.filter((_, j) => j !== i);
|
||||||
this.save();
|
this.save(true);
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@_remove.removed%'
|
||||||
|
});
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
save() {
|
save(silent) {
|
||||||
(this as any).api('admin/update-meta', {
|
(this as any).api('admin/update-meta', {
|
||||||
broadcasts: this.announcements
|
broadcasts: this.announcements
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
//(this as any).os.apis.dialog({ text: `Saved` });
|
if (!silent) {
|
||||||
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@saved%'
|
||||||
|
});
|
||||||
|
}
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
//(this as any).os.apis.dialog({ text: `Failed ${e}` });
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,10 +3,10 @@
|
|||||||
<table>
|
<table>
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>%fa:exchange-alt% In/Out</th>
|
<th><fa icon="exchange-alt"/> In/Out</th>
|
||||||
<th>%fa:server% Host</th>
|
<th><fa icon="server"/> Host</th>
|
||||||
<th>%fa:bolt% Activity</th>
|
<th><fa icon="bolt"/> Activity</th>
|
||||||
<th>%fa:user% Actor</th>
|
<th><fa icon="user"/> Actor</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="qvgidhudpqhjttdhxubzuyrhyzgslujw">
|
<div class="qvgidhudpqhjttdhxubzuyrhyzgslujw">
|
||||||
<header>
|
<header>
|
||||||
<b>%fa:chart-bar R% %i18n:@title%:</b>
|
<b><fa :icon="['far', 'chart-bar']"/> %i18n:@title%:</b>
|
||||||
<select v-model="src">
|
<select v-model="src">
|
||||||
<optgroup label="%i18n:@federation%">
|
<optgroup label="%i18n:@federation%">
|
||||||
<option value="federation-instances">%i18n:@charts.federation-instances%</option>
|
<option value="federation-instances">%i18n:@charts.federation-instances%</option>
|
||||||
|
@ -2,14 +2,14 @@
|
|||||||
<div class="zyknedwtlthezamcjlolyusmipqmjgxz">
|
<div class="zyknedwtlthezamcjlolyusmipqmjgxz">
|
||||||
<div>
|
<div>
|
||||||
<header>
|
<header>
|
||||||
<span>%fa:microchip% CPU <span>{{ cpuP }}%</span></span>
|
<span><fa icon="microchip"/> CPU <span>{{ cpuP }}%</span></span>
|
||||||
<span v-if="meta">{{ meta.cpu.model }}</span>
|
<span v-if="meta">{{ meta.cpu.model }}</span>
|
||||||
</header>
|
</header>
|
||||||
<div ref="cpu"></div>
|
<div ref="cpu"></div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<header>
|
<header>
|
||||||
<span>%fa:memory% MEM <span>{{ memP }}%</span></span>
|
<span><fa icon="memory"/> MEM <span>{{ memP }}%</span></span>
|
||||||
<span v-if="meta"></span>
|
<span v-if="meta"></span>
|
||||||
</header>
|
</header>
|
||||||
<div ref="mem"></div>
|
<div ref="mem"></div>
|
||||||
|
@ -11,54 +11,54 @@
|
|||||||
<div v-if="stats" class="stats">
|
<div v-if="stats" class="stats">
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<div>%fa:user%</div>
|
<div><fa icon="user"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@accounts%</span>
|
<span>%i18n:@accounts%</span>
|
||||||
<b class="primary">{{ stats.originalUsersCount | number }}</b>
|
<b class="primary">{{ stats.originalUsersCount | number }}</b>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span>%fa:home% %i18n:@this-instance%</span>
|
<span><fa icon="home"/> %i18n:@this-instance%</span>
|
||||||
<span @click="setChartSrc('users')">%fa:chart-bar R%</span>
|
<span @click="setChartSrc('users')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<div>%fa:pencil-alt%</div>
|
<div><fa icon="pencil-alt"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@notes%</span>
|
<span>%i18n:@notes%</span>
|
||||||
<b class="primary">{{ stats.originalNotesCount | number }}</b>
|
<b class="primary">{{ stats.originalNotesCount | number }}</b>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span>%fa:home% %i18n:@this-instance%</span>
|
<span><fa icon="home"/> %i18n:@this-instance%</span>
|
||||||
<span @click="setChartSrc('notes')">%fa:chart-bar R%</span>
|
<span @click="setChartSrc('notes')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<div>%fa:database%</div>
|
<div><fa icon="database"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@drive%</span>
|
<span>%i18n:@drive%</span>
|
||||||
<b>{{ stats.driveUsageLocal | bytes }}</b>
|
<b>{{ stats.driveUsageLocal | bytes }}</b>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span>%fa:home% %i18n:@this-instance%</span>
|
<span><fa icon="home"/> %i18n:@this-instance%</span>
|
||||||
<span @click="setChartSrc('drive')">%fa:chart-bar R%</span>
|
<span @click="setChartSrc('drive')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div>
|
<div>
|
||||||
<div>%fa:hdd R%</div>
|
<div><fa :icon="['far', 'hdd']"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@instances%</span>
|
<span>%i18n:@instances%</span>
|
||||||
<b>{{ stats.instances | number }}</b>
|
<b>{{ stats.instances | number }}</b>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<span>%fa:globe% %i18n:@federated%</span>
|
<span><fa icon="globe"/> %i18n:@federated%</span>
|
||||||
<span @click="setChartSrc('federation-instances-total')">%fa:chart-bar R%</span>
|
<span @click="setChartSrc('federation-instances-total')"><fa :icon="['far', 'chart-bar']"/></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="tumhkfkmgtvzljezfvmgkeurkfncshbe">
|
<div class="tumhkfkmgtvzljezfvmgkeurkfncshbe">
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">%fa:plus% %i18n:@add-emoji.title%</div>
|
<div slot="title"><fa icon="plus"/> %i18n:@add-emoji.title%</div>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
<ui-input v-model="name">
|
<ui-input v-model="name">
|
||||||
@ -22,7 +22,7 @@
|
|||||||
</ui-card>
|
</ui-card>
|
||||||
|
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">%fa:grin R% %i18n:@emojis.title%</div>
|
<div slot="title"><fa :icon="['far', 'grin']"/> %i18n:@emojis.title%</div>
|
||||||
<section v-for="emoji in emojis">
|
<section v-for="emoji in emojis">
|
||||||
<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
|
<img :src="emoji.url" :alt="emoji.name" style="width: 64px;"/>
|
||||||
<ui-horizon-group inputs>
|
<ui-horizon-group inputs>
|
||||||
@ -37,8 +37,8 @@
|
|||||||
<span>%i18n:@add-emoji.url%</span>
|
<span>%i18n:@add-emoji.url%</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-horizon-group>
|
<ui-horizon-group>
|
||||||
<ui-button @click="updateEmoji(emoji)">%fa:save R% %i18n:@emojis.update%</ui-button>
|
<ui-button @click="updateEmoji(emoji)"><fa :icon="['far', 'save']"/> %i18n:@emojis.update%</ui-button>
|
||||||
<ui-button @click="removeEmoji(emoji)">%fa:trash-alt R% %i18n:@emojis.remove%</ui-button>
|
<ui-button @click="removeEmoji(emoji)"><fa :icon="['far', 'trash-alt']"/> %i18n:@emojis.remove%</ui-button>
|
||||||
</ui-horizon-group>
|
</ui-horizon-group>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
@ -67,17 +67,24 @@ export default Vue.extend({
|
|||||||
(this as any).api('admin/emoji/add', {
|
(this as any).api('admin/emoji/add', {
|
||||||
name: this.name,
|
name: this.name,
|
||||||
url: this.url,
|
url: this.url,
|
||||||
aliases: this.aliases.split(' ')
|
aliases: this.aliases.split(' ').filter(x => x.length > 0)
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
//(this as any).os.apis.dialog({ text: `Added` });
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@add-emoji.added%'
|
||||||
|
});
|
||||||
this.fetchEmojis();
|
this.fetchEmojis();
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
//(this as any).os.apis.dialog({ text: `Failed ${e}` });
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
fetchEmojis() {
|
fetchEmojis() {
|
||||||
(this as any).api('admin/emoji/list').then(emojis => {
|
(this as any).api('admin/emoji/list').then(emojis => {
|
||||||
|
emojis.reverse();
|
||||||
emojis.forEach(e => e.aliases = (e.aliases || []).join(' '));
|
emojis.forEach(e => e.aliases = (e.aliases || []).join(' '));
|
||||||
this.emojis = emojis;
|
this.emojis = emojis;
|
||||||
});
|
});
|
||||||
@ -88,22 +95,42 @@ export default Vue.extend({
|
|||||||
id: emoji.id,
|
id: emoji.id,
|
||||||
name: emoji.name,
|
name: emoji.name,
|
||||||
url: emoji.url,
|
url: emoji.url,
|
||||||
aliases: emoji.aliases.split(' ')
|
aliases: emoji.aliases.split(' ').filter(x => x.length > 0)
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
//(this as any).os.apis.dialog({ text: `Updated` });
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@updated%'
|
||||||
|
});
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
//(this as any).os.apis.dialog({ text: `Failed ${e}` });
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
removeEmoji(emoji) {
|
removeEmoji(emoji) {
|
||||||
|
this.$swal({
|
||||||
|
type: 'warning',
|
||||||
|
text: '%i18n:@remove-emoji.are-you-sure%'.replace('$1', emoji.name),
|
||||||
|
showCancelButton: true
|
||||||
|
}).then(res => {
|
||||||
|
if (!res.value) return;
|
||||||
|
|
||||||
(this as any).api('admin/emoji/remove', {
|
(this as any).api('admin/emoji/remove', {
|
||||||
id: emoji.id
|
id: emoji.id
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
//(this as any).os.apis.dialog({ text: `Removed` });
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@remove-emoji.removed%'
|
||||||
|
});
|
||||||
this.fetchEmojis();
|
this.fetchEmojis();
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
//(this as any).os.apis.dialog({ text: `Failed ${e}` });
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-admin" :class="{ isMobile }">
|
<div class="mk-admin" :class="{ isMobile }">
|
||||||
<header v-show="isMobile">
|
<header v-show="isMobile">
|
||||||
<button class="nav" @click="navOpend = true">%fa:bars%</button>
|
<button class="nav" @click="navOpend = true"><fa icon="bars"/></button>
|
||||||
<span>MisskeyMyAdmin</span>
|
<span>MisskeyMyAdmin</span>
|
||||||
</header>
|
</header>
|
||||||
<div class="nav-backdrop"
|
<div class="nav-backdrop"
|
||||||
@ -18,30 +18,30 @@
|
|||||||
<p class="name">{{ $store.state.i | userName }}</p>
|
<p class="name">{{ $store.state.i | userName }}</p>
|
||||||
</div>
|
</div>
|
||||||
<ul>
|
<ul>
|
||||||
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }">%fa:home .fw%%i18n:@dashboard%</li>
|
<li @click="nav('dashboard')" :class="{ active: page == 'dashboard' }"><fa icon="home" fixed-width/>%i18n:@dashboard%</li>
|
||||||
<li @click="nav('instance')" :class="{ active: page == 'instance' }">%fa:cog .fw%%i18n:@instance%</li>
|
<li @click="nav('instance')" :class="{ active: page == 'instance' }"><fa icon="cog" fixed-width/>%i18n:@instance%</li>
|
||||||
<li @click="nav('users')" :class="{ active: page == 'users' }">%fa:users .fw%%i18n:@users%</li>
|
<li @click="nav('users')" :class="{ active: page == 'users' }"><fa icon="users" fixed-width/>%i18n:@users%</li>
|
||||||
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }">%fa:grin R .fw%%i18n:@emoji%</li>
|
<li @click="nav('emoji')" :class="{ active: page == 'emoji' }"><fa :icon="['far', 'grin']" fixed-width/>%i18n:@emoji%</li>
|
||||||
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }">%fa:broadcast-tower .fw%%i18n:@announcements%</li>
|
<li @click="nav('announcements')" :class="{ active: page == 'announcements' }"><fa icon="broadcast-tower" fixed-width/>%i18n:@announcements%</li>
|
||||||
<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }">%fa:hashtag .fw%%i18n:@hashtags%</li>
|
<li @click="nav('hashtags')" :class="{ active: page == 'hashtags' }"><fa icon="hashtag" fixed-width/>%i18n:@hashtags%</li>
|
||||||
|
|
||||||
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }">%fa:cloud .fw%%i18n:common.drive%</li> -->
|
<!-- <li @click="nav('drive')" :class="{ active: page == 'drive' }"><fa icon="cloud" fixed-width/>%i18n:common.drive%</li> -->
|
||||||
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
|
<!-- <li @click="nav('update')" :class="{ active: page == 'update' }">%i18n:@update%</li> -->
|
||||||
</ul>
|
</ul>
|
||||||
<div class="back-to-misskey">
|
<div class="back-to-misskey">
|
||||||
<a href="/">%fa:arrow-left% %i18n:@back-to-misskey%</a>
|
<a href="/"><fa icon="arrow-left"/> %i18n:@back-to-misskey%</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="version">
|
<div class="version">
|
||||||
<small>Misskey {{ version }}</small>
|
<small>Misskey {{ version }}</small>
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
<main>
|
<main>
|
||||||
<div v-show="page == 'dashboard'"><x-dashboard/></div>
|
<div v-if="page == 'dashboard'"><x-dashboard/></div>
|
||||||
<div v-show="page == 'instance'"><x-instance/></div>
|
<div v-if="page == 'instance'"><x-instance/></div>
|
||||||
<div v-if="page == 'users'"><x-users/></div>
|
<div v-if="page == 'users'"><x-users/></div>
|
||||||
<div v-show="page == 'emoji'"><x-emoji/></div>
|
<div v-if="page == 'emoji'"><x-emoji/></div>
|
||||||
<div v-show="page == 'announcements'"><x-announcements/></div>
|
<div v-if="page == 'announcements'"><x-announcements/></div>
|
||||||
<div v-show="page == 'hashtags'"><x-hashtags/></div>
|
<div v-if="page == 'hashtags'"><x-hashtags/></div>
|
||||||
<div v-if="page == 'drive'"></div>
|
<div v-if="page == 'drive'"></div>
|
||||||
<div v-if="page == 'update'"></div>
|
<div v-if="page == 'update'"></div>
|
||||||
</main>
|
</main>
|
||||||
@ -126,7 +126,7 @@ export default Vue.extend({
|
|||||||
line-height $headerHeight
|
line-height $headerHeight
|
||||||
border-right solid 1px rgba(#000, 0.1)
|
border-right solid 1px rgba(#000, 0.1)
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
transition all 0.2s ease
|
transition all 0.2s ease
|
||||||
|
|
||||||
> nav
|
> nav
|
||||||
@ -188,7 +188,7 @@ export default Vue.extend({
|
|||||||
&:hover
|
&:hover
|
||||||
color #fff
|
color #fff
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 6px
|
margin-right 6px
|
||||||
|
|
||||||
> .version
|
> .version
|
||||||
@ -218,7 +218,7 @@ export default Vue.extend({
|
|||||||
&:hover
|
&:hover
|
||||||
color #fff
|
color #fff
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 6px
|
margin-right 6px
|
||||||
|
|
||||||
&.active
|
&.active
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="axbwjelsbymowqjyywpirzhdlszoncqs">
|
<div class="axbwjelsbymowqjyywpirzhdlszoncqs">
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">%fa:cog% %i18n:@instance%</div>
|
<div slot="title"><fa icon="cog"/> %i18n:@instance%</div>
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-input v-model="name">%i18n:@instance-name%</ui-input>
|
<ui-input v-model="name">%i18n:@instance-name%</ui-input>
|
||||||
<ui-textarea v-model="description">%i18n:@instance-description%</ui-textarea>
|
<ui-textarea v-model="description">%i18n:@instance-description%</ui-textarea>
|
||||||
<ui-input v-model="bannerUrl">%i18n:@banner-url%</ui-input>
|
<ui-input v-model="bannerUrl">%i18n:@banner-url%</ui-input>
|
||||||
|
<ui-input v-model="maxNoteTextLength">%i18n:@max-note-text-length%</ui-input>
|
||||||
<ui-button @click="updateMeta">%i18n:@save%</ui-button>
|
<ui-button @click="updateMeta">%i18n:@save%</ui-button>
|
||||||
</section>
|
</section>
|
||||||
</ui-card>
|
</ui-card>
|
||||||
@ -39,6 +40,7 @@ export default Vue.extend({
|
|||||||
bannerUrl: null,
|
bannerUrl: null,
|
||||||
name: null,
|
name: null,
|
||||||
description: null,
|
description: null,
|
||||||
|
maxNoteTextLength: null,
|
||||||
inviteCode: null,
|
inviteCode: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
@ -48,6 +50,7 @@ export default Vue.extend({
|
|||||||
this.bannerUrl = meta.bannerUrl;
|
this.bannerUrl = meta.bannerUrl;
|
||||||
this.name = meta.name;
|
this.name = meta.name;
|
||||||
this.description = meta.description;
|
this.description = meta.description;
|
||||||
|
this.maxNoteTextLength = meta.maxNoteTextLength;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -56,7 +59,10 @@ export default Vue.extend({
|
|||||||
(this as any).api('admin/invite').then(x => {
|
(this as any).api('admin/invite').then(x => {
|
||||||
this.inviteCode = x.code;
|
this.inviteCode = x.code;
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
//(this as any).os.apis.dialog({ text: `Failed ${e}` });
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -66,11 +72,18 @@ export default Vue.extend({
|
|||||||
disableLocalTimeline: this.disableLocalTimeline,
|
disableLocalTimeline: this.disableLocalTimeline,
|
||||||
bannerUrl: this.bannerUrl,
|
bannerUrl: this.bannerUrl,
|
||||||
name: this.name,
|
name: this.name,
|
||||||
description: this.description
|
description: this.description,
|
||||||
|
maxNoteTextLength: parseInt(this.maxNoteTextLength, 10)
|
||||||
}).then(() => {
|
}).then(() => {
|
||||||
//(this as any).os.apis.dialog({ text: `Saved` });
|
this.$swal({
|
||||||
|
type: 'success',
|
||||||
|
text: '%i18n:@saved%'
|
||||||
|
});
|
||||||
}).catch(e => {
|
}).catch(e => {
|
||||||
//(this as any).os.apis.dialog({ text: `Failed ${e}` });
|
this.$swal({
|
||||||
|
type: 'error',
|
||||||
|
text: e
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -128,7 +128,7 @@ pre
|
|||||||
overflow auto
|
overflow auto
|
||||||
tab-size 2
|
tab-size 2
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
display inline-block
|
display inline-block
|
||||||
|
|
||||||
.swal2-container
|
.swal2-container
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">%fa:key% API</div>
|
<div slot="title"><fa icon="key"/> API</div>
|
||||||
|
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-input :value="$store.state.i.token" readonly>
|
<ui-input :value="$store.state.i.token" readonly>
|
||||||
@ -9,11 +9,11 @@
|
|||||||
<p>%i18n:@intro%</p>
|
<p>%i18n:@intro%</p>
|
||||||
<ui-info warn>%i18n:@caution%</ui-info>
|
<ui-info warn>%i18n:@caution%</ui-info>
|
||||||
<p>%i18n:@regeneration-of-token%</p>
|
<p>%i18n:@regeneration-of-token%</p>
|
||||||
<ui-button @click="regenerateToken">%fa:sync-alt% %i18n:@regenerate-token%</ui-button>
|
<ui-button @click="regenerateToken"><fa icon="sync-alt"/> %i18n:@regenerate-token%</ui-button>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<header>%fa:terminal% %i18n:@console.title%</header>
|
<header><fa icon="terminal"/> %i18n:@console.title%</header>
|
||||||
<ui-input v-model="endpoint">
|
<ui-input v-model="endpoint">
|
||||||
<span>%i18n:@console.endpoint%</span>
|
<span>%i18n:@console.endpoint%</span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
@ -22,7 +22,7 @@
|
|||||||
</ui-textarea>
|
</ui-textarea>
|
||||||
<ui-button @click="send" :disabled="sending">
|
<ui-button @click="send" :disabled="sending">
|
||||||
<template v-if="sending">%i18n:@console.sending%</template>
|
<template v-if="sending">%i18n:@console.sending%</template>
|
||||||
<template v-else>%fa:paper-plane% %i18n:@console.send%</template>
|
<template v-else><fa icon="paper-plane"/> %i18n:@console.send%</template>
|
||||||
</ui-button>
|
</ui-button>
|
||||||
<ui-textarea v-if="res" v-model="res" readonly tall>
|
<ui-textarea v-if="res" v-model="res" readonly tall>
|
||||||
<span>%i18n:@console.response%</span>
|
<span>%i18n:@console.response%</span>
|
||||||
|
@ -14,7 +14,8 @@
|
|||||||
</ol>
|
</ol>
|
||||||
<ol class="emojis" ref="suggests" v-if="emojis.length > 0">
|
<ol class="emojis" ref="suggests" v-if="emojis.length > 0">
|
||||||
<li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1">
|
<li v-for="emoji in emojis" @click="complete(type, emoji.emoji)" @keydown="onKeydown" tabindex="-1">
|
||||||
<span class="emoji" v-if="emoji.url"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
<span class="emoji" v-if="emoji.isCustomEmoji"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
||||||
|
<span class="emoji" v-else-if="!useOsDefaultEmojis"><img :src="emoji.url" :alt="emoji.emoji"/></span>
|
||||||
<span class="emoji" v-else>{{ emoji.emoji }}</span>
|
<span class="emoji" v-else>{{ emoji.emoji }}</span>
|
||||||
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
|
<span class="name" v-html="emoji.name.replace(q, `<b>${q}</b>`)"></span>
|
||||||
<span class="alias" v-if="emoji.aliasOf">({{ emoji.aliasOf }})</span>
|
<span class="alias" v-if="emoji.aliasOf">({{ emoji.aliasOf }})</span>
|
||||||
@ -33,6 +34,7 @@ type EmojiDef = {
|
|||||||
name: string;
|
name: string;
|
||||||
aliasOf?: string;
|
aliasOf?: string;
|
||||||
url?: string;
|
url?: string;
|
||||||
|
isCustomEmoji?: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
const lib = Object.entries(emojilib.lib).filter((x: any) => {
|
const lib = Object.entries(emojilib.lib).filter((x: any) => {
|
||||||
@ -42,7 +44,8 @@ const lib = Object.entries(emojilib.lib).filter((x: any) => {
|
|||||||
const emjdb: EmojiDef[] = lib.map((x: any) => ({
|
const emjdb: EmojiDef[] = lib.map((x: any) => ({
|
||||||
emoji: x[1].char,
|
emoji: x[1].char,
|
||||||
name: x[0],
|
name: x[0],
|
||||||
aliasOf: null
|
aliasOf: null,
|
||||||
|
url: `https://twemoji.maxcdn.com/2/svg/${x[1].char.codePointAt(0).toString(16)}.svg`
|
||||||
}));
|
}));
|
||||||
|
|
||||||
lib.forEach((x: any) => {
|
lib.forEach((x: any) => {
|
||||||
@ -51,7 +54,8 @@ lib.forEach((x: any) => {
|
|||||||
emjdb.push({
|
emjdb.push({
|
||||||
emoji: x[1].char,
|
emoji: x[1].char,
|
||||||
name: k,
|
name: k,
|
||||||
aliasOf: x[0]
|
aliasOf: x[0],
|
||||||
|
url: `https://twemoji.maxcdn.com/2/svg/${x[1].char.codePointAt(0).toString(16)}.svg`
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -77,6 +81,10 @@ export default Vue.extend({
|
|||||||
computed: {
|
computed: {
|
||||||
items(): HTMLCollection {
|
items(): HTMLCollection {
|
||||||
return (this.$refs.suggests as Element).children;
|
return (this.$refs.suggests as Element).children;
|
||||||
|
},
|
||||||
|
|
||||||
|
useOsDefaultEmojis(): boolean {
|
||||||
|
return this.$store.state.device.useOsDefaultEmojis;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -107,7 +115,8 @@ export default Vue.extend({
|
|||||||
emojiDefinitions.push({
|
emojiDefinitions.push({
|
||||||
name: x.name,
|
name: x.name,
|
||||||
emoji: `:${x.name}:`,
|
emoji: `:${x.name}:`,
|
||||||
url: x.url
|
url: x.url,
|
||||||
|
isCustomEmoji: true
|
||||||
});
|
});
|
||||||
|
|
||||||
if (x.aliases) {
|
if (x.aliases) {
|
||||||
@ -116,7 +125,8 @@ export default Vue.extend({
|
|||||||
name: alias,
|
name: alias,
|
||||||
aliasOf: x.name,
|
aliasOf: x.name,
|
||||||
emoji: `:${x.name}:`,
|
emoji: `:${x.name}:`,
|
||||||
url: x.url
|
url: x.url,
|
||||||
|
isCustomEmoji: true
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -205,6 +215,11 @@ export default Vue.extend({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (this.type == 'emoji') {
|
} else if (this.type == 'emoji') {
|
||||||
|
if (this.q == null || this.q == '') {
|
||||||
|
this.emojis = this.emojiDb.filter(x => x.isCustomEmoji && !x.aliasOf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const matched = [];
|
const matched = [];
|
||||||
const max = 30;
|
const max = 30;
|
||||||
|
|
||||||
|
@ -1,35 +1,35 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="troubleshooter">
|
<div class="troubleshooter">
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<h1>%fa:wrench%%i18n:@title%</h1>
|
<h1><fa icon="wrench"/>%i18n:@title%</h1>
|
||||||
<div>
|
<div>
|
||||||
<p :data-wip="network == null">
|
<p :data-wip="network == null">
|
||||||
<template v-if="network != null">
|
<template v-if="network != null">
|
||||||
<template v-if="network">%fa:check%</template>
|
<template v-if="network"><fa icon="check"/></template>
|
||||||
<template v-if="!network">%fa:times%</template>
|
<template v-if="!network"><fa icon="times"/></template>
|
||||||
</template>
|
</template>
|
||||||
{{ network == null ? '%i18n:@checking-network%' : '%i18n:@network%' }}<mk-ellipsis v-if="network == null"/>
|
{{ network == null ? '%i18n:@checking-network%' : '%i18n:@network%' }}<mk-ellipsis v-if="network == null"/>
|
||||||
</p>
|
</p>
|
||||||
<p v-if="network == true" :data-wip="internet == null">
|
<p v-if="network == true" :data-wip="internet == null">
|
||||||
<template v-if="internet != null">
|
<template v-if="internet != null">
|
||||||
<template v-if="internet">%fa:check%</template>
|
<template v-if="internet"><fa icon="check"/></template>
|
||||||
<template v-if="!internet">%fa:times%</template>
|
<template v-if="!internet"><fa icon="times"/></template>
|
||||||
</template>
|
</template>
|
||||||
{{ internet == null ? '%i18n:@checking-internet%' : '%i18n:@internet%' }}<mk-ellipsis v-if="internet == null"/>
|
{{ internet == null ? '%i18n:@checking-internet%' : '%i18n:@internet%' }}<mk-ellipsis v-if="internet == null"/>
|
||||||
</p>
|
</p>
|
||||||
<p v-if="internet == true" :data-wip="server == null">
|
<p v-if="internet == true" :data-wip="server == null">
|
||||||
<template v-if="server != null">
|
<template v-if="server != null">
|
||||||
<template v-if="server">%fa:check%</template>
|
<template v-if="server"><fa icon="check"/></template>
|
||||||
<template v-if="!server">%fa:times%</template>
|
<template v-if="!server"><fa icon="times"/></template>
|
||||||
</template>
|
</template>
|
||||||
{{ server == null ? '%i18n:@checking-server%' : '%i18n:@server%' }}<mk-ellipsis v-if="server == null"/>
|
{{ server == null ? '%i18n:@checking-server%' : '%i18n:@server%' }}<mk-ellipsis v-if="server == null"/>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<p v-if="!end">%i18n:@finding%<mk-ellipsis/></p>
|
<p v-if="!end">%i18n:@finding%<mk-ellipsis/></p>
|
||||||
<p v-if="network === false"><b>%fa:exclamation-triangle%%i18n:@no-network%</b><br>%i18n:@no-network-desc%</p>
|
<p v-if="network === false"><b><fa icon="exclamation-triangle"/>%i18n:@no-network%</b><br>%i18n:@no-network-desc%</p>
|
||||||
<p v-if="internet === false"><b>%fa:exclamation-triangle%%i18n:@no-internet%</b><br>%i18n:@no-internet-desc%</p>
|
<p v-if="internet === false"><b><fa icon="exclamation-triangle"/>%i18n:@no-internet%</b><br>%i18n:@no-internet-desc%</p>
|
||||||
<p v-if="server === false"><b>%fa:exclamation-triangle%%i18n:@no-server%</b><br>%i18n:@no-server-desc%</p>
|
<p v-if="server === false"><b><fa icon="exclamation-triangle"/>%i18n:@no-server%</b><br>%i18n:@no-server-desc%</p>
|
||||||
<p v-if="server === true" class="success"><b>%fa:info-circle%%i18n:@success%</b><br>%i18n:@success-desc%</p>
|
<p v-if="server === true" class="success"><b><fa icon="info-circle"/>%i18n:@success%</b><br>%i18n:@success-desc%</p>
|
||||||
</div>
|
</div>
|
||||||
<footer>
|
<footer>
|
||||||
<a href="/assets/flush.html">%i18n:@flush%</a> | <a href="/assets/version.html">%i18n:@set-version%</a>
|
<a href="/assets/flush.html">%i18n:@flush%</a> | <a href="/assets/version.html">%i18n:@set-version%</a>
|
||||||
@ -100,7 +100,7 @@ export default Vue.extend({
|
|||||||
color #444
|
color #444
|
||||||
border-bottom solid 1px #eee
|
border-bottom solid 1px #eee
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
> div
|
> div
|
||||||
@ -115,7 +115,7 @@ export default Vue.extend({
|
|||||||
&[data-wip]
|
&[data-wip]
|
||||||
color #888
|
color #888
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
&.times
|
&.times
|
||||||
@ -132,7 +132,7 @@ export default Vue.extend({
|
|||||||
border-top solid 1px #eee
|
border-top solid 1px #eee
|
||||||
|
|
||||||
> b
|
> b
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
&.success
|
&.success
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-connect-failed">
|
<div class="mk-connect-failed">
|
||||||
<img src="data:image/jpeg;base64,%base64:/assets/error.jpg%" alt=""/>
|
<img src="https://raw.githubusercontent.com/syuilo/misskey/develop/src/client/assets/error.jpg" alt=""/>
|
||||||
<h1>%i18n:@title%</h1>
|
<h1>%i18n:@title%</h1>
|
||||||
<p class="text">
|
<p class="text">
|
||||||
<span>{{ '%i18n:@description%'.substr(0, '%i18n:@description%'.indexOf('{')) }}</span>
|
<span>{{ '%i18n:@description%'.substr(0, '%i18n:@description%'.indexOf('{')) }}</span>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">%fa:cloud% %i18n:common.drive%</div>
|
<div slot="title"><fa icon="cloud"/> %i18n:common.drive%</div>
|
||||||
|
|
||||||
<section v-if="!fetching" class="juakhbxthdewydyreaphkepoxgxvfogn">
|
<section v-if="!fetching" class="juakhbxthdewydyreaphkepoxgxvfogn">
|
||||||
<div class="meter"><div :style="meterStyle"></div></div>
|
<div class="meter"><div :style="meterStyle"></div></div>
|
||||||
|
82
src/client/app/common/views/components/emoji.vue
Normal file
82
src/client/app/common/views/components/emoji.vue
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
<template>
|
||||||
|
<img v-if="customEmoji" class="fvgwvorwhxigeolkkrcderjzcawqrscl custom" :src="url" :alt="alt" :title="alt"/>
|
||||||
|
<img v-else-if="char && !useOsDefaultEmojis" class="fvgwvorwhxigeolkkrcderjzcawqrscl" :src="url" :alt="alt" :title="alt"/>
|
||||||
|
<span v-else-if="char && useOsDefaultEmojis">{{ char }}</span>
|
||||||
|
<span v-else>:{{ name }}:</span>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts">
|
||||||
|
import Vue from 'vue';
|
||||||
|
import { lib } from 'emojilib';
|
||||||
|
|
||||||
|
export default Vue.extend({
|
||||||
|
props: {
|
||||||
|
name: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
emoji: {
|
||||||
|
type: String,
|
||||||
|
required: false
|
||||||
|
},
|
||||||
|
customEmojis: {
|
||||||
|
required: false,
|
||||||
|
default: []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
url: null,
|
||||||
|
char: null,
|
||||||
|
customEmoji: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
computed: {
|
||||||
|
alt(): string {
|
||||||
|
return this.customEmoji ? `:${this.customEmoji.name}:` : this.char;
|
||||||
|
},
|
||||||
|
|
||||||
|
useOsDefaultEmojis(): boolean {
|
||||||
|
return this.$store.state.device.useOsDefaultEmojis;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
created() {
|
||||||
|
if (this.name) {
|
||||||
|
const customEmoji = this.customEmojis.find(x => x.name == this.name);
|
||||||
|
if (customEmoji) {
|
||||||
|
this.customEmoji = customEmoji;
|
||||||
|
this.url = customEmoji.url;
|
||||||
|
} else {
|
||||||
|
const emoji = lib[this.name];
|
||||||
|
if (emoji) {
|
||||||
|
this.char = emoji.char;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
this.char = this.emoji;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.char) {
|
||||||
|
this.url = `https://twemoji.maxcdn.com/2/svg/${this.char.codePointAt(0).toString(16)}.svg`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="stylus" scoped>
|
||||||
|
.fvgwvorwhxigeolkkrcderjzcawqrscl
|
||||||
|
height 1.25em
|
||||||
|
vertical-align -0.25em
|
||||||
|
|
||||||
|
&.custom
|
||||||
|
height 2.5em
|
||||||
|
vertical-align middle
|
||||||
|
transition transform 0.2s ease
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
transform scale(1.2)
|
||||||
|
|
||||||
|
</style>
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="wjqjnyhzogztorhrdgcpqlkxhkmuetgj">
|
<div class="wjqjnyhzogztorhrdgcpqlkxhkmuetgj">
|
||||||
<p>%fa:exclamation-triangle% %i18n:common.error.title%</p>
|
<p><fa icon="exclamation-triangle"/> %i18n:common.error.title%</p>
|
||||||
<ui-button @click="() => $emit('retry')">%i18n:common.error.retry%</ui-button>
|
<ui-button @click="() => $emit('retry')">%i18n:common.error.retry%</ui-button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<span class="mk-file-type-icon">
|
<span class="mk-file-type-icon">
|
||||||
<template v-if="kind == 'image'">%fa:file-image%</template>
|
<template v-if="kind == 'image'"><fa icon="file-image"/></template>
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="xqnhankfuuilcwvhgsopeqncafzsquya">
|
<div class="xqnhankfuuilcwvhgsopeqncafzsquya">
|
||||||
<button class="go-index" v-if="selfNav" @click="goIndex">%fa:arrow-left%</button>
|
<button class="go-index" v-if="selfNav" @click="goIndex"><fa icon="arrow-left"/></button>
|
||||||
<header><b><router-link :to="blackUser | userPage">{{ blackUser | userName }}</router-link></b>(%i18n:common.reversi.black%) vs <b><router-link :to="whiteUser | userPage">{{ whiteUser | userName }}</router-link></b>(%i18n:common.reversi.white%)</header>
|
<header><b><router-link :to="blackUser | userPage">{{ blackUser | userName }}</router-link></b>(%i18n:common.reversi.black%) vs <b><router-link :to="whiteUser | userPage">{{ whiteUser | userName }}</router-link></b>(%i18n:common.reversi.white%)</header>
|
||||||
|
|
||||||
<div style="overflow: hidden; line-height: 28px;">
|
<div style="overflow: hidden; line-height: 28px;">
|
||||||
@ -51,13 +51,13 @@
|
|||||||
|
|
||||||
<div class="player" v-if="game.isEnded">
|
<div class="player" v-if="game.isEnded">
|
||||||
<div>
|
<div>
|
||||||
<button @click="logPos = 0" :disabled="logPos == 0">%fa:angle-double-left%</button>
|
<button @click="logPos = 0" :disabled="logPos == 0"><fa icon="angle-double-left"/></button>
|
||||||
<button @click="logPos--" :disabled="logPos == 0">%fa:angle-left%</button>
|
<button @click="logPos--" :disabled="logPos == 0"><fa icon="angle-left"/></button>
|
||||||
</div>
|
</div>
|
||||||
<span>{{ logPos }} / {{ logs.length }}</span>
|
<span>{{ logPos }} / {{ logs.length }}</span>
|
||||||
<div>
|
<div>
|
||||||
<button @click="logPos++" :disabled="logPos == logs.length">%fa:angle-right%</button>
|
<button @click="logPos++" :disabled="logPos == logs.length"><fa icon="angle-right"/></button>
|
||||||
<button @click="logPos = logs.length" :disabled="logPos == logs.length">%fa:angle-double-right%</button>
|
<button @click="logPos = logs.length" :disabled="logPos == logs.length"><fa icon="angle-double-right"/></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -17,13 +17,13 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
<div class="random" v-if="game.settings.map == null">%fa:dice%</div>
|
<div class="random" v-if="game.settings.map == null"><fa icon="dice"/></div>
|
||||||
<div class="board" v-else :style="{ 'grid-template-rows': `repeat(${ game.settings.map.length }, 1fr)`, 'grid-template-columns': `repeat(${ game.settings.map[0].length }, 1fr)` }">
|
<div class="board" v-else :style="{ 'grid-template-rows': `repeat(${ game.settings.map.length }, 1fr)`, 'grid-template-columns': `repeat(${ game.settings.map[0].length }, 1fr)` }">
|
||||||
<div v-for="(x, i) in game.settings.map.join('')"
|
<div v-for="(x, i) in game.settings.map.join('')"
|
||||||
:data-none="x == ' '"
|
:data-none="x == ' '"
|
||||||
@click="onPixelClick(i, x)">
|
@click="onPixelClick(i, x)">
|
||||||
<template v-if="x == 'b'"><template v-if="$store.state.device.darkmode">%fa:circle R%</template><template v-else>%fa:circle%</template></template>
|
<template v-if="x == 'b'"><template v-if="$store.state.device.darkmode"><fa :icon="['far', 'circle']"/></template><template v-else><fa icon="circle"/></template></template>
|
||||||
<template v-if="x == 'w'"><template v-if="$store.state.device.darkmode">%fa:circle%</template><template v-else>%fa:circle R%</template></template>
|
<template v-if="x == 'w'"><template v-if="$store.state.device.darkmode"><fa :icon="['far', 'circle']"/></template><template v-else><fa icon="circle"/></template></template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-google">
|
<div class="mk-google">
|
||||||
<input type="search" v-model="query" :placeholder="q">
|
<input type="search" v-model="query" :placeholder="q">
|
||||||
<button @click="search">%fa:search% %i18n:common.search%</button>
|
<button @click="search"><fa icon="search"/> %i18n:common.search%</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -39,6 +39,7 @@ import urlPreview from './url-preview.vue';
|
|||||||
import twitterSetting from './twitter-setting.vue';
|
import twitterSetting from './twitter-setting.vue';
|
||||||
import githubSetting from './github-setting.vue';
|
import githubSetting from './github-setting.vue';
|
||||||
import fileTypeIcon from './file-type-icon.vue';
|
import fileTypeIcon from './file-type-icon.vue';
|
||||||
|
import emoji from './emoji.vue';
|
||||||
import Reversi from './games/reversi/reversi.vue';
|
import Reversi from './games/reversi/reversi.vue';
|
||||||
import welcomeTimeline from './welcome-timeline.vue';
|
import welcomeTimeline from './welcome-timeline.vue';
|
||||||
import uiInput from './ui/input.vue';
|
import uiInput from './ui/input.vue';
|
||||||
@ -93,6 +94,7 @@ Vue.component('mk-url-preview', urlPreview);
|
|||||||
Vue.component('mk-twitter-setting', twitterSetting);
|
Vue.component('mk-twitter-setting', twitterSetting);
|
||||||
Vue.component('mk-github-setting', githubSetting);
|
Vue.component('mk-github-setting', githubSetting);
|
||||||
Vue.component('mk-file-type-icon', fileTypeIcon);
|
Vue.component('mk-file-type-icon', fileTypeIcon);
|
||||||
|
Vue.component('mk-emoji', emoji);
|
||||||
Vue.component('mk-reversi', Reversi);
|
Vue.component('mk-reversi', Reversi);
|
||||||
Vue.component('mk-welcome-timeline', welcomeTimeline);
|
Vue.component('mk-welcome-timeline', welcomeTimeline);
|
||||||
Vue.component('ui-input', uiInput);
|
Vue.component('ui-input', uiInput);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-media-banner">
|
<div class="mk-media-banner">
|
||||||
<div class="sensitive" v-if="media.isSensitive && hide" @click="hide = false">
|
<div class="sensitive" v-if="media.isSensitive && hide" @click="hide = false">
|
||||||
<span class="icon">%fa:exclamation-triangle%</span>
|
<span class="icon"><fa icon="exclamation-triangle"/></span>
|
||||||
<b>%i18n:@sensitive%</b>
|
<b>%i18n:@sensitive%</b>
|
||||||
<span>%i18n:@click-to-show%</span>
|
<span>%i18n:@click-to-show%</span>
|
||||||
</div>
|
</div>
|
||||||
@ -18,7 +18,7 @@
|
|||||||
:title="media.name"
|
:title="media.name"
|
||||||
:download="media.name"
|
:download="media.name"
|
||||||
>
|
>
|
||||||
<span class="icon">%fa:download%</span>
|
<span class="icon"><fa icon="download"/></span>
|
||||||
<b>{{ media.name }}</b>
|
<b>{{ media.name }}</b>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -4,7 +4,9 @@
|
|||||||
<div class="popover" :class="{ hukidasi }" ref="popover">
|
<div class="popover" :class="{ hukidasi }" ref="popover">
|
||||||
<template v-for="item, i in items">
|
<template v-for="item, i in items">
|
||||||
<div v-if="item === null"></div>
|
<div v-if="item === null"></div>
|
||||||
<button v-if="item" @click="clicked(item.action)" v-html="item.icon ? item.icon + ' ' + item.text : item.text" :tabindex="i"></button>
|
<button v-if="item" @click="clicked(item.action)" :tabindex="i">
|
||||||
|
<fa v-if="item.icon" :icon="item.icon"/>{{ item.text }}
|
||||||
|
</button>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -188,6 +190,9 @@ export default Vue.extend({
|
|||||||
color var(--primaryForeground)
|
color var(--primaryForeground)
|
||||||
background var(--primaryDarken10)
|
background var(--primaryDarken10)
|
||||||
|
|
||||||
|
> [data-icon]
|
||||||
|
margin-right 4px
|
||||||
|
|
||||||
> div
|
> div
|
||||||
margin 8px 0
|
margin 8px 0
|
||||||
height 1px
|
height 1px
|
||||||
|
@ -14,13 +14,13 @@
|
|||||||
<div class="file" @click="file = null" v-if="file">{{ file.name }}</div>
|
<div class="file" @click="file = null" v-if="file">{{ file.name }}</div>
|
||||||
<mk-uploader ref="uploader" @uploaded="onUploaded"/>
|
<mk-uploader ref="uploader" @uploaded="onUploaded"/>
|
||||||
<button class="send" @click="send" :disabled="!canSend || sending" title="%i18n:@send%">
|
<button class="send" @click="send" :disabled="!canSend || sending" title="%i18n:@send%">
|
||||||
<template v-if="!sending">%fa:paper-plane%</template><template v-if="sending">%fa:spinner .spin%</template>
|
<template v-if="!sending"><fa icon="paper-plane"/></template><template v-if="sending"><fa icon="spinner .spin"/></template>
|
||||||
</button>
|
</button>
|
||||||
<button class="attach-from-local" @click="chooseFile" title="%i18n:@attach-from-local%">
|
<button class="attach-from-local" @click="chooseFile" title="%i18n:@attach-from-local%">
|
||||||
%fa:upload%
|
<fa icon="upload"/>
|
||||||
</button>
|
</button>
|
||||||
<button class="attach-from-drive" @click="chooseFileFromDrive" title="%i18n:@attach-from-drive%">
|
<button class="attach-from-drive" @click="chooseFileFromDrive" title="%i18n:@attach-from-drive%">
|
||||||
%fa:R folder-open%
|
<fa :icon="['far', 'folder-open']"/>
|
||||||
</button>
|
</button>
|
||||||
<input ref="file" type="file" @change="onChangeFile"/>
|
<input ref="file" type="file" @change="onChangeFile"/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
<footer>
|
<footer>
|
||||||
<span class="read" v-if="isMe && message.isRead">%i18n:@is-read%</span>
|
<span class="read" v-if="isMe && message.isRead">%i18n:@is-read%</span>
|
||||||
<mk-time :time="message.createdAt"/>
|
<mk-time :time="message.createdAt"/>
|
||||||
<template v-if="message.is_edited">%fa:pencil-alt%</template>
|
<template v-if="message.is_edited"><fa icon="pencil-alt"/></template>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -179,7 +179,7 @@ export default Vue.extend({
|
|||||||
font-size 10px
|
font-size 10px
|
||||||
color var(--messagingRoomMessageInfo)
|
color var(--messagingRoomMessageInfo)
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-left 4px
|
margin-left 4px
|
||||||
|
|
||||||
&:not([data-is-me])
|
&:not([data-is-me])
|
||||||
|
@ -4,11 +4,11 @@
|
|||||||
@drop.prevent.stop="onDrop"
|
@drop.prevent.stop="onDrop"
|
||||||
>
|
>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<p class="init" v-if="init">%fa:spinner .spin%%i18n:common.loading%</p>
|
<p class="init" v-if="init"><fa icon="spinner .spin"/>%i18n:common.loading%</p>
|
||||||
<p class="empty" v-if="!init && messages.length == 0">%fa:info-circle%%i18n:@empty%</p>
|
<p class="empty" v-if="!init && messages.length == 0"><fa icon="info-circle"/>%i18n:@empty%</p>
|
||||||
<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages">%fa:flag%%i18n:@no-history%</p>
|
<p class="no-history" v-if="!init && messages.length > 0 && !existMoreMessages"><fa icon="flag"/>%i18n:@no-history%</p>
|
||||||
<button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages">
|
<button class="more" :class="{ fetching: fetchingMoreMessages }" v-if="existMoreMessages" @click="fetchMoreMessages" :disabled="fetchingMoreMessages">
|
||||||
<template v-if="fetchingMoreMessages">%fa:spinner .pulse .fw%</template>{{ fetchingMoreMessages ? '%i18n:common.loading%' : '%i18n:@more%' }}
|
<template v-if="fetchingMoreMessages"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreMessages ? '%i18n:common.loading%' : '%i18n:@more%' }}
|
||||||
</button>
|
</button>
|
||||||
<template v-for="(message, i) in _messages">
|
<template v-for="(message, i) in _messages">
|
||||||
<x-message :message="message" :key="message.id"/>
|
<x-message :message="message" :key="message.id"/>
|
||||||
@ -20,7 +20,7 @@
|
|||||||
<footer>
|
<footer>
|
||||||
<transition name="fade">
|
<transition name="fade">
|
||||||
<div class="new-message" v-show="showIndicator">
|
<div class="new-message" v-show="showIndicator">
|
||||||
<button @click="onIndicatorClick">%fa:arrow-circle-down%%i18n:@new-message%</button>
|
<button @click="onIndicatorClick"><i><fa icon="arrow-circle-down"/></i>%i18n:@new-message%</button>
|
||||||
</div>
|
</div>
|
||||||
</transition>
|
</transition>
|
||||||
<x-form :user="user" ref="form"/>
|
<x-form :user="user" ref="form"/>
|
||||||
@ -280,7 +280,7 @@ export default Vue.extend({
|
|||||||
color var(--messagingRoomInfo)
|
color var(--messagingRoomInfo)
|
||||||
opacity 0.5
|
opacity 0.5
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .no-history
|
> .no-history
|
||||||
@ -292,7 +292,7 @@ export default Vue.extend({
|
|||||||
color var(--messagingRoomInfo)
|
color var(--messagingRoomInfo)
|
||||||
opacity 0.5
|
opacity 0.5
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .more
|
> .more
|
||||||
@ -313,7 +313,7 @@ export default Vue.extend({
|
|||||||
&.fetching
|
&.fetching
|
||||||
cursor wait
|
cursor wait
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .message
|
> .message
|
||||||
@ -381,7 +381,7 @@ export default Vue.extend({
|
|||||||
&:active
|
&:active
|
||||||
background var(--primaryDarken10)
|
background var(--primaryDarken10)
|
||||||
|
|
||||||
> [data-fa]
|
> i
|
||||||
position absolute
|
position absolute
|
||||||
top 0
|
top 0
|
||||||
left 10px
|
left 10px
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="mk-messaging" :data-compact="compact">
|
<div class="mk-messaging" :data-compact="compact">
|
||||||
<div class="search" v-if="!compact" :style="{ top: headerTop + 'px' }">
|
<div class="search" v-if="!compact" :style="{ top: headerTop + 'px' }">
|
||||||
<div class="form">
|
<div class="form">
|
||||||
<label for="search-input">%fa:search%</label>
|
<label for="search-input"><i><fa icon="search"/></i></label>
|
||||||
<input v-model="q" type="search" @input="search" @keydown="onSearchKeydown" placeholder="%i18n:@search-user%"/>
|
<input v-model="q" type="search" @input="search" @keydown="onSearchKeydown" placeholder="%i18n:@search-user%"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="result">
|
<div class="result">
|
||||||
@ -45,7 +45,7 @@
|
|||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
<p class="no-history" v-if="!fetching && messages.length == 0">%i18n:@no-history%</p>
|
<p class="no-history" v-if="!fetching && messages.length == 0">%i18n:@no-history%</p>
|
||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -213,7 +213,7 @@ export default Vue.extend({
|
|||||||
width 38px
|
width 38px
|
||||||
pointer-events none
|
pointer-events none
|
||||||
|
|
||||||
> [data-fa]
|
> i
|
||||||
display block
|
display block
|
||||||
position absolute
|
position absolute
|
||||||
top 0
|
top 0
|
||||||
@ -418,7 +418,7 @@ export default Vue.extend({
|
|||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color #aaa
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
// TODO: element base media query
|
// TODO: element base media query
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import Vue, { VNode } from 'vue';
|
import Vue, { VNode } from 'vue';
|
||||||
import * as emojilib from 'emojilib';
|
|
||||||
import { length } from 'stringz';
|
import { length } from 'stringz';
|
||||||
import parse from '../../../../../mfm/parse';
|
import parse from '../../../../../mfm/parse';
|
||||||
import getAcct from '../../../../../misc/acct/render';
|
import getAcct from '../../../../../misc/acct/render';
|
||||||
@ -188,25 +187,17 @@ export default Vue.component('misskey-flavored-markdown', {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case 'emoji': {
|
case 'emoji': {
|
||||||
//#region カスタム絵文字
|
const customEmojis = (this.os.getMetaSync() || { emojis: [] }).emojis || [];
|
||||||
if (this.customEmojis != null) {
|
return [createElement('mk-emoji', {
|
||||||
const customEmoji = this.customEmojis.find(e => e.name == token.emoji || (e.aliases || []).includes(token.emoji));
|
|
||||||
if (customEmoji) {
|
|
||||||
return [createElement('img', {
|
|
||||||
attrs: {
|
attrs: {
|
||||||
src: customEmoji.url,
|
emoji: token.emoji,
|
||||||
alt: token.emoji,
|
name: token.name
|
||||||
title: token.emoji,
|
},
|
||||||
style: 'height: 2.5em; vertical-align: middle;'
|
props: {
|
||||||
|
customEmojis: this.customEmojis || customEmojis
|
||||||
}
|
}
|
||||||
})];
|
})];
|
||||||
}
|
}
|
||||||
}
|
|
||||||
//#endregion
|
|
||||||
|
|
||||||
const emoji = emojilib.lib[token.emoji];
|
|
||||||
return [createElement('span', emoji ? emoji.char : token.content)];
|
|
||||||
}
|
|
||||||
|
|
||||||
case 'search': {
|
case 'search': {
|
||||||
return [createElement(MkGoogle, {
|
return [createElement(MkGoogle, {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">%fa:ban% %i18n:@mute-and-block%</div>
|
<div slot="title"><fa icon="ban"/> %i18n:@mute-and-block%</div>
|
||||||
|
|
||||||
<section>
|
<section>
|
||||||
<header>%i18n:@mute%</header>
|
<header>%i18n:@mute%</header>
|
||||||
|
@ -7,8 +7,6 @@
|
|||||||
<a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a>
|
<a :href="feedbackUrl" target="_blank">%i18n:@feedback%</a>
|
||||||
<i>・</i>
|
<i>・</i>
|
||||||
<a href="/dev">%i18n:@develop%</a>
|
<a href="/dev">%i18n:@develop%</a>
|
||||||
<i>・</i>
|
|
||||||
<a href="https://twitter.com/misskey_xyz" target="_blank">Follow us on %fa:B twitter%</a>
|
|
||||||
</span>
|
</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -6,18 +6,18 @@
|
|||||||
<span class="is-bot" v-if="note.user.isBot">bot</span>
|
<span class="is-bot" v-if="note.user.isBot">bot</span>
|
||||||
<span class="is-cat" v-if="note.user.isCat">cat</span>
|
<span class="is-cat" v-if="note.user.isCat">cat</span>
|
||||||
<span class="username"><mk-acct :user="note.user"/></span>
|
<span class="username"><mk-acct :user="note.user"/></span>
|
||||||
<span class="is-verified" v-if="note.user.isVerified" title="%i18n:common.verified-user%">%fa:star%</span>
|
<span class="is-verified" v-if="note.user.isVerified" title="%i18n:common.verified-user%"><fa icon="star"/></span>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<span class="app" v-if="note.app && !mini">via <b>{{ note.app.name }}</b></span>
|
<span class="app" v-if="note.app && !mini">via <b>{{ note.app.name }}</b></span>
|
||||||
<span class="mobile" v-if="note.viaMobile">%fa:mobile-alt%</span>
|
<span class="mobile" v-if="note.viaMobile"><fa icon="mobile-alt"/></span>
|
||||||
<router-link class="created-at" :to="note | notePage">
|
<router-link class="created-at" :to="note | notePage">
|
||||||
<mk-time :time="note.createdAt"/>
|
<mk-time :time="note.createdAt"/>
|
||||||
</router-link>
|
</router-link>
|
||||||
<span class="visibility" v-if="note.visibility != 'public'">
|
<span class="visibility" v-if="note.visibility != 'public'">
|
||||||
<template v-if="note.visibility == 'home'">%fa:home%</template>
|
<template v-if="note.visibility == 'home'"><fa icon="home"/></template>
|
||||||
<template v-if="note.visibility == 'followers'">%fa:unlock%</template>
|
<template v-if="note.visibility == 'followers'"><fa icon="unlock"/></template>
|
||||||
<template v-if="note.visibility == 'specified'">%fa:envelope%</template>
|
<template v-if="note.visibility == 'specified'"><fa icon="envelope"/></template>
|
||||||
<template v-if="note.visibility == 'private'">%fa:lock%</template>
|
<template v-if="note.visibility == 'private'"><fa icon="lock"/></template>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
@ -15,18 +15,18 @@ export default Vue.extend({
|
|||||||
computed: {
|
computed: {
|
||||||
items() {
|
items() {
|
||||||
const items = [{
|
const items = [{
|
||||||
icon: '%fa:info-circle%',
|
icon: 'info-circle',
|
||||||
text: '%i18n:@detail%',
|
text: '%i18n:@detail%',
|
||||||
action: this.detail
|
action: this.detail
|
||||||
}, {
|
}, {
|
||||||
icon: '%fa:link%',
|
icon: 'link',
|
||||||
text: '%i18n:@copy-link%',
|
text: '%i18n:@copy-link%',
|
||||||
action: this.copyLink
|
action: this.copyLink
|
||||||
}];
|
}];
|
||||||
|
|
||||||
if (this.note.uri) {
|
if (this.note.uri) {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:external-link-square-alt%',
|
icon: 'external-link-square-alt',
|
||||||
text: '%i18n:@remote%',
|
text: '%i18n:@remote%',
|
||||||
action: () => {
|
action: () => {
|
||||||
window.open(this.note.uri, '_blank');
|
window.open(this.note.uri, '_blank');
|
||||||
@ -38,13 +38,13 @@ export default Vue.extend({
|
|||||||
|
|
||||||
if (this.note.isFavorited) {
|
if (this.note.isFavorited) {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:star%',
|
icon: 'star',
|
||||||
text: '%i18n:@unfavorite%',
|
text: '%i18n:@unfavorite%',
|
||||||
action: this.unfavorite
|
action: this.unfavorite
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:star%',
|
icon: 'star',
|
||||||
text: '%i18n:@favorite%',
|
text: '%i18n:@favorite%',
|
||||||
action: this.favorite
|
action: this.favorite
|
||||||
});
|
});
|
||||||
@ -53,13 +53,13 @@ export default Vue.extend({
|
|||||||
if (this.note.userId == this.$store.state.i.id) {
|
if (this.note.userId == this.$store.state.i.id) {
|
||||||
if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) {
|
if ((this.$store.state.i.pinnedNoteIds || []).includes(this.note.id)) {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:thumbtack%',
|
icon: 'thumbtack',
|
||||||
text: '%i18n:@unpin%',
|
text: '%i18n:@unpin%',
|
||||||
action: this.unpin
|
action: this.unpin
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:thumbtack%',
|
icon: 'thumbtack',
|
||||||
text: '%i18n:@pin%',
|
text: '%i18n:@pin%',
|
||||||
action: this.pin
|
action: this.pin
|
||||||
});
|
});
|
||||||
@ -69,7 +69,7 @@ export default Vue.extend({
|
|||||||
if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) {
|
if (this.note.userId == this.$store.state.i.id || this.$store.state.i.isAdmin) {
|
||||||
items.push(null);
|
items.push(null);
|
||||||
items.push({
|
items.push({
|
||||||
icon: '%fa:trash-alt R%',
|
icon: ['far', 'trash-alt'],
|
||||||
text: '%i18n:@delete%',
|
text: '%i18n:@delete%',
|
||||||
action: this.del
|
action: this.del
|
||||||
});
|
});
|
||||||
|
@ -1,19 +1,19 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-poll-editor">
|
<div class="mk-poll-editor">
|
||||||
<p class="caution" v-if="choices.length < 2">
|
<p class="caution" v-if="choices.length < 2">
|
||||||
%fa:exclamation-triangle%%i18n:@no-only-one-choice%
|
<fa icon="exclamation-triangle"/>%i18n:@no-only-one-choice%
|
||||||
</p>
|
</p>
|
||||||
<ul ref="choices">
|
<ul ref="choices">
|
||||||
<li v-for="(choice, i) in choices">
|
<li v-for="(choice, i) in choices">
|
||||||
<input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:@choice-n%'.replace('{}', i + 1)">
|
<input :value="choice" @input="onInput(i, $event)" :placeholder="'%i18n:@choice-n%'.replace('{}', i + 1)">
|
||||||
<button @click="remove(i)" title="%i18n:@remove%">
|
<button @click="remove(i)" title="%i18n:@remove%">
|
||||||
%fa:times%
|
<fa icon="times"/>
|
||||||
</button>
|
</button>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<button class="add" v-if="choices.length < 10" @click="add">%i18n:@add%</button>
|
<button class="add" v-if="choices.length < 10" @click="add">%i18n:@add%</button>
|
||||||
<button class="destroy" @click="destroy" title="%i18n:@destroy%">
|
<button class="destroy" @click="destroy" title="%i18n:@destroy%">
|
||||||
%fa:times%
|
<fa icon="times"/>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -76,7 +76,7 @@ export default Vue.extend({
|
|||||||
font-size 0.8em
|
font-size 0.8em
|
||||||
color #f00
|
color #f00
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> ul
|
> ul
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:@vote-to%'.replace('{}', choice.text) : ''">
|
<li v-for="choice in poll.choices" :key="choice.id" @click="vote(choice.id)" :class="{ voted: choice.voted }" :title="!isVoted ? '%i18n:@vote-to%'.replace('{}', choice.text) : ''">
|
||||||
<div class="backdrop" :style="{ 'width': (showResult ? (choice.votes / total * 100) : 0) + '%' }"></div>
|
<div class="backdrop" :style="{ 'width': (showResult ? (choice.votes / total * 100) : 0) + '%' }"></div>
|
||||||
<span>
|
<span>
|
||||||
<template v-if="choice.isVoted">%fa:check%</template>
|
<template v-if="choice.isVoted"><fa icon="check"/></template>
|
||||||
<span>{{ choice.text }}</span>
|
<span>{{ choice.text }}</span>
|
||||||
<span class="votes" v-if="showResult">({{ '%i18n:@vote-count%'.replace('{}', choice.votes) }})</span>
|
<span class="votes" v-if="showResult">({{ '%i18n:@vote-count%'.replace('{}', choice.votes) }})</span>
|
||||||
</span>
|
</span>
|
||||||
@ -100,7 +100,7 @@ export default Vue.extend({
|
|||||||
transition width 1s ease
|
transition width 1s ease
|
||||||
|
|
||||||
> span
|
> span
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .votes
|
> .votes
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<ui-card>
|
<ui-card>
|
||||||
<div slot="title">%fa:user% %i18n:@title%</div>
|
<div slot="title"><fa icon="user"/> %i18n:@title%</div>
|
||||||
|
|
||||||
<section class="fit-top">
|
<section class="fit-top">
|
||||||
<ui-form :disabled="saving">
|
<ui-form :disabled="saving">
|
||||||
@ -16,12 +16,12 @@
|
|||||||
|
|
||||||
<ui-input v-model="location">
|
<ui-input v-model="location">
|
||||||
<span>%i18n:@location%</span>
|
<span>%i18n:@location%</span>
|
||||||
<span slot="prefix">%fa:map-marker-alt%</span>
|
<span slot="prefix"><fa icon="map-marker-alt"/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
|
||||||
<ui-input v-model="birthday" type="date">
|
<ui-input v-model="birthday" type="date">
|
||||||
<span>%i18n:@birthday%</span>
|
<span>%i18n:@birthday%</span>
|
||||||
<span slot="prefix">%fa:birthday-cake%</span>
|
<span slot="prefix"><fa icon="birthday-cake"/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
|
||||||
<ui-textarea v-model="description" :max="500">
|
<ui-textarea v-model="description" :max="500">
|
||||||
@ -30,13 +30,13 @@
|
|||||||
|
|
||||||
<ui-input type="file" @change="onAvatarChange">
|
<ui-input type="file" @change="onAvatarChange">
|
||||||
<span>%i18n:@avatar%</span>
|
<span>%i18n:@avatar%</span>
|
||||||
<span slot="icon">%fa:image%</span>
|
<span slot="icon"><fa icon="image"/></span>
|
||||||
<span slot="text" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
<span slot="text" v-if="avatarUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
|
||||||
<ui-input type="file" @change="onBannerChange">
|
<ui-input type="file" @change="onBannerChange">
|
||||||
<span>%i18n:@banner%</span>
|
<span>%i18n:@banner%</span>
|
||||||
<span slot="icon">%fa:image%</span>
|
<span slot="icon"><fa icon="image"/></span>
|
||||||
<span slot="text" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
<span slot="text" v-if="bannerUploading">%i18n:@uploading%<mk-ellipsis/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="password" type="password" required styl="fill">
|
<ui-input v-model="password" type="password" required styl="fill">
|
||||||
<span>%i18n:@password%</span>
|
<span>%i18n:@password%</span>
|
||||||
<span slot="prefix">%fa:lock%</span>
|
<span slot="prefix"><fa icon="lock"/></span>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill"/>
|
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill"/>
|
||||||
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
|
<ui-button type="submit" :disabled="signing">{{ signing ? '%i18n:@signing-in%' : '%i18n:@signin%' }}</ui-button>
|
||||||
|
@ -3,36 +3,36 @@
|
|||||||
<template v-if="meta">
|
<template v-if="meta">
|
||||||
<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required styl="fill">
|
<ui-input v-if="meta.disableRegistration" v-model="invitationCode" type="text" :autocomplete="Math.random()" spellcheck="false" required styl="fill">
|
||||||
<span>%i18n:@invitation-code%</span>
|
<span>%i18n:@invitation-code%</span>
|
||||||
<span slot="prefix">%fa:id-card-alt%</span>
|
<span slot="prefix"><fa icon="id-card-alt"/></span>
|
||||||
<p slot="text" v-html="'%i18n:@invitation-info%'.replace('{}', meta.maintainer.url)"></p>
|
<p slot="text" v-html="'%i18n:@invitation-info%'.replace('{}', meta.maintainer.url)"></p>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername" styl="fill">
|
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]{1,20}$" :autocomplete="Math.random()" spellcheck="false" required @input="onChangeUsername" styl="fill">
|
||||||
<span>%i18n:@username%</span>
|
<span>%i18n:@username%</span>
|
||||||
<span slot="prefix">@</span>
|
<span slot="prefix">@</span>
|
||||||
<span slot="suffix">@{{ host }}</span>
|
<span slot="suffix">@{{ host }}</span>
|
||||||
<p slot="text" v-if="usernameState == 'wait'" style="color:#999">%fa:spinner .pulse .fw% %i18n:@checking%</p>
|
<p slot="text" v-if="usernameState == 'wait'" style="color:#999"><fa icon="spinner .pulse" fixed-width/> %i18n:@checking%</p>
|
||||||
<p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5">%fa:check .fw% %i18n:@available%</p>
|
<p slot="text" v-if="usernameState == 'ok'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@available%</p>
|
||||||
<p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@unavailable%</p>
|
<p slot="text" v-if="usernameState == 'unavailable'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@unavailable%</p>
|
||||||
<p slot="text" v-if="usernameState == 'error'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@error%</p>
|
<p slot="text" v-if="usernameState == 'error'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@error%</p>
|
||||||
<p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@invalid-format%</p>
|
<p slot="text" v-if="usernameState == 'invalid-format'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@invalid-format%</p>
|
||||||
<p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-short%</p>
|
<p slot="text" v-if="usernameState == 'min-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@too-short%</p>
|
||||||
<p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@too-long%</p>
|
<p slot="text" v-if="usernameState == 'max-range'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@too-long%</p>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true" styl="fill">
|
<ui-input v-model="password" type="password" :autocomplete="Math.random()" required @input="onChangePassword" :with-password-meter="true" styl="fill">
|
||||||
<span>%i18n:@password%</span>
|
<span>%i18n:@password%</span>
|
||||||
<span slot="prefix">%fa:lock%</span>
|
<span slot="prefix"><fa icon="lock"/></span>
|
||||||
<div slot="text">
|
<div slot="text">
|
||||||
<p slot="text" v-if="passwordStrength == 'low'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@weak-password%</p>
|
<p slot="text" v-if="passwordStrength == 'low'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@weak-password%</p>
|
||||||
<p slot="text" v-if="passwordStrength == 'medium'" style="color:#3CB7B5">%fa:check .fw% %i18n:@normal-password%</p>
|
<p slot="text" v-if="passwordStrength == 'medium'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@normal-password%</p>
|
||||||
<p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5">%fa:check .fw% %i18n:@strong-password%</p>
|
<p slot="text" v-if="passwordStrength == 'high'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@strong-password%</p>
|
||||||
</div>
|
</div>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype" styl="fill">
|
<ui-input v-model="retypedPassword" type="password" :autocomplete="Math.random()" required @input="onChangePasswordRetype" styl="fill">
|
||||||
<span>%i18n:@password% (%i18n:@retype%)</span>
|
<span>%i18n:@password% (%i18n:@retype%)</span>
|
||||||
<span slot="prefix">%fa:lock%</span>
|
<span slot="prefix"><fa icon="lock"/></span>
|
||||||
<div slot="text">
|
<div slot="text">
|
||||||
<p slot="text" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5">%fa:check .fw% %i18n:@password-matched%</p>
|
<p slot="text" v-if="passwordRetypeState == 'match'" style="color:#3CB7B5"><fa icon="check" fixed-width/> %i18n:@password-matched%</p>
|
||||||
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p>
|
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161"><fa icon="exclamation-triangle" fixed-width/> %i18n:@password-not-matched%</p>
|
||||||
</div>
|
</div>
|
||||||
</ui-input>
|
</ui-input>
|
||||||
<div v-if="meta.recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="meta.recaptchaSitekey" style="margin: 16px 0;"></div>
|
<div v-if="meta.recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="meta.recaptchaSitekey" style="margin: 16px 0;"></div>
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-stream-indicator">
|
<div class="mk-stream-indicator">
|
||||||
<p v-if="stream.state == 'initializing'">
|
<p v-if="stream.state == 'initializing'">
|
||||||
%fa:spinner .pulse%
|
<fa icon="spinner .pulse"/>
|
||||||
<span>%i18n:@connecting%<mk-ellipsis/></span>
|
<span>%i18n:@connecting%<mk-ellipsis/></span>
|
||||||
</p>
|
</p>
|
||||||
<p v-if="stream.state == 'reconnecting'">
|
<p v-if="stream.state == 'reconnecting'">
|
||||||
%fa:spinner .pulse%
|
<fa icon="spinner .pulse"/>
|
||||||
<span>%i18n:@reconnecting%<mk-ellipsis/></span>
|
<span>%i18n:@reconnecting%<mk-ellipsis/></span>
|
||||||
</p>
|
</p>
|
||||||
<p v-if="stream.state == 'connected'">
|
<p v-if="stream.state == 'connected'">
|
||||||
%fa:check%
|
<fa icon="check"/>
|
||||||
<span>%i18n:@connected%</span>
|
<span>%i18n:@connected%</span>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -80,7 +80,7 @@ export default Vue.extend({
|
|||||||
display block
|
display block
|
||||||
margin 0
|
margin 0
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="jtivnzhfwquxpsfidertopbmwmchmnmo">
|
<div class="jtivnzhfwquxpsfidertopbmwmchmnmo">
|
||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
<p class="empty" v-else-if="tags.length == 0">%fa:exclamation-circle%%i18n:@empty%</p>
|
<p class="empty" v-else-if="tags.length == 0"><fa icon="exclamation-circle"/>%i18n:@empty%</p>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<vue-word-cloud
|
<vue-word-cloud
|
||||||
:words="tags.slice(0, 20).map(x => [x.name, x.count])"
|
:words="tags.slice(0, 20).map(x => [x.name, x.count])"
|
||||||
@ -74,7 +74,7 @@ export default Vue.extend({
|
|||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color #aaa
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> div
|
> div
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
</label>
|
</label>
|
||||||
|
|
||||||
<details class="creator">
|
<details class="creator">
|
||||||
<summary>%fa:palette% %i18n:@create-a-theme%</summary>
|
<summary><fa icon="palette"/> %i18n:@create-a-theme%</summary>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@base-theme%:</span>
|
<span>%i18n:@base-theme%:</span>
|
||||||
<ui-radio v-model="myThemeBase" value="light">%i18n:@base-theme-light%</ui-radio>
|
<ui-radio v-model="myThemeBase" value="light">%i18n:@base-theme-light%</ui-radio>
|
||||||
@ -51,23 +51,23 @@
|
|||||||
<div style="padding-bottom:8px;">%i18n:@text-color%:</div>
|
<div style="padding-bottom:8px;">%i18n:@text-color%:</div>
|
||||||
<color-picker v-model="myThemeText"/>
|
<color-picker v-model="myThemeText"/>
|
||||||
</div>
|
</div>
|
||||||
<ui-button @click="preview()">%fa:eye% %i18n:@preview-created-theme%</ui-button>
|
<ui-button @click="preview()"><fa icon="eye"/> %i18n:@preview-created-theme%</ui-button>
|
||||||
<ui-button primary @click="gen()">%fa:save R% %i18n:@save-created-theme%</ui-button>
|
<ui-button primary @click="gen()"><fa :icon="['far', 'save']"/> %i18n:@save-created-theme%</ui-button>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>%fa:download% %i18n:@install-a-theme%</summary>
|
<summary><fa icon="download"/> %i18n:@install-a-theme%</summary>
|
||||||
<ui-button @click="import_()">%fa:file-import% %i18n:@import%</ui-button>
|
<ui-button @click="import_()"><fa icon="file-import"/> %i18n:@import%</ui-button>
|
||||||
<input ref="file" type="file" accept=".misskeytheme" style="display:none;" @change="onUpdateImportFile"/>
|
<input ref="file" type="file" accept=".misskeytheme" style="display:none;" @change="onUpdateImportFile"/>
|
||||||
<p>%i18n:@import-by-code%:</p>
|
<p>%i18n:@import-by-code%:</p>
|
||||||
<ui-textarea v-model="installThemeCode">
|
<ui-textarea v-model="installThemeCode">
|
||||||
<span>%i18n:@theme-code%</span>
|
<span>%i18n:@theme-code%</span>
|
||||||
</ui-textarea>
|
</ui-textarea>
|
||||||
<ui-button @click="() => install(this.installThemeCode)">%fa:check% %i18n:@install%</ui-button>
|
<ui-button @click="() => install(this.installThemeCode)"><fa icon="check"/> %i18n:@install%</ui-button>
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
<summary>%fa:folder-open% %i18n:@manage-themes%</summary>
|
<summary><fa icon="folder-open"/> %i18n:@manage-themes%</summary>
|
||||||
<ui-select v-model="selectedThemeId" placeholder="%i18n:@select-theme%">
|
<ui-select v-model="selectedThemeId" placeholder="%i18n:@select-theme%">
|
||||||
<optgroup label="%i18n:@builtin-themes%">
|
<optgroup label="%i18n:@builtin-themes%">
|
||||||
<option v-for="x in builtinThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
|
<option v-for="x in builtinThemes" :value="x.id" :key="x.id">{{ x.name }}</option>
|
||||||
@ -89,8 +89,8 @@
|
|||||||
<ui-textarea readonly :value="selectedThemeCode">
|
<ui-textarea readonly :value="selectedThemeCode">
|
||||||
<span>%i18n:@theme-code%</span>
|
<span>%i18n:@theme-code%</span>
|
||||||
</ui-textarea>
|
</ui-textarea>
|
||||||
<ui-button @click="export_()" link :download="`${selectedTheme.name}.misskeytheme`" ref="export">%fa:box% %i18n:@export%</ui-button>
|
<ui-button @click="export_()" link :download="`${selectedTheme.name}.misskeytheme`" ref="export"><fa icon="box"/> %i18n:@export%</ui-button>
|
||||||
<ui-button @click="uninstall()" v-if="!builtinThemes.some(t => t.id == selectedTheme.id)">%fa:trash-alt R% %i18n:@uninstall%</ui-button>
|
<ui-button @click="uninstall()" v-if="!builtinThemes.some(t => t.id == selectedTheme.id)"><fa :icon="['far', 'trash-alt']"/> %i18n:@uninstall%</ui-button>
|
||||||
</template>
|
</template>
|
||||||
</details>
|
</details>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc">
|
<div class="csqvmxybqbycalfhkxvyfrgbrdalkaoc">
|
||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
<p class="empty" v-else-if="stats.length == 0">%fa:exclamation-circle%%i18n:@empty%</p>
|
<p class="empty" v-else-if="stats.length == 0"><fa icon="exclamation-circle"/>%i18n:@empty%</p>
|
||||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||||
<transition-group v-else tag="div" name="chart">
|
<transition-group v-else tag="div" name="chart">
|
||||||
<div v-for="stat in stats" :key="stat.tag">
|
<div v-for="stat in stats" :key="stat.tag">
|
||||||
@ -58,7 +58,7 @@ export default Vue.extend({
|
|||||||
color var(--text)
|
color var(--text)
|
||||||
opacity 0.7
|
opacity 0.7
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> div
|
> div
|
||||||
|
@ -12,7 +12,11 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
inject: ['horizonGrouped'],
|
inject: {
|
||||||
|
horizonGrouped: {
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
type: {
|
type: {
|
||||||
type: String,
|
type: String,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="ymxyweixqwsxauxldgpvecjepnwxbylu" :class="{ warn }">
|
<div class="ymxyweixqwsxauxldgpvecjepnwxbylu" :class="{ warn }">
|
||||||
<i v-if="warn">%fa:exclamation-triangle%</i>
|
<i v-if="warn"><fa icon="exclamation-triangle"/></i>
|
||||||
<i v-else>%fa:info-circle%</i>
|
<i v-else><fa icon="info-circle"/></i>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -41,7 +41,11 @@ import Vue from 'vue';
|
|||||||
const getPasswordStrength = require('syuilo-password-strength');
|
const getPasswordStrength = require('syuilo-password-strength');
|
||||||
|
|
||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
inject: ['horizonGrouped'],
|
inject: {
|
||||||
|
horizonGrouped: {
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
value: {
|
value: {
|
||||||
required: false
|
required: false
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
<ol v-if="uploads.length > 0">
|
<ol v-if="uploads.length > 0">
|
||||||
<li v-for="ctx in uploads" :key="ctx.id">
|
<li v-for="ctx in uploads" :key="ctx.id">
|
||||||
<div class="img" :style="{ backgroundImage: `url(${ ctx.img })` }"></div>
|
<div class="img" :style="{ backgroundImage: `url(${ ctx.img })` }"></div>
|
||||||
<p class="name">%fa:spinner .pulse%{{ ctx.name }}</p>
|
<p class="name"><fa icon="spinner .pulse"/>{{ ctx.name }}</p>
|
||||||
<p class="status">
|
<p class="status">
|
||||||
<span class="initing" v-if="ctx.progress == undefined">%i18n:@waiting%<mk-ellipsis/></span>
|
<span class="initing" v-if="ctx.progress == undefined">%i18n:@waiting%<mk-ellipsis/></span>
|
||||||
<span class="kb" v-if="ctx.progress != undefined">{{ String(Math.floor(ctx.progress.value / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i> / {{ String(Math.floor(ctx.progress.max / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i></span>
|
<span class="kb" v-if="ctx.progress != undefined">{{ String(Math.floor(ctx.progress.value / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i> / {{ String(Math.floor(ctx.progress.max / 1024)).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1,') }}<i>KB</i></span>
|
||||||
@ -155,7 +155,7 @@ export default Vue.extend({
|
|||||||
text-overflow ellipsis
|
text-overflow ellipsis
|
||||||
overflow hidden
|
overflow hidden
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .status
|
> .status
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<span class="pathname" v-if="pathname != ''">{{ pathname }}</span>
|
<span class="pathname" v-if="pathname != ''">{{ pathname }}</span>
|
||||||
<span class="query">{{ query }}</span>
|
<span class="query">{{ query }}</span>
|
||||||
<span class="hash">{{ hash }}</span>
|
<span class="hash">{{ hash }}</span>
|
||||||
%fa:external-link-square-alt%
|
<fa icon="external-link-square-alt"/>
|
||||||
</a>
|
</a>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ export default Vue.extend({
|
|||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.mk-url
|
.mk-url
|
||||||
word-break break-all
|
word-break break-all
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
padding-left 2px
|
padding-left 2px
|
||||||
font-size .9em
|
font-size .9em
|
||||||
font-weight 400
|
font-weight 400
|
||||||
|
@ -3,34 +3,34 @@
|
|||||||
<div class="backdrop" ref="backdrop" @click="close"></div>
|
<div class="backdrop" ref="backdrop" @click="close"></div>
|
||||||
<div class="popover" :class="{ compact }" ref="popover">
|
<div class="popover" :class="{ compact }" ref="popover">
|
||||||
<div @click="choose('public')" :class="{ active: v == 'public' }">
|
<div @click="choose('public')" :class="{ active: v == 'public' }">
|
||||||
<div>%fa:globe%</div>
|
<div><fa icon="globe"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@public%</span>
|
<span>%i18n:@public%</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div @click="choose('home')" :class="{ active: v == 'home' }">
|
<div @click="choose('home')" :class="{ active: v == 'home' }">
|
||||||
<div>%fa:home%</div>
|
<div><fa icon="home"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@home%</span>
|
<span>%i18n:@home%</span>
|
||||||
<span>%i18n:@home-desc%</span>
|
<span>%i18n:@home-desc%</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div @click="choose('followers')" :class="{ active: v == 'followers' }">
|
<div @click="choose('followers')" :class="{ active: v == 'followers' }">
|
||||||
<div>%fa:unlock%</div>
|
<div><fa icon="unlock"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@followers%</span>
|
<span>%i18n:@followers%</span>
|
||||||
<span>%i18n:@followers-desc%</span>
|
<span>%i18n:@followers-desc%</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div @click="choose('specified')" :class="{ active: v == 'specified' }">
|
<div @click="choose('specified')" :class="{ active: v == 'specified' }">
|
||||||
<div>%fa:envelope%</div>
|
<div><fa icon="envelope"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@specified%</span>
|
<span>%i18n:@specified%</span>
|
||||||
<span>%i18n:@specified-desc%</span>
|
<span>%i18n:@specified-desc%</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div @click="choose('private')" :class="{ active: v == 'private' }">
|
<div @click="choose('private')" :class="{ active: v == 'private' }">
|
||||||
<div>%fa:lock%</div>
|
<div><fa icon="lock"/></div>
|
||||||
<div>
|
<div>
|
||||||
<span>%i18n:@private%</span>
|
<span>%i18n:@private%</span>
|
||||||
</div>
|
</div>
|
||||||
|
@ -109,7 +109,7 @@ class Autocomplete {
|
|||||||
|
|
||||||
if (isEmoji && opened == false) {
|
if (isEmoji && opened == false) {
|
||||||
const emoji = text.substr(emojiIndex + 1);
|
const emoji = text.substr(emojiIndex + 1);
|
||||||
if (emoji != '' && emoji.match(/^[\+\-a-z0-9_]+$/)) {
|
if (!emoji.includes(' ')) {
|
||||||
this.open('emoji', emoji);
|
this.open('emoji', emoji);
|
||||||
opened = true;
|
opened = true;
|
||||||
}
|
}
|
||||||
@ -145,6 +145,7 @@ class Autocomplete {
|
|||||||
} else {
|
} else {
|
||||||
// サジェスト要素作成
|
// サジェスト要素作成
|
||||||
this.suggestion = new MkAutocomplete({
|
this.suggestion = new MkAutocomplete({
|
||||||
|
parent: this.vm,
|
||||||
propsData: {
|
propsData: {
|
||||||
textarea: this.textarea,
|
textarea: this.textarea,
|
||||||
complete: this.complete,
|
complete: this.complete,
|
||||||
@ -222,8 +223,6 @@ class Autocomplete {
|
|||||||
const trimmedBefore = before.substring(0, before.lastIndexOf(':'));
|
const trimmedBefore = before.substring(0, before.lastIndexOf(':'));
|
||||||
const after = source.substr(caret);
|
const after = source.substr(caret);
|
||||||
|
|
||||||
if (value.startsWith(':')) value = value + ' ';
|
|
||||||
|
|
||||||
// 挿入
|
// 挿入
|
||||||
this.text = trimmedBefore + value + after;
|
this.text = trimmedBefore + value + after;
|
||||||
|
|
||||||
|
@ -19,13 +19,13 @@
|
|||||||
@click="onClick"
|
@click="onClick"
|
||||||
:disabled="followWait">
|
:disabled="followWait">
|
||||||
<template v-if="!followWait">
|
<template v-if="!followWait">
|
||||||
<template v-if="user.hasPendingFollowRequestFromYou && user.isLocked">%fa:hourglass-half% %i18n:@request-pending%</template>
|
<template v-if="user.hasPendingFollowRequestFromYou && user.isLocked"><fa icon="hourglass-half"/> %i18n:@request-pending%</template>
|
||||||
<template v-else-if="user.hasPendingFollowRequestFromYou && !user.isLocked">%fa:hourglass-start% %i18n:@follow-processing%</template>
|
<template v-else-if="user.hasPendingFollowRequestFromYou && !user.isLocked"><fa icon="hourglass-start"/> %i18n:@follow-processing%</template>
|
||||||
<template v-else-if="user.isFollowing">%fa:minus% %i18n:@following%</template>
|
<template v-else-if="user.isFollowing"><fa icon="minus"/> %i18n:@following%</template>
|
||||||
<template v-else-if="!user.isFollowing && user.isLocked">%fa:plus% %i18n:@follow-request%</template>
|
<template v-else-if="!user.isFollowing && user.isLocked"><fa icon="plus"/> %i18n:@follow-request%</template>
|
||||||
<template v-else-if="!user.isFollowing && !user.isLocked">%fa:plus% %i18n:@follow%</template>
|
<template v-else-if="!user.isFollowing && !user.isLocked"><fa icon="plus"/> %i18n:@follow%</template>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>%fa:spinner .pulse .fw%</template>
|
<template v-else><fa icon="spinner .pulse" fixed-width/></template>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div>
|
<div>
|
||||||
<mk-widget-container :show-header="false">
|
<mk-widget-container :show-header="false">
|
||||||
<article class="dolfvtibguprpxxhfndqaosjitixjohx">
|
<article class="dolfvtibguprpxxhfndqaosjitixjohx">
|
||||||
<h1>%fa:heart%%i18n:@title%</h1>
|
<h1><fa icon="heart"/>%i18n:@title%</h1>
|
||||||
<p v-if="meta">
|
<p v-if="meta">
|
||||||
{{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }}
|
{{ '%i18n:@text%'.substr(0, '%i18n:@text%'.indexOf('{')) }}
|
||||||
<a :href="meta.maintainer.url">{{ meta.maintainer.name }}</a>
|
<a :href="meta.maintainer.url">{{ meta.maintainer.name }}</a>
|
||||||
@ -41,7 +41,7 @@ export default define({
|
|||||||
margin 0 0 5px 0
|
margin 0 0 5px 0
|
||||||
font-size 1em
|
font-size 1em
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 0.25em
|
margin-right 0.25em
|
||||||
|
|
||||||
> p
|
> p
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mkw-hashtags">
|
<div class="mkw-hashtags">
|
||||||
<mk-widget-container :show-header="!props.compact">
|
<mk-widget-container :show-header="!props.compact">
|
||||||
<template slot="header">%fa:hashtag%%i18n:@title%</template>
|
<template slot="header"><fa icon="hashtag"/>%i18n:@title%</template>
|
||||||
|
|
||||||
<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'">
|
<div class="mkw-hashtags--body" :data-mobile="platform == 'mobile'">
|
||||||
<mk-trends/>
|
<mk-trends/>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mkw-memo">
|
<div class="mkw-memo">
|
||||||
<mk-widget-container :show-header="!props.compact">
|
<mk-widget-container :show-header="!props.compact">
|
||||||
<template slot="header">%fa:R sticky-note%%i18n:@title%</template>
|
<template slot="header"><fa :icon="['far', 'sticky-note']"/>%i18n:@title%</template>
|
||||||
|
|
||||||
<div class="mkw-memo--body">
|
<div class="mkw-memo--body">
|
||||||
<textarea v-model="text" placeholder="%i18n:@memo%" @input="onChange"></textarea>
|
<textarea v-model="text" placeholder="%i18n:@memo%" @input="onChange"></textarea>
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mkw-photo-stream" :class="$style.root" :data-melt="props.design == 2">
|
<div class="mkw-photo-stream" :class="$style.root" :data-melt="props.design == 2">
|
||||||
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
|
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
|
||||||
<template slot="header">%fa:camera%%i18n:@title%</template>
|
<template slot="header"><fa icon="camera"/>%i18n:@title%</template>
|
||||||
|
|
||||||
<p :class="$style.fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
<div :class="$style.stream" v-if="!fetching && images.length > 0">
|
<div :class="$style.stream" v-if="!fetching && images.length > 0">
|
||||||
<div v-for="image in images" :class="$style.img" :style="`background-image: url(${image.thumbnailUrl || image.url})`"></div>
|
<div v-for="image in images" :class="$style.img" :style="`background-image: url(${image.thumbnailUrl || image.url})`"></div>
|
||||||
</div>
|
</div>
|
||||||
@ -94,7 +94,7 @@ export default define({
|
|||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color #aaa
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mkw-posts-monitor">
|
<div class="mkw-posts-monitor">
|
||||||
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
|
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
|
||||||
<template slot="header">%fa:chart-line%%i18n:@title%</template>
|
<template slot="header"><fa icon="chart-line"/>%i18n:@title%</template>
|
||||||
<button slot="func" @click="toggle" title="%i18n:@toggle%">%fa:sort%</button>
|
<button slot="func" @click="toggle" title="%i18n:@toggle%"><fa icon="sort"/></button>
|
||||||
|
|
||||||
<div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }">
|
<div class="qpdmibaztplkylerhdbllwcokyrfxeyj" :class="{ dual: props.view == 0 }">
|
||||||
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" v-show="props.view != 2">
|
<svg :viewBox="`0 0 ${ viewBoxX } ${ viewBoxY }`" v-show="props.view != 2">
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mkw-rss">
|
<div class="mkw-rss">
|
||||||
<mk-widget-container :show-header="!props.compact">
|
<mk-widget-container :show-header="!props.compact">
|
||||||
<template slot="header">%fa:rss-square%RSS</template>
|
<template slot="header"><fa icon="rss-square"/>RSS</template>
|
||||||
<button slot="func" title="設定" @click="setting">%fa:cog%</button>
|
<button slot="func" title="設定" @click="setting"><fa icon="cog"/></button>
|
||||||
|
|
||||||
<div class="mkw-rss--body" :data-mobile="platform == 'mobile'">
|
<div class="mkw-rss--body" :data-mobile="platform == 'mobile'">
|
||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
<div class="feed" v-else>
|
<div class="feed" v-else>
|
||||||
<a v-for="item in items" :href="item.link" target="_blank">{{ item.title }}</a>
|
<a v-for="item in items" :href="item.link" target="_blank">{{ item.title }}</a>
|
||||||
</div>
|
</div>
|
||||||
@ -85,7 +85,7 @@ export default define({
|
|||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color #aaa
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
&[data-mobile]
|
&[data-mobile]
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="cpu">
|
<div class="cpu">
|
||||||
<x-pie class="pie" :value="usage"/>
|
<x-pie class="pie" :value="usage"/>
|
||||||
<div>
|
<div>
|
||||||
<p>%fa:microchip%CPU</p>
|
<p><fa icon="microchip"/>CPU</p>
|
||||||
<p>{{ meta.cpu.cores }} Cores</p>
|
<p>{{ meta.cpu.cores }} Cores</p>
|
||||||
<p>{{ meta.cpu.model }}</p>
|
<p>{{ meta.cpu.model }}</p>
|
||||||
</div>
|
</div>
|
||||||
@ -57,7 +57,7 @@ export default Vue.extend({
|
|||||||
&:first-child
|
&:first-child
|
||||||
font-weight bold
|
font-weight bold
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
&:after
|
&:after
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="disk">
|
<div class="disk">
|
||||||
<x-pie class="pie" :value="usage"/>
|
<x-pie class="pie" :value="usage"/>
|
||||||
<div>
|
<div>
|
||||||
<p>%fa:R hdd%Storage</p>
|
<p><fa :icon="['far', 'hdd']"/>Storage</p>
|
||||||
<p>Total: {{ total | bytes(1) }}</p>
|
<p>Total: {{ total | bytes(1) }}</p>
|
||||||
<p>Free: {{ available | bytes(1) }}</p>
|
<p>Free: {{ available | bytes(1) }}</p>
|
||||||
<p>Used: {{ used | bytes(1) }}</p>
|
<p>Used: {{ used | bytes(1) }}</p>
|
||||||
@ -65,7 +65,7 @@ export default Vue.extend({
|
|||||||
&:first-child
|
&:first-child
|
||||||
font-weight bold
|
font-weight bold
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
&:after
|
&:after
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="memory">
|
<div class="memory">
|
||||||
<x-pie class="pie" :value="usage"/>
|
<x-pie class="pie" :value="usage"/>
|
||||||
<div>
|
<div>
|
||||||
<p>%fa:flask%Memory</p>
|
<p><fa icon="flask"/>Memory</p>
|
||||||
<p>Total: {{ total | bytes(1) }}</p>
|
<p>Total: {{ total | bytes(1) }}</p>
|
||||||
<p>Used: {{ used | bytes(1) }}</p>
|
<p>Used: {{ used | bytes(1) }}</p>
|
||||||
<p>Free: {{ free | bytes(1) }}</p>
|
<p>Free: {{ free | bytes(1) }}</p>
|
||||||
@ -65,7 +65,7 @@ export default Vue.extend({
|
|||||||
&:first-child
|
&:first-child
|
||||||
font-weight bold
|
font-weight bold
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
&:after
|
&:after
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mkw-server">
|
<div class="mkw-server">
|
||||||
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
|
<mk-widget-container :show-header="props.design == 0" :naked="props.design == 2">
|
||||||
<template slot="header">%fa:server%%i18n:@title%</template>
|
<template slot="header"><fa icon="server"/>%i18n:@title%</template>
|
||||||
<button slot="func" @click="toggle" title="%i18n:@toggle%">%fa:sort%</button>
|
<button slot="func" @click="toggle" title="%i18n:@toggle%"><fa icon="sort"/></button>
|
||||||
|
|
||||||
<p :class="$style.fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
<template v-if="!fetching">
|
<template v-if="!fetching">
|
||||||
<x-cpu-memory v-show="props.view == 0" :connection="connection"/>
|
<x-cpu-memory v-show="props.view == 0" :connection="connection"/>
|
||||||
<x-cpu v-show="props.view == 1" :connection="connection" :meta="meta"/>
|
<x-cpu v-show="props.view == 1" :connection="connection" :meta="meta"/>
|
||||||
@ -87,7 +87,7 @@ export default define({
|
|||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color #aaa
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mkw-tips">
|
<div class="mkw-tips">
|
||||||
<p ref="tip">%fa:R lightbulb%<span v-html="tip"></span></p>
|
<p ref="tip"><fa :icon="['far', 'lightbulb']"/><span v-html="tip"></span></p>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -88,7 +88,7 @@ export default define({
|
|||||||
font-size 0.7em
|
font-size 0.7em
|
||||||
color #999
|
color #999
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
kbd
|
kbd
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-activity">
|
<div class="mk-activity">
|
||||||
<mk-widget-container :show-header="design == 0" :naked="design == 2">
|
<mk-widget-container :show-header="design == 0" :naked="design == 2">
|
||||||
<template slot="header">%fa:chart-bar%%i18n:@title%</template>
|
<template slot="header"><fa icon="chart-bar"/>%i18n:@title%</template>
|
||||||
<button slot="func" title="%i18n:@toggle%" @click="toggle">%fa:sort%</button>
|
<button slot="func" title="%i18n:@toggle%" @click="toggle"><fa icon="sort"/></button>
|
||||||
|
|
||||||
<p :class="$style.fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
|
<p :class="$style.fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:common.loading%<mk-ellipsis/></p>
|
||||||
<template v-else>
|
<template v-else>
|
||||||
<x-calendar v-show="view == 0" :data="[].concat(activity)"/>
|
<x-calendar v-show="view == 0" :data="[].concat(activity)"/>
|
||||||
<x-chart v-show="view == 1" :data="[].concat(activity)"/>
|
<x-chart v-show="view == 1" :data="[].concat(activity)"/>
|
||||||
@ -78,7 +78,7 @@ export default Vue.extend({
|
|||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color #aaa
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-calendar" :data-melt="design == 4 || design == 5">
|
<div class="mk-calendar" :data-melt="design == 4 || design == 5">
|
||||||
<template v-if="design == 0 || design == 1">
|
<template v-if="design == 0 || design == 1">
|
||||||
<button @click="prev" title="%i18n:@prev%">%fa:chevron-circle-left%</button>
|
<button @click="prev" title="%i18n:@prev%"><fa icon="chevron-circle-left"/></button>
|
||||||
<p class="title">{{ '%i18n:@title%'.replace('{1}', year).replace('{2}', month) }}</p>
|
<p class="title">{{ '%i18n:@title%'.replace('{1}', year).replace('{2}', month) }}</p>
|
||||||
<button @click="next" title="%i18n:@next%">%fa:chevron-circle-right%</button>
|
<button @click="next" title="%i18n:@next%"><fa icon="chevron-circle-right"/></button>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<div class="calendar">
|
<div class="calendar">
|
||||||
@ -151,7 +151,7 @@ export default Vue.extend({
|
|||||||
background var(--faceHeader)
|
background var(--faceHeader)
|
||||||
box-shadow 0 1px rgba(#000, 0.07)
|
box-shadow 0 1px rgba(#000, 0.07)
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> button
|
> button
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
@change-selection="onChangeSelection"
|
@change-selection="onChangeSelection"
|
||||||
/>
|
/>
|
||||||
<div :class="$style.footer">
|
<div :class="$style.footer">
|
||||||
<button :class="$style.upload" title="%i18n:@upload%" @click="upload">%fa:upload%</button>
|
<button :class="$style.upload" title="%i18n:@upload%" @click="upload"><fa icon="upload"/></button>
|
||||||
<button :class="$style.cancel" @click="cancel">%i18n:@cancel%</button>
|
<button :class="$style.cancel" @click="cancel">%i18n:@cancel%</button>
|
||||||
<button :class="$style.ok" :disabled="multiple && files.length == 0" @click="ok">%i18n:@ok%</button>
|
<button :class="$style.ok" :disabled="multiple && files.length == 0" @click="ok">%i18n:@ok%</button>
|
||||||
</div>
|
</div>
|
||||||
@ -28,7 +28,7 @@ export default Vue.extend({
|
|||||||
default: false
|
default: false
|
||||||
},
|
},
|
||||||
title: {
|
title: {
|
||||||
default: '%fa:R file%%i18n:@choose-prompt%'
|
default: '<fa :icon="['far', 'file']"/>%i18n:@choose-prompt%'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@ -62,7 +62,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
|
|
||||||
.title
|
.title
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
.count
|
.count
|
||||||
|
@ -21,7 +21,7 @@ import Vue from 'vue';
|
|||||||
export default Vue.extend({
|
export default Vue.extend({
|
||||||
props: {
|
props: {
|
||||||
title: {
|
title: {
|
||||||
default: '%fa:R folder%%i18n:@choose-prompt%'
|
default: '<fa :icon="['far', 'folder']"/>%i18n:@choose-prompt%'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@ -40,7 +40,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
|
|
||||||
.title
|
.title
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
.browser
|
.browser
|
||||||
|
@ -3,13 +3,13 @@
|
|||||||
<li v-for="(item, i) in menu" :class="item ? item.type : item === null ? 'divider' : null">
|
<li v-for="(item, i) in menu" :class="item ? item.type : item === null ? 'divider' : null">
|
||||||
<template v-if="item">
|
<template v-if="item">
|
||||||
<template v-if="item.type == null || item.type == 'item'">
|
<template v-if="item.type == null || item.type == 'item'">
|
||||||
<p @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</p>
|
<p @click="click(item)"><i v-if="item.icon" :class="$style.icon"><fa :icon="item.icon"/></i>{{ item.text }}</p>
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="item.type == 'link'">
|
<template v-else-if="item.type == 'link'">
|
||||||
<a :href="item.href" :target="item.target" @click="click(item)"><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}</a>
|
<a :href="item.href" :target="item.target" @click="click(item)"><i v-if="item.icon" :class="$style.icon"><fa :icon="item.icon"/></i>{{ item.text }}</a>
|
||||||
</template>
|
</template>
|
||||||
<template v-else-if="item.type == 'nest'">
|
<template v-else-if="item.type == 'nest'">
|
||||||
<p><span :class="$style.icon" v-if="item.icon" v-html="item.icon"></span>{{ item.text }}...<span class="caret">%fa:caret-right%</span></p>
|
<p><i v-if="item.icon" :class="$style.icon"><fa :icon="item.icon"/></i>{{ item.text }}...<span class="caret"><fa icon="caret-right"/></span></p>
|
||||||
<me-nu :menu="item.menu" @x="click"/>
|
<me-nu :menu="item.menu" @x="click"/>
|
||||||
</template>
|
</template>
|
||||||
</template>
|
</template>
|
||||||
@ -113,7 +113,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" module>
|
<style lang="stylus" module>
|
||||||
.icon
|
.icon
|
||||||
> *
|
display inline-block
|
||||||
width 28px
|
width 28px
|
||||||
margin-left -28px
|
margin-left -28px
|
||||||
text-align center
|
text-align center
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal width="800px" :can-close="false">
|
<mk-window ref="window" is-modal width="800px" :can-close="false">
|
||||||
<span slot="header">%fa:crop%{{ title }}</span>
|
<span slot="header"><fa icon="crop"/>{{ title }}</span>
|
||||||
<div class="body">
|
<div class="body">
|
||||||
<vue-cropper ref="cropper"
|
<vue-cropper ref="cropper"
|
||||||
:src="image.url"
|
:src="image.url"
|
||||||
@ -64,7 +64,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
|
|
||||||
.header
|
.header
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
.img
|
.img
|
||||||
|
@ -91,8 +91,6 @@ export default Vue.extend({
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
|
|
||||||
|
|
||||||
.mk-dialog
|
.mk-dialog
|
||||||
> .bg
|
> .bg
|
||||||
display block
|
display block
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<mk-window ref="window" @closed="destroyDom" width="800px" height="500px" :popout-url="popout">
|
<mk-window ref="window" @closed="destroyDom" width="800px" height="500px" :popout-url="popout">
|
||||||
<template slot="header">
|
<template slot="header">
|
||||||
<p v-if="usage" :class="$style.info"><b>{{ usage.toFixed(1) }}%</b> %i18n:@used%</p>
|
<p v-if="usage" :class="$style.info"><b>{{ usage.toFixed(1) }}%</b> %i18n:@used%</p>
|
||||||
<span :class="$style.title">%fa:cloud%%i18n:common.drive%</span>
|
<span :class="$style.title"><fa icon="cloud"/>%i18n:common.drive%</span>
|
||||||
</template>
|
</template>
|
||||||
<mk-drive :class="$style.browser" multiple :init-folder="folder" ref="browser"/>
|
<mk-drive :class="$style.browser" multiple :init-folder="folder" ref="browser"/>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
@ -39,7 +39,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" module>
|
<style lang="stylus" module>
|
||||||
.title
|
.title
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
.info
|
.info
|
||||||
|
@ -71,27 +71,27 @@ export default Vue.extend({
|
|||||||
contextmenu((this as any).os)(e, [{
|
contextmenu((this as any).os)(e, [{
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:@contextmenu.rename%',
|
text: '%i18n:@contextmenu.rename%',
|
||||||
icon: '%fa:i-cursor%',
|
icon: 'i-cursor',
|
||||||
action: this.rename
|
action: this.rename
|
||||||
}, {
|
}, {
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: this.file.isSensitive ? '%i18n:@contextmenu.unmark-as-sensitive%' : '%i18n:@contextmenu.mark-as-sensitive%',
|
text: this.file.isSensitive ? '%i18n:@contextmenu.unmark-as-sensitive%' : '%i18n:@contextmenu.mark-as-sensitive%',
|
||||||
icon: this.file.isSensitive ? '%fa:R eye%' : '%fa:R eye-slash%',
|
icon: this.file.isSensitive ? ['far', 'eye'] : ['far', 'eye-slash'],
|
||||||
action: this.toggleSensitive
|
action: this.toggleSensitive
|
||||||
}, null, {
|
}, null, {
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:@contextmenu.copy-url%',
|
text: '%i18n:@contextmenu.copy-url%',
|
||||||
icon: '%fa:link%',
|
icon: 'link',
|
||||||
action: this.copyUrl
|
action: this.copyUrl
|
||||||
}, {
|
}, {
|
||||||
type: 'link',
|
type: 'link',
|
||||||
href: `${this.file.url}?download`,
|
href: `${this.file.url}?download`,
|
||||||
text: '%i18n:@contextmenu.download%',
|
text: '%i18n:@contextmenu.download%',
|
||||||
icon: '%fa:download%',
|
icon: 'download',
|
||||||
}, null, {
|
}, null, {
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:common.delete%',
|
text: '%i18n:common.delete%',
|
||||||
icon: '%fa:R trash-alt%',
|
icon: ['far', 'trash-alt'],
|
||||||
action: this.deleteFile
|
action: this.deleteFile
|
||||||
}, null, {
|
}, null, {
|
||||||
type: 'nest',
|
type: 'nest',
|
||||||
@ -170,7 +170,7 @@ export default Vue.extend({
|
|||||||
copyUrl() {
|
copyUrl() {
|
||||||
copyToClipboard(this.file.url);
|
copyToClipboard(this.file.url);
|
||||||
(this as any).apis.dialog({
|
(this as any).apis.dialog({
|
||||||
title: '%fa:check%%i18n:@contextmenu.copied%',
|
title: '<fa icon="check"/>%i18n:@contextmenu.copied%',
|
||||||
text: '%i18n:@contextmenu.copied-url-to-clipboard%',
|
text: '%i18n:@contextmenu.copied-url-to-clipboard%',
|
||||||
actions: [{
|
actions: [{
|
||||||
text: '%i18n:common.ok%'
|
text: '%i18n:common.ok%'
|
||||||
|
@ -16,8 +16,8 @@
|
|||||||
:title="title"
|
:title="title"
|
||||||
>
|
>
|
||||||
<p class="name">
|
<p class="name">
|
||||||
<template v-if="hover">%fa:R folder-open .fw%</template>
|
<template v-if="hover"><fa :icon="['far', 'folder-open']" fixed-width/></template>
|
||||||
<template v-if="!hover">%fa:R folder .fw%</template>
|
<template v-if="!hover"><fa :icon="['far', 'folder']" fixed-width/></template>
|
||||||
{{ folder.name }}
|
{{ folder.name }}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -55,22 +55,22 @@ export default Vue.extend({
|
|||||||
contextmenu((this as any).os)(e, [{
|
contextmenu((this as any).os)(e, [{
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:@contextmenu.move-to-this-folder%',
|
text: '%i18n:@contextmenu.move-to-this-folder%',
|
||||||
icon: '%fa:arrow-right%',
|
icon: 'arrow-right',
|
||||||
action: this.go
|
action: this.go
|
||||||
}, {
|
}, {
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:@contextmenu.show-in-new-window%',
|
text: '%i18n:@contextmenu.show-in-new-window%',
|
||||||
icon: '%fa:R window-restore%',
|
icon: ['far', 'window-restore'],
|
||||||
action: this.newWindow
|
action: this.newWindow
|
||||||
}, null, {
|
}, null, {
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:@contextmenu.rename%',
|
text: '%i18n:@contextmenu.rename%',
|
||||||
icon: '%fa:i-cursor%',
|
icon: 'i-cursor',
|
||||||
action: this.rename
|
action: this.rename
|
||||||
}, null, {
|
}, null, {
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:common.delete%',
|
text: '%i18n:common.delete%',
|
||||||
icon: '%fa:R trash-alt%',
|
icon: ['far', 'trash-alt'],
|
||||||
action: this.deleteFolder
|
action: this.deleteFolder
|
||||||
}], {
|
}], {
|
||||||
closed: () => {
|
closed: () => {
|
||||||
@ -155,7 +155,7 @@ export default Vue.extend({
|
|||||||
switch (err) {
|
switch (err) {
|
||||||
case 'detected-circular-definition':
|
case 'detected-circular-definition':
|
||||||
(this as any).apis.dialog({
|
(this as any).apis.dialog({
|
||||||
title: '%fa:exclamation-triangle%%i18n:@unable-to-process%',
|
title: '<fa icon="exclamation-triangle"/>%i18n:@unable-to-process%',
|
||||||
text: '%i18n:@circular-reference-detected%',
|
text: '%i18n:@circular-reference-detected%',
|
||||||
actions: [{
|
actions: [{
|
||||||
text: '%i18n:common.ok%'
|
text: '%i18n:common.ok%'
|
||||||
@ -255,7 +255,7 @@ export default Vue.extend({
|
|||||||
font-size 0.9em
|
font-size 0.9em
|
||||||
color var(--desktopDriveFolderFg)
|
color var(--desktopDriveFolderFg)
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
margin-left 2px
|
margin-left 2px
|
||||||
text-align left
|
text-align left
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
@dragleave="onDragleave"
|
@dragleave="onDragleave"
|
||||||
@drop.stop="onDrop"
|
@drop.stop="onDrop"
|
||||||
>
|
>
|
||||||
<template v-if="folder == null">%fa:cloud%</template>
|
<i v-if="folder == null" class="cloud"><fa icon="cloud"/></i>
|
||||||
<span>{{ folder == null ? '%i18n:common.drive%' : folder.name }}</span>
|
<span>{{ folder == null ? '%i18n:common.drive%' : folder.name }}</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -110,7 +110,7 @@ export default Vue.extend({
|
|||||||
&[data-draghover]
|
&[data-draghover]
|
||||||
background #eee
|
background #eee
|
||||||
|
|
||||||
[data-fa].cloud
|
i.cloud
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -4,10 +4,10 @@
|
|||||||
<div class="path" @contextmenu.prevent.stop="() => {}">
|
<div class="path" @contextmenu.prevent.stop="() => {}">
|
||||||
<x-nav-folder :class="{ current: folder == null }"/>
|
<x-nav-folder :class="{ current: folder == null }"/>
|
||||||
<template v-for="folder in hierarchyFolders">
|
<template v-for="folder in hierarchyFolders">
|
||||||
<span class="separator">%fa:angle-right%</span>
|
<span class="separator"><fa icon="angle-right"/></span>
|
||||||
<x-nav-folder :folder="folder" :key="folder.id"/>
|
<x-nav-folder :folder="folder" :key="folder.id"/>
|
||||||
</template>
|
</template>
|
||||||
<span class="separator" v-if="folder != null">%fa:angle-right%</span>
|
<span class="separator" v-if="folder != null"><fa icon="angle-right"/></span>
|
||||||
<span class="folder current" v-if="folder != null">{{ folder.name }}</span>
|
<span class="folder current" v-if="folder != null">{{ folder.name }}</span>
|
||||||
</div>
|
</div>
|
||||||
<!--
|
<!--
|
||||||
@ -138,17 +138,17 @@ export default Vue.extend({
|
|||||||
contextmenu((this as any).os)(e, [{
|
contextmenu((this as any).os)(e, [{
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:@contextmenu.create-folder%',
|
text: '%i18n:@contextmenu.create-folder%',
|
||||||
icon: '%fa:R folder%',
|
icon: ['far', 'folder'],
|
||||||
action: this.createFolder
|
action: this.createFolder
|
||||||
}, {
|
}, {
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:@contextmenu.upload%',
|
text: '%i18n:@contextmenu.upload%',
|
||||||
icon: '%fa:upload%',
|
icon: 'upload',
|
||||||
action: this.selectLocalFile
|
action: this.selectLocalFile
|
||||||
}, {
|
}, {
|
||||||
type: 'item',
|
type: 'item',
|
||||||
text: '%i18n:@contextmenu.url-upload%',
|
text: '%i18n:@contextmenu.url-upload%',
|
||||||
icon: '%fa:cloud-upload-alt%',
|
icon: 'cloud-upload-alt',
|
||||||
action: this.urlUpload
|
action: this.urlUpload
|
||||||
}]);
|
}]);
|
||||||
},
|
},
|
||||||
@ -313,7 +313,7 @@ export default Vue.extend({
|
|||||||
switch (err) {
|
switch (err) {
|
||||||
case 'detected-circular-definition':
|
case 'detected-circular-definition':
|
||||||
(this as any).apis.dialog({
|
(this as any).apis.dialog({
|
||||||
title: '%fa:exclamation-triangle%%i18n:@unable-to-process%',
|
title: '<fa icon="exclamation-triangle"/>%i18n:@unable-to-process%',
|
||||||
text: '%i18n:@circular-reference-detected%',
|
text: '%i18n:@circular-reference-detected%',
|
||||||
actions: [{
|
actions: [{
|
||||||
text: '%i18n:common.ok%'
|
text: '%i18n:common.ok%'
|
||||||
@ -343,7 +343,7 @@ export default Vue.extend({
|
|||||||
});
|
});
|
||||||
|
|
||||||
(this as any).apis.dialog({
|
(this as any).apis.dialog({
|
||||||
title: '%fa:check%%i18n:@url-upload-requested%',
|
title: '<fa icon="check"/>%i18n:@url-upload-requested%',
|
||||||
text: '%i18n:@may-take-time%',
|
text: '%i18n:@may-take-time%',
|
||||||
actions: [{
|
actions: [{
|
||||||
text: '%i18n:common.ok%'
|
text: '%i18n:common.ok%'
|
||||||
@ -613,9 +613,6 @@ export default Vue.extend({
|
|||||||
line-height 38px
|
line-height 38px
|
||||||
cursor pointer
|
cursor pointer
|
||||||
|
|
||||||
i
|
|
||||||
margin-right 4px
|
|
||||||
|
|
||||||
*
|
*
|
||||||
pointer-events none
|
pointer-events none
|
||||||
|
|
||||||
@ -635,7 +632,7 @@ export default Vue.extend({
|
|||||||
opacity 0.5
|
opacity 0.5
|
||||||
cursor default
|
cursor default
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin 0
|
margin 0
|
||||||
|
|
||||||
> .search
|
> .search
|
||||||
|
@ -5,13 +5,13 @@
|
|||||||
:disabled="wait"
|
:disabled="wait"
|
||||||
>
|
>
|
||||||
<template v-if="!wait">
|
<template v-if="!wait">
|
||||||
<template v-if="u.hasPendingFollowRequestFromYou && u.isLocked">%fa:hourglass-half%<template v-if="size == 'big'"> %i18n:@request-pending%</template></template>
|
<template v-if="u.hasPendingFollowRequestFromYou && u.isLocked"><fa icon="hourglass-half"/><template v-if="size == 'big'"> %i18n:@request-pending%</template></template>
|
||||||
<template v-else-if="u.hasPendingFollowRequestFromYou && !u.isLocked">%fa:hourglass-start%<template v-if="size == 'big'"> %i18n:@follow-processing%</template></template>
|
<template v-else-if="u.hasPendingFollowRequestFromYou && !u.isLocked"><fa icon="hourglass-start"/><template v-if="size == 'big'"> %i18n:@follow-processing%</template></template>
|
||||||
<template v-else-if="u.isFollowing">%fa:minus%<template v-if="size == 'big'"> %i18n:@following%</template></template>
|
<template v-else-if="u.isFollowing"><fa icon="minus"/><template v-if="size == 'big'"> %i18n:@following%</template></template>
|
||||||
<template v-else-if="!u.isFollowing && u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow-request%</template></template>
|
<template v-else-if="!u.isFollowing && u.isLocked"><fa icon="plus"/><template v-if="size == 'big'"> %i18n:@follow-request%</template></template>
|
||||||
<template v-else-if="!u.isFollowing && !u.isLocked">%fa:plus%<template v-if="size == 'big'"> %i18n:@follow%</template></template>
|
<template v-else-if="!u.isFollowing && !u.isLocked"><fa icon="plus"/><template v-if="size == 'big'"> %i18n:@follow%</template></template>
|
||||||
</template>
|
</template>
|
||||||
<template v-else>%fa:spinner .pulse .fw%</template>
|
<template v-else><fa icon="spinner .pulse" fixed-width/></template>
|
||||||
</button>
|
</button>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -11,9 +11,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p class="empty" v-if="!fetching && users.length == 0">%i18n:@empty%</p>
|
<p class="empty" v-if="!fetching && users.length == 0">%i18n:@empty%</p>
|
||||||
<p class="fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@fetching%<mk-ellipsis/></p>
|
<p class="fetching" v-if="fetching"><fa icon="spinner .pulse" fixed-width/>%i18n:@fetching%<mk-ellipsis/></p>
|
||||||
<a class="refresh" @click="refresh">%i18n:@refresh%</a>
|
<a class="refresh" @click="refresh">%i18n:@refresh%</a>
|
||||||
<button class="close" @click="destroyDom()" title="%i18n:@close%">%fa:times%</button>
|
<button class="close" @click="destroyDom()" title="%i18n:@close%"><fa icon="times"/></button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ export default Vue.extend({
|
|||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color #aaa
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .refresh
|
> .refresh
|
||||||
@ -155,7 +155,7 @@ export default Vue.extend({
|
|||||||
&:active
|
&:active
|
||||||
color #222
|
color #222
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
padding 14px
|
padding 14px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="destroyDom">
|
<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="destroyDom">
|
||||||
<span slot="header" :class="$style.header">%fa:gamepad%%i18n:@game%</span>
|
<span slot="header" :class="$style.header"><fa icon="gamepad"/>%i18n:@game%</span>
|
||||||
<mk-reversi :class="$style.content" @gamed="g => game = g"/>
|
<mk-reversi :class="$style.content" @gamed="g => game = g"/>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
</template>
|
</template>
|
||||||
@ -27,7 +27,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" module>
|
<style lang="stylus" module>
|
||||||
.header
|
.header
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
.content
|
.content
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="mk-home" :data-customize="customize">
|
<div class="mk-home" :data-customize="customize">
|
||||||
<div class="customize" v-if="customize">
|
<div class="customize" v-if="customize">
|
||||||
<router-link to="/">%fa:check%%i18n:@done%</router-link>
|
<router-link to="/"><fa icon="check"/>%i18n:@done%</router-link>
|
||||||
<div>
|
<div>
|
||||||
<div class="adder">
|
<div class="adder">
|
||||||
<p>%i18n:@add-widget%</p>
|
<p>%i18n:@add-widget%</p>
|
||||||
@ -185,7 +185,7 @@ export default Vue.extend({
|
|||||||
methods: {
|
methods: {
|
||||||
hint() {
|
hint() {
|
||||||
(this as any).apis.dialog({
|
(this as any).apis.dialog({
|
||||||
title: '%fa:info-circle%%i18n:common.customization-tips.title%',
|
title: '<fa icon="info-circle"/>%i18n:common.customization-tips.title%',
|
||||||
text: '<p>%i18n:common.customization-tips.paragraph1%</p>' +
|
text: '<p>%i18n:common.customization-tips.paragraph1%</p>' +
|
||||||
'<p>%i18n:common.customization-tips.paragraph2%</p>' +
|
'<p>%i18n:common.customization-tips.paragraph2%</p>' +
|
||||||
'<p>%i18n:common.customization-tips.paragraph3%</p>' +
|
'<p>%i18n:common.customization-tips.paragraph3%</p>' +
|
||||||
@ -299,7 +299,7 @@ export default Vue.extend({
|
|||||||
background var(--primaryDarken10)
|
background var(--primaryDarken10)
|
||||||
transition background 0s ease
|
transition background 0s ease
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 8px
|
margin-right 8px
|
||||||
|
|
||||||
> div
|
> div
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal width="500px" @before-close="beforeClose" @closed="destroyDom">
|
<mk-window ref="window" is-modal width="500px" @before-close="beforeClose" @closed="destroyDom">
|
||||||
<span slot="header" :class="$style.header">
|
<span slot="header" :class="$style.header">
|
||||||
%fa:i-cursor%{{ title }}
|
<fa icon="i-cursor"/>{{ title }}
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
<div :class="$style.body">
|
<div :class="$style.body">
|
||||||
@ -76,10 +76,8 @@ export default Vue.extend({
|
|||||||
|
|
||||||
|
|
||||||
<style lang="stylus" module>
|
<style lang="stylus" module>
|
||||||
|
|
||||||
|
|
||||||
.header
|
.header
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
.body
|
.body
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="ldwbgwstjsdgcjruamauqdrffetqudry" v-if="image.isSensitive && hide && !$store.state.device.alwaysShowNsfw" @click="hide = false">
|
<div class="ldwbgwstjsdgcjruamauqdrffetqudry" v-if="image.isSensitive && hide && !$store.state.device.alwaysShowNsfw" @click="hide = false">
|
||||||
<div>
|
<div>
|
||||||
<b>%fa:exclamation-triangle% %i18n:@sensitive%</b>
|
<b><fa icon="exclamation-triangle"/> %i18n:@sensitive%</b>
|
||||||
<span>%i18n:@click-to-show%</span>
|
<span>%i18n:@click-to-show%</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="uofhebxjdgksfmltszlxurtjnjjsvioh" v-if="video.isSensitive && hide" @click="hide = false">
|
<div class="uofhebxjdgksfmltszlxurtjnjjsvioh" v-if="video.isSensitive && hide" @click="hide = false">
|
||||||
<div>
|
<div>
|
||||||
<b>%fa:exclamation-triangle% %i18n:@sensitive%</b>
|
<b><fa icon="exclamation-triangle"/> %i18n:@sensitive%</b>
|
||||||
<span>%i18n:@click-to-show%</span>
|
<span>%i18n:@click-to-show%</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -12,7 +12,7 @@
|
|||||||
@click.prevent="onClick"
|
@click.prevent="onClick"
|
||||||
:title="video.name"
|
:title="video.name"
|
||||||
>
|
>
|
||||||
%fa:R play-circle%
|
<fa :icon="['far', 'play-circle']"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="destroyDom">
|
<mk-window ref="window" width="500px" height="560px" :popout-url="popout" @closed="destroyDom">
|
||||||
<span slot="header" :class="$style.header">%fa:comments%%i18n:@title% {{ user | userName }}</span>
|
<span slot="header" :class="$style.header"><fa icon="comments"/>%i18n:@title% {{ user | userName }}</span>
|
||||||
<mk-messaging-room :user="user" :class="$style.content"/>
|
<mk-messaging-room :user="user" :class="$style.content"/>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
</template>
|
</template>
|
||||||
@ -22,7 +22,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" module>
|
<style lang="stylus" module>
|
||||||
.header
|
.header
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
.content
|
.content
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" width="500px" height="560px" @closed="destroyDom">
|
<mk-window ref="window" width="500px" height="560px" @closed="destroyDom">
|
||||||
<span slot="header" :class="$style.header">%fa:comments%%i18n:@title%</span>
|
<span slot="header" :class="$style.header"><fa icon="comments"/>%i18n:@title%</span>
|
||||||
<mk-messaging :class="$style.content" @navigate="navigate"/>
|
<mk-messaging :class="$style.content" @navigate="navigate"/>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
</template>
|
</template>
|
||||||
@ -22,7 +22,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" module>
|
<style lang="stylus" module>
|
||||||
.header
|
.header
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
.content
|
.content
|
||||||
|
@ -7,8 +7,8 @@
|
|||||||
@click="fetchConversation"
|
@click="fetchConversation"
|
||||||
:disabled="conversationFetching"
|
:disabled="conversationFetching"
|
||||||
>
|
>
|
||||||
<template v-if="!conversationFetching">%fa:ellipsis-v%</template>
|
<template v-if="!conversationFetching"><fa icon="ellipsis-v"/></template>
|
||||||
<template v-if="conversationFetching">%fa:spinner .pulse%</template>
|
<template v-if="conversationFetching"><fa icon="spinner .pulse"/></template>
|
||||||
</button>
|
</button>
|
||||||
<div class="conversation">
|
<div class="conversation">
|
||||||
<x-sub v-for="note in conversation" :key="note.id" :note="note"/>
|
<x-sub v-for="note in conversation" :key="note.id" :note="note"/>
|
||||||
@ -19,7 +19,7 @@
|
|||||||
<div class="renote" v-if="isRenote">
|
<div class="renote" v-if="isRenote">
|
||||||
<p>
|
<p>
|
||||||
<mk-avatar class="avatar" :user="note.user"/>
|
<mk-avatar class="avatar" :user="note.user"/>
|
||||||
%fa:retweet%
|
<fa icon="retweet"/>
|
||||||
<router-link class="name" :href="note.user | userPage">{{ note.user | userName }}</router-link>
|
<router-link class="name" :href="note.user | userPage">{{ note.user | userName }}</router-link>
|
||||||
<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
|
<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
|
||||||
<a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a>
|
<a class="name" :href="note.user | userPage" v-user-preview="note.userId">{{ note.user | userName }}</a>
|
||||||
@ -52,7 +52,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<mk-poll v-if="p.poll" :note="p"/>
|
<mk-poll v-if="p.poll" :note="p"/>
|
||||||
<mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/>
|
<mk-url-preview v-for="url in urls" :url="url" :key="url" :detail="true"/>
|
||||||
<a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% %i18n:@location%</a>
|
<a class="location" v-if="p.geo" :href="`https://maps.google.com/maps?q=${p.geo.coordinates[1]},${p.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> %i18n:@location%</a>
|
||||||
<div class="map" v-if="p.geo" ref="map"></div>
|
<div class="map" v-if="p.geo" ref="map"></div>
|
||||||
<div class="renote" v-if="p.renote">
|
<div class="renote" v-if="p.renote">
|
||||||
<mk-note-preview :note="p.renote"/>
|
<mk-note-preview :note="p.renote"/>
|
||||||
@ -62,18 +62,18 @@
|
|||||||
<footer>
|
<footer>
|
||||||
<mk-reactions-viewer :note="p"/>
|
<mk-reactions-viewer :note="p"/>
|
||||||
<button class="replyButton" @click="reply" title="">
|
<button class="replyButton" @click="reply" title="">
|
||||||
<template v-if="p.reply">%fa:reply-all%</template>
|
<template v-if="p.reply"><fa icon="reply-all"/></template>
|
||||||
<template v-else>%fa:reply%</template>
|
<template v-else><fa icon="reply"/></template>
|
||||||
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
<p class="count" v-if="p.repliesCount > 0">{{ p.repliesCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button class="renoteButton" @click="renote" title="%i18n:@renote%">
|
<button class="renoteButton" @click="renote" title="%i18n:@renote%">
|
||||||
%fa:retweet%<p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
|
<fa icon="retweet"/><p class="count" v-if="p.renoteCount > 0">{{ p.renoteCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button class="reactionButton" :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
|
<button class="reactionButton" :class="{ reacted: p.myReaction != null }" @click="react" ref="reactButton" title="%i18n:@add-reaction%">
|
||||||
%fa:plus%<p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
|
<fa icon="plus"/><p class="count" v-if="p.reactions_count > 0">{{ p.reactions_count }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="menu" ref="menuButton">
|
<button @click="menu" ref="menuButton">
|
||||||
%fa:ellipsis-h%
|
<fa icon="ellipsis-h"/>
|
||||||
</button>
|
</button>
|
||||||
</footer>
|
</footer>
|
||||||
</article>
|
</article>
|
||||||
@ -278,7 +278,7 @@ export default Vue.extend({
|
|||||||
margin 0 8px 0 0
|
margin 0 8px 0 0
|
||||||
border-radius 6px
|
border-radius 6px
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
.name
|
.name
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="renote" v-if="isRenote">
|
<div class="renote" v-if="isRenote">
|
||||||
<mk-avatar class="avatar" :user="note.user"/>
|
<mk-avatar class="avatar" :user="note.user"/>
|
||||||
%fa:retweet%
|
<fa icon="retweet"/>
|
||||||
<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
|
<span>{{ '%i18n:@reposted-by%'.substr(0, '%i18n:@reposted-by%'.indexOf('{')) }}</span>
|
||||||
<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>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span>
|
<span>{{ '%i18n:@reposted-by%'.substr('%i18n:@reposted-by%'.indexOf('}') + 1) }}</span>
|
||||||
@ -33,7 +33,7 @@
|
|||||||
<div class="content" v-show="appearNote.cw == null || showContent">
|
<div class="content" v-show="appearNote.cw == null || showContent">
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<span v-if="appearNote.isHidden" style="opacity: 0.5">%i18n:@private%</span>
|
<span v-if="appearNote.isHidden" style="opacity: 0.5">%i18n:@private%</span>
|
||||||
<a class="reply" v-if="appearNote.reply">%fa:reply%</a>
|
<a class="reply" v-if="appearNote.reply"><fa icon="reply"/></a>
|
||||||
<misskey-flavored-markdown v-if="appearNote.text" :text="appearNote.text" :i="$store.state.i" :class="$style.text" :customEmojis="appearNote.emojis"/>
|
<misskey-flavored-markdown v-if="appearNote.text" :text="appearNote.text" :i="$store.state.i" :class="$style.text" :customEmojis="appearNote.emojis"/>
|
||||||
<a class="rp" v-if="appearNote.renote">RN:</a>
|
<a class="rp" v-if="appearNote.renote">RN:</a>
|
||||||
</div>
|
</div>
|
||||||
@ -41,7 +41,7 @@
|
|||||||
<mk-media-list :media-list="appearNote.files"/>
|
<mk-media-list :media-list="appearNote.files"/>
|
||||||
</div>
|
</div>
|
||||||
<mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/>
|
<mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/>
|
||||||
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank">%fa:map-marker-alt% 位置情報</a>
|
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> 位置情報</a>
|
||||||
<div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote" :mini="mini"/></div>
|
<div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote" :mini="mini"/></div>
|
||||||
<mk-url-preview v-for="url in urls" :url="url" :key="url" :mini="mini"/>
|
<mk-url-preview v-for="url in urls" :url="url" :key="url" :mini="mini"/>
|
||||||
</div>
|
</div>
|
||||||
@ -49,18 +49,18 @@
|
|||||||
<footer>
|
<footer>
|
||||||
<mk-reactions-viewer :note="appearNote" ref="reactionsViewer"/>
|
<mk-reactions-viewer :note="appearNote" ref="reactionsViewer"/>
|
||||||
<button class="replyButton" @click="reply()" title="%i18n:@reply%">
|
<button class="replyButton" @click="reply()" title="%i18n:@reply%">
|
||||||
<template v-if="appearNote.reply">%fa:reply-all%</template>
|
<template v-if="appearNote.reply"><fa icon="reply-all"/></template>
|
||||||
<template v-else>%fa:reply%</template>
|
<template v-else><fa icon="reply"/></template>
|
||||||
<p class="count" v-if="appearNote.repliesCount > 0">{{ appearNote.repliesCount }}</p>
|
<p class="count" v-if="appearNote.repliesCount > 0">{{ appearNote.repliesCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button class="renoteButton" @click="renote()" title="%i18n:@renote%">
|
<button class="renoteButton" @click="renote()" title="%i18n:@renote%">
|
||||||
%fa:retweet%<p class="count" v-if="appearNote.renoteCount > 0">{{ appearNote.renoteCount }}</p>
|
<fa icon="retweet"/><p class="count" v-if="appearNote.renoteCount > 0">{{ appearNote.renoteCount }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button class="reactionButton" :class="{ reacted: appearNote.myReaction != null }" @click="react()" ref="reactButton" title="%i18n:@add-reaction%">
|
<button class="reactionButton" :class="{ reacted: appearNote.myReaction != null }" @click="react()" ref="reactButton" title="%i18n:@add-reaction%">
|
||||||
%fa:plus%<p class="count" v-if="appearNote.reactions_count > 0">{{ appearNote.reactions_count }}</p>
|
<fa icon="plus"/><p class="count" v-if="appearNote.reactions_count > 0">{{ appearNote.reactions_count }}</p>
|
||||||
</button>
|
</button>
|
||||||
<button @click="menu()" ref="menuButton">
|
<button @click="menu()" ref="menuButton">
|
||||||
%fa:ellipsis-h%
|
<fa icon="ellipsis-h"/>
|
||||||
</button>
|
</button>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
@ -190,7 +190,7 @@ export default Vue.extend({
|
|||||||
margin 0 8px 0 0
|
margin 0 8px 0 0
|
||||||
border-radius 6px
|
border-radius 6px
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> span
|
> span
|
||||||
|
@ -17,8 +17,8 @@
|
|||||||
<template v-for="(note, i) in _notes">
|
<template v-for="(note, i) in _notes">
|
||||||
<x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)" ref="note"/>
|
<x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)" ref="note"/>
|
||||||
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
|
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
|
||||||
<span>%fa:angle-up%{{ note._datetext }}</span>
|
<span><fa icon="angle-up"/>{{ note._datetext }}</span>
|
||||||
<span>%fa:angle-down%{{ _notes[i + 1]._datetext }}</span>
|
<span><fa icon="angle-down"/>{{ _notes[i + 1]._datetext }}</span>
|
||||||
</p>
|
</p>
|
||||||
</template>
|
</template>
|
||||||
</component>
|
</component>
|
||||||
@ -26,7 +26,7 @@
|
|||||||
<footer v-if="more">
|
<footer v-if="more">
|
||||||
<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
<button @click="loadMore" :disabled="moreFetching" :style="{ cursor: moreFetching ? 'wait' : 'pointer' }">
|
||||||
<template v-if="!moreFetching">%i18n:@load-more%</template>
|
<template v-if="!moreFetching">%i18n:@load-more%</template>
|
||||||
<template v-if="moreFetching">%fa:spinner .pulse .fw%</template>
|
<template v-if="moreFetching"><fa icon="spinner .pulse" fixed-width/></template>
|
||||||
</button>
|
</button>
|
||||||
</footer>
|
</footer>
|
||||||
</div>
|
</div>
|
||||||
@ -230,7 +230,7 @@ export default Vue.extend({
|
|||||||
span
|
span
|
||||||
margin 0 16px
|
margin 0 16px
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
margin-right 8px
|
margin-right 8px
|
||||||
|
|
||||||
> .newer-indicator
|
> .newer-indicator
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
|
<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
|
||||||
</p>
|
</p>
|
||||||
<router-link class="note-ref" :to="notification.note | notePage">
|
<router-link class="note-ref" :to="notification.note | notePage">
|
||||||
%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%
|
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}<fa icon="quote-right"/>
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -29,11 +29,11 @@
|
|||||||
<template v-if="notification.type == 'renote'">
|
<template v-if="notification.type == 'renote'">
|
||||||
<mk-avatar class="avatar" :user="notification.note.user"/>
|
<mk-avatar class="avatar" :user="notification.note.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p>%fa:retweet%
|
<p><fa icon="retweet"/>
|
||||||
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
|
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
|
||||||
</p>
|
</p>
|
||||||
<router-link class="note-ref" :to="notification.note | notePage">
|
<router-link class="note-ref" :to="notification.note | notePage">
|
||||||
%fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right%
|
<fa icon="quote-left"/>{{ getNoteSummary(notification.note.renote) }}<fa icon="quote-right"/>
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@ -41,7 +41,7 @@
|
|||||||
<template v-if="notification.type == 'quote'">
|
<template v-if="notification.type == 'quote'">
|
||||||
<mk-avatar class="avatar" :user="notification.note.user"/>
|
<mk-avatar class="avatar" :user="notification.note.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p>%fa:quote-left%
|
<p><fa icon="quote-left"/>
|
||||||
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
|
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
|
||||||
</p>
|
</p>
|
||||||
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
|
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
|
||||||
@ -51,7 +51,7 @@
|
|||||||
<template v-if="notification.type == 'follow'">
|
<template v-if="notification.type == 'follow'">
|
||||||
<mk-avatar class="avatar" :user="notification.user"/>
|
<mk-avatar class="avatar" :user="notification.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p>%fa:user-plus%
|
<p><fa icon="user-plus"/>
|
||||||
<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
|
<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -60,7 +60,7 @@
|
|||||||
<template v-if="notification.type == 'receiveFollowRequest'">
|
<template v-if="notification.type == 'receiveFollowRequest'">
|
||||||
<mk-avatar class="avatar" :user="notification.user"/>
|
<mk-avatar class="avatar" :user="notification.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p>%fa:user-clock%
|
<p><fa icon="user-clock"/>
|
||||||
<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
|
<router-link :to="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</router-link>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
@ -69,7 +69,7 @@
|
|||||||
<template v-if="notification.type == 'reply'">
|
<template v-if="notification.type == 'reply'">
|
||||||
<mk-avatar class="avatar" :user="notification.note.user"/>
|
<mk-avatar class="avatar" :user="notification.note.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p>%fa:reply%
|
<p><fa icon="reply"/>
|
||||||
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
|
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
|
||||||
</p>
|
</p>
|
||||||
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
|
<router-link class="note-preview" :to="notification.note | notePage">{{ getNoteSummary(notification.note) }}</router-link>
|
||||||
@ -79,7 +79,7 @@
|
|||||||
<template v-if="notification.type == 'mention'">
|
<template v-if="notification.type == 'mention'">
|
||||||
<mk-avatar class="avatar" :user="notification.note.user"/>
|
<mk-avatar class="avatar" :user="notification.note.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p>%fa:at%
|
<p><fa icon="at"/>
|
||||||
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
|
<router-link :to="notification.note.user | userPage" v-user-preview="notification.note.userId">{{ notification.note.user | userName }}</router-link>
|
||||||
</p>
|
</p>
|
||||||
<a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a>
|
<a class="note-preview" :href="notification.note | notePage">{{ getNoteSummary(notification.note) }}</a>
|
||||||
@ -89,23 +89,23 @@
|
|||||||
<template v-if="notification.type == 'poll_vote'">
|
<template v-if="notification.type == 'poll_vote'">
|
||||||
<mk-avatar class="avatar" :user="notification.user"/>
|
<mk-avatar class="avatar" :user="notification.user"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<p>%fa:chart-pie%<a :href="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</a></p>
|
<p><fa icon="chart-pie"/><a :href="notification.user | userPage" v-user-preview="notification.user.id">{{ notification.user | userName }}</a></p>
|
||||||
<router-link class="note-ref" :to="notification.note | notePage">
|
<router-link class="note-ref" :to="notification.note | notePage">
|
||||||
%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%
|
<fa icon="quote-left"/>{{ getNoteSummary(notification.note) }}<fa icon="quote-right"/>
|
||||||
</router-link>
|
</router-link>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
|
<p class="date" v-if="i != notifications.length - 1 && notification._date != _notifications[i + 1]._date" :key="notification.id + '-time'">
|
||||||
<span>%fa:angle-up%{{ notification._datetext }}</span>
|
<span><fa icon="angle-up"/>{{ notification._datetext }}</span>
|
||||||
<span>%fa:angle-down%{{ _notifications[i + 1]._datetext }}</span>
|
<span><fa icon="angle-down"/>{{ _notifications[i + 1]._datetext }}</span>
|
||||||
</p>
|
</p>
|
||||||
</template>
|
</template>
|
||||||
</component>
|
</component>
|
||||||
</div>
|
</div>
|
||||||
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
|
<button class="more" :class="{ fetching: fetchingMoreNotifications }" v-if="moreNotifications" @click="fetchMoreNotifications" :disabled="fetchingMoreNotifications">
|
||||||
<template v-if="fetchingMoreNotifications">%fa:spinner .pulse .fw%</template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
|
<template v-if="fetchingMoreNotifications"><fa icon="spinner .pulse" fixed-width/></template>{{ fetchingMoreNotifications ? '%i18n:common.loading%' : '%i18n:@more%' }}
|
||||||
</button>
|
</button>
|
||||||
<p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p>
|
<p class="empty" v-if="notifications.length == 0 && !fetching">%i18n:@empty%</p>
|
||||||
</div>
|
</div>
|
||||||
@ -264,7 +264,7 @@ export default Vue.extend({
|
|||||||
.note-ref
|
.note-ref
|
||||||
color var(--noteText)
|
color var(--noteText)
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
font-size 1em
|
font-size 1em
|
||||||
font-weight normal
|
font-weight normal
|
||||||
font-style normal
|
font-style normal
|
||||||
@ -300,7 +300,7 @@ export default Vue.extend({
|
|||||||
span
|
span
|
||||||
margin 0 16px
|
margin 0 16px
|
||||||
|
|
||||||
[data-fa]
|
[data-icon]
|
||||||
margin-right 8px
|
margin-right 8px
|
||||||
|
|
||||||
> .more
|
> .more
|
||||||
@ -319,7 +319,7 @@ export default Vue.extend({
|
|||||||
&.fetching
|
&.fetching
|
||||||
cursor wait
|
cursor wait
|
||||||
|
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
> .empty
|
> .empty
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window class="mk-post-form-window" ref="window" is-modal @closed="onWindowClosed" :animation="animation">
|
<mk-window class="mk-post-form-window" ref="window" is-modal @closed="onWindowClosed" :animation="animation">
|
||||||
<span slot="header" class="mk-post-form-window--header">
|
<span slot="header" class="mk-post-form-window--header">
|
||||||
<span class="icon" v-if="geo">%fa:map-marker-alt%</span>
|
<span class="icon" v-if="geo"><fa icon="map-marker-alt"/></span>
|
||||||
<span v-if="!reply">%i18n:@note%</span>
|
<span v-if="!reply">%i18n:@note%</span>
|
||||||
<span v-if="reply">%i18n:@reply%</span>
|
<span v-if="reply">%i18n:@reply%</span>
|
||||||
<span class="count" v-if="files.length != 0">{{ '%i18n:@attaches%'.replace('{}', files.length) }}</span>
|
<span class="count" v-if="files.length != 0">{{ '%i18n:@attaches%'.replace('{}', files.length) }}</span>
|
||||||
|
@ -32,18 +32,18 @@
|
|||||||
<mk-poll-editor v-if="poll" ref="poll" @destroyed="poll = false" @updated="saveDraft()"/>
|
<mk-poll-editor v-if="poll" ref="poll" @destroyed="poll = false" @updated="saveDraft()"/>
|
||||||
</div>
|
</div>
|
||||||
<mk-uploader ref="uploader" @uploaded="attachMedia" @change="onChangeUploadings"/>
|
<mk-uploader ref="uploader" @uploaded="attachMedia" @change="onChangeUploadings"/>
|
||||||
<button class="upload" title="%i18n:@attach-media-from-local%" @click="chooseFile">%fa:upload%</button>
|
<button class="upload" title="%i18n:@attach-media-from-local%" @click="chooseFile"><fa icon="upload"/></button>
|
||||||
<button class="drive" title="%i18n:@attach-media-from-drive%" @click="chooseFileFromDrive">%fa:cloud%</button>
|
<button class="drive" title="%i18n:@attach-media-from-drive%" @click="chooseFileFromDrive"><fa icon="cloud"/></button>
|
||||||
<button class="kao" title="%i18n:@insert-a-kao%" @click="kao">%fa:R smile%</button>
|
<button class="kao" title="%i18n:@insert-a-kao%" @click="kao"><fa :icon="['far', 'smile']"/></button>
|
||||||
<button class="poll" title="%i18n:@create-poll%" @click="poll = !poll">%fa:chart-pie%</button>
|
<button class="poll" title="%i18n:@create-poll%" @click="poll = !poll"><fa icon="chart-pie"/></button>
|
||||||
<button class="poll" title="%i18n:@hide-contents%" @click="useCw = !useCw">%fa:eye-slash%</button>
|
<button class="poll" title="%i18n:@hide-contents%" @click="useCw = !useCw"><fa icon="eye-slash"/></button>
|
||||||
<button class="geo" title="%i18n:@attach-location-information%" @click="geo ? removeGeo() : setGeo()">%fa:map-marker-alt%</button>
|
<button class="geo" title="%i18n:@attach-location-information%" @click="geo ? removeGeo() : setGeo()"><fa icon="map-marker-alt"/></button>
|
||||||
<button class="visibility" title="%i18n:@visibility%" @click="setVisibility" ref="visibilityButton">
|
<button class="visibility" title="%i18n:@visibility%" @click="setVisibility" ref="visibilityButton">
|
||||||
<span v-if="visibility === 'public'">%fa:globe%</span>
|
<span v-if="visibility === 'public'"><fa icon="globe"/></span>
|
||||||
<span v-if="visibility === 'home'">%fa:home%</span>
|
<span v-if="visibility === 'home'"><fa icon="home"/></span>
|
||||||
<span v-if="visibility === 'followers'">%fa:unlock%</span>
|
<span v-if="visibility === 'followers'"><fa icon="unlock"/></span>
|
||||||
<span v-if="visibility === 'specified'">%fa:envelope%</span>
|
<span v-if="visibility === 'specified'"><fa icon="envelope"/></span>
|
||||||
<span v-if="visibility === 'private'">%fa:lock%</span>
|
<span v-if="visibility === 'private'"><fa icon="lock"/></span>
|
||||||
</button>
|
</button>
|
||||||
<p class="text-count" :class="{ over: this.trimmedLength(text) > this.maxNoteTextLength }">{{ this.maxNoteTextLength - this.trimmedLength(text) }}</p>
|
<p class="text-count" :class="{ over: this.trimmedLength(text) > this.maxNoteTextLength }">{{ this.maxNoteTextLength - this.trimmedLength(text) }}</p>
|
||||||
<button :class="{ posting }" class="submit" :disabled="!canPost" @click="post">
|
<button :class="{ posting }" class="submit" :disabled="!canPost" @click="post">
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal width="450px" height="500px" @closed="destroyDom">
|
<mk-window ref="window" is-modal width="450px" height="500px" @closed="destroyDom">
|
||||||
<span slot="header">%fa:envelope R% %i18n:@title%</span>
|
<span slot="header"><fa :icon="['far', 'envelope']"/> %i18n:@title%</span>
|
||||||
|
|
||||||
<div class="slpqaxdoxhvglersgjukmvizkqbmbokc">
|
<div class="slpqaxdoxhvglersgjukmvizkqbmbokc">
|
||||||
<div v-for="req in requests">
|
<div v-for="req in requests">
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal @closed="onWindowClosed" :animation="animation">
|
<mk-window ref="window" is-modal @closed="onWindowClosed" :animation="animation">
|
||||||
<span slot="header" :class="$style.header">%fa:retweet%%i18n:@title%</span>
|
<span slot="header" :class="$style.header"><fa icon="retweet"/>%i18n:@title%</span>
|
||||||
<mk-renote-form ref="form" :note="note" @posted="onPosted" @canceled="onCanceled" v-hotkey.global="keymap"/>
|
<mk-renote-form ref="form" :note="note" @posted="onPosted" @canceled="onCanceled" v-hotkey.global="keymap"/>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
</template>
|
</template>
|
||||||
@ -58,7 +58,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" module>
|
<style lang="stylus" module>
|
||||||
.header
|
.header
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<mk-window ref="window" is-modal width="700px" height="550px" @closed="destroyDom">
|
<mk-window ref="window" is-modal width="700px" height="550px" @closed="destroyDom">
|
||||||
<span slot="header" :class="$style.header">%fa:cog%%i18n:@settings%</span>
|
<span slot="header" :class="$style.header"><fa icon="cog"/>%i18n:@settings%</span>
|
||||||
<mk-settings :initial-page="initialPage" @done="close"/>
|
<mk-settings :initial-page="initialPage" @done="close"/>
|
||||||
</mk-window>
|
</mk-window>
|
||||||
</template>
|
</template>
|
||||||
@ -24,7 +24,7 @@ export default Vue.extend({
|
|||||||
|
|
||||||
<style lang="stylus" module>
|
<style lang="stylus" module>
|
||||||
.header
|
.header
|
||||||
> [data-fa]
|
> [data-icon]
|
||||||
margin-right 4px
|
margin-right 4px
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user