diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2021-03-03 01:04:45 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2021-03-03 01:04:45 +0900 |
| commit | 9a4a534c92f6c9c112438f2a494de9d0d707d46d (patch) | |
| tree | 791dc0180be776a0513bd14fd48bad1de6e9659a /src | |
| parent | Merge branch 'develop' (diff) | |
| parent | 12.73.0 (diff) | |
| download | misskey-9a4a534c92f6c9c112438f2a494de9d0d707d46d.tar.gz misskey-9a4a534c92f6c9c112438f2a494de9d0d707d46d.tar.bz2 misskey-9a4a534c92f6c9c112438f2a494de9d0d707d46d.zip | |
Merge branch 'develop'
Diffstat (limited to 'src')
84 files changed, 513 insertions, 330 deletions
diff --git a/src/client/components/autocomplete.vue b/src/client/components/autocomplete.vue index 1fe74adc66..ae742610f7 100644 --- a/src/client/components/autocomplete.vue +++ b/src/client/components/autocomplete.vue @@ -401,8 +401,7 @@ export default defineComponent({ z-index: 65535; max-width: 100%; margin-top: calc(1em + 8px); - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; transition: top 0.1s ease, left 0.1s ease; > ol { @@ -419,8 +418,7 @@ export default defineComponent({ align-items: center; padding: 4px 12px; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; font-size: 0.9em; cursor: default; @@ -429,8 +427,7 @@ export default defineComponent({ } * { - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; } diff --git a/src/client/components/channel-preview.vue b/src/client/components/channel-preview.vue index 3e24774f52..e222ad7ae7 100644 --- a/src/client/components/channel-preview.vue +++ b/src/client/components/channel-preview.vue @@ -66,8 +66,7 @@ export default defineComponent({ <style lang="scss" scoped> .eftoefju { display: block; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; width: 100%; &:hover { diff --git a/src/client/components/drive.file.vue b/src/client/components/drive.file.vue index 80283f997b..d2b8b95f73 100644 --- a/src/client/components/drive.file.vue +++ b/src/client/components/drive.file.vue @@ -342,8 +342,7 @@ export default defineComponent({ text-align: center; word-break: break-all; color: var(--fg); - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > .ext { opacity: 0.5; diff --git a/src/client/components/emoji-picker.vue b/src/client/components/emoji-picker.vue index 7c82211993..f7eaeb2bfe 100644 --- a/src/client/components/emoji-picker.vue +++ b/src/client/components/emoji-picker.vue @@ -62,10 +62,6 @@ <header class="_acrylic">{{ $ts.emoji }}</header> <XSection v-for="category in categories" :emojis="emojilist.filter(e => e.category === category).map(e => e.char)">{{ category }}</XSection> </div> - <div> - <header class="_acrylic">{{ $ts.tags }}</header> - <XSection v-for="tag in emojiTags" :emojis="customEmojis.filter(e => e.aliases.includes(tag)).map(e => ':' + e.name + ':')">{{ tag }}</XSection> - </div> </div> <div class="tabs"> <button class="_button tab" :class="{ active: tab === 'index' }" @click="tab = 'index'"><Fa :icon="faAsterisk" fixed-width/></button> @@ -86,7 +82,7 @@ import Particle from '@/components/particle.vue'; import * as os from '@/os'; import { isDeviceTouch } from '@/scripts/is-device-touch'; import { isMobile } from '@/scripts/is-mobile'; -import { emojiCategories, emojiTags } from '@/instance'; +import { emojiCategories } from '@/instance'; import XSection from './emoji-picker.section.vue'; export default defineComponent({ @@ -115,7 +111,6 @@ export default defineComponent({ height: this.asReactionPicker ? this.$store.state.reactionPickerHeight : 2, big: this.asReactionPicker ? isDeviceTouch : false, customEmojiCategories: emojiCategories, - emojiTags, customEmojis: this.$instance.emojis, q: null, searchResultCustom: [], diff --git a/src/client/components/form/input.vue b/src/client/components/form/input.vue index f16d8be026..f0aa6b0534 100644 --- a/src/client/components/form/input.vue +++ b/src/client/components/form/input.vue @@ -261,8 +261,7 @@ export default defineComponent({ display: inline-block; min-width: 16px; max-width: 150px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } diff --git a/src/client/components/form/link.vue b/src/client/components/form/link.vue index 6f0ae0e5f7..2efc6b58c9 100644 --- a/src/client/components/form/link.vue +++ b/src/client/components/form/link.vue @@ -8,7 +8,7 @@ <Fa :icon="faExternalLinkAlt" class="icon"/> </span> </a> - <MkA class="main _button _formPanel _formClickable" :class="{ active }" :to="to" v-else> + <MkA class="main _button _formPanel _formClickable" :class="{ active }" :to="to" :behavior="behavior" v-else> <span class="icon"><slot name="icon"></slot></span> <span class="text"><slot></slot></span> <span class="right"> @@ -38,6 +38,10 @@ export default defineComponent({ type: Boolean, required: false }, + behavior: { + type: String, + required: false, + }, }, data() { return { @@ -83,8 +87,7 @@ export default defineComponent({ > .text { white-space: nowrap; text-overflow: ellipsis; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; padding-right: 12px; } diff --git a/src/client/components/global/a.vue b/src/client/components/global/a.vue index cf894deaba..d293cb571f 100644 --- a/src/client/components/global/a.vue +++ b/src/client/components/global/a.vue @@ -98,6 +98,11 @@ export default defineComponent({ }, nav() { + if (this.behavior === 'browser') { + location.href = this.to; + return; + } + if (this.to.startsWith('/my/messaging')) { if (ColdDeviceStorage.get('chatOpenBehavior') === 'window') return this.window(); if (ColdDeviceStorage.get('chatOpenBehavior') === 'popout') return this.popout(); diff --git a/src/client/components/global/avatar.vue b/src/client/components/global/avatar.vue index 8930bb4a0c..d2f25fa41e 100644 --- a/src/client/components/global/avatar.vue +++ b/src/client/components/global/avatar.vue @@ -101,8 +101,7 @@ export default defineComponent({ top: 0; border-radius: 100%; z-index: 1; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; object-fit: cover; width: 100%; height: 100%; diff --git a/src/client/components/global/misskey-flavored-markdown.vue b/src/client/components/global/misskey-flavored-markdown.vue index 0b34ccbfb4..a3f443d5d8 100644 --- a/src/client/components/global/misskey-flavored-markdown.vue +++ b/src/client/components/global/misskey-flavored-markdown.vue @@ -126,8 +126,7 @@ export default defineComponent({ &.nowrap { white-space: pre; word-wrap: normal; // https://codeday.me/jp/qa/20190424/690106.html - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; } diff --git a/src/client/components/instance-stats.vue b/src/client/components/instance-stats.vue index 80070996fc..e9b496180a 100644 --- a/src/client/components/instance-stats.vue +++ b/src/client/components/instance-stats.vue @@ -692,8 +692,7 @@ export default defineComponent({ > dd { text-overflow: ellipsis; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; white-space: nowrap; } diff --git a/src/client/components/instance-ticker.vue b/src/client/components/instance-ticker.vue index fa46f8edc4..1ce5a1c2c1 100644 --- a/src/client/components/instance-ticker.vue +++ b/src/client/components/instance-ticker.vue @@ -44,8 +44,7 @@ export default defineComponent({ height: $height; border-radius: 4px 0 0 4px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; color: #fff; > .icon { diff --git a/src/client/components/media-banner.vue b/src/client/components/media-banner.vue index 4fc6701d36..a2e1776d09 100644 --- a/src/client/components/media-banner.vue +++ b/src/client/components/media-banner.vue @@ -62,8 +62,7 @@ export default defineComponent({ width: 100%; border-radius: 4px; margin-top: 4px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > .download, > .sensitive { @@ -78,8 +77,7 @@ export default defineComponent({ } > b { - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; } diff --git a/src/client/components/media-image.vue b/src/client/components/media-image.vue index 5f55d88388..9f3898ec56 100644 --- a/src/client/components/media-image.vue +++ b/src/client/components/media-image.vue @@ -143,8 +143,7 @@ export default defineComponent({ > a { display: block; cursor: zoom-in; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; width: 100%; height: 100%; background-position: center; diff --git a/src/client/components/media-list.vue b/src/client/components/media-list.vue index 61482266ab..36fbb4bd06 100644 --- a/src/client/components/media-list.vue +++ b/src/client/components/media-list.vue @@ -105,8 +105,7 @@ export default defineComponent({ grid-gap: 4px; > * { - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; border-radius: 6px; } diff --git a/src/client/components/media-video.vue b/src/client/components/media-video.vue index dbde40f666..3788947206 100644 --- a/src/client/components/media-video.vue +++ b/src/client/components/media-video.vue @@ -78,8 +78,7 @@ export default defineComponent({ align-items: center; font-size: 3.5em; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; background-position: center; background-size: cover; width: 100%; diff --git a/src/client/components/note-detailed.vue b/src/client/components/note-detailed.vue index 7df87c6b01..b5bc054e5e 100644 --- a/src/client/components/note-detailed.vue +++ b/src/client/components/note-detailed.vue @@ -886,8 +886,7 @@ export default defineComponent({ .note { position: relative; transition: box-shadow 0.1s ease; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; contain: content; &:focus-visible { @@ -947,8 +946,7 @@ export default defineComponent({ } > span { - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; flex-shrink: 1; text-overflow: ellipsis; white-space: nowrap; diff --git a/src/client/components/note-header.vue b/src/client/components/note-header.vue index aed4225067..1f7a07bac3 100644 --- a/src/client/components/note-header.vue +++ b/src/client/components/note-header.vue @@ -61,8 +61,7 @@ export default defineComponent({ display: block; margin: 0 .5em 0 0; padding: 0; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; font-size: 1em; font-weight: bold; text-decoration: none; @@ -91,8 +90,7 @@ export default defineComponent({ > .username { margin: 0 .5em 0 0; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; } diff --git a/src/client/components/note-preview.vue b/src/client/components/note-preview.vue index 4715c299b5..4ea97d17ee 100644 --- a/src/client/components/note-preview.vue +++ b/src/client/components/note-preview.vue @@ -50,8 +50,7 @@ export default defineComponent({ display: flex; margin: 0; padding: 0; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; font-size: 0.95em; > .avatar { diff --git a/src/client/components/note.vue b/src/client/components/note.vue index dab7643762..bc2f87fe85 100644 --- a/src/client/components/note.vue +++ b/src/client/components/note.vue @@ -861,8 +861,7 @@ export default defineComponent({ .tkcbzcuz { position: relative; transition: box-shadow 0.1s ease; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; contain: content; // これらの指定はパフォーマンス向上には有効だが、ノートの高さは一定でないため、 @@ -949,8 +948,7 @@ export default defineComponent({ } > span { - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; flex-shrink: 1; text-overflow: ellipsis; white-space: nowrap; @@ -1022,8 +1020,7 @@ export default defineComponent({ &.collapsed { position: relative; max-height: 9em; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > .fade { display: block; diff --git a/src/client/components/notification.vue b/src/client/components/notification.vue index a0cfe4f213..2fe8500891 100644 --- a/src/client/components/notification.vue +++ b/src/client/components/notification.vue @@ -257,8 +257,7 @@ export default defineComponent({ text-overflow: ellipsis; white-space: nowrap; min-width: 0; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; } > .time { @@ -269,8 +268,7 @@ export default defineComponent({ > .text { white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; > [data-icon] { diff --git a/src/client/components/poll.vue b/src/client/components/poll.vue index 01bbefe36d..7f13e135aa 100644 --- a/src/client/components/poll.vue +++ b/src/client/components/poll.vue @@ -112,8 +112,7 @@ export default defineComponent({ padding: 4px 8px; border: solid 1px var(--divider); border-radius: 4px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; cursor: pointer; &:hover { diff --git a/src/client/components/post-form-attaches.vue b/src/client/components/post-form-attaches.vue index 3b5cb75c19..230c944de1 100644 --- a/src/client/components/post-form-attaches.vue +++ b/src/client/components/post-form-attaches.vue @@ -127,8 +127,7 @@ export default defineComponent({ height: 64px; margin-right: 4px; border-radius: 4px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; cursor: move; &:hover > .remove { diff --git a/src/client/components/sidebar.vue b/src/client/components/sidebar.vue index 6460043244..f7c50a2ba5 100644 --- a/src/client/components/sidebar.vue +++ b/src/client/components/sidebar.vue @@ -390,8 +390,7 @@ export default defineComponent({ font-size: $ui-font-size; line-height: 3rem; text-overflow: ellipsis; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; white-space: nowrap; width: 100%; text-align: left; diff --git a/src/client/components/toast.vue b/src/client/components/toast.vue index 49c14789b7..fb0de68092 100644 --- a/src/client/components/toast.vue +++ b/src/client/components/toast.vue @@ -67,8 +67,7 @@ export default defineComponent({ height: 100%; box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3); border-radius: 8px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; } } </style> diff --git a/src/client/components/ui/button.vue b/src/client/components/ui/button.vue index e98c5efcc0..3901e8ae44 100644 --- a/src/client/components/ui/button.vue +++ b/src/client/components/ui/button.vue @@ -124,8 +124,7 @@ export default defineComponent({ text-decoration: none; background: var(--buttonBg); border-radius: 999px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; &:not(:disabled):hover { background: var(--buttonHoverBg); @@ -213,8 +212,7 @@ export default defineComponent({ width: 100%; height: 100%; border-radius: 6px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; ::v-deep(div) { position: absolute; diff --git a/src/client/components/ui/container.vue b/src/client/components/ui/container.vue index b9360e92fa..c3353cca89 100644 --- a/src/client/components/ui/container.vue +++ b/src/client/components/ui/container.vue @@ -116,8 +116,7 @@ export default defineComponent({ .ukygtjoj { position: relative; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; &.naked { background: transparent !important; diff --git a/src/client/components/ui/input.vue b/src/client/components/ui/input.vue index cea1ec1b7f..1c5222f8f2 100644 --- a/src/client/components/ui/input.vue +++ b/src/client/components/ui/input.vue @@ -298,8 +298,7 @@ export default defineComponent({ transform: scale(.75); white-space: nowrap; width: 133%; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; > .warning { @@ -355,8 +354,7 @@ export default defineComponent({ display: inline-block; min-width: 16px; max-width: 150px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } diff --git a/src/client/components/ui/menu.vue b/src/client/components/ui/menu.vue index c9accf7c31..c2033402e3 100644 --- a/src/client/components/ui/menu.vue +++ b/src/client/components/ui/menu.vue @@ -155,8 +155,7 @@ export default defineComponent({ font-size: 0.9em; line-height: 20px; text-align: center; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; &.danger { diff --git a/src/client/components/ui/modal-window.vue b/src/client/components/ui/modal-window.vue index 3965b537e5..2cdf961379 100644 --- a/src/client/components/ui/modal-window.vue +++ b/src/client/components/ui/modal-window.vue @@ -89,8 +89,7 @@ export default defineComponent({ <style lang="scss" scoped> .ebkgoccj { - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; display: flex; flex-direction: column; contain: content; @@ -124,8 +123,7 @@ export default defineComponent({ padding-left: 32px; font-weight: bold; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; pointer-events: none; diff --git a/src/client/components/ui/range.vue b/src/client/components/ui/range.vue index cbdf07d6b6..4cfe66a8fc 100644 --- a/src/client/components/ui/range.vue +++ b/src/client/components/ui/range.vue @@ -89,8 +89,7 @@ export default defineComponent({ pointer-events: none; font-size: 16px; color: var(--inputLabel); - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; } > input { diff --git a/src/client/components/ui/window.vue b/src/client/components/ui/window.vue index 4d3b048c11..501a3bf8ee 100644 --- a/src/client/components/ui/window.vue +++ b/src/client/components/ui/window.vue @@ -402,8 +402,7 @@ export default defineComponent({ } > .body { - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; display: flex; flex-direction: column; contain: content; @@ -438,8 +437,7 @@ export default defineComponent({ position: relative; line-height: var(--height); white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; text-align: center; cursor: move; diff --git a/src/client/components/url-preview.vue b/src/client/components/url-preview.vue index a7068d1619..7a59068710 100644 --- a/src/client/components/url-preview.vue +++ b/src/client/components/url-preview.vue @@ -244,8 +244,7 @@ export default defineComponent({ font-size: 14px; box-shadow: 0 0 0 1px var(--divider); border-radius: 8px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; &:hover { text-decoration: none; @@ -327,8 +326,7 @@ export default defineComponent({ &.compact { > article { > header h1, p, footer { - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } diff --git a/src/client/components/user-info.vue b/src/client/components/user-info.vue index b744f21929..711e367411 100644 --- a/src/client/components/user-info.vue +++ b/src/client/components/user-info.vue @@ -110,8 +110,7 @@ export default defineComponent({ display: -webkit-box; -webkit-line-clamp: 3; -webkit-box-orient: vertical; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; } } diff --git a/src/client/components/user-preview.vue b/src/client/components/user-preview.vue index 86e53228ce..c4588e478a 100644 --- a/src/client/components/user-preview.vue +++ b/src/client/components/user-preview.vue @@ -111,8 +111,7 @@ export default defineComponent({ position: absolute; z-index: 11000; width: 300px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; transform-origin: center top; > .info { diff --git a/src/client/components/users-dialog.vue b/src/client/components/users-dialog.vue index af47391c5d..014748adc6 100644 --- a/src/client/components/users-dialog.vue +++ b/src/client/components/users-dialog.vue @@ -66,8 +66,7 @@ export default defineComponent({ height: 350px; background: var(--panel); border-radius: var(--radius); - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; display: flex; flex-direction: column; @@ -128,8 +127,7 @@ export default defineComponent({ > .body { padding: 0 8px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > .name { display: block; diff --git a/src/client/components/visibility-picker.vue b/src/client/components/visibility-picker.vue index 66dd9c2aed..e518f48d0d 100644 --- a/src/client/components/visibility-picker.vue +++ b/src/client/components/visibility-picker.vue @@ -141,8 +141,7 @@ export default defineComponent({ > *:nth-child(2) { flex: 1 1 auto; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; > span:first-child { diff --git a/src/client/init.ts b/src/client/init.ts index 6a539a0e1d..b3c53db7bb 100644 --- a/src/client/init.ts +++ b/src/client/init.ts @@ -67,6 +67,7 @@ console.info(`Misskey v${version}`); // boot.jsのやつを解除 window.onerror = null; +window.onunhandledrejection = null; if (_DEV_) { console.warn('Development mode!!!'); diff --git a/src/client/os.ts b/src/client/os.ts index e97c2d7ba0..2b72391bf5 100644 --- a/src/client/os.ts +++ b/src/client/os.ts @@ -305,7 +305,7 @@ export async function pickEmoji(src?: HTMLElement, opts) { type AwaitType<T> = T extends Promise<infer U> ? U : - T extends (...args: Array<any>) => Promise<infer V> ? V : + T extends (...args: any[]) => Promise<infer V> ? V : T; let openingEmojiPicker: AwaitType<ReturnType<typeof popup>> | null = null; let activeTextarea: HTMLTextAreaElement | HTMLInputElement | null = null; diff --git a/src/client/pages/about-misskey.vue b/src/client/pages/about-misskey.vue index fa47a80492..7022a924b0 100644 --- a/src/client/pages/about-misskey.vue +++ b/src/client/pages/about-misskey.vue @@ -1,5 +1,5 @@ <template> -<div style="overflow: hidden; overflow: clip;"> +<div style="overflow: hidden;"> <FormBase class="znqjceqz"> <div id="debug"></div> <section class="_formItem about"> diff --git a/src/client/pages/follow-requests.vue b/src/client/pages/follow-requests.vue index 18f39642e4..04d739088f 100644 --- a/src/client/pages/follow-requests.vue +++ b/src/client/pages/follow-requests.vue @@ -104,8 +104,7 @@ export default defineComponent({ display: block; white-space: nowrap; text-overflow: ellipsis; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; margin: 0; } @@ -125,8 +124,7 @@ export default defineComponent({ width: 55%; line-height: 42px; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; opacity: 0.7; font-size: 14px; diff --git a/src/client/pages/instance/emojis.vue b/src/client/pages/instance/emojis.vue index 71b6c11b2d..6a51813bb2 100644 --- a/src/client/pages/instance/emojis.vue +++ b/src/client/pages/instance/emojis.vue @@ -178,20 +178,17 @@ export default defineComponent({ > .body { padding: 0 0 0 8px; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > .name { text-overflow: ellipsis; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; } > .info { opacity: 0.5; text-overflow: ellipsis; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; } } } @@ -222,20 +219,17 @@ export default defineComponent({ > .body { padding: 0 0 0 8px; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > .name { text-overflow: ellipsis; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; } > .info { opacity: 0.5; text-overflow: ellipsis; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; } } } diff --git a/src/client/pages/messaging/index.vue b/src/client/pages/messaging/index.vue index 8e7fe5134a..aefc31f3bc 100644 --- a/src/client/pages/messaging/index.vue +++ b/src/client/pages/messaging/index.vue @@ -226,14 +226,12 @@ export default defineComponent({ align-items: center; margin-bottom: 2px; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > .name { margin: 0; padding: 0; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; font-size: 1em; font-weight: bold; @@ -264,8 +262,7 @@ export default defineComponent({ display: block; margin: 0 0 0 0; padding: 0; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; overflow-wrap: break-word; font-size: 1.1em; color: var(--faceText); diff --git a/src/client/pages/messaging/messaging-room.message.vue b/src/client/pages/messaging/messaging-room.message.vue index 3d994c2666..d379c0c3c0 100644 --- a/src/client/pages/messaging/messaging-room.message.vue +++ b/src/client/pages/messaging/messaging-room.message.vue @@ -154,8 +154,7 @@ export default defineComponent({ display: block; margin: 0; padding: 0; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; overflow-wrap: break-word; font-size: 1em; color: rgba(#000, 0.5); @@ -165,8 +164,7 @@ export default defineComponent({ display: block; margin: 0; padding: 12px 18px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; overflow-wrap: break-word; word-break: break-word; font-size: 1em; @@ -184,8 +182,7 @@ export default defineComponent({ display: block; max-width: 100%; border-radius: 16px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-decoration: none; &:hover { diff --git a/src/client/pages/page-editor/page-editor.container.vue b/src/client/pages/page-editor/page-editor.container.vue index 5e89b8c2bf..46e2dca157 100644 --- a/src/client/pages/page-editor/page-editor.container.vue +++ b/src/client/pages/page-editor/page-editor.container.vue @@ -74,8 +74,7 @@ export default defineComponent({ <style lang="scss" scoped> .cpjygsrt { position: relative; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; background: var(--panel); border: solid 2px var(--X12); border-radius: 6px; diff --git a/src/client/pages/reversi/game.board.vue b/src/client/pages/reversi/game.board.vue index a3c7900d20..8ce232af07 100644 --- a/src/client/pages/reversi/game.board.vue +++ b/src/client/pages/reversi/game.board.vue @@ -434,8 +434,7 @@ export default defineComponent({ > div { background: transparent; border-radius: 6px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; * { pointer-events: none; diff --git a/src/client/pages/reversi/game.setting.vue b/src/client/pages/reversi/game.setting.vue index 3ed4d2c67b..404e560a06 100644 --- a/src/client/pages/reversi/game.setting.vue +++ b/src/client/pages/reversi/game.setting.vue @@ -333,8 +333,7 @@ export default defineComponent({ background: transparent; border: solid 2px var(--divider); border-radius: 6px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; cursor: pointer; * { diff --git a/src/client/pages/settings/drive.vue b/src/client/pages/settings/drive.vue index 869af77f37..8ca8bc9eec 100644 --- a/src/client/pages/settings/drive.vue +++ b/src/client/pages/settings/drive.vue @@ -230,8 +230,7 @@ export default defineComponent({ $size: 12px; background: rgba(0, 0, 0, 0.1); border-radius: ($size / 2); - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > div { height: $size; diff --git a/src/client/pages/settings/other.vue b/src/client/pages/settings/other.vue index c0b9625098..a14e101328 100644 --- a/src/client/pages/settings/other.vue +++ b/src/client/pages/settings/other.vue @@ -23,13 +23,16 @@ <FormLink to="/settings/registry"><template #icon><Fa :icon="faCogs"/></template>{{ $ts.registry }}</FormLink> + <FormLink to="/bios" behavior="browser"><template #icon><Fa :icon="faDoorOpen"/></template>BIOS</FormLink> + <FormLink to="/cli" behavior="browser"><template #icon><Fa :icon="faDoorOpen"/></template>CLI</FormLink> + <FormButton @click="closeAccount" danger>{{ $ts.closeAccount }}</FormButton> </FormBase> </template> <script lang="ts"> import { defineAsyncComponent, defineComponent } from 'vue'; -import { faEllipsisH, faCogs } from '@fortawesome/free-solid-svg-icons'; +import { faEllipsisH, faCogs, faDoorOpen } from '@fortawesome/free-solid-svg-icons'; import FormSwitch from '@/components/form/switch.vue'; import FormSelect from '@/components/form/select.vue'; import FormLink from '@/components/form/link.vue'; @@ -61,7 +64,7 @@ export default defineComponent({ icon: faEllipsisH }, debug, - faCogs + faCogs, faDoorOpen, } }, diff --git a/src/client/pages/settings/security.vue b/src/client/pages/settings/security.vue index 913e0e64bf..cdb5705c0b 100644 --- a/src/client/pages/settings/security.vue +++ b/src/client/pages/settings/security.vue @@ -144,8 +144,7 @@ export default defineComponent({ flex: 1; min-width: 0; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; margin-right: 12px; } diff --git a/src/client/pages/settings/theme.vue b/src/client/pages/settings/theme.vue index e230a2276b..ac57c51df4 100644 --- a/src/client/pages/settings/theme.vue +++ b/src/client/pages/settings/theme.vue @@ -184,8 +184,7 @@ export default defineComponent({ position: absolute; top: 50%; left: 50%; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; padding: 0 100px; transform: translate3d(-50%, -50%, 0); diff --git a/src/client/pages/user/index.vue b/src/client/pages/user/index.vue index 959170f526..5229db9ee3 100644 --- a/src/client/pages/user/index.vue +++ b/src/client/pages/user/index.vue @@ -369,8 +369,7 @@ export default defineComponent({ position: relative; height: 450px; border-radius: 16px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; background-size: cover; background-position: center; @@ -473,8 +472,7 @@ export default defineComponent({ > .name { width: 30%; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-weight: bold; @@ -482,8 +480,7 @@ export default defineComponent({ > .value { width: 70%; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; white-space: nowrap; text-overflow: ellipsis; margin: 0; @@ -545,8 +542,7 @@ export default defineComponent({ .ftskorzw.narrow { max-width: 100vw; box-sizing: border-box; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > .punished { font-size: 0.8em; @@ -557,14 +553,12 @@ export default defineComponent({ > .main { position: relative; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > .banner-container { position: relative; height: 250px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; background-size: cover; background-position: center; @@ -709,8 +703,7 @@ export default defineComponent({ > .name { width: 30%; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; white-space: nowrap; text-overflow: ellipsis; font-weight: bold; @@ -719,8 +712,7 @@ export default defineComponent({ > .value { width: 70%; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; white-space: nowrap; text-overflow: ellipsis; margin: 0; diff --git a/src/client/pages/welcome.entrance.a.vue b/src/client/pages/welcome.entrance.a.vue index 46a52f4189..4d356774eb 100644 --- a/src/client/pages/welcome.entrance.a.vue +++ b/src/client/pages/welcome.entrance.a.vue @@ -167,8 +167,7 @@ export default defineComponent({ margin: auto; width: 500px; height: calc(100% - 128px); - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; -webkit-mask-image: linear-gradient(0deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 128px, rgba(0,0,0,1) calc(100% - 128px), rgba(0,0,0,0) 100%); mask-image: linear-gradient(0deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 128px, rgba(0,0,0,1) calc(100% - 128px), rgba(0,0,0,0) 100%); diff --git a/src/client/pages/welcome.entrance.b.vue b/src/client/pages/welcome.entrance.b.vue index 0dc91359d0..8a6f60e726 100644 --- a/src/client/pages/welcome.entrance.b.vue +++ b/src/client/pages/welcome.entrance.b.vue @@ -151,8 +151,7 @@ export default defineComponent({ margin: auto; width: 500px; height: calc(100% - 128px); - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; -webkit-mask-image: linear-gradient(0deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 128px, rgba(0,0,0,1) calc(100% - 128px), rgba(0,0,0,0) 100%); mask-image: linear-gradient(0deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 128px, rgba(0,0,0,1) calc(100% - 128px), rgba(0,0,0,0) 100%); } diff --git a/src/client/pages/welcome.setup.vue b/src/client/pages/welcome.setup.vue index 9c1315cc40..bc994099ac 100644 --- a/src/client/pages/welcome.setup.vue +++ b/src/client/pages/welcome.setup.vue @@ -71,8 +71,7 @@ export default defineComponent({ .mk-setup { border-radius: var(--radius); box-shadow: 0 8px 16px rgba(0, 0, 0, 0.1); - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > h1 { margin: 0; diff --git a/src/client/style.scss b/src/client/style.scss index aa2face04e..b6a83d967e 100644 --- a/src/client/style.scss +++ b/src/client/style.scss @@ -241,8 +241,7 @@ hr { border-radius: var(--radius); //border: var(--panelBorder); box-shadow: var(--panelShadow); - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; } ._card { @@ -458,14 +457,6 @@ hr { opacity: 0.7; } -// TODO: refactor: 全てのvueファイル中の text-overflow: ellipsis; している箇所をこのクラスを使って置き換える -._oneline { - white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; - text-overflow: ellipsis; -} - ._monospace { font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace; } diff --git a/src/client/ui/_common_/header.vue b/src/client/ui/_common_/header.vue index 3f4796d7a1..f150653a84 100644 --- a/src/client/ui/_common_/header.vue +++ b/src/client/ui/_common_/header.vue @@ -132,8 +132,7 @@ export default defineComponent({ display: inline-block; vertical-align: bottom; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; padding: 0 16px; position: relative; diff --git a/src/client/ui/_common_/upload.vue b/src/client/ui/_common_/upload.vue index 6262d0b725..c1986737d7 100644 --- a/src/client/ui/_common_/upload.vue +++ b/src/client/ui/_common_/upload.vue @@ -89,8 +89,7 @@ export default defineComponent({ font-size: 0.8em; white-space: nowrap; text-overflow: ellipsis; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; flex-shrink: 1; } .mk-uploader > ol > li > .top > .name > [data-icon] { @@ -120,8 +119,7 @@ export default defineComponent({ background: transparent; border: none; border-radius: 4px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; grid-column: 2/3; grid-row: 2/3; z-index: 2; diff --git a/src/client/ui/chat/index.vue b/src/client/ui/chat/index.vue index c106e9a444..26c81a1aa9 100644 --- a/src/client/ui/chat/index.vue +++ b/src/client/ui/chat/index.vue @@ -427,8 +427,7 @@ export default defineComponent({ > .text { white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; font-size: 0.9em; } @@ -483,8 +482,7 @@ export default defineComponent({ padding: 6px 8px; border-radius: 4px; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; &:hover { @@ -547,8 +545,7 @@ export default defineComponent({ } > .title { - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; @@ -559,8 +556,7 @@ export default defineComponent({ font-size: 0.8em; font-weight: normal; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; } } diff --git a/src/client/ui/chat/note-header.vue b/src/client/ui/chat/note-header.vue index a33e5bafed..cda8ae00e2 100644 --- a/src/client/ui/chat/note-header.vue +++ b/src/client/ui/chat/note-header.vue @@ -62,8 +62,7 @@ export default defineComponent({ display: block; margin: 0 .5em 0 0; padding: 0; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; font-size: 1em; font-weight: bold; text-decoration: none; @@ -92,8 +91,7 @@ export default defineComponent({ > .username { margin: 0 .5em 0 0; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; } diff --git a/src/client/ui/chat/note-preview.vue b/src/client/ui/chat/note-preview.vue index 6ec66c921b..4861473701 100644 --- a/src/client/ui/chat/note-preview.vue +++ b/src/client/ui/chat/note-preview.vue @@ -50,8 +50,7 @@ export default defineComponent({ display: flex; margin: 0; padding: 0; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; font-size: 0.95em; > .avatar { diff --git a/src/client/ui/chat/note.vue b/src/client/ui/chat/note.vue index 75b92a32f2..bd7bbc5a4f 100644 --- a/src/client/ui/chat/note.vue +++ b/src/client/ui/chat/note.vue @@ -955,8 +955,7 @@ export default defineComponent({ } > span { - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; flex-shrink: 1; text-overflow: ellipsis; white-space: nowrap; @@ -1029,8 +1028,7 @@ export default defineComponent({ &.collapsed { position: relative; max-height: 9em; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > .fade { display: block; diff --git a/src/client/ui/deck/column.vue b/src/client/ui/deck/column.vue index 11e9e536da..d0a39965b1 100644 --- a/src/client/ui/deck/column.vue +++ b/src/client/ui/deck/column.vue @@ -268,8 +268,7 @@ export default defineComponent({ --section-padding: 10px; height: 100%; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; contain: content; &.draghover { @@ -359,8 +358,7 @@ export default defineComponent({ > .header { display: inline-block; align-items: center; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } diff --git a/src/client/ui/visitor/header.vue b/src/client/ui/visitor/header.vue index 7a57a70360..9a7bf96fc0 100644 --- a/src/client/ui/visitor/header.vue +++ b/src/client/ui/visitor/header.vue @@ -125,8 +125,7 @@ export default defineComponent({ display: inline-block; vertical-align: bottom; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; position: relative; @@ -207,8 +206,7 @@ export default defineComponent({ > .title { flex: 1; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; position: relative; text-align: center; diff --git a/src/client/widgets/calendar.vue b/src/client/widgets/calendar.vue index 5bc24cb690..545072e87b 100644 --- a/src/client/widgets/calendar.vue +++ b/src/client/widgets/calendar.vue @@ -171,8 +171,7 @@ export default defineComponent({ > .meter { width: 100%; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; background: var(--X11); border-radius: 8px; diff --git a/src/client/widgets/federation.vue b/src/client/widgets/federation.vue index f05ad65c2f..6e76bc40e9 100644 --- a/src/client/widgets/federation.vue +++ b/src/client/widgets/federation.vue @@ -89,8 +89,7 @@ export default defineComponent({ $bodyInfoHieght: 16px; height: (62px + 1px) + (62px + 1px) + (62px + 1px) + (62px + 1px) + 62px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > .instances { .chart-move { @@ -114,8 +113,7 @@ export default defineComponent({ > .body { flex: 1; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; font-size: 0.9em; color: var(--fg); @@ -123,8 +121,7 @@ export default defineComponent({ display: block; width: 100%; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; line-height: $bodyTitleHieght; } diff --git a/src/client/widgets/rss.vue b/src/client/widgets/rss.vue index 3ad801efae..1140a4252f 100644 --- a/src/client/widgets/rss.vue +++ b/src/client/widgets/rss.vue @@ -80,8 +80,7 @@ export default defineComponent({ color: var(--fg); white-space: nowrap; text-overflow: ellipsis; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; &:nth-child(even) { background: rgba(#000, 0.05); diff --git a/src/client/widgets/trends.vue b/src/client/widgets/trends.vue index b5fc6fb6f0..3734573e3c 100644 --- a/src/client/widgets/trends.vue +++ b/src/client/widgets/trends.vue @@ -68,8 +68,7 @@ export default defineComponent({ <style lang="scss" scoped> .wbrkwala { height: (62px + 1px) + (62px + 1px) + (62px + 1px) + (62px + 1px) + 62px; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; > .tags { .chart-move { @@ -84,8 +83,7 @@ export default defineComponent({ > .tag { flex: 1; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; font-size: 0.9em; color: var(--fg); @@ -93,8 +91,7 @@ export default defineComponent({ display: block; width: 100%; white-space: nowrap; - overflow: hidden; // overflow: clip; をSafariが対応したら消す - overflow: clip; + overflow: hidden; text-overflow: ellipsis; line-height: 18px; } diff --git a/src/docs/fr-FR/aiscript.md b/src/docs/fr-FR/aiscript.md index cd29b4ebad..8e3843ce88 100644 --- a/src/docs/fr-FR/aiscript.md +++ b/src/docs/fr-FR/aiscript.md @@ -1,4 +1,4 @@ # AiScript ## Fonction -デフォルトで値渡しです。 +Réglé sur « passage par copie » par défaut diff --git a/src/docs/fr-FR/deck.md b/src/docs/fr-FR/deck.md index 73e9efdaaf..310463e00e 100644 --- a/src/docs/fr-FR/deck.md +++ b/src/docs/fr-FR/deck.md @@ -1,18 +1,18 @@ # Deck -デッキは利用可能なUIのひとつです。「カラム」と呼ばれるビューを複数並べて表示させることで、カスタマイズ性が高く、情報量の多いUIが構築できることが特徴です。 +Le deck est une des interfaces utilisateurs disponibles.Sa particularité est de former une interface riche en contenus et hautement personnalisable grâce à l'affichage de plusieurs colonnes. -## カラムの追加 -デッキの背景を右クリックし、「カラムを追加」して任意のカラムを追加できます。 +## Ajouter une colonne +Vous pouvez ajouter une colonne en cliquant avec le clic-droit sur « ajouter une colonne » dans l'arrière-plan du deck. -## カラムの移動 -カラムは、ドラッグアンドドロップで他のカラムと位置を入れ替えることが出来るほか、カラムメニュー(カラムのヘッダー右クリック)から位置を移動させることもできます。 +## Déplacer une colonne +Vous pouvez déplacer une colonne à la place d'une autre en la faisant glisser. Il est en outre possible de réorganiser les colonnes depuis le menu des colonnes — en faisant un clic-droit dans l'en-tête de colonne. -## カラムの水平分割 -カラムは左右だけでなく、上下に並べることもできます。 カラムメニューを開き、「左に重ねる」を選択すると、左のカラムの下に現在のカラムが移動します。 上下分割を解除するには、カラムメニューの「右に出す」を選択します。 +## Division horizontale des colonnes +Il est possible d'agencer les colonnes horizontalement. Depuis le menu de colonne, cliquez sur « empiler à gauche » pour la déplacer sous la colonne de gauche. Cliquez sur « déplacer à droite » pour annuler. -## カラムの設定 -カラムメニューの「編集」を選択するとカラムの設定を編集できます。カラムの名前を変えたり、幅を変えたりできます。 +## Configuration de la colonne +Vous pouvez éditer la configuration de la colonne en cliquant sur « édition » dans le menu de colonne. Vous pourrez y changer le nom ou la largeur de la colonne. -## デッキの設定 -デッキに関する設定は、[settings/deck](/settings/deck)で行えます。 +## Configuration du deck +Vous trouverez les options de configuration du deck à [settings/deck](/settings/deck) diff --git a/src/docs/fr-FR/follow.md b/src/docs/fr-FR/follow.md index 93c8428e20..0b0766e1be 100644 --- a/src/docs/fr-FR/follow.md +++ b/src/docs/fr-FR/follow.md @@ -1,2 +1,2 @@ # Abonnements -ユーザーをフォローすると、タイムラインにそのユーザーの投稿が表示されるようになります。ただし、他のユーザーに対する返信は含まれません。 ユーザーをフォローするには、ユーザーページの「フォロー」ボタンをクリックします。フォローを解除するには、もう一度クリックします。 +Lorsque vous suivez un utilisateur, les publication de celui-ci apparaissent dans votre fil. Cela n'inclut toutefois pas ses réponses aux autres utilisateurs. Cliquez une nouvelle fois pour vous désabonner. diff --git a/src/docs/fr-FR/keyboard-shortcut.md b/src/docs/fr-FR/keyboard-shortcut.md index 35bebbcde2..1223224f44 100644 --- a/src/docs/fr-FR/keyboard-shortcut.md +++ b/src/docs/fr-FR/keyboard-shortcut.md @@ -1,68 +1,68 @@ -# キーボードショートカット +# Raccourcis clavier -## Global -これらのショートカットは基本的にどこでも使えます。 +## Général +Ces raccourcis sont utilisables dans n'importe quel contexte. <table> <thead> - <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr> + <tr><th>Raccourci</th><th>Effet</th><th>Accès universel</th></tr> </thead> <tbody> - <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>新規投稿</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr> - <tr><td><kbd class="key">T</kbd></td><td>タイムラインの最も新しい投稿にフォーカス</td><td><b>T</b>imeline, <b>T</b>op</td></tr> - <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>通知を表示/隠す</td><td><b>N</b>otifications</td></tr> + <tr><td><kbd class="key">P</kbd>, <kbd class="key">N</kbd></td><td>Rédiger une nouvelle publication</td><td><b>P</b>ost, <b>N</b>ew, <b>N</b>ote</td></tr> + <tr><td><kbd class="key">T</kbd></td><td>Afficher la dernière publication</td><td><b>T</b>imeline, <b>T</b>op</td></tr> + <tr><td><kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">N</kbd></kbd></td><td>Afficher/cacher les notifications</td><td><b>N</b>otifications</td></tr> <tr><td><kbd class="key">S</kbd></td><td>Rechercher</td><td><b>S</b>earch</td></tr> - <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>ヘルプを表示</td><td><b>H</b>elp</td></tr> + <tr><td><kbd class="key">H</kbd>, <kbd class="key">?</kbd></td><td>Afficher l'aide</td><td><b>H</b>elp</td></tr> </tbody> </table> -## 投稿にフォーカスされた状態 +## Actions concernant les publications <table> <thead> - <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr> + <tr><th>Raccourci</th><th>Effet</th><th>Accès universel</th></tr> </thead> <tbody> - <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>上の投稿にフォーカスを移動</td><td>-</td></tr> - <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>下の投稿にフォーカスを移動</td><td>-</td></tr> - <tr><td><kbd class="key">R</kbd></td><td>返信フォームを開く</td><td><b>R</b>eply</td></tr> - <tr><td><kbd class="key">Q</kbd></td><td>Renoteフォームを開く</td><td><b>Q</b>uote</td></tr> - <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>即刻Renoteする(フォームを開かずに)</td><td>-</td></tr> - <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>リアクションフォームを開く</td><td><b>E</b>mote, re<b>A</b>ction</td></tr> - <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションをする(対応については後述)</td><td>-</td></tr> - <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>お気に入りに登録</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr> - <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>投稿を削除</td><td><b>D</b>elete</tr> - <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>投稿に対するメニューを開く</td><td><b>M</b>ore, <b>O</b>ther</td></tr> - <tr><td><kbd class="key">S</kbd></td><td>CWで隠された部分を表示 or 隠す</td><td><b>S</b>how, <b>S</b>ee</td></tr> - <tr><td><kbd class="key">Esc</kbd></td><td>フォーカスを外す</td><td>-</td></tr> + <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>Déplacer le focus sur la publication du dessus</td><td>-</td></tr> + <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd>, <kbd class="key">Tab</kbd></td><td>Déplacer le focus sur la publication du dessous</td><td>-</td></tr> + <tr><td><kbd class="key">R</kbd></td><td>Ouvrir la fenêtre de réponse</td><td><b>R</b>eply</td></tr> + <tr><td><kbd class="key">Q</kbd></td><td>Ouvrir la fenêtre de Renote</td><td><b>Q</b>uote</td></tr> + <tr><td><kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">Q</kbd></kbd></td><td>Renote rapide (sans ouvrir de fenêtre)</td><td>-</td></tr> + <tr><td><kbd class="key">E</kbd>, <kbd class="key">A</kbd>, <kbd class="key">+</kbd></td><td>Ouvrir la fenêtre de réactions</td><td><b>E</b>mote, re<b>A</b>ction</td></tr> + <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>Utiliser la réaction attribuée au chiffre</td><td>-</td></tr> + <tr><td><kbd class="key">F</kbd>, <kbd class="key">B</kbd></td><td>Ajouter à mes favoris</td><td><b>F</b>avorite, <b>B</b>ookmark</td></tr> + <tr><td><kbd class="key">Del</kbd>, <kbd class="group"><kbd class="key">Ctrl</kbd> + <kbd class="key">D</kbd></kbd></td><td>Supprimer la publication</td><td><b>D</b>elete</tr> + <tr><td><kbd class="key">M</kbd>, <kbd class="key">O</kbd></td><td>Ouvrir le menu des publications</td><td><b>M</b>ore, <b>O</b>ther</td></tr> + <tr><td><kbd class="key">S</kbd></td><td>Afficher ou cacher le contenu marqué CW</td><td><b>S</b>how, <b>S</b>ee</td></tr> + <tr><td><kbd class="key">Esc</kbd></td><td>Quitter le focus</td><td>-</td></tr> </tbody> </table> -## Renoteフォーム +## Formulaire de Renote <table> <thead> - <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr> + <tr><th>Raccourci</th><th>Effet</th><th>Accès universel</th></tr> </thead> <tbody> - <tr><td><kbd class="key">Enter</kbd></td><td>Renoteする</td><td>-</td></tr> - <tr><td><kbd class="key">Q</kbd></td><td>フォームを展開する</td><td><b>Q</b>uote</td></tr> - <tr><td><kbd class="key">Esc</kbd></td><td>フォームを閉じる</td><td>-</td></tr> + <tr><td><kbd class="key">Enter</kbd></td><td>Renoter</td><td>-</td></tr> + <tr><td><kbd class="key">Q</kbd></td><td>Ouvrir la fenêtre</td><td><b>Q</b>uote</td></tr> + <tr><td><kbd class="key">Esc</kbd></td><td>Fermer la fenêtre</td><td>-</td></tr> </tbody> </table> -## リアクションフォーム -デフォルトで「👍」にフォーカスが当たっている状態です。 +## Fenêtre de réactions +La réaction sélectionnée par défaut est « 👍 ». <table> <thead> - <tr><th>ショートカット</th><th>効果</th><th>由来</th></tr> + <tr><th>Raccourci</th><th>Effet</th><th>Accès universel</th></tr> </thead> <tbody> - <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>上のリアクションにフォーカスを移動</td><td>-</td></tr> - <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>下のリアクションにフォーカスを移動</td><td>-</td></tr> - <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>左のリアクションにフォーカスを移動</td><td>-</td></tr> - <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>右のリアクションにフォーカスを移動</td><td>-</td></tr> - <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>リアクション確定</td><td>-</td></tr> - <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>数字に対応したリアクションで確定</td><td>-</td></tr> - <tr><td><kbd class="key">Esc</kbd></td><td>リアクションするのをやめる</td><td>-</td></tr> + <tr><td><kbd class="key">↑</kbd>, <kbd class="key">K</kbd></td><td>Déplacer le focus vers la réaction du dessus</td><td>-</td></tr> + <tr><td><kbd class="key">↓</kbd>, <kbd class="key">J</kbd></td><td>Déplacer le focus vers la réaction du dessous</td><td>-</td></tr> + <tr><td><kbd class="key">←</kbd>, <kbd class="key">H</kbd>, <kbd class="group"><kbd class="key">Shift</kbd> + <kbd class="key">Tab</kbd></kbd></td><td>Déplacer le focus vers la réaction de gauche</td><td>-</td></tr> + <tr><td><kbd class="key">→</kbd>, <kbd class="key">L</kbd>, <kbd class="key">Tab</kbd></td><td>Déplacer le focus vers la réaction de droite</td><td>-</td></tr> + <tr><td><kbd class="key">Enter</kbd>, <kbd class="key">Space</kbd>, <kbd class="key">+</kbd></td><td>Sélectionner la réaction</td><td>-</td></tr> + <tr><td><kbd class="key">0</kbd>~<kbd class="key">9</kbd></td><td>Utiliser la réaction correspondant au chiffre</td><td>-</td></tr> + <tr><td><kbd class="key">Esc</kbd></td><td>Annuler la réaction</td><td>-</td></tr> </tbody> </table> diff --git a/src/docs/fr-FR/mfm.md b/src/docs/fr-FR/mfm.md index e237287acc..107911c0ad 100644 --- a/src/docs/fr-FR/mfm.md +++ b/src/docs/fr-FR/mfm.md @@ -1,2 +1,2 @@ # MFM -MFMは、Misskey Flavored Markdownの略で、Misskeyの様々な場所で使用できる専用のマークアップ言語です。 MFMで使用可能な構文は[MFMチートシート](/mfm-cheat-sheet)で確認できます。 +MFM – abréviation de Misskey Flavored Markdown – est un langage Markdown spécifique utilisable ici et là dans Misskey. Vous pouvez vérifier les structures utilisables dans [l'antisèche MFM](/mfm-cheat-sheet). diff --git a/src/docs/fr-FR/mute.md b/src/docs/fr-FR/mute.md index 051dddfa92..1374abb08e 100644 --- a/src/docs/fr-FR/mute.md +++ b/src/docs/fr-FR/mute.md @@ -1,13 +1,13 @@ -# Mettre en sourdine +# Ignorer -ユーザーをミュートすると、そのユーザーに関する次のコンテンツがMisskeyに表示されなくなります: +Le contenu afférent à un utilisateur ne vous sera plus présenté dès lors que vous l'ignorez : -* タイムラインや投稿の検索結果内の、そのユーザーの投稿(およびそれらの投稿に対する返信やRenote) -* そのユーザーからの通知 -* メッセージ履歴一覧内の、そのユーザーとのメッセージ履歴 +* les publications de cet utilisateur dans le fil ou les résultats de recherche, de même que ses réponses et Renotes ; +* les notifications touchant à cet utilisateur ; +* l'historique des messages avec cet utilisateur. -ユーザーをミュートするには、対象のユーザーのユーザーページに表示されている「ミュート」ボタンを押します。 +Pour ignorer un utilisateur, utilisez le bouton « ignorer » de sa page de profil. -ミュートを行ったことは相手に通知されず、ミュートされていることを知ることもできません。 +L'utilisateur que vous ignorez ne sera pas prévenu. De même, vous ne serez pas prévenu lorsque vous serez ignoré par un autre utilisateur. -設定>ミュート から、自分がミュートしているユーザー一覧を確認することができます。 +Vous pouvez vérifier la liste des utilisateurs ignorés depuis l'onglet « ignorés » de vos paramètres. diff --git a/src/docs/fr-FR/reaction.md b/src/docs/fr-FR/reaction.md index d0df055304..ee98405607 100644 --- a/src/docs/fr-FR/reaction.md +++ b/src/docs/fr-FR/reaction.md @@ -1,8 +1,8 @@ # Réactions -他の人のノートに、絵文字を付けて簡単にあなたの反応を伝えられる機能です。 リアクションするには、ノートの + アイコンをクリックしてピッカーを表示し、絵文字を選択します。 リアクションには[カスタム絵文字](./custom-emoji)も使用できます。 +Les réactions vous permettent d'interagir facilement avec les notes des autres utilisateurs en y attribuant des émoticônes. Pour réagir, cliquez sur le « + » de la note afin d'afficher le panneau de sélection puis choisissez une émoticône. Il est également possible d'utiliser des [émoticônes personnalisées](./custom-emoji). -## リアクションピッカーのカスタマイズ -ピッカーに表示される絵文字を自分好みにカスタマイズすることができます。 設定の「リアクション」で設定します。 +## Personnalisation du panneau de réactions +Il est possible de choisir les émoticônes affichés dans le panneau de réactions dans l'onglet « réactions » des paramètres. ## リモート投稿へのリアクションについて リアクションはMisskeyオリジナルの機能であるため、リモートインスタンスがMisskeyでない限りは、ほとんどの場合「Like」としてアクティビティが送信されます。一般的にはLikeは「お気に入り」として実装されているようです。 また、相手がMisskeyであったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。 diff --git a/src/docs/fr-FR/theme.md b/src/docs/fr-FR/theme.md index 9c706c826e..4fd1c211c7 100644 --- a/src/docs/fr-FR/theme.md +++ b/src/docs/fr-FR/theme.md @@ -1,11 +1,11 @@ # Thème -テーマを設定して、Misskeyクライアントの見た目を変更できます。 +Vous pouvez modifier l'apparence de votre client Misskey à l'aide de thèmes. -## テーマの設定 -設定 > テーマ +## Paramètres de thème +Paramètres > Thèmes -## テーマを作成する +## Créer un thème テーマコードはJSON5で記述されたテーマオブジェクトです。 テーマは以下のようなオブジェクトです。 ``` js { @@ -33,13 +33,13 @@ ``` -* `id` ... テーマの一意なID。UUIDをおすすめします。 -* `name` ... テーマ名 -* `author` ... テーマの作者 -* `desc` ... テーマの説明(オプション) -* `base` ... 明るいテーマか、暗いテーマか - * `light`にすると明るいテーマになり、`dark`にすると暗いテーマになります。 - * テーマはここで設定されたベーステーマを継承します。 +* `id` ... L'identifiant unique du thème. L'utilisation d'un UUID est recommandée ; +* `name` ... Nom du thème ; +* `author` ... Auteur du thème ; +* `desc` ... Description du thème (facultatif) ; +* `base` ... Thème clair ou sombre : + * Sélectionnez `light` pour définir le thème comme thème clair et `dark` pour le définir comme sombre, + * Le thème héritera des valeurs par défaut du thème spécifié ici ; * `props` ... テーマのスタイル定義。これから説明します。 ### テーマのスタイル定義 diff --git a/src/docs/fr-FR/timelines.md b/src/docs/fr-FR/timelines.md index c674db8240..308dccaaa0 100644 --- a/src/docs/fr-FR/timelines.md +++ b/src/docs/fr-FR/timelines.md @@ -1,15 +1,15 @@ -# タイムラインの比較 +# Comparaison des fils https://docs.google.com/spreadsheets/d/1lxQ2ugKrhz58Bg96HTDK_2F98BUritkMyIiBkOByjHA/edit?usp=sharing ## Principal -自分のフォローしているユーザーの投稿 +Les publications des utilisateurs que vous suivez ## Local -全てのローカルユーザーの「ホーム」指定されていない投稿 +Les publications des utilisateurs de votre instance. Les notes publiées avec le statut « principal » n'y sont pas affichées. ## Social -自分のフォローしているユーザーの投稿と、全てのローカルユーザーの「ホーム」指定されていない投稿 +Regroupe le fil principal et le fil local ## Global -全てのローカルユーザーの「ホーム」指定されていない投稿と、サーバーに届いた全てのリモートユーザーの「ホーム」指定されていない投稿 +Toutes les publications reçues par l'instance, qu'elles soient locales ou non. Les notes publiées avec le statut « principal » n'y sont pas affichées. diff --git a/src/server/web/bios.css b/src/server/web/bios.css new file mode 100644 index 0000000000..b0da3ee39b --- /dev/null +++ b/src/server/web/bios.css @@ -0,0 +1,40 @@ +* { + font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace; +} + +html { + background: #ffb4e1; +} + +main { + background: #dedede; +} +main > .tabs { + padding: 16px; + border-bottom: solid 4px #c3c3c3; +} + +#lsEditor > .adder { + margin: 16px; + padding: 16px; + border: solid 2px #c3c3c3; +} +#lsEditor > .adder > textarea { + display: block; + width: 100%; + min-height: 5em; + box-sizing: border-box; +} +#lsEditor > .record { + padding: 16px; + border-bottom: solid 1px #c3c3c3; +} +#lsEditor > .record > header { + font-weight: bold; +} +#lsEditor > .record > textarea { + display: block; + width: 100%; + min-height: 5em; + box-sizing: border-box; +} diff --git a/src/server/web/bios.js b/src/server/web/bios.js new file mode 100644 index 0000000000..d06dee801a --- /dev/null +++ b/src/server/web/bios.js @@ -0,0 +1,87 @@ +'use strict'; + +window.onload = async () => { + const account = JSON.parse(localStorage.getItem('account')); + const i = account.token; + + const api = (endpoint, data = {}) => { + const promise = new Promise((resolve, reject) => { + // Append a credential + if (i) data.i = i; + + // Send request + fetch(endpoint.indexOf('://') > -1 ? endpoint : `/api/${endpoint}`, { + method: 'POST', + body: JSON.stringify(data), + credentials: 'omit', + cache: 'no-cache' + }).then(async (res) => { + const body = res.status === 204 ? null : await res.json(); + + if (res.status === 200) { + resolve(body); + } else if (res.status === 204) { + resolve(); + } else { + reject(body.error); + } + }).catch(reject); + }); + + return promise; + }; + + const content = document.getElementById('content'); + + document.getElementById('ls').addEventListener('click', () => { + content.innerHTML = ''; + + const lsEditor = document.createElement('div'); + lsEditor.id = 'lsEditor'; + + const adder = document.createElement('div'); + adder.classList.add('adder'); + const addKeyInput = document.createElement('input'); + const addValueTextarea = document.createElement('textarea'); + const addButton = document.createElement('button'); + addButton.textContent = 'add'; + addButton.addEventListener('click', () => { + localStorage.setItem(addKeyInput.value, addValueTextarea.value); + location.reload(); + }); + + adder.appendChild(addKeyInput); + adder.appendChild(addValueTextarea); + adder.appendChild(addButton); + lsEditor.appendChild(adder); + + for (let i = 0; i < localStorage.length; i++) { + const k = localStorage.key(i); + const record = document.createElement('div'); + record.classList.add('record'); + const header = document.createElement('header'); + header.textContent = k; + const textarea = document.createElement('textarea'); + textarea.textContent = localStorage.getItem(k); + const saveButton = document.createElement('button'); + saveButton.textContent = 'save'; + saveButton.addEventListener('click', () => { + localStorage.setItem(k, textarea.value); + location.reload(); + }); + const removeButton = document.createElement('button'); + removeButton.textContent = 'remove'; + removeButton.addEventListener('click', () => { + localStorage.removeItem(k); + location.reload(); + }); + record.appendChild(header); + record.appendChild(textarea); + record.appendChild(saveButton); + record.appendChild(removeButton); + lsEditor.appendChild(record); + } + + content.appendChild(lsEditor); + }); +}; diff --git a/src/server/web/boot.js b/src/server/web/boot.js index 6347c5566e..1c94e6e4f4 100644 --- a/src/server/web/boot.js +++ b/src/server/web/boot.js @@ -11,12 +11,15 @@ 'use strict'; -window.onerror = (e) => { - document.documentElement.innerHTML = '問題が発生しました。'; -}; - // ブロックの中に入れないと、定義した変数がブラウザのグローバルスコープに登録されてしまい邪魔なので (async () => { + window.onerror = (e) => { + renderError('SOMETHING_HAPPENED', e.toString()); + }; + window.onunhandledrejection = (e) => { + renderError('SOMETHING_HAPPENED_IN_PROMISE', e.toString()); + }; + const v = localStorage.getItem('v') || VERSION; //#region Detect language & fetch translations @@ -38,9 +41,17 @@ window.onerror = (e) => { } const res = await fetch(`/assets/locales/${lang}.${v}.json`); - localStorage.setItem('lang', lang); - localStorage.setItem('locale', await res.text()); - localStorage.setItem('localeVersion', v); + if (res.status === 200) { + localStorage.setItem('lang', lang); + localStorage.setItem('locale', await res.text()); + localStorage.setItem('localeVersion', v); + } else if (localeOutdated) { + // nop + } else { + renderError('LOCALE_FETCH_FAILED'); + checkUpdate(); + return; + } } //#endregion @@ -56,24 +67,8 @@ window.onerror = (e) => { script.setAttribute('async', 'true'); script.setAttribute('defer', 'true'); script.addEventListener('error', async () => { - document.documentElement.innerHTML = '読み込みに失敗しました。'; - - // TODO: サーバーが落ちている場合などのエラーハンドリング - const res = await fetch('/api/meta', { - method: 'POST', - cache: 'no-cache' - }); - - const meta = await res.json(); - - if (meta.version != v) { - localStorage.setItem('v', meta.version); - alert( - 'Misskeyの新しいバージョンがあります。ページを再度読み込みします。' + - '\n\n' + - 'New version of Misskey available. The page will be reloaded.'); - refresh(); - } + renderError('APP_FETCH_FAILED'); + checkUpdate(); }); head.appendChild(script); //#endregion @@ -113,6 +108,44 @@ window.onerror = (e) => { } // eslint-disable-next-line no-inner-declarations + function renderError(code, details) { + document.documentElement.innerHTML = ` + <h1>⚠エラーが発生しました</h1> + <p>問題が解決しない場合は管理者までお問い合わせください。以下のオプションを試すこともできます:</p> + <ul> + <li><a href="/cli">簡易クライアント</a>を起動</li> + <li><a href="/bios">BIOS</a>で修復を試みる</li> + <li><a href="/flush">キャッシュをクリア</a>する</li> + </ul> + <hr> + <code>ERROR CODE: ${code}</code> + <details> + ${details} + </details> + `; + } + + // eslint-disable-next-line no-inner-declarations + async function checkUpdate() { + // TODO: サーバーが落ちている場合などのエラーハンドリング + const res = await fetch('/api/meta', { + method: 'POST', + cache: 'no-cache' + }); + + const meta = await res.json(); + + if (meta.version != v) { + localStorage.setItem('v', meta.version); + alert( + 'Misskeyの新しいバージョンがあります。ページを再度読み込みします。' + + '\n\n' + + 'New version of Misskey available. The page will be reloaded.'); + refresh(); + } + } + + // eslint-disable-next-line no-inner-declarations function refresh() { // Random localStorage.setItem('salt', Math.random().toString().substr(2, 8)); diff --git a/src/server/web/cli.css b/src/server/web/cli.css new file mode 100644 index 0000000000..07cd27830b --- /dev/null +++ b/src/server/web/cli.css @@ -0,0 +1,19 @@ +* { + font-family: Fira code, Fira Mono, Consolas, Menlo, Courier, monospace; +} + +html { + background: #ffb4e1; +} + +main { + background: #dedede; +} + +#tl > div { + padding: 16px; + border-bottom: solid 1px #c3c3c3; +} +#tl > div > header { + font-weight: bold; +} diff --git a/src/server/web/cli.js b/src/server/web/cli.js new file mode 100644 index 0000000000..3dff1d4860 --- /dev/null +++ b/src/server/web/cli.js @@ -0,0 +1,55 @@ +'use strict'; + +window.onload = async () => { + const account = JSON.parse(localStorage.getItem('account')); + const i = account.token; + + const api = (endpoint, data = {}) => { + const promise = new Promise((resolve, reject) => { + // Append a credential + if (i) data.i = i; + + // Send request + fetch(endpoint.indexOf('://') > -1 ? endpoint : `/api/${endpoint}`, { + method: 'POST', + body: JSON.stringify(data), + credentials: 'omit', + cache: 'no-cache' + }).then(async (res) => { + const body = res.status === 204 ? null : await res.json(); + + if (res.status === 200) { + resolve(body); + } else if (res.status === 204) { + resolve(); + } else { + reject(body.error); + } + }).catch(reject); + }); + + return promise; + }; + + document.getElementById('submit').addEventListener('click', () => { + api('notes/create', { + text: document.getElementById('text').value + }).then(() => { + location.reload(); + }); + }); + + api('notes/timeline').then(notes => { + const tl = document.getElementById('tl'); + for (const note of notes) { + const el = document.createElement('div'); + const name = document.createElement('header'); + name.textContent = `${note.user.name} @${note.user.username}`; + const text = document.createElement('div'); + text.textContent = `${note.text}`; + el.appendChild(name); + el.appendChild(text); + tl.appendChild(el); + } + }); +}; diff --git a/src/server/web/index.ts b/src/server/web/index.ts index 8ea7e15751..a1d79100a6 100644 --- a/src/server/web/index.ts +++ b/src/server/web/index.ts @@ -376,6 +376,18 @@ router.get('/info', async ctx => { }); }); +router.get('/bios', async ctx => { + await ctx.render('bios', { + version: config.version, + }); +}); + +router.get('/cli', async ctx => { + await ctx.render('cli', { + version: config.version, + }); +}); + const override = (source: string, target: string, depth: number = 0) => [, ...target.split('/').filter(x => x), ...source.split('/').filter(x => x).splice(depth)].join('/'); diff --git a/src/server/web/views/bios.pug b/src/server/web/views/bios.pug new file mode 100644 index 0000000000..d81a3ee67f --- /dev/null +++ b/src/server/web/views/bios.pug @@ -0,0 +1,20 @@ +doctype html + +html + + head + meta(charset='utf-8') + meta(name='application-name' content='Misskey') + title Misskey BIOS + style + include ../bios.css + script + include ../bios.js + + body + header + h1 Misskey BIOS #{version} + main + div.tabs + button#ls edit local storage + div#content diff --git a/src/server/web/views/cli.pug b/src/server/web/views/cli.pug new file mode 100644 index 0000000000..d2cf7c4335 --- /dev/null +++ b/src/server/web/views/cli.pug @@ -0,0 +1,21 @@ +doctype html + +html + + head + meta(charset='utf-8') + meta(name='application-name' content='Misskey') + title Misskey Cli + style + include ../cli.css + script + include ../cli.js + + body + header + h1 Misskey Cli #{version} + main + div#form + textarea#text + button#submit submit + div#tl |