Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
aced183a66 | ||
|
|
77b150c53b | ||
|
|
9b2ddfea5f | ||
|
|
bf2bdaa6ff | ||
|
|
42525bb12a | ||
|
|
bc243c1ea3 | ||
|
|
a2517d1a1d | ||
|
|
c0a60260c2 | ||
|
|
3654f247c4 | ||
|
|
c4ddfef2ed | ||
|
|
28086111e1 | ||
|
|
60c9a6528f | ||
|
|
47d4dcfdf5 | ||
|
|
eb8d1211ba | ||
|
|
495aad6a2d | ||
|
|
77676d18c8 | ||
|
|
68d90caab7 | ||
|
|
31fc43ed16 | ||
|
|
31802c9749 | ||
|
|
192aa89f95 | ||
|
|
b0a0faff7e | ||
|
|
b67f3438e9 | ||
|
|
02e4929a97 | ||
|
|
fcc6a65e08 | ||
|
|
f4ae939124 | ||
|
|
664acb2d0e | ||
|
|
e6e7cecdb6 | ||
|
|
563d604812 | ||
|
|
012d744f4c |
@@ -1,6 +1,14 @@
|
||||
ChangeLog
|
||||
=========
|
||||
|
||||
10.90.0
|
||||
----------
|
||||
* モバイル版でもデッキを使えるように
|
||||
* 公開範囲がホームの投稿はハイライトに載せないように
|
||||
* ドキュメントの強化
|
||||
* ユーザーをリストに追加できない問題を修正
|
||||
* UIの修正
|
||||
|
||||
10.89.1
|
||||
----------
|
||||
* リアクション数を表示するように
|
||||
|
||||
@@ -123,7 +123,6 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/5881381/6235ca5d3fb04c8e95ef5b4ff2abcc18/3?token-time=2145916800&token-hash=9JtETp0X8gI280Ne1E8bxn6j4Lw5o2k4mJkICx97V_k%3D" alt="YUKIMOCHI" width="100"></td>
|
||||
<td><img src="https://c8.patreon.com/2/200/17463605" alt="Sampot" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/17195955/be45e5e14c3e48b2bee0456c84e19df4/4?token-time=2145916800&token-hash=SbdZeN5SmsuT9stD6v0jN1z0hftg0FmRiCTxysU0Ihw%3D" alt="Damillora" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/8241184/39e18850e87a449e9c9a71acb3310ebd/3?token-time=2145916800&token-hash=gMq30aylxu5v3G8pRhWR5jeRBbYWEoRKjGbNeiCQz5g%3D" alt="Acid Chicken" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/4389829/9f709180ac714651a70f74a82f3ffdb9/2?token-time=2145916800&token-hash=zcwFxb2zopzWwksKVU1YpfAEjsl4yKT02aQ6yiAFRiQ%3D" alt="natalie" width="100"></td>
|
||||
<td><img src="https://c10.patreonusercontent.com/3/eyJ3IjoyMDB9/patreon-media/p/user/13034746/c711c7f58e204ecfbc2fd646bc8a4eee/1?token-time=2145916800&token-hash=5T8XcaAf9Zyzfg3QubR06s_kJZkArVEM2dwObrBVAU4%3D" alt="Hiratake" width="100"></td>
|
||||
</tr><tr>
|
||||
@@ -134,7 +133,6 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
||||
<td><a href="https://www.patreon.com/yukimochi">YUKIMOCHI</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=17463605">Sampot</a></td>
|
||||
<td><a href="https://www.patreon.com/damillora">Damillora</a></td>
|
||||
<td><a href="https://www.patreon.com/acid_chicken">Acid Chicken</a></td>
|
||||
<td><a href="https://www.patreon.com/user?u=4389829">natalie</a></td>
|
||||
<td><a href="https://www.patreon.com/hiratake">Hiratake</a></td>
|
||||
</tr></table>
|
||||
@@ -150,7 +148,7 @@ Please see the [Contribution Guide](./CONTRIBUTING.md).
|
||||
<td><a href="https://www.patreon.com/user?u=12531784">Takashi Shibuya</a></td>
|
||||
</tr></table>
|
||||
|
||||
**Last updated:** Thu, 21 Feb 2019 16:10:06 UTC
|
||||
**Last updated:** Sun, 24 Feb 2019 06:44:06 UTC
|
||||
<!-- PATREON_END -->
|
||||
|
||||
:four_leaf_clover: Copyright
|
||||
|
||||
@@ -115,7 +115,8 @@ common:
|
||||
search: "検索"
|
||||
delete: "削除"
|
||||
loading: "読み込み中"
|
||||
ok: "わかった"
|
||||
ok: "おk"
|
||||
cancel: "やめる"
|
||||
update-available-title: "更新があります"
|
||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||
@@ -146,6 +147,18 @@ common:
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
turn-on-darkmode: "闇に飲まれる"
|
||||
turn-off-darkmode: "光あれ"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "やり直す"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
remain-deleted-note: "削除された投稿を表示し続ける"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
sound: "サウンド"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "投稿"
|
||||
prev: "前の投稿"
|
||||
next: "次の投稿"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "通知"
|
||||
read-all: "すべての通知を既読にしますか?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "リバーシ"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "ダイレクト投稿"
|
||||
notifications: "通知"
|
||||
list: "リスト"
|
||||
select-list: "リストを選択してください"
|
||||
swap-left: "左に移動"
|
||||
swap-right: "右に移動"
|
||||
swap-up: "上に移動"
|
||||
|
||||
@@ -115,7 +115,8 @@ common:
|
||||
search: "Suche"
|
||||
delete: "Löschen"
|
||||
loading: "Laden"
|
||||
ok: "OK"
|
||||
ok: "おk"
|
||||
cancel: "やめる"
|
||||
update-available-title: "Aktualisierung verfügbar"
|
||||
update-available: "Eine neue Version von Misskey ist verfügbar ({newer}, aktuell ist {current}). Lade die Seite neu um die aktuelle Version zu laden"
|
||||
my-token-regenerated: "Dein Token wurde generiert. Du wirst jetzt abgemeldet."
|
||||
@@ -146,6 +147,18 @@ common:
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
turn-on-darkmode: "闇に飲まれる"
|
||||
turn-off-darkmode: "光あれ"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "Erneut versuchen"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "Karte anzeigen"
|
||||
remain-deleted-note: "削除された投稿を表示し続ける"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
sound: "Ton"
|
||||
enable-sounds: "Ton aktivieren"
|
||||
enable-sounds-desc: "Spiel einen Ton ab beim Erhalten eines Beitrags bzw. einer Nachricht. Diese Einstellung wird im Browser gespeichert."
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "投稿"
|
||||
prev: "前の投稿"
|
||||
next: "次の投稿"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "通知"
|
||||
read-all: "すべての通知を既読にしますか?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "リバーシ"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "ダイレクト投稿"
|
||||
notifications: "通知"
|
||||
list: "リスト"
|
||||
select-list: "リストを選択してください"
|
||||
swap-left: "左に移動"
|
||||
swap-right: "右に移動"
|
||||
swap-up: "上に移動"
|
||||
|
||||
@@ -115,7 +115,8 @@ common:
|
||||
search: "Search"
|
||||
delete: "Delete"
|
||||
loading: "Loading"
|
||||
ok: "OK"
|
||||
ok: "It's OK"
|
||||
cancel: "Quit"
|
||||
update-available-title: "Update available"
|
||||
update-available: "A new version of Misskey is now available({newer}, the current version is {current}). Reload the page to apply updates."
|
||||
my-token-regenerated: "Your token has been regenerated, so you will be signed out."
|
||||
@@ -146,6 +147,18 @@ common:
|
||||
view-on-remote: "For completion, view it remotely."
|
||||
renoted-by: "Renoted by {user}"
|
||||
no-notes: "Without any notes"
|
||||
turn-on-darkmode: "Switch to Dark mode"
|
||||
turn-off-darkmode: "Light mode"
|
||||
deck-column-align: "Deck column alignment"
|
||||
deck-column-align-center: "Center"
|
||||
deck-column-align-left: "Left"
|
||||
deck-column-align-flexible: "Flexible"
|
||||
deck-column-width: "Column width of the deck"
|
||||
deck-column-width-narrow: "narrow"
|
||||
deck-column-width-narrower: "somewhat narrow"
|
||||
deck-column-width-normal: "Normal"
|
||||
deck-column-width-wider: "somewhat wide"
|
||||
deck-column-width-wide: "wide"
|
||||
error:
|
||||
title: "Something happened :("
|
||||
retry: "Retry"
|
||||
@@ -292,7 +305,7 @@ common/views/components/media-banner.vue:
|
||||
click-to-show: "Click to show"
|
||||
common/views/components/theme.vue:
|
||||
theme: "Theme"
|
||||
light-theme: "Theme"
|
||||
light-theme: "Theme to use in Light mode"
|
||||
dark-theme: "Theme during dark mode"
|
||||
light-themes: "Light theme"
|
||||
dark-themes: "Dark theme"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "Show renoted local posts in the timelines"
|
||||
show-maps: "Display a map to show location"
|
||||
remain-deleted-note: "Continue to show deleted posts"
|
||||
deck-column-align: "Deck column alignment"
|
||||
deck-column-align-center: "Center"
|
||||
deck-column-align-left: "Left"
|
||||
deck-column-align-flexible: "Flexible"
|
||||
deck-column-width: "Column width of the deck"
|
||||
deck-column-width-narrow: "narrow"
|
||||
deck-column-width-narrower: "somewhat narrow"
|
||||
deck-column-width-normal: "Normal"
|
||||
deck-column-width-wider: "somewhat wide"
|
||||
deck-column-width-wide: "wide"
|
||||
sound: "Sound"
|
||||
enable-sounds: "Enable sound"
|
||||
enable-sounds-desc: "Play a sound when you receive a post/message. This setting is stored in the browser."
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "Post"
|
||||
prev: "Previous note"
|
||||
next: "Next note"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "Notifications"
|
||||
read-all: "Do you wish to mark all notifications as read?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "Reversi"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "Direct posts"
|
||||
notifications: "Notifications"
|
||||
list: "List"
|
||||
select-list: "Select a list"
|
||||
swap-left: "Move left"
|
||||
swap-right: "Move right"
|
||||
swap-up: "Move up"
|
||||
@@ -1614,7 +1615,7 @@ deck:
|
||||
pop-right: "Dock on the right"
|
||||
disabled-timeline:
|
||||
title: "Timeline has been disabled"
|
||||
description: "This timeline has been disabled by the server administrator."
|
||||
description: "Timeline has been disabled by the administrator."
|
||||
deck/deck.tl-column.vue:
|
||||
is-media-only: "Only media posts"
|
||||
edit: "Options"
|
||||
|
||||
@@ -115,7 +115,8 @@ common:
|
||||
search: "Buscar"
|
||||
delete: "eliminar"
|
||||
loading: "cargando"
|
||||
ok: "OK"
|
||||
ok: "おk"
|
||||
cancel: "やめる"
|
||||
update-available-title: "Actualización disponible"
|
||||
update-available: "Hay disponible una nueva versión de Misskey ({newer}, la versión actual es {current}). Refresca la página para aplicar las actualizaciones."
|
||||
my-token-regenerated: "Tu token se ha regenerado vas a ser desconectado."
|
||||
@@ -146,6 +147,18 @@ common:
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
turn-on-darkmode: "闇に飲まれる"
|
||||
turn-off-darkmode: "光あれ"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "やり直す"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
remain-deleted-note: "削除された投稿を表示し続ける"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "Izquierda"
|
||||
deck-column-align-flexible: "Flexible"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
sound: "Sonidos"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "投稿"
|
||||
prev: "前の投稿"
|
||||
next: "次の投稿"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "通知"
|
||||
read-all: "すべての通知を既読にしますか?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "リバーシ"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "ダイレクト投稿"
|
||||
notifications: "通知"
|
||||
list: "リスト"
|
||||
select-list: "リストを選択してください"
|
||||
swap-left: "左に移動"
|
||||
swap-right: "右に移動"
|
||||
swap-up: "上に移動"
|
||||
|
||||
@@ -15,9 +15,9 @@ common:
|
||||
reaction: "Réactions"
|
||||
reaction-desc: "Une manière simple d'exprimer vos émotions. Misskey peut attacher diverses réactions aux publications des autres utilisateurs. Si vous essayez les réactions sur Misskey, vous ne pourrez plus retourner sur une autre plateforme de réseaux sociaux n'offrant que des « J'aime »."
|
||||
ui: "Interface utilisateur"
|
||||
ui-desc: "どのようなUIが使いやすいかは人それぞれです。だから、Misskeyは自由度の高いUIを持っています。レイアウトやデザインを調整したり、カスタマイズ可能な様々なウィジェットを配置したりして、自分だけのホームを作ってください。"
|
||||
ui-desc: "Aucune interface graphique ne peut plaire à tout le monde. Par conséquent, Misskey possède une interface utilisateur hautement personnalisable selon vos goûts. Vous pouvez rendre votre page d'accueil originale en modifiant la mise en page de votre fil et en déplaçant les widgets que vous pouvez facilement ajuster pour vous approprier cet espace."
|
||||
drive: "Drive"
|
||||
drive-desc: "以前投稿したことのある画像をまた投稿したくなったことはありませんか?もしくは、アップロードしたファイルをフォルダ分けして整理したくなったことはありませんか?Misskeyの根幹に組み込まれたドライブ機能によってそれらが解決します。ファイルの共有も簡単です。"
|
||||
drive-desc: "Vous voulez poster une photo que vous avez déjà transférée ? Vous souhaitez organiser, nommer et créer un dossier pour vos fichiers téléversés ? Misskey Drive est la meilleure solution pour vous. Très facile de partager vos fichiers en ligne."
|
||||
outro: "Découvrez vous-même les fonctionnalités de Misskey. Étant donné que Misskey est un réseau social fédéré, vous pouvez essayer d’autres instances afin de trouver vos amis si la présente instance ne vous correspond pas. Bonne chance et amusez-vous bien !"
|
||||
adblock:
|
||||
detected: "Veuillez désactiver votre bloqueur de publicités"
|
||||
@@ -58,14 +58,14 @@ common:
|
||||
trash: "Corbeille"
|
||||
drive: "Drive"
|
||||
messaging: "Conversations"
|
||||
home: "ホーム"
|
||||
home: "Principal"
|
||||
deck: "Deck"
|
||||
timeline: "Fil"
|
||||
explore: "Découvrir"
|
||||
following: "Suit"
|
||||
followers: "Abonné·e·s"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
follow-users-to-make-your-timeline: "Les utilisateurs suivants afficheront leurs publications sur votre fil."
|
||||
explore: "Trouver des utilisateurs"
|
||||
weekday-short:
|
||||
sunday: "D"
|
||||
@@ -115,7 +115,8 @@ common:
|
||||
search: "Recherche"
|
||||
delete: "Supprimer"
|
||||
loading: "Chargement en cours …"
|
||||
ok: "OK"
|
||||
ok: "おk"
|
||||
cancel: "やめる"
|
||||
update-available-title: "Mise à jour disponible"
|
||||
update-available: "Une nouvelle version de Misskey est disponible ({newer}, version actuelle: {current}). Veuillez recharger la page pour appliquer la mise à jour."
|
||||
my-token-regenerated: "Votre jeton vient d’être généré, vous allez maintenant être déconnecté."
|
||||
@@ -145,7 +146,19 @@ common:
|
||||
is-remote-post: "Ceci est une publication distante."
|
||||
view-on-remote: " Consulter le profil complet"
|
||||
renoted-by: "Renoté par {user}"
|
||||
no-notes: "投稿がありません"
|
||||
no-notes: "Sans aucune note"
|
||||
turn-on-darkmode: "Basculer vers le mode nuit"
|
||||
turn-off-darkmode: "Mode jour"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
error:
|
||||
title: "Une erreur est survenue"
|
||||
retry: "Réessayer"
|
||||
@@ -216,10 +229,10 @@ common/views/pages/explore.vue:
|
||||
recently-registered-users: "Les nouveaux inscrits"
|
||||
popular-tags: "Mots-clés populaires"
|
||||
federated: "Du Fédiverse"
|
||||
explore: "{host}を探索"
|
||||
users-info: "現在{users}ユーザーが登録されています"
|
||||
explore: "Explorer {host}"
|
||||
users-info: "Actuellement, {users} utilisateurs se sont inscrit ici"
|
||||
common/views/components/user-list.vue:
|
||||
no-users: "ユーザーがいません"
|
||||
no-users: "Il n'y a aucun utilisateur"
|
||||
common/views/components/games/reversi/reversi.vue:
|
||||
matching:
|
||||
waiting-for: "En attente de {}"
|
||||
@@ -461,7 +474,7 @@ common/views/components/notification-settings.vue:
|
||||
mark-as-read-all-notifications: "Marquer toutes les notifications comme lues"
|
||||
mark-as-read-all-unread-notes: "Marquer toutes les notes comme lues"
|
||||
mark-as-read-all-talk-messages: "Marquer toutes les conversations comme lues"
|
||||
auto-watch: "投稿の自動ウォッチ"
|
||||
auto-watch: "Surveiller automatiquement les publications"
|
||||
auto-watch-desc: "Recevoir automatiquement des notifications à propos des publications auxquelles vous avez réagi ou répondu"
|
||||
common/views/components/integration-settings.vue:
|
||||
title: "Intégrations"
|
||||
@@ -538,11 +551,11 @@ common/views/components/profile-editor.vue:
|
||||
following-list: "Liste des abonnements"
|
||||
mute-list: "Liste des comptes mis en sourdine"
|
||||
blocking-list: "Liste des comptes bloqués"
|
||||
export-requested: "エクスポートをリクエストしました。これには時間がかかる場合があります。エクスポートが終わると、ドライブにファイルが追加されます。"
|
||||
enter-password: "パスワードを入力してください"
|
||||
danger-zone: "危険な設定"
|
||||
delete-account: "アカウントを削除"
|
||||
account-deleted: "アカウントが削除されました。データが消えるまで時間がかかる場合があります。"
|
||||
export-requested: "Vous avez demandé une exportation. Cela peut prendre un certain temps. Une fois l'exportation terminée, le fichier résultant sera ajouté dans le Drive."
|
||||
enter-password: "Veuillez saisir votre mot de passe"
|
||||
danger-zone: "Zone de danger"
|
||||
delete-account: "Supprimer le compte"
|
||||
account-deleted: "Le compte a été supprimé. Cela peut prendre un certain temps avant que toutes les données disparaissent."
|
||||
common/views/components/user-list-editor.vue:
|
||||
users: "Utilisateur·rice"
|
||||
rename: "Renommer la liste"
|
||||
@@ -582,7 +595,7 @@ common/views/widgets/slideshow.vue:
|
||||
folder: "Veuillez cliquer pour spécifier le dossier"
|
||||
no-image: "Il n'y a aucune image dans ce dossier"
|
||||
common/views/widgets/tips.vue:
|
||||
tips-line1: "<kbd>t</kbd>でタイムラインにフォーカスできます"
|
||||
tips-line1: "Vous pouvez vous concentrer sur le fil avec <kbd>t</kbd>"
|
||||
tips-line2: "Ouvre la fenêtre de publication en appuyant sur <kbd>p</kbd> ou <kbd>n</kbd>."
|
||||
tips-line3: "Vous pouvez glisser et déposer des fichiers sur la fenêtre de la note"
|
||||
tips-line4: "Vous pouvez coller des images à partir du presse-papier sur la fenêtre de la note"
|
||||
@@ -591,7 +604,7 @@ common/views/widgets/tips.vue:
|
||||
tips-line7: "Vous pouvez déplacer des dossiers en les glissant dans le Drive"
|
||||
tips-line8: "Vous pouvez personnaliser l'Accueil via les paramètres"
|
||||
tips-line9: "Misskey est sous licence AGPLv3"
|
||||
tips-line10: "タイムマシンウィジェットを利用すると、簡単に過去のタイムラインに遡れます"
|
||||
tips-line10: "L'utilisation du widget Time Machine permet de remonter facilement dans le passé du fil."
|
||||
tips-line11: "Vous pouvez épingler des notes sur votre page en cliquant sur « … »"
|
||||
tips-line13: "Tous les fichiers attachés à cette publication sont sauvegardés dans le Drive"
|
||||
tips-line14: "Lorsque vous personnalisez la disposition de votre page d’accueil, vous pouvez effectuer un clique droit sur un widget pour changer son apparence."
|
||||
@@ -818,9 +831,9 @@ desktop/views/components/settings.vue:
|
||||
web-search-engine: "Moteur de recherche Web"
|
||||
web-search-engine-desc: "Exemple : https://www.google.com/?#q={{query}}"
|
||||
auto-popout: "Fenêtre contextuelle automatique"
|
||||
auto-popout-desc: "ウィンドウが開かれるとき、ポップアウト(ブラウザ外に切り離す)可能なら自動でポップアウトします。この設定はブラウザに記憶されます。"
|
||||
auto-popout-desc: "Dans le mesure du possible, l'affichage pop-out sera utilisé au lieu d'ouvrir une nouvelle fenêtre. Ce paramètre est enregistré dans votre navigateur."
|
||||
keep-cw: "Maintenir l'avertissement de contenu"
|
||||
keep-cw-desc: "投稿にリプライする際、リプライ元の投稿にCWが設定されていたとき、デフォルトで同じCWを設定するようにします。"
|
||||
keep-cw-desc: "Lorsque vous répondez à un message, le même avertissement de contenu est reprit par défaut dans la réponse, le même que celui qui a été défini dans le message original."
|
||||
display: "Affichage et design"
|
||||
wallpaper: "Arrière plan"
|
||||
choose-wallpaper: "Sélectionner un fond d'écran"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "Afficher les partages locaux sur les fils"
|
||||
show-maps: "Afficher la carte"
|
||||
remain-deleted-note: "Continuer à afficher les messages supprimés"
|
||||
deck-column-align: "Alignement des colonnes du Deck"
|
||||
deck-column-align-center: "Centrer"
|
||||
deck-column-align-left: "À gauche"
|
||||
deck-column-align-flexible: "Flexibles"
|
||||
deck-column-width: "Largeur des colonnes du Deck"
|
||||
deck-column-width-narrow: "Étroite"
|
||||
deck-column-width-narrower: "Légèrement étroite"
|
||||
deck-column-width-normal: "Normale"
|
||||
deck-column-width-wider: "Légèrement large"
|
||||
deck-column-width-wide: "Large"
|
||||
sound: "Son"
|
||||
enable-sounds: "Activer le son"
|
||||
enable-sounds-desc: "Jouer un son lorsque vous recevez un message. Ce paramètre est sauvegardé dans le navigateur."
|
||||
@@ -977,7 +980,7 @@ desktop/views/components/ui.header.account.vue:
|
||||
profile: "Votre profil"
|
||||
favorites: "Favorites"
|
||||
lists: "Listes"
|
||||
follow-requests: "Demandes de suivi"
|
||||
follow-requests: "Demandes d’abonnement"
|
||||
admin: "Admin"
|
||||
settings: "Réglages"
|
||||
signout: "Déconnexion"
|
||||
@@ -991,7 +994,7 @@ desktop/views/components/ui.header.post.vue:
|
||||
desktop/views/components/ui.header.search.vue:
|
||||
placeholder: "Chercher"
|
||||
desktop/views/components/received-follow-requests-window.vue:
|
||||
title: "Demandes de suivi"
|
||||
title: "Demandes d’abonnement"
|
||||
accept: "Accepter"
|
||||
reject: "Refuser"
|
||||
desktop/views/components/user-lists-window.vue:
|
||||
@@ -1087,7 +1090,7 @@ admin/views/instance.vue:
|
||||
disable-registration: "Désactiver les inscriptions"
|
||||
disable-local-timeline: "Désactiver le fil local"
|
||||
disable-global-timeline: "Désactiver le fil global"
|
||||
disabling-timelines-info: "これらのタイムラインを無効にしても、管理者およびモデレーターは引き続き利用できます。"
|
||||
disabling-timelines-info: "Même si vous désactivez ces fils, l'administrateur et les modérateurs peuvent continuer à les utiliser."
|
||||
invite: "Inviter"
|
||||
save: "Sauvegarder"
|
||||
saved: "Enregistré"
|
||||
@@ -1105,7 +1108,7 @@ admin/views/instance.vue:
|
||||
smtp-secure-info: "Désactiver STARTTLS lorsque celui-ci est utilisé."
|
||||
smtp-host: "Hôte SMTP"
|
||||
smtp-port: "Port SMTP"
|
||||
smtp-auth: "SMTP認証を行う"
|
||||
smtp-auth: "Effectuer une authentification SMTP"
|
||||
smtp-user: "Utilisateur SMTP"
|
||||
smtp-pass: "Mot de passe SMTP"
|
||||
serviceworker-config: "ServiceWorker"
|
||||
@@ -1260,7 +1263,7 @@ admin/views/federation.vue:
|
||||
latest-request-sent-at: "Dernière requête envoyée"
|
||||
latest-request-received-at: "Dernière requête reçue"
|
||||
remove-all-following: "フォローを全解除"
|
||||
remove-all-following-info: "{host}からのフォローをすべて解除します。そのインスタンスがもう存在しなくなった場合などに実行してください。"
|
||||
remove-all-following-info: "Se désabonner de tous les comptes de {host}. Exécutez cette commande si l'instance n'existe plus."
|
||||
block: "Bloquer"
|
||||
marked-as-closed: "Marquées comme fermées"
|
||||
lookup: "Recherche"
|
||||
@@ -1270,8 +1273,8 @@ admin/views/federation.vue:
|
||||
sorts:
|
||||
caughtAtAsc: "Date d’inscription (Ascendant)"
|
||||
caughtAtDesc: "Date d’inscription (Descendant)"
|
||||
lastCommunicatedAtAsc: "最後にやり取りした日時が古い順"
|
||||
lastCommunicatedAtDesc: "最後にやり取りした日時が新しい順"
|
||||
lastCommunicatedAtAsc: "La date et l'heure des interactions plus anciennes"
|
||||
lastCommunicatedAtDesc: "La date et l'heure des nouvelles interactions"
|
||||
notesAsc: "投稿が少ない順"
|
||||
notesDesc: "Description des notes"
|
||||
usersAsc: "ユーザーが少ない順"
|
||||
@@ -1280,7 +1283,7 @@ admin/views/federation.vue:
|
||||
followingDesc: "Ayant le plus d'abonné·e·s"
|
||||
followersAsc: "Ayant le moins d'abonné·e·s"
|
||||
followersDesc: "Ayant le plus d'abonné·e·s"
|
||||
driveUsageAsc: "ドライブ使用量が少ない順"
|
||||
driveUsageAsc: "Moins d'espace de stockage utilisé"
|
||||
driveUsageDesc: "ドライブ使用量が多い順"
|
||||
driveFilesAsc: "ドライブのファイル数が少ない順"
|
||||
driveFilesDesc: "ドライブのファイル数が多い順"
|
||||
@@ -1357,7 +1360,7 @@ desktop/views/pages/user/user.header.vue:
|
||||
following: "Suit"
|
||||
followers: "Abonné·e·s"
|
||||
is-bot: "Ce compte est un Bot"
|
||||
no-description: "自己紹介はありません"
|
||||
no-description: "L'utilisateur n'a pas renseigné d'introduction sur son profile"
|
||||
years-old: "{age} ans"
|
||||
year: "/"
|
||||
month: "/"
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "Publication"
|
||||
prev: "Note précédente"
|
||||
next: "Note suivante"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "Notifications"
|
||||
read-all: "Êtes-vous sûr de vouloir marquer l’ensemble des notifications comme étant lues ?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "Reversi"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "Messages directs"
|
||||
notifications: "Notifications"
|
||||
list: "Listes"
|
||||
select-list: "リストを選択してください"
|
||||
swap-left: "Déplacer à gauche"
|
||||
swap-right: "Déplacer à droite"
|
||||
swap-up: "Déplacer vers le haut"
|
||||
|
||||
@@ -115,7 +115,8 @@ common:
|
||||
search: "検索"
|
||||
delete: "削除"
|
||||
loading: "読み込み中"
|
||||
ok: "わかった"
|
||||
ok: "おk"
|
||||
cancel: "やめる"
|
||||
update-available-title: "更新があります"
|
||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||
@@ -146,6 +147,18 @@ common:
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
turn-on-darkmode: "闇に飲まれる"
|
||||
turn-off-darkmode: "光あれ"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "やり直す"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
remain-deleted-note: "削除された投稿を表示し続ける"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
sound: "サウンド"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "投稿"
|
||||
prev: "前の投稿"
|
||||
next: "次の投稿"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "通知"
|
||||
read-all: "すべての通知を既読にしますか?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "リバーシ"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "ダイレクト投稿"
|
||||
notifications: "通知"
|
||||
list: "リスト"
|
||||
select-list: "リストを選択してください"
|
||||
swap-left: "左に移動"
|
||||
swap-right: "右に移動"
|
||||
swap-up: "上に移動"
|
||||
|
||||
@@ -124,7 +124,8 @@ common:
|
||||
search: "検索"
|
||||
delete: "削除"
|
||||
loading: "読み込み中"
|
||||
ok: "わかった"
|
||||
ok: "おk"
|
||||
cancel: "やめる"
|
||||
update-available-title: "更新があります"
|
||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||
@@ -158,6 +159,16 @@ common:
|
||||
no-notes: "投稿がありません"
|
||||
turn-on-darkmode: "闇に飲まれる"
|
||||
turn-off-darkmode: "光あれ"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
@@ -939,16 +950,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
remain-deleted-note: "削除された投稿を表示し続ける"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
|
||||
sound: "サウンド"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
@@ -1711,10 +1712,6 @@ mobile/views/pages/note.vue:
|
||||
prev: "前の投稿"
|
||||
next: "次の投稿"
|
||||
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "通知"
|
||||
read-all: "すべての通知を既読にしますか?"
|
||||
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "リバーシ"
|
||||
|
||||
@@ -1803,6 +1800,7 @@ deck:
|
||||
direct: "ダイレクト投稿"
|
||||
notifications: "通知"
|
||||
list: "リスト"
|
||||
select-list: "リストを選択してください"
|
||||
swap-left: "左に移動"
|
||||
swap-right: "右に移動"
|
||||
swap-up: "上に移動"
|
||||
|
||||
@@ -115,7 +115,8 @@ common:
|
||||
search: "検索"
|
||||
delete: "削除"
|
||||
loading: "読み込み中"
|
||||
ok: "ほい"
|
||||
ok: "おk"
|
||||
cancel: "やめる"
|
||||
update-available-title: "更新があんで"
|
||||
update-available: "Misskeyの新しいバージョンがあんで({newer}。現在{current}をつこてるわ)。ページを再度読み込みしたると更新が適用されるわ。"
|
||||
my-token-regenerated: "あんさんのトークンが更新されたらしいわ。すまんがとりあえずサインアウトすんで。"
|
||||
@@ -146,6 +147,18 @@ common:
|
||||
view-on-remote: "ちゃんとした情報見せてや!"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
turn-on-darkmode: "闇に飲まれる"
|
||||
turn-off-darkmode: "光あれ"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
error:
|
||||
title: "問題が起こったわ"
|
||||
retry: "もっぺん"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "ローカル投稿のRenoteも見たいんや"
|
||||
show-maps: "地図勝手にバァーって開いてくれ"
|
||||
remain-deleted-note: "削除された投稿も表示しっぱなしにする"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "真ん中"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
sound: "サウンド"
|
||||
enable-sounds: "サウンド鳴らす"
|
||||
enable-sounds-desc: "投稿やメッセージもろたとき、音鳴らしたるわ。大丈夫や、この設定はブラウザが覚えてくれとる。"
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "投稿"
|
||||
prev: "前のやつ"
|
||||
next: "次のやつ"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "通知"
|
||||
read-all: "通知全部読んだか?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "リバーシ"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "ダイレクト投稿"
|
||||
notifications: "通知"
|
||||
list: "リスト"
|
||||
select-list: "リストを選択してください"
|
||||
swap-left: "左に移動や!"
|
||||
swap-right: "右に移動や!"
|
||||
swap-up: "上に移動や!"
|
||||
|
||||
@@ -58,7 +58,7 @@ common:
|
||||
trash: "휴지통"
|
||||
drive: "드라이브"
|
||||
messaging: "대화"
|
||||
home: "ホーム"
|
||||
home: "홈"
|
||||
deck: "덱"
|
||||
timeline: "타임라인"
|
||||
explore: "발견"
|
||||
@@ -115,7 +115,8 @@ common:
|
||||
search: "검색"
|
||||
delete: "삭제"
|
||||
loading: "로드 중"
|
||||
ok: "확인"
|
||||
ok: "5K"
|
||||
cancel: "그만두기"
|
||||
update-available-title: "업데이트가 있습니다"
|
||||
update-available: "Misskey의 새로운 버전이 있습니다 ({newer}. 현재 {current}을 사용 중). 페이지를 다시 로드하면 업데이트가 적용됩니다."
|
||||
my-token-regenerated: "당신의 토큰이 업데이트되었으므로 로그아웃합니다."
|
||||
@@ -146,6 +147,18 @@ common:
|
||||
view-on-remote: "정확한 정보 보기"
|
||||
renoted-by: "{user}이(가) 리노트"
|
||||
no-notes: "글이 없습니다"
|
||||
turn-on-darkmode: "어둠에 삼켜져라"
|
||||
turn-off-darkmode: "빛이 있으라"
|
||||
deck-column-align: "덱의 칼럼 위치"
|
||||
deck-column-align-center: "가운데"
|
||||
deck-column-align-left: "왼쪽"
|
||||
deck-column-align-flexible: "플렉서블"
|
||||
deck-column-width: "덱의 칼럼 폭"
|
||||
deck-column-width-narrow: "좁음"
|
||||
deck-column-width-narrower: "조금 좁음"
|
||||
deck-column-width-normal: "보통"
|
||||
deck-column-width-wider: "조금 넓음"
|
||||
deck-column-width-wide: "넓음"
|
||||
error:
|
||||
title: "오류가 발생했습니다"
|
||||
retry: "다시 시도"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "로컬 글의 리노트를 타임라인에 보이기"
|
||||
show-maps: "지도 자동 표시"
|
||||
remain-deleted-note: "삭제된 글을 계속 표시"
|
||||
deck-column-align: "덱의 칼럼 위치"
|
||||
deck-column-align-center: "가운데"
|
||||
deck-column-align-left: "왼쪽"
|
||||
deck-column-align-flexible: "플렉서블"
|
||||
deck-column-width: "덱의 칼럼 폭"
|
||||
deck-column-width-narrow: "좁음"
|
||||
deck-column-width-narrower: "조금 좁음"
|
||||
deck-column-width-normal: "보통"
|
||||
deck-column-width-wider: "조금 넓음"
|
||||
deck-column-width-wide: "넓음"
|
||||
sound: "소리"
|
||||
enable-sounds: "소리 사용"
|
||||
enable-sounds-desc: "글이나 메시지를 송수신하였을 때 소리를 재생합니다. 이 설정은 브라우저에 저장됩니다."
|
||||
@@ -1401,7 +1404,7 @@ mobile/views/components/drive.vue:
|
||||
prompt: "무엇을 하시겠습니까? (숫자를 입력하여 주십시오): <1 → 파일 업로드 | 2 → 파일을 URL에서 업로드 | 3 → 폴더 만들기 | 4 → 이 폴더의 이름을 변경 | 5 → 현재 폴더 이동| 6 → 현재 폴더 삭제>"
|
||||
deletion-alert: "죄송합니다! 폴더 삭제는 아직 구현되지 않았습니다..."
|
||||
folder-name: "폴더 이름"
|
||||
here-is-root: "現在いる場所はルートで、フォルダではありません。"
|
||||
here-is-root: "현재 경로는 루트 경로로 폴더가 아닙니다."
|
||||
url-prompt: "업로드 하려는 파일의 URL"
|
||||
uploading: "업로드를 요청하였습니다. 업로드가 완료될 때까지 시간이 소요될 수 있습니다."
|
||||
mobile/views/components/drive-file-chooser.vue:
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "글"
|
||||
prev: "이전 글"
|
||||
next: "다음 글"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "알림"
|
||||
read-all: "모든 알림을 읽은 상태로 표시하시겠습니까?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "리버시"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "다이렉트 게시글"
|
||||
notifications: "알림"
|
||||
list: "리스트"
|
||||
select-list: "리스트를 선택하여 주십시오"
|
||||
swap-left: "왼쪽으로 이동"
|
||||
swap-right: "오른쪽으로 이동"
|
||||
swap-up: "위로 이동"
|
||||
|
||||
@@ -115,7 +115,8 @@ common:
|
||||
search: "検索"
|
||||
delete: "Verwijderen"
|
||||
loading: "Bezig met laden"
|
||||
ok: "Oké"
|
||||
ok: "おk"
|
||||
cancel: "やめる"
|
||||
update-available-title: "更新があります"
|
||||
update-available: "Er is een nieuwe versie van Misskey beschikbaar: {newer} (de huidige versie is {current}). Herlaad de pagina om de update toe te passen."
|
||||
my-token-regenerated: "Je sleutel is gegenereerd; je wordt nu uitgelogd."
|
||||
@@ -146,6 +147,18 @@ common:
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
turn-on-darkmode: "闇に飲まれる"
|
||||
turn-off-darkmode: "光あれ"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "やり直す"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "Kaart tonen"
|
||||
remain-deleted-note: "削除された投稿を表示し続ける"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
sound: "Geluid"
|
||||
enable-sounds: "Geluid inschakelen"
|
||||
enable-sounds-desc: "Een geluid afspelen bij het ontvangen van een bericht. Deze instelling wordt opgeslagen in je browser."
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "Bericht"
|
||||
prev: "Vorige notitie"
|
||||
next: "Volgende notitie"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "Meldingen"
|
||||
read-all: "Weet je zeker dat je alle meldingen wilt markeren als gelezen?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "リバーシ"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "ダイレクト投稿"
|
||||
notifications: "通知"
|
||||
list: "リスト"
|
||||
select-list: "リストを選択してください"
|
||||
swap-left: "左に移動"
|
||||
swap-right: "右に移動"
|
||||
swap-up: "上に移動"
|
||||
|
||||
@@ -115,7 +115,8 @@ common:
|
||||
search: "Søk"
|
||||
delete: "Slett"
|
||||
loading: "Laster inn..."
|
||||
ok: "Ok"
|
||||
ok: "おk"
|
||||
cancel: "やめる"
|
||||
update-available-title: "更新があります"
|
||||
update-available: "En ny versjon av Misskey er nå tilgjengelig ({newer}, nåværende versjon er {current}). Last inn siden igjen for at oppdateringen skal tre i kraft."
|
||||
my-token-regenerated: "Ditt synbol har blitt generert. Du vil nå bli utlogget."
|
||||
@@ -146,6 +147,18 @@ common:
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
turn-on-darkmode: "闇に飲まれる"
|
||||
turn-off-darkmode: "光あれ"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "やり直す"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
remain-deleted-note: "削除された投稿を表示し続ける"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
sound: "Lyd"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "Innlegg"
|
||||
prev: "Forrige innlegg"
|
||||
next: "Neste innlegg"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "Notifikasjon"
|
||||
read-all: "すべての通知を既読にしますか?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "Reversi"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "ダイレクト投稿"
|
||||
notifications: "通知"
|
||||
list: "リスト"
|
||||
select-list: "リストを選択してください"
|
||||
swap-left: "左に移動"
|
||||
swap-right: "右に移動"
|
||||
swap-up: "上に移動"
|
||||
|
||||
@@ -28,7 +28,7 @@ common:
|
||||
load-more: "Załaduj więcej"
|
||||
enter-password: "Wprowadź Hasło"
|
||||
2fa: "Uwierzytelnienie dwuetapowe"
|
||||
customize-home: "ホームをカスタマイズ"
|
||||
customize-home: "Dostosuj stronę główną"
|
||||
featured-notes: "ハイライト"
|
||||
got-it: "Rozumiem!"
|
||||
customization-tips:
|
||||
@@ -58,15 +58,15 @@ common:
|
||||
trash: "Kosz"
|
||||
drive: "Dysk"
|
||||
messaging: "Rozmowy"
|
||||
home: "ホーム"
|
||||
home: "Strona główna"
|
||||
deck: "デッキ"
|
||||
timeline: "タイムライン"
|
||||
timeline: "Oś czasu"
|
||||
explore: "Znajdź"
|
||||
following: "フォロー中"
|
||||
followers: "フォロワー"
|
||||
following: "Śledzisz"
|
||||
followers: "Śledzący"
|
||||
empty-timeline-info:
|
||||
follow-users-to-make-your-timeline: "ユーザーをフォローすると投稿がタイムラインに表示されます。"
|
||||
explore: "ユーザーを探索する"
|
||||
explore: "Poznaj"
|
||||
weekday-short:
|
||||
sunday: "N"
|
||||
monday: "Pn"
|
||||
@@ -115,7 +115,8 @@ common:
|
||||
search: "Szukaj"
|
||||
delete: "Usuń"
|
||||
loading: "Ładowanie"
|
||||
ok: "OK"
|
||||
ok: "Możesz OK"
|
||||
cancel: "Anuluj"
|
||||
update-available-title: "Aktualizacja jest dostępna"
|
||||
update-available: "Nowa wersja Misskey jest dostępna ({newer}, obecna to {current}). Odśwież stronę, aby zastosować aktualizację."
|
||||
my-token-regenerated: "Twój token został wygenerowany. Zostaniesz wylogowany."
|
||||
@@ -146,6 +147,18 @@ common:
|
||||
view-on-remote: "Dla dopełnienia, zobacz to zdalnie."
|
||||
renoted-by: "{user} udostępnił(a)"
|
||||
no-notes: "投稿がありません"
|
||||
turn-on-darkmode: "闇に飲まれる"
|
||||
turn-off-darkmode: "光あれ"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
error:
|
||||
title: "Coś poszło nie tak"
|
||||
retry: "Ponów próbę"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "Automatycznie pokazuj mapę"
|
||||
remain-deleted-note: "削除された投稿を表示し続ける"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "Lewo"
|
||||
deck-column-align-flexible: "Elastyczne"
|
||||
deck-column-width: "Szerokość kolumn w talii"
|
||||
deck-column-width-narrow: "Wąska"
|
||||
deck-column-width-narrower: "Trochę wąska"
|
||||
deck-column-width-normal: "Normalna"
|
||||
deck-column-width-wider: "Trochę szeroka"
|
||||
deck-column-width-wide: "Szeroka"
|
||||
sound: "Dźwięk"
|
||||
enable-sounds: "Włącz dźwięk"
|
||||
enable-sounds-desc: "Odtwarzaj dźwięk przy wstawianiu wpisów, wysyłaniu lub otrzymywaniu wiadomości. Opcja ta jest zapamiętywana przez przeglądarkę."
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "Wpis"
|
||||
prev: "Poprzedni wpis"
|
||||
next: "Następny wpis"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "Powiadomienia"
|
||||
read-all: "Czy na pewno chcesz oznaczyć wszystkie powiadomienia jako przeczytane?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "Reversi"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "Bezpośrednie wpisy"
|
||||
notifications: "Powiadomienia"
|
||||
list: "Listy"
|
||||
select-list: "リストを選択してください"
|
||||
swap-left: "Przesuń w lewo"
|
||||
swap-right: "Przesuń w prawo"
|
||||
swap-up: "Przenieś w górę"
|
||||
|
||||
@@ -115,7 +115,8 @@ common:
|
||||
search: "Buscar"
|
||||
delete: "Apagar"
|
||||
loading: "Carregando"
|
||||
ok: "OK"
|
||||
ok: "おk"
|
||||
cancel: "やめる"
|
||||
update-available-title: "Atualização disponível"
|
||||
update-available: "Uma nova versão de Misskey está disponível ({newer}). A versão atual é {current}. Recarregue a página para atualizar."
|
||||
my-token-regenerated: "Seu token foi recriado, portanto você foi deslogado."
|
||||
@@ -146,6 +147,18 @@ common:
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
turn-on-darkmode: "闇に飲まれる"
|
||||
turn-off-darkmode: "光あれ"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
error:
|
||||
title: "問題が発生しました"
|
||||
retry: "やり直す"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
remain-deleted-note: "削除された投稿を表示し続ける"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
sound: "サウンド"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "投稿"
|
||||
prev: "前の投稿"
|
||||
next: "次の投稿"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "通知"
|
||||
read-all: "すべての通知を既読にしますか?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "リバーシ"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "ダイレクト投稿"
|
||||
notifications: "通知"
|
||||
list: "リスト"
|
||||
select-list: "リストを選択してください"
|
||||
swap-left: "左に移動"
|
||||
swap-right: "右に移動"
|
||||
swap-up: "上に移動"
|
||||
|
||||
@@ -115,7 +115,8 @@ common:
|
||||
search: "検索"
|
||||
delete: "削除"
|
||||
loading: "読み込み中"
|
||||
ok: "わかった"
|
||||
ok: "おk"
|
||||
cancel: "やめる"
|
||||
update-available-title: "更新があります"
|
||||
update-available: "Misskeyの新しいバージョンがあります({newer}。現在{current}を利用中)。ページを再度読み込みすると更新が適用されます。"
|
||||
my-token-regenerated: "あなたのトークンが更新されたのでサインアウトします。"
|
||||
@@ -146,6 +147,18 @@ common:
|
||||
view-on-remote: "正確な情報を見る"
|
||||
renoted-by: "{user}がRenote"
|
||||
no-notes: "投稿がありません"
|
||||
turn-on-darkmode: "闇に飲まれる"
|
||||
turn-off-darkmode: "光あれ"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
error:
|
||||
title: "Что-то пошло не так :("
|
||||
retry: "Повторить"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "ローカルの投稿のRenoteをタイムラインに表示する"
|
||||
show-maps: "マップの自動展開"
|
||||
remain-deleted-note: "削除された投稿を表示し続ける"
|
||||
deck-column-align: "デッキのカラムの配置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "フレキシブル"
|
||||
deck-column-width: "デッキのカラムの幅"
|
||||
deck-column-width-narrow: "狭"
|
||||
deck-column-width-narrower: "やや狭"
|
||||
deck-column-width-normal: "普通"
|
||||
deck-column-width-wider: "やや広"
|
||||
deck-column-width-wide: "広"
|
||||
sound: "サウンド"
|
||||
enable-sounds: "サウンドを有効にする"
|
||||
enable-sounds-desc: "投稿やメッセージを送受信したときなどにサウンドを再生します。この設定はブラウザに記憶されます。"
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "投稿"
|
||||
prev: "前の投稿"
|
||||
next: "次の投稿"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "通知"
|
||||
read-all: "すべての通知を既読にしますか?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "リバーシ"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "ダイレクト投稿"
|
||||
notifications: "通知"
|
||||
list: "リスト"
|
||||
select-list: "リストを選択してください"
|
||||
swap-left: "左に移動"
|
||||
swap-right: "右に移動"
|
||||
swap-up: "上に移動"
|
||||
|
||||
@@ -58,7 +58,7 @@ common:
|
||||
trash: "垃圾箱"
|
||||
drive: "网盘"
|
||||
messaging: "聊天"
|
||||
home: "ホーム"
|
||||
home: "首页"
|
||||
deck: "Deck"
|
||||
timeline: "时间线"
|
||||
explore: "发现"
|
||||
@@ -116,6 +116,7 @@ common:
|
||||
delete: "删除"
|
||||
loading: "正在加载中"
|
||||
ok: "确定"
|
||||
cancel: "取消"
|
||||
update-available-title: "有可用更新"
|
||||
update-available: "新的 Misskey 版本现已发布({newer}。目前版本{current}). 刷新页面以应用更新。"
|
||||
my-token-regenerated: "您的 Token 已被重置, 您将自动登出。"
|
||||
@@ -146,6 +147,18 @@ common:
|
||||
view-on-remote: "查看准确的信息"
|
||||
renoted-by: "由 {user} Renote"
|
||||
no-notes: "没有帖子"
|
||||
turn-on-darkmode: "切换暗色主题"
|
||||
turn-off-darkmode: "切换亮色主题"
|
||||
deck-column-align: "列对齐设置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "可变"
|
||||
deck-column-width: "列宽度"
|
||||
deck-column-width-narrow: "窄"
|
||||
deck-column-width-narrower: "更窄"
|
||||
deck-column-width-normal: "正常"
|
||||
deck-column-width-wider: "更宽"
|
||||
deck-column-width-wide: "宽"
|
||||
error:
|
||||
title: "出现问题"
|
||||
retry: "重试"
|
||||
@@ -839,16 +852,6 @@ desktop/views/components/settings.vue:
|
||||
show-local-renotes: "在时间线中显示Local Renote(s)"
|
||||
show-maps: "自动显示地图"
|
||||
remain-deleted-note: "继续显示已删除的帖子"
|
||||
deck-column-align: "列对齐设置"
|
||||
deck-column-align-center: "中央"
|
||||
deck-column-align-left: "左"
|
||||
deck-column-align-flexible: "可变"
|
||||
deck-column-width: "列宽度"
|
||||
deck-column-width-narrow: "窄"
|
||||
deck-column-width-narrower: "更窄"
|
||||
deck-column-width-normal: "正常"
|
||||
deck-column-width-wider: "更宽"
|
||||
deck-column-width-wide: "宽"
|
||||
sound: "声音"
|
||||
enable-sounds: "开启声音"
|
||||
enable-sounds-desc: "收到帖子/留言时播放声音。 此设置将被存储在浏览器中。"
|
||||
@@ -1401,7 +1404,7 @@ mobile/views/components/drive.vue:
|
||||
prompt: "您想要干什么呢?(请输入数字):<1 → 上传文件 | 2 → 从URL上传文件 | 3 → 创建新文件夹 | 4 → 更改这个文件夹的名称 | 5 → 移动这个文件夹 | 6 → 删除这个文件夹>"
|
||||
deletion-alert: "抱歉! 删除文件夹功能尚未实现。"
|
||||
folder-name: "文件夹名称"
|
||||
here-is-root: "現在いる場所はルートで、フォルダではありません。"
|
||||
here-is-root: "当前位置为根目录。"
|
||||
url-prompt: "要上传的文件的URL"
|
||||
uploading: "已请求上传。 上传完成可能需要一段时间。"
|
||||
mobile/views/components/drive-file-chooser.vue:
|
||||
@@ -1519,9 +1522,6 @@ mobile/views/pages/note.vue:
|
||||
title: "帖文"
|
||||
prev: "上一个帖子"
|
||||
next: "下一个帖子"
|
||||
mobile/views/pages/notifications.vue:
|
||||
notifications: "通知"
|
||||
read-all: "您希望将所有通知标记为已读吗?"
|
||||
mobile/views/pages/games/reversi.vue:
|
||||
reversi: "游戏"
|
||||
mobile/views/pages/search.vue:
|
||||
@@ -1603,6 +1603,7 @@ deck:
|
||||
direct: "直接发布"
|
||||
notifications: "通知"
|
||||
list: "列表"
|
||||
select-list: "请选择一个列表"
|
||||
swap-left: "向左移动"
|
||||
swap-right: "向右移动"
|
||||
swap-up: "向上移动"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"author": "syuilo <i@syuilo.com>",
|
||||
"version": "10.89.1",
|
||||
"version": "10.90.0",
|
||||
"codename": "nighthike",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
@@ -95,7 +95,7 @@
|
||||
"@types/websocket": "0.0.40",
|
||||
"@types/ws": "6.0.1",
|
||||
"animejs": "3.0.1",
|
||||
"apexcharts": "3.4.1",
|
||||
"apexcharts": "3.5.0",
|
||||
"autobind-decorator": "2.4.0",
|
||||
"autosize": "4.0.2",
|
||||
"autwh": "0.1.0",
|
||||
|
||||
@@ -35,7 +35,7 @@ export default Vue.extend({
|
||||
|
||||
created() {
|
||||
this.$root.getMeta().then(meta => {
|
||||
this.announcements = meta.broadcasts;
|
||||
this.announcements = meta.announcements;
|
||||
});
|
||||
},
|
||||
|
||||
@@ -65,7 +65,7 @@ export default Vue.extend({
|
||||
|
||||
save(silent) {
|
||||
this.$root.api('admin/update-meta', {
|
||||
broadcasts: this.announcements
|
||||
announcements: this.announcements
|
||||
}).then(() => {
|
||||
if (!silent) {
|
||||
this.$root.dialog({
|
||||
|
||||
@@ -9,6 +9,10 @@ export default function <T extends object>(data: {
|
||||
widget: {
|
||||
type: Object
|
||||
},
|
||||
column: {
|
||||
type: Object,
|
||||
default: null
|
||||
},
|
||||
platform: {
|
||||
type: String,
|
||||
required: true
|
||||
@@ -65,10 +69,14 @@ export default function <T extends object>(data: {
|
||||
|
||||
this.bakeProps();
|
||||
|
||||
this.$root.api('i/update_widget', {
|
||||
id: this.id,
|
||||
data: this.props
|
||||
});
|
||||
if (this.platform == 'deck') {
|
||||
this.$store.commit('device/updateDeckColumn', this.column);
|
||||
} else {
|
||||
this.$root.api('i/update_widget', {
|
||||
id: this.id,
|
||||
data: this.props
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -2,18 +2,23 @@
|
||||
<div class="felqjxyj" :class="{ splash }">
|
||||
<div class="bg" ref="bg" @click="onBgClick"></div>
|
||||
<div class="main" ref="main">
|
||||
<div class="icon" v-if="!input && !select && !user" :class="type"><fa :icon="icon"/></div>
|
||||
<header v-if="title" v-html="title"></header>
|
||||
<div class="body" v-if="text" v-html="text"></div>
|
||||
<ui-input v-if="input" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></ui-input>
|
||||
<ui-input v-if="user" v-model="userInputValue" autofocus @keydown="onInputKeydown"><template #prefix>@</template></ui-input>
|
||||
<ui-select v-if="select" v-model="selectedValue">
|
||||
<option v-for="item in select.items" :value="item.value">{{ item.text }}</option>
|
||||
</ui-select>
|
||||
<ui-horizon-group no-grow class="buttons fit-bottom" v-if="!splash">
|
||||
<ui-button @click="ok" primary :autofocus="!input && !select && !user">OK</ui-button>
|
||||
<ui-button @click="cancel" v-if="showCancelButton || input || select || user">Cancel</ui-button>
|
||||
</ui-horizon-group>
|
||||
<template v-if="type == 'signin'">
|
||||
<mk-signin/>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div class="icon" v-if="!input && !select && !user" :class="type"><fa :icon="icon"/></div>
|
||||
<header v-if="title" v-html="title"></header>
|
||||
<div class="body" v-if="text" v-html="text"></div>
|
||||
<ui-input v-if="input" v-model="inputValue" autofocus :type="input.type || 'text'" :placeholder="input.placeholder" @keydown="onInputKeydown"></ui-input>
|
||||
<ui-input v-if="user" v-model="userInputValue" autofocus @keydown="onInputKeydown"><template #prefix>@</template></ui-input>
|
||||
<ui-select v-if="select" v-model="selectedValue" autofocus>
|
||||
<option v-for="item in select.items" :value="item.value">{{ item.text }}</option>
|
||||
</ui-select>
|
||||
<ui-horizon-group no-grow class="buttons fit-bottom" v-if="!splash">
|
||||
<ui-button @click="ok" primary :autofocus="!input && !select && !user">{{ (showCancelButton || input || select || user) ? $t('@.ok') : $t('@.got-it') }}</ui-button>
|
||||
<ui-button @click="cancel" v-if="showCancelButton || input || select || user">{{ $t('@.cancel') }}</ui-button>
|
||||
</ui-horizon-group>
|
||||
</template>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -23,8 +28,10 @@ import Vue from 'vue';
|
||||
import anime from 'animejs';
|
||||
import { faTimesCircle, faQuestionCircle } from '@fortawesome/free-regular-svg-icons';
|
||||
import parseAcct from "../../../../../misc/acct/parse";
|
||||
import i18n from '../../../i18n';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n(),
|
||||
props: {
|
||||
type: {
|
||||
type: String,
|
||||
|
||||
@@ -64,6 +64,10 @@ export default Vue.extend({
|
||||
this.hukidasi = false;
|
||||
}
|
||||
|
||||
if (top < 0) {
|
||||
top = 0;
|
||||
}
|
||||
|
||||
popover.style.left = left + 'px';
|
||||
popover.style.top = top + 'px';
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="puqkfets" :class="{ mini }">
|
||||
<div class="puqkfets" :class="{ mini: narrow }">
|
||||
<mk-avatar class="avatar" :user="note.user"/>
|
||||
<fa icon="retweet"/>
|
||||
<i18n path="@.renoted-by" tag="span">
|
||||
@@ -30,13 +30,13 @@ export default Vue.extend({
|
||||
note: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
mini: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
}
|
||||
},
|
||||
inject: {
|
||||
narrow: {
|
||||
default: false
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -44,25 +44,20 @@ export default Vue.extend({
|
||||
.puqkfets
|
||||
display flex
|
||||
align-items center
|
||||
padding 16px 32px 8px 32px
|
||||
padding 8px 16px
|
||||
line-height 28px
|
||||
white-space pre
|
||||
color var(--renoteText)
|
||||
background linear-gradient(to bottom, var(--renoteGradient) 0%, var(--face) 100%)
|
||||
|
||||
&.mini
|
||||
&:not(.mini)
|
||||
padding 8px 16px
|
||||
|
||||
@media (min-width 500px)
|
||||
padding 16px
|
||||
padding 8px 16px
|
||||
|
||||
@media (min-width 600px)
|
||||
padding 16px 32px
|
||||
|
||||
> .avatar
|
||||
@media (min-width 500px)
|
||||
width 28px
|
||||
height 28px
|
||||
padding 16px 32px 8px 32px
|
||||
|
||||
> .avatar
|
||||
flex-shrink 0
|
||||
|
||||
@@ -1,16 +1,16 @@
|
||||
<template>
|
||||
<form class="mk-signin" :class="{ signing }" @submit.prevent="onSubmit">
|
||||
<div class="avatar" :style="{ backgroundImage: user ? `url('${ user.avatarUrl }')` : null }" v-show="withAvatar"></div>
|
||||
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @input="onUsernameChange" styl="fill">
|
||||
<ui-input v-model="username" type="text" pattern="^[a-zA-Z0-9_]+$" spellcheck="false" autofocus required @input="onUsernameChange">
|
||||
<span>{{ $t('username') }}</span>
|
||||
<template #prefix>@</template>
|
||||
<template #suffix>@{{ host }}</template>
|
||||
</ui-input>
|
||||
<ui-input v-model="password" type="password" :with-password-toggle="true" required styl="fill">
|
||||
<ui-input v-model="password" type="password" :with-password-toggle="true" required>
|
||||
<span>{{ $t('password') }}</span>
|
||||
<template #prefix><fa icon="lock"/></template>
|
||||
</ui-input>
|
||||
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required styl="fill">
|
||||
<ui-input v-if="user && user.twoFactorEnabled" v-model="token" type="number" required>
|
||||
<span>{{ $t('@.2fa') }}</span>
|
||||
<template #prefix><fa icon="gavel"/></template>
|
||||
</ui-input>
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
</blockquote>
|
||||
</div>
|
||||
<div v-else class="mk-url-preview">
|
||||
<a :class="{ mini, compact }" :href="url" target="_blank" :title="url" v-if="!fetching">
|
||||
<a :class="{ mini: narrow, compact }" :href="url" target="_blank" :title="url" v-if="!fetching">
|
||||
<div class="thumbnail" v-if="thumbnail" :style="`background-image: url('${thumbnail}')`"></div>
|
||||
<article>
|
||||
<header>
|
||||
@@ -125,10 +125,10 @@ export default Vue.extend({
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
},
|
||||
|
||||
mini: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
inject: {
|
||||
narrow: {
|
||||
default: false
|
||||
}
|
||||
},
|
||||
@@ -350,7 +350,7 @@ export default Vue.extend({
|
||||
|
||||
&.compact
|
||||
> .thumbnail
|
||||
position: absolute
|
||||
position absolute
|
||||
width 56px
|
||||
height 100%
|
||||
|
||||
@@ -368,7 +368,7 @@ export default Vue.extend({
|
||||
&.compact
|
||||
> article
|
||||
> header h1, p, footer
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
overflow hidden
|
||||
white-space nowrap
|
||||
text-overflow ellipsis
|
||||
</style>
|
||||
|
||||
@@ -66,10 +66,11 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
async pushList() {
|
||||
const t = this.$t('select-list'); // なぜか後で参照すると null になるので最初にメモリに確保しておく
|
||||
const lists = await this.$root.api('users/lists/list');
|
||||
const { canceled, result: listId } = await this.$root.dialog({
|
||||
type: null,
|
||||
title: this.$t('select-list'),
|
||||
title: t,
|
||||
select: {
|
||||
items: lists.map(list => ({
|
||||
value: list.id, text: list.title
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
<template>
|
||||
<div class="dnpfarvgbnfmyzbdquhhzyxcmstpdqzs" :class="{ naked, narrow, active, isStacked, draghover, dragging, dropready }"
|
||||
:data-mobile="$root.isMobile"
|
||||
@dragover.prevent.stop="onDragover"
|
||||
@dragleave="onDragleave"
|
||||
@drop.prevent.stop="onDrop"
|
||||
@@ -30,6 +31,8 @@ import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import Menu from '../../../common/views/components/menu.vue';
|
||||
import { countIf } from '../../../../../prelude/array';
|
||||
import { faArrowUp, faArrowDown } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faWindowMaximize } from '@fortawesome/free-regular-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('deck'),
|
||||
@@ -71,7 +74,8 @@ export default Vue.extend({
|
||||
active: true,
|
||||
dragging: false,
|
||||
draghover: false,
|
||||
dropready: false
|
||||
dropready: false,
|
||||
faArrowUp, faArrowDown
|
||||
};
|
||||
},
|
||||
|
||||
@@ -110,7 +114,7 @@ export default Vue.extend({
|
||||
column: this,
|
||||
isScrollTop: this.isScrollTop,
|
||||
count: v => this.count = v,
|
||||
inDeck: !this.naked
|
||||
inNakedDeckColumn: !this.naked
|
||||
};
|
||||
},
|
||||
|
||||
@@ -143,7 +147,7 @@ export default Vue.extend({
|
||||
|
||||
toggleActive() {
|
||||
if (!this.isStacked) return;
|
||||
const vms = this.$store.state.settings.deck.layout.find(ids => ids.indexOf(this.column.id) != -1).map(id => this.getColumnVm(id));
|
||||
const vms = this.$store.state.device.deck.layout.find(ids => ids.indexOf(this.column.id) != -1).map(id => this.getColumnVm(id));
|
||||
if (this.active && countIf(vm => vm.$el.classList.contains('active'), vms) == 1) return;
|
||||
this.active = !this.active;
|
||||
},
|
||||
@@ -176,50 +180,50 @@ export default Vue.extend({
|
||||
}
|
||||
}).then(({ canceled, result: name }) => {
|
||||
if (canceled) return;
|
||||
this.$store.dispatch('settings/renameDeckColumn', { id: this.column.id, name });
|
||||
this.$store.commit('device/renameDeckColumn', { id: this.column.id, name });
|
||||
});
|
||||
}
|
||||
}, null, {
|
||||
icon: 'arrow-left',
|
||||
text: this.$t('swap-left'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/swapLeftDeckColumn', this.column.id);
|
||||
this.$store.commit('device/swapLeftDeckColumn', this.column.id);
|
||||
}
|
||||
}, {
|
||||
icon: 'arrow-right',
|
||||
text: this.$t('swap-right'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/swapRightDeckColumn', this.column.id);
|
||||
this.$store.commit('device/swapRightDeckColumn', this.column.id);
|
||||
}
|
||||
}, this.isStacked ? {
|
||||
icon: 'arrow-up',
|
||||
icon: faArrowUp,
|
||||
text: this.$t('swap-up'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/swapUpDeckColumn', this.column.id);
|
||||
this.$store.commit('device/swapUpDeckColumn', this.column.id);
|
||||
}
|
||||
} : undefined, this.isStacked ? {
|
||||
icon: 'arrow-down',
|
||||
icon: faArrowDown,
|
||||
text: this.$t('swap-down'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/swapDownDeckColumn', this.column.id);
|
||||
this.$store.commit('device/swapDownDeckColumn', this.column.id);
|
||||
}
|
||||
} : undefined, null, {
|
||||
icon: ['far', 'window-restore'],
|
||||
text: this.$t('stack-left'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/stackLeftDeckColumn', this.column.id);
|
||||
this.$store.commit('device/stackLeftDeckColumn', this.column.id);
|
||||
}
|
||||
}, this.isStacked ? {
|
||||
icon: ['far', 'window-maximize'],
|
||||
icon: faWindowMaximize,
|
||||
text: this.$t('pop-right'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/popRightDeckColumn', this.column.id);
|
||||
this.$store.commit('device/popRightDeckColumn', this.column.id);
|
||||
}
|
||||
} : undefined, null, {
|
||||
icon: ['far', 'trash-alt'],
|
||||
text: this.$t('remove'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/removeDeckColumn', this.column.id);
|
||||
this.$store.commit('device/removeDeckColumn', this.column.id);
|
||||
}
|
||||
}];
|
||||
|
||||
@@ -303,7 +307,7 @@ export default Vue.extend({
|
||||
|
||||
const id = e.dataTransfer.getData('mk-deck-column');
|
||||
if (id != null && id != '') {
|
||||
this.$store.dispatch('settings/swapDeckColumn', {
|
||||
this.$store.commit('device/swapDeckColumn', {
|
||||
a: this.column.id,
|
||||
b: id
|
||||
});
|
||||
@@ -323,6 +327,13 @@ export default Vue.extend({
|
||||
box-shadow var(--shadow)
|
||||
overflow hidden
|
||||
|
||||
&[data-mobile]
|
||||
border-radius 0
|
||||
box-shadow none
|
||||
|
||||
> header
|
||||
box-shadow none
|
||||
|
||||
&.draghover
|
||||
box-shadow 0 0 0 2px var(--primaryAlpha08)
|
||||
|
||||
@@ -418,5 +429,6 @@ export default Vue.extend({
|
||||
height "calc(100% - %s)" % $header-height
|
||||
overflow auto
|
||||
overflow-x hidden
|
||||
-webkit-overflow-scrolling touch
|
||||
|
||||
</style>
|
||||
@@ -11,7 +11,7 @@
|
||||
<a :href="note.url || note.uri" target="_blank">{{ $t('@.view-on-remote') }}</a>
|
||||
</details>
|
||||
</div>
|
||||
<x-note :note="note" :detail="true" :mini="true"/>
|
||||
<mk-note :note="note" :detail="true"/>
|
||||
</div>
|
||||
</x-column>
|
||||
</template>
|
||||
@@ -21,14 +21,12 @@ import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import XColumn from './deck.column.vue';
|
||||
import XNotes from './deck.notes.vue';
|
||||
import XNote from '../components/note.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n(),
|
||||
components: {
|
||||
XColumn,
|
||||
XNotes,
|
||||
XNote
|
||||
},
|
||||
|
||||
data() {
|
||||
@@ -13,12 +13,12 @@
|
||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||
<component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="transition notes" ref="notes" tag="div">
|
||||
<template v-for="(note, i) in _notes">
|
||||
<x-note
|
||||
<mk-note
|
||||
:note="note"
|
||||
:key="note.id"
|
||||
@update:note="onNoteUpdated(i, $event)"
|
||||
:compact="true"
|
||||
:mini="true"/>
|
||||
/>
|
||||
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
|
||||
<span><fa icon="angle-up"/>{{ note._datetext }}</span>
|
||||
<span><fa icon="angle-down"/>{{ _notes[i + 1]._datetext }}</span>
|
||||
@@ -39,17 +39,12 @@
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import shouldMuteNote from '../../../common/scripts/should-mute-note';
|
||||
import XNote from '../components/note.vue';
|
||||
|
||||
const displayLimit = 20;
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n(),
|
||||
|
||||
components: {
|
||||
XNote
|
||||
},
|
||||
|
||||
inject: ['column', 'isScrollTop', 'count'],
|
||||
|
||||
props: {
|
||||
@@ -81,15 +81,15 @@
|
||||
</div>
|
||||
|
||||
<template v-if="notification.type == 'quote'">
|
||||
<x-note :note="notification.note" @update:note="onNoteUpdated" :mini="true"/>
|
||||
<mk-note :note="notification.note" @update:note="onNoteUpdated"/>
|
||||
</template>
|
||||
|
||||
<template v-if="notification.type == 'reply'">
|
||||
<x-note :note="notification.note" @update:note="onNoteUpdated" :mini="true"/>
|
||||
<mk-note :note="notification.note" @update:note="onNoteUpdated"/>
|
||||
</template>
|
||||
|
||||
<template v-if="notification.type == 'mention'">
|
||||
<x-note :note="notification.note" @update:note="onNoteUpdated" :mini="true"/>
|
||||
<mk-note :note="notification.note" @update:note="onNoteUpdated"/>
|
||||
</template>
|
||||
</div>
|
||||
</template>
|
||||
@@ -97,12 +97,8 @@
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import getNoteSummary from '../../../../../misc/get-note-summary';
|
||||
import XNote from '../components/note.vue';
|
||||
|
||||
export default Vue.extend({
|
||||
components: {
|
||||
XNote
|
||||
},
|
||||
props: ['notification'],
|
||||
data() {
|
||||
return {
|
||||
@@ -199,7 +199,7 @@ export default Vue.extend({
|
||||
display block
|
||||
width 100%
|
||||
padding 16px
|
||||
color #555
|
||||
color var(--text)
|
||||
border-top solid var(--lineWidth) rgba(#000, 0.05)
|
||||
|
||||
&:hover
|
||||
@@ -90,7 +90,7 @@ export default Vue.extend({
|
||||
|
||||
methods: {
|
||||
onChangeSettings(v) {
|
||||
this.$store.dispatch('settings/saveDeck');
|
||||
this.$store.commit('device/updateDeckColumn', this.column);
|
||||
},
|
||||
|
||||
focus() {
|
||||
@@ -3,7 +3,7 @@
|
||||
<ui-container v-if="user.pinnedNotes && user.pinnedNotes.length > 0" :body-togglable="true">
|
||||
<template #header><fa icon="thumbtack"/> {{ $t('pinned-notes') }}</template>
|
||||
<div>
|
||||
<x-note v-for="n in user.pinnedNotes" :key="n.id" :note="n" :mini="true"/>
|
||||
<mk-note v-for="n in user.pinnedNotes" :key="n.id" :note="n"/>
|
||||
</div>
|
||||
</ui-container>
|
||||
<ui-container v-if="images.length > 0" :body-togglable="true"
|
||||
@@ -40,7 +40,6 @@
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import XNotes from './deck.notes.vue';
|
||||
import XNote from '../components/note.vue';
|
||||
import { concat } from '../../../../../prelude/array';
|
||||
import ApexCharts from 'apexcharts';
|
||||
|
||||
@@ -51,7 +50,6 @@ export default Vue.extend({
|
||||
|
||||
components: {
|
||||
XNotes,
|
||||
XNote
|
||||
},
|
||||
|
||||
props: {
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<mk-ui :class="$style.root">
|
||||
<div class="qlvquzbjribqcaozciifydkngcwtyzje" ref="body" :style="style" :class="`${$store.state.device.deckColumnAlign} ${$store.state.device.deckColumnWidth}`" v-hotkey.global="keymap">
|
||||
<div class="qlvquzbjribqcaozciifydkngcwtyzje" :data-mobile="$root.isMobile" ref="body" :style="style" :class="`${$store.state.device.deckColumnAlign} ${$store.state.device.deckColumnWidth}`" v-hotkey.global="keymap">
|
||||
<template v-for="ids in layout">
|
||||
<div v-if="ids.length > 1" class="folder">
|
||||
<template v-for="id, i in ids">
|
||||
@@ -20,7 +20,6 @@ import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import XColumnCore from './deck.column-core.vue';
|
||||
import Menu from '../../../common/views/components/menu.vue';
|
||||
import MkUserListsWindow from '../components/user-lists-window.vue';
|
||||
|
||||
import * as uuid from 'uuid';
|
||||
|
||||
@@ -32,14 +31,14 @@ export default Vue.extend({
|
||||
|
||||
computed: {
|
||||
columns(): any[] {
|
||||
if (this.$store.state.settings.deck == null) return [];
|
||||
return this.$store.state.settings.deck.columns;
|
||||
if (this.$store.state.device.deck == null) return [];
|
||||
return this.$store.state.device.deck.columns;
|
||||
},
|
||||
|
||||
layout(): any[] {
|
||||
if (this.$store.state.settings.deck == null) return [];
|
||||
if (this.$store.state.settings.deck.layout == null) return this.$store.state.settings.deck.columns.map(c => [c.id]);
|
||||
return this.$store.state.settings.deck.layout;
|
||||
if (this.$store.state.device.deck == null) return [];
|
||||
if (this.$store.state.device.deck.layout == null) return this.$store.state.device.deck.columns.map(c => [c.id]);
|
||||
return this.$store.state.device.deck.layout;
|
||||
},
|
||||
|
||||
style(): any {
|
||||
@@ -69,45 +68,51 @@ export default Vue.extend({
|
||||
|
||||
provide() {
|
||||
return {
|
||||
getColumnVm: this.getColumnVm
|
||||
inDeck: true,
|
||||
getColumnVm: this.getColumnVm,
|
||||
narrow: true
|
||||
};
|
||||
},
|
||||
|
||||
created() {
|
||||
if (this.$store.state.settings.deck == null) {
|
||||
if (this.$store.state.device.deck == null) {
|
||||
const deck = {
|
||||
columns: [/*{
|
||||
type: 'widgets',
|
||||
widgets: []
|
||||
}, */{
|
||||
id: uuid(),
|
||||
type: 'home'
|
||||
type: 'home',
|
||||
name: null,
|
||||
}, {
|
||||
id: uuid(),
|
||||
type: 'notifications'
|
||||
type: 'notifications',
|
||||
name: null,
|
||||
}, {
|
||||
id: uuid(),
|
||||
type: 'local'
|
||||
type: 'local',
|
||||
name: null,
|
||||
}, {
|
||||
id: uuid(),
|
||||
type: 'global'
|
||||
type: 'global',
|
||||
name: null,
|
||||
}]
|
||||
};
|
||||
|
||||
deck.layout = deck.columns.map(c => [c.id]);
|
||||
|
||||
this.$store.dispatch('settings/set', {
|
||||
this.$store.commit('device/set', {
|
||||
key: 'deck',
|
||||
value: deck
|
||||
});
|
||||
}
|
||||
|
||||
// 互換性のため
|
||||
if (this.$store.state.settings.deck != null && this.$store.state.settings.deck.layout == null) {
|
||||
this.$store.dispatch('settings/set', {
|
||||
if (this.$store.state.device.deck != null && this.$store.state.device.deck.layout == null) {
|
||||
this.$store.commit('device/set', {
|
||||
key: 'deck',
|
||||
value: Object.assign({}, this.$store.state.settings.deck, {
|
||||
layout: this.$store.state.settings.deck.columns.map(c => [c.id])
|
||||
value: Object.assign({}, this.$store.state.device.deck, {
|
||||
layout: this.$store.state.device.deck.columns.map(c => [c.id])
|
||||
})
|
||||
});
|
||||
}
|
||||
@@ -134,7 +139,7 @@ export default Vue.extend({
|
||||
icon: 'home',
|
||||
text: this.$t('@deck.home'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/addDeckColumn', {
|
||||
this.$store.commit('device/addDeckColumn', {
|
||||
id: uuid(),
|
||||
type: 'home'
|
||||
});
|
||||
@@ -143,7 +148,7 @@ export default Vue.extend({
|
||||
icon: ['far', 'comments'],
|
||||
text: this.$t('@deck.local'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/addDeckColumn', {
|
||||
this.$store.commit('device/addDeckColumn', {
|
||||
id: uuid(),
|
||||
type: 'local'
|
||||
});
|
||||
@@ -152,7 +157,7 @@ export default Vue.extend({
|
||||
icon: 'share-alt',
|
||||
text: this.$t('@deck.hybrid'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/addDeckColumn', {
|
||||
this.$store.commit('device/addDeckColumn', {
|
||||
id: uuid(),
|
||||
type: 'hybrid'
|
||||
});
|
||||
@@ -161,7 +166,7 @@ export default Vue.extend({
|
||||
icon: 'globe',
|
||||
text: this.$t('@deck.global'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/addDeckColumn', {
|
||||
this.$store.commit('device/addDeckColumn', {
|
||||
id: uuid(),
|
||||
type: 'global'
|
||||
});
|
||||
@@ -170,7 +175,7 @@ export default Vue.extend({
|
||||
icon: 'at',
|
||||
text: this.$t('@deck.mentions'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/addDeckColumn', {
|
||||
this.$store.commit('device/addDeckColumn', {
|
||||
id: uuid(),
|
||||
type: 'mentions'
|
||||
});
|
||||
@@ -179,7 +184,7 @@ export default Vue.extend({
|
||||
icon: ['far', 'envelope'],
|
||||
text: this.$t('@deck.direct'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/addDeckColumn', {
|
||||
this.$store.commit('device/addDeckColumn', {
|
||||
id: uuid(),
|
||||
type: 'direct'
|
||||
});
|
||||
@@ -187,15 +192,23 @@ export default Vue.extend({
|
||||
}, {
|
||||
icon: 'list',
|
||||
text: this.$t('@deck.list'),
|
||||
action: () => {
|
||||
const w = this.$root.new(MkUserListsWindow);
|
||||
w.$once('choosen', list => {
|
||||
this.$store.dispatch('settings/addDeckColumn', {
|
||||
id: uuid(),
|
||||
type: 'list',
|
||||
list: list
|
||||
});
|
||||
w.close();
|
||||
action: async () => {
|
||||
const lists = await this.$root.api('users/lists/list');
|
||||
const { canceled, result: listId } = await this.$root.dialog({
|
||||
type: null,
|
||||
title: this.$t('@deck.select-list'),
|
||||
select: {
|
||||
items: lists.map(list => ({
|
||||
value: list.id, text: list.title
|
||||
}))
|
||||
},
|
||||
showCancelButton: true
|
||||
});
|
||||
if (canceled) return;
|
||||
this.$store.commit('device/addDeckColumn', {
|
||||
id: uuid(),
|
||||
type: 'list',
|
||||
list: lists.find(l => l.id === listId)
|
||||
});
|
||||
}
|
||||
}, {
|
||||
@@ -207,7 +220,7 @@ export default Vue.extend({
|
||||
input: true
|
||||
}).then(({ canceled, result: title }) => {
|
||||
if (canceled) return;
|
||||
this.$store.dispatch('settings/addDeckColumn', {
|
||||
this.$store.commit('device/addDeckColumn', {
|
||||
id: uuid(),
|
||||
type: 'hashtag',
|
||||
tagTlId: this.$store.state.settings.tagTimelines.find(x => x.title == title).id
|
||||
@@ -218,7 +231,7 @@ export default Vue.extend({
|
||||
icon: ['far', 'bell'],
|
||||
text: this.$t('@deck.notifications'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/addDeckColumn', {
|
||||
this.$store.commit('device/addDeckColumn', {
|
||||
id: uuid(),
|
||||
type: 'notifications'
|
||||
});
|
||||
@@ -227,7 +240,7 @@ export default Vue.extend({
|
||||
icon: 'calculator',
|
||||
text: this.$t('@deck.widgets'),
|
||||
action: () => {
|
||||
this.$store.dispatch('settings/addDeckColumn', {
|
||||
this.$store.commit('device/addDeckColumn', {
|
||||
id: uuid(),
|
||||
type: 'widgets',
|
||||
widgets: []
|
||||
@@ -316,6 +329,18 @@ export default Vue.extend({
|
||||
flex 1
|
||||
padding 16px 0 16px 16px
|
||||
overflow auto
|
||||
overflow-y hidden
|
||||
-webkit-overflow-scrolling touch
|
||||
|
||||
&[data-mobile]
|
||||
padding 0
|
||||
|
||||
> div
|
||||
margin-right 0
|
||||
|
||||
&.folder
|
||||
> *:not(:last-child)
|
||||
margin-bottom 0
|
||||
|
||||
> div
|
||||
margin-right 8px
|
||||
@@ -37,12 +37,12 @@
|
||||
>
|
||||
<div v-for="widget in column.widgets" class="customize-container" :key="widget.id" @contextmenu.stop.prevent="widgetFunc(widget.id)">
|
||||
<button class="remove" @click="removeWidget(widget)"><fa icon="times"/></button>
|
||||
<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="deck"/>
|
||||
<component :is="`mkw-${widget.name}`" :widget="widget" :ref="widget.id" :is-customize-mode="true" platform="deck" :column="column"/>
|
||||
</div>
|
||||
</x-draggable>
|
||||
</template>
|
||||
<template v-else>
|
||||
<component class="widget" v-for="widget in column.widgets" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" platform="deck"/>
|
||||
<component class="widget" v-for="widget in column.widgets" :is="`mkw-${widget.name}`" :key="widget.id" :ref="widget.id" :widget="widget" platform="deck" :column="column"/>
|
||||
</template>
|
||||
</div>
|
||||
</x-column>
|
||||
@@ -109,7 +109,7 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
addWidget() {
|
||||
this.$store.dispatch('settings/addDeckWidget', {
|
||||
this.$store.commit('device/addDeckWidget', {
|
||||
id: this.column.id,
|
||||
widget: {
|
||||
name: this.widgetAdderSelected,
|
||||
@@ -122,14 +122,14 @@ export default Vue.extend({
|
||||
},
|
||||
|
||||
removeWidget(widget) {
|
||||
this.$store.dispatch('settings/removeDeckWidget', {
|
||||
this.$store.commit('device/removeDeckWidget', {
|
||||
id: this.column.id,
|
||||
widget
|
||||
});
|
||||
},
|
||||
|
||||
saveWidgets() {
|
||||
this.$store.dispatch('settings/saveDeck');
|
||||
this.$store.commit('device/updateDeckColumn', this.column);
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -13,8 +13,8 @@
|
||||
<template #header><fa :icon="faHashtag" fixed-width/>{{ $t('popular-tags') }}</template>
|
||||
|
||||
<div class="vxjfqztj">
|
||||
<router-link v-for="tag in tagsLocal" :to="`/explore/tags/${tag.tag}`" :key="tag.tag" class="local">{{ tag.tag }}</router-link>
|
||||
<router-link v-for="tag in tagsRemote" :to="`/explore/tags/${tag.tag}`" :key="tag.tag">{{ tag.tag }}</router-link>
|
||||
<router-link v-for="tag in tagsLocal" :to="`/explore/tags/${tag.tag}`" :key="'local:' + tag.tag" class="local">{{ tag.tag }}</router-link>
|
||||
<router-link v-for="tag in tagsRemote" :to="`/explore/tags/${tag.tag}`" :key="'remote:' + tag.tag">{{ tag.tag }}</router-link>
|
||||
</div>
|
||||
</ui-container>
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
</svg>
|
||||
</div>
|
||||
<p class="fetching" v-if="fetching">{{ $t('fetching') }}<mk-ellipsis/></p>
|
||||
<h1 v-if="!fetching">{{ announcements.length == 0 ? this.$t('no-broadcasts') : announcements[i].title }}</h1>
|
||||
<h1 v-if="!fetching">{{ announcements.length == 0 ? $t('no-broadcasts') : announcements[i].title }}</h1>
|
||||
<p v-if="!fetching">
|
||||
<span v-if="announcements.length != 0" v-html="announcements[i].text"></span>
|
||||
<template v-if="announcements.length == 0">{{ $t('have-a-nice-day') }}</template>
|
||||
@@ -47,7 +47,7 @@ export default define({
|
||||
},
|
||||
mounted() {
|
||||
this.$root.getMeta().then(meta => {
|
||||
this.announcements = meta.broadcasts;
|
||||
this.announcements = meta.announcements;
|
||||
this.fetching = false;
|
||||
});
|
||||
},
|
||||
|
||||
@@ -13,7 +13,7 @@ import fuckAdBlock from '../common/scripts/fuck-ad-block';
|
||||
import composeNotification from '../common/scripts/compose-notification';
|
||||
|
||||
import MkHome from './views/home/home.vue';
|
||||
import MkDeck from './views/deck/deck.vue';
|
||||
import MkDeck from '../common/views/deck/deck.vue';
|
||||
import MkSelectDrive from './views/pages/selectdrive.vue';
|
||||
import MkDrive from './views/pages/drive.vue';
|
||||
import MkMessagingRoom from './views/pages/messaging-room.vue';
|
||||
@@ -123,30 +123,24 @@ init(async (launch, os) => {
|
||||
require('./views/components');
|
||||
require('./views/widgets');
|
||||
|
||||
os.store.commit('device/set', {
|
||||
key: 'inDeckMode',
|
||||
value: os.store.getters.isSignedIn && os.store.state.device.deckMode
|
||||
&& (document.location.pathname === '/' || window.performance.navigation.type === 1)
|
||||
});
|
||||
|
||||
// Init router
|
||||
const router = new VueRouter({
|
||||
mode: 'history',
|
||||
routes: [
|
||||
os.store.state.device.inDeckMode
|
||||
? { path: '/', name: 'index', component: MkDeck, children: [
|
||||
{ path: '/@:user', component: () => import('./views/deck/deck.user-column.vue').then(m => m.default), children: [
|
||||
{ path: '', name: 'user', component: () => import('./views/deck/deck.user-column.home.vue').then(m => m.default) },
|
||||
{ path: '/@:user', component: () => import('../common/views/deck/deck.user-column.vue').then(m => m.default), children: [
|
||||
{ path: '', name: 'user', component: () => import('../common/views/deck/deck.user-column.home.vue').then(m => m.default) },
|
||||
{ path: 'following', component: () => import('../common/views/pages/following.vue').then(m => m.default) },
|
||||
{ path: 'followers', component: () => import('../common/views/pages/followers.vue').then(m => m.default) },
|
||||
]},
|
||||
{ path: '/notes/:note', name: 'note', component: () => import('./views/deck/deck.note-column.vue').then(m => m.default) },
|
||||
{ path: '/search', component: () => import('./views/deck/deck.search-column.vue').then(m => m.default) },
|
||||
{ path: '/tags/:tag', name: 'tag', component: () => import('./views/deck/deck.hashtag-column.vue').then(m => m.default) },
|
||||
{ path: '/featured', name: 'featured', component: () => import('./views/deck/deck.featured-column.vue').then(m => m.default) },
|
||||
{ path: '/explore', name: 'explore', component: () => import('./views/deck/deck.explore-column.vue').then(m => m.default) },
|
||||
{ path: '/explore/tags/:tag', name: 'explore-tag', props: true, component: () => import('./views/deck/deck.explore-column.vue').then(m => m.default) },
|
||||
{ path: '/i/favorites', component: () => import('./views/deck/deck.favorites-column.vue').then(m => m.default) }
|
||||
{ path: '/notes/:note', name: 'note', component: () => import('../common/views/deck/deck.note-column.vue').then(m => m.default) },
|
||||
{ path: '/search', component: () => import('../common/views/deck/deck.search-column.vue').then(m => m.default) },
|
||||
{ path: '/tags/:tag', name: 'tag', component: () => import('../common/views/deck/deck.hashtag-column.vue').then(m => m.default) },
|
||||
{ path: '/featured', name: 'featured', component: () => import('../common/views/deck/deck.featured-column.vue').then(m => m.default) },
|
||||
{ path: '/explore', name: 'explore', component: () => import('../common/views/deck/deck.explore-column.vue').then(m => m.default) },
|
||||
{ path: '/explore/tags/:tag', name: 'explore-tag', props: true, component: () => import('../common/views/deck/deck.explore-column.vue').then(m => m.default) },
|
||||
{ path: '/i/favorites', component: () => import('../common/views/deck/deck.favorites-column.vue').then(m => m.default) }
|
||||
]}
|
||||
: { path: '/', component: MkHome, children: [
|
||||
{ path: '', name: 'index', component: MkHomeTimeline },
|
||||
|
||||
@@ -2,6 +2,7 @@ import Vue from 'vue';
|
||||
|
||||
import ui from './ui.vue';
|
||||
import uiNotification from './ui-notification.vue';
|
||||
import note from './note.vue';
|
||||
import notes from './notes.vue';
|
||||
import subNoteContent from './sub-note-content.vue';
|
||||
import window from './window.vue';
|
||||
@@ -20,6 +21,7 @@ import uiContainer from './ui-container.vue';
|
||||
|
||||
Vue.component('mk-ui', ui);
|
||||
Vue.component('mk-ui-notification', uiNotification);
|
||||
Vue.component('mk-note', note);
|
||||
Vue.component('mk-notes', notes);
|
||||
Vue.component('mk-sub-note-content', subNoteContent);
|
||||
Vue.component('mk-window', window);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="qiziqtywpuaucsgarwajitwaakggnisj" :title="title">
|
||||
<mk-avatar class="avatar" :user="note.user" v-if="!mini"/>
|
||||
<mk-avatar class="avatar" :user="note.user" v-if="!narrow"/>
|
||||
<div class="main">
|
||||
<mk-note-header class="header" :note="note" :mini="true"/>
|
||||
<div class="body">
|
||||
@@ -25,9 +25,10 @@ export default Vue.extend({
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
mini: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
},
|
||||
|
||||
inject: {
|
||||
narrow: {
|
||||
default: false
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="tkfdzaxtkdeianobciwadajxzbddorql" :class="{ mini }" :title="title">
|
||||
<div class="tkfdzaxtkdeianobciwadajxzbddorql" :class="{ mini: narrow }" :title="title">
|
||||
<mk-avatar class="avatar" :user="note.user"/>
|
||||
<div class="main">
|
||||
<mk-note-header class="header" :note="note"/>
|
||||
@@ -24,10 +24,11 @@ export default Vue.extend({
|
||||
note: {
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
mini: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
}
|
||||
},
|
||||
|
||||
inject: {
|
||||
narrow: {
|
||||
default: false
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
<template>
|
||||
<div
|
||||
class="note"
|
||||
:class="{ mini }"
|
||||
:class="{ mini: narrow }"
|
||||
v-show="(this.$store.state.settings.remainDeletedNote || appearNote.deletedAt == null) && !hideThisNote"
|
||||
:tabindex="appearNote.deletedAt == null ? '-1' : null"
|
||||
v-hotkey="keymap"
|
||||
:title="title"
|
||||
>
|
||||
<div class="conversation" v-if="detail && conversation.length > 0">
|
||||
<x-sub v-for="note in conversation" :key="note.id" :note="note" :mini="mini"/>
|
||||
<x-sub v-for="note in conversation" :key="note.id" :note="note"/>
|
||||
</div>
|
||||
<div class="reply-to" v-if="appearNote.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)">
|
||||
<x-sub :note="appearNote.reply" :mini="mini"/>
|
||||
<x-sub :note="appearNote.reply"/>
|
||||
</div>
|
||||
<mk-renote class="renote" v-if="isRenote" :note="note"/>
|
||||
<article>
|
||||
<article class="article">
|
||||
<mk-avatar class="avatar" :user="appearNote.user"/>
|
||||
<div class="main">
|
||||
<mk-note-header class="header" :note="appearNote" :mini="mini"/>
|
||||
<mk-note-header class="header" :note="appearNote"/>
|
||||
<div class="body" v-if="appearNote.deletedAt == null">
|
||||
<p v-if="appearNote.cw != null" class="cw">
|
||||
<mfm v-if="appearNote.cw != ''" class="text" :text="appearNote.cw" :author="appearNote.user" :i="$store.state.i" :custom-emojis="appearNote.emojis" />
|
||||
@@ -35,12 +35,12 @@
|
||||
</div>
|
||||
<mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/>
|
||||
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> 位置情報</a>
|
||||
<div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote" :mini="mini"/></div>
|
||||
<mk-url-preview v-for="url in urls" :url="url" :key="url" :mini="mini" :compact="compact"/>
|
||||
<div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote"/></div>
|
||||
<mk-url-preview v-for="url in urls" :url="url" :key="url" :compact="compact"/>
|
||||
</div>
|
||||
</div>
|
||||
<footer v-if="appearNote.deletedAt == null">
|
||||
<span class="app" v-if="appearNote.app && mini && $store.state.settings.showVia">via <b>{{ appearNote.app.name }}</b></span>
|
||||
<span class="app" v-if="appearNote.app && narrow && $store.state.settings.showVia">via <b>{{ appearNote.app.name }}</b></span>
|
||||
<mk-reactions-viewer :note="appearNote" ref="reactionsViewer"/>
|
||||
<button class="replyButton" @click="reply()" :title="$t('reply')">
|
||||
<template v-if="appearNote.reply"><fa icon="reply-all"/></template>
|
||||
@@ -70,7 +70,7 @@
|
||||
</div>
|
||||
</article>
|
||||
<div class="replies" v-if="detail && replies.length > 0">
|
||||
<x-sub v-for="note in replies" :key="note.id" :note="note" :mini="mini"/>
|
||||
<x-sub v-for="note in replies" :key="note.id" :note="note"/>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -110,9 +110,10 @@ export default Vue.extend({
|
||||
required: false,
|
||||
default: false
|
||||
},
|
||||
mini: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
},
|
||||
|
||||
inject: {
|
||||
narrow: {
|
||||
default: false
|
||||
}
|
||||
},
|
||||
@@ -152,7 +153,7 @@ export default Vue.extend({
|
||||
border-bottom solid var(--lineWidth) var(--faceDivider)
|
||||
|
||||
&.mini
|
||||
font-size 14px
|
||||
font-size 13px
|
||||
|
||||
> .renote
|
||||
padding 8px 16px 0 16px
|
||||
@@ -161,7 +162,7 @@ export default Vue.extend({
|
||||
width 20px
|
||||
height 20px
|
||||
|
||||
> article
|
||||
> .article
|
||||
padding 16px 16px 4px
|
||||
|
||||
> .avatar
|
||||
@@ -189,7 +190,7 @@ export default Vue.extend({
|
||||
> .renote + article
|
||||
padding-top 8px
|
||||
|
||||
> article
|
||||
> .article
|
||||
display flex
|
||||
padding 28px 32px 18px 32px
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||
<component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="notes transition" tag="div" ref="notes">
|
||||
<template v-for="(note, i) in _notes">
|
||||
<x-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)" :compact="true" ref="note"/>
|
||||
<mk-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)" :compact="true" ref="note"/>
|
||||
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
|
||||
<span><fa icon="angle-up"/>{{ note._datetext }}</span>
|
||||
<span><fa icon="angle-down"/>{{ _notes[i + 1]._datetext }}</span>
|
||||
@@ -39,17 +39,12 @@ import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import * as config from '../../../config';
|
||||
import shouldMuteNote from '../../../common/scripts/should-mute-note';
|
||||
import XNote from './note.vue';
|
||||
|
||||
const displayLimit = 30;
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n(),
|
||||
|
||||
components: {
|
||||
XNote
|
||||
},
|
||||
|
||||
props: {
|
||||
makePromise: {
|
||||
required: true
|
||||
|
||||
@@ -115,18 +115,18 @@
|
||||
<ui-switch v-model="remainDeletedNote">{{ $t('remain-deleted-note') }}</ui-switch>
|
||||
</section>
|
||||
<section>
|
||||
<header>{{ $t('deck-column-align') }}</header>
|
||||
<ui-radio v-model="deckColumnAlign" value="center">{{ $t('deck-column-align-center') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnAlign" value="left">{{ $t('deck-column-align-left') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnAlign" value="flexible">{{ $t('deck-column-align-flexible') }}</ui-radio>
|
||||
<header>{{ $t('@.deck-column-align') }}</header>
|
||||
<ui-radio v-model="deckColumnAlign" value="center">{{ $t('@.deck-column-align-center') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnAlign" value="left">{{ $t('@.deck-column-align-left') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnAlign" value="flexible">{{ $t('@.deck-column-align-flexible') }}</ui-radio>
|
||||
</section>
|
||||
<section>
|
||||
<header>{{ $t('deck-column-width') }}</header>
|
||||
<ui-radio v-model="deckColumnWidth" value="narrow">{{ $t('deck-column-width-narrow') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnWidth" value="narrower">{{ $t('deck-column-width-narrower') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnWidth" value="normal">{{ $t('deck-column-width-normal') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnWidth" value="wider">{{ $t('deck-column-width-wider') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnWidth" value="wide">{{ $t('deck-column-width-wide') }}</ui-radio>
|
||||
<header>{{ $t('@.deck-column-width') }}</header>
|
||||
<ui-radio v-model="deckColumnWidth" value="narrow">{{ $t('@.deck-column-width-narrow') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnWidth" value="narrower">{{ $t('@.deck-column-width-narrower') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnWidth" value="normal">{{ $t('@.deck-column-width-normal') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnWidth" value="wider">{{ $t('@.deck-column-width-wider') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnWidth" value="wide">{{ $t('@.deck-column-width-wide') }}</ui-radio>
|
||||
</section>
|
||||
<section>
|
||||
<ui-switch v-model="games_reversi_showBoardLabels">{{ $t('@.show-reversi-board-labels') }}</ui-switch>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="kedshtep" :class="{ naked, inDeck }">
|
||||
<div class="kedshtep" :class="{ naked, inNakedDeckColumn }">
|
||||
<header v-if="showHeader">
|
||||
<div class="title"><slot name="header"></slot></div>
|
||||
<slot name="func"></slot>
|
||||
@@ -36,7 +36,7 @@ export default Vue.extend({
|
||||
},
|
||||
},
|
||||
inject: {
|
||||
inDeck: {
|
||||
inNakedDeckColumn: {
|
||||
default: false
|
||||
}
|
||||
},
|
||||
@@ -58,7 +58,7 @@ export default Vue.extend({
|
||||
.kedshtep
|
||||
overflow hidden
|
||||
|
||||
&:not(.inDeck)
|
||||
&:not(.inNakedDeckColumn)
|
||||
background var(--face)
|
||||
box-shadow var(--shadow)
|
||||
border-radius var(--round)
|
||||
@@ -106,7 +106,7 @@ export default Vue.extend({
|
||||
&:active
|
||||
color var(--faceTextButtonActive)
|
||||
|
||||
&.inDeck
|
||||
&.inNakedDeckColumn
|
||||
background var(--face)
|
||||
|
||||
> header
|
||||
|
||||
@@ -174,7 +174,7 @@ export default Vue.extend({
|
||||
this.meta = meta;
|
||||
this.name = meta.name;
|
||||
this.description = meta.description;
|
||||
this.announcements = meta.broadcasts;
|
||||
this.announcements = meta.announcements;
|
||||
this.banner = meta.bannerUrl;
|
||||
});
|
||||
|
||||
|
||||
@@ -504,6 +504,13 @@ export default (callback: (launch: (router: VueRouter) => [Vue, MiOS], os: MiOS)
|
||||
return [app, os] as [Vue, MiOS];
|
||||
};
|
||||
|
||||
// Deck mode
|
||||
os.store.commit('device/set', {
|
||||
key: 'inDeckMode',
|
||||
value: os.store.getters.isSignedIn && os.store.state.device.deckMode
|
||||
&& (document.location.pathname === '/' || window.performance.navigation.type === 1)
|
||||
});
|
||||
|
||||
callback(launch, os);
|
||||
});
|
||||
};
|
||||
|
||||
@@ -283,7 +283,7 @@ export default class MiOS extends EventEmitter {
|
||||
});
|
||||
|
||||
main.on('widgetUpdated', x => {
|
||||
this.store.commit('settings/setWidget', {
|
||||
this.store.commit('settings/updateWidget', {
|
||||
id: x.id,
|
||||
data: x.data
|
||||
});
|
||||
|
||||
@@ -11,10 +11,10 @@ import './style.styl';
|
||||
import init from '../init';
|
||||
|
||||
import MkIndex from './views/pages/index.vue';
|
||||
import MkDeck from '../common/views/deck/deck.vue';
|
||||
import MkSignup from './views/pages/signup.vue';
|
||||
import MkSelectDrive from './views/pages/selectdrive.vue';
|
||||
import MkDrive from './views/pages/drive.vue';
|
||||
import MkNotifications from './views/pages/notifications.vue';
|
||||
import MkWidgets from './views/pages/widgets.vue';
|
||||
import MkMessaging from './views/pages/messaging.vue';
|
||||
import MkMessagingRoom from './views/pages/messaging-room.vue';
|
||||
@@ -37,7 +37,7 @@ import FolderChooser from './views/components/drive-folder-chooser.vue';
|
||||
/**
|
||||
* init
|
||||
*/
|
||||
init((launch) => {
|
||||
init((launch, os) => {
|
||||
Vue.mixin({
|
||||
data() {
|
||||
return {
|
||||
@@ -114,10 +114,26 @@ init((launch) => {
|
||||
const router = new VueRouter({
|
||||
mode: 'history',
|
||||
routes: [
|
||||
{ path: '/', name: 'index', component: MkIndex },
|
||||
...(os.store.state.device.inDeckMode
|
||||
? [{ path: '/', name: 'index', component: MkDeck, children: [
|
||||
{ path: '/@:user', component: () => import('../common/views/deck/deck.user-column.vue').then(m => m.default), children: [
|
||||
{ path: '', name: 'user', component: () => import('../common/views/deck/deck.user-column.home.vue').then(m => m.default) },
|
||||
{ path: 'following', component: () => import('../common/views/pages/following.vue').then(m => m.default) },
|
||||
{ path: 'followers', component: () => import('../common/views/pages/followers.vue').then(m => m.default) },
|
||||
]},
|
||||
{ path: '/notes/:note', name: 'note', component: () => import('../common/views/deck/deck.note-column.vue').then(m => m.default) },
|
||||
{ path: '/search', component: () => import('../common/views/deck/deck.search-column.vue').then(m => m.default) },
|
||||
{ path: '/tags/:tag', name: 'tag', component: () => import('../common/views/deck/deck.hashtag-column.vue').then(m => m.default) },
|
||||
{ path: '/featured', name: 'featured', component: () => import('../common/views/deck/deck.featured-column.vue').then(m => m.default) },
|
||||
{ path: '/explore', name: 'explore', component: () => import('../common/views/deck/deck.explore-column.vue').then(m => m.default) },
|
||||
{ path: '/explore/tags/:tag', name: 'explore-tag', props: true, component: () => import('../common/views/deck/deck.explore-column.vue').then(m => m.default) },
|
||||
{ path: '/i/favorites', component: () => import('../common/views/deck/deck.favorites-column.vue').then(m => m.default) }
|
||||
]}]
|
||||
: [
|
||||
{ path: '/', name: 'index', component: MkIndex },
|
||||
]),
|
||||
{ path: '/signup', name: 'signup', component: MkSignup },
|
||||
{ path: '/i/settings', name: 'settings', component: () => import('./views/pages/settings.vue').then(m => m.default) },
|
||||
{ path: '/i/notifications', name: 'notifications', component: MkNotifications },
|
||||
{ path: '/i/favorites', name: 'favorites', component: MkFavorites },
|
||||
{ path: '/i/lists', name: 'user-lists', component: MkUserLists },
|
||||
{ path: '/i/lists/:list', name: 'user-list', component: MkUserList },
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="yohlumlkhizgfkvvscwfcrcggkotpvry" :class="{ smart: $store.state.device.postStyle == 'smart' }">
|
||||
<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/>
|
||||
<div class="yohlumlkhizgfkvvscwfcrcggkotpvry" :class="{ smart: $store.state.device.postStyle == 'smart', mini: narrow }">
|
||||
<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart' && !narrow"/>
|
||||
<div class="main">
|
||||
<mk-note-header class="header" :note="note" :mini="true"/>
|
||||
<div class="body">
|
||||
@@ -27,6 +27,12 @@ export default Vue.extend({
|
||||
}
|
||||
},
|
||||
|
||||
inject: {
|
||||
narrow: {
|
||||
default: false
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
showContent: false
|
||||
@@ -43,11 +49,25 @@ export default Vue.extend({
|
||||
overflow hidden
|
||||
font-size 10px
|
||||
|
||||
@media (min-width 350px)
|
||||
font-size 12px
|
||||
&:not(.mini)
|
||||
|
||||
@media (min-width 500px)
|
||||
font-size 14px
|
||||
@media (min-width 350px)
|
||||
font-size 12px
|
||||
|
||||
@media (min-width 500px)
|
||||
font-size 14px
|
||||
|
||||
> .avatar
|
||||
|
||||
@media (min-width 350px)
|
||||
margin 0 10px 0 0
|
||||
width 44px
|
||||
height 44px
|
||||
|
||||
@media (min-width 500px)
|
||||
margin 0 12px 0 0
|
||||
width 48px
|
||||
height 48px
|
||||
|
||||
&.smart
|
||||
> .main
|
||||
@@ -64,16 +84,6 @@ export default Vue.extend({
|
||||
height 40px
|
||||
border-radius 8px
|
||||
|
||||
@media (min-width 350px)
|
||||
margin 0 10px 0 0
|
||||
width 44px
|
||||
height 44px
|
||||
|
||||
@media (min-width 500px)
|
||||
margin 0 12px 0 0
|
||||
width 48px
|
||||
height 48px
|
||||
|
||||
> .main
|
||||
flex 1
|
||||
min-width 0
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="zlrxdaqttccpwhpaagdmkawtzklsccam" :class="{ smart: $store.state.device.postStyle == 'smart' }">
|
||||
<div class="zlrxdaqttccpwhpaagdmkawtzklsccam" :class="{ smart: $store.state.device.postStyle == 'smart', mini: narrow }">
|
||||
<mk-avatar class="avatar" :user="note.user" v-if="$store.state.device.postStyle != 'smart'"/>
|
||||
<div class="main">
|
||||
<mk-note-header class="header" :note="note" :mini="true"/>
|
||||
@@ -32,6 +32,12 @@ export default Vue.extend({
|
||||
}
|
||||
},
|
||||
|
||||
inject: {
|
||||
narrow: {
|
||||
default: false
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
showContent: false
|
||||
@@ -47,14 +53,28 @@ export default Vue.extend({
|
||||
font-size 10px
|
||||
background var(--subNoteBg)
|
||||
|
||||
@media (min-width 350px)
|
||||
font-size 12px
|
||||
&:not(.mini)
|
||||
|
||||
@media (min-width 500px)
|
||||
font-size 14px
|
||||
@media (min-width 350px)
|
||||
font-size 12px
|
||||
|
||||
@media (min-width 600px)
|
||||
padding 24px 32px
|
||||
@media (min-width 500px)
|
||||
font-size 14px
|
||||
|
||||
@media (min-width 600px)
|
||||
padding 24px 32px
|
||||
|
||||
> .avatar
|
||||
|
||||
@media (min-width 350px)
|
||||
margin-right 10px
|
||||
width 42px
|
||||
height 42px
|
||||
|
||||
@media (min-width 500px)
|
||||
margin-right 14px
|
||||
width 50px
|
||||
height 50px
|
||||
|
||||
&.smart
|
||||
> .main
|
||||
@@ -71,16 +91,6 @@ export default Vue.extend({
|
||||
height 38px
|
||||
border-radius 8px
|
||||
|
||||
@media (min-width 350px)
|
||||
margin-right 10px
|
||||
width 42px
|
||||
height 42px
|
||||
|
||||
@media (min-width 500px)
|
||||
margin-right 14px
|
||||
width 50px
|
||||
height 50px
|
||||
|
||||
> .main
|
||||
flex 1
|
||||
min-width 0
|
||||
|
||||
@@ -3,14 +3,14 @@
|
||||
class="note"
|
||||
v-show="appearNote.deletedAt == null && !hideThisNote"
|
||||
:tabindex="appearNote.deletedAt == null ? '-1' : null"
|
||||
:class="{ renote: isRenote, smart: $store.state.device.postStyle == 'smart' }"
|
||||
:class="{ renote: isRenote, smart: $store.state.device.postStyle == 'smart', mini: narrow }"
|
||||
v-hotkey="keymap"
|
||||
>
|
||||
<div class="reply-to" v-if="appearNote.reply && (!$store.getters.isSignedIn || $store.state.settings.showReplyTarget)">
|
||||
<x-sub :note="appearNote.reply"/>
|
||||
</div>
|
||||
<mk-renote class="renote" v-if="isRenote" :note="note" mini/>
|
||||
<article>
|
||||
<mk-renote class="renote" v-if="isRenote" :note="note"/>
|
||||
<article class="article">
|
||||
<mk-avatar class="avatar" :user="appearNote.user" v-if="$store.state.device.postStyle != 'smart'"/>
|
||||
<div class="main">
|
||||
<mk-note-header class="header" :note="appearNote" :mini="true"/>
|
||||
@@ -30,7 +30,7 @@
|
||||
<mk-media-list :media-list="appearNote.files"/>
|
||||
</div>
|
||||
<mk-poll v-if="appearNote.poll" :note="appearNote" ref="pollViewer"/>
|
||||
<mk-url-preview v-for="url in urls" :url="url" :key="url" :compact="compact"/>
|
||||
<mk-url-preview v-for="url in urls" :url="url" :key="url" :compact="true"/>
|
||||
<a class="location" v-if="appearNote.geo" :href="`https://maps.google.com/maps?q=${appearNote.geo.coordinates[1]},${appearNote.geo.coordinates[0]}`" target="_blank"><fa icon="map-marker-alt"/> {{ $t('location') }}</a>
|
||||
<div class="renote" v-if="appearNote.renote"><mk-note-preview :note="appearNote.renote"/></div>
|
||||
</div>
|
||||
@@ -91,19 +91,20 @@ export default Vue.extend({
|
||||
type: Object,
|
||||
required: true
|
||||
},
|
||||
compact: {
|
||||
type: Boolean,
|
||||
required: false,
|
||||
},
|
||||
|
||||
inject: {
|
||||
narrow: {
|
||||
default: false
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.note
|
||||
overflow hidden
|
||||
font-size 12px
|
||||
font-size 13px
|
||||
border-bottom solid var(--lineWidth) var(--faceDivider)
|
||||
|
||||
&:focus
|
||||
@@ -123,29 +124,53 @@ export default Vue.extend({
|
||||
&:last-of-type
|
||||
border-bottom none
|
||||
|
||||
@media (min-width 350px)
|
||||
font-size 14px
|
||||
&:not(.mini)
|
||||
|
||||
@media (min-width 500px)
|
||||
font-size 16px
|
||||
@media (min-width 350px)
|
||||
font-size 14px
|
||||
|
||||
@media (min-width 500px)
|
||||
font-size 16px
|
||||
|
||||
> .article
|
||||
@media (min-width 600px)
|
||||
padding 32px 32px 22px
|
||||
|
||||
> .avatar
|
||||
@media (min-width 350px)
|
||||
width 48px
|
||||
height 48px
|
||||
border-radius 6px
|
||||
|
||||
@media (min-width 500px)
|
||||
margin-right 16px
|
||||
width 58px
|
||||
height 58px
|
||||
border-radius 8px
|
||||
|
||||
> .main
|
||||
> .header
|
||||
@media (min-width 500px)
|
||||
margin-bottom 2px
|
||||
|
||||
> .body
|
||||
@media (min-width 700px)
|
||||
font-size 1.1em
|
||||
|
||||
&.smart
|
||||
> article
|
||||
> .article
|
||||
> .main
|
||||
> header
|
||||
align-items center
|
||||
margin-bottom 4px
|
||||
|
||||
> .renote + article
|
||||
> .renote + .article
|
||||
padding-top 8px
|
||||
|
||||
> article
|
||||
> .article
|
||||
display flex
|
||||
padding 16px 16px 9px
|
||||
|
||||
@media (min-width 600px)
|
||||
padding 32px 32px 22px
|
||||
|
||||
> .avatar
|
||||
flex-shrink 0
|
||||
display block
|
||||
@@ -157,29 +182,11 @@ export default Vue.extend({
|
||||
//position sticky
|
||||
//top 62px
|
||||
|
||||
@media (min-width 350px)
|
||||
width 48px
|
||||
height 48px
|
||||
border-radius 6px
|
||||
|
||||
@media (min-width 500px)
|
||||
margin-right 16px
|
||||
width 58px
|
||||
height 58px
|
||||
border-radius 8px
|
||||
|
||||
> .main
|
||||
flex 1
|
||||
min-width 0
|
||||
|
||||
> .header
|
||||
@media (min-width 500px)
|
||||
margin-bottom 2px
|
||||
|
||||
> .body
|
||||
@media (min-width 700px)
|
||||
font-size 1.1em
|
||||
|
||||
> .cw
|
||||
cursor default
|
||||
display block
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
<!-- トランジションを有効にするとなぜかメモリリークする -->
|
||||
<component :is="!$store.state.device.reduceMotion ? 'transition-group' : 'div'" name="mk-notes" class="transition" tag="div">
|
||||
<template v-for="(note, i) in _notes">
|
||||
<mk-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)" :compact="true"/>
|
||||
<mk-note :note="note" :key="note.id" @update:note="onNoteUpdated(i, $event)"/>
|
||||
<p class="date" :key="note.id + '_date'" v-if="i != notes.length - 1 && note._date != _notes[i + 1]._date">
|
||||
<span><fa icon="angle-up"/>{{ note._datetext }}</span>
|
||||
<span><fa icon="angle-down"/>{{ _notes[i + 1]._datetext }}</span>
|
||||
|
||||
@@ -116,15 +116,6 @@ export default Vue.extend({
|
||||
font-size 12px
|
||||
overflow-wrap break-word
|
||||
|
||||
@media (min-width 350px)
|
||||
font-size 14px
|
||||
|
||||
@media (min-width 500px)
|
||||
font-size 16px
|
||||
|
||||
@media (min-width 600px)
|
||||
padding 24px 32px
|
||||
|
||||
&:after
|
||||
content ""
|
||||
display block
|
||||
@@ -137,18 +128,11 @@ export default Vue.extend({
|
||||
height 36px
|
||||
border-radius 6px
|
||||
|
||||
@media (min-width 500px)
|
||||
width 42px
|
||||
height 42px
|
||||
|
||||
> div
|
||||
float right
|
||||
width calc(100% - 36px)
|
||||
padding-left 8px
|
||||
|
||||
@media (min-width 500px)
|
||||
width calc(100% - 42px)
|
||||
|
||||
> header
|
||||
display flex
|
||||
align-items baseline
|
||||
|
||||
@@ -131,15 +131,6 @@ export default Vue.extend({
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.mk-notifications
|
||||
margin 0 auto
|
||||
background var(--face)
|
||||
border-radius 8px
|
||||
box-shadow 0 0 2px rgba(#000, 0.1)
|
||||
overflow hidden
|
||||
|
||||
@media (min-width 500px)
|
||||
box-shadow 0 8px 32px rgba(#000, 0.1)
|
||||
|
||||
.transition
|
||||
.mk-notifications-enter
|
||||
.mk-notifications-leave-to
|
||||
@@ -187,10 +178,7 @@ export default Vue.extend({
|
||||
color var(--text)
|
||||
|
||||
> .placeholder
|
||||
padding 16px
|
||||
padding 32px
|
||||
opacity 0.3
|
||||
|
||||
@media (min-width 500px)
|
||||
padding 32px
|
||||
|
||||
</style>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="ukygtjoj" :class="{ naked, hideHeader: !showHeader }">
|
||||
<div class="ukygtjoj" :class="{ naked, inDeck, inNakedDeckColumn, hideHeader: !showHeader }">
|
||||
<header v-if="showHeader">
|
||||
<div class="title"><slot name="header"></slot></div>
|
||||
<slot name="func"></slot>
|
||||
@@ -35,6 +35,14 @@ export default Vue.extend({
|
||||
default: true
|
||||
},
|
||||
},
|
||||
inject: {
|
||||
inDeck: {
|
||||
default: false
|
||||
},
|
||||
inNakedDeckColumn: {
|
||||
default: false
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
showBody: this.expanded
|
||||
@@ -50,49 +58,72 @@ export default Vue.extend({
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.ukygtjoj
|
||||
background var(--face)
|
||||
border-radius 8px
|
||||
box-shadow 0 4px 16px rgba(#000, 0.1)
|
||||
overflow hidden
|
||||
|
||||
& + .ukygtjoj
|
||||
margin-top 16px
|
||||
|
||||
@media (max-width 500px)
|
||||
margin-top 8px
|
||||
|
||||
&.naked
|
||||
background transparent !important
|
||||
&.inDeck
|
||||
box-shadow none !important
|
||||
|
||||
> header
|
||||
> .title
|
||||
&:not(.inNakedDeckColumn)
|
||||
background var(--face)
|
||||
border-radius 8px
|
||||
box-shadow 0 4px 16px rgba(#000, 0.1)
|
||||
|
||||
& + .ukygtjoj
|
||||
margin-top 16px
|
||||
|
||||
@media (max-width 500px)
|
||||
margin-top 8px
|
||||
|
||||
&.naked
|
||||
background transparent !important
|
||||
box-shadow none !important
|
||||
|
||||
> header
|
||||
> .title
|
||||
margin 0
|
||||
padding 8px 10px
|
||||
font-size 15px
|
||||
font-weight normal
|
||||
color var(--faceHeaderText)
|
||||
background var(--faceHeader)
|
||||
border-radius 8px 8px 0 0
|
||||
|
||||
> [data-icon]
|
||||
margin-right 6px
|
||||
|
||||
&:empty
|
||||
display none
|
||||
|
||||
> button
|
||||
position absolute
|
||||
z-index 2
|
||||
top 0
|
||||
right 0
|
||||
padding 0
|
||||
width 42px
|
||||
height 100%
|
||||
font-size 15px
|
||||
color var(--faceTextButton)
|
||||
|
||||
> div
|
||||
color var(--text)
|
||||
|
||||
&.inNakedDeckColumn
|
||||
background var(--face)
|
||||
|
||||
> header
|
||||
margin 0
|
||||
padding 8px 10px
|
||||
font-size 15px
|
||||
font-weight normal
|
||||
color var(--faceHeaderText)
|
||||
background var(--faceHeader)
|
||||
border-radius 8px 8px 0 0
|
||||
padding 8px 16px
|
||||
font-size 12px
|
||||
color var(--text)
|
||||
background var(--deckColumnBg)
|
||||
|
||||
> [data-icon]
|
||||
margin-right 6px
|
||||
|
||||
&:empty
|
||||
display none
|
||||
|
||||
> button
|
||||
position absolute
|
||||
z-index 2
|
||||
top 0
|
||||
right 0
|
||||
padding 0
|
||||
width 42px
|
||||
height 100%
|
||||
font-size 15px
|
||||
color var(--faceTextButton)
|
||||
|
||||
> div
|
||||
color var(--text)
|
||||
> button
|
||||
position absolute
|
||||
top 0
|
||||
right 8px
|
||||
padding 8px 6px
|
||||
font-size 14px
|
||||
color var(--text)
|
||||
|
||||
</style>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<div class="backdrop"></div>
|
||||
<div class="content" ref="mainContainer">
|
||||
<button class="nav" @click="$parent.isDrawerOpening = true"><fa icon="bars"/></button>
|
||||
<i v-if="hasUnreadNotification || hasUnreadMessagingMessage || hasGameInvitation" class="circle"><fa icon="circle"/></i>
|
||||
<i v-if="$parent.indicate" class="circle"><fa icon="circle"/></i>
|
||||
<h1>
|
||||
<slot>{{ $root.instanceName }}</slot>
|
||||
</h1>
|
||||
@@ -27,48 +27,13 @@ export default Vue.extend({
|
||||
|
||||
data() {
|
||||
return {
|
||||
hasGameInvitation: false,
|
||||
connection: null,
|
||||
env: env
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
hasUnreadNotification(): boolean {
|
||||
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
|
||||
},
|
||||
|
||||
hasUnreadMessagingMessage(): boolean {
|
||||
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage;
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.$store.commit('setUiHeaderHeight', 48);
|
||||
|
||||
if (this.$store.getters.isSignedIn) {
|
||||
this.connection = this.$root.stream.useSharedConnection('main');
|
||||
|
||||
this.connection.on('reversiInvited', this.onReversiInvited);
|
||||
this.connection.on('reversiNoInvites', this.onReversiNoInvites);
|
||||
}
|
||||
},
|
||||
|
||||
beforeDestroy() {
|
||||
if (this.$store.getters.isSignedIn) {
|
||||
this.connection.dispose();
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
onReversiInvited() {
|
||||
this.hasGameInvitation = true;
|
||||
},
|
||||
|
||||
onReversiNoInvites() {
|
||||
this.hasGameInvitation = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="nav">
|
||||
<div class="fquwcbxs">
|
||||
<transition name="back">
|
||||
<div class="backdrop"
|
||||
v-if="isOpen"
|
||||
@@ -8,41 +8,52 @@
|
||||
></div>
|
||||
</transition>
|
||||
<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" alt="avatar"/>
|
||||
<p class="name"><mk-user-name :user="$store.state.i"/></p>
|
||||
</router-link>
|
||||
<div class="links">
|
||||
<ul>
|
||||
<li><router-link to="/" :data-active="$route.name == 'index'"><i><fa icon="home" fixed-width/></i>{{ $t('timeline') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/i/notifications" :data-active="$route.name == 'notifications'"><i><fa :icon="['far', 'bell']" fixed-width/></i>{{ $t('notifications') }}<i v-if="hasUnreadNotification" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'"><i><fa :icon="['far', 'comments']" fixed-width/></i>{{ $t('@.messaging') }}<i v-if="hasUnreadMessagingMessage" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li v-if="$store.getters.isSignedIn && ($store.state.i.isLocked || $store.state.i.carefulBot)"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'"><i><fa :icon="['far', 'envelope']" fixed-width/></i>{{ $t('follow-requests') }}<i v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/featured" :data-active="$route.name == 'featured'"><i><fa :icon="faNewspaper" fixed-width/></i>{{ $t('@.featured-notes') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/explore" :data-active="$route.name == 'explore' || $route.name == 'explore-tag'"><i><fa :icon="faHashtag" fixed-width/></i>{{ $t('@.explore') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/games/reversi" :data-active="$route.name == 'reversi'"><i><fa icon="gamepad" fixed-width/></i>{{ $t('game') }}<i v-if="hasGameInvitation" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'"><i><fa :icon="['far', 'calendar-alt']" fixed-width/></i>{{ $t('widgets') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'"><i><fa icon="star" fixed-width/></i>{{ $t('favorites') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'"><i><fa icon="list" fixed-width/></i>{{ $t('user-lists') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/i/drive" :data-active="$route.name == 'drive'"><i><fa icon="cloud" fixed-width/></i>{{ $t('@.drive') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><a @click="search"><i><fa icon="search" fixed-width/></i>{{ $t('search') }}<i><fa icon="angle-right"/></i></a></li>
|
||||
<li><router-link to="/i/settings" :data-active="$route.name == 'settings'"><i><fa icon="cog" fixed-width/></i>{{ $t('settings') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li v-if="$store.getters.isSignedIn && ($store.state.i.isAdmin || $store.state.i.isModerator)"><a href="/admin"><i><fa icon="terminal" fixed-width/></i><span>{{ $t('admin') }}</span><i><fa icon="angle-right"/></i></a></li>
|
||||
<li @click="dark"><p><template><i><fa :icon="$store.state.device.darkmode ? faSun : faMoon" fixed-width/></i></template><span>{{ $store.state.device.darkmode ? $t('@.turn-off-darkmode') : $t('@.turn-on-darkmode') }}</span></p></li>
|
||||
</ul>
|
||||
<div class="body" :class="{ notifications: showNotifications }" v-if="isOpen">
|
||||
<div class="nav" v-show="!showNotifications">
|
||||
<router-link class="me" v-if="$store.getters.isSignedIn" :to="`/@${$store.state.i.username}`">
|
||||
<img class="avatar" :src="$store.state.i.avatarUrl" alt="avatar"/>
|
||||
<p class="name"><mk-user-name :user="$store.state.i"/></p>
|
||||
</router-link>
|
||||
<div class="links">
|
||||
<ul>
|
||||
<li><router-link to="/" :data-active="$route.name == 'index'"><i><fa icon="home" fixed-width/></i>{{ $t('timeline') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><p @click="showNotifications = true"><i><fa :icon="['far', 'bell']" fixed-width/></i>{{ $t('notifications') }}<i v-if="hasUnreadNotification" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></p></li>
|
||||
<li><router-link to="/i/messaging" :data-active="$route.name == 'messaging'"><i><fa :icon="['far', 'comments']" fixed-width/></i>{{ $t('@.messaging') }}<i v-if="hasUnreadMessagingMessage" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li v-if="$store.getters.isSignedIn && ($store.state.i.isLocked || $store.state.i.carefulBot)"><router-link to="/i/received-follow-requests" :data-active="$route.name == 'received-follow-requests'"><i><fa :icon="['far', 'envelope']" fixed-width/></i>{{ $t('follow-requests') }}<i v-if="$store.getters.isSignedIn && $store.state.i.pendingReceivedFollowRequestsCount" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/featured" :data-active="$route.name == 'featured'"><i><fa :icon="faNewspaper" fixed-width/></i>{{ $t('@.featured-notes') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/explore" :data-active="$route.name == 'explore' || $route.name == 'explore-tag'"><i><fa :icon="faHashtag" fixed-width/></i>{{ $t('@.explore') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/games/reversi" :data-active="$route.name == 'reversi'"><i><fa icon="gamepad" fixed-width/></i>{{ $t('game') }}<i v-if="hasGameInvitation" class="circle"><fa icon="circle"/></i><i><fa icon="angle-right"/></i></router-link></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><router-link to="/i/widgets" :data-active="$route.name == 'widgets'"><i><fa :icon="['far', 'calendar-alt']" fixed-width/></i>{{ $t('widgets') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/i/favorites" :data-active="$route.name == 'favorites'"><i><fa icon="star" fixed-width/></i>{{ $t('favorites') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/i/lists" :data-active="$route.name == 'user-lists'"><i><fa icon="list" fixed-width/></i>{{ $t('user-lists') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li><router-link to="/i/drive" :data-active="$route.name == 'drive'"><i><fa icon="cloud" fixed-width/></i>{{ $t('@.drive') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li><a @click="search"><i><fa icon="search" fixed-width/></i>{{ $t('search') }}<i><fa icon="angle-right"/></i></a></li>
|
||||
<li><router-link to="/i/settings" :data-active="$route.name == 'settings'"><i><fa icon="cog" fixed-width/></i>{{ $t('settings') }}<i><fa icon="angle-right"/></i></router-link></li>
|
||||
<li v-if="$store.getters.isSignedIn && ($store.state.i.isAdmin || $store.state.i.isModerator)"><a href="/admin"><i><fa icon="terminal" fixed-width/></i><span>{{ $t('admin') }}</span><i><fa icon="angle-right"/></i></a></li>
|
||||
</ul>
|
||||
<ul>
|
||||
<li @click="toggleDeckMode"><p><i><fa :icon="$store.state.device.inDeckMode ? faHome : faColumns"/></i><span>{{ $store.state.device.inDeckMode ? $t('@.home') : $t('@.deck') }}</span></p></li>
|
||||
<li @click="dark"><p><i><fa :icon="$store.state.device.darkmode ? faSun : faMoon" fixed-width/></i><span>{{ $store.state.device.darkmode ? $t('@.turn-off-darkmode') : $t('@.turn-on-darkmode') }}</span></p></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="announcements" v-if="announcements && announcements.length > 0">
|
||||
<article v-for="announcement in announcements">
|
||||
<span v-html="announcement.title" class="title"></span>
|
||||
<div v-html="announcement.text"></div>
|
||||
</article>
|
||||
</div>
|
||||
<a :href="aboutUrl"><p class="about">{{ $t('about') }}</p></a>
|
||||
</div>
|
||||
<div class="announcements" v-if="announcements && announcements.length > 0">
|
||||
<article v-for="announcement in announcements">
|
||||
<span v-html="announcement.title" class="title"></span>
|
||||
<div v-html="announcement.text"></div>
|
||||
</article>
|
||||
<div class="notifications" v-if="showNotifications">
|
||||
<header>
|
||||
<button @click="$parent.isDrawerOpening = false"><fa icon="times"/></button>
|
||||
</header>
|
||||
<mk-notifications/>
|
||||
</div>
|
||||
<a :href="aboutUrl"><p class="about">{{ $t('about') }}</p></a>
|
||||
</div>
|
||||
</transition>
|
||||
</div>
|
||||
@@ -52,13 +63,18 @@
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import { lang } from '../../../config';
|
||||
import { faNewspaper, faHashtag } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faNewspaper, faHashtag, faHome, faColumns } from '@fortawesome/free-solid-svg-icons';
|
||||
import { faMoon, faSun } from '@fortawesome/free-regular-svg-icons';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('mobile/views/components/ui.nav.vue'),
|
||||
|
||||
props: ['isOpen'],
|
||||
|
||||
provide: {
|
||||
narrow: true
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
hasGameInvitation: false,
|
||||
@@ -66,7 +82,8 @@ export default Vue.extend({
|
||||
aboutUrl: `/docs/${lang}/about`,
|
||||
announcements: [],
|
||||
searching: false,
|
||||
faNewspaper, faHashtag, faMoon, faSun
|
||||
showNotifications: false,
|
||||
faNewspaper, faHashtag, faMoon, faSun, faHome, faColumns
|
||||
};
|
||||
},
|
||||
|
||||
@@ -80,9 +97,15 @@ export default Vue.extend({
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
isOpen() {
|
||||
this.showNotifications = false;
|
||||
}
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.$root.getMeta().then(meta => {
|
||||
this.announcements = meta.broadcasts;
|
||||
this.announcements = meta.announcements;
|
||||
});
|
||||
|
||||
if (this.$store.getters.isSignedIn) {
|
||||
@@ -148,13 +171,18 @@ export default Vue.extend({
|
||||
key: 'darkmode',
|
||||
value: !this.$store.state.device.darkmode
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
toggleDeckMode() {
|
||||
this.$store.commit('device/set', { key: 'deckMode', value: !this.$store.state.device.inDeckMode });
|
||||
location.replace('/');
|
||||
},
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.nav
|
||||
.fquwcbxs
|
||||
$color = var(--text)
|
||||
|
||||
.backdrop
|
||||
@@ -178,102 +206,126 @@ export default Vue.extend({
|
||||
background var(--secondary)
|
||||
font-size 15px
|
||||
|
||||
.me
|
||||
display block
|
||||
margin 0
|
||||
padding 16px
|
||||
&.notifications
|
||||
width 340px
|
||||
|
||||
.avatar
|
||||
display inline
|
||||
max-width 64px
|
||||
border-radius 32px
|
||||
vertical-align middle
|
||||
> .notifications
|
||||
padding-top 42px
|
||||
|
||||
.name
|
||||
display block
|
||||
margin 0 16px
|
||||
position absolute
|
||||
top 0
|
||||
left 80px
|
||||
padding 0
|
||||
width calc(100% - 112px)
|
||||
color $color
|
||||
line-height 96px
|
||||
overflow hidden
|
||||
text-overflow ellipsis
|
||||
white-space nowrap
|
||||
> header
|
||||
position fixed
|
||||
top 0
|
||||
left 0
|
||||
z-index 1000
|
||||
width 340px
|
||||
line-height 42px
|
||||
background var(--secondary)
|
||||
|
||||
ul
|
||||
display block
|
||||
margin 16px 0
|
||||
padding 0
|
||||
list-style none
|
||||
> button
|
||||
display block
|
||||
padding 0 14px
|
||||
font-size 20px
|
||||
line-height 42px
|
||||
color var(--text)
|
||||
|
||||
&:first-child
|
||||
margin-top 0
|
||||
> .nav
|
||||
|
||||
&:last-child
|
||||
margin-bottom 0
|
||||
|
||||
> li
|
||||
display block
|
||||
font-size 1em
|
||||
line-height 1em
|
||||
|
||||
a, p
|
||||
> .me
|
||||
display block
|
||||
margin 0
|
||||
padding 0 20px
|
||||
line-height 3rem
|
||||
line-height calc(1rem + 30px)
|
||||
color $color
|
||||
text-decoration none
|
||||
padding 16px
|
||||
|
||||
&[data-active]
|
||||
color var(--primaryForeground)
|
||||
background var(--primary)
|
||||
.avatar
|
||||
display inline
|
||||
max-width 64px
|
||||
border-radius 32px
|
||||
vertical-align middle
|
||||
|
||||
> i:last-child
|
||||
color var(--primaryForeground)
|
||||
|
||||
> i:first-child
|
||||
margin-right 0.5em
|
||||
width 20px
|
||||
text-align center
|
||||
|
||||
> i.circle
|
||||
margin-left 6px
|
||||
font-size 10px
|
||||
color var(--notificationIndicator)
|
||||
|
||||
> i:last-child
|
||||
.name
|
||||
display block
|
||||
margin 0 16px
|
||||
position absolute
|
||||
top 0
|
||||
right 0
|
||||
padding 0 20px
|
||||
font-size 1.2em
|
||||
line-height calc(1rem + 30px)
|
||||
left 80px
|
||||
padding 0
|
||||
width calc(100% - 112px)
|
||||
color $color
|
||||
opacity 0.5
|
||||
line-height 96px
|
||||
overflow hidden
|
||||
text-overflow ellipsis
|
||||
white-space nowrap
|
||||
|
||||
.announcements
|
||||
> article
|
||||
background var(--mobileAnnouncement)
|
||||
color var(--mobileAnnouncementFg)
|
||||
padding 16px
|
||||
margin 8px 0
|
||||
font-size 12px
|
||||
ul
|
||||
display block
|
||||
margin 16px 0
|
||||
padding 0
|
||||
list-style none
|
||||
|
||||
> .title
|
||||
font-weight bold
|
||||
&:first-child
|
||||
margin-top 0
|
||||
|
||||
.about
|
||||
margin 0 0 8px 0
|
||||
padding 1em 0
|
||||
text-align center
|
||||
font-size 0.8em
|
||||
color $color
|
||||
opacity 0.5
|
||||
&:last-child
|
||||
margin-bottom 0
|
||||
|
||||
> li
|
||||
display block
|
||||
font-size 1em
|
||||
line-height 1em
|
||||
|
||||
a, p
|
||||
display block
|
||||
margin 0
|
||||
padding 0 20px
|
||||
line-height 3rem
|
||||
line-height calc(1rem + 30px)
|
||||
color $color
|
||||
text-decoration none
|
||||
|
||||
&[data-active]
|
||||
color var(--primaryForeground)
|
||||
background var(--primary)
|
||||
|
||||
> i:last-child
|
||||
color var(--primaryForeground)
|
||||
|
||||
> i:first-child
|
||||
margin-right 0.5em
|
||||
width 20px
|
||||
text-align center
|
||||
|
||||
> i.circle
|
||||
margin-left 6px
|
||||
font-size 10px
|
||||
color var(--notificationIndicator)
|
||||
|
||||
> i:last-child
|
||||
position absolute
|
||||
top 0
|
||||
right 0
|
||||
padding 0 20px
|
||||
font-size 1.2em
|
||||
line-height calc(1rem + 30px)
|
||||
color $color
|
||||
opacity 0.5
|
||||
|
||||
.announcements
|
||||
> article
|
||||
background var(--mobileAnnouncement)
|
||||
color var(--mobileAnnouncementFg)
|
||||
padding 16px
|
||||
margin 8px 0
|
||||
font-size 12px
|
||||
|
||||
> .title
|
||||
font-weight bold
|
||||
|
||||
.about
|
||||
margin 0 0 8px 0
|
||||
padding 1em 0
|
||||
text-align center
|
||||
font-size 0.8em
|
||||
color $color
|
||||
opacity 0.5
|
||||
|
||||
.nav-enter-active,
|
||||
.nav-leave-active {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="mk-ui">
|
||||
<x-header>
|
||||
<div class="mk-ui" :class="{ deck: $store.state.device.inDeckMode }">
|
||||
<x-header v-if="!$store.state.device.inDeckMode">
|
||||
<template #func><slot name="func"></slot></template>
|
||||
<slot name="header"></slot>
|
||||
</x-header>
|
||||
@@ -9,6 +9,8 @@
|
||||
<slot></slot>
|
||||
</div>
|
||||
<mk-stream-indicator v-if="$store.getters.isSignedIn"/>
|
||||
<button class="nav button" v-if="$store.state.device.inDeckMode" @click="isDrawerOpening = !isDrawerOpening"><fa icon="bars"/><i v-if="indicate"><fa icon="circle"/></i></button>
|
||||
<button class="post button" v-if="$store.state.device.inDeckMode" @click="$post()"><fa icon="pencil-alt"/></button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -28,11 +30,26 @@ export default Vue.extend({
|
||||
|
||||
data() {
|
||||
return {
|
||||
hasGameInvitation: false,
|
||||
isDrawerOpening: false,
|
||||
connection: null
|
||||
};
|
||||
},
|
||||
|
||||
computed: {
|
||||
hasUnreadNotification(): boolean {
|
||||
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadNotification;
|
||||
},
|
||||
|
||||
hasUnreadMessagingMessage(): boolean {
|
||||
return this.$store.getters.isSignedIn && this.$store.state.i.hasUnreadMessagingMessage;
|
||||
},
|
||||
|
||||
indicate(): boolean {
|
||||
return this.hasUnreadNotification || this.hasUnreadMessagingMessage || this.hasGameInvitation;
|
||||
}
|
||||
},
|
||||
|
||||
watch: {
|
||||
'$store.state.uiHeaderHeight'() {
|
||||
this.$el.style.paddingTop = this.$store.state.uiHeaderHeight + 'px';
|
||||
@@ -46,6 +63,8 @@ export default Vue.extend({
|
||||
this.connection = this.$root.stream.useSharedConnection('main');
|
||||
|
||||
this.connection.on('notification', this.onNotification);
|
||||
this.connection.on('reversiInvited', this.onReversiInvited);
|
||||
this.connection.on('reversiNoInvites', this.onReversiNoInvites);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -65,6 +84,14 @@ export default Vue.extend({
|
||||
this.$root.new(MkNotify, {
|
||||
notification
|
||||
});
|
||||
},
|
||||
|
||||
onReversiInvited() {
|
||||
this.hasGameInvitation = true;
|
||||
},
|
||||
|
||||
onReversiNoInvites() {
|
||||
this.hasGameInvitation = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -72,13 +99,37 @@ export default Vue.extend({
|
||||
|
||||
<style lang="stylus" scoped>
|
||||
.mk-ui
|
||||
display flex
|
||||
flex 1
|
||||
flex-direction column
|
||||
padding-top 48px
|
||||
&:not(.deck)
|
||||
padding-top 48px
|
||||
|
||||
> .button
|
||||
position fixed
|
||||
z-index 1000
|
||||
bottom 28px
|
||||
padding 0
|
||||
width 64px
|
||||
height 64px
|
||||
border-radius 100%
|
||||
box-shadow 0 3px 5px -1px rgba(0, 0, 0, 0.2), 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12)
|
||||
|
||||
> *
|
||||
font-size 24px
|
||||
|
||||
&.nav
|
||||
left 28px
|
||||
background var(--secondary)
|
||||
color var(--text)
|
||||
|
||||
> i
|
||||
position absolute
|
||||
top 0
|
||||
left 0
|
||||
color var(--primary)
|
||||
font-size 16px
|
||||
|
||||
&.post
|
||||
right 28px
|
||||
background var(--primary)
|
||||
color var(--primaryForeground)
|
||||
|
||||
> .content
|
||||
display flex
|
||||
flex 1
|
||||
flex-direction column
|
||||
</style>
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
<template>
|
||||
<mk-ui>
|
||||
<template #header><span style="margin-right:4px;"><fa :icon="['far', 'bell']"/></span>{{ $t('notifications') }}</template>
|
||||
<template #func><button @click="fn"><fa icon="check"/></button></template>
|
||||
|
||||
<main>
|
||||
<mk-notifications @fetched="onFetched"/>
|
||||
</main>
|
||||
</mk-ui>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import Vue from 'vue';
|
||||
import i18n from '../../../i18n';
|
||||
import Progress from '../../../common/scripts/loading';
|
||||
|
||||
export default Vue.extend({
|
||||
i18n: i18n('mobile/views/pages/notifications.vue'),
|
||||
mounted() {
|
||||
document.title = this.$t('notifications');
|
||||
|
||||
Progress.start();
|
||||
},
|
||||
methods: {
|
||||
fn() {
|
||||
this.$root.dialog({
|
||||
type: 'warning',
|
||||
text: this.$t('read-all'),
|
||||
showCancelButton: true
|
||||
}).then(({ canceled }) => {
|
||||
if (canceled) return;
|
||||
|
||||
this.$root.api('notifications/mark_all_as_read');
|
||||
});
|
||||
},
|
||||
onFetched() {
|
||||
Progress.done();
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -60,6 +60,21 @@
|
||||
<ui-radio v-model="mobileNotificationPosition" value="bottom">{{ $t('notification-position-bottom') }}</ui-radio>
|
||||
<ui-radio v-model="mobileNotificationPosition" value="top">{{ $t('notification-position-top') }}</ui-radio>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<header>{{ $t('@.deck-column-align') }}</header>
|
||||
<ui-radio v-model="deckColumnAlign" value="center">{{ $t('@.deck-column-align-center') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnAlign" value="left">{{ $t('@.deck-column-align-left') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnAlign" value="flexible">{{ $t('@.deck-column-align-flexible') }}</ui-radio>
|
||||
</section>
|
||||
<section>
|
||||
<header>{{ $t('@.deck-column-width') }}</header>
|
||||
<ui-radio v-model="deckColumnWidth" value="narrow">{{ $t('@.deck-column-width-narrow') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnWidth" value="narrower">{{ $t('@.deck-column-width-narrower') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnWidth" value="normal">{{ $t('@.deck-column-width-normal') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnWidth" value="wider">{{ $t('@.deck-column-width-wider') }}</ui-radio>
|
||||
<ui-radio v-model="deckColumnWidth" value="wide">{{ $t('@.deck-column-width-wide') }}</ui-radio>
|
||||
</section>
|
||||
</ui-card>
|
||||
|
||||
<ui-card>
|
||||
@@ -244,6 +259,16 @@ export default Vue.extend({
|
||||
set(value) { this.$store.commit('device/set', { key: 'enableSounds', value }); }
|
||||
},
|
||||
|
||||
deckColumnAlign: {
|
||||
get() { return this.$store.state.device.deckColumnAlign; },
|
||||
set(value) { this.$store.commit('device/set', { key: 'deckColumnAlign', value }); }
|
||||
},
|
||||
|
||||
deckColumnWidth: {
|
||||
get() { return this.$store.state.device.deckColumnWidth; },
|
||||
set(value) { this.$store.commit('device/set', { key: 'deckColumnWidth', value }); }
|
||||
},
|
||||
|
||||
fetchOnScroll: {
|
||||
get() { return this.$store.state.settings.fetchOnScroll; },
|
||||
set(value) { this.$store.dispatch('settings/set', { key: 'fetchOnScroll', value }); }
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
<p v-html="description || this.$t('@.about')"></p>
|
||||
<router-link class="signup" to="/signup">{{ $t('signup') }}</router-link>
|
||||
</div>
|
||||
<div class="login">
|
||||
<mk-signin :with-avatar="false"/>
|
||||
<div class="signin">
|
||||
<a href="/signin" @click.prevent="signin()">{{ $t('signin') }}</a>
|
||||
</div>
|
||||
<div class="tl">
|
||||
<mk-welcome-timeline/>
|
||||
@@ -98,7 +98,7 @@ export default Vue.extend({
|
||||
this.meta = meta;
|
||||
this.name = meta.name;
|
||||
this.description = meta.description;
|
||||
this.announcements = meta.broadcasts;
|
||||
this.announcements = meta.announcements;
|
||||
this.banner = meta.bannerUrl;
|
||||
});
|
||||
|
||||
@@ -120,6 +120,13 @@ export default Vue.extend({
|
||||
const files = concat(notes.map((n: any): any[] => n.files));
|
||||
this.photos = files.filter(f => image.includes(f.type)).slice(0, 6);
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
signin() {
|
||||
this.$root.dialog({
|
||||
type: 'signin'
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
@@ -185,32 +192,9 @@ export default Vue.extend({
|
||||
> .signup
|
||||
font-weight bold
|
||||
|
||||
> .login
|
||||
> .signin
|
||||
margin 16px 0
|
||||
|
||||
> form
|
||||
|
||||
button
|
||||
display block
|
||||
width 100%
|
||||
padding 10px
|
||||
margin 0
|
||||
color #333
|
||||
font-size 1em
|
||||
text-align center
|
||||
text-decoration none
|
||||
text-shadow 0 1px 0 rgba(255, 255, 255, 0.9)
|
||||
background-image linear-gradient(#fafafa, #eaeaea)
|
||||
border 1px solid #ddd
|
||||
border-bottom-color #cecece
|
||||
border-radius 4px
|
||||
|
||||
&:active
|
||||
background-color #767676
|
||||
background-image none
|
||||
border-color #444
|
||||
box-shadow 0 1px 3px rgba(#000, 0.075), inset 0 0 5px rgba(#000, 0.2)
|
||||
|
||||
> .tl
|
||||
margin 16px 0
|
||||
|
||||
|
||||
@@ -9,7 +9,6 @@ import getNoteSummary from '../../misc/get-note-summary';
|
||||
const defaultSettings = {
|
||||
home: null,
|
||||
mobileHome: [],
|
||||
deck: null,
|
||||
keepCw: false,
|
||||
tagTimelines: [],
|
||||
fetchOnScroll: true,
|
||||
@@ -45,6 +44,10 @@ const defaultSettings = {
|
||||
};
|
||||
|
||||
const defaultDeviceSettings = {
|
||||
deck: null,
|
||||
deckMode: false,
|
||||
deckColumnAlign: 'center',
|
||||
deckColumnWidth: 'normal',
|
||||
reduceMotion: false,
|
||||
autoPopout: false,
|
||||
darkmode: false,
|
||||
@@ -63,10 +66,7 @@ const defaultDeviceSettings = {
|
||||
alwaysShowNsfw: false,
|
||||
postStyle: 'standard',
|
||||
navbar: 'top',
|
||||
deckColumnAlign: 'center',
|
||||
deckColumnWidth: 'normal',
|
||||
mobileNotificationPosition: 'bottom',
|
||||
deckMode: false,
|
||||
useOsDefaultEmojis: false,
|
||||
disableShowingAnimatedImages: false,
|
||||
expandUsersPhotos: true,
|
||||
@@ -162,73 +162,10 @@ export default (os: MiOS) => new Vuex.Store({
|
||||
|
||||
setVisibility(state, visibility) {
|
||||
state.visibility = visibility;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
settings: {
|
||||
namespaced: true,
|
||||
|
||||
state: defaultSettings,
|
||||
|
||||
mutations: {
|
||||
set(state, x: { key: string; value: any }) {
|
||||
nestedProperty.set(state, x.key, x.value);
|
||||
},
|
||||
|
||||
setHome(state, data) {
|
||||
state.home = data;
|
||||
},
|
||||
|
||||
addHomeWidget(state, widget) {
|
||||
state.home.unshift(widget);
|
||||
},
|
||||
|
||||
setMobileHome(state, data) {
|
||||
state.mobileHome = data;
|
||||
},
|
||||
|
||||
setWidget(state, x) {
|
||||
let w;
|
||||
|
||||
//#region Decktop home
|
||||
if (state.home) {
|
||||
w = state.home.find(w => w.id == x.id);
|
||||
if (w) {
|
||||
w.data = x.data;
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//#region Mobile home
|
||||
if (state.mobileHome) {
|
||||
w = state.mobileHome.find(w => w.id == x.id);
|
||||
if (w) {
|
||||
w.data = x.data;
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//#region Deck
|
||||
if (state.deck && state.deck.columns) {
|
||||
for (const c of state.deck.columns.filter(c => c.type == 'widgets')) {
|
||||
for (const w of c.widgets.filter(w => w.id == x.id)) {
|
||||
w.data = x.data;
|
||||
}
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
},
|
||||
|
||||
addMobileHomeWidget(state, widget) {
|
||||
state.mobileHome.unshift(widget);
|
||||
},
|
||||
|
||||
removeMobileHomeWidget(state, widget) {
|
||||
state.mobileHome = state.mobileHome.filter(w => w.id != widget.id);
|
||||
},
|
||||
|
||||
addDeckColumn(state, column) {
|
||||
if (column.name == undefined) column.name = null;
|
||||
state.deck.columns.push(column);
|
||||
state.deck.layout.push([column.id]);
|
||||
},
|
||||
@@ -255,8 +192,11 @@ export default (os: MiOS) => new Vuex.Store({
|
||||
if (ids.indexOf(id) != -1) {
|
||||
const left = state.deck.layout[i - 1];
|
||||
if (left) {
|
||||
state.deck.layout[i - 1] = state.deck.layout[i];
|
||||
state.deck.layout[i] = left;
|
||||
// https://vuejs.org/v2/guide/list.html#Caveats
|
||||
//state.deck.layout[i - 1] = state.deck.layout[i];
|
||||
//state.deck.layout[i] = left;
|
||||
state.deck.layout.splice(i - 1, 1, state.deck.layout[i]);
|
||||
state.deck.layout.splice(i, 1, left);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -268,8 +208,11 @@ export default (os: MiOS) => new Vuex.Store({
|
||||
if (ids.indexOf(id) != -1) {
|
||||
const right = state.deck.layout[i + 1];
|
||||
if (right) {
|
||||
state.deck.layout[i + 1] = state.deck.layout[i];
|
||||
state.deck.layout[i] = right;
|
||||
// https://vuejs.org/v2/guide/list.html#Caveats
|
||||
//state.deck.layout[i + 1] = state.deck.layout[i];
|
||||
//state.deck.layout[i] = right;
|
||||
state.deck.layout.splice(i + 1, 1, state.deck.layout[i]);
|
||||
state.deck.layout.splice(i, 1, right);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -282,8 +225,11 @@ export default (os: MiOS) => new Vuex.Store({
|
||||
if (x == id) {
|
||||
const up = ids[i - 1];
|
||||
if (up) {
|
||||
ids[i - 1] = id;
|
||||
ids[i] = up;
|
||||
// https://vuejs.org/v2/guide/list.html#Caveats
|
||||
//ids[i - 1] = id;
|
||||
//ids[i] = up;
|
||||
ids.splice(i - 1, 1, id);
|
||||
ids.splice(i, 1, up);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -296,8 +242,11 @@ export default (os: MiOS) => new Vuex.Store({
|
||||
if (x == id) {
|
||||
const down = ids[i + 1];
|
||||
if (down) {
|
||||
ids[i + 1] = id;
|
||||
ids[i] = down;
|
||||
// https://vuejs.org/v2/guide/list.html#Caveats
|
||||
//ids[i + 1] = id;
|
||||
//ids[i] = down;
|
||||
ids.splice(i + 1, 1, id);
|
||||
ids.splice(i, 1, down);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -335,7 +284,67 @@ export default (os: MiOS) => new Vuex.Store({
|
||||
const column = state.deck.columns.find(c => c.id == x.id);
|
||||
if (column == null) return;
|
||||
column.name = x.name;
|
||||
},
|
||||
|
||||
updateDeckColumn(state, x) {
|
||||
let column = state.deck.columns.find(c => c.id == x.id);
|
||||
if (column == null) return;
|
||||
column = x;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
settings: {
|
||||
namespaced: true,
|
||||
|
||||
state: defaultSettings,
|
||||
|
||||
mutations: {
|
||||
set(state, x: { key: string; value: any }) {
|
||||
nestedProperty.set(state, x.key, x.value);
|
||||
},
|
||||
|
||||
setHome(state, data) {
|
||||
state.home = data;
|
||||
},
|
||||
|
||||
addHomeWidget(state, widget) {
|
||||
state.home.unshift(widget);
|
||||
},
|
||||
|
||||
setMobileHome(state, data) {
|
||||
state.mobileHome = data;
|
||||
},
|
||||
|
||||
updateWidget(state, x) {
|
||||
let w;
|
||||
|
||||
//#region Desktop home
|
||||
if (state.home) {
|
||||
w = state.home.find(w => w.id == x.id);
|
||||
if (w) {
|
||||
w.data = x.data;
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
|
||||
//#region Mobile home
|
||||
if (state.mobileHome) {
|
||||
w = state.mobileHome.find(w => w.id == x.id);
|
||||
if (w) {
|
||||
w.data = x.data;
|
||||
}
|
||||
}
|
||||
//#endregion
|
||||
},
|
||||
|
||||
addMobileHomeWidget(state, widget) {
|
||||
state.mobileHome.unshift(widget);
|
||||
},
|
||||
|
||||
removeMobileHomeWidget(state, widget) {
|
||||
state.mobileHome = state.mobileHome.filter(w => w.id != widget.id);
|
||||
},
|
||||
},
|
||||
|
||||
actions: {
|
||||
@@ -357,73 +366,6 @@ export default (os: MiOS) => new Vuex.Store({
|
||||
}
|
||||
},
|
||||
|
||||
saveDeck(ctx) {
|
||||
os.api('i/update_client_setting', {
|
||||
name: 'deck',
|
||||
value: ctx.state.deck
|
||||
});
|
||||
},
|
||||
|
||||
addDeckColumn(ctx, column) {
|
||||
ctx.commit('addDeckColumn', column);
|
||||
ctx.dispatch('saveDeck');
|
||||
},
|
||||
|
||||
removeDeckColumn(ctx, id) {
|
||||
ctx.commit('removeDeckColumn', id);
|
||||
ctx.dispatch('saveDeck');
|
||||
},
|
||||
|
||||
swapDeckColumn(ctx, id) {
|
||||
ctx.commit('swapDeckColumn', id);
|
||||
ctx.dispatch('saveDeck');
|
||||
},
|
||||
|
||||
swapLeftDeckColumn(ctx, id) {
|
||||
ctx.commit('swapLeftDeckColumn', id);
|
||||
ctx.dispatch('saveDeck');
|
||||
},
|
||||
|
||||
swapRightDeckColumn(ctx, id) {
|
||||
ctx.commit('swapRightDeckColumn', id);
|
||||
ctx.dispatch('saveDeck');
|
||||
},
|
||||
|
||||
swapUpDeckColumn(ctx, id) {
|
||||
ctx.commit('swapUpDeckColumn', id);
|
||||
ctx.dispatch('saveDeck');
|
||||
},
|
||||
|
||||
swapDownDeckColumn(ctx, id) {
|
||||
ctx.commit('swapDownDeckColumn', id);
|
||||
ctx.dispatch('saveDeck');
|
||||
},
|
||||
|
||||
stackLeftDeckColumn(ctx, id) {
|
||||
ctx.commit('stackLeftDeckColumn', id);
|
||||
ctx.dispatch('saveDeck');
|
||||
},
|
||||
|
||||
popRightDeckColumn(ctx, id) {
|
||||
ctx.commit('popRightDeckColumn', id);
|
||||
ctx.dispatch('saveDeck');
|
||||
},
|
||||
|
||||
addDeckWidget(ctx, x) {
|
||||
ctx.commit('addDeckWidget', x);
|
||||
ctx.dispatch('saveDeck');
|
||||
},
|
||||
|
||||
removeDeckWidget(ctx, x) {
|
||||
ctx.commit('removeDeckWidget', x);
|
||||
ctx.dispatch('saveDeck');
|
||||
},
|
||||
|
||||
renameDeckColumn(ctx, x) {
|
||||
ctx.commit('renameDeckColumn', x);
|
||||
ctx.dispatch('saveDeck');
|
||||
},
|
||||
|
||||
addHomeWidget(ctx, widget) {
|
||||
ctx.commit('addHomeWidget', widget);
|
||||
|
||||
|
||||
@@ -28,6 +28,9 @@ export function convertOpenApiSchema(schema: Schema) {
|
||||
if (!['string', 'number', 'boolean', 'array', 'object'].includes(x.type)) {
|
||||
x['$ref'] = `#/components/schemas/${x.type}`;
|
||||
}
|
||||
if (x.type === 'array' && x.items) {
|
||||
x.items = convertOpenApiSchema(x.items);
|
||||
}
|
||||
if (x.type === 'object' && x.properties) {
|
||||
x.required = Object.entries(x.properties).filter(([k, v]: any) => !v.isOptional).map(([k, v]: any) => k);
|
||||
for (const k of Object.keys(x.properties)) {
|
||||
@@ -151,6 +151,15 @@ if ((config as any).sw) {
|
||||
}
|
||||
});
|
||||
}
|
||||
Meta.findOne({}).then(m => {
|
||||
if (m != null && (m as any).broadcasts != null) {
|
||||
Meta.update({}, {
|
||||
$rename: {
|
||||
broadcasts: 'announcements'
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
export type IMeta = {
|
||||
name?: string;
|
||||
@@ -173,7 +182,7 @@ export type IMeta = {
|
||||
|
||||
langs?: string[];
|
||||
|
||||
broadcasts?: any[];
|
||||
announcements?: any[];
|
||||
|
||||
stats?: {
|
||||
notesCount: number;
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
import { Context } from 'cafy';
|
||||
import * as path from 'path';
|
||||
import * as glob from 'glob';
|
||||
import { Schema } from '../../prelude/schema';
|
||||
import { Schema } from '../../misc/schema';
|
||||
|
||||
export type Param = {
|
||||
validator: Context<any>;
|
||||
transform?: any;
|
||||
default?: any;
|
||||
deprecated?: boolean;
|
||||
desc?: { [key: string]: string };
|
||||
ref?: string;
|
||||
};
|
||||
|
||||
@@ -13,10 +13,10 @@ export const meta = {
|
||||
requireModerator: true,
|
||||
|
||||
params: {
|
||||
broadcasts: {
|
||||
announcements: {
|
||||
validator: $.optional.nullable.arr($.obj()),
|
||||
desc: {
|
||||
'ja-JP': 'ブロードキャスト'
|
||||
'ja-JP': 'お知らせ'
|
||||
}
|
||||
},
|
||||
|
||||
@@ -328,8 +328,8 @@ export const meta = {
|
||||
export default define(meta, async (ps) => {
|
||||
const set = {} as any;
|
||||
|
||||
if (ps.broadcasts) {
|
||||
set.broadcasts = ps.broadcasts;
|
||||
if (ps.announcements) {
|
||||
set.announcements = ps.announcements;
|
||||
}
|
||||
|
||||
if (typeof ps.disableRegistration === 'boolean') {
|
||||
|
||||
@@ -21,6 +21,20 @@ export const meta = {
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
token: {
|
||||
type: 'string',
|
||||
description: 'セッションのトークン'
|
||||
},
|
||||
url: {
|
||||
type: 'string',
|
||||
description: 'セッションのURL'
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchApp: {
|
||||
message: 'No such app.',
|
||||
|
||||
@@ -29,6 +29,21 @@ export const meta = {
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
accessToken: {
|
||||
type: 'string',
|
||||
description: 'ユーザーのアクセストークン',
|
||||
},
|
||||
|
||||
user: {
|
||||
type: 'User',
|
||||
description: '認証したユーザー'
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchApp: {
|
||||
message: 'No such app.',
|
||||
|
||||
@@ -30,7 +30,14 @@ export const meta = {
|
||||
validator: $.optional.type(ID),
|
||||
transform: transform,
|
||||
},
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'Blocking',
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps, me) => {
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import $ from 'cafy';
|
||||
import define from '../../../define';
|
||||
import perUserFollowingChart from '../../../../../services/chart/per-user-following';
|
||||
import perUserFollowingChart, { perUserFollowingLogSchema } from '../../../../../services/chart/per-user-following';
|
||||
import ID, { transform } from '../../../../../misc/cafy-id';
|
||||
import { convertLog } from '../../../../../services/chart';
|
||||
|
||||
export const meta = {
|
||||
stability: 'stable',
|
||||
@@ -38,12 +39,7 @@ export const meta = {
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
res: convertLog(perUserFollowingLogSchema),
|
||||
};
|
||||
|
||||
export default define(meta, async (ps) => {
|
||||
|
||||
@@ -12,7 +12,19 @@ export const meta = {
|
||||
|
||||
requireCredential: true,
|
||||
|
||||
kind: 'drive-read'
|
||||
kind: 'drive-read',
|
||||
|
||||
res: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
capacity: {
|
||||
type: 'number'
|
||||
},
|
||||
usage: {
|
||||
type: 'number'
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export default define(meta, async (ps, user) => {
|
||||
|
||||
@@ -30,6 +30,13 @@ export const meta = {
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'Note',
|
||||
},
|
||||
},
|
||||
|
||||
errors: {
|
||||
noSuchFile: {
|
||||
message: 'No such file.',
|
||||
@@ -21,7 +21,11 @@ export const meta = {
|
||||
'ja-JP': 'ファイルのMD5ハッシュ'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'DriveFile',
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps, user) => {
|
||||
@@ -29,7 +29,14 @@ export const meta = {
|
||||
type: {
|
||||
validator: $.optional.str.match(/^[a-zA-Z\/\-\*]+$/)
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'DriveFile',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps, user) => {
|
||||
|
||||
@@ -54,7 +54,14 @@ export const meta = {
|
||||
validator: $.optional.arr($.str.or(['follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'poll_vote', 'receiveFollowRequest'])),
|
||||
default: [] as string[]
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
res: {
|
||||
type: 'array',
|
||||
items: {
|
||||
type: 'Notification',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export default define(meta, async (ps, user) => {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user