From 4df9083bf04b72f59b9cb09334c89412e8cb296c Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:05:50 +0900 Subject: [PATCH] =?UTF-8?q?fix(frontend):=20=E3=83=86=E3=83=BC=E3=83=9E?= =?UTF-8?q?=E5=88=87=E3=82=8A=E6=9B=BF=E3=81=88=E6=99=82=E3=81=AB=E4=B8=80?= =?UTF-8?q?=E9=83=A8=E3=81=AE=E8=89=B2=E3=81=8C=E5=A4=89=E3=82=8F=E3=82=89?= =?UTF-8?q?=E3=81=AA=E3=81=84=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + .../src/components/global/MkPageHeader.vue | 10 +++---- .../src/directives/adaptive-border.ts | 27 ++++++++++++++----- packages/frontend/src/events.ts | 1 + .../frontend/src/pages/admin/_header_.vue | 6 ++--- packages/frontend/src/theme.ts | 5 +++- 6 files changed, 35 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ea6dbdb961..e0b47ff5e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Feat: 設定の管理が強化されました - 自動でバックアップされるように - Enhance: プラグインの管理が強化されました +- Fix: テーマ切り替え時に一部の色が変わらない問題を修正 ### Server - Fix: プロフィール追加情報で無効なURLに入力された場合に照会エラーを出るのを修正 diff --git a/packages/frontend/src/components/global/MkPageHeader.vue b/packages/frontend/src/components/global/MkPageHeader.vue index a7cf70745e..d3c64bf85a 100644 --- a/packages/frontend/src/components/global/MkPageHeader.vue +++ b/packages/frontend/src/components/global/MkPageHeader.vue @@ -43,14 +43,14 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend/src/directives/adaptive-border.ts b/packages/frontend/src/directives/adaptive-border.ts index af7deb5960..8072a1ffd9 100644 --- a/packages/frontend/src/directives/adaptive-border.ts +++ b/packages/frontend/src/directives/adaptive-border.ts @@ -5,17 +5,32 @@ import type { Directive } from 'vue'; import { getBgColor } from '@/utility/get-bg-color.js'; +import { globalEvents } from '@/events.js'; + +const handlerMap = new WeakMap(); export default { mounted(src, binding, vn) { - const parentBg = getBgColor(src.parentElement) ?? 'transparent'; + function calc() { + const parentBg = getBgColor(src.parentElement) ?? 'transparent'; - const myBg = window.getComputedStyle(src).backgroundColor; + const myBg = window.getComputedStyle(src).backgroundColor; - if (parentBg === myBg) { - src.style.borderColor = 'var(--MI_THEME-divider)'; - } else { - src.style.borderColor = myBg; + if (parentBg === myBg) { + src.style.borderColor = 'var(--MI_THEME-divider)'; + } else { + src.style.borderColor = myBg; + } } + + handlerMap.set(src, calc); + + calc(); + + globalEvents.on('themeChanged', calc); + }, + + unmounted(src, binding, vn) { + globalEvents.off('themeChanged', handlerMap.get(src)); }, } as Directive; diff --git a/packages/frontend/src/events.ts b/packages/frontend/src/events.ts index d476aec04a..a74018223c 100644 --- a/packages/frontend/src/events.ts +++ b/packages/frontend/src/events.ts @@ -7,6 +7,7 @@ import { EventEmitter } from 'eventemitter3'; import * as Misskey from 'misskey-js'; export const globalEvents = new EventEmitter<{ + themeChanging: () => void; themeChanged: () => void; clientNotification: (notification: Misskey.entities.Notification) => void; requestClearPageCache: () => void; diff --git a/packages/frontend/src/pages/admin/_header_.vue b/packages/frontend/src/pages/admin/_header_.vue index 8ba35d65d5..d5dac40e86 100644 --- a/packages/frontend/src/pages/admin/_header_.vue +++ b/packages/frontend/src/pages/admin/_header_.vue @@ -35,8 +35,8 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend/src/theme.ts b/packages/frontend/src/theme.ts index 0f44d777f9..ed2f1d3164 100644 --- a/packages/frontend/src/theme.ts +++ b/packages/frontend/src/theme.ts @@ -72,6 +72,9 @@ export function applyTheme(theme: Theme, persist = true) { timeout = window.setTimeout(() => { document.documentElement.classList.remove('_themeChanging_'); + + // 色計算など再度行えるようにクライアント全体に通知 + globalEvents.emit('themeChanged'); }, 1000); const colorScheme = theme.base === 'dark' ? 'dark' : 'light'; @@ -108,7 +111,7 @@ export function applyTheme(theme: Theme, persist = true) { } // 色計算など再度行えるようにクライアント全体に通知 - globalEvents.emit('themeChanged'); + globalEvents.emit('themeChanging'); } function compile(theme: Theme): Record {