{{ title }}
+{{ description }}
+ +$2
'); + +export { + license, + licenseHtml +}; diff --git a/src/client/app/animation.styl b/src/client/app/animation.styl new file mode 100644 index 000000000..8f121b313 --- /dev/null +++ b/src/client/app/animation.styl @@ -0,0 +1,12 @@ +.zoom-in-top-enter-active, +.zoom-in-top-leave-active { + opacity: 1; + transform: scaleY(1); + transition: transform 300ms cubic-bezier(0.23, 1, 0.32, 1), opacity 300ms cubic-bezier(0.23, 1, 0.32, 1); + transform-origin: center top; +} +.zoom-in-top-enter, +.zoom-in-top-leave-active { + opacity: 0; + transform: scaleY(0); +} diff --git a/src/web/app/base.styl b/src/client/app/app.styl similarity index 70% rename from src/web/app/base.styl rename to src/client/app/app.styl index 81c039f0a..431b9daa6 100644 --- a/src/web/app/base.styl +++ b/src/client/app/app.styl @@ -1,34 +1,14 @@ -json('../../const.json') - -@charset 'utf-8' - -$theme-color = themeColor -$theme-color-foreground = themeColorForeground - -@import './reset' - -/* - ::selection - background $theme-color - color #fff -*/ - -* - tap-highlight-color rgba($theme-color, 0.7) - -webkit-tap-highlight-color rgba($theme-color, 0.7) - -html, body - margin 0 - padding 0 - scroll-behavior smooth - text-size-adjust 100% - font-family sans-serif +@import "../style" +@import "../animation" html &.progress &, * cursor progress !important +body + overflow-wrap break-word + #error padding 32px color #fff @@ -92,17 +72,6 @@ html 100% transform rotate(360deg) -a - text-decoration none - color $theme-color - cursor pointer - - &:hover - text-decoration underline - - * - cursor pointer - code font-family Consolas, 'Courier New', Courier, Monaco, monospace @@ -155,12 +124,5 @@ pre overflow auto tab-size 2 -mk-locker - display block - position fixed - top 0 - left 0 - z-index 65536 - width 100% - height 100% - cursor wait +[data-fa] + display inline-block diff --git a/src/client/app/app.vue b/src/client/app/app.vue new file mode 100644 index 000000000..7a46e7dea --- /dev/null +++ b/src/client/app/app.vue @@ -0,0 +1,3 @@ + +{{ app.nameId }}
+{{ app.description }}
+読み込み中
このアプリがあなたのアカウントにアクセスすることはありません。
+アプリケーションに戻っています
アプリケーションに戻って、やっていってください。
+セッションが存在しません。
+このチャンネルをウォッチしています ウォッチ解除
+ +読み込み中
まだ投稿がありません
+ +参加するにはログインまたは新規登録してください
+>>{ reply.index } ({ getUserName(reply.user) }): [x]
+ +
+
+ %fa:check%
+ %fa:times%
+
+ {{ network == null ? '%i18n:common.tags.mk-error.troubleshooter.checking-network%' : '%i18n:common.tags.mk-error.troubleshooter.network%' }}
+
+ %fa:check%
+ %fa:times%
+
+ {{ internet == null ? '%i18n:common.tags.mk-error.troubleshooter.checking-internet%' : '%i18n:common.tags.mk-error.troubleshooter.internet%' }}
+
+ %fa:check%
+ %fa:times%
+
+ {{ server == null ? '%i18n:common.tags.mk-error.troubleshooter.checking-server%' : '%i18n:common.tags.mk-error.troubleshooter.server%' }}
%i18n:common.tags.mk-error.troubleshooter.finding%
%fa:exclamation-triangle%%i18n:common.tags.mk-error.troubleshooter.no-network%
%i18n:common.tags.mk-error.troubleshooter.no-network-desc%
%fa:exclamation-triangle%%i18n:common.tags.mk-error.troubleshooter.no-internet%
%i18n:common.tags.mk-error.troubleshooter.no-internet-desc%
%fa:exclamation-triangle%%i18n:common.tags.mk-error.troubleshooter.no-server%
%i18n:common.tags.mk-error.troubleshooter.no-server-desc%
%fa:info-circle%%i18n:common.tags.mk-error.troubleshooter.success%
%i18n:common.tags.mk-error.troubleshooter.success-desc%
+ {{ '%i18n:common.tags.mk-error.description%'.substr(0, '%i18n:common.tags.mk-error.description%'.indexOf('{')) }} + {{ '%i18n:common.tags.mk-error.description%'.match(/\{(.+?)\}/)[1] }} + {{ '%i18n:common.tags.mk-error.description%'.substr('%i18n:common.tags.mk-error.description%'.indexOf('}') + 1) }} +
+ +%i18n:common.tags.mk-error.thanks%
+%fa:spinner .spin%%i18n:common.loading%
+%fa:info-circle%%i18n:common.tags.mk-messaging-room.empty%
+%fa:flag%%i18n:common.tags.mk-messaging-room.no-history%
+ + ++ {{ _messages[i + 1]._datetext }} +
+ +%i18n:common.tags.mk-messaging.no-history%
+%fa:spinner .pulse .fw%%i18n:common.loading%
{{ logPos }}ターン目 黒:{{ o.blackCount }} 白:{{ o.whiteCount }} 合計:{{ o.blackCount + o.whiteCount }}
+ +ゲームの設定
+ +他のMisskeyユーザーとオセロで対戦しよう
+オセロは、相手と交互に石をボードに置いてゆき、相手の石を挟んでひっくり返しながら、最終的に残った石が多い方が勝ちというボードゲームです。
++ %fa:exclamation-triangle%%i18n:common.tags.mk-poll-editor.no-only-one-choice% +
++ {{ '%i18n:common.tags.mk-poll.total-users%'.replace('{}', total) }} + ・ + {{ showResult ? '%i18n:common.tags.mk-poll.vote%' : '%i18n:common.tags.mk-poll.show-result%' }} + %i18n:common.tags.mk-poll.voted% +
+{{ title }}
+
+ %fa:spinner .pulse%
+ %i18n:common.tags.mk-stream-indicator.connecting%
+ %fa:spinner .pulse%
+ %i18n:common.tags.mk-stream-indicator.reconnecting%
+ %fa:check% + %i18n:common.tags.mk-stream-indicator.connected% +
+
+
%i18n:common.tags.mk-twitter-setting.description%%i18n:common.tags.mk-twitter-setting.detail%
+%i18n:common.tags.mk-twitter-setting.connected-to%: @{{ os.i.twitter.screenName }}
++ {{ os.i.twitter ? '%i18n:common.tags.mk-twitter-setting.reconnect%' : '%i18n:common.tags.mk-twitter-setting.connect%' }} + or + %i18n:common.tags.mk-twitter-setting.disconnect% +
+Twitter ID: {{ os.i.twitter.userId }}
+%fa:spinner .pulse%{{ ctx.name }}
+
+ %i18n:common.tags.mk-uploader.waiting%
+ {{ req.ip }} + {{ req.method }} + {{ req.path }} +
+%i18n:desktop.tags.mk-broadcast-home-widget.fetching%
+ + %i18n:desktop.tags.mk-broadcast-home-widget.have-a-nice-day% +
+ %i18n:desktop.tags.mk-broadcast-home-widget.next% >> ++ {{ year }}年 + {{ month }}月 +
+{{ day }}日
+{{ weekDay }}曜日
+今日:{{ dayP.toFixed(1) }}%
+今月:{{ monthP.toFixed(1) }}%
+今年:{{ yearP.toFixed(1) }}%
++ {{ '%i18n:desktop.tags.mk-donation-home-widget.text%'.substr(0, '%i18n:desktop.tags.mk-donation-home-widget.text%'.indexOf('{')) }} + @syuilo + {{ '%i18n:desktop.tags.mk-donation-home-widget.text%'.substr('%i18n:desktop.tags.mk-donation-home-widget.text%'.indexOf('}') + 1) }} +
+%fa:spinner .pulse .fw%%i18n:common.loading%
%i18n:desktop.tags.mk-photo-stream-home-widget.no-photos%
+%fa:spinner .pulse .fw%%i18n:common.loading%
%fa:microchip%CPU
+{{ meta.cpu.cores }} Cores
+{{ meta.cpu.model }}
+%fa:R hdd%Storage
+Total: {{ total | bytes(1) }}
+Available: {{ available | bytes(1) }}
+Used: {{ used | bytes(1) }}
+%fa:flask%Memory
+Total: {{ total | bytes(1) }}
+Used: {{ used | bytes(1) }}
+Free: {{ free | bytes(1) }}
+Uptimes
+Process: {{ process ? process.toFixed(0) : '---' }}s
+OS: {{ os ? os.toFixed(0) : '---' }}s
+%fa:spinner .pulse .fw%%i18n:common.loading%
%fa:R lightbulb%
+ver {{ version }} ({{ codename }})
+ + + + + diff --git a/src/client/app/config.ts b/src/client/app/config.ts new file mode 100644 index 000000000..522d7ff05 --- /dev/null +++ b/src/client/app/config.ts @@ -0,0 +1,37 @@ +declare const _HOST_: string; +declare const _HOSTNAME_: string; +declare const _URL_: string; +declare const _API_URL_: string; +declare const _WS_URL_: string; +declare const _DOCS_URL_: string; +declare const _STATS_URL_: string; +declare const _STATUS_URL_: string; +declare const _DEV_URL_: string; +declare const _LANG_: string; +declare const _RECAPTCHA_SITEKEY_: string; +declare const _SW_PUBLICKEY_: string; +declare const _THEME_COLOR_: string; +declare const _COPYRIGHT_: string; +declare const _VERSION_: string; +declare const _CODENAME_: string; +declare const _LICENSE_: string; +declare const _GOOGLE_MAPS_API_KEY_: string; + +export const host = _HOST_; +export const hostname = _HOSTNAME_; +export const url = _URL_; +export const apiUrl = _API_URL_; +export const wsUrl = _WS_URL_; +export const docsUrl = _DOCS_URL_; +export const statsUrl = _STATS_URL_; +export const statusUrl = _STATUS_URL_; +export const devUrl = _DEV_URL_; +export const lang = _LANG_; +export const recaptchaSitekey = _RECAPTCHA_SITEKEY_; +export const swPublickey = _SW_PUBLICKEY_; +export const themeColor = _THEME_COLOR_; +export const copyright = _COPYRIGHT_; +export const version = _VERSION_; +export const codename = _CODENAME_; +export const license = _LICENSE_; +export const googleMapsApiKey = _GOOGLE_MAPS_API_KEY_; diff --git a/src/client/app/desktop/api/choose-drive-file.ts b/src/client/app/desktop/api/choose-drive-file.ts new file mode 100644 index 000000000..fbda600e6 --- /dev/null +++ b/src/client/app/desktop/api/choose-drive-file.ts @@ -0,0 +1,30 @@ +import { url } from '../../config'; +import MkChooseFileFromDriveWindow from '../views/components/choose-file-from-drive-window.vue'; + +export default function(opts) { + return new Promise((res, rej) => { + const o = opts || {}; + + if (document.body.clientWidth > 800) { + const w = new MkChooseFileFromDriveWindow({ + propsData: { + title: o.title, + multiple: o.multiple, + initFolder: o.currentFolder + } + }).$mount(); + w.$once('selected', file => { + res(file); + }); + document.body.appendChild(w.$el); + } else { + window['cb'] = file => { + res(file); + }; + + window.open(url + '/selectdrive', + 'choose_drive_window', + 'height=500, width=800'); + } + }); +} diff --git a/src/client/app/desktop/api/choose-drive-folder.ts b/src/client/app/desktop/api/choose-drive-folder.ts new file mode 100644 index 000000000..9b33a20d9 --- /dev/null +++ b/src/client/app/desktop/api/choose-drive-folder.ts @@ -0,0 +1,17 @@ +import MkChooseFolderFromDriveWindow from '../views/components/choose-folder-from-drive-window.vue'; + +export default function(opts) { + return new Promise((res, rej) => { + const o = opts || {}; + const w = new MkChooseFolderFromDriveWindow({ + propsData: { + title: o.title, + initFolder: o.currentFolder + } + }).$mount(); + w.$once('selected', folder => { + res(folder); + }); + document.body.appendChild(w.$el); + }); +} diff --git a/src/client/app/desktop/api/contextmenu.ts b/src/client/app/desktop/api/contextmenu.ts new file mode 100644 index 000000000..b70d7122d --- /dev/null +++ b/src/client/app/desktop/api/contextmenu.ts @@ -0,0 +1,16 @@ +import Ctx from '../views/components/context-menu.vue'; + +export default function(e, menu, opts?) { + const o = opts || {}; + const vm = new Ctx({ + propsData: { + menu, + x: e.pageX - window.pageXOffset, + y: e.pageY - window.pageYOffset, + } + }).$mount(); + vm.$once('closed', () => { + if (o.closed) o.closed(); + }); + document.body.appendChild(vm.$el); +} diff --git a/src/client/app/desktop/api/dialog.ts b/src/client/app/desktop/api/dialog.ts new file mode 100644 index 000000000..07935485b --- /dev/null +++ b/src/client/app/desktop/api/dialog.ts @@ -0,0 +1,19 @@ +import Dialog from '../views/components/dialog.vue'; + +export default function(opts) { + return new Promise%fa:chart-bar%%i18n:desktop.tags.mk-activity-widget.title%
+ + +%fa:spinner .pulse .fw%%i18n:common.loading%
{{ '%i18n:desktop.tags.mk-calendar-widget.title%'.replace('{1}', year).replace('{2}', month) }}
+ + + +{{ usage.toFixed(1) }}% %i18n:desktop.tags.mk-drive-browser-window.used%
+ %fa:cloud%%i18n:desktop.tags.mk-drive-browser-window.drive% + +%i18n:desktop.tags.mk-drive-browser-file.avatar%
+%i18n:desktop.tags.mk-drive-browser-file.banner%
++ {{ file.name.lastIndexOf('.') != -1 ? file.name.substr(0, file.name.lastIndexOf('.')) : file.name }} + {{ file.name.substr(file.name.lastIndexOf('.')) }} +
++ %fa:R folder-open .fw% + %fa:R folder .fw% + {{ folder.name }} +
+%i18n:desktop.tags.mk-drive-browser.empty-draghover%
+%i18n:desktop.tags.mk-drive-browser.empty-drive%
%i18n:desktop.tags.mk-drive-browser.empty-drive-description%
%i18n:desktop.tags.mk-drive-browser.empty-folder%
+気になるユーザーをフォロー:
+@{{ user | acct }}
+おすすめのユーザーは見つかりませんでした。
+%fa:spinner .pulse .fw%読み込んでいます
ウィジェットを追加:
+ + +ゴミ箱
++ %fa:R comments% + あなた宛ての投稿はありません。 + あなたがフォローしているユーザーからの言及はありません。 +
+
+
+
+ %fa:angle-up%{{ note._datetext }} + %fa:angle-down%{{ _notes[i + 1]._datetext }} +
+ + +
+
%fa:retweet%
+
%fa:quote-left%
+
%fa:user-plus%
+
%fa:reply%
+
%fa:at%
+
%fa:chart-pie%{{ notification.user | userName }}
++ %fa:angle-up%{{ notification._datetext }} + %fa:angle-down%{{ _notifications[i + 1]._datetext }} +
+ +ありません!
+%fa:spinner .pulse .fw%%i18n:common.loading%
{{ 4 - files.length }}/4
+{{ '%i18n:desktop.tags.mk-post-form.text-remain%'.replace('{}', 1000 - text.length) }}
+ + + +待機中
{{ Math.floor((value / max) * 100) }}
+ + +%i18n:desktop.tags.mk-2fa-setting.intro%%i18n:desktop.tags.mk-2fa-setting.detail%
+%fa:exclamation-triangle%%i18n:desktop.tags.mk-2fa-setting.caution%
%i18n:desktop.tags.mk-2fa-setting.already-registered%
+ + +%fa:info-circle%%i18n:desktop.tags.mk-2fa-setting.info%
Token: {{ os.i.token }}
%i18n:desktop.tags.mk-api-info.intro%
+%fa:exclamation-triangle%%i18n:desktop.tags.mk-api-info.caution%
%i18n:desktop.tags.mk-api-info.regeneration-of-token%
+ +%fa:info-circle%%i18n:common.tags.mk-authorized-apps.no-apps%
+{{ app.name }}
+{{ app.description }}
+{{ capacity | bytes }}中{{ usage | bytes }}使用中
+ +%fa:info-circle%%i18n:desktop.tags.mk-mute-setting.no-users%
+{{ user | userName }} @{{ user | acct }}
+%fa:info-circle%変更はページの再度読み込み後に反映されます。
+%fa:exclamation-triangle%クリーンアップを行うと、ブラウザに記憶されたアカウント情報のキャッシュ、書きかけの投稿・返信・メッセージ、およびその他のデータ(設定情報含む)が削除されます。クリーンアップを行った後はページを再度読み込みする必要があります。
+このサーバーの運営者: {{ meta.maintainer.name }}
+
+ バージョン: {{ version }}
+
+
+ 最新のバージョン: {{ latestVersion ? latestVersion : version }}
+
+
%fa:info-circle%Misskeyはソースマップも提供しています。
+{{ props.row.data }}+
{{ props.row.res }}+ +
{{ props.row.data }}+ +
+ %fa:R comments%自分の投稿や、自分がフォローしているユーザーの投稿が表示されます。 +
+{{ message }}
+おかえりなさい、{{ os.i | userName }}さん
+@{{ u | acct }}
+フォローされています
+
+
%fa:spinner .pulse .fw%読み込んでいます
%fa:search%「{{ q }}」に関する投稿は見つかりませんでした。
+%fa:users%%i18n:desktop.tags.mk-user.followers-you-know.title%
+%fa:spinner .pulse .fw%%i18n:desktop.tags.mk-user.followers-you-know.loading%
%i18n:desktop.tags.mk-user.followers-you-know.no-users%
+%fa:users%%i18n:desktop.tags.mk-user.frequently-replied-users.title%
+%fa:spinner .pulse .fw%%i18n:desktop.tags.mk-user.frequently-replied-users.loading%
@{{ friend | acct }}
+%i18n:desktop.tags.mk-user.frequently-replied-users.no-users%
+{{ user | userName }}
+@{{ user | acct }}
+%fa:map-marker%{{ user.profile.location }}
+%i18n:desktop.tags.mk-user.last-used-at%:
%fa:camera%%i18n:desktop.tags.mk-user.photos.title%
+%fa:spinner .pulse .fw%%i18n:desktop.tags.mk-user.photos.loading%
%i18n:desktop.tags.mk-user.photos.no-photos%
+%i18n:desktop.tags.mk-user.follows-you%
+%i18n:desktop.tags.mk-user.muted% %i18n:desktop.tags.mk-user.unmute%
+ +%fa:birthday-cake%{{ user.profile.birthday.replace('-', '年').replace('-', '月') + '日' }} ({{ age }}歳)
+%fa:B twitter%@{{ user.twitter.screenName }}
+%fa:angle-right%{{ user.notesCount }}投稿
+%fa:angle-right%{{ user.followingCount }}人をフォロー
+%fa:angle-right%{{ user.followersCount }}人のフォロワー
+%fa:R comments%このユーザーはまだ何も投稿していないようです。
+ようこそ! MisskeyはTwitter風ミニブログSNSです。思ったことや皆と共有したいことを投稿しましょう。タイムラインを見れば、皆の関心事をすぐにチェックすることもできます。詳しく...
+ +読み込み中
まだ投稿がありません
+%fa:tv%{{ channel ? channel.title : '%i18n:desktop.tags.mk-channel-home-widget.title%' }}
+ + +%i18n:desktop.tags.mk-channel-home-widget.get-started%
+%fa:comments%%i18n:desktop.tags.mk-messaging-home-widget.title%
+%fa:R bell%%i18n:desktop.tags.mk-notifications-home-widget.title%
+ + +%fa:chart-pie%%i18n:desktop.tags.mk-recommended-polls-home-widget.title%
+ + +%i18n:desktop.tags.mk-recommended-polls-home-widget.nothing%
+%fa:spinner .pulse .fw%%i18n:common.loading%
%fa:pencil-alt%%i18n:desktop.tags.mk-post-form-home-widget.title%
+ + + +@{{ os.i | acct }}
+%fa:fire%%i18n:desktop.tags.mk-trends-home-widget.title%
+ + +%fa:spinner .pulse .fw%%i18n:common.loading%
%i18n:desktop.tags.mk-trends-home-widget.nothing%
+%fa:users%%i18n:desktop.tags.mk-user-recommendation-home-widget.title%
+ + +%fa:spinner .pulse .fw%%i18n:common.loading%
@{{ _user | acct }}
+%i18n:desktop.tags.mk-user-recommendation-home-widget.no-one%
+読み込み中
+読み込み中
+ +%fa:spinner .pulse .fw%確認しています...
+%fa:fw check%利用できます
+%fa:fw exclamation-triangle%既に利用されています
+%fa:fw exclamation-triangle%通信エラー
+%fa:fw exclamation-triangle%a~z、A~Z、0~9、_が使えます
+%fa:fw exclamation-triangle%1文字以上でお願いします!
+%fa:fw exclamation-triangle%30文字以内でお願いします
+お使いのブラウザ(またはOS)のバージョンを更新すると解決する可能性があります。
' + + 'エラーコード: ${e.toString()}
` + + `ブラウザ バージョン: ${navigator.userAgent}
` + + `クライアント バージョン: ${version}
` + + '問題が解決しない場合は、上記の情報をお書き添えの上 syuilotan@yahoo.co.jp までご連絡ください。
' + + 'Thank you for using Misskey.
' + + '+ %fa:camera%%i18n:mobile.tags.mk-drive-file-viewer.exif% +
+{{ exif ? JSON.stringify(exif, null, 2) : '' }}+
+ %fa:hashtag%%i18n:mobile.tags.mk-drive-file-viewer.hash% +
+{{ file.md5 }}
+ + {{ file.name.lastIndexOf('.') != -1 ? file.name.substr(0, file.name.lastIndexOf('.')) : file.name }} + {{ file.name.substr(file.name.lastIndexOf('.')) }} +
+ + +%fa:folder%{{ folder.name }}
%fa:angle-right% +{{ (info.usage / info.capacity * 100).toFixed(1) }}% %i18n:mobile.tags.mk-drive.used%
++ {{ folder.foldersCount }} %i18n:mobile.tags.mk-drive.folder-count% + %i18n:mobile.tags.mk-drive.count-separator% + {{ folder.filesCount }} %i18n:mobile.tags.mk-drive.file-count% +
+%i18n:mobile.tags.mk-drive.load-more%
+%i18n:mobile.tags.mk-drive.nothing-in-drive%
+%i18n:mobile.tags.mk-drive.folder-is-empty%
+
+
+
+ %fa:angle-up%{{ note._datetext }} + %fa:angle-down%{{ _notes[i + 1]._datetext }} +
+ + +%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%
+%fa:retweet%{{ notification.note.user | userName }}
+%fa:quote-left%{{ getNoteSummary(notification.note.renote) }}%fa:quote-right%
+%fa:quote-left%{{ notification.note.user | userName }}
+{{ getNoteSummary(notification.note) }}
+%fa:user-plus%{{ notification.user | userName }}
+%fa:reply%{{ notification.note.user | userName }}
+{{ getNoteSummary(notification.note) }}
+%fa:at%{{ notification.note.user | userName }}
+{{ getNoteSummary(notification.note) }}
+%fa:chart-pie%{{ notification.user | userName }}
+%fa:quote-left%{{ getNoteSummary(notification.note) }}%fa:quote-right%
+
+
+ %fa:retweet%
+
+ %fa:user-plus%
+
+ %fa:chart-pie%
+
+ %fa:angle-up%{{ notification._datetext }} + %fa:angle-down%{{ _notifications[i + 1]._datetext }} +
+ +%i18n:mobile.tags.mk-notifications.empty%
+%fa:spinner .pulse .fw%%i18n:common.loading%
おかえりなさい、{{ os.i | userName }}さん
+
+
%fa:spinner .pulse .fw%%i18n:common.loading%
%fa:info-circle%%i18n:mobile.tags.mk-profile-setting.will-be-published%
+ver {{ version }} ({{ codename }})
+いつでも、どこからでもMisskeyを利用できます。もちろん、無料です。
+新規登録
++ %fa:map-marker%{{ user.profile.location }} +
++ %fa:birthday-cake%{{ user.profile.birthday.replace('-', '年').replace('-', '月') + '日' }} ({{ age }}歳) +
+%fa:spinner .pulse .fw%%i18n:mobile.tags.mk-user-overview-followers-you-know.loading%
%i18n:mobile.tags.mk-user-overview-followers-you-know.no-users%
+%fa:spinner .pulse .fw%%i18n:mobile.tags.mk-user-overview-frequently-replied-users.loading%
%i18n:mobile.tags.mk-user-overview-frequently-replied-users.no-users%
+%fa:spinner .pulse .fw%%i18n:mobile.tags.mk-user-overview-notes.loading%
%i18n:mobile.tags.mk-user-overview-notes.no-notes%
+%fa:spinner .pulse .fw%%i18n:mobile.tags.mk-user-overview-photos.loading%
%i18n:mobile.tags.mk-user-overview-photos.no-photos%
+%i18n:mobile.tags.mk-user-overview.last-used-at%:
Twitter風ミニブログSNS、Misskeyへようこそ。共有したいことを投稿したり、タイムラインでみんなの投稿を読むこともできます。
アカウントを作成する
%fa:lock% ログイン
+%fa:comments R% タイムラインを見てみる
+