Compare commits

...

438 Commits

Author SHA1 Message Date
3cd3e19199 Update version 2018-07-26 03:46:55 +09:00
ed36ceadbc ✌️ 2018-07-26 03:46:18 +09:00
8736c9dfe6 Merge pull request #1977 from yarnaimo/embedded-tweet
ツイートの埋め込み
2018-07-26 02:31:00 +09:00
e44f33bf14 Embed tweet when tweet url attached 2018-07-26 00:03:32 +09:00
6e39b73f07 Fix #1961 2018-07-25 13:37:40 +09:00
01703e5584 Fix #1975 2018-07-25 13:30:59 +09:00
fee7cb41cb Merge pull request #1965 from syuilo/l10n_master
New Crowdin translations
2018-07-25 13:07:06 +09:00
bb14af8b40 fix(package): update gulp-uglify to version 3.0.1 2018-07-25 12:15:40 +09:00
54b849e548 fix(package): update @types/node to version 10.5.3 2018-07-25 12:15:29 +09:00
8f50482896 Add note 2018-07-25 09:54:03 +09:00
b3b82e7595 Fix bug nado 2018-07-25 08:01:12 +09:00
9c4e0a4ae6 ✌️ 2018-07-25 07:46:56 +09:00
0b656999d8 Clean up 2018-07-25 07:45:38 +09:00
7605a512ba Update appveyor.yml 2018-07-25 07:33:49 +09:00
2018a29968 Update docs 2018-07-25 07:29:55 +09:00
dbf335a05d Refactor: withFile --> requireFile 2018-07-25 07:18:50 +09:00
ad5a7e9d70 Update CHANGELOG 2018-07-25 07:08:53 +09:00
f8477fa88d 🎨 2018-07-25 04:36:02 +09:00
a22ddb05ba Update docs 2018-07-25 04:15:22 +09:00
9455edf2da Update docs 2018-07-25 04:10:56 +09:00
4a2244327f New translations ja.yml (English) 2018-07-25 01:41:43 +09:00
708a800a25 New translations ja.yml (Catalan) 2018-07-25 01:21:58 +09:00
a34193ca16 New translations ja.yml (Portuguese) 2018-07-25 01:21:56 +09:00
a4886975e4 New translations ja.yml (Korean) 2018-07-25 01:21:54 +09:00
8b6a015602 New translations ja.yml (Polish) 2018-07-25 01:21:52 +09:00
f915560752 New translations ja.yml (Chinese Simplified) 2018-07-25 01:21:50 +09:00
f2f0910771 New translations ja.yml (Italian) 2018-07-25 01:21:48 +09:00
9316e2ce15 New translations ja.yml (Russian) 2018-07-25 01:21:46 +09:00
128573e73e New translations ja.yml (English) 2018-07-25 01:21:44 +09:00
3d132ad803 New translations ja.yml (Spanish) 2018-07-25 01:21:42 +09:00
6f671325fa New translations ja.yml (German) 2018-07-25 01:21:40 +09:00
7e6ac77341 New translations ja.yml (French) 2018-07-25 01:21:38 +09:00
51bafe8259 #1893 2018-07-25 01:14:38 +09:00
f1bbbcfedf Fix #1960 2018-07-25 00:51:30 +09:00
7d99b154c0 Update config template: Add missing property definition 2018-07-25 00:40:27 +09:00
575da76235 Clean up: Remove unmaintained codes 2018-07-25 00:33:48 +09:00
c3b3b9b9a6 #1955 2018-07-25 00:29:18 +09:00
7432de3d33 Merge pull request #1968 from syuilo/object-storage
Object storage support
2018-07-24 23:45:19 +09:00
03ce87d710 wip 2018-07-24 23:43:14 +09:00
5e9fb8bd84 wip 2018-07-24 23:35:19 +09:00
68a205486e fix(package): update eslint-plugin-vue to version 4.7.1 2018-07-24 21:41:03 +09:00
94c106a87a fix(package): update @types/webpack to version 4.4.8 2018-07-24 12:06:05 +09:00
1b2a04bd2a fix(package): update gulp-rename to version 1.4.0 2018-07-24 06:24:11 +09:00
a048939cf1 wip 2018-07-24 06:21:21 +09:00
6296846078 New translations ja.yml (French) 2018-07-24 05:41:37 +09:00
e530d12f7f New translations ja.yml (French) 2018-07-24 05:31:39 +09:00
adc3c16ef3 wip 2018-07-24 05:04:43 +09:00
5458b10774 wip 2018-07-24 01:58:11 +09:00
9ad403af00 Enhance #1958 2018-07-23 20:58:59 +09:00
8d7f16caed Update setup.*.md 2018-07-23 20:48:55 +09:00
e5c20ca9a7 Update dependencyInfo.ts 2018-07-23 20:45:21 +09:00
bd4a7d8cbb fix(package): update webpack to version 4.16.2 2018-07-23 20:19:24 +09:00
5b116737b6 Fix typo 2018-07-23 20:11:20 +09:00
8adc799041 Merge pull request #1959 from acid-chicken/top
Go to top
2018-07-23 14:37:18 +09:00
41e657b64e Go to top 2018-07-23 14:35:00 +09:00
f16cda51fb #1957 2018-07-23 14:07:09 +09:00
886510d721 Clean up 2018-07-23 14:04:53 +09:00
427b3dcd73 Fix semantic errors 2018-07-23 13:56:25 +09:00
138fa1454f Fix #1957 2018-07-23 13:37:29 +09:00
7ec9b03990 fix(package): update swagger-jsdoc to version 1.10.3 2018-07-23 12:54:02 +09:00
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
e679f47c1a fix(package): update hard-source-webpack-plugin to version 0.11.2 2018-07-22 04:47:40 +00:00
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
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
35247af220 fix(package): update ws to version 6.0.0 2018-07-21 13:49:12 +00:00
e71da1f659 fix(package): update ratelimiter to version 3.2.0 2018-07-21 12:57:47 +00:00
91daa1958b 4.27.0 2018-07-21 19:46:29 +09:00
900a9cb34f sharedInbox対応 2018-07-21 19:33:56 +09:00
297a7f541e #1947 2018-07-21 19:17:15 +09:00
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
f594a2d0f4 fix(package): update @types/mongodb to version 3.1.2 2018-07-21 02:19:33 +00:00
ffd13accca Refactor 2018-07-21 11:08:27 +09:00
edf2503ee5 💯 2018-07-21 11:06:01 +09:00
4d0c303660 Fix #1901 2018-07-21 11:03:32 +09:00
49bc00102b Fix bug 2018-07-21 08:54:41 +09:00
29f074267c Merge pull request #1943 from syuilo/refactor-notes-create
Refactor notes create
2018-07-21 08:51:56 +09:00
7671c37f2a wip 2018-07-21 08:47:48 +09:00
91ad9e4c41 wip 2018-07-21 07:05:51 +09:00
ed48349e39 wip 2018-07-21 06:59:53 +09:00
2df02a9d70 wip 2018-07-21 05:35:43 +09:00
1d027613e4 🎨 2018-07-21 04:33:04 +09:00
e9de73d2f6 Fix 2018-07-21 03:24:39 +09:00
7b9b01688c Merge pull request #1942 from syuilo/l10n_master
New Crowdin translations
2018-07-21 03:21:16 +09:00
afcf2fddb1 Improve hashtag suggestion 2018-07-21 03:15:31 +09:00
78de3ba691 New translations ja.yml (English) 2018-07-21 03:11:10 +09:00
2cfefee94d New translations ja.yml (Catalan) 2018-07-21 03:02:52 +09:00
d50940cdf8 New translations ja.yml (Portuguese) 2018-07-21 03:02:51 +09:00
e38ee663dc New translations ja.yml (Korean) 2018-07-21 03:02:49 +09:00
5a160a76f7 New translations ja.yml (Polish) 2018-07-21 03:02:47 +09:00
c504f27a51 New translations ja.yml (Chinese Simplified) 2018-07-21 03:02:45 +09:00
3f5155e9b5 New translations ja.yml (Italian) 2018-07-21 03:02:43 +09:00
dcb85073da New translations ja.yml (Russian) 2018-07-21 03:02:41 +09:00
2a5f3491a6 New translations ja.yml (English) 2018-07-21 03:02:39 +09:00
6f6b01344d New translations ja.yml (Spanish) 2018-07-21 03:02:37 +09:00
73810758d9 New translations ja.yml (German) 2018-07-21 03:02:35 +09:00
6cb527fd58 New translations ja.yml (French) 2018-07-21 03:02:33 +09:00
7316352ff5 ✌️ 2018-07-21 02:58:44 +09:00
ad76d5d8e2 Merge pull request #1939 from acid-chicken/sushi
🍣回転寿司🍣
2018-07-21 02:23:13 +09:00
539f307500 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-21 02:18:40 +09:00
5f68d08cbc Improve log 2018-07-21 02:18:35 +09:00
bc8bea11c0 Merge pull request #1940 from acid-chicken/acid-chicken-patch-1
投稿できない際にショートカットキーをトリガーしないようにする
2018-07-21 02:16:11 +09:00
9bb02e5bf6 Update post-form.vue 2018-07-21 02:14:24 +09:00
ae68e6372c Update messaging-room.form.vue 2018-07-21 02:07:50 +09:00
69593994ef Update post-form.vue 2018-07-21 02:06:49 +09:00
cb52ebe65b インデクサーを忘れていた 2018-07-21 01:25:55 +09:00
9b989ebac6 保存し忘れ 2018-07-21 01:24:12 +09:00
f13bef4ac8 回転寿司 2018-07-21 01:21:27 +09:00
29b1aa0d9b Merge pull request #1938 from acid-chicken/vscode
Add extension suggestion for VSCode
2018-07-21 00:49:07 +09:00
5aa2e47c49 Add extension suggestion for VSCode 2018-07-21 00:38:08 +09:00
773d104306 Fix #1868 2018-07-20 21:59:09 +09:00
b8e948b009 Merge pull request #1936 from syuilo/patch-1803
Fix #1803
2018-07-20 21:47:35 +09:00
49298d2f3f Update ISSUE_TEMPLATE 2018-07-20 21:41:06 +09:00
ac19567f2b Fix #1803 2018-07-20 21:39:21 +09:00
bc627fc55c タグサジェストが重複しないようにする 2018-07-20 21:12:28 +09:00
eb6c2d0f73 Update bug_report.md 2018-07-20 21:08:12 +09:00
436757c71d Enrich ISSUE_TEMPLATE
Close #1932
2018-07-20 21:05:58 +09:00
5d09b7e38b mark as read all -> mark all as read
Close #855
2018-07-20 14:16:02 +09:00
a8cf67198f Update README.md 2018-07-20 06:39:30 +09:00
06539db1a0 4.26.0 2018-07-20 05:30:59 +09:00
de10890bd8 Merge pull request #1930 from syuilo/l10n_master
New Crowdin translations
2018-07-20 05:30:41 +09:00
8dc5375d55 最近使ったハッシュタグを表示するようにするなど 2018-07-20 05:29:56 +09:00
1d23076191 New translations ja.yml (English) 2018-07-20 05:02:48 +09:00
cbdc061891 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-20 04:59:12 +09:00
9536d76b61 Improve 賢さ 2018-07-20 04:59:04 +09:00
7a030901c8 Update README.md 2018-07-20 03:51:50 +09:00
bcc02047ca New translations ja.yml (Catalan) 2018-07-20 03:01:45 +09:00
c61616388e New translations ja.yml (Portuguese) 2018-07-20 03:01:43 +09:00
499486f559 New translations ja.yml (Korean) 2018-07-20 03:01:40 +09:00
179d231fd8 New translations ja.yml (Polish) 2018-07-20 03:01:38 +09:00
2e4a391eda New translations ja.yml (Chinese Simplified) 2018-07-20 03:01:36 +09:00
3d214fee4b New translations ja.yml (Italian) 2018-07-20 03:01:34 +09:00
509a4c7955 New translations ja.yml (Russian) 2018-07-20 03:01:32 +09:00
c754046eaf New translations ja.yml (English) 2018-07-20 03:01:30 +09:00
92571d9133 New translations ja.yml (Spanish) 2018-07-20 03:01:28 +09:00
add425abdb New translations ja.yml (German) 2018-07-20 03:01:26 +09:00
1890d9e2ee New translations ja.yml (French) 2018-07-20 03:01:23 +09:00
83f2926f0c 4.25.0 2018-07-20 02:55:27 +09:00
738ced81ec 動画もNSFW 2018-07-20 02:53:32 +09:00
b22c1ae520 New translations ja.yml (English) 2018-07-20 02:53:19 +09:00
e2e7489b1f New translations ja.yml (Catalan) 2018-07-20 02:42:02 +09:00
6ae7b8303d New translations ja.yml (Portuguese) 2018-07-20 02:42:00 +09:00
55f40af51c New translations ja.yml (Korean) 2018-07-20 02:41:58 +09:00
7a784cea3b New translations ja.yml (Polish) 2018-07-20 02:41:56 +09:00
f86cccec0c New translations ja.yml (Chinese Simplified) 2018-07-20 02:41:54 +09:00
9d90a28d76 New translations ja.yml (Italian) 2018-07-20 02:41:52 +09:00
1724cf7c17 New translations ja.yml (Russian) 2018-07-20 02:41:50 +09:00
d64d92ccf5 New translations ja.yml (English) 2018-07-20 02:41:48 +09:00
f64ced8677 New translations ja.yml (Spanish) 2018-07-20 02:41:46 +09:00
db1c0468aa New translations ja.yml (German) 2018-07-20 02:41:44 +09:00
77c5d3276a New translations ja.yml (French) 2018-07-20 02:41:41 +09:00
ec2b1ec3f0 #1334 2018-07-20 02:40:37 +09:00
85bf76dd98 4.24.1 2018-07-19 22:49:12 +09:00
bfa326af2c WIP: Support sharedInbox 2018-07-19 22:40:44 +09:00
534c47935a chore: Update backers 2018-07-19 22:15:54 +09:00
31a6f2b421 Clean up 2018-07-19 22:02:30 +09:00
66c106722c Hide settings button
It is unimplemented
2018-07-19 16:40:40 +09:00
9d0204f2fa Hide detail button
It is unimplemented
2018-07-19 16:21:22 +09:00
fceb0e2158 4.24.0 2018-07-19 11:55:11 +09:00
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
744e009690 #1927 2018-07-19 11:47:18 +09:00
713dcd9083 #1921 2018-07-19 11:45:55 +09:00
e03ec67b5c Show error message if searching is not available 2018-07-19 08:24:03 +09:00
7e27e2757f Hide delete button
It is unimplemented
2018-07-19 07:48:42 +09:00
f05c5ff617 Update gulpfile.ts 2018-07-19 06:53:46 +09:00
1afb26f04a fix(package): update emojilib to version 2.3.0 2018-07-18 21:07:40 +00:00
7873905cde 🎨 2018-07-19 04:50:46 +09:00
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
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
adbbfd9dc2 fix(package): update swagger-jsdoc to version 1.10.2
Closes #1924
2018-07-18 18:38:00 +00:00
84da99d56c 🎨 2018-07-19 03:25:37 +09:00
aaf8f09cfd Merge pull request #1923 from acid-chicken/master
Animate calender meters
2018-07-19 00:16:33 +09:00
6da464fd1b Update calendar.vue 2018-07-19 00:13:58 +09:00
efaa41ba49 reCAPTCHAをオプションに 2018-07-19 00:04:09 +09:00
67e8e1d819 fix(package): update webpack-cli to version 3.1.0 2018-07-18 15:01:30 +00:00
532f8f8e4c Fix indent 2018-07-18 19:36:36 +09:00
0109e8e57c Add white spaces 2018-07-18 19:24:31 +09:00
6e720b2798 Hide drive search form
It is unimplemented
2018-07-18 19:13:41 +09:00
d3f2a97dd4 English for ISSUE_TEMPLATE
Close #1796
2018-07-18 17:41:28 +09:00
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
c4118c78b7 fix(package): update vue-loader to version 15.2.6 2018-07-18 03:41:17 +00:00
84147c558f 4.23.1 2018-07-18 07:34:33 +09:00
4cb51a2d32 Fix bugs 2018-07-18 07:34:17 +09:00
4727780a3d 4.23.0 2018-07-18 07:20:25 +09:00
df20f5063d #1720 #59 2018-07-18 07:19:24 +09:00
d2a5f4c5c1 ✌️ 2018-07-18 06:53:31 +09:00
64ba85aa9b 🎨 2018-07-18 06:13:54 +09:00
51c33989fe Merge pull request #1919 from acid-chicken/master
Improve analog clock
2018-07-18 02:15:12 +09:00
4713822122 Update analog-clock.vue 2018-07-18 02:06:01 +09:00
e10de62a7a Update analog-clock.vue 2018-07-18 02:04:07 +09:00
14b235e3a4 Update analog-clock.vue 2018-07-18 02:02:52 +09:00
eb4aac3902 Merge pull request #1918 from acid-chicken/master
Minify
2018-07-18 01:47:38 +09:00
180bf33a28 Update calendar.vue 2018-07-18 01:46:21 +09:00
935a254c97 4.22.1 2018-07-18 01:22:25 +09:00
3c678f0e92 Fix bug 2018-07-18 01:22:11 +09:00
a053e1c1de 4.22.0 2018-07-18 01:03:24 +09:00
b8fa1751ba Merge pull request #1911 from syuilo/l10n_master
New Crowdin translations
2018-07-18 01:02:15 +09:00
c4243d54a9 New translations ja.yml (English) 2018-07-18 01:01:49 +09:00
1767f54fed 🎨 2018-07-18 00:55:33 +09:00
7e465cdbbe New translations ja.yml (Catalan) 2018-07-18 00:52:04 +09:00
47f67fcba9 New translations ja.yml (Portuguese) 2018-07-18 00:52:02 +09:00
3fff20fb13 New translations ja.yml (Korean) 2018-07-18 00:52:00 +09:00
06a2d87129 New translations ja.yml (Polish) 2018-07-18 00:51:58 +09:00
a8076e306a New translations ja.yml (Chinese Simplified) 2018-07-18 00:51:56 +09:00
05e5829260 New translations ja.yml (Italian) 2018-07-18 00:51:54 +09:00
5a91416f34 New translations ja.yml (Russian) 2018-07-18 00:51:52 +09:00
70db1d0066 New translations ja.yml (English) 2018-07-18 00:51:50 +09:00
26c936d19e New translations ja.yml (Spanish) 2018-07-18 00:51:48 +09:00
3b0ae3f80d New translations ja.yml (German) 2018-07-18 00:51:46 +09:00
2570d85543 New translations ja.yml (French) 2018-07-18 00:51:44 +09:00
b274c4160e Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-18 00:47:11 +09:00
f9d5d9e30b Improve doc 2018-07-18 00:47:09 +09:00
8cdf5ff6df New translations ja.yml (Polish) 2018-07-18 00:42:22 +09:00
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
a3d34ba919 fix(package): update vue-loader to version 15.2.5 2018-07-17 15:08:22 +00:00
242bb1a428 New translations ja.yml (English) 2018-07-17 19:01:46 +09:00
4a25ed0627 ✌️ 2018-07-17 18:50:13 +09:00
f65fbf9d55 Merge pull request #1916 from acid-chicken/acid-chicken-patch-1
Proposal: Smooth Clock
2018-07-17 18:45:21 +09:00
6169acd478 Update analog-clock.vue 2018-07-17 18:43:04 +09:00
481f1a7c36 4.21.0 2018-07-17 04:37:23 +09:00
16726789da Update api definitions 2018-07-17 04:36:44 +09:00
e71f650ade New translations ja.yml (Catalan) 2018-07-17 04:01:52 +09:00
e8a7f571e1 New translations ja.yml (Portuguese) 2018-07-17 04:01:49 +09:00
3117c8a98f New translations ja.yml (Korean) 2018-07-17 04:01:47 +09:00
90b845f3db New translations ja.yml (Polish) 2018-07-17 04:01:45 +09:00
f5dd972e38 New translations ja.yml (Chinese Simplified) 2018-07-17 04:01:43 +09:00
4b210e1a6a New translations ja.yml (Italian) 2018-07-17 04:01:41 +09:00
1a7eb3c1df New translations ja.yml (Russian) 2018-07-17 04:01:38 +09:00
52f84d8603 New translations ja.yml (English) 2018-07-17 04:01:37 +09:00
f92d218c0c New translations ja.yml (Spanish) 2018-07-17 04:01:35 +09:00
81c5ece8a9 New translations ja.yml (German) 2018-07-17 04:01:32 +09:00
a97bc38f3e New translations ja.yml (French) 2018-07-17 04:01:30 +09:00
aacfb5e221 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-17 03:57:42 +09:00
f88ac3c04e Improve doc 2018-07-17 03:57:34 +09:00
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
ae3b0d5437 fix(package): update @types/webpack to version 4.4.7 2018-07-16 18:29:21 +00:00
f9b2da1bb0 🎨 2018-07-17 03:21:25 +09:00
d0bea052ad 🎨 2018-07-17 03:16:21 +09:00
c012faa958 New translations ja.yml (English) 2018-07-17 01:37:35 +09:00
c8cfd1ee65 New translations ja.yml (English) 2018-07-17 01:21:15 +09:00
e8da0bcd80 Improve doc 2018-07-17 01:11:36 +09:00
591ff9095a New translations ja.yml (Catalan) 2018-07-17 00:51:59 +09:00
6df91d3078 New translations ja.yml (Portuguese) 2018-07-17 00:51:57 +09:00
288c14efce New translations ja.yml (Korean) 2018-07-17 00:51:56 +09:00
ee8d636ca8 New translations ja.yml (Polish) 2018-07-17 00:51:54 +09:00
a3ceecae91 New translations ja.yml (Chinese Simplified) 2018-07-17 00:51:52 +09:00
5ad89a3b3d New translations ja.yml (Italian) 2018-07-17 00:51:50 +09:00
e1089cc18d New translations ja.yml (Russian) 2018-07-17 00:51:48 +09:00
f9e780187c New translations ja.yml (English) 2018-07-17 00:51:46 +09:00
42cbe96a14 New translations ja.yml (Spanish) 2018-07-17 00:51:44 +09:00
1f23b11dcc New translations ja.yml (German) 2018-07-17 00:51:42 +09:00
ad3b4bbd58 New translations ja.yml (French) 2018-07-17 00:51:40 +09:00
455f4ffa27 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-17 00:46:32 +09:00
1d867b8aca Improve doc 2018-07-17 00:46:06 +09:00
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
5bf439851d New translations ja.yml (English) 2018-07-16 19:02:16 +09:00
9df3f99a1c New translations ja.yml (English) 2018-07-16 18:42:49 +09:00
f41232703b New translations ja.yml (Polish) 2018-07-16 18:32:12 +09:00
abc4e53943 fix(package): update webpack to version 4.16.1 2018-07-16 08:30:40 +00:00
f846508fc1 New translations ja.yml (Catalan) 2018-07-16 08:01:15 +09:00
7343003287 New translations ja.yml (Portuguese) 2018-07-16 08:01:13 +09:00
25ca3d610b New translations ja.yml (Korean) 2018-07-16 08:01:11 +09:00
9d286786d4 New translations ja.yml (Polish) 2018-07-16 08:01:09 +09:00
91037ebdd6 New translations ja.yml (Chinese Simplified) 2018-07-16 08:01:06 +09:00
26b2eafea0 New translations ja.yml (Italian) 2018-07-16 08:01:04 +09:00
432beedd94 New translations ja.yml (Russian) 2018-07-16 08:01:02 +09:00
3a919bab45 New translations ja.yml (English) 2018-07-16 08:01:00 +09:00
11af9b808d New translations ja.yml (Spanish) 2018-07-16 08:00:58 +09:00
af35335772 New translations ja.yml (German) 2018-07-16 08:00:57 +09:00
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
ec41d8053c New translations ja.yml (Catalan) 2018-07-16 06:21:12 +09:00
284cfe6989 New translations ja.yml (Portuguese) 2018-07-16 06:21:11 +09:00
ad8f363c5d New translations ja.yml (Korean) 2018-07-16 06:21:09 +09:00
3d3cf73c30 New translations ja.yml (Polish) 2018-07-16 06:21:06 +09:00
fd9bd28361 New translations ja.yml (Chinese Simplified) 2018-07-16 06:21:04 +09:00
d2919dece0 New translations ja.yml (Italian) 2018-07-16 06:21:02 +09:00
a86442bff7 New translations ja.yml (Russian) 2018-07-16 06:21:00 +09:00
4b915d43cf New translations ja.yml (English) 2018-07-16 06:20:58 +09:00
b20c3d84a6 New translations ja.yml (Spanish) 2018-07-16 06:20:56 +09:00
d2bbf5ffc4 New translations ja.yml (German) 2018-07-16 06:20:55 +09:00
4ef9411f35 New translations ja.yml (French) 2018-07-16 06:20:52 +09:00
168d13d6e6 Improve docs 2018-07-16 06:19:19 +09:00
1e921a9fd5 Update docs 2018-07-16 05:47:41 +09:00
9e438ed674 🎨 2018-07-16 03:55:42 +09:00
3a02a7dad8 良い感じに 2018-07-16 03:53:03 +09:00
1744316656 良い感じに 2018-07-16 03:43:36 +09:00
1e4a86da8e 良い感じに 2018-07-16 03:25:35 +09:00
2b31b6a6b0 Add doc 2018-07-16 02:26:54 +09:00
c7a3f40eba Add README 2018-07-15 22:30:27 +09:00
8b9710df9f Add doc 2018-07-15 22:18:47 +09:00
ce6f750fa5 Improve docs 2018-07-15 22:00:05 +09:00
468eb02ff3 Set title of a doc 2018-07-15 21:48:57 +09:00
dfca7f1340 Fix bug 2018-07-15 19:38:06 +09:00
7bfa56d199 Fix bug 2018-07-15 19:35:20 +09:00
c579cbdf10 Fix bug 2018-07-15 19:29:15 +09:00
0b3609c775 4.20.0 2018-07-15 19:06:27 +09:00
be52eb9b3f API doc 2018-07-15 19:05:19 +09:00
5f5156561f ドキュメントをMarkdownで書くように 2018-07-15 18:28:08 +09:00
d47f92f396 グローバルタイムラインに返信を含めないように 2018-07-15 17:50:24 +09:00
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
a427b7a1af Doc: Add "Clean up unused drive files" section 2018-07-15 14:35:22 +09:00
05d5e70c58 Doc: Add "Clean up cached remote files" section 2018-07-15 14:29:30 +09:00
62858caaa4 Update manage odc 2018-07-15 14:27:25 +09:00
b9b48a55ef Update doc 2018-07-15 14:20:30 +09:00
7276ec185b Update setup docs 2018-07-15 09:43:16 +09:00
e063ac10c5 Create manage.en.md 2018-07-15 09:25:01 +09:00
eca9a7ea13 Update setup.en.md 2018-07-15 09:25:01 +09:00
86d9a72bbf fix(package): update eslint-plugin-vue to version 4.7.0 2018-07-14 20:30:01 +00:00
073707b2d0 Better default value 2018-07-15 02:29:50 +09:00
b971fbaac6 Fix 2018-07-15 02:23:22 +09:00
86795f1091 Add optional Elasticsearch setting 2018-07-15 02:22:02 +09:00
5b9dd4fb80 Update example.yml 2018-07-15 02:17:45 +09:00
5ff31e197b Update example.yml 2018-07-15 02:16:35 +09:00
0bd5e64b86 Update example.yml 2018-07-15 02:15:45 +09:00
3089b56f70 Update example.yml 2018-07-15 02:11:56 +09:00
46bf0eae40 Update example.yml 2018-07-15 02:11:17 +09:00
97f411130f Update example.yml 2018-07-15 02:09:55 +09:00
b9ce7bc99d Update package.json 2018-07-15 02:08:22 +09:00
9d3ecda43d Merge pull request #1907 from syuilo/patch-1
Revert "Update example.yml"
2018-07-15 02:02:51 +09:00
8356f6d128 Revert "Update example.yml"
This reverts commit 7ab9d01bac.
2018-07-15 02:01:33 +09:00
05a084dadf Merge branch 'master' of aya.github:syuilo/misskey 2018-07-15 01:59:38 +09:00
f338fa552e Not cast to any 2018-07-15 01:59:24 +09:00
7ab9d01bac Update example.yml 2018-07-15 01:58:08 +09:00
5b0aaf66eb Update log message 2018-07-15 01:57:22 +09:00
6a4e92a999 #1903 2018-07-15 01:56:31 +09:00
0a4b652493 Darken
Co-Authored-By: tamaina <tamaina@hotmail.co.jp>
2018-07-15 01:49:36 +09:00
eebc1af672 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-15 01:48:09 +09:00
41fa045999 Darken
Co-Authored-By: tamaina <tamaina@hotmail.co.jp>
2018-07-15 01:48:06 +09:00
4b52c89a75 Update package.json 2018-07-15 01:42:14 +09:00
28dcf8bc1e Revert "Update messaging-room.vue"
This reverts commit 313afbd6db.
2018-07-15 01:07:17 +09:00
5af469282a Merge pull request #1906 from syuilo/imgbot
[ImgBot] optimizes images
2018-07-14 23:22:45 +09:00
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
c4bf80c262 Update example.yml 2018-07-14 23:20:30 +09:00
e485e8936f Update example config 2018-07-14 23:14:24 +09:00
e495e0d2e6 Update config example 2018-07-14 23:07:59 +09:00
3695e6db15 Update config example 2018-07-14 23:06:46 +09:00
ac7df96f68 Update example.yml
Update some default values
2018-07-14 23:03:20 +09:00
cf17a39446 Update setup.*.md 2018-07-14 22:56:54 +09:00
87cc5f790c Update log messages 2018-07-14 22:53:30 +09:00
b03987290c Update config example 2018-07-14 22:42:44 +09:00
1f4969547b Update log message 2018-07-14 22:23:43 +09:00
d12d201ef4 Update logger 2018-07-14 22:14:56 +09:00
c91a4c9da1 Update log messages 2018-07-14 22:10:27 +09:00
1213e95ddd Merge branch 'master' of aya.github:syuilo/misskey 2018-07-14 22:10:14 +09:00
90a836d587 Merge pull request #1905 from syuilo/l10n_master
New Crowdin translations
2018-07-14 22:07:41 +09:00
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
24f52aee46 Update log messages 2018-07-14 22:05:19 +09:00
4d2c0e4161 Update dependency checking for ImageMagick 2018-07-14 21:59:15 +09:00
b687546fcd New translations ja.yml (English) 2018-07-14 21:41:01 +09:00
3c701aaf86 Update log messages 2018-07-14 21:03:09 +09:00
d50e99c17b Update log messages 2018-07-14 20:58:21 +09:00
41d5e0ab24 fix(package): update eslint-plugin-vue to version 4.6.0 2018-07-14 11:39:54 +00:00
c99e864dbc 2018-07-14 19:49:21 +09:00
f39adfdf87 Update create.ts 2018-07-14 19:40:23 +09:00
0d1ffb581f 4.19.1 2018-07-14 13:49:31 +09:00
4add44f3bd Update create.ts 2018-07-14 13:47:36 +09:00
baae9f6f39 Merge pull request #1900 from syuilo/l10n_master
New Crowdin translations
2018-07-14 12:02:44 +09:00
0a9958f45f New translations ja.yml (English) 2018-07-14 12:00:50 +09:00
7e5d25cf2c 4.19.0 2018-07-14 11:58:54 +09:00
9666e6b4d3 #1894 2018-07-14 11:58:21 +09:00
c937cb94f9 Clean up 2018-07-14 11:55:36 +09:00
5e54d093f5 New translations ja.yml (Catalan) 2018-07-14 11:51:12 +09:00
c7f099276e New translations ja.yml (Portuguese) 2018-07-14 11:51:10 +09:00
ee4235ba71 New translations ja.yml (Korean) 2018-07-14 11:51:08 +09:00
71066d69fb New translations ja.yml (Polish) 2018-07-14 11:51:06 +09:00
4581376198 New translations ja.yml (Chinese Simplified) 2018-07-14 11:51:04 +09:00
04ebde62bc New translations ja.yml (Italian) 2018-07-14 11:51:02 +09:00
fec47f05cf New translations ja.yml (Russian) 2018-07-14 11:51:00 +09:00
b9e2fb74ed New translations ja.yml (English) 2018-07-14 11:50:58 +09:00
a1d6637dd1 New translations ja.yml (Spanish) 2018-07-14 11:50:57 +09:00
e6fa5a07ce New translations ja.yml (German) 2018-07-14 11:50:55 +09:00
eec6226c8d New translations ja.yml (French) 2018-07-14 11:50:53 +09:00
356fe8180e 4.18.0 2018-07-14 11:44:12 +09:00
30c120596a social 2018-07-14 11:43:39 +09:00
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
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
4426da6233 fix(package): update @types/webpack to version 4.4.6 2018-07-14 01:55:05 +00:00
381fe2f436 fix(package): update @types/elasticsearch to version 5.0.25 2018-07-14 01:05:31 +00:00
28cd7a67de Update log message 2018-07-14 00:41:33 +09:00
97f75cea52 Merge branch 'master' of aya.github:syuilo/misskey 2018-07-14 00:39:50 +09:00
5e788f0da4 Kill child process on exit 2018-07-14 00:39:39 +09:00
1fc9d034d0 Update log message 2018-07-14 00:39:11 +09:00
dc8f14c23a Fix #1887 2018-07-14 00:36:39 +09:00
e9717da916 Merge pull request #1880 from syuilo/l10n_master
New Crowdin translations
2018-07-14 00:34:41 +09:00
73c328f90b Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-14 00:34:08 +09:00
25a6f7041a Fix bug 2018-07-14 00:34:05 +09:00
ff278c8bea New translations ja.yml (English) 2018-07-14 00:22:08 +09:00
35dd6a5ac3 Merge branch 'master' of aya.github:syuilo/misskey 2018-07-14 00:05:56 +09:00
98ea238087 Add missing semicolon 2018-07-14 00:05:49 +09:00
3830b0d831 New translations ja.yml (Catalan) 2018-07-14 00:01:40 +09:00
b6de5a2268 New translations ja.yml (Portuguese) 2018-07-14 00:01:37 +09:00
77327c7a40 New translations ja.yml (Korean) 2018-07-14 00:01:36 +09:00
26664a8351 New translations ja.yml (Polish) 2018-07-14 00:01:34 +09:00
912964104b New translations ja.yml (Chinese Simplified) 2018-07-14 00:01:32 +09:00
63653ccb01 New translations ja.yml (Italian) 2018-07-14 00:01:29 +09:00
5df54700b8 New translations ja.yml (Russian) 2018-07-14 00:01:27 +09:00
f952dde1d4 New translations ja.yml (English) 2018-07-14 00:01:25 +09:00
2c0aac5eed New translations ja.yml (Spanish) 2018-07-14 00:01:24 +09:00
4e3a2c4bb8 New translations ja.yml (German) 2018-07-14 00:01:22 +09:00
17ccfcfb53 New translations ja.yml (French) 2018-07-14 00:01:19 +09:00
f2959ada85 Revert "Update messaging-room.message.vue"
This reverts commit 7b3f52505e.
2018-07-14 00:00:30 +09:00
e427c12ac2 Hybrid --> Community 2018-07-13 23:56:24 +09:00
874837666c Update error message 2018-07-13 23:52:28 +09:00
c66532d18f Update logger 2018-07-13 23:51:16 +09:00
2bc572b4cc アカウントを凍結されていたらAPIにアクセスできないようにした 2018-07-13 23:44:45 +09:00
2db01f3d5c Clean up 2018-07-13 23:39:20 +09:00
a0a116b7bf Merge branch 'master' of aya.github:syuilo/misskey 2018-07-13 23:25:49 +09:00
aec7d53414 Fix port cehcking 2018-07-13 23:25:32 +09:00
09416c9893 Merge pull request #1892 from PRB0t/pr-201807131656
Fix a bug
2018-07-13 23:20:40 +09:00
0e7fe670aa 🤖 Fix a bug 2018-07-13 16:17:02 +02:00
bd805f1d88 Update log message 2018-07-13 23:05:37 +09:00
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
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
2f92be1da0 fix(package): update html-minifier to version 3.5.19 2018-07-13 09:03:40 +00:00
baa52921a0 fix(package): update element-ui to version 2.4.4 2018-07-13 08:44:59 +00:00
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
ebc83c8f60 fix(package): update hard-source-webpack-plugin to version 0.11.1 2018-07-12 18:52:13 +00:00
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
5eb06a3a52 fix(package): update ws to version 5.2.2 2018-07-11 20:01:29 +00:00
9917a1c7e1 New translations ja.yml (English) 2018-07-12 01:21:24 +09:00
e9c886e871 Merge branch 'master' of https://github.com/syuilo/misskey 2018-07-12 00:00:06 +09:00
0074f8da1b Improve log 2018-07-11 23:59:57 +09:00
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
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
48e034be0e fix(package): update @koa/cors to version 2.2.2 2018-07-11 12:50:56 +00:00
b067162ce6 fix(package): update webpack to version 4.16.0 2018-07-11 08:52:17 +00:00
5f9482e7d5 New translations ja.yml (Catalan) 2018-07-11 14:11:26 +09:00
bb98ee27a1 New translations ja.yml (Portuguese) 2018-07-11 14:11:24 +09:00
3506dd3656 New translations ja.yml (Korean) 2018-07-11 14:11:22 +09:00
88d0b09c88 New translations ja.yml (Polish) 2018-07-11 14:11:20 +09:00
25b88f89a6 New translations ja.yml (Chinese Simplified) 2018-07-11 14:11:18 +09:00
85343b80b7 New translations ja.yml (Italian) 2018-07-11 14:11:16 +09:00
6766fbdfb3 New translations ja.yml (Russian) 2018-07-11 14:11:14 +09:00
c488fca2f2 New translations ja.yml (English) 2018-07-11 14:11:12 +09:00
ea51460169 New translations ja.yml (Spanish) 2018-07-11 14:11:10 +09:00
80e7af30d0 New translations ja.yml (German) 2018-07-11 14:11:08 +09:00
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