Merge branch 'develop' into sw-notification-action

This commit is contained in:
tamaina 2021-03-03 13:41:12 +09:00
commit 35fe912e5f
88 changed files with 757 additions and 435 deletions

View file

@ -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;
}

View file

@ -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 {

View file

@ -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;

View file

@ -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: [],

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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();

View file

@ -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%;

View file

@ -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;
}

View file

@ -692,8 +692,7 @@ export default defineComponent({
> dd {
text-overflow: ellipsis;
overflow: hidden; // overflow: clip; Safari
overflow: clip;
overflow: hidden;
white-space: nowrap;
}

View file

@ -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 {

View file

@ -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;
}

View file

@ -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;

View file

@ -105,8 +105,7 @@ export default defineComponent({
grid-gap: 4px;
> * {
overflow: hidden; // overflow: clip; Safari
overflow: clip;
overflow: hidden;
border-radius: 6px;
}

View file

@ -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%;

View file

@ -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;

View file

@ -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;
}

View file

@ -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 {

View file

@ -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;

View file

@ -268,8 +268,7 @@ export default defineComponent({
text-overflow: ellipsis;
white-space: nowrap;
min-width: 0;
overflow: hidden; // overflow: clip; Safari
overflow: clip;
overflow: hidden;
}
> .time {
@ -280,8 +279,7 @@ export default defineComponent({
> .text {
white-space: nowrap;
overflow: hidden; // overflow: clip; Safari
overflow: clip;
overflow: hidden;
text-overflow: ellipsis;
> [data-icon] {

View file

@ -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 {

View file

@ -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 {

View file

@ -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;

View file

@ -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>

View file

@ -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;

View file

@ -116,8 +116,7 @@ export default defineComponent({
.ukygtjoj {
position: relative;
overflow: hidden; // overflow: clip; Safari
overflow: clip;
overflow: hidden;
&.naked {
background: transparent !important;

View file

@ -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;
}

View file

@ -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 {

View file

@ -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;

View file

@ -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 {

View file

@ -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;

View file

@ -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;
}

View file

@ -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;
}
}

View file

@ -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 {

View file

@ -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;

View file

@ -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 {

View file

@ -76,6 +76,7 @@ console.info(`Misskey v${version}`);
// boot.jsのやつを解除
window.onerror = null;
window.onunhandledrejection = null;
if (_DEV_) {
console.warn('Development mode!!!');

View file

@ -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;

View file

@ -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">

View file

@ -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;

View file

@ -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;
}
}
}

View file

@ -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);

View file

@ -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 {

View file

@ -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;

View file

@ -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;

View file

@ -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;
* {

View file

@ -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;

View file

@ -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,
}
},

View file

@ -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;
}

View file

@ -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);

View file

@ -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;

View file

@ -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%);

View file

@ -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%);
}

View file

@ -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;

View file

@ -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;
}

View file

@ -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;

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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;
}

View file

@ -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 {

View file

@ -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;

View file

@ -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;
}

View file

@ -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;

View file

@ -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;

View file

@ -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;
}

View file

@ -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);

View file

@ -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;
}

View file

@ -1,4 +1,4 @@
# AiScript
## Fonction
デフォルトで値渡しです。
Réglé sur « passage par copie » par défaut

View file

@ -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)

View file

@ -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.

View file

@ -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>

View file

@ -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).

View file

@ -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.

View file

@ -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であったとしても、カスタム絵文字リアクションは伝わらず、自動的に「👍」等にフォールバックされます。

View file

@ -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` ... テーマのスタイル定義。これから説明します。
### テーマのスタイル定義

View file

@ -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.

40
src/server/web/bios.css Normal file
View file

@ -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;
}

87
src/server/web/bios.js Normal file
View file

@ -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);
});
};

View file

@ -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
@ -112,6 +107,44 @@ window.onerror = (e) => {
document.documentElement.style.backgroundImage = `url(${wallpaper})`;
}
// 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

19
src/server/web/cli.css Normal file
View file

@ -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;
}

55
src/server/web/cli.js Normal file
View file

@ -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);
}
});
};

View file

@ -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('/');

View file

@ -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

View file

@ -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