This commit is contained in:
かっこかり 2025-05-04 05:49:48 +00:00 committed by GitHub
commit af52d23188
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 93 additions and 3 deletions

View File

@ -7,6 +7,7 @@
- Feat: マウスでもタイムラインを引っ張って更新できるように - Feat: マウスでもタイムラインを引っ張って更新できるように
- アクセシビリティ設定からオフにすることもできます - アクセシビリティ設定からオフにすることもできます
- Enhance: タイムラインのパフォーマンスを向上 - Enhance: タイムラインのパフォーマンスを向上
- Enhance: ノートの公開範囲に応じて色分けできるように
- Fix: 一部のブラウザでアコーディオンメニューのアニメーションが動作しない問題を修正 - Fix: 一部のブラウザでアコーディオンメニューのアニメーションが動作しない問題を修正
### Server ### Server

8
locales/index.d.ts vendored
View File

@ -5413,6 +5413,14 @@ export interface Locale extends ILocale {
* *
*/ */
"driveAboutTip": string; "driveAboutTip": string;
/**
*
*/
"enableNoteVisibilityColor": string;
/**
*
*/
"enableNoteVisibilityColorDescription": string;
"_chat": { "_chat": {
/** /**
* *

View File

@ -1348,6 +1348,8 @@ readonly: "読み取り専用"
goToDeck: "デッキへ戻る" goToDeck: "デッキへ戻る"
federationJobs: "連合ジョブ" federationJobs: "連合ジョブ"
driveAboutTip: "ドライブでは、過去にアップロードしたファイルの一覧が表示されます。<br>\nートに添付する際に再利用したり、あとで投稿するファイルを予めアップロードしておくこともできます。<br>\n<b>ファイルを削除すると、今までそのファイルを使用した全ての場所(ノート、ページ、アバター、バナー等)からも見えなくなるので注意してください。</b><br>\nフォルダを作って整理することもできます。" driveAboutTip: "ドライブでは、過去にアップロードしたファイルの一覧が表示されます。<br>\nートに添付する際に再利用したり、あとで投稿するファイルを予めアップロードしておくこともできます。<br>\n<b>ファイルを削除すると、今までそのファイルを使用した全ての場所(ノート、ページ、アバター、バナー等)からも見えなくなるので注意してください。</b><br>\nフォルダを作って整理することもできます。"
enableNoteVisibilityColor: "公開範囲に応じて色分けする"
enableNoteVisibilityColorDescription: "ノートの詳細表示ページなど、一部の箇所には適用されません。"
_chat: _chat:
noMessagesYet: "まだメッセージはありません" noMessagesYet: "まだメッセージはありません"

View File

@ -72,6 +72,10 @@
codeBoolean: '#c59eff', codeBoolean: '#c59eff',
deckBg: '#000', deckBg: '#000',
htmlThemeColor: '@bg', htmlThemeColor: '@bg',
notePublic: 'transparent',
noteHome: '#43b3f4',
noteSpecified: '#f09e05',
noteFollowers: '#c54630',
}, },
codeHighlighter: { codeHighlighter: {

View File

@ -72,6 +72,10 @@
codeBoolean: '#62b70c', codeBoolean: '#62b70c',
deckBg: ':darken<3<@bg', deckBg: ':darken<3<@bg',
htmlThemeColor: '@bg', htmlThemeColor: '@bg',
notePublic: 'transparent',
noteHome: '#43b3f4',
noteSpecified: '#f09e05',
noteFollowers: '#c54630',
}, },
codeHighlighter: { codeHighlighter: {

View File

@ -185,6 +185,8 @@ export default defineComponent({
border: none; border: none;
border-radius: 0; border-radius: 0;
box-shadow: none; box-shadow: none;
box-sizing: border-box;
background-clip: padding-box;
&:not(:last-child) { &:not(:last-child) {
border-bottom: solid 0.5px var(--MI_THEME-divider); border-bottom: solid 0.5px var(--MI_THEME-divider);

View File

@ -9,7 +9,15 @@ SPDX-License-Identifier: AGPL-3.0-only
v-show="!isDeleted" v-show="!isDeleted"
ref="rootEl" ref="rootEl"
v-hotkey="keymap" v-hotkey="keymap"
:class="[$style.root, { [$style.showActionsOnlyHover]: prefer.s.showNoteActionsOnlyHover, [$style.skipRender]: prefer.s.skipNoteRender }]" :class="[$style.root, {
[$style.showActionsOnlyHover]: prefer.s.showNoteActionsOnlyHover,
[$style.skipRender]: prefer.s.skipNoteRender,
[$style.noteVisibilityColor]: prefer.s.enableNoteVisibilityColor,
[$style.bgPublic]: appearNote.visibility === 'public',
[$style.bgHome]: appearNote.visibility === 'home',
[$style.bgFollowers]: appearNote.visibility === 'followers',
[$style.bgSpecified]: appearNote.visibility === 'specified',
}]"
:tabindex="isDeleted ? '-1' : '0'" :tabindex="isDeleted ? '-1' : '0'"
> >
<MkNoteSub v-if="appearNote.reply && !renoteCollapsed" :note="appearNote.reply" :class="$style.replyTo"/> <MkNoteSub v-if="appearNote.reply && !renoteCollapsed" :note="appearNote.reply" :class="$style.replyTo"/>
@ -661,6 +669,8 @@ function emitUpdReaction(emoji: string, delta: number) {
font-size: 1.05em; font-size: 1.05em;
overflow: clip; overflow: clip;
contain: content; contain: content;
--noteBg: var(--MI_THEME-panel);
background-color: var(--noteBg);
&:focus-visible { &:focus-visible {
outline: none; outline: none;
@ -720,6 +730,26 @@ function emitUpdReaction(emoji: string, delta: number) {
visibility: visible; visibility: visible;
} }
} }
&.noteVisibilityColor {
--noteBg: color-mix(in srgb, var(--MI_THEME-panel), var(--noteThemeColor) 10%);
&.bgPublic {
--noteThemeColor: var(--MI_THEME-notePublic);
}
&.bgHome {
--noteThemeColor: var(--MI_THEME-noteHome);
}
&.bgFollowers {
--noteThemeColor: var(--MI_THEME-noteFollowers);
}
&.bgSpecified {
--noteThemeColor: var(--MI_THEME-noteSpecified);
}
}
} }
.skipRender { .skipRender {
@ -902,7 +932,7 @@ function emitUpdReaction(emoji: string, delta: number) {
z-index: 2; z-index: 2;
width: 100%; width: 100%;
height: 64px; height: 64px;
background: linear-gradient(0deg, var(--MI_THEME-panel), color(from var(--MI_THEME-panel) srgb r g b / 0)); background: linear-gradient(0deg, var(--noteBg), color(from var(--noteBg) srgb r g b / 0));
&:hover > .collapsedLabel { &:hover > .collapsedLabel {
background: var(--MI_THEME-panelHighlight); background: var(--MI_THEME-panelHighlight);

View File

@ -23,7 +23,17 @@ SPDX-License-Identifier: AGPL-3.0-only
<MkA v-else :to="notePage(note)"> <MkA v-else :to="notePage(note)">
<MkTime :time="note.createdAt" colored/> <MkTime :time="note.createdAt" colored/>
</MkA> </MkA>
<span v-if="note.visibility !== 'public'" style="margin-left: 0.5em;" :title="i18n.ts._visibility[note.visibility]"> <span
v-if="note.visibility !== 'public'"
style="margin-left: 0.5em;"
:class="{
[$style.enableColorlize]: prefer.s.enableNoteVisibilityColor,
[$style.colorHome]: note.visibility === 'home',
[$style.colorFollowers]: note.visibility === 'followers',
[$style.colorSpecified]: note.visibility === 'specified',
}"
:title="i18n.ts._visibility[note.visibility]"
>
<i v-if="note.visibility === 'home'" class="ti ti-home"></i> <i v-if="note.visibility === 'home'" class="ti ti-home"></i>
<i v-else-if="note.visibility === 'followers'" class="ti ti-lock"></i> <i v-else-if="note.visibility === 'followers'" class="ti ti-lock"></i>
<i v-else-if="note.visibility === 'specified'" ref="specified" class="ti ti-mail"></i> <i v-else-if="note.visibility === 'specified'" ref="specified" class="ti ti-mail"></i>
@ -41,6 +51,7 @@ import { i18n } from '@/i18n.js';
import { notePage } from '@/filters/note.js'; import { notePage } from '@/filters/note.js';
import { userPage } from '@/filters/user.js'; import { userPage } from '@/filters/user.js';
import { DI } from '@/di.js'; import { DI } from '@/di.js';
import { prefer } from '@/preferences.js';
defineProps<{ defineProps<{
note: Misskey.entities.Note; note: Misskey.entities.Note;
@ -56,6 +67,20 @@ const mock = inject(DI.mock, false);
white-space: nowrap; white-space: nowrap;
} }
.enableColorlize {
&.colorHome {
color: var(--MI_THEME-noteHome);
}
&.colorFollowers {
color: var(--MI_THEME-noteFollowers);
}
&.colorSpecified {
color: var(--MI_THEME-noteSpecified);
}
}
.name { .name {
flex-shrink: 1; flex-shrink: 1;
display: block; display: block;

View File

@ -210,6 +210,15 @@ SPDX-License-Identifier: AGPL-3.0-only
</MkPreferenceContainer> </MkPreferenceContainer>
</SearchMarker> </SearchMarker>
<SearchMarker :keywords="['reaction', 'confirm', 'remove']">
<MkPreferenceContainer k="enableNoteVisibilityColor">
<MkSwitch v-model="enableNoteVisibilityColor">
<template #label><SearchLabel>{{ i18n.ts.enableNoteVisibilityColor }}</SearchLabel></template>
<template #caption>{{ i18n.ts.enableNoteVisibilityColorDescription }}</template>
</MkSwitch>
</MkPreferenceContainer>
</SearchMarker>
<SearchMarker :keywords="['image', 'photo', 'picture', 'media', 'thumbnail', 'quality', 'raw', 'attachment']"> <SearchMarker :keywords="['image', 'photo', 'picture', 'media', 'thumbnail', 'quality', 'raw', 'attachment']">
<MkPreferenceContainer k="loadRawImages"> <MkPreferenceContainer k="loadRawImages">
<MkSwitch v-model="loadRawImages"> <MkSwitch v-model="loadRawImages">
@ -782,6 +791,7 @@ const useGroupedNotifications = prefer.model('useGroupedNotifications');
const alwaysConfirmFollow = prefer.model('alwaysConfirmFollow'); const alwaysConfirmFollow = prefer.model('alwaysConfirmFollow');
const confirmWhenRevealingSensitiveMedia = prefer.model('confirmWhenRevealingSensitiveMedia'); const confirmWhenRevealingSensitiveMedia = prefer.model('confirmWhenRevealingSensitiveMedia');
const confirmOnReact = prefer.model('confirmOnReact'); const confirmOnReact = prefer.model('confirmOnReact');
const enableNoteVisibilityColor = prefer.model('enableNoteVisibilityColor');
const defaultNoteVisibility = prefer.model('defaultNoteVisibility'); const defaultNoteVisibility = prefer.model('defaultNoteVisibility');
const defaultNoteLocalOnly = prefer.model('defaultNoteLocalOnly'); const defaultNoteLocalOnly = prefer.model('defaultNoteLocalOnly');
const rememberNoteVisibility = prefer.model('rememberNoteVisibility'); const rememberNoteVisibility = prefer.model('rememberNoteVisibility');
@ -849,6 +859,7 @@ watch([
disableStreamingTimeline, disableStreamingTimeline,
alwaysConfirmFollow, alwaysConfirmFollow,
confirmWhenRevealingSensitiveMedia, confirmWhenRevealingSensitiveMedia,
enableNoteVisibilityColor,
showGapBetweenNotesInTimeline, showGapBetweenNotesInTimeline,
mediaListWithOneImageAppearance, mediaListWithOneImageAppearance,
reactionsDisplaySize, reactionsDisplaySize,

View File

@ -327,6 +327,9 @@ export const PREF_DEF = {
confirmOnReact: { confirmOnReact: {
default: false, default: false,
}, },
enableNoteVisibilityColor: {
default: false,
},
defaultFollowWithReplies: { defaultFollowWithReplies: {
default: false, default: false,
}, },