mirror of
https://github.com/misskey-dev/misskey.git
synced 2026-03-22 03:53:35 +00:00
wip
This commit is contained in:
8
locales/index.d.ts
vendored
8
locales/index.d.ts
vendored
@@ -5493,6 +5493,10 @@ export interface Locale extends ILocale {
|
||||
* 低くすると画質を保てますが、ファイルサイズは増加します。<br>高くするとファイルサイズを減らせますが、画質は低下します。
|
||||
*/
|
||||
"defaultImageCompressionLevel_description": string;
|
||||
/**
|
||||
* 低電力モード
|
||||
*/
|
||||
"lowPowerMode": string;
|
||||
"_order": {
|
||||
/**
|
||||
* 新しい順
|
||||
@@ -5799,6 +5803,10 @@ export interface Locale extends ILocale {
|
||||
* UIのアニメーション
|
||||
*/
|
||||
"uiAnimations": string;
|
||||
/**
|
||||
* アニメーション画像を再生
|
||||
*/
|
||||
"playAnimatedImages": string;
|
||||
/**
|
||||
* ナビゲーションバーに副ボタンを表示
|
||||
*/
|
||||
|
||||
@@ -1368,6 +1368,7 @@ redisplayAllTips: "全ての「ヒントとコツ」を再表示"
|
||||
hideAllTips: "全ての「ヒントとコツ」を非表示"
|
||||
defaultImageCompressionLevel: "デフォルトの画像圧縮度"
|
||||
defaultImageCompressionLevel_description: "低くすると画質を保てますが、ファイルサイズは増加します。<br>高くするとファイルサイズを減らせますが、画質は低下します。"
|
||||
lowPowerMode: "低電力モード"
|
||||
|
||||
_order:
|
||||
newest: "新しい順"
|
||||
@@ -1451,6 +1452,7 @@ _settings:
|
||||
useStickyIcons: "アイコンをスクロールに追従させる"
|
||||
enableHighQualityImagePlaceholders: "高品質な画像のプレースホルダを表示"
|
||||
uiAnimations: "UIのアニメーション"
|
||||
playAnimatedImages: "アニメーション画像を再生"
|
||||
showNavbarSubButtons: "ナビゲーションバーに副ボタンを表示"
|
||||
ifOn: "オンのとき"
|
||||
ifOff: "オフのとき"
|
||||
|
||||
@@ -567,50 +567,73 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||
<template #icon><SearchIcon><i class="ti ti-battery-vertical-eco"></i></SearchIcon></template>
|
||||
|
||||
<div class="_gaps_s">
|
||||
<SearchMarker :keywords="['animation', 'motion', 'reduce']">
|
||||
<MkPreferenceContainer k="animation">
|
||||
<MkSwitch :modelValue="!reduceAnimation" @update:modelValue="v => reduceAnimation = !v">
|
||||
<template #label><SearchLabel>{{ i18n.ts._settings.uiAnimations }}</SearchLabel></template>
|
||||
<template #caption><SearchKeyword>{{ i18n.ts.turnOffToImprovePerformance }}</SearchKeyword></template>
|
||||
<SearchMarker :keywords="['lowpowermode', 'battery', 'eco', 'save']">
|
||||
<MkPreferenceContainer k="lowPowerMode">
|
||||
<MkSwitch v-model="lowPowerMode">
|
||||
<template #label><SearchLabel>{{ i18n.ts.lowPowerMode }}</SearchLabel></template>
|
||||
</MkSwitch>
|
||||
</MkPreferenceContainer>
|
||||
</SearchMarker>
|
||||
|
||||
<SearchMarker :keywords="['blur']">
|
||||
<MkPreferenceContainer k="useBlurEffect">
|
||||
<MkSwitch v-model="useBlurEffect">
|
||||
<template #label><SearchLabel>{{ i18n.ts.useBlurEffect }}</SearchLabel></template>
|
||||
<template #caption><SearchKeyword>{{ i18n.ts.turnOffToImprovePerformance }}</SearchKeyword></template>
|
||||
</MkSwitch>
|
||||
</MkPreferenceContainer>
|
||||
</SearchMarker>
|
||||
<hr>
|
||||
|
||||
<SearchMarker :keywords="['blur', 'modal']">
|
||||
<MkPreferenceContainer k="useBlurEffectForModal">
|
||||
<MkSwitch v-model="useBlurEffectForModal">
|
||||
<template #label><SearchLabel>{{ i18n.ts.useBlurEffectForModal }}</SearchLabel></template>
|
||||
<template #caption><SearchKeyword>{{ i18n.ts.turnOffToImprovePerformance }}</SearchKeyword></template>
|
||||
</MkSwitch>
|
||||
</MkPreferenceContainer>
|
||||
</SearchMarker>
|
||||
<MkDisableSection :disabled="lowPowerMode">
|
||||
<div class="_gaps_s">
|
||||
<SearchMarker :keywords="['animation', 'image', 'gif']">
|
||||
<MkPreferenceContainer k="disableShowingAnimatedImages">
|
||||
<MkSwitch :modelValue="!disableShowingAnimatedImages" @update:modelValue="v => disableShowingAnimatedImages = !v">
|
||||
<template #label><SearchLabel>{{ i18n.ts._settings.playAnimatedImages }}</SearchLabel></template>
|
||||
<template #caption><SearchKeyword>{{ i18n.ts.turnOffToImprovePerformance }}</SearchKeyword></template>
|
||||
</MkSwitch>
|
||||
</MkPreferenceContainer>
|
||||
</SearchMarker>
|
||||
|
||||
<SearchMarker :keywords="['blurhash', 'image', 'photo', 'picture', 'thumbnail', 'placeholder']">
|
||||
<MkPreferenceContainer k="enableHighQualityImagePlaceholders">
|
||||
<MkSwitch v-model="enableHighQualityImagePlaceholders">
|
||||
<template #label><SearchLabel>{{ i18n.ts._settings.enableHighQualityImagePlaceholders }}</SearchLabel></template>
|
||||
<template #caption><SearchKeyword>{{ i18n.ts.turnOffToImprovePerformance }}</SearchKeyword></template>
|
||||
</MkSwitch>
|
||||
</MkPreferenceContainer>
|
||||
</SearchMarker>
|
||||
<SearchMarker :keywords="['animation', 'motion', 'reduce']">
|
||||
<MkPreferenceContainer k="animation">
|
||||
<MkSwitch :modelValue="!reduceAnimation" @update:modelValue="v => reduceAnimation = !v">
|
||||
<template #label><SearchLabel>{{ i18n.ts._settings.uiAnimations }}</SearchLabel></template>
|
||||
<template #caption><SearchKeyword>{{ i18n.ts.turnOffToImprovePerformance }}</SearchKeyword></template>
|
||||
</MkSwitch>
|
||||
</MkPreferenceContainer>
|
||||
</SearchMarker>
|
||||
|
||||
<SearchMarker :keywords="['sticky']">
|
||||
<MkPreferenceContainer k="useStickyIcons">
|
||||
<MkSwitch v-model="useStickyIcons">
|
||||
<template #label><SearchLabel>{{ i18n.ts._settings.useStickyIcons }}</SearchLabel></template>
|
||||
<template #caption><SearchKeyword>{{ i18n.ts.turnOffToImprovePerformance }}</SearchKeyword></template>
|
||||
</MkSwitch>
|
||||
</MkPreferenceContainer>
|
||||
</SearchMarker>
|
||||
<SearchMarker :keywords="['blur']">
|
||||
<MkPreferenceContainer k="useBlurEffect">
|
||||
<MkSwitch v-model="useBlurEffect">
|
||||
<template #label><SearchLabel>{{ i18n.ts.useBlurEffect }}</SearchLabel></template>
|
||||
<template #caption><SearchKeyword>{{ i18n.ts.turnOffToImprovePerformance }}</SearchKeyword></template>
|
||||
</MkSwitch>
|
||||
</MkPreferenceContainer>
|
||||
</SearchMarker>
|
||||
|
||||
<SearchMarker :keywords="['blur', 'modal']">
|
||||
<MkPreferenceContainer k="useBlurEffectForModal">
|
||||
<MkSwitch v-model="useBlurEffectForModal">
|
||||
<template #label><SearchLabel>{{ i18n.ts.useBlurEffectForModal }}</SearchLabel></template>
|
||||
<template #caption><SearchKeyword>{{ i18n.ts.turnOffToImprovePerformance }}</SearchKeyword></template>
|
||||
</MkSwitch>
|
||||
</MkPreferenceContainer>
|
||||
</SearchMarker>
|
||||
|
||||
<SearchMarker :keywords="['blurhash', 'image', 'photo', 'picture', 'thumbnail', 'placeholder']">
|
||||
<MkPreferenceContainer k="enableHighQualityImagePlaceholders">
|
||||
<MkSwitch v-model="enableHighQualityImagePlaceholders">
|
||||
<template #label><SearchLabel>{{ i18n.ts._settings.enableHighQualityImagePlaceholders }}</SearchLabel></template>
|
||||
<template #caption><SearchKeyword>{{ i18n.ts.turnOffToImprovePerformance }}</SearchKeyword></template>
|
||||
</MkSwitch>
|
||||
</MkPreferenceContainer>
|
||||
</SearchMarker>
|
||||
|
||||
<SearchMarker :keywords="['sticky']">
|
||||
<MkPreferenceContainer k="useStickyIcons">
|
||||
<MkSwitch v-model="useStickyIcons">
|
||||
<template #label><SearchLabel>{{ i18n.ts._settings.useStickyIcons }}</SearchLabel></template>
|
||||
<template #caption><SearchKeyword>{{ i18n.ts.turnOffToImprovePerformance }}</SearchKeyword></template>
|
||||
</MkSwitch>
|
||||
</MkPreferenceContainer>
|
||||
</SearchMarker>
|
||||
</div>
|
||||
</MkDisableSection>
|
||||
|
||||
<MkInfo>
|
||||
<div class="_gaps_s">
|
||||
@@ -871,6 +894,7 @@ const useNativeUiForVideoAudioPlayer = prefer.model('useNativeUiForVideoAudioPla
|
||||
const contextMenu = prefer.model('contextMenu');
|
||||
const menuStyle = prefer.model('menuStyle');
|
||||
const makeEveryTextElementsSelectable = prefer.model('makeEveryTextElementsSelectable');
|
||||
const lowPowerMode = prefer.model('lowPowerMode');
|
||||
|
||||
const fontSize = ref(miLocalStorage.getItem('fontSize'));
|
||||
const useSystemFont = ref(miLocalStorage.getItem('useSystemFont') != null);
|
||||
@@ -928,6 +952,7 @@ watch([
|
||||
enablePullToRefresh,
|
||||
reduceAnimation,
|
||||
showAvailableReactionsFirstInNote,
|
||||
lowPowerMode,
|
||||
], async () => {
|
||||
await reloadAsk({ reason: i18n.ts.reloadToApplySetting, unison: true });
|
||||
});
|
||||
|
||||
@@ -35,464 +35,472 @@ export type SoundStore = {
|
||||
// NOTE: デフォルト値は他の設定の状態に依存してはならない(依存していた場合、ユーザーがその設定項目単体で「初期値にリセット」した場合不具合の原因になる)
|
||||
|
||||
export const PREF_DEF = definePreferences({
|
||||
accounts: {
|
||||
default: [] as [host: string, user: {
|
||||
id: string;
|
||||
username: string;
|
||||
}][],
|
||||
},
|
||||
|
||||
pinnedUserLists: {
|
||||
accountDependent: true,
|
||||
default: [] as Misskey.entities.UserList[],
|
||||
},
|
||||
uploadFolder: {
|
||||
accountDependent: true,
|
||||
default: null as string | null,
|
||||
},
|
||||
widgets: {
|
||||
accountDependent: true,
|
||||
default: () => [{
|
||||
name: 'calendar',
|
||||
id: genId(), place: 'right', data: {},
|
||||
}, {
|
||||
name: 'notifications',
|
||||
id: genId(), place: 'right', data: {},
|
||||
}, {
|
||||
name: 'trends',
|
||||
id: genId(), place: 'right', data: {},
|
||||
}] as {
|
||||
name: string;
|
||||
id: string;
|
||||
place: string | null;
|
||||
data: Record<string, any>;
|
||||
}[],
|
||||
},
|
||||
'deck.profile': {
|
||||
accountDependent: true,
|
||||
default: null as string | null,
|
||||
},
|
||||
'deck.profiles': {
|
||||
accountDependent: true,
|
||||
default: [] as DeckProfile[],
|
||||
},
|
||||
|
||||
emojiPalettes: {
|
||||
serverDependent: true,
|
||||
default: () => [{
|
||||
id: genId(),
|
||||
name: '',
|
||||
emojis: ['👍', '❤️', '😆', '🤔', '😮', '🎉', '💢', '😥', '😇', '🍮'],
|
||||
}] as {
|
||||
id: string;
|
||||
name: string;
|
||||
emojis: string[];
|
||||
}[],
|
||||
mergeStrategy: (a, b) => {
|
||||
const mergedItems = [] as typeof a;
|
||||
for (const x of a.concat(b)) {
|
||||
const sameIdItem = mergedItems.find(y => y.id === x.id);
|
||||
if (sameIdItem != null) {
|
||||
if (deepEqual(x, sameIdItem)) { // 完全な重複は無視
|
||||
continue;
|
||||
} else { // IDは同じなのに内容が違う場合はマージ不可とする
|
||||
throw new Error();
|
||||
}
|
||||
} else {
|
||||
mergedItems.push(x);
|
||||
}
|
||||
}
|
||||
return mergedItems;
|
||||
states: {
|
||||
accounts: {
|
||||
default: [] as [host: string, user: {
|
||||
id: string;
|
||||
username: string;
|
||||
}][],
|
||||
},
|
||||
},
|
||||
emojiPaletteForReaction: {
|
||||
serverDependent: true,
|
||||
default: null as string | null,
|
||||
},
|
||||
emojiPaletteForMain: {
|
||||
serverDependent: true,
|
||||
default: null as string | null,
|
||||
},
|
||||
|
||||
overridedDeviceKind: {
|
||||
default: null as DeviceKind | null,
|
||||
},
|
||||
themes: {
|
||||
default: [] as Theme[],
|
||||
mergeStrategy: (a, b) => {
|
||||
const mergedItems = [] as typeof a;
|
||||
for (const x of a.concat(b)) {
|
||||
const sameIdItem = mergedItems.find(y => y.id === x.id);
|
||||
if (sameIdItem != null) {
|
||||
if (deepEqual(x, sameIdItem)) { // 完全な重複は無視
|
||||
continue;
|
||||
} else { // IDは同じなのに内容が違う場合はマージ不可とする
|
||||
throw new Error();
|
||||
}
|
||||
} else {
|
||||
mergedItems.push(x);
|
||||
}
|
||||
}
|
||||
return mergedItems;
|
||||
pinnedUserLists: {
|
||||
accountDependent: true,
|
||||
default: [] as Misskey.entities.UserList[],
|
||||
},
|
||||
},
|
||||
lightTheme: {
|
||||
default: null as Theme | null,
|
||||
},
|
||||
darkTheme: {
|
||||
default: null as Theme | null,
|
||||
},
|
||||
syncDeviceDarkMode: {
|
||||
default: true,
|
||||
},
|
||||
defaultNoteVisibility: {
|
||||
default: 'public' as (typeof Misskey.noteVisibilities)[number],
|
||||
},
|
||||
defaultNoteLocalOnly: {
|
||||
default: false,
|
||||
},
|
||||
keepCw: {
|
||||
default: true,
|
||||
},
|
||||
rememberNoteVisibility: {
|
||||
default: false,
|
||||
},
|
||||
reportError: {
|
||||
default: false,
|
||||
},
|
||||
collapseRenotes: {
|
||||
default: true,
|
||||
},
|
||||
menu: {
|
||||
default: [
|
||||
'notifications',
|
||||
'clips',
|
||||
'drive',
|
||||
'followRequests',
|
||||
'chat',
|
||||
'-',
|
||||
'explore',
|
||||
'announcements',
|
||||
'channels',
|
||||
'search',
|
||||
'-',
|
||||
'ui',
|
||||
],
|
||||
},
|
||||
statusbars: {
|
||||
default: [] as {
|
||||
name: string;
|
||||
id: string;
|
||||
type: string;
|
||||
size: 'verySmall' | 'small' | 'medium' | 'large' | 'veryLarge';
|
||||
black: boolean;
|
||||
props: Record<string, any>;
|
||||
}[],
|
||||
},
|
||||
serverDisconnectedBehavior: {
|
||||
default: 'quiet' as 'quiet' | 'reload' | 'dialog',
|
||||
},
|
||||
nsfw: {
|
||||
default: 'respect' as 'respect' | 'force' | 'ignore',
|
||||
},
|
||||
highlightSensitiveMedia: {
|
||||
default: false,
|
||||
},
|
||||
animation: {
|
||||
default: !window.matchMedia('(prefers-reduced-motion)').matches,
|
||||
},
|
||||
animatedMfm: {
|
||||
default: !window.matchMedia('(prefers-reduced-motion)').matches,
|
||||
},
|
||||
advancedMfm: {
|
||||
default: true,
|
||||
},
|
||||
showReactionsCount: {
|
||||
default: false,
|
||||
},
|
||||
enableQuickAddMfmFunction: {
|
||||
default: false,
|
||||
},
|
||||
loadRawImages: {
|
||||
default: false,
|
||||
},
|
||||
imageNewTab: {
|
||||
default: false,
|
||||
},
|
||||
disableShowingAnimatedImages: {
|
||||
default: window.matchMedia('(prefers-reduced-motion)').matches,
|
||||
},
|
||||
emojiStyle: {
|
||||
default: 'twemoji', // twemoji / fluentEmoji / native
|
||||
},
|
||||
menuStyle: {
|
||||
default: 'auto' as 'auto' | 'popup' | 'drawer',
|
||||
},
|
||||
useBlurEffectForModal: {
|
||||
default: true,
|
||||
},
|
||||
useBlurEffect: {
|
||||
default: true,
|
||||
},
|
||||
useStickyIcons: {
|
||||
default: true,
|
||||
},
|
||||
enableHighQualityImagePlaceholders: {
|
||||
default: true,
|
||||
},
|
||||
showFixedPostForm: {
|
||||
default: false,
|
||||
},
|
||||
showFixedPostFormInChannel: {
|
||||
default: false,
|
||||
},
|
||||
enableInfiniteScroll: {
|
||||
default: true,
|
||||
},
|
||||
useReactionPickerForContextMenu: {
|
||||
default: false,
|
||||
},
|
||||
instanceTicker: {
|
||||
default: 'remote' as 'none' | 'remote' | 'always',
|
||||
},
|
||||
emojiPickerScale: {
|
||||
default: 2,
|
||||
},
|
||||
emojiPickerWidth: {
|
||||
default: 2,
|
||||
},
|
||||
emojiPickerHeight: {
|
||||
default: 3,
|
||||
},
|
||||
emojiPickerStyle: {
|
||||
default: 'auto' as 'auto' | 'popup' | 'drawer',
|
||||
},
|
||||
squareAvatars: {
|
||||
default: false,
|
||||
},
|
||||
showAvatarDecorations: {
|
||||
default: true,
|
||||
},
|
||||
numberOfPageCache: {
|
||||
default: 3,
|
||||
},
|
||||
pollingInterval: {
|
||||
uploadFolder: {
|
||||
accountDependent: true,
|
||||
default: null as string | null,
|
||||
},
|
||||
widgets: {
|
||||
accountDependent: true,
|
||||
default: () => [{
|
||||
name: 'calendar',
|
||||
id: genId(), place: 'right', data: {},
|
||||
}, {
|
||||
name: 'notifications',
|
||||
id: genId(), place: 'right', data: {},
|
||||
}, {
|
||||
name: 'trends',
|
||||
id: genId(), place: 'right', data: {},
|
||||
}] as {
|
||||
name: string;
|
||||
id: string;
|
||||
place: string | null;
|
||||
data: Record<string, any>;
|
||||
}[],
|
||||
},
|
||||
'deck.profile': {
|
||||
accountDependent: true,
|
||||
default: null as string | null,
|
||||
},
|
||||
'deck.profiles': {
|
||||
accountDependent: true,
|
||||
default: [] as DeckProfile[],
|
||||
},
|
||||
|
||||
emojiPalettes: {
|
||||
serverDependent: true,
|
||||
default: () => [{
|
||||
id: genId(),
|
||||
name: '',
|
||||
emojis: ['👍', '❤️', '😆', '🤔', '😮', '🎉', '💢', '😥', '😇', '🍮'],
|
||||
}] as {
|
||||
id: string;
|
||||
name: string;
|
||||
emojis: string[];
|
||||
}[],
|
||||
mergeStrategy: (a, b) => {
|
||||
const mergedItems = [] as typeof a;
|
||||
for (const x of a.concat(b)) {
|
||||
const sameIdItem = mergedItems.find(y => y.id === x.id);
|
||||
if (sameIdItem != null) {
|
||||
if (deepEqual(x, sameIdItem)) { // 完全な重複は無視
|
||||
continue;
|
||||
} else { // IDは同じなのに内容が違う場合はマージ不可とする
|
||||
throw new Error();
|
||||
}
|
||||
} else {
|
||||
mergedItems.push(x);
|
||||
}
|
||||
}
|
||||
return mergedItems;
|
||||
},
|
||||
},
|
||||
emojiPaletteForReaction: {
|
||||
serverDependent: true,
|
||||
default: null as string | null,
|
||||
},
|
||||
emojiPaletteForMain: {
|
||||
serverDependent: true,
|
||||
default: null as string | null,
|
||||
},
|
||||
|
||||
overridedDeviceKind: {
|
||||
default: null as DeviceKind | null,
|
||||
},
|
||||
themes: {
|
||||
default: [] as Theme[],
|
||||
mergeStrategy: (a, b) => {
|
||||
const mergedItems = [] as typeof a;
|
||||
for (const x of a.concat(b)) {
|
||||
const sameIdItem = mergedItems.find(y => y.id === x.id);
|
||||
if (sameIdItem != null) {
|
||||
if (deepEqual(x, sameIdItem)) { // 完全な重複は無視
|
||||
continue;
|
||||
} else { // IDは同じなのに内容が違う場合はマージ不可とする
|
||||
throw new Error();
|
||||
}
|
||||
} else {
|
||||
mergedItems.push(x);
|
||||
}
|
||||
}
|
||||
return mergedItems;
|
||||
},
|
||||
},
|
||||
lightTheme: {
|
||||
default: null as Theme | null,
|
||||
},
|
||||
darkTheme: {
|
||||
default: null as Theme | null,
|
||||
},
|
||||
syncDeviceDarkMode: {
|
||||
default: true,
|
||||
},
|
||||
defaultNoteVisibility: {
|
||||
default: 'public' as (typeof Misskey.noteVisibilities)[number],
|
||||
},
|
||||
defaultNoteLocalOnly: {
|
||||
default: false,
|
||||
},
|
||||
keepCw: {
|
||||
default: true,
|
||||
},
|
||||
rememberNoteVisibility: {
|
||||
default: false,
|
||||
},
|
||||
reportError: {
|
||||
default: false,
|
||||
},
|
||||
collapseRenotes: {
|
||||
default: true,
|
||||
},
|
||||
menu: {
|
||||
default: [
|
||||
'notifications',
|
||||
'clips',
|
||||
'drive',
|
||||
'followRequests',
|
||||
'chat',
|
||||
'-',
|
||||
'explore',
|
||||
'announcements',
|
||||
'channels',
|
||||
'search',
|
||||
'-',
|
||||
'ui',
|
||||
],
|
||||
},
|
||||
statusbars: {
|
||||
default: [] as {
|
||||
name: string;
|
||||
id: string;
|
||||
type: string;
|
||||
size: 'verySmall' | 'small' | 'medium' | 'large' | 'veryLarge';
|
||||
black: boolean;
|
||||
props: Record<string, any>;
|
||||
}[],
|
||||
},
|
||||
serverDisconnectedBehavior: {
|
||||
default: 'quiet' as 'quiet' | 'reload' | 'dialog',
|
||||
},
|
||||
nsfw: {
|
||||
default: 'respect' as 'respect' | 'force' | 'ignore',
|
||||
},
|
||||
highlightSensitiveMedia: {
|
||||
default: false,
|
||||
},
|
||||
animation: {
|
||||
default: !window.matchMedia('(prefers-reduced-motion)').matches,
|
||||
},
|
||||
animatedMfm: {
|
||||
default: !window.matchMedia('(prefers-reduced-motion)').matches,
|
||||
},
|
||||
advancedMfm: {
|
||||
default: true,
|
||||
},
|
||||
showReactionsCount: {
|
||||
default: false,
|
||||
},
|
||||
enableQuickAddMfmFunction: {
|
||||
default: false,
|
||||
},
|
||||
loadRawImages: {
|
||||
default: false,
|
||||
},
|
||||
imageNewTab: {
|
||||
default: false,
|
||||
},
|
||||
disableShowingAnimatedImages: {
|
||||
default: window.matchMedia('(prefers-reduced-motion)').matches,
|
||||
},
|
||||
emojiStyle: {
|
||||
default: 'twemoji', // twemoji / fluentEmoji / native
|
||||
},
|
||||
menuStyle: {
|
||||
default: 'auto' as 'auto' | 'popup' | 'drawer',
|
||||
},
|
||||
useBlurEffectForModal: {
|
||||
default: true,
|
||||
},
|
||||
useBlurEffect: {
|
||||
default: true,
|
||||
},
|
||||
useStickyIcons: {
|
||||
default: true,
|
||||
},
|
||||
enableHighQualityImagePlaceholders: {
|
||||
default: true,
|
||||
},
|
||||
showFixedPostForm: {
|
||||
default: false,
|
||||
},
|
||||
showFixedPostFormInChannel: {
|
||||
default: false,
|
||||
},
|
||||
enableInfiniteScroll: {
|
||||
default: true,
|
||||
},
|
||||
useReactionPickerForContextMenu: {
|
||||
default: false,
|
||||
},
|
||||
instanceTicker: {
|
||||
default: 'remote' as 'none' | 'remote' | 'always',
|
||||
},
|
||||
emojiPickerScale: {
|
||||
default: 2,
|
||||
},
|
||||
emojiPickerWidth: {
|
||||
default: 2,
|
||||
},
|
||||
emojiPickerHeight: {
|
||||
default: 3,
|
||||
},
|
||||
emojiPickerStyle: {
|
||||
default: 'auto' as 'auto' | 'popup' | 'drawer',
|
||||
},
|
||||
squareAvatars: {
|
||||
default: false,
|
||||
},
|
||||
showAvatarDecorations: {
|
||||
default: true,
|
||||
},
|
||||
numberOfPageCache: {
|
||||
default: 3,
|
||||
},
|
||||
pollingInterval: {
|
||||
// 1 ... 低
|
||||
// 2 ... 中
|
||||
// 3 ... 高
|
||||
default: 2,
|
||||
},
|
||||
showNoteActionsOnlyHover: {
|
||||
default: false,
|
||||
},
|
||||
showClipButtonInNoteFooter: {
|
||||
default: false,
|
||||
},
|
||||
reactionsDisplaySize: {
|
||||
default: 'medium' as 'small' | 'medium' | 'large',
|
||||
},
|
||||
limitWidthOfReaction: {
|
||||
default: true,
|
||||
},
|
||||
forceShowAds: {
|
||||
default: false,
|
||||
},
|
||||
aiChanMode: {
|
||||
default: false,
|
||||
},
|
||||
devMode: {
|
||||
default: false,
|
||||
},
|
||||
mediaListWithOneImageAppearance: {
|
||||
default: 'expand' as 'expand' | '16_9' | '1_1' | '2_3',
|
||||
},
|
||||
notificationPosition: {
|
||||
default: 'rightBottom' as 'leftTop' | 'leftBottom' | 'rightTop' | 'rightBottom',
|
||||
},
|
||||
notificationStackAxis: {
|
||||
default: 'horizontal' as 'vertical' | 'horizontal',
|
||||
},
|
||||
enableCondensedLine: {
|
||||
default: true,
|
||||
},
|
||||
keepScreenOn: {
|
||||
default: false,
|
||||
},
|
||||
useGroupedNotifications: {
|
||||
default: true,
|
||||
},
|
||||
dataSaver: {
|
||||
default: {
|
||||
media: false,
|
||||
avatar: false,
|
||||
urlPreviewThumbnail: false,
|
||||
disableUrlPreview: false,
|
||||
code: false,
|
||||
} satisfies Record<string, boolean>,
|
||||
},
|
||||
hemisphere: {
|
||||
default: hemisphere as 'N' | 'S',
|
||||
},
|
||||
enableSeasonalScreenEffect: {
|
||||
default: false,
|
||||
},
|
||||
enableHorizontalSwipe: {
|
||||
default: false,
|
||||
},
|
||||
enablePullToRefresh: {
|
||||
default: true,
|
||||
},
|
||||
useNativeUiForVideoAudioPlayer: {
|
||||
default: false,
|
||||
},
|
||||
keepOriginalFilename: {
|
||||
default: true,
|
||||
},
|
||||
alwaysConfirmFollow: {
|
||||
default: true,
|
||||
},
|
||||
confirmWhenRevealingSensitiveMedia: {
|
||||
default: false,
|
||||
},
|
||||
contextMenu: {
|
||||
default: 'app' as 'app' | 'appWithShift' | 'native',
|
||||
},
|
||||
skipNoteRender: {
|
||||
default: true,
|
||||
},
|
||||
showSoftWordMutedWord: {
|
||||
default: false,
|
||||
},
|
||||
confirmOnReact: {
|
||||
default: false,
|
||||
},
|
||||
defaultFollowWithReplies: {
|
||||
default: false,
|
||||
},
|
||||
makeEveryTextElementsSelectable: {
|
||||
default: DEFAULT_DEVICE_KIND === 'desktop',
|
||||
},
|
||||
showNavbarSubButtons: {
|
||||
default: true,
|
||||
},
|
||||
showTitlebar: {
|
||||
default: false,
|
||||
},
|
||||
showAvailableReactionsFirstInNote: {
|
||||
default: false,
|
||||
},
|
||||
plugins: {
|
||||
default: [] as Plugin[],
|
||||
mergeStrategy: (a, b) => {
|
||||
const sameIdExists = a.some(x => b.some(y => x.installId === y.installId));
|
||||
if (sameIdExists) throw new Error();
|
||||
const sameNameExists = a.some(x => b.some(y => x.name === y.name));
|
||||
if (sameNameExists) throw new Error();
|
||||
return a.concat(b);
|
||||
default: 2,
|
||||
},
|
||||
},
|
||||
mutingEmojis: {
|
||||
default: [] as string[],
|
||||
mergeStrategy: (a, b) => {
|
||||
return [...new Set(a.concat(b))];
|
||||
showNoteActionsOnlyHover: {
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
watermarkPresets: {
|
||||
accountDependent: true,
|
||||
default: [] as WatermarkPreset[],
|
||||
mergeStrategy: (a, b) => {
|
||||
const mergedItems = [] as typeof a;
|
||||
for (const x of a.concat(b)) {
|
||||
const sameIdItem = mergedItems.find(y => y.id === x.id);
|
||||
if (sameIdItem != null) {
|
||||
if (deepEqual(x, sameIdItem)) { // 完全な重複は無視
|
||||
continue;
|
||||
} else { // IDは同じなのに内容が違う場合はマージ不可とする
|
||||
throw new Error();
|
||||
showClipButtonInNoteFooter: {
|
||||
default: false,
|
||||
},
|
||||
reactionsDisplaySize: {
|
||||
default: 'medium' as 'small' | 'medium' | 'large',
|
||||
},
|
||||
limitWidthOfReaction: {
|
||||
default: true,
|
||||
},
|
||||
forceShowAds: {
|
||||
default: false,
|
||||
},
|
||||
aiChanMode: {
|
||||
default: false,
|
||||
},
|
||||
devMode: {
|
||||
default: false,
|
||||
},
|
||||
mediaListWithOneImageAppearance: {
|
||||
default: 'expand' as 'expand' | '16_9' | '1_1' | '2_3',
|
||||
},
|
||||
notificationPosition: {
|
||||
default: 'rightBottom' as 'leftTop' | 'leftBottom' | 'rightTop' | 'rightBottom',
|
||||
},
|
||||
notificationStackAxis: {
|
||||
default: 'horizontal' as 'vertical' | 'horizontal',
|
||||
},
|
||||
enableCondensedLine: {
|
||||
default: true,
|
||||
},
|
||||
keepScreenOn: {
|
||||
default: false,
|
||||
},
|
||||
useGroupedNotifications: {
|
||||
default: true,
|
||||
},
|
||||
dataSaver: {
|
||||
default: {
|
||||
media: false,
|
||||
avatar: false,
|
||||
urlPreviewThumbnail: false,
|
||||
disableUrlPreview: false,
|
||||
code: false,
|
||||
} satisfies Record<string, boolean>,
|
||||
},
|
||||
hemisphere: {
|
||||
default: hemisphere as 'N' | 'S',
|
||||
},
|
||||
enableSeasonalScreenEffect: {
|
||||
default: false,
|
||||
},
|
||||
enableHorizontalSwipe: {
|
||||
default: false,
|
||||
},
|
||||
enablePullToRefresh: {
|
||||
default: true,
|
||||
},
|
||||
useNativeUiForVideoAudioPlayer: {
|
||||
default: false,
|
||||
},
|
||||
keepOriginalFilename: {
|
||||
default: true,
|
||||
},
|
||||
alwaysConfirmFollow: {
|
||||
default: true,
|
||||
},
|
||||
confirmWhenRevealingSensitiveMedia: {
|
||||
default: false,
|
||||
},
|
||||
contextMenu: {
|
||||
default: 'app' as 'app' | 'appWithShift' | 'native',
|
||||
},
|
||||
skipNoteRender: {
|
||||
default: true,
|
||||
},
|
||||
showSoftWordMutedWord: {
|
||||
default: false,
|
||||
},
|
||||
confirmOnReact: {
|
||||
default: false,
|
||||
},
|
||||
defaultFollowWithReplies: {
|
||||
default: false,
|
||||
},
|
||||
makeEveryTextElementsSelectable: {
|
||||
default: DEFAULT_DEVICE_KIND === 'desktop',
|
||||
},
|
||||
showNavbarSubButtons: {
|
||||
default: true,
|
||||
},
|
||||
showTitlebar: {
|
||||
default: false,
|
||||
},
|
||||
showAvailableReactionsFirstInNote: {
|
||||
default: false,
|
||||
},
|
||||
plugins: {
|
||||
default: [] as Plugin[],
|
||||
mergeStrategy: (a, b) => {
|
||||
const sameIdExists = a.some(x => b.some(y => x.installId === y.installId));
|
||||
if (sameIdExists) throw new Error();
|
||||
const sameNameExists = a.some(x => b.some(y => x.name === y.name));
|
||||
if (sameNameExists) throw new Error();
|
||||
return a.concat(b);
|
||||
},
|
||||
},
|
||||
mutingEmojis: {
|
||||
default: [] as string[],
|
||||
mergeStrategy: (a, b) => {
|
||||
return [...new Set(a.concat(b))];
|
||||
},
|
||||
},
|
||||
watermarkPresets: {
|
||||
accountDependent: true,
|
||||
default: [] as WatermarkPreset[],
|
||||
mergeStrategy: (a, b) => {
|
||||
const mergedItems = [] as typeof a;
|
||||
for (const x of a.concat(b)) {
|
||||
const sameIdItem = mergedItems.find(y => y.id === x.id);
|
||||
if (sameIdItem != null) {
|
||||
if (deepEqual(x, sameIdItem)) { // 完全な重複は無視
|
||||
continue;
|
||||
} else { // IDは同じなのに内容が違う場合はマージ不可とする
|
||||
throw new Error();
|
||||
}
|
||||
} else {
|
||||
mergedItems.push(x);
|
||||
}
|
||||
} else {
|
||||
mergedItems.push(x);
|
||||
}
|
||||
}
|
||||
return mergedItems;
|
||||
return mergedItems;
|
||||
},
|
||||
},
|
||||
defaultWatermarkPresetId: {
|
||||
accountDependent: true,
|
||||
default: null as WatermarkPreset['id'] | null,
|
||||
},
|
||||
defaultImageCompressionLevel: {
|
||||
default: 2 as 0 | 1 | 2 | 3,
|
||||
},
|
||||
lowPowerMode: {
|
||||
default: false,
|
||||
},
|
||||
|
||||
'sound.masterVolume': {
|
||||
default: 0.5,
|
||||
},
|
||||
'sound.notUseSound': {
|
||||
default: false,
|
||||
},
|
||||
'sound.useSoundOnlyWhenActive': {
|
||||
default: false,
|
||||
},
|
||||
'sound.on.note': {
|
||||
default: { type: 'syuilo/n-aec', volume: 1 } as SoundStore,
|
||||
},
|
||||
'sound.on.noteMy': {
|
||||
default: { type: 'syuilo/n-cea-4va', volume: 1 } as SoundStore,
|
||||
},
|
||||
'sound.on.notification': {
|
||||
default: { type: 'syuilo/n-ea', volume: 1 } as SoundStore,
|
||||
},
|
||||
'sound.on.reaction': {
|
||||
default: { type: 'syuilo/bubble2', volume: 1 } as SoundStore,
|
||||
},
|
||||
'sound.on.chatMessage': {
|
||||
default: { type: 'syuilo/waon', volume: 1 } as SoundStore,
|
||||
},
|
||||
|
||||
'deck.alwaysShowMainColumn': {
|
||||
default: true,
|
||||
},
|
||||
'deck.navWindow': {
|
||||
default: true,
|
||||
},
|
||||
'deck.useSimpleUiForNonRootPages': {
|
||||
default: true,
|
||||
},
|
||||
'deck.columnAlign': {
|
||||
default: 'center' as 'left' | 'right' | 'center',
|
||||
},
|
||||
'deck.columnGap': {
|
||||
default: 6,
|
||||
},
|
||||
'deck.menuPosition': {
|
||||
default: 'bottom' as 'right' | 'bottom',
|
||||
},
|
||||
'deck.navbarPosition': {
|
||||
default: 'left' as 'left' | 'top' | 'bottom',
|
||||
},
|
||||
'deck.wallpaper': {
|
||||
default: null as string | null,
|
||||
},
|
||||
|
||||
'chat.showSenderName': {
|
||||
default: false,
|
||||
},
|
||||
'chat.sendOnEnter': {
|
||||
default: false,
|
||||
},
|
||||
|
||||
'game.dropAndFusion': {
|
||||
default: {
|
||||
bgmVolume: 0.25,
|
||||
sfxVolume: 1,
|
||||
},
|
||||
},
|
||||
|
||||
'experimental.stackingRouterView': {
|
||||
default: false,
|
||||
},
|
||||
'experimental.enableFolderPageView': {
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
defaultWatermarkPresetId: {
|
||||
accountDependent: true,
|
||||
default: null as WatermarkPreset['id'] | null,
|
||||
},
|
||||
defaultImageCompressionLevel: {
|
||||
default: 2 as 0 | 1 | 2 | 3,
|
||||
},
|
||||
|
||||
'sound.masterVolume': {
|
||||
default: 0.5,
|
||||
},
|
||||
'sound.notUseSound': {
|
||||
default: false,
|
||||
},
|
||||
'sound.useSoundOnlyWhenActive': {
|
||||
default: false,
|
||||
},
|
||||
'sound.on.note': {
|
||||
default: { type: 'syuilo/n-aec', volume: 1 } as SoundStore,
|
||||
},
|
||||
'sound.on.noteMy': {
|
||||
default: { type: 'syuilo/n-cea-4va', volume: 1 } as SoundStore,
|
||||
},
|
||||
'sound.on.notification': {
|
||||
default: { type: 'syuilo/n-ea', volume: 1 } as SoundStore,
|
||||
},
|
||||
'sound.on.reaction': {
|
||||
default: { type: 'syuilo/bubble2', volume: 1 } as SoundStore,
|
||||
},
|
||||
'sound.on.chatMessage': {
|
||||
default: { type: 'syuilo/waon', volume: 1 } as SoundStore,
|
||||
},
|
||||
|
||||
'deck.alwaysShowMainColumn': {
|
||||
default: true,
|
||||
},
|
||||
'deck.navWindow': {
|
||||
default: true,
|
||||
},
|
||||
'deck.useSimpleUiForNonRootPages': {
|
||||
default: true,
|
||||
},
|
||||
'deck.columnAlign': {
|
||||
default: 'center' as 'left' | 'right' | 'center',
|
||||
},
|
||||
'deck.columnGap': {
|
||||
default: 6,
|
||||
},
|
||||
'deck.menuPosition': {
|
||||
default: 'bottom' as 'right' | 'bottom',
|
||||
},
|
||||
'deck.navbarPosition': {
|
||||
default: 'left' as 'left' | 'top' | 'bottom',
|
||||
},
|
||||
'deck.wallpaper': {
|
||||
default: null as string | null,
|
||||
},
|
||||
|
||||
'chat.showSenderName': {
|
||||
default: false,
|
||||
},
|
||||
'chat.sendOnEnter': {
|
||||
default: false,
|
||||
},
|
||||
|
||||
'game.dropAndFusion': {
|
||||
default: {
|
||||
bgmVolume: 0.25,
|
||||
sfxVolume: 1,
|
||||
},
|
||||
},
|
||||
|
||||
'experimental.stackingRouterView': {
|
||||
default: false,
|
||||
},
|
||||
'experimental.enableFolderPageView': {
|
||||
default: false,
|
||||
computed: {
|
||||
disableShowingAnimatedImages: (s) => s.disableShowingAnimatedImages || s.lowPowerMode,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -101,9 +101,19 @@ type PreferencesDefinitionRecord<Default, T = Default extends (...args: any) =>
|
||||
export type PreferencesDefinition = Record<string, PreferencesDefinitionRecord<any>>;
|
||||
|
||||
export function definePreferences<T extends Record<string, unknown>>(x: {
|
||||
[K in keyof T]: PreferencesDefinitionRecord<T[K]>
|
||||
states: {
|
||||
[K in keyof T]: PreferencesDefinitionRecord<T[K]>;
|
||||
};
|
||||
computed: {
|
||||
[K in keyof T]: PreferencesDefinitionRecord<T[K]>;
|
||||
};
|
||||
}): {
|
||||
[K in keyof T]: PreferencesDefinitionRecord<T[K]>
|
||||
states: {
|
||||
[K in keyof T]: PreferencesDefinitionRecord<T[K]>;
|
||||
};
|
||||
computed: {
|
||||
[K in keyof T]: PreferencesDefinitionRecord<T[K]>;
|
||||
};
|
||||
} {
|
||||
return x;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user