Compare commits

..

438 Commits

Author SHA1 Message Date
syuilo
3cd3e19199 Update version 2018-07-26 03:46:55 +09:00
syuilo
ed36ceadbc ✌️ 2018-07-26 03:46:18 +09:00
syuilo
8736c9dfe6 Merge pull request #1977 from yarnaimo/embedded-tweet
ツイートの埋め込み
2018-07-26 02:31:00 +09:00
ysr227
e44f33bf14 Embed tweet when tweet url attached 2018-07-26 00:03:32 +09:00
Aya Morisawa
6e39b73f07 Fix #1961 2018-07-25 13:37:40 +09:00
Aya Morisawa
01703e5584 Fix #1975 2018-07-25 13:30:59 +09:00
syuilo
fee7cb41cb Merge pull request #1965 from syuilo/l10n_master
New Crowdin translations
2018-07-25 13:07:06 +09:00
greenkeeper[bot]
bb14af8b40 fix(package): update gulp-uglify to version 3.0.1 2018-07-25 12:15:40 +09:00
greenkeeper[bot]
54b849e548 fix(package): update @types/node to version 10.5.3 2018-07-25 12:15:29 +09:00
syuilo
8f50482896 Add note 2018-07-25 09:54:03 +09:00
syuilo
b3b82e7595 Fix bug nado 2018-07-25 08:01:12 +09:00
syuilo
9c4e0a4ae6 ✌️ 2018-07-25 07:46:56 +09:00
syuilo
0b656999d8 Clean up 2018-07-25 07:45:38 +09:00
syuilo
7605a512ba Update appveyor.yml 2018-07-25 07:33:49 +09:00
syuilo
2018a29968 Update docs 2018-07-25 07:29:55 +09:00
syuilo
dbf335a05d Refactor: withFile --> requireFile 2018-07-25 07:18:50 +09:00
syuilo
ad5a7e9d70 Update CHANGELOG 2018-07-25 07:08:53 +09:00
syuilo
f8477fa88d 🎨 2018-07-25 04:36:02 +09:00
syuilo
a22ddb05ba Update docs 2018-07-25 04:15:22 +09:00
syuilo
9455edf2da Update docs 2018-07-25 04:10:56 +09:00
syuilo
4a2244327f New translations ja.yml (English) 2018-07-25 01:41:43 +09:00
syuilo
708a800a25 New translations ja.yml (Catalan) 2018-07-25 01:21:58 +09:00
syuilo
a34193ca16 New translations ja.yml (Portuguese) 2018-07-25 01:21:56 +09:00
syuilo
a4886975e4 New translations ja.yml (Korean) 2018-07-25 01:21:54 +09:00
syuilo
8b6a015602 New translations ja.yml (Polish) 2018-07-25 01:21:52 +09:00
syuilo
f915560752 New translations ja.yml (Chinese Simplified) 2018-07-25 01:21:50 +09:00
syuilo
f2f0910771 New translations ja.yml (Italian) 2018-07-25 01:21:48 +09:00
syuilo
9316e2ce15 New translations ja.yml (Russian) 2018-07-25 01:21:46 +09:00
syuilo
128573e73e New translations ja.yml (English) 2018-07-25 01:21:44 +09:00
syuilo
3d132ad803 New translations ja.yml (Spanish) 2018-07-25 01:21:42 +09:00
syuilo
6f671325fa New translations ja.yml (German) 2018-07-25 01:21:40 +09:00
syuilo
7e6ac77341 New translations ja.yml (French) 2018-07-25 01:21:38 +09:00
syuilo
51bafe8259 #1893 2018-07-25 01:14:38 +09:00
syuilo
f1bbbcfedf Fix #1960 2018-07-25 00:51:30 +09:00
syuilo
7d99b154c0 Update config template: Add missing property definition 2018-07-25 00:40:27 +09:00
syuilo
575da76235 Clean up: Remove unmaintained codes 2018-07-25 00:33:48 +09:00
syuilo
c3b3b9b9a6 #1955 2018-07-25 00:29:18 +09:00
syuilo
7432de3d33 Merge pull request #1968 from syuilo/object-storage
Object storage support
2018-07-24 23:45:19 +09:00
syuilo
03ce87d710 wip 2018-07-24 23:43:14 +09:00
syuilo
5e9fb8bd84 wip 2018-07-24 23:35:19 +09:00
greenkeeper[bot]
68a205486e fix(package): update eslint-plugin-vue to version 4.7.1 2018-07-24 21:41:03 +09:00
greenkeeper[bot]
94c106a87a fix(package): update @types/webpack to version 4.4.8 2018-07-24 12:06:05 +09:00
greenkeeper[bot]
1b2a04bd2a fix(package): update gulp-rename to version 1.4.0 2018-07-24 06:24:11 +09:00
syuilo
a048939cf1 wip 2018-07-24 06:21:21 +09:00
syuilo
6296846078 New translations ja.yml (French) 2018-07-24 05:41:37 +09:00
syuilo
e530d12f7f New translations ja.yml (French) 2018-07-24 05:31:39 +09:00
syuilo
adc3c16ef3 wip 2018-07-24 05:04:43 +09:00
syuilo
5458b10774 wip 2018-07-24 01:58:11 +09:00
Aya Morisawa
9ad403af00 Enhance #1958 2018-07-23 20:58:59 +09:00
Aya Morisawa
8d7f16caed Update setup.*.md 2018-07-23 20:48:55 +09:00
Aya Morisawa
e5c20ca9a7 Update dependencyInfo.ts 2018-07-23 20:45:21 +09:00
greenkeeper[bot]
bd4a7d8cbb fix(package): update webpack to version 4.16.2 2018-07-23 20:19:24 +09:00
Aya Morisawa
5b116737b6 Fix typo 2018-07-23 20:11:20 +09:00
syuilo
8adc799041 Merge pull request #1959 from acid-chicken/top
Go to top
2018-07-23 14:37:18 +09:00
Acid Chicken (硫酸鶏)
41e657b64e Go to top 2018-07-23 14:35:00 +09:00
Aya Morisawa
f16cda51fb #1957 2018-07-23 14:07:09 +09:00
Aya Morisawa
886510d721 Clean up 2018-07-23 14:04:53 +09:00
Aya Morisawa
427b3dcd73 Fix semantic errors 2018-07-23 13:56:25 +09:00
Aya Morisawa
138fa1454f Fix #1957 2018-07-23 13:37:29 +09:00
greenkeeper[bot]
7ec9b03990 fix(package): update swagger-jsdoc to version 1.10.3 2018-07-23 12:54:02 +09:00
syuilo
65a91c5709 Merge pull request #1951 from syuilo/greenkeeper/hard-source-webpack-plugin-0.11.2
Update hard-source-webpack-plugin to the latest version 🚀
2018-07-22 21:56:55 +09:00
greenkeeper[bot]
e679f47c1a fix(package): update hard-source-webpack-plugin to version 0.11.2 2018-07-22 04:47:40 +00:00
syuilo
337ecafa56 Merge pull request #1949 from syuilo/greenkeeper/ratelimiter-3.2.0
Update ratelimiter to the latest version 🚀
2018-07-22 00:58:36 +09:00
syuilo
2c46098fb5 Merge pull request #1950 from syuilo/greenkeeper/ws-6.0.0
Update ws to the latest version 🚀
2018-07-22 00:58:06 +09:00
greenkeeper[bot]
35247af220 fix(package): update ws to version 6.0.0 2018-07-21 13:49:12 +00:00
greenkeeper[bot]
e71da1f659 fix(package): update ratelimiter to version 3.2.0 2018-07-21 12:57:47 +00:00
syuilo
91daa1958b 4.27.0 2018-07-21 19:46:29 +09:00
syuilo
900a9cb34f sharedInbox対応 2018-07-21 19:33:56 +09:00
syuilo
297a7f541e #1947 2018-07-21 19:17:15 +09:00
syuilo
049085fb7a Merge pull request #1945 from syuilo/greenkeeper/@types/mongodb-3.1.2
Update @types/mongodb to the latest version 🚀
2018-07-21 11:26:25 +09:00
greenkeeper[bot]
f594a2d0f4 fix(package): update @types/mongodb to version 3.1.2 2018-07-21 02:19:33 +00:00
syuilo
ffd13accca Refactor 2018-07-21 11:08:27 +09:00
syuilo
edf2503ee5 💯 2018-07-21 11:06:01 +09:00
syuilo
4d0c303660 Fix #1901 2018-07-21 11:03:32 +09:00
syuilo
49bc00102b Fix bug 2018-07-21 08:54:41 +09:00
syuilo
29f074267c Merge pull request #1943 from syuilo/refactor-notes-create
Refactor notes create
2018-07-21 08:51:56 +09:00
syuilo
7671c37f2a wip 2018-07-21 08:47:48 +09:00
syuilo
91ad9e4c41 wip 2018-07-21 07:05:51 +09:00
syuilo
ed48349e39 wip 2018-07-21 06:59:53 +09:00
syuilo
2df02a9d70 wip 2018-07-21 05:35:43 +09:00
syuilo
1d027613e4 🎨 2018-07-21 04:33:04 +09:00
syuilo
e9de73d2f6 Fix 2018-07-21 03:24:39 +09:00
syuilo
7b9b01688c Merge pull request #1942 from syuilo/l10n_master
New Crowdin translations
2018-07-21 03:21:16 +09:00
syuilo
afcf2fddb1 Improve hashtag suggestion 2018-07-21 03:15:31 +09:00
syuilo
78de3ba691 New translations ja.yml (English) 2018-07-21 03:11:10 +09:00
syuilo
2cfefee94d New translations ja.yml (Catalan) 2018-07-21 03:02:52 +09:00
syuilo
d50940cdf8 New translations ja.yml (Portuguese) 2018-07-21 03:02:51 +09:00
syuilo
e38ee663dc New translations ja.yml (Korean) 2018-07-21 03:02:49 +09:00
syuilo
5a160a76f7 New translations ja.yml (Polish) 2018-07-21 03:02:47 +09:00
syuilo
c504f27a51 New translations ja.yml (Chinese Simplified) 2018-07-21 03:02:45 +09:00
syuilo
3f5155e9b5 New translations ja.yml (Italian) 2018-07-21 03:02:43 +09:00
syuilo
dcb85073da New translations ja.yml (Russian) 2018-07-21 03:02:41 +09:00
syuilo
2a5f3491a6 New translations ja.yml (English) 2018-07-21 03:02:39 +09:00
syuilo
6f6b01344d New translations ja.yml (Spanish) 2018-07-21 03:02:37 +09:00
syuilo
73810758d9 New translations ja.yml (German) 2018-07-21 03:02:35 +09:00
syuilo
6cb527fd58 New translations ja.yml (French) 2018-07-21 03:02:33 +09:00
syuilo
7316352ff5 ✌️ 2018-07-21 02:58:44 +09:00
syuilo
ad76d5d8e2 Merge pull request #1939 from acid-chicken/sushi
🍣回転寿司🍣
2018-07-21 02:23:13 +09:00
syuilo
539f307500 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-21 02:18:40 +09:00
syuilo
5f68d08cbc Improve log 2018-07-21 02:18:35 +09:00
syuilo
bc8bea11c0 Merge pull request #1940 from acid-chicken/acid-chicken-patch-1
投稿できない際にショートカットキーをトリガーしないようにする
2018-07-21 02:16:11 +09:00
Acid Chicken (硫酸鶏)
9bb02e5bf6 Update post-form.vue 2018-07-21 02:14:24 +09:00
Acid Chicken (硫酸鶏)
ae68e6372c Update messaging-room.form.vue 2018-07-21 02:07:50 +09:00
Acid Chicken (硫酸鶏)
69593994ef Update post-form.vue 2018-07-21 02:06:49 +09:00
Acid Chicken (硫酸鶏)
cb52ebe65b インデクサーを忘れていた 2018-07-21 01:25:55 +09:00
Acid Chicken (硫酸鶏)
9b989ebac6 保存し忘れ 2018-07-21 01:24:12 +09:00
Acid Chicken (硫酸鶏)
f13bef4ac8 回転寿司 2018-07-21 01:21:27 +09:00
syuilo
29b1aa0d9b Merge pull request #1938 from acid-chicken/vscode
Add extension suggestion for VSCode
2018-07-21 00:49:07 +09:00
Acid Chicken (硫酸鶏)
5aa2e47c49 Add extension suggestion for VSCode 2018-07-21 00:38:08 +09:00
Aya Morisawa
773d104306 Fix #1868 2018-07-20 21:59:09 +09:00
syuilo
b8e948b009 Merge pull request #1936 from syuilo/patch-1803
Fix #1803
2018-07-20 21:47:35 +09:00
Aya Morisawa
49298d2f3f Update ISSUE_TEMPLATE 2018-07-20 21:41:06 +09:00
Aya Morisawa
ac19567f2b Fix #1803 2018-07-20 21:39:21 +09:00
Acid Chicken (硫酸鶏)
bc627fc55c タグサジェストが重複しないようにする 2018-07-20 21:12:28 +09:00
Aya Morisawa
eb6c2d0f73 Update bug_report.md 2018-07-20 21:08:12 +09:00
Aya Morisawa
436757c71d Enrich ISSUE_TEMPLATE
Close #1932
2018-07-20 21:05:58 +09:00
Aya Morisawa
5d09b7e38b mark as read all -> mark all as read
Close #855
2018-07-20 14:16:02 +09:00
syuilo
a8cf67198f Update README.md 2018-07-20 06:39:30 +09:00
syuilo
06539db1a0 4.26.0 2018-07-20 05:30:59 +09:00
syuilo
de10890bd8 Merge pull request #1930 from syuilo/l10n_master
New Crowdin translations
2018-07-20 05:30:41 +09:00
syuilo
8dc5375d55 最近使ったハッシュタグを表示するようにするなど 2018-07-20 05:29:56 +09:00
syuilo
1d23076191 New translations ja.yml (English) 2018-07-20 05:02:48 +09:00
syuilo
cbdc061891 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-20 04:59:12 +09:00
syuilo
9536d76b61 Improve 賢さ 2018-07-20 04:59:04 +09:00
syuilo
7a030901c8 Update README.md 2018-07-20 03:51:50 +09:00
syuilo
bcc02047ca New translations ja.yml (Catalan) 2018-07-20 03:01:45 +09:00
syuilo
c61616388e New translations ja.yml (Portuguese) 2018-07-20 03:01:43 +09:00
syuilo
499486f559 New translations ja.yml (Korean) 2018-07-20 03:01:40 +09:00
syuilo
179d231fd8 New translations ja.yml (Polish) 2018-07-20 03:01:38 +09:00
syuilo
2e4a391eda New translations ja.yml (Chinese Simplified) 2018-07-20 03:01:36 +09:00
syuilo
3d214fee4b New translations ja.yml (Italian) 2018-07-20 03:01:34 +09:00
syuilo
509a4c7955 New translations ja.yml (Russian) 2018-07-20 03:01:32 +09:00
syuilo
c754046eaf New translations ja.yml (English) 2018-07-20 03:01:30 +09:00
syuilo
92571d9133 New translations ja.yml (Spanish) 2018-07-20 03:01:28 +09:00
syuilo
add425abdb New translations ja.yml (German) 2018-07-20 03:01:26 +09:00
syuilo
1890d9e2ee New translations ja.yml (French) 2018-07-20 03:01:23 +09:00
syuilo
83f2926f0c 4.25.0 2018-07-20 02:55:27 +09:00
syuilo
738ced81ec 動画もNSFW 2018-07-20 02:53:32 +09:00
syuilo
b22c1ae520 New translations ja.yml (English) 2018-07-20 02:53:19 +09:00
syuilo
e2e7489b1f New translations ja.yml (Catalan) 2018-07-20 02:42:02 +09:00
syuilo
6ae7b8303d New translations ja.yml (Portuguese) 2018-07-20 02:42:00 +09:00
syuilo
55f40af51c New translations ja.yml (Korean) 2018-07-20 02:41:58 +09:00
syuilo
7a784cea3b New translations ja.yml (Polish) 2018-07-20 02:41:56 +09:00
syuilo
f86cccec0c New translations ja.yml (Chinese Simplified) 2018-07-20 02:41:54 +09:00
syuilo
9d90a28d76 New translations ja.yml (Italian) 2018-07-20 02:41:52 +09:00
syuilo
1724cf7c17 New translations ja.yml (Russian) 2018-07-20 02:41:50 +09:00
syuilo
d64d92ccf5 New translations ja.yml (English) 2018-07-20 02:41:48 +09:00
syuilo
f64ced8677 New translations ja.yml (Spanish) 2018-07-20 02:41:46 +09:00
syuilo
db1c0468aa New translations ja.yml (German) 2018-07-20 02:41:44 +09:00
syuilo
77c5d3276a New translations ja.yml (French) 2018-07-20 02:41:41 +09:00
syuilo
ec2b1ec3f0 #1334 2018-07-20 02:40:37 +09:00
syuilo
85bf76dd98 4.24.1 2018-07-19 22:49:12 +09:00
syuilo
bfa326af2c WIP: Support sharedInbox 2018-07-19 22:40:44 +09:00
syuilo
534c47935a chore: Update backers 2018-07-19 22:15:54 +09:00
syuilo
31a6f2b421 Clean up 2018-07-19 22:02:30 +09:00
Aya Morisawa
66c106722c Hide settings button
It is unimplemented
2018-07-19 16:40:40 +09:00
Aya Morisawa
9d0204f2fa Hide detail button
It is unimplemented
2018-07-19 16:21:22 +09:00
syuilo
fceb0e2158 4.24.0 2018-07-19 11:55:11 +09:00
syuilo
14e7caaa5d Merge pull request #1926 from syuilo/greenkeeper/emojilib-2.3.0
Update emojilib to the latest version 🚀
2018-07-19 11:49:29 +09:00
syuilo
744e009690 #1927 2018-07-19 11:47:18 +09:00
syuilo
713dcd9083 #1921 2018-07-19 11:45:55 +09:00
Aya Morisawa
e03ec67b5c Show error message if searching is not available 2018-07-19 08:24:03 +09:00
Aya Morisawa
7e27e2757f Hide delete button
It is unimplemented
2018-07-19 07:48:42 +09:00
Aya Morisawa
f05c5ff617 Update gulpfile.ts 2018-07-19 06:53:46 +09:00
greenkeeper[bot]
1afb26f04a fix(package): update emojilib to version 2.3.0 2018-07-18 21:07:40 +00:00
syuilo
7873905cde 🎨 2018-07-19 04:50:46 +09:00
syuilo
41a9100477 Merge pull request #1925 from syuilo/greenkeeper/swagger-jsdoc-1.10.2
fix(package): update swagger-jsdoc to version 1.10.2
2018-07-19 04:19:34 +09:00
syuilo
b8cc1eb993 Merge pull request #1922 from syuilo/greenkeeper/webpack-cli-3.1.0
Update webpack-cli to the latest version 🚀
2018-07-19 04:19:14 +09:00
greenkeeper[bot]
adbbfd9dc2 fix(package): update swagger-jsdoc to version 1.10.2
Closes #1924
2018-07-18 18:38:00 +00:00
syuilo
84da99d56c 🎨 2018-07-19 03:25:37 +09:00
syuilo
aaf8f09cfd Merge pull request #1923 from acid-chicken/master
Animate calender meters
2018-07-19 00:16:33 +09:00
Acid Chicken (硫酸鶏)
6da464fd1b Update calendar.vue 2018-07-19 00:13:58 +09:00
syuilo
efaa41ba49 reCAPTCHAをオプションに 2018-07-19 00:04:09 +09:00
greenkeeper[bot]
67e8e1d819 fix(package): update webpack-cli to version 3.1.0 2018-07-18 15:01:30 +00:00
Aya Morisawa
532f8f8e4c Fix indent 2018-07-18 19:36:36 +09:00
Aya Morisawa
0109e8e57c Add white spaces 2018-07-18 19:24:31 +09:00
Aya Morisawa
6e720b2798 Hide drive search form
It is unimplemented
2018-07-18 19:13:41 +09:00
Aya Morisawa
d3f2a97dd4 English for ISSUE_TEMPLATE
Close #1796
2018-07-18 17:41:28 +09:00
syuilo
9f7b04b0ec Merge pull request #1920 from syuilo/greenkeeper/vue-loader-15.2.6
Update vue-loader to the latest version 🚀
2018-07-18 14:28:54 +09:00
greenkeeper[bot]
c4118c78b7 fix(package): update vue-loader to version 15.2.6 2018-07-18 03:41:17 +00:00
syuilo
84147c558f 4.23.1 2018-07-18 07:34:33 +09:00
syuilo
4cb51a2d32 Fix bugs 2018-07-18 07:34:17 +09:00
syuilo
4727780a3d 4.23.0 2018-07-18 07:20:25 +09:00
syuilo
df20f5063d #1720 #59 2018-07-18 07:19:24 +09:00
syuilo
d2a5f4c5c1 ✌️ 2018-07-18 06:53:31 +09:00
syuilo
64ba85aa9b 🎨 2018-07-18 06:13:54 +09:00
syuilo
51c33989fe Merge pull request #1919 from acid-chicken/master
Improve analog clock
2018-07-18 02:15:12 +09:00
Acid Chicken (硫酸鶏)
4713822122 Update analog-clock.vue 2018-07-18 02:06:01 +09:00
Acid Chicken (硫酸鶏)
e10de62a7a Update analog-clock.vue 2018-07-18 02:04:07 +09:00
Acid Chicken (硫酸鶏)
14b235e3a4 Update analog-clock.vue 2018-07-18 02:02:52 +09:00
syuilo
eb4aac3902 Merge pull request #1918 from acid-chicken/master
Minify
2018-07-18 01:47:38 +09:00
Acid Chicken (硫酸鶏)
180bf33a28 Update calendar.vue 2018-07-18 01:46:21 +09:00
syuilo
935a254c97 4.22.1 2018-07-18 01:22:25 +09:00
syuilo
3c678f0e92 Fix bug 2018-07-18 01:22:11 +09:00
syuilo
a053e1c1de 4.22.0 2018-07-18 01:03:24 +09:00
syuilo
b8fa1751ba Merge pull request #1911 from syuilo/l10n_master
New Crowdin translations
2018-07-18 01:02:15 +09:00
syuilo
c4243d54a9 New translations ja.yml (English) 2018-07-18 01:01:49 +09:00
syuilo
1767f54fed 🎨 2018-07-18 00:55:33 +09:00
syuilo
7e465cdbbe New translations ja.yml (Catalan) 2018-07-18 00:52:04 +09:00
syuilo
47f67fcba9 New translations ja.yml (Portuguese) 2018-07-18 00:52:02 +09:00
syuilo
3fff20fb13 New translations ja.yml (Korean) 2018-07-18 00:52:00 +09:00
syuilo
06a2d87129 New translations ja.yml (Polish) 2018-07-18 00:51:58 +09:00
syuilo
a8076e306a New translations ja.yml (Chinese Simplified) 2018-07-18 00:51:56 +09:00
syuilo
05e5829260 New translations ja.yml (Italian) 2018-07-18 00:51:54 +09:00
syuilo
5a91416f34 New translations ja.yml (Russian) 2018-07-18 00:51:52 +09:00
syuilo
70db1d0066 New translations ja.yml (English) 2018-07-18 00:51:50 +09:00
syuilo
26c936d19e New translations ja.yml (Spanish) 2018-07-18 00:51:48 +09:00
syuilo
3b0ae3f80d New translations ja.yml (German) 2018-07-18 00:51:46 +09:00
syuilo
2570d85543 New translations ja.yml (French) 2018-07-18 00:51:44 +09:00
syuilo
b274c4160e Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-18 00:47:11 +09:00
syuilo
f9d5d9e30b Improve doc 2018-07-18 00:47:09 +09:00
syuilo
8cdf5ff6df New translations ja.yml (Polish) 2018-07-18 00:42:22 +09:00
syuilo
409ebf6e14 Merge pull request #1917 from syuilo/greenkeeper/vue-loader-15.2.5
Update vue-loader to the latest version 🚀
2018-07-18 00:22:41 +09:00
greenkeeper[bot]
a3d34ba919 fix(package): update vue-loader to version 15.2.5 2018-07-17 15:08:22 +00:00
syuilo
242bb1a428 New translations ja.yml (English) 2018-07-17 19:01:46 +09:00
syuilo
4a25ed0627 ✌️ 2018-07-17 18:50:13 +09:00
syuilo
f65fbf9d55 Merge pull request #1916 from acid-chicken/acid-chicken-patch-1
Proposal: Smooth Clock
2018-07-17 18:45:21 +09:00
Acid Chicken (硫酸鶏)
6169acd478 Update analog-clock.vue 2018-07-17 18:43:04 +09:00
syuilo
481f1a7c36 4.21.0 2018-07-17 04:37:23 +09:00
syuilo
16726789da Update api definitions 2018-07-17 04:36:44 +09:00
syuilo
e71f650ade New translations ja.yml (Catalan) 2018-07-17 04:01:52 +09:00
syuilo
e8a7f571e1 New translations ja.yml (Portuguese) 2018-07-17 04:01:49 +09:00
syuilo
3117c8a98f New translations ja.yml (Korean) 2018-07-17 04:01:47 +09:00
syuilo
90b845f3db New translations ja.yml (Polish) 2018-07-17 04:01:45 +09:00
syuilo
f5dd972e38 New translations ja.yml (Chinese Simplified) 2018-07-17 04:01:43 +09:00
syuilo
4b210e1a6a New translations ja.yml (Italian) 2018-07-17 04:01:41 +09:00
syuilo
1a7eb3c1df New translations ja.yml (Russian) 2018-07-17 04:01:38 +09:00
syuilo
52f84d8603 New translations ja.yml (English) 2018-07-17 04:01:37 +09:00
syuilo
f92d218c0c New translations ja.yml (Spanish) 2018-07-17 04:01:35 +09:00
syuilo
81c5ece8a9 New translations ja.yml (German) 2018-07-17 04:01:32 +09:00
syuilo
a97bc38f3e New translations ja.yml (French) 2018-07-17 04:01:30 +09:00
syuilo
aacfb5e221 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-17 03:57:42 +09:00
syuilo
f88ac3c04e Improve doc 2018-07-17 03:57:34 +09:00
syuilo
1fb53acc46 Merge pull request #1914 from syuilo/greenkeeper/@types/webpack-4.4.7
Update @types/webpack to the latest version 🚀
2018-07-17 03:32:07 +09:00
greenkeeper[bot]
ae3b0d5437 fix(package): update @types/webpack to version 4.4.7 2018-07-16 18:29:21 +00:00
syuilo
f9b2da1bb0 🎨 2018-07-17 03:21:25 +09:00
syuilo
d0bea052ad 🎨 2018-07-17 03:16:21 +09:00
syuilo
c012faa958 New translations ja.yml (English) 2018-07-17 01:37:35 +09:00
syuilo
c8cfd1ee65 New translations ja.yml (English) 2018-07-17 01:21:15 +09:00
syuilo
e8da0bcd80 Improve doc 2018-07-17 01:11:36 +09:00
syuilo
591ff9095a New translations ja.yml (Catalan) 2018-07-17 00:51:59 +09:00
syuilo
6df91d3078 New translations ja.yml (Portuguese) 2018-07-17 00:51:57 +09:00
syuilo
288c14efce New translations ja.yml (Korean) 2018-07-17 00:51:56 +09:00
syuilo
ee8d636ca8 New translations ja.yml (Polish) 2018-07-17 00:51:54 +09:00
syuilo
a3ceecae91 New translations ja.yml (Chinese Simplified) 2018-07-17 00:51:52 +09:00
syuilo
5ad89a3b3d New translations ja.yml (Italian) 2018-07-17 00:51:50 +09:00
syuilo
e1089cc18d New translations ja.yml (Russian) 2018-07-17 00:51:48 +09:00
syuilo
f9e780187c New translations ja.yml (English) 2018-07-17 00:51:46 +09:00
syuilo
42cbe96a14 New translations ja.yml (Spanish) 2018-07-17 00:51:44 +09:00
syuilo
1f23b11dcc New translations ja.yml (German) 2018-07-17 00:51:42 +09:00
syuilo
ad3b4bbd58 New translations ja.yml (French) 2018-07-17 00:51:40 +09:00
syuilo
455f4ffa27 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-17 00:46:32 +09:00
syuilo
1d867b8aca Improve doc 2018-07-17 00:46:06 +09:00
syuilo
1f9c18e615 Merge pull request #1912 from syuilo/greenkeeper/webpack-4.16.1
Update webpack to the latest version 🚀
2018-07-16 23:50:43 +09:00
syuilo
5bf439851d New translations ja.yml (English) 2018-07-16 19:02:16 +09:00
syuilo
9df3f99a1c New translations ja.yml (English) 2018-07-16 18:42:49 +09:00
syuilo
f41232703b New translations ja.yml (Polish) 2018-07-16 18:32:12 +09:00
greenkeeper[bot]
abc4e53943 fix(package): update webpack to version 4.16.1 2018-07-16 08:30:40 +00:00
syuilo
f846508fc1 New translations ja.yml (Catalan) 2018-07-16 08:01:15 +09:00
syuilo
7343003287 New translations ja.yml (Portuguese) 2018-07-16 08:01:13 +09:00
syuilo
25ca3d610b New translations ja.yml (Korean) 2018-07-16 08:01:11 +09:00
syuilo
9d286786d4 New translations ja.yml (Polish) 2018-07-16 08:01:09 +09:00
syuilo
91037ebdd6 New translations ja.yml (Chinese Simplified) 2018-07-16 08:01:06 +09:00
syuilo
26b2eafea0 New translations ja.yml (Italian) 2018-07-16 08:01:04 +09:00
syuilo
432beedd94 New translations ja.yml (Russian) 2018-07-16 08:01:02 +09:00
syuilo
3a919bab45 New translations ja.yml (English) 2018-07-16 08:01:00 +09:00
syuilo
11af9b808d New translations ja.yml (Spanish) 2018-07-16 08:00:58 +09:00
syuilo
af35335772 New translations ja.yml (German) 2018-07-16 08:00:57 +09:00
syuilo
7b9047cc82 New translations ja.yml (French) 2018-07-16 08:00:55 +09:00
こぴなたみぽ
4cad36572c Improve doc 2018-07-16 07:54:08 +09:00
こぴなたみぽ
b5625a4550 Fix 2018-07-16 06:58:45 +09:00
syuilo
ec41d8053c New translations ja.yml (Catalan) 2018-07-16 06:21:12 +09:00
syuilo
284cfe6989 New translations ja.yml (Portuguese) 2018-07-16 06:21:11 +09:00
syuilo
ad8f363c5d New translations ja.yml (Korean) 2018-07-16 06:21:09 +09:00
syuilo
3d3cf73c30 New translations ja.yml (Polish) 2018-07-16 06:21:06 +09:00
syuilo
fd9bd28361 New translations ja.yml (Chinese Simplified) 2018-07-16 06:21:04 +09:00
syuilo
d2919dece0 New translations ja.yml (Italian) 2018-07-16 06:21:02 +09:00
syuilo
a86442bff7 New translations ja.yml (Russian) 2018-07-16 06:21:00 +09:00
syuilo
4b915d43cf New translations ja.yml (English) 2018-07-16 06:20:58 +09:00
syuilo
b20c3d84a6 New translations ja.yml (Spanish) 2018-07-16 06:20:56 +09:00
syuilo
d2bbf5ffc4 New translations ja.yml (German) 2018-07-16 06:20:55 +09:00
syuilo
4ef9411f35 New translations ja.yml (French) 2018-07-16 06:20:52 +09:00
syuilo
168d13d6e6 Improve docs 2018-07-16 06:19:19 +09:00
syuilo
1e921a9fd5 Update docs 2018-07-16 05:47:41 +09:00
syuilo
9e438ed674 🎨 2018-07-16 03:55:42 +09:00
syuilo
3a02a7dad8 良い感じに 2018-07-16 03:53:03 +09:00
syuilo
1744316656 良い感じに 2018-07-16 03:43:36 +09:00
syuilo
1e4a86da8e 良い感じに 2018-07-16 03:25:35 +09:00
syuilo
2b31b6a6b0 Add doc 2018-07-16 02:26:54 +09:00
syuilo
c7a3f40eba Add README 2018-07-15 22:30:27 +09:00
syuilo
8b9710df9f Add doc 2018-07-15 22:18:47 +09:00
syuilo
ce6f750fa5 Improve docs 2018-07-15 22:00:05 +09:00
syuilo
468eb02ff3 Set title of a doc 2018-07-15 21:48:57 +09:00
syuilo
dfca7f1340 Fix bug 2018-07-15 19:38:06 +09:00
syuilo
7bfa56d199 Fix bug 2018-07-15 19:35:20 +09:00
syuilo
c579cbdf10 Fix bug 2018-07-15 19:29:15 +09:00
syuilo
0b3609c775 4.20.0 2018-07-15 19:06:27 +09:00
syuilo
be52eb9b3f API doc 2018-07-15 19:05:19 +09:00
syuilo
5f5156561f ドキュメントをMarkdownで書くように 2018-07-15 18:28:08 +09:00
syuilo
d47f92f396 グローバルタイムラインに返信を含めないように 2018-07-15 17:50:24 +09:00
syuilo
2a30bc9a56 Merge pull request #1908 from syuilo/greenkeeper/eslint-plugin-vue-4.7.0
Update eslint-plugin-vue to the latest version 🚀
2018-07-15 14:41:17 +09:00
syuilo
a427b7a1af Doc: Add "Clean up unused drive files" section 2018-07-15 14:35:22 +09:00
syuilo
05d5e70c58 Doc: Add "Clean up cached remote files" section 2018-07-15 14:29:30 +09:00
syuilo
62858caaa4 Update manage odc 2018-07-15 14:27:25 +09:00
syuilo
b9b48a55ef Update doc 2018-07-15 14:20:30 +09:00
Aya Morisawa
7276ec185b Update setup docs 2018-07-15 09:43:16 +09:00
Skid
e063ac10c5 Create manage.en.md 2018-07-15 09:25:01 +09:00
Skid
eca9a7ea13 Update setup.en.md 2018-07-15 09:25:01 +09:00
greenkeeper[bot]
86d9a72bbf fix(package): update eslint-plugin-vue to version 4.7.0 2018-07-14 20:30:01 +00:00
syuilo
073707b2d0 Better default value 2018-07-15 02:29:50 +09:00
syuilo
b971fbaac6 Fix 2018-07-15 02:23:22 +09:00
syuilo
86795f1091 Add optional Elasticsearch setting 2018-07-15 02:22:02 +09:00
syuilo
5b9dd4fb80 Update example.yml 2018-07-15 02:17:45 +09:00
syuilo
5ff31e197b Update example.yml 2018-07-15 02:16:35 +09:00
syuilo
0bd5e64b86 Update example.yml 2018-07-15 02:15:45 +09:00
syuilo
3089b56f70 Update example.yml 2018-07-15 02:11:56 +09:00
syuilo
46bf0eae40 Update example.yml 2018-07-15 02:11:17 +09:00
syuilo
97f411130f Update example.yml 2018-07-15 02:09:55 +09:00
Aya Morisawa
b9ce7bc99d Update package.json 2018-07-15 02:08:22 +09:00
syuilo
9d3ecda43d Merge pull request #1907 from syuilo/patch-1
Revert "Update example.yml"
2018-07-15 02:02:51 +09:00
Aya Morisawa
8356f6d128 Revert "Update example.yml"
This reverts commit 7ab9d01bac.
2018-07-15 02:01:33 +09:00
Aya Morisawa
05a084dadf Merge branch 'master' of aya.github:syuilo/misskey 2018-07-15 01:59:38 +09:00
Aya Morisawa
f338fa552e Not cast to any 2018-07-15 01:59:24 +09:00
syuilo
7ab9d01bac Update example.yml 2018-07-15 01:58:08 +09:00
Aya Morisawa
5b0aaf66eb Update log message 2018-07-15 01:57:22 +09:00
syuilo
6a4e92a999 #1903 2018-07-15 01:56:31 +09:00
syuilo
0a4b652493 Darken
Co-Authored-By: tamaina <tamaina@hotmail.co.jp>
2018-07-15 01:49:36 +09:00
syuilo
eebc1af672 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-15 01:48:09 +09:00
syuilo
41fa045999 Darken
Co-Authored-By: tamaina <tamaina@hotmail.co.jp>
2018-07-15 01:48:06 +09:00
Aya Morisawa
4b52c89a75 Update package.json 2018-07-15 01:42:14 +09:00
syuilo
28dcf8bc1e Revert "Update messaging-room.vue"
This reverts commit 313afbd6db.
2018-07-15 01:07:17 +09:00
syuilo
5af469282a Merge pull request #1906 from syuilo/imgbot
[ImgBot] optimizes images
2018-07-14 23:22:45 +09:00
ImgBotApp
4c58dc61bc [ImgBot] optimizes images
*Total -- 887.85kb -> 803.26kb (9.53%)

/src/client/app/desktop/assets/remove.png -- 3.04kb -> 0.41kb (86.39%)
/src/server/file/assets/bad-egg.png -- 4.67kb -> 1.64kb (64.96%)
/src/server/file/assets/cache-expired.png -- 14.67kb -> 5.91kb (59.75%)
/test/resources/Lenna.jpg -- 52.22kb -> 24.77kb (52.57%)
/assets/apple-touch-icon.png -- 4.71kb -> 2.46kb (47.82%)
/assets/icons/256.png -- 4.71kb -> 2.46kb (47.82%)
/assets/favicon/favicon.png -- 6.81kb -> 3.91kb (42.57%)
/assets/title.png -- 6.62kb -> 3.80kb (42.56%)
/src/server/file/assets/not-an-image.png -- 4.60kb -> 2.71kb (40.99%)
/src/server/file/assets/thumbnail-not-available.png -- 8.62kb -> 5.57kb (35.33%)
/src/client/assets/reactions/angry.png -- 5.74kb -> 4.50kb (21.6%)
/src/server/file/assets/tombstone.png -- 6.24kb -> 4.91kb (21.28%)
/src/client/assets/reactions/surprise.png -- 4.59kb -> 3.72kb (18.99%)
/assets/icons/128.png -- 3.07kb -> 2.49kb (18.74%)
/assets/icons/192.png -- 4.56kb -> 3.80kb (16.65%)
/src/client/assets/reactions/confused.png -- 7.08kb -> 5.92kb (16.5%)
/src/client/assets/reactions/love.png -- 3.26kb -> 2.74kb (16.07%)
/src/client/assets/reactions/laugh.png -- 7.74kb -> 6.77kb (12.47%)
/src/client/assets/reactions/hmm.png -- 6.47kb -> 5.74kb (11.38%)
/src/client/assets/reactions/congrats.png -- 10.39kb -> 9.77kb (6.04%)
/src/client/assets/pointer.png -- 246.93kb -> 232.06kb (6.02%)
/src/client/assets/error.jpg -- 55.53kb -> 52.84kb (4.84%)
/assets/icons/64.png -- 1.30kb -> 1.24kb (4.66%)
/src/server/file/assets/avatar.jpg -- 1.29kb -> 1.23kb (4.61%)
/src/client/assets/reactions/pudding.png -- 7.47kb -> 7.42kb (0.74%)
/src/client/assets/reactions/like.png -- 4.72kb -> 4.71kb (0.27%)
/src/client/app/desktop/assets/index.jpg -- 400.79kb -> 399.78kb (0.25%)
2018-07-14 14:20:36 +00:00
syuilo
c4bf80c262 Update example.yml 2018-07-14 23:20:30 +09:00
Aya Morisawa
e485e8936f Update example config 2018-07-14 23:14:24 +09:00
Aya Morisawa
e495e0d2e6 Update config example 2018-07-14 23:07:59 +09:00
Aya Morisawa
3695e6db15 Update config example 2018-07-14 23:06:46 +09:00
syuilo
ac7df96f68 Update example.yml
Update some default values
2018-07-14 23:03:20 +09:00
Aya Morisawa
cf17a39446 Update setup.*.md 2018-07-14 22:56:54 +09:00
Aya Morisawa
87cc5f790c Update log messages 2018-07-14 22:53:30 +09:00
Aya Morisawa
b03987290c Update config example 2018-07-14 22:42:44 +09:00
Aya Morisawa
1f4969547b Update log message 2018-07-14 22:23:43 +09:00
Aya Morisawa
d12d201ef4 Update logger 2018-07-14 22:14:56 +09:00
Aya Morisawa
c91a4c9da1 Update log messages 2018-07-14 22:10:27 +09:00
Aya Morisawa
1213e95ddd Merge branch 'master' of aya.github:syuilo/misskey 2018-07-14 22:10:14 +09:00
syuilo
90a836d587 Merge pull request #1905 from syuilo/l10n_master
New Crowdin translations
2018-07-14 22:07:41 +09:00
syuilo
973c2ebafd Merge pull request #1904 from syuilo/greenkeeper/eslint-plugin-vue-4.6.0
Update eslint-plugin-vue to the latest version 🚀
2018-07-14 22:07:24 +09:00
Aya Morisawa
24f52aee46 Update log messages 2018-07-14 22:05:19 +09:00
Aya Morisawa
4d2c0e4161 Update dependency checking for ImageMagick 2018-07-14 21:59:15 +09:00
syuilo
b687546fcd New translations ja.yml (English) 2018-07-14 21:41:01 +09:00
Aya Morisawa
3c701aaf86 Update log messages 2018-07-14 21:03:09 +09:00
Aya Morisawa
d50e99c17b Update log messages 2018-07-14 20:58:21 +09:00
greenkeeper[bot]
41d5e0ab24 fix(package): update eslint-plugin-vue to version 4.6.0 2018-07-14 11:39:54 +00:00
Aya Morisawa
c99e864dbc 2018-07-14 19:49:21 +09:00
syuilo
f39adfdf87 Update create.ts 2018-07-14 19:40:23 +09:00
syuilo
0d1ffb581f 4.19.1 2018-07-14 13:49:31 +09:00
syuilo
4add44f3bd Update create.ts 2018-07-14 13:47:36 +09:00
syuilo
baae9f6f39 Merge pull request #1900 from syuilo/l10n_master
New Crowdin translations
2018-07-14 12:02:44 +09:00
syuilo
0a9958f45f New translations ja.yml (English) 2018-07-14 12:00:50 +09:00
syuilo
7e5d25cf2c 4.19.0 2018-07-14 11:58:54 +09:00
syuilo
9666e6b4d3 #1894 2018-07-14 11:58:21 +09:00
syuilo
c937cb94f9 Clean up 2018-07-14 11:55:36 +09:00
syuilo
5e54d093f5 New translations ja.yml (Catalan) 2018-07-14 11:51:12 +09:00
syuilo
c7f099276e New translations ja.yml (Portuguese) 2018-07-14 11:51:10 +09:00
syuilo
ee4235ba71 New translations ja.yml (Korean) 2018-07-14 11:51:08 +09:00
syuilo
71066d69fb New translations ja.yml (Polish) 2018-07-14 11:51:06 +09:00
syuilo
4581376198 New translations ja.yml (Chinese Simplified) 2018-07-14 11:51:04 +09:00
syuilo
04ebde62bc New translations ja.yml (Italian) 2018-07-14 11:51:02 +09:00
syuilo
fec47f05cf New translations ja.yml (Russian) 2018-07-14 11:51:00 +09:00
syuilo
b9e2fb74ed New translations ja.yml (English) 2018-07-14 11:50:58 +09:00
syuilo
a1d6637dd1 New translations ja.yml (Spanish) 2018-07-14 11:50:57 +09:00
syuilo
e6fa5a07ce New translations ja.yml (German) 2018-07-14 11:50:55 +09:00
syuilo
eec6226c8d New translations ja.yml (French) 2018-07-14 11:50:53 +09:00
syuilo
356fe8180e 4.18.0 2018-07-14 11:44:12 +09:00
syuilo
30c120596a social 2018-07-14 11:43:39 +09:00
syuilo
c6e330ea8d Merge pull request #1898 from syuilo/greenkeeper/@types/webpack-4.4.6
Update @types/webpack to the latest version 🚀
2018-07-14 11:02:16 +09:00
syuilo
dca55d12ac Merge pull request #1897 from syuilo/greenkeeper/@types/elasticsearch-5.0.25
Update @types/elasticsearch to the latest version 🚀
2018-07-14 11:02:07 +09:00
greenkeeper[bot]
4426da6233 fix(package): update @types/webpack to version 4.4.6 2018-07-14 01:55:05 +00:00
greenkeeper[bot]
381fe2f436 fix(package): update @types/elasticsearch to version 5.0.25 2018-07-14 01:05:31 +00:00
Aya Morisawa
28cd7a67de Update log message 2018-07-14 00:41:33 +09:00
Aya Morisawa
97f75cea52 Merge branch 'master' of aya.github:syuilo/misskey 2018-07-14 00:39:50 +09:00
Aya Morisawa
5e788f0da4 Kill child process on exit 2018-07-14 00:39:39 +09:00
Aya Morisawa
1fc9d034d0 Update log message 2018-07-14 00:39:11 +09:00
syuilo
dc8f14c23a Fix #1887 2018-07-14 00:36:39 +09:00
syuilo
e9717da916 Merge pull request #1880 from syuilo/l10n_master
New Crowdin translations
2018-07-14 00:34:41 +09:00
syuilo
73c328f90b Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-14 00:34:08 +09:00
syuilo
25a6f7041a Fix bug 2018-07-14 00:34:05 +09:00
syuilo
ff278c8bea New translations ja.yml (English) 2018-07-14 00:22:08 +09:00
Aya Morisawa
35dd6a5ac3 Merge branch 'master' of aya.github:syuilo/misskey 2018-07-14 00:05:56 +09:00
Aya Morisawa
98ea238087 Add missing semicolon 2018-07-14 00:05:49 +09:00
syuilo
3830b0d831 New translations ja.yml (Catalan) 2018-07-14 00:01:40 +09:00
syuilo
b6de5a2268 New translations ja.yml (Portuguese) 2018-07-14 00:01:37 +09:00
syuilo
77327c7a40 New translations ja.yml (Korean) 2018-07-14 00:01:36 +09:00
syuilo
26664a8351 New translations ja.yml (Polish) 2018-07-14 00:01:34 +09:00
syuilo
912964104b New translations ja.yml (Chinese Simplified) 2018-07-14 00:01:32 +09:00
syuilo
63653ccb01 New translations ja.yml (Italian) 2018-07-14 00:01:29 +09:00
syuilo
5df54700b8 New translations ja.yml (Russian) 2018-07-14 00:01:27 +09:00
syuilo
f952dde1d4 New translations ja.yml (English) 2018-07-14 00:01:25 +09:00
syuilo
2c0aac5eed New translations ja.yml (Spanish) 2018-07-14 00:01:24 +09:00
syuilo
4e3a2c4bb8 New translations ja.yml (German) 2018-07-14 00:01:22 +09:00
syuilo
17ccfcfb53 New translations ja.yml (French) 2018-07-14 00:01:19 +09:00
syuilo
f2959ada85 Revert "Update messaging-room.message.vue"
This reverts commit 7b3f52505e.
2018-07-14 00:00:30 +09:00
syuilo
e427c12ac2 Hybrid --> Community 2018-07-13 23:56:24 +09:00
Aya Morisawa
874837666c Update error message 2018-07-13 23:52:28 +09:00
Aya Morisawa
c66532d18f Update logger 2018-07-13 23:51:16 +09:00
syuilo
2bc572b4cc アカウントを凍結されていたらAPIにアクセスできないようにした 2018-07-13 23:44:45 +09:00
syuilo
2db01f3d5c Clean up 2018-07-13 23:39:20 +09:00
Aya Morisawa
a0a116b7bf Merge branch 'master' of aya.github:syuilo/misskey 2018-07-13 23:25:49 +09:00
Aya Morisawa
aec7d53414 Fix port cehcking 2018-07-13 23:25:32 +09:00
syuilo
09416c9893 Merge pull request #1892 from PRB0t/pr-201807131656
Fix a bug
2018-07-13 23:20:40 +09:00
PRB0t
0e7fe670aa 🤖 Fix a bug 2018-07-13 16:17:02 +02:00
Aya Morisawa
bd805f1d88 Update log message 2018-07-13 23:05:37 +09:00
syuilo
b984aecaf2 Merge pull request #1891 from syuilo/greenkeeper/html-minifier-3.5.19
Update html-minifier to the latest version 🚀
2018-07-13 21:32:55 +09:00
syuilo
56efffffa3 Merge pull request #1890 from syuilo/greenkeeper/element-ui-2.4.4
Update element-ui to the latest version 🚀
2018-07-13 21:32:39 +09:00
greenkeeper[bot]
2f92be1da0 fix(package): update html-minifier to version 3.5.19 2018-07-13 09:03:40 +00:00
greenkeeper[bot]
baa52921a0 fix(package): update element-ui to version 2.4.4 2018-07-13 08:44:59 +00:00
syuilo
20e0c44f9a Merge pull request #1888 from syuilo/greenkeeper/hard-source-webpack-plugin-0.11.1
Update hard-source-webpack-plugin to the latest version 🚀
2018-07-13 13:53:13 +09:00
greenkeeper[bot]
ebc83c8f60 fix(package): update hard-source-webpack-plugin to version 0.11.1 2018-07-12 18:52:13 +00:00
syuilo
2d48d9fd87 Merge pull request #1885 from syuilo/greenkeeper/ws-5.2.2
Update ws to the latest version 🚀
2018-07-12 05:14:38 +09:00
greenkeeper[bot]
5eb06a3a52 fix(package): update ws to version 5.2.2 2018-07-11 20:01:29 +00:00
syuilo
9917a1c7e1 New translations ja.yml (English) 2018-07-12 01:21:24 +09:00
syuilo
e9c886e871 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-12 00:00:06 +09:00
syuilo
0074f8da1b Improve log 2018-07-11 23:59:57 +09:00
syuilo
1c98b51e6a Merge pull request #1882 from syuilo/greenkeeper/@koa/cors-2.2.2
Update @koa/cors to the latest version 🚀
2018-07-11 23:42:40 +09:00
syuilo
837bdb1b43 Merge pull request #1881 from syuilo/greenkeeper/webpack-4.16.0
Update webpack to the latest version 🚀
2018-07-11 23:16:31 +09:00
greenkeeper[bot]
48e034be0e fix(package): update @koa/cors to version 2.2.2 2018-07-11 12:50:56 +00:00
greenkeeper[bot]
b067162ce6 fix(package): update webpack to version 4.16.0 2018-07-11 08:52:17 +00:00
syuilo
5f9482e7d5 New translations ja.yml (Catalan) 2018-07-11 14:11:26 +09:00
syuilo
bb98ee27a1 New translations ja.yml (Portuguese) 2018-07-11 14:11:24 +09:00
syuilo
3506dd3656 New translations ja.yml (Korean) 2018-07-11 14:11:22 +09:00
syuilo
88d0b09c88 New translations ja.yml (Polish) 2018-07-11 14:11:20 +09:00
syuilo
25b88f89a6 New translations ja.yml (Chinese Simplified) 2018-07-11 14:11:18 +09:00
syuilo
85343b80b7 New translations ja.yml (Italian) 2018-07-11 14:11:16 +09:00
syuilo
6766fbdfb3 New translations ja.yml (Russian) 2018-07-11 14:11:14 +09:00
syuilo
c488fca2f2 New translations ja.yml (English) 2018-07-11 14:11:12 +09:00
syuilo
ea51460169 New translations ja.yml (Spanish) 2018-07-11 14:11:10 +09:00
syuilo
80e7af30d0 New translations ja.yml (German) 2018-07-11 14:11:08 +09:00
syuilo
8f20edaed0 New translations ja.yml (French) 2018-07-11 14:11:06 +09:00
287 changed files with 3780 additions and 19761 deletions

View File

@@ -1,73 +1,110 @@
# インスタンス名
name:
name: example-instance-name # Name of your instance
description: example-description # Description of your instance
# インスタンスの紹介
description:
# サーバーのメンテナ情報
maintainer:
# メンテナの名前
name:
name: example-maitainer-name # Your name
url: http://example.com/ # Your contact (http or mailto)
repository_url: https://github.com/syuilo/misskey # Repository URL
feedback_url: https://github.com/syuilo/misskey/issues # Feedback URL (e.g. github issue)
# メンテナの連絡先(URLかmailto形式のURL)
url:
# URL and Port settings overview
# e.g., If you want to realize following structure:
#
# +--- https://example.com:123 ----------+
# +------+ |+-------------+ +---------------+|
# | User | ---> || Proxy (123) | ---> | Misskey (456) ||
# +------+ |+-------------+ +---------------+|
# +--------------------------------------+
#
# You need to set 'https://example.com:123' to 'url' prop and
# You need to set 456 to 'port' prop.
#
# In other words, the 'url' prop should be the final accessible URL seen by a user.
# 'port' prop is a port that the Misskey server should actually listen
# on and it is not necessarily the port that a user accesses.
# レポジトリのURL
repository_url:
url: http://localhost/
# フィードバックのURL(issueなど)
feedback_url:
# A port that your Misskey server should listen.
# This value is not a port to use when accessing with a browser.
port: 80
# (Misskeyを動かす)URL
url:
# 待受ポート
port:
# TLSの設定(利用しない場合はフィールドごと削除してください)
https:
# 証明書のパス...
key:
cert:
# MongoDBの設定
mongodb:
host: localhost
port: 27017
db: misskey
user:
pass:
user: example-misskey-user
pass: example-misskey-pass
# Redisの設定
redis:
host: localhost
port: 6379
pass:
pass: example-pass
# reCAPTCHAの設定
recaptcha:
site_key:
secret_key:
# Drive capacity of a local user (MB)
localDriveCapacityMb: 256
# ServiceWorkerの設定
sw:
# VAPIDの公開鍵
public_key:
# Drive capacity of a remote user (MB)
remoteDriveCapacityMb: 8
# VAPIDの秘密鍵
private_key:
# Google Maps API
google_maps_api_key:
# Twitterインテグレーションの設定(利用しない場合は省略可能)
twitter:
# インテグレーション用アプリのコンシューマーキー
consumer_key:
# インテグレーション用アプリのコンシューマーシークレット
consumer_secret:
# true にすると、リモートのファイルをキャッシュしなくなります(直リンクします)。
# ストレージ容量を節約することができますが、「リモートメディアを表示しない」設定をオンにしているユーザーは、リモートの画像などは見えなくなります。
# If enabled:
# Server will not cache remote files (Using direct link instead).
# You can save your storage.
# Users cannot see remote images when they turn off "Show media from a remote server" setting.
preventCache: false
drive:
storage: 'db'
# OR
# storage: 'minio'
# bucket:
# prefix:
# config:
# endPoint:
# port:
# secure:
# accessKey:
# secretKey:
#
# Below settings are optional
#
# TLS
# https:
# # path for certification
# key: example-tls-key
# cert: example-tls-cert
# Elasticsearch
# elasticsearch:
# host: localhost
# port: 9200
# pass: null
# reCAPTCHA
# recaptcha:
# site_key: example-site-key
# secret_key: example-secret-key
# ServiceWorker
# sw:
# # Public key of VAPID
# public_key: example-sw-public-key
# # Private key of VAPID
# private_key: example-sw-private-key
# google_maps_api_key: example-google-maps-api-key
# Twitter integration
# twitter:
# consumer_key: example-twitter-consumer-key
# consumer_secret: example-twitter-consumer-secret-key
# Ghost
# Ghost account is an account used for the purpose of delegating
# followers when putting users in the list.
# ghost: user-id-of-your-ghost-account

View File

@@ -1,7 +0,0 @@
<!--
Misskeyへの貢献ありがとうございます。
バグの報告や提案などで、可能であれば以下の情報を含めてください。
* お使いのブラウザ
* デスクトップ版Misskeyかモバイル版Misskeyか
-->

22
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@@ -0,0 +1,22 @@
---
name: Bug Report
about: Create a report to help us improve
---
# Summary
<!-- Tell us what the bug is -->
# Expected Behavior
<!--- Tell us what should happen -->
# Actual Behavior
<!--- Tell us what happens instead of the expected behavior -->
# Steps to Reproduce
1.
2.
3.
# Environment
<!-- Tell us where on the platform it happens -->
<!-- e.g. desktop or mobile version, your browser, your OS -->

View File

@@ -0,0 +1,11 @@
---
name: Feature Request
about: Suggest an idea for this project
---
# Summary
<!-- Tell us what the suggestion is -->
# Environment
<!-- Tell us where on the platform it related -->
<!-- e.g. desktop or mobile version, your browser, your OS -->

1
.npmrc
View File

@@ -1 +1,2 @@
save-exact=true
package-lock = false

12
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,12 @@
{
"recommendations": [
"ducksoupdev.vue2",
"editorconfig.editorconfig",
"eg2.tslint",
"eg2.vscode-npm-script",
"hollowtree.vue-snippets",
"ms-vscode.typescript-javascript-grammar",
"octref.vetur",
"sysoev.language-stylus"
]
}

View File

@@ -5,6 +5,15 @@ ChangeLog
This document describes breaking changes only.
5.0.0
-----
### Migration
起動する前に、`node cli/migration/5.0.0`してください。
Please run `node cli/migration/5.0.0` before launch.
4.0.0
-----

View File

@@ -7,7 +7,7 @@
[![][dependencies-badge]][dependencies-link]
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com) [![Greenkeeper badge](https://badges.greenkeeper.io/syuilo/misskey.svg)](https://greenkeeper.io/)
> Lead Maintainer: [syuilo][syuilo-link]
**Microblogging. Redefined.**
**[Misskey](https://misskey.xyz)** is a completely open source,
ultimately sophisticated professional microblogging software.
@@ -18,14 +18,13 @@ ultimately sophisticated professional microblogging software.
:sparkles: Features
----------------------------------------------------------------
* Rich text contents
* Reactions
* User lists
* Customizable column view (called MisskeyDeck)
* and widgets!
* Private messages
* Mute
* Real-time timelines
* ActivityPub compatible
* ActivityPub support
and more! You can see it with your own eyes at [misskey.xyz](https://misskey.xyz).
@@ -44,9 +43,9 @@ If you want to...
:heart: Backers & Sponsors
----------------------------------------------------------------
| ![][nagarus-icon] | ![][dansup-icon] |
|:-:|:-:|
| [nagarus][nagarus-link] | [dansup][dansup-link] |
| <img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/619786/32cf01444db24e578cd1982c197f6fc6/1?token-time=2145916800&token-hash=tB1e_r8RlZ5sFL0KV_e8dugapxatNBRK1Z3h67TO1g8%3D"> | <img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/12378075/0156f769e20f412594fa6b87d85fe228/1?token-time=2145916800&token-hash=IsIJRUXszzoD6-7pDnRY8I05T9nSznc4GTaxj7C9SwU%3D"> | <img src="https://c10.patreonusercontent.com/3/eyJoIjoxMDAsInciOjEwMH0%3D/patreon-media/p/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb/1?token-time=2145916800&token-hash=S1zP0QyLU52Dqq6dtc9qNYyWfW86XrYHiR4NMbeOrnA%3D"> |
|:-:|:-:|:-:|
| [Gargron](https://www.patreon.com/mastodon) | [39ff](https://www.patreon.com/user/creators?u=12378075) | [dansup](https://www.patreon.com/dansup) |
:four_leaf_clover: Copyright
----------------------------------------------------------------
@@ -73,9 +72,3 @@ Misskey is an open-source software licensed under the [GNU AGPLv3](LICENSE).
[syuilo-link]: https://syuilo.com
[syuilo-icon]: https://avatars2.githubusercontent.com/u/4439005?v=3&s=70
[nagarus-link]: https://www.patreon.com/user/creators?u=11601413
[nagarus-icon]: https://c10.patreonusercontent.com/3/eyJ2IjoiMSIsInciOjIwMH0%3D/patreon-media/user/11601413/20cb15f209924302b399b99d3c98b850?token-time=2145916800&token-hash=IO31nK6VZCMWBWU2VAk2c824BX2QZ4DNPKyHHZXS0iw%3D
[dansup-link]: https://www.patreon.com/dansup
[dansup-icon]: https://c10.patreonusercontent.com/3/eyJ2IjoiMSIsInciOjIwMH0%3D/patreon-media/user/4503830/ccf2cc867ea64de0b524bb2e24b9a1cb?token-time=2145916800&token-hash=opXAM_pnhUTuN1jCA6p_Nn_YsaqohY465YFjWFqMEEE%3D

View File

@@ -1,41 +0,0 @@
# appveyor file
# http://www.appveyor.com/docs/appveyor-yml
environment:
matrix:
- nodejs_version: 10.1.0
cache:
- node_modules
build: off
install:
# Update Node.js
# 標準で入っている Node.js を更新します (2014/11/13 時点では、v0.10.32 が標準)
- ps: Update-NodeJsInstallation (Get-NodeJsLatestBuild $env:nodejs_version)
- node --version
# Update NPM
- npm install -g npm
- npm --version
# Update node-gyp
# 必須! node-gyp のバージョンを上げないと、ネイティブモジュールのコンパイルに失敗します
- npm install -g node-gyp
- npm install
init:
# git clone の際の改行を変換しないようにします
- git config --global core.autocrlf false
before_test:
# 設定ファイルを配置
- cp ./.travis/default.yml ./.config
- cp ./.travis/test.yml ./.config
- npm run build
test_script:
- npm test

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.8 KiB

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -9,7 +9,7 @@ const q = {
'metadata._user.host': {
$ne: null
},
'metadata.isMetaOnly': false
'metadata.withoutChunks': false
};
async function main() {
@@ -57,7 +57,7 @@ async function main() {
DriveFile.update({ _id: file._id }, {
$set: {
'metadata.isMetaOnly': true
'metadata.withoutChunks': true
}
})
]).then(async () => {

View File

@@ -1,168 +0,0 @@
const fs = require('fs');
const path = require('path');
const yaml = require('js-yaml');
const inquirer = require('inquirer');
const chalk = require('chalk');
const configDirPath = `${__dirname}/../.config`;
const configPath = `${configDirPath}/default.yml`;
const form = [{
type: 'input',
name: 'maintainerName',
message: 'Your name:'
}, {
type: 'input',
name: 'maintainerUrl',
message: 'Your home page URL or your mailto URL:'
}, {
type: 'input',
name: 'url',
message: 'URL you want to run Misskey:',
validate: function(wannabeurl) {
return wannabeurl.match('^http\(s?\)://') ? true :
'URL needs to start with http:// or https://';
}
}, {
type: 'input',
name: 'port',
message: 'Listen port (e.g. 443):'
}, {
type: 'confirm',
name: 'https',
message: 'Use TLS?',
default: false
}, {
type: 'input',
name: 'https_key',
message: 'Path of tls key:',
when: ctx => ctx.https
}, {
type: 'input',
name: 'https_cert',
message: 'Path of tls cert:',
when: ctx => ctx.https
}, {
type: 'input',
name: 'https_ca',
message: 'Path of tls ca:',
when: ctx => ctx.https
}, {
type: 'input',
name: 'mongo_host',
message: 'MongoDB\'s host:',
default: 'localhost'
}, {
type: 'input',
name: 'mongo_port',
message: 'MongoDB\'s port:',
default: '27017'
}, {
type: 'input',
name: 'mongo_db',
message: 'MongoDB\'s db:',
default: 'misskey'
}, {
type: 'input',
name: 'mongo_user',
message: 'MongoDB\'s user:'
}, {
type: 'password',
name: 'mongo_pass',
message: 'MongoDB\'s password:'
}, {
type: 'input',
name: 'redis_host',
message: 'Redis\'s host:',
default: 'localhost'
}, {
type: 'input',
name: 'redis_port',
message: 'Redis\'s port:',
default: '6379'
}, {
type: 'password',
name: 'redis_pass',
message: 'Redis\'s password:'
}, {
type: 'confirm',
name: 'elasticsearch',
message: 'Use Elasticsearch?',
default: false
}, {
type: 'input',
name: 'es_host',
message: 'Elasticsearch\'s host:',
default: 'localhost',
when: ctx => ctx.elasticsearch
}, {
type: 'input',
name: 'es_port',
message: 'Elasticsearch\'s port:',
default: '9200',
when: ctx => ctx.elasticsearch
}, {
type: 'password',
name: 'es_pass',
message: 'Elasticsearch\'s password:',
when: ctx => ctx.elasticsearch
}, {
type: 'input',
name: 'recaptcha_site',
message: 'reCAPTCHA\'s site key:'
}, {
type: 'input',
name: 'recaptcha_secret',
message: 'reCAPTCHA\'s secret key:'
}];
inquirer.prompt(form).then(as => {
// Mapping answers
const conf = {
maintainer: {
name: as['maintainerName'],
url: as['maintainerUrl']
},
url: as['url'],
port: parseInt(as['port'], 10),
mongodb: {
host: as['mongo_host'],
port: parseInt(as['mongo_port'], 10),
db: as['mongo_db'],
user: as['mongo_user'],
pass: as['mongo_pass']
},
redis: {
host: as['redis_host'],
port: parseInt(as['redis_port'], 10),
pass: as['redis_pass']
},
elasticsearch: {
enable: as['elasticsearch'],
host: as['es_host'] || null,
port: parseInt(as['es_port'], 10) || null,
pass: as['es_pass'] || null
},
recaptcha: {
site_key: as['recaptcha_site'],
secret_key: as['recaptcha_secret']
}
};
if (as['https']) {
conf.https = {
key: as['https_key'] || null,
cert: as['https_cert'] || null,
ca: as['https_ca'] || null
};
}
console.log(`Thanks. Writing the configuration to ${chalk.bold(path.resolve(configPath))}`);
try {
fs.writeFileSync(configPath, yaml.dump(conf));
console.log(chalk.green('Well done.'));
} catch (e) {
console.error(e);
}
});

23
cli/mark-admin.js Normal file
View File

@@ -0,0 +1,23 @@
const mongo = require('mongodb');
const User = require('../built/models/user').default;
const args = process.argv.slice(2);
const user = args[0];
const q = user.startsWith('@') ? {
username: user.split('@')[1],
host: user.split('@')[2] || null
} : { _id: new mongo.ObjectID(user) };
console.log(`Mark as admin ${user}...`);
User.update(q, {
$set: {
isAdmin: true
}
}).then(() => {
console.log(`Done ${user}`);
}, e => {
console.error(e);
});

23
cli/mark-verified.js Normal file
View File

@@ -0,0 +1,23 @@
const mongo = require('mongodb');
const User = require('../built/models/user').default;
const args = process.argv.slice(2);
const user = args[0];
const q = user.startsWith('@') ? {
username: user.split('@')[1],
host: user.split('@')[2] || null
} : { _id: new mongo.ObjectID(user) };
console.log(`Mark as verfied ${user}...`);
User.update(q, {
$set: {
isVerified: true
}
}).then(() => {
console.log(`Done ${user}`);
}, e => {
console.error(e);
});

View File

@@ -3,8 +3,8 @@
const chalk = require('chalk');
const sequential = require('promise-sequential');
const { default: User } = require('../built/models/user');
const { default: DriveFile } = require('../built/models/drive-file');
const { default: User } = require('../../built/models/user');
const { default: DriveFile } = require('../../built/models/drive-file');
async function main() {
const promiseGens = [];

View File

@@ -3,8 +3,8 @@
const chalk = require('chalk');
const sequential = require('promise-sequential');
const { default: User } = require('../built/models/user');
const { default: DriveFile } = require('../built/models/drive-file');
const { default: User } = require('../../built/models/user');
const { default: DriveFile } = require('../../built/models/drive-file');
async function main() {
const promiseGens = [];

9
cli/migration/5.0.0.js Normal file
View File

@@ -0,0 +1,9 @@
const { default: DriveFile } = require('../../built/models/drive-file');
DriveFile.update({}, {
$rename: {
'metadata.isMetaOnly': 'metadata.withoutChunks'
}
}, {
multi: true
});

View File

@@ -14,7 +14,7 @@ RUN pacman -S --noconfirm pacman
RUN pacman-db-upgrade
RUN pacman -S --noconfirm archlinux-keyring
RUN pacman -Syyu --noconfirm
RUN pacman -S --noconfirm git nodejs npm mongodb redis imagemagick
RUN pacman -S --noconfirm git nodejs npm mongodb redis
COPY misskey.sh /root/misskey.sh
RUN chmod u+x /root/misskey.sh

6
docs/README.md Normal file
View File

@@ -0,0 +1,6 @@
# Docs
These docs are for contributors of Misskey or admins of instance of Misskey.
Docs for users are located in `src/docs`.
これらのドキュメントはMisskeyの開発者またはMisskeyインスタンス運営者向けです。
利用者向けのドキュメントは`src/docs`にあります。

45
docs/manage.en.md Normal file
View File

@@ -0,0 +1,45 @@
# Management guide
## Check the status of the job queue
In the directory of Misskey:
``` shell
node_modules/kue/bin/kue-dashboard -p 3050
```
When you access port 3050, you will see the UI.
## Mark as 'admin' user
``` shell
node cli/mark-admin (User-ID or Username)
```
## Mark as 'verified' user
``` shell
node cli/mark-verified (User-ID or Username)
```
## Suspend users
``` shell
node cli/suspend (User-ID or Username)
```
e.g.
``` shell
# Use id
node cli/suspend 57d01a501fdf2d07be417afe
# Use username
node cli/suspend @syuilo
# Use username (remote)
node cli/suspend @syuilo@misskey.xyz
```
## Clean up cached remote files
``` shell
node cli/clean-cached-remote-files
```
## Clean up unused drive files
``` shell
node cli/clean-unused-drive-files
```
> We recommend that you announce a user that unused drive files will be deleted before performing this operation, as it may delete the user's important files.

View File

@@ -7,7 +7,39 @@ node_modules/kue/bin/kue-dashboard -p 3050
```
ポート3050にアクセスするとUIが表示されます
## 管理者ユーザーを設定する
``` shell
node cli/mark-admin (ユーザーID または ユーザー名)
```
## 'verified'ユーザーを設定する
``` shell
node cli/mark-verified (ユーザーID または ユーザー名)
```
## ユーザーを凍結する
``` shell
node cli/suspend (ユーザーID)
node cli/suspend (ユーザーID または ユーザー名)
```
例:
``` shell
# ユーザーID
node cli/suspend 57d01a501fdf2d07be417afe
# ユーザー名
node cli/suspend @syuilo
# ユーザー名 (リモート)
node cli/suspend @syuilo@misskey.xyz
```
## キャッシュされたリモートファイルをクリーンアップする
``` shell
node cli/clean-cached-remote-files
```
## 使われていないドライブのファイルをクリーンアップする
``` shell
node cli/clean-unused-drive-files
```
> ユーザーの大事なファイルを削除する可能性があるので、この操作を実行する前にユーザーに告知することをお勧めします。

View File

@@ -8,18 +8,13 @@ This guide describes how to install and setup Misskey.
----------------------------------------------------------------
*1.* reCAPTCHA tokens
*1.* Create Misskey user
----------------------------------------------------------------
Misskey requires reCAPTCHA tokens.
Please visit https://www.google.com/recaptcha/intro/ and generate keys.
Running misskey on root is not a good idea so we create a user for that.
In debian for exemple :
*(optional)* Generating VAPID keys
----------------------------------------------------------------
If you want to enable ServiceWroker, you need to generate VAPID keys:
``` shell
npm install web-push -g
web-push generate-vapid-keys
```
adduser --disabled-password --disabled-login misskey
```
*2.* Install dependencies
@@ -27,25 +22,52 @@ web-push generate-vapid-keys
Please install and setup these softwares:
#### Dependencies :package:
* *Node.js* and *npm*
* **[MongoDB](https://www.mongodb.com/)**
* **[Node.js](https://nodejs.org/en/)**
* **[MongoDB](https://www.mongodb.com/)** >= 3.6
* **[Redis](https://redis.io/)**
* **[ImageMagick](http://www.imagemagick.org/script/index.php)** >= 7.0
##### Optional
* [Elasticsearch](https://www.elastic.co/) - used to provide searching feature instead of MongoDB
*3.* Install Misskey
----------------------------------------------------------------
1. `git clone -b master git://github.com/syuilo/misskey.git`
2. `cd misskey`
3. `npm install`
*4.* Prepare configuration
*3.* Setup MongoDB
----------------------------------------------------------------
You need to generate config file via `npm run config` command.
In root :
1. `mongo` Go to the mongo shell
2. `use misskey` Use the misskey database
3. `db.users.save( {dummy:"dummy"} )` Write dummy data to initialize the db.
4. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` Create the misskey user.
5. `exit` You're done !
*5.* Build Misskey
*4.* Install Misskey
----------------------------------------------------------------
1. `su - misskey` Connect to misskey user.
2. `git clone -b master git://github.com/syuilo/misskey.git` Clone the misskey repo from master branch.
3. `cd misskey` Navigate to misskey directory
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` Checkout to the [latest release](https://github.com/syuilo/misskey/releases/latest)
5. `npm install` Install misskey dependencies.
*(optional)* reCAPTCHA tokens
----------------------------------------------------------------
If you want to enable reCAPTCHA, you need to generate reCAPTCHA tokens:
Please visit https://www.google.com/recaptcha/intro/ and generate keys.
*(optional)* Generating VAPID keys
----------------------------------------------------------------
If you want to enable ServiceWroker, you need to generate VAPID keys:
Unless you have set your global node_modules location elsewhere, you need to run this in root.
``` shell
npm install web-push -g
web-push generate-vapid-keys
```
*5.* Make configuration file
----------------------------------------------------------------
1. `cp .config/example.yml .config/default.yml` Copy the `.config/example.yml` and rename it to `default.yml`.
2. Edit `default.yml`
*6.* Build Misskey
----------------------------------------------------------------
Build misskey with the following:
@@ -61,14 +83,48 @@ If you're still encountering errors about some modules, use node-gyp:
3. `node-gyp build`
4. `npm run build`
*6.* That is it.
*7.* That is it.
----------------------------------------------------------------
Well done! Now, you have an environment that run to Misskey.
### Launch
Just `sudo npm start`. GLHF!
### Launch normally
Just `npm start`. GLHF!
### Launch with systemd
1. Create a systemd service here: `/etc/systemd/system/misskey.service`
2. Edit it, and paste this and save:
```
[Unit]
Description=Misskey daemon
[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always
[Install]
WantedBy=multi-user.target
```
3. `systemctl daemon-reload ; systemctl enable misskey` Reload systemd and enable the misskey service.
4. `systemctl start misskey` Start the misskey service.
You can check if the service is running with `systemctl status misskey`.
### Way to Update to latest version of your Misskey
1. `git reset --hard && git pull origin master`
2. `npm install`
3. `npm run build`
1. `git fetch`
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
3. `npm install`
4. `npm run build`
----------------------------------------------------------------
If you have any questions or troubles, feel free to contact us!

View File

@@ -8,10 +8,48 @@ Misskeyサーバーの構築にご関心をお寄せいただきありがとう
----------------------------------------------------------------
*1.* reCAPTCHAトークンの用意
*1.* Misskeyユーザーの作成
----------------------------------------------------------------
MisskeyはreCAPTCHAトークンを必要とします。
https://www.google.com/recaptcha/intro/ にアクセスしてトークンを生成してください。
Misskeyのrootで実行しない方がよいため、代わりにユーザーを作成します。
Debianの例:
```
adduser --disabled-password --disabled-login misskey
```
*2.* 依存関係をインストールする
----------------------------------------------------------------
これらのソフトウェアをインストール・設定してください:
#### 依存関係 :package:
* **[Node.js](https://nodejs.org/en/)**
* **[MongoDB](https://www.mongodb.com/)** (3.6以上)
* **[Redis](https://redis.io/)**
##### オプション
* [Elasticsearch](https://www.elastic.co/) - 検索機能を向上させるために用います。
*3.* MongoDBの設定
----------------------------------------------------------------
ルートで:
1. `mongo` mongoシェルを起動
2. `use misskey` misskeyデータベースを使用
3. `db.users.save( {dummy:"dummy"} )` ダミーデータを書き込みDBを初期化
4. `db.createUser( { user: "misskey", pwd: "<password>", roles: [ { role: "readWrite", db: "misskey" } ] } )` misskeyユーザーを作成
5. `exit` mongoシェルを終了
*4.* Misskeyのインストール
----------------------------------------------------------------
1. `su - misskey` misskeyユーザーを使用
2. `git clone -b master git://github.com/syuilo/misskey.git` masterブランチからMisskeyレポジトリをクローン
3. `cd misskey` misskeyディレクトリに移動
4. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)` [最新のリリース](https://github.com/syuilo/misskey/releases/latest)を確認
5. `npm install` Misskeyの依存パッケージをインストール
*(オプション)* reCAPTCHAトークン
----------------------------------------------------------------
reCAPTCHAを有効にする場合、reCAPTCHAトークンを取得する必要があります。
https://www.google.com/recaptcha/intro/ にアクセスしてトークンを取得してください。
*(オプション)* VAPIDキーペアの生成
----------------------------------------------------------------
@@ -22,56 +60,67 @@ npm install web-push -g
web-push generate-vapid-keys
```
*2.* 依存関係をインストールする
*5.* 設定ファイルを作成する
----------------------------------------------------------------
これらのソフトウェアをインストール・設定してください:
1. `cp .config/example.yml .config/default.yml` `.config/example.yml`をコピーし名前を`default.yml`にする。
2. `default.yml` を編集する。
#### 依存関係 :package:
* *Node.js* と *npm*
* **[MongoDB](https://www.mongodb.com/)**
* **[Redis](https://redis.io/)**
* **[ImageMagick](http://www.imagemagick.org/script/index.php)**
##### オプション
* [Elasticsearch](https://www.elastic.co/) - 検索機能を向上させるために用います。
*3.* Misskeyのインストール
*6.* Misskeyのビルド
----------------------------------------------------------------
1. `git clone -b master git://github.com/syuilo/misskey.git`
2. `cd misskey`
3. `npm install`
*4.* 設定ファイルを用意する
----------------------------------------------------------------
`npm run config`コマンドを利用して、ガイドに従って情報を入力してください。
次のコマンドでMisskeyをビルドしてください:
*5.* Misskeyのビルド
----------------------------------------------------------------
`npm run build`
Debianをお使いであれば、`build-essential`パッケージをインストールする必要があります。
何らかのモジュールでエラーが発生する場合はnode-gypを使ってください:
1. `npm install -g node-gyp`
2. `node-gyp configure`
3. `node-gyp build`
4. `npm run build`
*6.* 以上です!
*7.* 以上です!
----------------------------------------------------------------
お疲れ様でした。これでMisskeyを動かす準備は整いました。
### 起動
`sudo npm start`するだけです。GLHF!
### 通常起動
`npm start`するだけです。GLHF!
### systemdを用いた起動
1. systemdサービスのファイルを作成: `/etc/systemd/system/misskey.service`
2. エディタで開き、以下のコードを貼り付けて保存:
```
[Unit]
Description=Misskey daemon
[Service]
Type=simple
User=misskey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/misskey/misskey
TimeoutSec=60
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=misskey
Restart=always
[Install]
WantedBy=multi-user.target
```
3. `systemctl daemon-reload ; systemctl enable misskey` systemdを再読み込みしmisskeyサービスを有効化
4. `systemctl start misskey` misskeyサービスの起動
`systemctl status misskey`と入力すると、サービスの状態を調べることができます。
### Misskeyを最新バージョンにアップデートする方法:
1. `git reset --hard && git pull origin master`
2. `npm install`
3. `npm run build`
1. `git fetch`
2. `git checkout $(git tag -l | grep -v 'rc[0-9]*$' | sort -V | tail -n 1)`
3. `npm install`
4. `npm run build`
## メモリが足りなくてビルドできない場合
Misskeyの(クライアントの)ビルドには、目安として8GBくらいのメモリを必要とします。
VPSなどでビルドする時は、もしかしたらメモリが足りなくなる可能性があります。
そうなった場合、もしVPSではなくあなたのPCが十分なメモリを搭載しているなら、あなたのPC上でビルドし、生成されたファイルをVPSにFTPでアップロードする方法を採ることができます。
----------------------------------------------------------------
1. あなたのPC上にMisskeyをインストールする
2. 設定ファイルを用意する。設定ファイルは、サーバーに合わせた設定にします。
3. npm run webpack
4. built/client をサーバーにアップロードする
5. サーバー上で、npm run gulp
6. 完了
なにかお困りのことがありましたらお気軽にご連絡ください。

View File

@@ -9,6 +9,7 @@ import * as ts from 'gulp-typescript';
const sourcemaps = require('gulp-sourcemaps');
import tslint from 'gulp-tslint';
const cssnano = require('gulp-cssnano');
const stylus = require('gulp-stylus');
import * as uglifyComposer from 'gulp-uglify/composer';
import pug = require('gulp-pug');
import * as rimraf from 'rimraf';
@@ -22,7 +23,6 @@ const uglifyes = require('uglify-es');
const locales = require('./locales');
import { fa } from './src/misc/fa';
const client = require('./built/client/meta.json');
import config from './src/config';
const uglify = uglifyComposer(uglifyes, console);
@@ -38,8 +38,6 @@ if (isDebug) {
const constants = require('./src/const.json');
require('./src/client/docs/gulpfile.ts');
gulp.task('build', [
'build:ts',
'build:copy',
@@ -47,8 +45,6 @@ gulp.task('build', [
'doc'
]);
gulp.task('rebuild', ['clean', 'build']);
gulp.task('build:ts', () => {
const tsProject = ts.createProject('./tsconfig.json');
@@ -85,19 +81,19 @@ gulp.task('lint', () =>
);
gulp.task('format', () =>
gulp.src('./src/**/*.ts')
.pipe(tslint({
formatter: 'verbose',
fix: true
}))
.pipe(tslint.report())
gulp.src('./src/**/*.ts')
.pipe(tslint({
formatter: 'verbose',
fix: true
}))
.pipe(tslint.report())
);
gulp.task('mocha', () =>
gulp.src([])
gulp.src('./test/**/*.ts')
.pipe(mocha({
exit: true,
compilers: 'ts:ts-node/register'
require: 'ts-node/register'
} as any))
);
@@ -118,8 +114,9 @@ gulp.task('build:client', [
'copy:client'
]);
gulp.task('build:client:script', () =>
gulp.src(['./src/client/app/boot.js', './src/client/app/safe.js'])
gulp.task('build:client:script', () => {
const client = require('./built/client/meta.json');
return gulp.src(['./src/client/app/boot.js', './src/client/app/safe.js'])
.pipe(replace('VERSION', JSON.stringify(client.version)))
.pipe(replace('API', JSON.stringify(config.api_url)))
.pipe(replace('ENV', JSON.stringify(env)))
@@ -127,8 +124,8 @@ gulp.task('build:client:script', () =>
.pipe(isProduction ? uglify({
toplevel: true
} as any) : gutil.noop())
.pipe(gulp.dest('./built/client/assets/')) as any
);
.pipe(gulp.dest('./built/client/assets/'));
});
gulp.task('build:client:styles', () =>
gulp.src('./src/client/app/init.css')
@@ -201,3 +198,10 @@ gulp.task('build:client:pug', [
}))
.pipe(gulp.dest('./built/client/app/'))
);
gulp.task('doc', () =>
gulp.src('./src/docs/**/*.styl')
.pipe(stylus())
.pipe((cssnano as any)())
.pipe(gulp.dest('./built/docs/assets/'))
);

View File

@@ -51,6 +51,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -85,6 +86,7 @@ common:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
notifications: "通知"
list: "リスト"
@@ -287,6 +289,8 @@ desktop/views/components/drive.file.vue:
banner: "バナー"
contextmenu:
rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
@@ -330,6 +334,12 @@ desktop/views/components/drive.vue:
create-folder: "フォルダーを作成"
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -404,6 +414,8 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
@@ -556,6 +568,7 @@ desktop/views/components/taskmanager.vue:
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
@@ -723,6 +736,12 @@ mobile/views/components/drive.file-detail.vue:
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -818,6 +837,7 @@ mobile/views/pages/following.vue:
mobile/views/pages/home.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
@@ -931,7 +951,16 @@ docs:
properties: "プロパティ"
endpoints:
params: "パラメータ"
no-params: "パラメータはありません"
res: "レスポンス"
require-credential: "このエンドポイントは認証情報が必須です。"
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
has-limit: "レートリミットがあります。"
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
show-src: "このエンドポイントのソースコードも閲覧できます。"
show-src-link: "コードをGitHubで見る"
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
props:
name: "名前"
type: "型"

View File

@@ -51,6 +51,7 @@ common:
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -85,6 +86,7 @@ common:
widgets: "Widget hinzufügen:"
home: "Startseite"
local: "Lokal"
hybrid: "ソーシャル"
global: "Global"
notifications: "Mitteilungen"
list: "Listen"
@@ -287,6 +289,8 @@ desktop/views/components/drive.file.vue:
banner: "Banner"
contextmenu:
rename: "Umbenennen"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
copy-url: "URL kopieren"
download: "Download"
else-files: "Anderes…"
@@ -330,6 +334,12 @@ desktop/views/components/drive.vue:
create-folder: "Ein Verzeichnis erstellen"
upload: "Eine Datei hochladen"
url-upload: "Von einer URL hochladen"
desktop/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "Folge ich"
follow: "Folgen"
@@ -404,6 +414,8 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v('ω')v"
create-poll: "Eine Abstimmung erstellen"
text-remain: "{} Zeichen verbleibend"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
desktop/views/components/post-form-window.vue:
note: "Neue Notiz"
reply: "Antworten"
@@ -556,6 +568,7 @@ desktop/views/components/taskmanager.vue:
desktop/views/components/timeline.vue:
home: "Home"
local: "Lokal"
hybrid: "ソーシャル"
global: "Global"
list: "Listen"
desktop/views/components/ui.header.vue:
@@ -723,6 +736,12 @@ mobile/views/components/drive.file-detail.vue:
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -818,6 +837,7 @@ mobile/views/pages/following.vue:
mobile/views/pages/home.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
@@ -931,7 +951,16 @@ docs:
properties: "プロパティ"
endpoints:
params: "パラメータ"
no-params: "パラメータはありません"
res: "レスポンス"
require-credential: "このエンドポイントは認証情報が必須です。"
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
has-limit: "レートリミットがあります。"
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
show-src: "このエンドポイントのソースコードも閲覧できます。"
show-src-link: "コードをGitHubで見る"
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
props:
name: "名前"
type: "型"

View File

@@ -51,6 +51,7 @@ common:
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
i-like-sushi: "I prefer sushi rather than pudding"
show-reversi-board-labels: "Show row and column labels in Reversi"
verified-user: "Verified user"
reversi:
drawn: "Draw"
my-turn: "Your turn"
@@ -85,12 +86,13 @@ common:
widgets: "Widgets"
home: "Home"
local: "Local"
hybrid: "Social"
global: "Global"
notifications: "Notifications"
list: "Lists"
swap-left: "Move to the left"
swap-right: "Move to the right"
swap-up: "Move upward"
swap-up: "Move up"
swap-down: "Move downward"
remove: "Remove"
add-column: "Add a column"
@@ -230,7 +232,7 @@ common/views/widgets/donation.vue:
title: "Request for donations"
text: "To keep Misskey up and running, we have to spend money on our domain name, the server costs and so on. Since we don't receive money from advertisements, we count on donations from all of you. If you're interested in helping, contact {}. Thank you for your contribution!"
common/views/widgets/photo-stream.vue:
title: "Photostream"
title: "Photo stream"
no-photos: "No photos"
common/views/widgets/posts-monitor.vue:
title: "Chart of posts"
@@ -270,7 +272,7 @@ desktop/views/components/choose-file-from-drive-window.vue:
upload: "Upload files from your device"
cancel: "Cancel"
ok: "OK"
choose-prompt: "Choose a file"
choose-prompt: "Choose files"
desktop/views/components/choose-folder-from-drive-window.vue:
cancel: "Cancel"
ok: "OK"
@@ -287,6 +289,8 @@ desktop/views/components/drive.file.vue:
banner: "Banner"
contextmenu:
rename: "Rename"
mark-as-sensitive: "Mark as 'sensitive'"
unmark-as-sensitive: "Unmark as 'sensitive'"
copy-url: "Copy URL"
download: "Download"
else-files: "Others"
@@ -330,6 +334,12 @@ desktop/views/components/drive.vue:
create-folder: "Create a folder"
upload: "Upload a file"
url-upload: "Upload from a URL"
desktop/views/components/media-image.vue:
sensitive: "The content is NSFW"
click-to-show: "Click to show"
desktop/views/components/media-video.vue:
sensitive: "The content is NSFW"
click-to-show: "Click to show"
desktop/views/components/follow-button.vue:
following: "Following"
follow: "Follow"
@@ -404,6 +414,8 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v('ω')v"
create-poll: "Create a poll"
text-remain: "{} characters remaining"
recent-tags: "Recent"
click-to-tagging: "Click to tagging"
desktop/views/components/post-form-window.vue:
note: "New note"
reply: "Reply"
@@ -556,6 +568,7 @@ desktop/views/components/taskmanager.vue:
desktop/views/components/timeline.vue:
home: "Home"
local: "Local"
hybrid: "Social"
global: "Global"
list: "Lists"
desktop/views/components/ui.header.vue:
@@ -566,7 +579,7 @@ desktop/views/components/ui.header.account.vue:
favorites: "Favorites"
lists: "Lists"
follow-requests: "Follow requests"
customize: "Customization of the home layout"
customize: "Customize home layout"
settings: "Settings"
signout: "Sign out"
dark: "Submerge in dark"
@@ -714,7 +727,7 @@ mobile/views/components/drive.vue:
mobile/views/components/drive-file-detail.vue:
rename: "Rename"
mobile/views/components/drive-file-chooser.vue:
select-file: "Choose a file"
select-file: "Choose files"
mobile/views/components/drive-folder-chooser.vue:
select-folder: "Choose a folder"
mobile/views/components/drive.file-detail.vue:
@@ -723,6 +736,12 @@ mobile/views/components/drive.file-detail.vue:
move: "Move"
hash: "Hash (md5)"
exif: "EXIF"
mobile/views/components/media-image.vue:
sensitive: "The content is NSFW"
click-to-show: "Click to show"
mobile/views/components/media-video.vue:
sensitive: "The content is NSFW"
click-to-show: "Click to show"
mobile/views/components/follow-button.vue:
following: "Following"
follow: "Follow"
@@ -818,6 +837,7 @@ mobile/views/pages/following.vue:
mobile/views/pages/home.vue:
home: "Home"
local: "Local"
hybrid: "Social"
global: "Global"
mobile/views/pages/messaging.vue:
messaging: "Messaging"
@@ -852,7 +872,7 @@ mobile/views/pages/search.vue:
search: "Search"
empty: "No posts were found for '{}'"
mobile/views/pages/selectdrive.vue:
select-file: "Choose a file"
select-file: "Choose files"
mobile/views/pages/settings.vue:
signed-in-as: "Signed in as {}"
lang: "Language"
@@ -931,7 +951,16 @@ docs:
properties: "Properties"
endpoints:
params: "Parameters"
no-params: "No parameter."
res: "Response"
require-credential: "This endpoint requires the authentication information."
require-permission: "This endpoint requires {permission} permission."
has-limit: "There is a rate limit."
duration-limit: "You can't request when a frequency of a request in during {duration} milliseconds exceeds {max} times."
min-interval-limit: "You can't request before {interval} milliseconds has passed since previous request."
show-src: "You can view source code for this endpoint."
show-src-link: "See the code on GitHub"
generated: "This doc is generated by an API definition."
props:
name: "Name"
type: "Type"

View File

@@ -51,6 +51,7 @@ common:
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -85,6 +86,7 @@ common:
widgets: "Accesorios"
home: "Inicio"
local: "Local"
hybrid: "ソーシャル"
global: "Global"
notifications: "Notificaciones"
list: "Listado"
@@ -287,6 +289,8 @@ desktop/views/components/drive.file.vue:
banner: "Banner"
contextmenu:
rename: "Renombrar"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
copy-url: "Copia la URL"
download: "Descargar"
else-files: "Otros"
@@ -330,6 +334,12 @@ desktop/views/components/drive.vue:
create-folder: "Crear una carpeta"
upload: "Subir fichero"
url-upload: "Subir desde una URL"
desktop/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "Siguiendo"
follow: "Sigue"
@@ -404,6 +414,8 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v('ω')v"
create-poll: "Crea una encuesta"
text-remain: "quedan {} caracteres"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
desktop/views/components/post-form-window.vue:
note: "Nota nueva"
reply: "Responder"
@@ -556,6 +568,7 @@ desktop/views/components/taskmanager.vue:
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
@@ -723,6 +736,12 @@ mobile/views/components/drive.file-detail.vue:
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -818,6 +837,7 @@ mobile/views/pages/following.vue:
mobile/views/pages/home.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
@@ -931,7 +951,16 @@ docs:
properties: "プロパティ"
endpoints:
params: "パラメータ"
no-params: "パラメータはありません"
res: "レスポンス"
require-credential: "このエンドポイントは認証情報が必須です。"
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
has-limit: "レートリミットがあります。"
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
show-src: "このエンドポイントのソースコードも閲覧できます。"
show-src-link: "コードをGitHubで見る"
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
props:
name: "名前"
type: "型"

View File

@@ -51,6 +51,7 @@ common:
my-token-regenerated: "Votre token vient d'être généré, vous allez maintenant être déconnecté."
i-like-sushi: "Je préfère les sushis (au pudding)"
show-reversi-board-labels: "Afficher les étiquettes des lignes et colonnes dans Reversi"
verified-user: "認証済みのユーザー"
reversi:
drawn: "Partie nulle"
my-turn: "Cest votre tour"
@@ -85,6 +86,7 @@ common:
widgets: "Widgets"
home: "Accueil"
local: "Local"
hybrid: "ソーシャル"
global: "Global"
notifications: "Notifications"
list: "Liste"
@@ -287,6 +289,8 @@ desktop/views/components/drive.file.vue:
banner: "Bannière"
contextmenu:
rename: "Renommer"
mark-as-sensitive: "Marquer comme sensible"
unmark-as-sensitive: "Ne pas marquer comme sensible"
copy-url: "Copier l'URL"
download: "Télécharger"
else-files: "Autres..."
@@ -330,6 +334,12 @@ desktop/views/components/drive.vue:
create-folder: "Créer un dossier"
upload: "Uploader un fichier"
url-upload: "Uploader d'un URL"
desktop/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "Cliquer pour afficher"
desktop/views/components/media-video.vue:
sensitive: "Le contenu est NSFW"
click-to-show: "Cliquer pour afficher"
desktop/views/components/follow-button.vue:
following: "Abonnements"
follow: "Suivre"
@@ -381,7 +391,7 @@ desktop/views/components/notes.note.vue:
desktop/views/components/notes.vue:
error: "Échec du chargement."
retry: "Réessayer"
load-more: "もっと読み込む"
load-more: "Afficher plus"
desktop/views/components/notifications.vue:
more: "Plus"
empty: "Pas de notifications"
@@ -404,6 +414,8 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v('ω')v"
create-poll: "Créer un sondage"
text-remain: "{} charactères restants"
recent-tags: "Récent"
click-to-tagging: "クリックでタグ付け"
desktop/views/components/post-form-window.vue:
note: "Nouvelle note"
reply: "Répondre"
@@ -444,8 +456,8 @@ desktop/views/components/settings.vue:
api-via-stream-desc: "この設定をオンにすると、websocket接続を経由してAPIリクエストが行われます(パフォーマンス向上が期待できます)。オフにすると、ネイティブの fetch APIが利用されます。この設定はこのデバイスのみ有効です。"
display: "Affichage et design"
customize: "Personnaliser l'Accueil"
choose-wallpaper: "壁紙を選択"
delete-wallpaper: "壁紙を削除"
choose-wallpaper: "Sélectionner un fond d'écran"
delete-wallpaper: "Supprimer le fond d'écran"
dark-mode: "Mode nuit"
circle-icons: "Utiliser des icônes circulaires"
gradient-window-header: "Utiliser les dégradés sur la barre de titre de la fenêtre"
@@ -473,7 +485,7 @@ desktop/views/components/settings.vue:
cache-warn: "クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。"
cache-cleared: "Cache nettoyé"
cache-cleared-desc: "Veuillez recharger la page."
auto-watch: "投稿の自動ウォッチ"
auto-watch: "Montre automatique"
auto-watch-desc: "リアクションしたり返信したりした投稿に関する通知を自動的に受け取るようにします。"
about: "À propose de Misskey"
operator: "L'admin de cette instance"
@@ -541,9 +553,9 @@ desktop/views/components/settings.profile.vue:
description: "Description"
birthday: "Date de naissance"
save: "Mettre à jour le profil"
locked-account: "アカウントの保護"
locked-account: "Protéger votre compte"
is-locked: "投稿を非公開にする"
other: "その他"
other: "Autre"
is-bot: "Ce compte est un Bot"
is-cat: "Ce compte est un Chat"
desktop/views/components/sub-note-content.vue:
@@ -556,6 +568,7 @@ desktop/views/components/taskmanager.vue:
desktop/views/components/timeline.vue:
home: "Accueil"
local: "Local"
hybrid: "Social"
global: "Global"
list: "Listes"
desktop/views/components/ui.header.vue:
@@ -605,7 +618,7 @@ desktop/views/components/window.vue:
desktop/views/pages/deck/deck.tl-column.vue:
is-media-only: "Les publications médias uniquement"
is-media-view: "Vue média"
edit: "オプション"
edit: "Options"
desktop/views/pages/deck/deck.note.vue:
reposted-by: "Reposté par {}"
private: "cette publication est privée"
@@ -663,7 +676,7 @@ desktop/views/pages/user/user.profile.vue:
muted: "Muting"
unmute: "Enlever la sourdine"
desktop/views/pages/user/user.header.vue:
posts: "投稿"
posts: "Notes"
following: "Suit"
followers: "Abonnés"
is-bot: "Ce compte est un Bot"
@@ -723,6 +736,12 @@ mobile/views/components/drive.file-detail.vue:
move: "Déplacer"
hash: "Hash (md5)"
exif: "EXIF"
mobile/views/components/media-image.vue:
sensitive: "Le contenu est NSFW"
click-to-show: "Cliquer pour afficher"
mobile/views/components/media-video.vue:
sensitive: "Le contenu est NSFW"
click-to-show: "Cliquer pour afficher"
mobile/views/components/follow-button.vue:
following: "Abonnements"
follow: "Suivre"
@@ -818,6 +837,7 @@ mobile/views/pages/following.vue:
mobile/views/pages/home.vue:
home: "Accueil"
local: "Local"
hybrid: "Social"
global: "Global"
mobile/views/pages/messaging.vue:
messaging: "Messagerie"
@@ -931,7 +951,16 @@ docs:
properties: "Propriétés"
endpoints:
params: "Paramètres"
no-params: "Aucun paramètre"
res: "Réponse"
require-credential: "このエンドポイントは認証情報が必須です。"
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
has-limit: "レートリミットがあります。"
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
show-src: "このエンドポイントのソースコードも閲覧できます。"
show-src-link: "Consulter le code sur GitHub"
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
props:
name: "Nom"
type: "Type"

View File

@@ -19,9 +19,9 @@ const langs = {
'es': loadLang('es')
};
Object.entries(langs).map(([, locale]) => {
Object.values(langs).forEach(locale => {
// Extend native language (Japanese)
locale = Object.assign({}, native, locale);
Object.assign(locale, native);
});
module.exports = langs;

View File

@@ -51,6 +51,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -85,6 +86,7 @@ common:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
notifications: "通知"
list: "リスト"
@@ -287,6 +289,8 @@ desktop/views/components/drive.file.vue:
banner: "バナー"
contextmenu:
rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
@@ -330,6 +334,12 @@ desktop/views/components/drive.vue:
create-folder: "フォルダーを作成"
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -404,6 +414,8 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
@@ -556,6 +568,7 @@ desktop/views/components/taskmanager.vue:
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
@@ -723,6 +736,12 @@ mobile/views/components/drive.file-detail.vue:
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -818,6 +837,7 @@ mobile/views/pages/following.vue:
mobile/views/pages/home.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
@@ -931,7 +951,16 @@ docs:
properties: "プロパティ"
endpoints:
params: "パラメータ"
no-params: "パラメータはありません"
res: "レスポンス"
require-credential: "このエンドポイントは認証情報が必須です。"
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
has-limit: "レートリミットがあります。"
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
show-src: "このエンドポイントのソースコードも閲覧できます。"
show-src-link: "コードをGitHubで見る"
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
props:
name: "名前"
type: "型"

View File

@@ -56,6 +56,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
reversi:
drawn: "引き分け"
@@ -93,7 +94,7 @@ common:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
hybrid: "ハイブリッド"
hybrid: "ソーシャル"
global: "グローバル"
notifications: "通知"
list: "リスト"
@@ -330,6 +331,8 @@ desktop/views/components/drive.file.vue:
banner: "バナー"
contextmenu:
rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
@@ -377,6 +380,14 @@ desktop/views/components/drive.vue:
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -466,6 +477,8 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
@@ -643,7 +656,7 @@ desktop/views/components/taskmanager.vue:
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ハイブリッド"
hybrid: "ソーシャル"
global: "グローバル"
list: "リスト"
@@ -853,6 +866,14 @@ mobile/views/components/drive.file-detail.vue:
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -967,7 +988,7 @@ mobile/views/pages/following.vue:
mobile/views/pages/home.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ハイブリッド"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/messaging.vue:
@@ -1098,7 +1119,16 @@ docs:
properties: "プロパティ"
endpoints:
params: "パラメータ"
no-params: "パラメータはありません"
res: "レスポンス"
require-credential: "このエンドポイントは認証情報が必須です。"
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
has-limit: "レートリミットがあります。"
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
show-src: "このエンドポイントのソースコードも閲覧できます。"
show-src-link: "コードをGitHubで見る"
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
props:
name: "名前"
type: "型"

View File

@@ -51,6 +51,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -85,6 +86,7 @@ common:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
notifications: "通知"
list: "リスト"
@@ -287,6 +289,8 @@ desktop/views/components/drive.file.vue:
banner: "バナー"
contextmenu:
rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
@@ -330,6 +334,12 @@ desktop/views/components/drive.vue:
create-folder: "フォルダーを作成"
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -404,6 +414,8 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
@@ -556,6 +568,7 @@ desktop/views/components/taskmanager.vue:
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
@@ -723,6 +736,12 @@ mobile/views/components/drive.file-detail.vue:
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -818,6 +837,7 @@ mobile/views/pages/following.vue:
mobile/views/pages/home.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
@@ -931,7 +951,16 @@ docs:
properties: "プロパティ"
endpoints:
params: "パラメータ"
no-params: "パラメータはありません"
res: "レスポンス"
require-credential: "このエンドポイントは認証情報が必須です。"
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
has-limit: "レートリミットがあります。"
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
show-src: "このエンドポイントのソースコードも閲覧できます。"
show-src-link: "コードをGitHubで見る"
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
props:
name: "名前"
type: "型"

View File

@@ -51,6 +51,7 @@ common:
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
i-like-sushi: "Wolę sushi od puddingu"
show-reversi-board-labels: "Pokazuj podpisy wierszy i kolumn w Reversi"
verified-user: "認証済みのユーザー"
reversi:
drawn: "Remis"
my-turn: "Twoja kolej"
@@ -85,6 +86,7 @@ common:
widgets: "Widżety"
home: "Strona główna"
local: "Lokalne"
hybrid: "Społeczność"
global: "Globalne"
notifications: "Powiadomienia"
list: "Listy"
@@ -287,6 +289,8 @@ desktop/views/components/drive.file.vue:
banner: "Baner"
contextmenu:
rename: "Zmień nazwę"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
copy-url: "Skopiuj adres"
download: "Pobierz"
else-files: "Inne"
@@ -330,6 +334,12 @@ desktop/views/components/drive.vue:
create-folder: "Utwórz katalog"
upload: "Wyślij plik"
url-upload: "Wyślij z adresu URL"
desktop/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "Śledzisz"
follow: "Śledź"
@@ -404,6 +414,8 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v('ω')v"
create-poll: "Utwórz ankietę"
text-remain: "pozostałe znaki: {}"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
desktop/views/components/post-form-window.vue:
note: "Nowy wpis"
reply: "Odpowiedz"
@@ -556,6 +568,7 @@ desktop/views/components/taskmanager.vue:
desktop/views/components/timeline.vue:
home: "Strona główna"
local: "Lokalne"
hybrid: "Społeczność"
global: "Globalne"
list: "Listy"
desktop/views/components/ui.header.vue:
@@ -723,6 +736,12 @@ mobile/views/components/drive.file-detail.vue:
move: "Przenieś"
hash: "Hash (md5)"
exif: "EXIF"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue:
following: "Śledzisz"
follow: "Śledź"
@@ -818,6 +837,7 @@ mobile/views/pages/following.vue:
mobile/views/pages/home.vue:
home: "Strona główna"
local: "Lokalne"
hybrid: "Społeczność"
global: "Globalne"
mobile/views/pages/messaging.vue:
messaging: "Wiadomości"
@@ -931,7 +951,16 @@ docs:
properties: "Właściwości"
endpoints:
params: "Parametry"
no-params: "パラメータはありません"
res: "Odpowiedź"
require-credential: "このエンドポイントは認証情報が必須です。"
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
has-limit: "レートリミットがあります。"
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
show-src: "このエンドポイントのソースコードも閲覧できます。"
show-src-link: "Zobacz kod na GitHubie"
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
props:
name: "Nazwa"
type: "Rodzaj"

View File

@@ -51,6 +51,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -85,6 +86,7 @@ common:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
notifications: "通知"
list: "リスト"
@@ -287,6 +289,8 @@ desktop/views/components/drive.file.vue:
banner: "バナー"
contextmenu:
rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
@@ -330,6 +334,12 @@ desktop/views/components/drive.vue:
create-folder: "フォルダーを作成"
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -404,6 +414,8 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
@@ -556,6 +568,7 @@ desktop/views/components/taskmanager.vue:
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
@@ -723,6 +736,12 @@ mobile/views/components/drive.file-detail.vue:
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -818,6 +837,7 @@ mobile/views/pages/following.vue:
mobile/views/pages/home.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
@@ -931,7 +951,16 @@ docs:
properties: "プロパティ"
endpoints:
params: "パラメータ"
no-params: "パラメータはありません"
res: "レスポンス"
require-credential: "このエンドポイントは認証情報が必須です。"
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
has-limit: "レートリミットがあります。"
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
show-src: "このエンドポイントのソースコードも閲覧できます。"
show-src-link: "コードをGitHubで見る"
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
props:
name: "名前"
type: "型"

View File

@@ -51,6 +51,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -85,6 +86,7 @@ common:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
notifications: "通知"
list: "リスト"
@@ -287,6 +289,8 @@ desktop/views/components/drive.file.vue:
banner: "バナー"
contextmenu:
rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
@@ -330,6 +334,12 @@ desktop/views/components/drive.vue:
create-folder: "フォルダーを作成"
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -404,6 +414,8 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
@@ -556,6 +568,7 @@ desktop/views/components/taskmanager.vue:
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
@@ -723,6 +736,12 @@ mobile/views/components/drive.file-detail.vue:
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -818,6 +837,7 @@ mobile/views/pages/following.vue:
mobile/views/pages/home.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
@@ -931,7 +951,16 @@ docs:
properties: "プロパティ"
endpoints:
params: "パラメータ"
no-params: "パラメータはありません"
res: "レスポンス"
require-credential: "このエンドポイントは認証情報が必須です。"
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
has-limit: "レートリミットがあります。"
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
show-src: "このエンドポイントのソースコードも閲覧できます。"
show-src-link: "コードをGitHubで見る"
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
props:
name: "名前"
type: "型"

View File

@@ -51,6 +51,7 @@ common:
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
i-like-sushi: "私は(プリンよりむしろ)寿司が好き"
show-reversi-board-labels: "リバーシのボードの行と列のラベルを表示"
verified-user: "認証済みのユーザー"
reversi:
drawn: "引き分け"
my-turn: "あなたのターンです"
@@ -85,6 +86,7 @@ common:
widgets: "ウィジェット"
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
notifications: "通知"
list: "リスト"
@@ -287,6 +289,8 @@ desktop/views/components/drive.file.vue:
banner: "バナー"
contextmenu:
rename: "名前を変更"
mark-as-sensitive: "閲覧注意に設定"
unmark-as-sensitive: "閲覧注意を解除"
copy-url: "URLをコピー"
download: "ダウンロード"
else-files: "その他..."
@@ -330,6 +334,12 @@ desktop/views/components/drive.vue:
create-folder: "フォルダーを作成"
upload: "ファイルをアップロード"
url-upload: "URLからアップロード"
desktop/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
desktop/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -404,6 +414,8 @@ desktop/views/components/post-form.vue:
insert-a-kao: "v('ω')v"
create-poll: "アンケートを作成"
text-remain: "残り{}文字"
recent-tags: "最近"
click-to-tagging: "クリックでタグ付け"
desktop/views/components/post-form-window.vue:
note: "新規投稿"
reply: "返信"
@@ -556,6 +568,7 @@ desktop/views/components/taskmanager.vue:
desktop/views/components/timeline.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
list: "リスト"
desktop/views/components/ui.header.vue:
@@ -723,6 +736,12 @@ mobile/views/components/drive.file-detail.vue:
move: "移動"
hash: "ハッシュ (md5)"
exif: "EXIF"
mobile/views/components/media-image.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/media-video.vue:
sensitive: "閲覧注意"
click-to-show: "クリックして表示"
mobile/views/components/follow-button.vue:
following: "フォロー中"
follow: "フォロー"
@@ -818,6 +837,7 @@ mobile/views/pages/following.vue:
mobile/views/pages/home.vue:
home: "ホーム"
local: "ローカル"
hybrid: "ソーシャル"
global: "グローバル"
mobile/views/pages/messaging.vue:
messaging: "メッセージ"
@@ -931,7 +951,16 @@ docs:
properties: "プロパティ"
endpoints:
params: "パラメータ"
no-params: "パラメータはありません"
res: "レスポンス"
require-credential: "このエンドポイントは認証情報が必須です。"
require-permission: "このエンドポイントは{permission}の権限を必要とします。"
has-limit: "レートリミットがあります。"
duration-limit: "直近{duration}ミリ秒の間のこのエンドポイントへのリクエスト数の合計が{max}を超える場合はリクエストできません。"
min-interval-limit: "前回のリクエストから{interval}ミリ秒経っていない場合はリクエストできません。"
show-src: "このエンドポイントのソースコードも閲覧できます。"
show-src-link: "コードをGitHubで見る"
generated: "このドキュメントはAPI定義に基づき自動生成されています。"
props:
name: "名前"
type: "型"

View File

@@ -1,11 +0,0 @@
Misskeyの破壊的変更に対応するいくつかのスニペットがあります。
MongoDBシェルで実行する必要のあるものとnodeで直接実行する必要のあるものがあります。
ファイル名が `shell.` から始まるものは前者、 `node.` から始まるものは後者です。
MongoDBシェルで実行する場合、`use`でデータベースを選択しておく必要があります。
nodeで実行するいくつかのスニペットは、並列処理させる数を引数で設定できるものがあります。
処理中にエラーで落ちる場合は、メモリが足りていない可能性があるので、少ない数に設定してみてください。
※デフォルトは`5`です。
ファイルを作成する際は `../init-migration-file.sh -t _type_ -n _name_` を実行すると _type_._unixtime_._name_.js が生成されます

View File

@@ -1,37 +0,0 @@
#!/bin/bash
usage() {
echo "$0 [-t type] [-n name]"
echo " type: [node | shell]"
echo " name: if no present, set untitled"
exit 0
}
while getopts :t:n:h OPT
do
case $OPT in
t) type=$OPTARG
;;
n) name=$OPTARG
;;
h) usage
;;
\?) usage
;;
:) usage
;;
esac
done
if [ "$type" = "" ]
then
echo "no type present!!!"
usage
fi
if [ "$name" = "" ]
then
name="untitled"
fi
touch "$(realpath $(dirname $BASH_SOURCE))/migration/$type.$(date +%s).$name.js"

16344
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,21 +1,18 @@
{
"name": "misskey",
"author": "syuilo <i@syuilo.com>",
"version": "4.17.1",
"clientVersion": "1.0.7112",
"version": "5.0.0",
"clientVersion": "1.0.7553",
"codename": "nighthike",
"main": "./built/index.js",
"private": true,
"scripts": {
"config": "node ./cli/init.js",
"start": "node ./built",
"debug": "DEBUG=misskey:* node ./built",
"swagger": "node ./swagger.js",
"build": "webpack && gulp build",
"webpack": "webpack",
"watch": "webpack --watch",
"gulp": "gulp build",
"rebuild": "gulp rebuild",
"clean": "gulp clean",
"cleanall": "gulp cleanall",
"lint": "gulp lint",
@@ -27,15 +24,15 @@
"@fortawesome/fontawesome-free-brands": "5.0.13",
"@fortawesome/fontawesome-free-regular": "5.0.13",
"@fortawesome/fontawesome-free-solid": "5.0.13",
"@koa/cors": "2.2.1",
"@koa/cors": "2.2.2",
"@prezzemolo/rap": "0.1.2",
"@prezzemolo/zip": "0.0.3",
"@types/bcryptjs": "2.4.1",
"@types/dateformat": "1.0.1",
"@types/debug": "0.0.30",
"@types/deep-equal": "1.0.1",
"@types/elasticsearch": "5.0.24",
"@types/elasticsearch": "5.0.25",
"@types/file-type": "5.2.1",
"@types/gm": "1.18.0",
"@types/gulp": "3.8.36",
"@types/gulp-htmlmin": "1.3.32",
"@types/gulp-mocha": "0.0.32",
@@ -43,7 +40,6 @@
"@types/gulp-replace": "0.0.31",
"@types/gulp-uglify": "3.0.5",
"@types/gulp-util": "3.0.34",
"@types/inquirer": "0.0.42",
"@types/is-root": "1.0.0",
"@types/is-url": "1.2.28",
"@types/js-yaml": "3.11.2",
@@ -60,12 +56,14 @@
"@types/koa-views": "2.0.3",
"@types/koa__cors": "2.2.2",
"@types/kue": "0.11.9",
"@types/minio": "6.0.2",
"@types/mkdirp": "0.5.2",
"@types/mocha": "5.2.3",
"@types/mongodb": "3.1.1",
"@types/mongodb": "3.1.2",
"@types/ms": "0.7.30",
"@types/node": "10.5.2",
"@types/node": "10.5.3",
"@types/parse5": "5.0.0",
"@types/portscanner": "2.1.0",
"@types/pug": "2.0.4",
"@types/qrcode": "1.2.0",
"@types/ratelimiter": "2.1.28",
@@ -74,11 +72,13 @@
"@types/request-promise-native": "1.0.15",
"@types/rimraf": "2.0.2",
"@types/seedrandom": "2.4.27",
"@types/sharp": "0.17.9",
"@types/showdown": "1.7.5",
"@types/single-line-log": "1.1.0",
"@types/speakeasy": "2.0.2",
"@types/tmp": "0.0.33",
"@types/uuid": "3.4.3",
"@types/webpack": "4.4.5",
"@types/webpack": "4.4.8",
"@types/webpack-stream": "3.2.10",
"@types/websocket": "0.0.39",
"@types/ws": "5.1.2",
@@ -91,44 +91,45 @@
"chalk": "2.4.1",
"crc-32": "1.2.0",
"css-loader": "1.0.0",
"dateformat": "3.0.3",
"debug": "3.1.0",
"deep-equal": "1.0.1",
"deepcopy": "0.6.3",
"diskusage": "0.2.4",
"dompurify": "1.0.5",
"elasticsearch": "15.1.1",
"element-ui": "2.4.3",
"emojilib": "2.2.12",
"element-ui": "2.4.4",
"emojilib": "2.3.0",
"escape-regexp": "0.0.1",
"eslint": "5.0.1",
"eslint-plugin-vue": "4.5.0",
"eslint-plugin-vue": "4.7.1",
"eventemitter3": "3.1.0",
"exif-js": "2.3.0",
"file-loader": "1.1.11",
"file-type": "8.1.0",
"fuckadblock": "3.2.1",
"gm": "1.23.1",
"gulp": "3.9.1",
"gulp-cssnano": "2.1.3",
"gulp-htmlmin": "4.0.0",
"gulp-imagemin": "4.1.0",
"gulp-mocha": "6.0.0",
"gulp-pug": "4.0.1",
"gulp-rename": "1.3.0",
"gulp-rename": "1.4.0",
"gulp-replace": "1.0.0",
"gulp-sourcemaps": "2.6.4",
"gulp-stylus": "2.7.0",
"gulp-tslint": "8.1.3",
"gulp-typescript": "4.0.2",
"gulp-uglify": "3.0.0",
"gulp-uglify": "3.0.1",
"gulp-util": "3.0.8",
"hard-source-webpack-plugin": "0.11.0",
"hard-source-webpack-plugin": "0.11.2",
"highlight.js": "9.12.0",
"html-minifier": "3.5.18",
"html-minifier": "3.5.19",
"http-signature": "1.2.0",
"inquirer": "6.0.0",
"insert-text-at-cursor": "0.1.1",
"is-root": "2.0.0",
"is-url": "1.2.4",
"jquery": "3.3.1",
"js-yaml": "3.12.0",
"jsdom": "11.11.0",
"koa": "2.5.1",
@@ -146,6 +147,7 @@
"kue": "0.11.6",
"loader-utils": "1.1.0",
"mecab-async": "0.1.2",
"minio": "6.0.0",
"mkdirp": "0.5.1",
"mocha": "5.2.0",
"moji": "0.5.1",
@@ -160,13 +162,13 @@
"on-build-webpack": "0.1.0",
"os-utils": "0.0.14",
"parse5": "5.0.0",
"portscanner": "2.2.0",
"progress-bar-webpack-plugin": "1.11.0",
"prominence": "0.2.0",
"promise-sequential": "1.1.1",
"pug": "2.0.3",
"punycode": "2.1.1",
"qrcode": "1.2.0",
"ratelimiter": "3.1.0",
"ratelimiter": "3.2.0",
"recaptcha-promise": "0.1.3",
"reconnecting-websocket": "3.2.2",
"redis": "2.8.0",
@@ -177,15 +179,16 @@
"s-age": "1.1.2",
"sass-loader": "7.0.3",
"seedrandom": "2.4.3",
"sharp": "0.20.5",
"showdown": "1.8.6",
"showdown-highlightjs-extension": "0.1.2",
"single-line-log": "1.1.2",
"speakeasy": "2.0.0",
"style-loader": "0.21.0",
"stylus": "0.54.5",
"stylus-loader": "3.0.2",
"summaly": "2.0.6",
"swagger-jsdoc": "1.9.7",
"syuilo-password-strength": "0.0.1",
"tcp-port-used": "0.1.2",
"textarea-caret": "3.1.0",
"tmp": "0.0.33",
"ts-loader": "4.4.1",
@@ -201,18 +204,19 @@
"vue-cropperjs": "2.2.1",
"vue-js-modal": "1.3.16",
"vue-json-tree-view": "2.1.4",
"vue-loader": "15.2.4",
"vue-loader": "15.2.6",
"vue-router": "3.0.1",
"vue-style-loader": "4.1.1",
"vue-template-compiler": "2.5.16",
"vuedraggable": "2.16.0",
"vuex": "3.0.1",
"vuex-persistedstate": "^2.5.4",
"vuex-persistedstate": "2.5.4",
"web-push": "3.3.2",
"webfinger.js": "2.6.6",
"webpack": "4.15.1",
"webpack-cli": "3.0.8",
"webpack": "4.16.2",
"webpack-cli": "3.1.0",
"websocket": "1.0.26",
"ws": "5.2.1",
"ws": "6.0.0",
"xev": "2.0.1"
},
"greenkeeper": {

View File

@@ -2,7 +2,7 @@
<div class="form">
<header>
<h1><i>{{ app.name }}</i>があなたのアカウントにアクセスすることを<b>許可</b>しますか</h1>
<img :src="`${app.iconUrl}?thumbnail&size=64`"/>
<img :src="app.iconUrl"/>
</header>
<div class="app">
<section>

View File

@@ -17,21 +17,21 @@ export default function(type, data): Notification {
return {
title: 'ファイルがアップロードされました',
body: data.name,
icon: data.url + '?thumbnail&size=64'
icon: data.url
};
case 'unread_messaging_message':
return {
title: `${getUserName(data.user)}さんからメッセージ:`,
body: data.text, // TODO: getMessagingMessageSummary(data),
icon: data.user.avatarUrl + '?thumbnail&size=64'
icon: data.user.avatarUrl
};
case 'reversi_invited':
return {
title: '対局への招待があります',
body: `${getUserName(data.parent)}さんから`,
icon: data.parent.avatarUrl + '?thumbnail&size=64'
icon: data.parent.avatarUrl
};
case 'notification':
@@ -40,28 +40,28 @@ export default function(type, data): Notification {
return {
title: `${getUserName(data.user)}さんから:`,
body: getNoteSummary(data),
icon: data.user.avatarUrl + '?thumbnail&size=64'
icon: data.user.avatarUrl
};
case 'reply':
return {
title: `${getUserName(data.user)}さんから返信:`,
body: getNoteSummary(data),
icon: data.user.avatarUrl + '?thumbnail&size=64'
icon: data.user.avatarUrl
};
case 'quote':
return {
title: `${getUserName(data.user)}さんが引用:`,
body: getNoteSummary(data),
icon: data.user.avatarUrl + '?thumbnail&size=64'
icon: data.user.avatarUrl
};
case 'reaction':
return {
title: `${getUserName(data.user)}: ${getReactionEmoji(data.reaction)}:`,
body: getNoteSummary(data.note),
icon: data.user.avatarUrl + '?thumbnail&size=64'
icon: data.user.avatarUrl
};
default:

View File

@@ -39,13 +39,17 @@ export default Vue.extend({
dark: {
type: Boolean,
default: false
},
smooth: {
type: Boolean,
default: false
}
},
data() {
return {
now: new Date(),
clock: null,
enabled: true,
graduationsPadding: 0.5,
handsPadding: 1,
@@ -74,6 +78,9 @@ export default Vue.extend({
return themeColor;
},
ms(): number {
return this.now.getMilliseconds() * this.smooth;
}
s(): number {
return this.now.getSeconds();
},
@@ -85,13 +92,13 @@ export default Vue.extend({
},
hAngle(): number {
return Math.PI * (this.h % 12 + this.m / 60) / 6;
return Math.PI * (this.h % 12 + (this.m + (this.s + this.ms / 1000) / 60) / 60) / 6;
},
mAngle(): number {
return Math.PI * (this.m + this.s / 60) / 30;
return Math.PI * (this.m + (this.s + this.ms / 1000) / 60) / 30;
},
sAngle(): number {
return Math.PI * this.s / 30;
return Math.PI * (this.s + this.ms / 1000) / 30;
},
graduations(): any {
@@ -106,11 +113,17 @@ export default Vue.extend({
},
mounted() {
this.clock = setInterval(this.tick, 1000);
const update = () => {
if (this.enabled) {
this.tick();
requestAnimationFrame(update);
}
};
update();
},
beforeDestroy() {
clearInterval(this.clock);
this.enabled = false;
},
methods: {

View File

@@ -2,11 +2,16 @@
<div class="mk-autocomplete" @contextmenu.prevent="() => {}">
<ol class="users" ref="suggests" v-if="users.length > 0">
<li v-for="user in users" @click="complete(type, user)" @keydown="onKeydown" tabindex="-1">
<img class="avatar" :src="`${user.avatarUrl}?thumbnail&size=32`" alt=""/>
<img class="avatar" :src="user.avatarUrl" alt=""/>
<span class="name">{{ user | userName }}</span>
<span class="username">@{{ user | acct }}</span>
</li>
</ol>
<ol class="hashtags" ref="suggests" v-if="hashtags.length > 0">
<li v-for="hashtag in hashtags" @click="complete(type, hashtag)" @keydown="onKeydown" tabindex="-1">
<span class="name">{{ hashtag }}</span>
</li>
</ol>
<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">
<span class="emoji">{{ emoji.emoji }}</span>
@@ -48,33 +53,33 @@ emjdb.sort((a, b) => a.name.length - b.name.length);
export default Vue.extend({
props: ['type', 'q', 'textarea', 'complete', 'close', 'x', 'y'],
data() {
return {
fetching: true,
users: [],
hashtags: [],
emojis: [],
select: -1,
emojilib
}
},
computed: {
items(): HTMLCollection {
return (this.$refs.suggests as Element).children;
}
},
updated() {
//#region 位置調整
const margin = 32;
if (this.x + this.$el.offsetWidth > window.innerWidth - margin) {
this.$el.style.left = (this.x - this.$el.offsetWidth) + 'px';
this.$el.style.marginLeft = '-16px';
if (this.x + this.$el.offsetWidth > window.innerWidth) {
this.$el.style.left = (window.innerWidth - this.$el.offsetWidth) + 'px';
} else {
this.$el.style.left = this.x + 'px';
this.$el.style.marginLeft = '0';
}
if (this.y + this.$el.offsetHeight > window.innerHeight - margin) {
if (this.y + this.$el.offsetHeight > window.innerHeight) {
this.$el.style.top = (this.y - this.$el.offsetHeight) + 'px';
this.$el.style.marginTop = '0';
} else {
@@ -83,6 +88,7 @@ export default Vue.extend({
}
//#endregion
},
mounted() {
this.textarea.addEventListener('keydown', this.onKeydown);
@@ -100,6 +106,7 @@ export default Vue.extend({
});
});
},
beforeDestroy() {
this.textarea.removeEventListener('keydown', this.onKeydown);
@@ -107,6 +114,7 @@ export default Vue.extend({
el.removeEventListener('mousedown', this.onMousedown);
});
},
methods: {
exec() {
this.select = -1;
@@ -117,7 +125,8 @@ export default Vue.extend({
}
if (this.type == 'user') {
const cache = sessionStorage.getItem(this.q);
const cacheKey = 'autocomplete:user:' + this.q;
const cache = sessionStorage.getItem(cacheKey);
if (cache) {
const users = JSON.parse(cache);
this.users = users;
@@ -131,9 +140,33 @@ export default Vue.extend({
this.fetching = false;
// キャッシュ
sessionStorage.setItem(this.q, JSON.stringify(users));
sessionStorage.setItem(cacheKey, JSON.stringify(users));
});
}
} else if (this.type == 'hashtag') {
if (this.q == null || this.q == '') {
this.hashtags = JSON.parse(localStorage.getItem('hashtags') || '[]');
this.fetching = false;
} else {
const cacheKey = 'autocomplete:hashtag:' + this.q;
const cache = sessionStorage.getItem(cacheKey);
if (cache) {
const hashtags = JSON.parse(cache);
this.hashtags = hashtags;
this.fetching = false;
} else {
(this as any).api('hashtags/search', {
query: this.q,
limit: 30
}).then(hashtags => {
this.hashtags = hashtags;
this.fetching = false;
// キャッシュ
sessionStorage.setItem(cacheKey, JSON.stringify(hashtags));
});
}
}
} else if (this.type == 'emoji') {
const matched = [];
emjdb.some(x => {
@@ -228,12 +261,13 @@ export default Vue.extend({
<style lang="stylus" scoped>
@import '~const.styl'
.mk-autocomplete
root(isDark)
position fixed
z-index 65535
max-width 100%
margin-top calc(1em + 8px)
overflow hidden
background #fff
background isDark ? #313543 : #fff
border solid 1px rgba(#000, 0.1)
border-radius 4px
transition top 0.1s ease, left 0.1s ease
@@ -248,7 +282,8 @@ export default Vue.extend({
list-style none
> li
display block
display flex
align-items center
padding 4px 12px
white-space nowrap
overflow hidden
@@ -259,7 +294,13 @@ export default Vue.extend({
&, *
user-select none
*
overflow hidden
text-overflow ellipsis
&:hover
background isDark ? rgba(#fff, 0.1) : rgba(#000, 0.1)
&[data-selected='true']
background $theme-color
@@ -275,7 +316,6 @@ export default Vue.extend({
> .users > li
.avatar
vertical-align middle
min-width 28px
min-height 28px
max-width 28px
@@ -285,10 +325,15 @@ export default Vue.extend({
.name
margin 0 8px 0 0
color rgba(#000, 0.8)
color isDark ? rgba(#fff, 0.8) : rgba(#000, 0.8)
.username
color rgba(#000, 0.3)
color isDark ? rgba(#fff, 0.3) : rgba(#000, 0.3)
> .hashtags > li
.name
color isDark ? rgba(#fff, 0.8) : rgba(#000, 0.8)
> .emojis > li
@@ -298,10 +343,15 @@ export default Vue.extend({
width 24px
.name
color rgba(#000, 0.8)
color isDark ? rgba(#fff, 0.8) : rgba(#000, 0.8)
.alias
margin 0 0 0 8px
color rgba(#000, 0.3)
color isDark ? rgba(#fff, 0.3) : rgba(#000, 0.3)
.mk-autocomplete[data-darkmode]
root(true)
.mk-autocomplete:not([data-darkmode])
root(false)
</style>

View File

@@ -31,7 +31,7 @@ export default Vue.extend({
: this.user.avatarColor && this.user.avatarColor.length == 3
? `rgb(${ this.user.avatarColor.join(',') })`
: null,
backgroundImage: this.lightmode ? null : `url(${ this.user.avatarUrl }?thumbnail)`,
backgroundImage: this.lightmode ? null : `url(${ this.user.avatarUrl })`,
borderRadius: this.$store.state.settings.circleIcons ? '100%' : null
};
}

View File

@@ -26,8 +26,8 @@
:class="{ empty: stone == null, none: o.map[i] == 'null', isEnded: game.isEnded, myTurn: !game.isEnded && isMyTurn, can: turnUser ? o.canPut(turnUser.id == blackUser.id, i) : null, prev: o.prevPos == i }"
@click="set(i)"
:title="`${String.fromCharCode(65 + o.transformPosToXy(i)[0])}${o.transformPosToXy(i)[1] + 1}`">
<img v-if="stone === true" :src="`${blackUser.avatarUrl}?thumbnail&size=128`" alt="">
<img v-if="stone === false" :src="`${whiteUser.avatarUrl}?thumbnail&size=128`" alt="">
<img v-if="stone === true" :src="blackUser.avatarUrl" alt="">
<img v-if="stone === false" :src="whiteUser.avatarUrl" alt="">
</div>
</div>
<div class="labels-y" v-if="this.$store.state.settings.reversiBoardLabels">

View File

@@ -112,7 +112,7 @@ export default Vue.extend({
computed: {
mapCategories(): string[] {
const categories = Object.entries(maps).map(x => x[1].category);
const categories = Object.values(maps).map(x => x.category);
return categories.filter((item, pos) => categories.indexOf(item) == pos);
},
isAccepted(): boolean {
@@ -179,8 +179,8 @@ export default Vue.extend({
if (this.game.settings.map == null) {
this.mapName = null;
} else {
const foundMap = Object.entries(maps).find(x => x[1].data.join('') == this.game.settings.map.join(''));
this.mapName = foundMap ? foundMap[1].name : '-Custom-';
const found = Object.values(maps).find(x => x.data.join('') == this.game.settings.map.join(''));
this.mapName = found ? found.name : '-Custom-';
}
},
@@ -206,7 +206,7 @@ export default Vue.extend({
if (v == null) {
this.game.settings.map = null;
} else {
this.game.settings.map = Object.entries(maps).find(x => x[1].name == v)[1].data;
this.game.settings.map = Object.values(maps).find(x => x.name == v).data;
}
this.$forceUpdate();
this.updateSettings();
@@ -217,9 +217,9 @@ export default Vue.extend({
const y = Math.floor(pos / this.game.settings.map[0].length);
const newPixel =
pixel == ' ' ? '-' :
pixel == '-' ? 'b' :
pixel == 'b' ? 'w' :
' ';
pixel == '-' ? 'b' :
pixel == 'b' ? 'w' :
' ';
const line = this.game.settings.map[y].split('');
line[x] = newPixel;
this.$set(this.game.settings.map, y, line.join(''));

View File

@@ -46,33 +46,45 @@ export default Vue.extend({
display grid
grid-gap 4px
> *
overflow hidden
border-radius 4px
&[data-count="1"]
grid-template-rows 1fr
&[data-count="2"]
grid-template-columns 1fr 1fr
grid-template-rows 1fr
&[data-count="3"]
grid-template-columns 1fr 0.5fr
grid-template-rows 1fr 1fr
:nth-child(1)
> *:nth-child(1)
grid-row 1 / 3
:nth-child(3)
> *:nth-child(3)
grid-column 2 / 3
grid-row 2 / 3
&[data-count="4"]
grid-template-columns 1fr 1fr
grid-template-rows 1fr 1fr
:nth-child(1)
> *:nth-child(1)
grid-column 1 / 2
grid-row 1 / 2
:nth-child(2)
> *:nth-child(2)
grid-column 2 / 3
grid-row 1 / 2
:nth-child(3)
> *:nth-child(3)
grid-column 1 / 2
grid-row 2 / 3
:nth-child(4)
> *:nth-child(4)
grid-column 2 / 3
grid-row 2 / 3

View File

@@ -119,7 +119,7 @@ export default Vue.extend({
},
onKeypress(e) {
if ((e.which == 10 || e.which == 13) && e.ctrlKey) {
if ((e.which == 10 || e.which == 13) && e.ctrlKey && this.canSend) {
this.send();
}
},

View File

@@ -3,9 +3,9 @@
<mk-avatar class="avatar" :user="message.user" target="_blank"/>
<div class="content">
<div class="balloon" :data-no-text="message.text == null">
<button class="delete-button" v-if="isMe" title="%i18n:common.delete%">
<!-- <button class="delete-button" v-if="isMe" title="%i18n:common.delete%">
<img src="/assets/desktop/messaging/delete.png" alt="Delete"/>
</button>
</button> -->
<div class="content" v-if="!message.isDeleted">
<misskey-flavored-markdown class="text" v-if="message.text" ref="text" :text="message.text" :i="$store.state.i"/>
<div class="file" v-if="message.file">
@@ -175,14 +175,11 @@ root(isDark)
margin 8px 0
> footer
display flex
display block
margin 2px 0 0 0
font-size 11px
font-size 10px
color isDark ? rgba(#fff, 0.4) : rgba(#000, 0.4)
> .read
margin 0 8px 0 0
> [data-fa]
margin-left 4px
@@ -214,7 +211,7 @@ root(isDark)
color #fff
> footer
justify-content left
text-align left
&[data-is-me]
> .avatar
@@ -248,7 +245,13 @@ root(isDark)
color #fff !important
> footer
justify-content right
text-align right
> .read
user-select none
margin 0 4px 0 0
color isDark ? rgba(#fff, 0.5) : rgba(#000, 0.5)
font-size 11px
&[data-is-deleted]
> .baloon

View File

@@ -255,8 +255,7 @@ root(isDark)
width 100%
max-width 600px
margin 0 auto
flex 1 1 0
overflow-y auto
flex 1
> .init
width 100%
@@ -342,6 +341,10 @@ root(isDark)
background isDark ? #191b22 : #fff
> footer
position -webkit-sticky
position sticky
z-index 2
bottom 0
width 100%
max-width 600px
margin 0 auto

View File

@@ -2,6 +2,7 @@
<header class="bvonvjxbwzaiskogyhbwgyxvcgserpmu">
<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle == 'smart'"/>
<router-link class="name" :to="note.user | userPage" v-user-preview="note.user.id">{{ note.user | userName }}</router-link>
<span class="is-verified" v-if="note.user.isVerified" title="%i18n:common.verified-user%">%fa:bookmark%</span>
<span class="is-admin" v-if="note.user.isAdmin">admin</span>
<span class="is-bot" v-if="note.user.isBot">bot</span>
<span class="is-cat" v-if="note.user.isCat">cat</span>
@@ -69,6 +70,10 @@ root(isDark)
&:hover
text-decoration underline
> .is-verified
margin-right 8px
color #4dabf7
> .is-admin
> .is-bot
> .is-cat

View File

@@ -29,11 +29,7 @@
<p slot="text" v-if="passwordRetypeState == 'not-match'" style="color:#FF1161">%fa:exclamation-triangle .fw% %i18n:@password-not-matched%</p>
</div>
</ui-input>
<div class="g-recaptcha" :data-sitekey="recaptchaSitekey" style="margin: 16px 0;"></div>
<label class="agree-tou" style="display: block; margin: 16px 0;">
<input name="agree-tou" type="checkbox" required/>
<p><a :href="touUrl" target="_blank">利用規約</a>に同意する</p>
</label>
<div v-if="recaptchaSitekey != null" class="g-recaptcha" :data-sitekey="recaptchaSitekey" style="margin: 16px 0;"></div>
<ui-button type="submit">%i18n:@create%</ui-button>
</form>
</template>
@@ -41,7 +37,7 @@
<script lang="ts">
import Vue from 'vue';
const getPasswordStrength = require('syuilo-password-strength');
import { host, url, docsUrl, lang, recaptchaSitekey } from '../../../config';
import { host, url, recaptchaSitekey } from '../../../config';
export default Vue.extend({
data() {
@@ -51,7 +47,6 @@ export default Vue.extend({
password: '',
retypedPassword: '',
url,
touUrl: `${docsUrl}/${lang}/tou`,
recaptchaSitekey,
usernameState: null,
passwordStrength: '',
@@ -115,7 +110,7 @@ export default Vue.extend({
(this as any).api('signup', {
username: this.username,
password: this.password,
'g-recaptcha-response': (window as any).grecaptcha.getResponse()
'g-recaptcha-response': recaptchaSitekey != null ? (window as any).grecaptcha.getResponse() : null
}).then(() => {
(this as any).api('signin', {
username: this.username,
@@ -126,15 +121,19 @@ export default Vue.extend({
}).catch(() => {
alert('%i18n:@some-error%');
(window as any).grecaptcha.reset();
if (recaptchaSitekey != null) {
(window as any).grecaptcha.reset();
}
});
}
},
mounted() {
const head = document.getElementsByTagName('head')[0];
const script = document.createElement('script');
script.setAttribute('src', 'https://www.google.com/recaptcha/api.js');
head.appendChild(script);
if (recaptchaSitekey != null) {
const head = document.getElementsByTagName('head')[0];
const script = document.createElement('script');
script.setAttribute('src', 'https://www.google.com/recaptcha/api.js');
head.appendChild(script);
}
}
});
</script>
@@ -144,22 +143,4 @@ export default Vue.extend({
.mk-signup
min-width 302px
.agree-tou
padding 4px
border-radius 4px
&:hover
background #f4f4f4
&:active
background #eee
&, *
cursor pointer
p
display inline
color #555
</style>

View File

@@ -2,6 +2,9 @@
<iframe v-if="youtubeId" type="text/html" height="250"
:src="`https://www.youtube.com/embed/${youtubeId}?origin=${misskeyUrl}`"
frameborder="0"/>
<blockquote v-else-if="tweetUrl" class="twitter-tweet" ref="tweet">
<a :href="url"></a>
</blockquote>
<div v-else class="mk-url-preview">
<a :href="url" target="_blank" :title="url" v-if="!fetching">
<div class="thumbnail" v-if="thumbnail" :style="`background-image: url(${thumbnail})`"></div>
@@ -34,6 +37,7 @@ export default Vue.extend({
icon: null,
sitename: null,
youtubeId: null,
tweetUrl: null,
misskeyUrl
};
},
@@ -44,6 +48,25 @@ export default Vue.extend({
this.youtubeId = url.searchParams.get('v');
} else if (url.hostname == 'youtu.be') {
this.youtubeId = url.pathname;
} else if (url.hostname == 'twitter.com' && /^\/.+\/status(es)?\/\d+/.test(url.pathname)) {
this.tweetUrl = url;
const twttr = (window as any).twttr || {};
const loadTweet = () => twttr.widgets.load(this.$refs.tweet);
if (twttr.widgets) {
Vue.nextTick(loadTweet);
} else {
const wjsId = 'twitter-wjs';
if (!document.getElementById(wjsId)) {
const head = document.getElementsByTagName('head')[0];
const script = document.createElement('script');
script.setAttribute('id', wjsId);
script.setAttribute('src', 'https://platform.twitter.com/widgets.js');
head.appendChild(script);
}
twttr.ready = loadTweet;
(window as any).twttr = twttr;
}
} else {
fetch('/url?url=' + encodeURIComponent(this.url)).then(res => {
res.json().then(info => {

View File

@@ -1,5 +1,6 @@
import * as getCaretCoordinates from 'textarea-caret';
import MkAutocomplete from '../components/autocomplete.vue';
import renderAcct from '../../../../../misc/acct/render';
export default {
bind(el, binding, vn) {
@@ -67,15 +68,30 @@ class Autocomplete {
* テキスト入力時
*/
private onInput() {
const caret = this.textarea.selectionStart;
const text = this.text.substr(0, caret);
const caretPos = this.textarea.selectionStart;
const text = this.text.substr(0, caretPos);
const mentionIndex = text.lastIndexOf('@');
const hashtagIndex = text.lastIndexOf('#');
const emojiIndex = text.lastIndexOf(':');
const start = Math.min(
mentionIndex == -1 ? Infinity : mentionIndex,
hashtagIndex == -1 ? Infinity : hashtagIndex,
emojiIndex == -1 ? Infinity : emojiIndex);
if (start == Infinity) {
this.close();
return;
}
const isMention = mentionIndex == start;
const isHashtag = hashtagIndex == start;
const isEmoji = emojiIndex == start;
let opened = false;
if (mentionIndex != -1 && mentionIndex > emojiIndex) {
if (isMention) {
const username = text.substr(mentionIndex + 1);
if (username != '' && username.match(/^[a-zA-Z0-9_]+$/)) {
this.open('user', username);
@@ -83,7 +99,15 @@ class Autocomplete {
}
}
if (emojiIndex != -1 && emojiIndex > mentionIndex) {
if (isHashtag || opened == false) {
const hashtag = text.substr(hashtagIndex + 1);
if (!hashtag.includes(' ') && !hashtag.includes('\n')) {
this.open('hashtag', hashtag);
opened = true;
}
}
if (isEmoji || opened == false) {
const emoji = text.substr(emojiIndex + 1);
if (emoji != '' && emoji.match(/^[\+\-a-z0-9_]+$/)) {
this.open('emoji', emoji);
@@ -164,13 +188,31 @@ class Autocomplete {
const trimmedBefore = before.substring(0, before.lastIndexOf('@'));
const after = source.substr(caret);
const acct = renderAcct(value);
// 挿入
this.text = trimmedBefore + '@' + value.username + ' ' + after;
this.text = trimmedBefore + '@' + acct + ' ' + after;
// キャレットを戻す
this.vm.$nextTick(() => {
this.textarea.focus();
const pos = trimmedBefore.length + (value.username.length + 2);
const pos = trimmedBefore.length + (acct.length + 2);
this.textarea.setSelectionRange(pos, pos);
});
} else if (type == 'hashtag') {
const source = this.text;
const before = source.substr(0, caret);
const trimmedBefore = before.substring(0, before.lastIndexOf('#'));
const after = source.substr(caret);
// 挿入
this.text = trimmedBefore + '#' + value + ' ' + after;
// キャレットを戻す
this.vm.$nextTick(() => {
this.textarea.focus();
const pos = trimmedBefore.length + (value.length + 2);
this.textarea.setSelectionRange(pos, pos);
});
} else if (type == 'emoji') {

View File

@@ -1,8 +1,8 @@
<template>
<div class="mkw-analog-clock">
<mk-widget-container :naked="props.naked" :show-header="false">
<mk-widget-container :naked="!(props.design % 2)" :show-header="false">
<div class="mkw-analog-clock--body">
<mk-analog-clock :dark="$store.state.device.darkmode"/>
<mk-analog-clock :dark="$store.state.device.darkmode" :smooth="!(props.design && ~props.design)"/>
</div>
</mk-widget-container>
</div>
@@ -13,12 +13,13 @@ import define from '../../../common/define-widget';
export default define({
name: 'analog-clock',
props: () => ({
naked: false
design: -1
})
}).extend({
methods: {
func() {
this.props.naked = !this.props.naked;
if (++this.props.design > 2)
this.props.design = -1;
this.save();
}
}

View File

@@ -175,6 +175,7 @@ root(isDark)
> .val
height 4px
background $theme-color
transition width .3s cubic-bezier(0.23, 1, 0.32, 1)
&:nth-child(1)
> .meter > .val

View File

@@ -5,7 +5,7 @@
<p :class="$style.fetching" v-if="fetching">%fa:spinner .pulse .fw%%i18n:common.loading%<mk-ellipsis/></p>
<div :class="$style.stream" v-if="!fetching && images.length > 0">
<div v-for="image in images" :class="$style.img" :style="`background-image: url(${image.url}?thumbnail&size=256)`"></div>
<div v-for="image in images" :class="$style.img" :style="`background-image: url(${image.url})`"></div>
</div>
<p :class="$style.empty" v-if="!fetching && images.length == 0">%i18n:@no-photos%</p>
</mk-widget-container>

View File

@@ -72,7 +72,7 @@ export default define({
if (this.images.length == 0) return;
const index = Math.floor(Math.random() * this.images.length);
const img = `url(${ this.images[index].url }?thumbnail&size=1024)`;
const img = `url(${ this.images[index].url })`;
(this.$refs.slideB as any).style.backgroundImage = img;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 401 KiB

After

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 424 B

View File

@@ -35,10 +35,7 @@ import Vue from 'vue';
const eachMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
function isLeapYear(year) {
return (year % 400 == 0) ? true :
(year % 100 == 0) ? false :
(year % 4 == 0) ? true :
false;
return !(year % (year % 25 ? 4 : 16));
}
export default Vue.extend({

View File

@@ -28,7 +28,7 @@ export default Vue.extend({
default: false
},
title: {
default: '%fa:R file%%i18n:@choose-prompt%s'
default: '%fa:R file%%i18n:@choose-prompt%'
}
},
data() {

View File

@@ -1,5 +1,5 @@
<template>
<div class="root file"
<div class="gvfdktuvdgwhmztnuekzkswkjygptfcv"
:data-is-selected="isSelected"
:data-is-contextmenu-showing="isContextmenuShowing"
@click="onClick"
@@ -16,7 +16,7 @@
<p>%i18n:@banner%</p>
</div>
<div class="thumbnail" ref="thumbnail" :style="`background-color: ${ background }`">
<img :src="`${file.url}?thumbnail&size=128`" alt="" @load="onThumbnailLoaded"/>
<img :src="file.url" alt="" @load="onThumbnailLoaded"/>
</div>
<p class="name">
<span>{{ file.name.lastIndexOf('.') != -1 ? file.name.substr(0, file.name.lastIndexOf('.')) : file.name }}</span>
@@ -68,6 +68,11 @@ export default Vue.extend({
icon: '%fa:i-cursor%',
action: this.rename
}, {
type: 'item',
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%',
action: this.toggleSensitive
}, null, {
type: 'item',
text: '%i18n:@contextmenu.copy-url%',
icon: '%fa:link%',
@@ -149,6 +154,13 @@ export default Vue.extend({
});
},
toggleSensitive() {
(this as any).api('drive/files/update', {
fileId: this.file.id,
isSensitive: !this.file.isSensitive
});
},
copyUrl() {
copyToClipboard(this.file.url);
(this as any).apis.dialog({
@@ -312,10 +324,10 @@ root(isDark)
> .ext
opacity 0.5
.root.file[data-darkmode]
.gvfdktuvdgwhmztnuekzkswkjygptfcv[data-darkmode]
root(true)
.root.file:not([data-darkmode])
.gvfdktuvdgwhmztnuekzkswkjygptfcv:not([data-darkmode])
root(false)
</style>

View File

@@ -1,5 +1,5 @@
<template>
<div class="root folder"
<div class="ynntpczxvnusfwdyxsfuhvcmuypqopdd"
:data-is-contextmenu-showing="isContextmenuShowing"
:data-draghover="draghover"
@click="onClick"
@@ -216,10 +216,10 @@ export default Vue.extend({
<style lang="stylus" scoped>
@import '~const.styl'
.root.folder
root(isDark)
padding 8px
height 64px
background lighten($theme-color, 95%)
background isDark ? rgba($theme-color, 0.2) : lighten($theme-color, 95%)
border-radius 4px
&, *
@@ -229,10 +229,10 @@ export default Vue.extend({
pointer-events none
&:hover
background lighten($theme-color, 90%)
background isDark ? rgba(lighten($theme-color, 10%), 0.2) : lighten($theme-color, 90%)
&:active
background lighten($theme-color, 85%)
background isDark ? rgba(darken($theme-color, 10%), 0.2) : lighten($theme-color, 85%)
&[data-is-contextmenu-showing]
&[data-draghover]
@@ -248,16 +248,22 @@ export default Vue.extend({
border-radius 4px
&[data-draghover]
background lighten($theme-color, 90%)
background isDark ? rgba(darken($theme-color, 10%), 0.2) : lighten($theme-color, 90%)
> .name
margin 0
font-size 0.9em
color darken($theme-color, 30%)
color isDark ? #fff : darken($theme-color, 30%)
> [data-fa]
margin-right 4px
margin-left 2px
text-align left
.ynntpczxvnusfwdyxsfuhvcmuypqopdd[data-darkmode]
root(true)
.ynntpczxvnusfwdyxsfuhvcmuypqopdd:not([data-darkmode])
root(false)
</style>

View File

@@ -10,7 +10,10 @@
<span class="separator" v-if="folder != null">%fa:angle-right%</span>
<span class="folder current" v-if="folder != null">{{ folder.name }}</span>
</div>
<input class="search" type="search" placeholder="&#xf002; %i18n:@search%"/>
<!--
TODO: #343
<input class="search" type="search" placeholder="&#xf002; %i18n:@search%"/>
-->
</nav>
<div class="main" :class="{ uploading: uploadings.length > 0, fetching }"
ref="main"

View File

@@ -1,7 +1,7 @@
<template>
<mk-window width="400px" height="550px" @closed="$destroy">
<span slot="header" :class="$style.header">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>{{ '%i18n:@followers%'.replace('{}', name) }}
<img :src="user.avatarUrl" alt=""/>{{ '%i18n:@followers%'.replace('{}', name) }}
</span>
<mk-followers :user="user"/>
</mk-window>

View File

@@ -1,7 +1,7 @@
<template>
<mk-window width="400px" height="550px" @closed="$destroy">
<span slot="header" :class="$style.header">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt=""/>{{ '%i18n:@following%'.replace('{}', name) }}
<img :src="user.avatarUrl" alt=""/>{{ '%i18n:@following%'.replace('{}', name) }}
</span>
<mk-following :user="user"/>
</mk-window>

View File

@@ -1,5 +1,11 @@
<template>
<a class="mk-media-image"
<div class="ldwbgwstjsdgcjruamauqdrffetqudry" v-if="image.isSensitive && hide" @click="hide = false">
<div>
<b>%fa:exclamation-triangle% %i18n:@sensitive%</b>
<span>%i18n:@click-to-show%</span>
</div>
</div>
<a class="lcjomzwbohoelkxsnuqjiaccdbdfiazy" v-else
:href="image.url"
@mousemove="onMousemove"
@mouseleave="onMouseleave"
@@ -21,13 +27,17 @@ export default Vue.extend({
},
raw: {
default: false
},
hide: {
type: Boolean,
default: true
}
},
computed: {
style(): any {
return {
'background-color': this.image.properties.avgColor && this.image.properties.avgColor.length == 3 ? `rgb(${this.image.properties.avgColor.join(',')})` : 'transparent',
'background-image': this.raw ? `url(${this.image.url})` : `url(${this.image.url}?thumbnail&size=512)`
'background-image': this.raw ? `url(${this.image.url})` : `url(${this.image.url})`
};
}
},
@@ -56,16 +66,30 @@ export default Vue.extend({
</script>
<style lang="stylus" scoped>
.mk-media-image
.lcjomzwbohoelkxsnuqjiaccdbdfiazy
display block
cursor zoom-in
overflow hidden
width 100%
height 100%
background-position center
border-radius 4px
&:not(:hover)
background-size cover
.ldwbgwstjsdgcjruamauqdrffetqudry
display flex
justify-content center
align-items center
background #111
color #fff
> div
display table-cell
text-align center
font-size 12px
> b
display block
</style>

View File

@@ -1,12 +1,19 @@
<template>
<video class="mk-media-video"
<div class="uofhebxjdgksfmltszlxurtjnjjsvioh" v-if="video.isSensitive && hide" @click="hide = false">
<div>
<b>%fa:exclamation-triangle% %i18n:@sensitive%</b>
<span>%i18n:@click-to-show%</span>
</div>
</div>
<div class="vwxdhznewyashiknzolsoihtlpicqepe" v-else>
<video class="video"
:src="video.url"
:title="video.name"
controls
@dblclick.prevent="onClick"
ref="video"
v-if="inlinePlayable" />
<a class="mk-media-video-thumbnail"
<a class="thumbnail"
:href="video.url"
:style="imageStyle"
@click.prevent="onClick"
@@ -14,6 +21,7 @@
v-else>
%fa:R play-circle%
</a>
</div>
</template>
<script lang="ts">
@@ -21,11 +29,23 @@ import Vue from 'vue';
import MkMediaVideoDialog from './media-video-dialog.vue';
export default Vue.extend({
props: ['video', 'inlinePlayable'],
props: {
video: {
type: Object,
required: true
},
inlinePlayable: {
default: false
},
hide: {
type: Boolean,
default: true
}
},
computed: {
imageStyle(): any {
return {
'background-image': `url(${this.video.url}?thumbnail&size=512)`
'background-image': `url(${this.video.url})`
};
}
},
@@ -47,22 +67,39 @@ export default Vue.extend({
</script>
<style lang="stylus" scoped>
.mk-media-video
display block
width 100%
height 100%
border-radius 4px
.vwxdhznewyashiknzolsoihtlpicqepe
.video
display block
width 100%
height 100%
border-radius 4px
.mk-media-video-thumbnail
.thumbnail
display flex
justify-content center
align-items center
font-size 3.5em
cursor zoom-in
overflow hidden
background-position center
background-size cover
width 100%
height 100%
.uofhebxjdgksfmltszlxurtjnjjsvioh
display flex
justify-content center
align-items center
font-size 3.5em
background #111
color #fff
> div
display table-cell
text-align center
font-size 12px
> b
display block
cursor zoom-in
overflow hidden
background-position center
background-size cover
width 100%
height 100%
</style>

View File

@@ -56,10 +56,10 @@
<button @click="menu" ref="menuButton">
%fa:ellipsis-h%
</button>
<button title="%i18n:@detail">
<!-- <button title="%i18n:@detail">
<template v-if="!isDetailOpened">%fa:caret-down%</template>
<template v-if="isDetailOpened">%fa:caret-up%</template>
</button>
</button> -->
</footer>
</div>
</article>

View File

@@ -10,6 +10,10 @@
<span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span>
<a @click="addVisibleUser">+ユーザーを追加</a>
</div>
<div class="hashtags" v-if="recentHashtags.length > 0">
<b>%i18n:@recent-tags%:</b>
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)" title="%@click-to-tagging%">#{{ tag }}</a>
</div>
<input v-show="useCw" v-model="cw" placeholder="内容への注釈 (オプション)">
<textarea :class="{ with: (files.length != 0 || poll) }"
ref="text" v-model="text" :disabled="posting"
@@ -19,7 +23,7 @@
<div class="medias" :class="{ with: poll }" v-show="files.length != 0">
<x-draggable :list="files" :options="{ animation: 150 }">
<div v-for="file in files" :key="file.id">
<div class="img" :style="{ backgroundImage: `url(${file.url}?thumbnail&size=64)` }" :title="file.name"></div>
<div class="img" :style="{ backgroundImage: `url(${file.url})` }" :title="file.name"></div>
<img class="remove" @click="detachMedia(file.id)" src="/assets/desktop/remove.png" title="%i18n:@attach-cancel%" alt=""/>
</div>
</x-draggable>
@@ -46,6 +50,7 @@
<script lang="ts">
import Vue from 'vue';
import insertTextAtCursor from 'insert-text-at-cursor';
import * as XDraggable from 'vuedraggable';
import getKao from '../../../common/scripts/get-kao';
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
@@ -91,7 +96,8 @@ export default Vue.extend({
visibility: 'public',
visibleUsers: [],
autocomplete: null,
draghover: false
draghover: false,
recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]')
};
},
@@ -131,7 +137,9 @@ export default Vue.extend({
},
canPost(): boolean {
return !this.posting && (this.text.length != 0 || this.files.length != 0 || this.poll || this.renote);
return !this.posting &&
(1 <= this.text.length || 1 <= this.files.length || this.poll || this.renote) &&
(this.text.trim().length <= 1000);
}
},
@@ -183,6 +191,10 @@ export default Vue.extend({
},
methods: {
addTag(tag: string) {
insertTextAtCursor(this.$refs.text, ` #${tag} `);
},
watch() {
this.$watch('text', () => this.saveDraft());
this.$watch('poll', () => this.saveDraft());
@@ -235,7 +247,7 @@ export default Vue.extend({
},
onKeydown(e) {
if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey)) this.post();
if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey) && this.canPost) this.post();
},
onPaste(e) {
@@ -297,8 +309,8 @@ export default Vue.extend({
}, err => {
alert('エラー: ' + err.message);
}, {
enableHighAccuracy: true
});
enableHighAccuracy: true
});
},
removeGeo() {
@@ -370,6 +382,12 @@ export default Vue.extend({
}).then(() => {
this.posting = false;
});
if (this.text && this.text != '') {
const hashtags = parse(this.text).filter(x => x.type == 'hashtag').map(x => x.hashtag);
const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[];
localStorage.setItem('hashtags', JSON.stringify(hashtags.concat(history).reduce((a, c) => a.includes(c) ? a : [...a, c], [])));
}
},
saveDraft() {
@@ -452,7 +470,7 @@ root(isDark)
margin 0
max-width 100%
min-width 100%
min-height 64px
min-height 84px
&:hover
& + *
@@ -478,6 +496,19 @@ root(isDark)
margin-right 16px
color isDark ? #fff : #666
> .hashtags
margin 0 0 8px 0
overflow hidden
white-space nowrap
font-size 14px
> b
color isDark ? #9baec8 : darken($theme-color, 20%)
> *
margin-right 8px
white-space nowrap
> .medias
margin 0
padding 0

View File

@@ -2,7 +2,7 @@
<div class="profile">
<label class="avatar ui from group">
<p>%i18n:@avatar%</p>
<img class="avatar" :src="`${$store.state.i.avatarUrl}?thumbnail&size=64`" alt="avatar"/>
<img class="avatar" :src="$store.state.i.avatarUrl" alt="avatar"/>
<button class="ui" @click="updateAvatar">%i18n:@choice-avatar%</button>
</label>
<label class="ui from group">

View File

@@ -50,7 +50,7 @@ export default Vue.extend({
this.list = this.$store.state.device.tl.arg;
}
} else if (this.$store.state.i.followingCount == 0) {
this.src = 'local';
this.src = 'hybrid';
}
},

View File

@@ -2,13 +2,13 @@
<div class="nav">
<ul>
<template v-if="$store.getters.isSignedIn">
<li class="home" :class="{ active: $route.name == 'index' }">
<li class="home" :class="{ active: $route.name == 'index' }" @click="goToTop">
<router-link to="/">
%fa:home%
<p>%i18n:@home%</p>
</router-link>
</li>
<li class="deck" :class="{ active: $route.name == 'deck' }">
<li class="deck" :class="{ active: $route.name == 'deck' }" @click="goToTop">
<router-link to="/deck">
%fa:columns%
<p>%i18n:@deck% <small>(beta)</small></p>
@@ -82,6 +82,14 @@ export default Vue.extend({
game() {
(this as any).os.new(MkGameWindow);
},
goToTop(e: HTMLElement) {
if (e.classList.contains('active'))
window.scrollTo({
top: 0,
behavior: 'smooth'
});
}
}
});

View File

@@ -29,9 +29,7 @@ export default Vue.extend({
<style lang="stylus" scoped>
@import '~const.styl'
.search
root(isDark)
> [data-fa]
display block
position absolute
@@ -60,15 +58,20 @@ export default Vue.extend({
border none
border-radius 16px
transition color 0.5s ease, border 0.5s ease
font-family FontAwesome, sans-serif
color isDark ? #fff : #000
&::placeholder
color #9eaba8
&:hover
background rgba(#000, 0.08)
background isDark ? rgba(#fff, 0.04) : rgba(#000, 0.08)
&:focus
box-shadow 0 0 0 2px rgba($theme-color, 0.5) !important
.search[data-darkmode]
root(true)
.search:not([data-darkmode])
root(false)
</style>

View File

@@ -9,6 +9,9 @@
<div class="left">
<x-nav/>
</div>
<div class="center">
<div class="icon" @click="goToTop"></div>
</div>
<div class="right">
<x-search/>
<x-account v-if="$store.getters.isSignedIn"/>
@@ -42,6 +45,14 @@ export default Vue.extend({
XPost,
XClock,
},
methods: {
goToTop() {
window.scrollTo({
top: 0,
behavior: 'smooth'
});
}
},
mounted() {
this.$store.commit('setUiHeaderHeight', 48);
@@ -142,26 +153,24 @@ root(isDark)
max-width 1300px
margin 0 auto
&:before
content ""
position absolute
top 0
left 0
display block
width 100%
height 48px
background-image isDark ? url('/assets/desktop/header-icon.dark.svg') : url('/assets/desktop/header-icon.light.svg')
background-size 24px
background-position center
background-repeat no-repeat
opacity 0.3
> .center
margin auto
> .icon
display block
width 48px
height 48px
background-image isDark ? url('/assets/desktop/header-icon.dark.svg') : url('/assets/desktop/header-icon.light.svg')
background-size 24px
background-position center
background-repeat no-repeat
opacity 0.3
cursor pointer
> .left
margin 0 auto 0 0
height 48px
> .right
margin 0 0 0 auto
height 48px
> *

View File

@@ -1,7 +1,7 @@
<template>
<div class="mk-user-preview">
<template v-if="u != null">
<div class="banner" :style="u.bannerUrl ? `background-image: url(${u.bannerUrl}?thumbnail&size=512)` : ''"></div>
<div class="banner" :style="u.bannerUrl ? `background-image: url(${u.bannerUrl})` : ''"></div>
<mk-avatar class="avatar" :user="u" :disable-preview="true"/>
<div class="title">
<router-link class="name" :to="u | userPage">{{ u | userName }}</router-link>

View File

@@ -6,6 +6,7 @@
<div :class="$style.loading" v-if="fetching">
<mk-ellipsis-icon/>
</div>
<p :class="$style.notAvailable" v-if="!fetching && notAvailable">検索機能を利用することができません</p>
<p :class="$style.empty" v-if="!fetching && empty">%fa:search%{{ q }}に関する投稿は見つかりませんでした</p>
<mk-notes ref="timeline" :class="$style.notes" :more="existMore ? more : null"/>
</mk-ui>
@@ -24,7 +25,8 @@ export default Vue.extend({
moreFetching: false,
existMore: false,
offset: 0,
empty: false
empty: false,
notAvailable: false
};
},
watch: {
@@ -71,7 +73,11 @@ export default Vue.extend({
res(notes);
this.fetching = false;
Progress.done();
}, rej);
}, (e: string) => {
this.fetching = false;
Progress.done();
if (e === 'searching not available') this.notAvailable = true;
});
}));
},
more() {
@@ -130,4 +136,18 @@ export default Vue.extend({
font-size 3em
color #ccc
.notAvailable
display block
margin 0 auto
padding 32px
max-width 400px
text-align center
color #999
> [data-fa]
display block
margin-bottom 16px
font-size 3em
color #ccc
</style>

View File

@@ -49,7 +49,8 @@ export default Vue.extend({
add() {
(this as any).apis.input({
title: '%i18n:@username%',
}).then(async username => {
}).then(async (username: string) => {
if (username.startsWith('@')) username = username.slice(1);
const user = await (this as any).api('users/show', {
username
});

View File

@@ -4,7 +4,7 @@
<p class="initializing" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@loading%<mk-ellipsis/></p>
<div v-if="!fetching && users.length > 0">
<router-link v-for="user in users" :to="user | userPage" :key="user.id">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" :alt="user | userName" v-user-preview="user.id"/>
<img :src="user.avatarUrl" :alt="user | userName" v-user-preview="user.id"/>
</router-link>
</div>
<p class="empty" v-if="!fetching && users.length == 0">%i18n:@no-users%</p>

View File

@@ -4,7 +4,7 @@
<p class="initializing" v-if="fetching">%fa:spinner .pulse .fw%%i18n:@loading%<mk-ellipsis/></p>
<div class="stream" v-if="!fetching && images.length > 0">
<div v-for="image in images" class="img"
:style="`background-image: url(${image.url}?thumbnail&size=256)`"
:style="`background-image: url(${image.url})`"
></div>
</div>
<p class="empty" v-if="!fetching && images.length == 0">%i18n:@no-photos%</p>

View File

@@ -2,7 +2,7 @@
<div class="mkw-notifications">
<mk-widget-container :show-header="!props.compact">
<template slot="header">%fa:R bell%%i18n:@title%</template>
<button slot="func" title="%i18n:@settings%" @click="settings">%fa:cog%</button>
<!-- <button slot="func" title="%i18n:@settings%" @click="settings">%fa:cog%</button> -->
<mk-notifications :class="$style.notifications"/>
</mk-widget-container>

View File

@@ -45,7 +45,7 @@ export default define({
this.save();
},
onKeydown(e) {
if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey)) this.post();
if ((e.which == 10 || e.which == 13) && (e.ctrlKey || e.metaKey) && !this.posting && this.text) this.post();
},
post() {
this.posting = true;

View File

@@ -4,7 +4,7 @@
:data-melt="props.design == 2"
>
<div class="banner"
:style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl}?thumbnail&size=256)` : ''"
:style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl})` : ''"
title="%i18n:@update-banner%"
@click="os.apis.updateBanner"
></div>

View File

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

View File

@@ -1,5 +1,11 @@
<template>
<a class="mk-media-image" :href="image.url" target="_blank" :style="style" :title="image.name"></a>
<div class="qjewsnkgzzxlxtzncydssfbgjibiehcy" v-if="image.isSensitive && hide" @click="hide = false">
<div>
<b>%fa:exclamation-triangle% %i18n:@sensitive%</b>
<span>%i18n:@click-to-show%</span>
</div>
</div>
<a class="gqnyydlzavusgskkfvwvjiattxdzsqlf" v-else :href="image.url" target="_blank" :style="style" :title="image.name"></a>
</template>
<script lang="ts">
@@ -13,11 +19,15 @@ export default Vue.extend({
},
raw: {
default: false
},
hide: {
type: Boolean,
default: true
}
},
computed: {
style(): any {
let url = `url(${this.image.url}?thumbnail)`;
let url = `url(${this.image.url})`;
if (this.$store.state.device.loadRemoteMedia || this.$store.state.device.lightmode) {
url = null;
@@ -35,13 +45,27 @@ export default Vue.extend({
</script>
<style lang="stylus" scoped>
.mk-media-image
.gqnyydlzavusgskkfvwvjiattxdzsqlf
display block
overflow hidden
width 100%
height 100%
background-position center
background-size cover
border-radius 4px
.qjewsnkgzzxlxtzncydssfbgjibiehcy
display flex
justify-content center
align-items center
background #111
color #fff
> div
display table-cell
text-align center
font-size 12px
> b
display block
</style>

View File

@@ -1,28 +1,43 @@
<template>
<a class="mk-media-video"
:href="video.url"
target="_blank"
:style="imageStyle"
:title="video.name">
%fa:R play-circle%
</a>
<div class="icozogqfvdetwohsdglrbswgrejoxbdj" v-if="video.isSensitive && hide" @click="hide = false">
<div>
<b>%fa:exclamation-triangle% %i18n:@sensitive%</b>
<span>%i18n:@click-to-show%</span>
</div>
</div>
<a class="kkjnbbplepmiyuadieoenjgutgcmtsvu" v-else
:href="video.url"
target="_blank"
:style="imageStyle"
:title="video.name">
%fa:R play-circle%
</a>
</template>
<script lang="ts">
import Vue from 'vue'
export default Vue.extend({
props: ['video'],
props: {
video: {
type: Object,
required: true
},
hide: {
type: Boolean,
default: true
}
},
computed: {
imageStyle(): any {
return {
'background-image': `url(${this.video.url}?thumbnail&size=512)`
'background-image': `url(${this.video.url})`
};
}
},})
</script>
<style lang="stylus" scoped>
.mk-media-video
.kkjnbbplepmiyuadieoenjgutgcmtsvu
display flex
justify-content center
align-items center
@@ -33,4 +48,20 @@ export default Vue.extend({
background-size cover
width 100%
height 100%
.icozogqfvdetwohsdglrbswgrejoxbdj
display flex
justify-content center
align-items center
background #111
color #fff
> div
display table-cell
text-align center
font-size 12px
> b
display block
</style>

View File

@@ -2,7 +2,7 @@
<div class="mk-note-card">
<a :href="note | notePage">
<header>
<img :src="`${note.user.avatarUrl}?thumbnail&size=64`" alt="avatar"/><h3>{{ note.user | userName }}</h3>
<img :src="note.user.avatarUrl" alt="avatar"/><h3>{{ note.user | userName }}</h3>
</header>
<div>
{{ text }}

View File

@@ -1,47 +1,53 @@
<template>
<div class="mk-post-form">
<header>
<button class="cancel" @click="cancel">%fa:times%</button>
<div>
<span class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</span>
<span class="geo" v-if="geo">%fa:map-marker-alt%</span>
<button class="submit" :disabled="!canPost" @click="post">{{ submitText }}</button>
</div>
</header>
<div class="form">
<mk-note-preview v-if="reply" :note="reply"/>
<mk-note-preview v-if="renote" :note="renote"/>
<div v-if="visibility == 'specified'" class="visibleUsers">
<span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span>
<a @click="addVisibleUser">+%i18n:@add-visible-user%</a>
<header>
<button class="cancel" @click="cancel">%fa:times%</button>
<div>
<span class="text-count" :class="{ over: text.length > 1000 }">{{ 1000 - text.length }}</span>
<span class="geo" v-if="geo">%fa:map-marker-alt%</span>
<button class="submit" :disabled="!canPost" @click="post">{{ submitText }}</button>
</div>
</header>
<div class="form">
<mk-note-preview v-if="reply" :note="reply"/>
<mk-note-preview v-if="renote" :note="renote"/>
<div v-if="visibility == 'specified'" class="visibleUsers">
<span v-for="u in visibleUsers">{{ u | userName }}<a @click="removeVisibleUser(u)">[x]</a></span>
<a @click="addVisibleUser">+%i18n:@add-visible-user%</a>
</div>
<input v-show="useCw" v-model="cw" placeholder="%i18n:@cw-placeholder%">
<textarea v-model="text" ref="text" :disabled="posting" :placeholder="placeholder" v-autocomplete="'text'"></textarea>
<div class="attaches" v-show="files.length != 0">
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
<div class="file" v-for="file in files" :key="file.id">
<div class="img" :style="`background-image: url(${file.url})`" @click="detachMedia(file)"></div>
</div>
</x-draggable>
</div>
<mk-poll-editor v-if="poll" ref="poll" @destroyed="poll = false"/>
<mk-uploader ref="uploader" @uploaded="attachMedia" @change="onChangeUploadings"/>
<footer>
<button class="upload" @click="chooseFile">%fa:upload%</button>
<button class="drive" @click="chooseFileFromDrive">%fa:cloud%</button>
<button class="kao" @click="kao">%fa:R smile%</button>
<button class="poll" @click="poll = true">%fa:chart-pie%</button>
<button class="poll" @click="useCw = !useCw">%fa:eye-slash%</button>
<button class="geo" @click="geo ? removeGeo() : setGeo()">%fa:map-marker-alt%</button>
<button class="visibility" @click="setVisibility" ref="visibilityButton">%fa:lock%</button>
</footer>
<input ref="file" class="file" type="file" accept="image/*" multiple="multiple" @change="onChangeFile"/>
</div>
<input v-show="useCw" v-model="cw" placeholder="%i18n:@cw-placeholder%">
<textarea v-model="text" ref="text" :disabled="posting" :placeholder="placeholder"></textarea>
<div class="attaches" v-show="files.length != 0">
<x-draggable class="files" :list="files" :options="{ animation: 150 }">
<div class="file" v-for="file in files" :key="file.id">
<div class="img" :style="`background-image: url(${file.url}?thumbnail&size=128)`" @click="detachMedia(file)"></div>
</div>
</x-draggable>
</div>
<mk-poll-editor v-if="poll" ref="poll" @destroyed="poll = false"/>
<mk-uploader ref="uploader" @uploaded="attachMedia" @change="onChangeUploadings"/>
<footer>
<button class="upload" @click="chooseFile">%fa:upload%</button>
<button class="drive" @click="chooseFileFromDrive">%fa:cloud%</button>
<button class="kao" @click="kao">%fa:R smile%</button>
<button class="poll" @click="poll = true">%fa:chart-pie%</button>
<button class="poll" @click="useCw = !useCw">%fa:eye-slash%</button>
<button class="geo" @click="geo ? removeGeo() : setGeo()">%fa:map-marker-alt%</button>
<button class="visibility" @click="setVisibility" ref="visibilityButton">%fa:lock%</button>
</footer>
<input ref="file" class="file" type="file" accept="image/*" multiple="multiple" @change="onChangeFile"/>
</div>
<div class="hashtags" v-if="recentHashtags.length > 0">
<a v-for="tag in recentHashtags.slice(0, 5)" @click="addTag(tag)">#{{ tag }}</a>
</div>
</div>
</template>
<script lang="ts">
import Vue from 'vue';
import insertTextAtCursor from 'insert-text-at-cursor';
import * as XDraggable from 'vuedraggable';
import MkVisibilityChooser from '../../../common/views/components/visibility-chooser.vue';
import getKao from '../../../common/scripts/get-kao';
@@ -85,7 +91,8 @@ export default Vue.extend({
visibility: 'public',
visibleUsers: [],
useCw: false,
cw: null
cw: null,
recentHashtags: JSON.parse(localStorage.getItem('hashtags') || '[]')
};
},
@@ -125,7 +132,9 @@ export default Vue.extend({
},
canPost(): boolean {
return !this.posting && (this.text.length != 0 || this.files.length != 0 || this.poll || this.renote);
return !this.posting &&
(1 <= this.text.length || 1 <= this.files.length || this.poll || this.renote) &&
(this.text.trim().length <= 1000);
}
},
@@ -161,6 +170,10 @@ export default Vue.extend({
},
methods: {
addTag(tag: string) {
insertTextAtCursor(this.$refs.text, ` #${tag} `);
},
focus() {
(this.$refs.text as any).focus();
},
@@ -210,8 +223,8 @@ export default Vue.extend({
}, err => {
alert('%i18n:@error%: ' + err.message);
}, {
enableHighAccuracy: true
});
enableHighAccuracy: true
});
},
removeGeo() {
@@ -281,6 +294,12 @@ export default Vue.extend({
}).catch(err => {
this.posting = false;
});
if (this.text && this.text != '') {
const hashtags = parse(this.text).filter(x => x.type == 'hashtag').map(x => x.hashtag);
const history = JSON.parse(localStorage.getItem('hashtags') || '[]') as string[];
localStorage.setItem('hashtags', JSON.stringify(hashtags.concat(history).reduce((a, c) => a.includes(c) ? a : [...a, c], [])));
}
},
cancel() {
@@ -302,146 +321,156 @@ root(isDark)
max-width 500px
width calc(100% - 16px)
margin 8px auto
background isDark ? #282C37 : #fff
border-radius 8px
box-shadow 0 0 2px rgba(#000, 0.1)
@media (min-width 500px)
margin 16px auto
width calc(100% - 32px)
box-shadow 0 8px 32px rgba(#000, 0.1)
> .form
box-shadow 0 8px 32px rgba(#000, 0.1)
@media (min-width 600px)
margin 32px auto
> header
z-index 1000
height 50px
box-shadow 0 1px 0 0 isDark ? rgba(#000, 0.2) : rgba(#000, 0.1)
> .cancel
padding 0
width 50px
line-height 50px
font-size 24px
color isDark ? #9baec8 : #555
> div
position absolute
top 0
right 0
color #657786
> .text-count
line-height 50px
> .geo
margin 0 8px
line-height 50px
> .submit
margin 8px
padding 0 16px
line-height 34px
vertical-align bottom
color $theme-color-foreground
background $theme-color
border-radius 4px
&:disabled
opacity 0.7
> .form
max-width 500px
margin 0 auto
background isDark ? #282C37 : #fff
border-radius 8px
box-shadow 0 0 2px rgba(#000, 0.1)
> .mk-note-preview
padding 16px
> .visibleUsers
margin-bottom 8px
font-size 14px
> span
margin-right 16px
color isDark ? #fff : #666
> input
z-index 1
> input
> textarea
display block
padding 12px
margin 0
width 100%
font-size 16px
color isDark ? #fff : #333
background isDark ? #191d23 : #fff
border none
border-radius 0
> header
z-index 1000
height 50px
box-shadow 0 1px 0 0 isDark ? rgba(#000, 0.2) : rgba(#000, 0.1)
&:disabled
opacity 0.5
> textarea
max-width 100%
min-width 100%
min-height 80px
> .attaches
> .files
display block
margin 0
padding 4px
list-style none
&:after
content ""
display block
clear both
> .file
display block
float left
margin 0
padding 0
border solid 4px transparent
> .img
width 64px
height 64px
background-size cover
background-position center center
> .mk-uploader
margin 8px 0 0 0
padding 8px
> .file
display none
> footer
white-space nowrap
overflow auto
-webkit-overflow-scrolling touch
overflow-scrolling touch
> *
display inline-block
> .cancel
padding 0
margin 0
width 48px
height 48px
font-size 20px
width 50px
line-height 50px
font-size 24px
color isDark ? #9baec8 : #555
> div
position absolute
top 0
right 0
color #657786
background transparent
outline none
> .text-count
line-height 50px
> .geo
margin 0 8px
line-height 50px
> .submit
margin 8px
padding 0 16px
line-height 34px
vertical-align bottom
color $theme-color-foreground
background $theme-color
border-radius 4px
&:disabled
opacity 0.7
> .form
max-width 500px
margin 0 auto
> .mk-note-preview
padding 16px
> .visibleUsers
margin-bottom 8px
font-size 14px
> span
margin-right 16px
color isDark ? #fff : #666
> input
z-index 1
> input
> textarea
display block
padding 12px
margin 0
width 100%
font-size 16px
color isDark ? #fff : #333
background isDark ? #191d23 : #fff
border none
border-radius 0
box-shadow none
box-shadow 0 1px 0 0 isDark ? rgba(#000, 0.2) : rgba(#000, 0.1)
&:disabled
opacity 0.5
> textarea
max-width 100%
min-width 100%
min-height 80px
> .attaches
> .files
display block
margin 0
padding 4px
list-style none
&:after
content ""
display block
clear both
> .file
display block
float left
margin 0
padding 0
border solid 4px transparent
> .img
width 64px
height 64px
background-size cover
background-position center center
> .mk-uploader
margin 8px 0 0 0
padding 8px
> .file
display none
> footer
white-space nowrap
overflow auto
-webkit-overflow-scrolling touch
overflow-scrolling touch
> *
display inline-block
padding 0
margin 0
width 48px
height 48px
font-size 20px
color #657786
background transparent
outline none
border none
border-radius 0
box-shadow none
> .hashtags
margin 8px
> *
margin-right 8px
.mk-post-form[data-darkmode]
root(true)

View File

@@ -10,7 +10,7 @@
<transition name="nav">
<div class="body" v-if="isOpen">
<router-link class="me" v-if="$store.getters.isSignedIn" :to="`/@${$store.state.i.username}`">
<img class="avatar" :src="`${$store.state.i.avatarUrl}?thumbnail&size=128`" alt="avatar"/>
<img class="avatar" :src="$store.state.i.avatarUrl" alt="avatar"/>
<p class="name">{{ $store.state.i | userName }}</p>
</router-link>
<div class="links">

View File

@@ -1,6 +1,6 @@
<template>
<div class="mk-user-card">
<header :style="user.bannerUrl ? `background-image: url(${user.bannerUrl}?thumbnail&size=1024)` : ''">
<header :style="user.bannerUrl ? `background-image: url(${user.bannerUrl})` : ''">
<mk-avatar class="avatar" :user="user"/>
</header>
<a class="name" :href="user | userPage" target="_blank">{{ user | userName }}</a>

View File

@@ -1,7 +1,7 @@
<template>
<mk-ui>
<template slot="header" v-if="!fetching">
<img :src="`${user.avatarUrl}?thumbnail&size=64`" alt="">
<img :src="user.avatarUrl" alt="">
{{ '%i18n:@followers-of%'.replace('{}', name) }}
</template>
<mk-users-list

Some files were not shown because too many files have changed in this diff Show More