From bdc72e5817782316bb2c56ab362b4aa237236bef Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:17:41 +0900 Subject: [PATCH 01/12] clean up --- .../frontend/src/components/MkPageWindow.vue | 9 ++- .../components/global/NestedRouterView.vue | 6 +- .../src/components/global/RouterView.vue | 6 +- .../components/global/StackingRouterView.vue | 2 +- packages/frontend/src/nirax.ts | 57 +++---------------- packages/frontend/src/router/main.ts | 10 +--- 6 files changed, 21 insertions(+), 69 deletions(-) diff --git a/packages/frontend/src/components/MkPageWindow.vue b/packages/frontend/src/components/MkPageWindow.vue index 8a1a9c58d2..a6049b4d91 100644 --- a/packages/frontend/src/components/MkPageWindow.vue +++ b/packages/frontend/src/components/MkPageWindow.vue @@ -60,9 +60,8 @@ const windowRouter = routerFactory(props.initialPath); const pageMetadata = ref(null); const windowEl = shallowRef>(); -const history = ref<{ path: string; key: string; }[]>([{ +const history = ref<{ path: string; }[]>([{ path: windowRouter.getCurrentPath(), - key: windowRouter.getCurrentKey(), }]); const buttonsLeft = computed(() => { const buttons: Record[] = []; @@ -100,12 +99,12 @@ function getSearchMarker(path: string) { const searchMarkerId = ref(getSearchMarker(props.initialPath)); windowRouter.addListener('push', ctx => { - history.value.push({ path: ctx.path, key: ctx.key }); + history.value.push({ path: ctx.path }); }); windowRouter.addListener('replace', ctx => { history.value.pop(); - history.value.push({ path: ctx.path, key: ctx.key }); + history.value.push({ path: ctx.path }); }); windowRouter.addListener('change', ctx => { @@ -155,7 +154,7 @@ const contextmenu = computed(() => ([{ function back() { history.value.pop(); - windowRouter.replace(history.value.at(-1)!.path, history.value.at(-1)!.key); + windowRouter.replace(history.value.at(-1)!.path); } function reload() { diff --git a/packages/frontend/src/components/global/NestedRouterView.vue b/packages/frontend/src/components/global/NestedRouterView.vue index eb7192d8e0..40ee21c674 100644 --- a/packages/frontend/src/components/global/NestedRouterView.vue +++ b/packages/frontend/src/components/global/NestedRouterView.vue @@ -47,14 +47,14 @@ function resolveNested(current: Resolved, d = 0): Resolved | null { const current = resolveNested(router.current)!; const currentPageComponent = shallowRef('component' in current.route ? current.route.component : MkLoadingPage); const currentPageProps = ref(current.props); -const key = ref(router.getCurrentKey() + JSON.stringify(Object.fromEntries(current.props))); +const key = ref(router.getCurrentPath()); -function onChange({ resolved, key: newKey }) { +function onChange({ resolved }) { const current = resolveNested(resolved); if (current == null || 'redirect' in current.route) return; currentPageComponent.value = current.route.component; currentPageProps.value = current.props; - key.value = newKey + JSON.stringify(Object.fromEntries(current.props)); + key.value = router.getCurrentPath(); } router.addListener('change', onChange); diff --git a/packages/frontend/src/components/global/RouterView.vue b/packages/frontend/src/components/global/RouterView.vue index b01e355c5e..2f1ee6734f 100644 --- a/packages/frontend/src/components/global/RouterView.vue +++ b/packages/frontend/src/components/global/RouterView.vue @@ -44,13 +44,13 @@ provide(DI.routerCurrentDepth, currentDepth + 1); const current = router.current!; const currentPageComponent = shallowRef('component' in current.route ? current.route.component : MkLoadingPage); const currentPageProps = ref(current.props); -const key = ref(router.getCurrentKey() + JSON.stringify(Object.fromEntries(current.props))); +const key = ref(router.getCurrentPath()); -function onChange({ resolved, key: newKey }) { +function onChange({ resolved }) { if (resolved == null || 'redirect' in resolved.route) return; currentPageComponent.value = resolved.route.component; currentPageProps.value = resolved.props; - key.value = newKey + JSON.stringify(Object.fromEntries(resolved.props)); + key.value = router.getCurrentPath(); nextTick(() => { // ページ遷移完了後に再びキャッシュを有効化 diff --git a/packages/frontend/src/components/global/StackingRouterView.vue b/packages/frontend/src/components/global/StackingRouterView.vue index d1ca655dee..8f5e6663d8 100644 --- a/packages/frontend/src/components/global/StackingRouterView.vue +++ b/packages/frontend/src/components/global/StackingRouterView.vue @@ -123,7 +123,7 @@ function mount() { function back() { const prev = tabs.value[tabs.value.length - 2]; tabs.value = [...tabs.value.slice(0, tabs.value.length - 1)]; - router.replace(prev.path, prev.key); + router.replace(prev.path); } router.addListener('replace', onReplace); diff --git a/packages/frontend/src/nirax.ts b/packages/frontend/src/nirax.ts index ea3f1fb01a..03c8b43aae 100644 --- a/packages/frontend/src/nirax.ts +++ b/packages/frontend/src/nirax.ts @@ -51,18 +51,15 @@ export type RouterEvent = { beforePath: string; path: string; resolved: Resolved; - key: string; }) => void; replace: (ctx: { path: string; - key: string; }) => void; push: (ctx: { beforePath: string; path: string; route: RouteDef | null; props: Map | null; - key: string; }) => void; same: () => void; }; @@ -121,11 +118,9 @@ export interface IRouter extends EventEmitter { getCurrentPath(): string; - getCurrentKey(): string; - push(path: string, flag?: RouterFlag): void; - replace(path: string, key?: string | null): void; + replace(path: string): void; /** @see EventEmitter */ eventNames(): Array>; @@ -197,7 +192,6 @@ export class Router extends EventEmitter implements IRouter { private currentPath: string; private isLoggedIn: boolean; private notFoundPageComponent: Component; - private currentKey = Date.now().toString(); private redirectCount = 0; public navHook: ((path: string, flag?: RouterFlag) => boolean) | null = null; @@ -215,10 +209,9 @@ export class Router extends EventEmitter implements IRouter { } public init() { - const res = this.navigate(this.currentPath, null, false); + const res = this.navigate(this.currentPath, false); this.emit('replace', { path: res._parsedRoute.fullPath, - key: this.currentKey, }); } @@ -345,7 +338,7 @@ export class Router extends EventEmitter implements IRouter { return check(this.routes, _parts); } - private navigate(path: string, key: string | null | undefined, emitChange = true, _redirected = false): Resolved { + private navigate(path: string, emitChange = true, _redirected = false): Resolved { const beforePath = this.currentPath; this.currentPath = path; @@ -366,7 +359,7 @@ export class Router extends EventEmitter implements IRouter { if (_redirected && this.redirectCount++ > 10) { throw new Error('redirect loop detected'); } - return this.navigate(redirectPath, null, emitChange, true); + return this.navigate(redirectPath, emitChange, true); } if (res.route.loginRequired && !this.isLoggedIn) { @@ -375,18 +368,15 @@ export class Router extends EventEmitter implements IRouter { } const isSamePath = beforePath === path; - if (isSamePath && key == null) key = this.currentKey; this.current = res; this.currentRef.value = res; this.currentRoute.value = res.route; - this.currentKey = res.route.globalCacheKey ?? key ?? path; if (emitChange && res.route.path !== '/:(*)') { this.emit('change', { beforePath, path, resolved: res, - key: this.currentKey, }); } @@ -401,10 +391,6 @@ export class Router extends EventEmitter implements IRouter { return this.currentPath; } - public getCurrentKey() { - return this.currentKey; - } - public push(path: string, flag?: RouterFlag) { const beforePath = this.currentPath; if (path === beforePath) { @@ -415,7 +401,7 @@ export class Router extends EventEmitter implements IRouter { const cancel = this.navHook(path, flag); if (cancel) return; } - const res = this.navigate(path, null); + const res = this.navigate(path); if (res.route.path === '/:(*)') { location.href = path; } else { @@ -424,43 +410,14 @@ export class Router extends EventEmitter implements IRouter { path: res._parsedRoute.fullPath, route: res.route, props: res.props, - key: this.currentKey, }); } } - public replace(path: string, key?: string | null) { - const res = this.navigate(path, key); + public replace(path: string) { + const res = this.navigate(path); this.emit('replace', { path: res._parsedRoute.fullPath, - key: this.currentKey, }); } } - -export function useScrollPositionManager(getScrollContainer: () => HTMLElement | null, router: IRouter) { - const scrollPosStore = new Map(); - - onMounted(() => { - const scrollContainer = getScrollContainer(); - if (scrollContainer == null) return; - - scrollContainer.addEventListener('scroll', () => { - scrollPosStore.set(router.getCurrentKey(), scrollContainer.scrollTop); - }, { passive: true }); - - router.addListener('change', ctx => { - const scrollPos = scrollPosStore.get(ctx.key) ?? 0; - scrollContainer.scroll({ top: scrollPos, behavior: 'instant' }); - if (scrollPos !== 0) { - window.setTimeout(() => { // 遷移直後はタイミングによってはコンポーネントが復元し切ってない可能性も考えられるため少し時間を空けて再度スクロール - scrollContainer.scroll({ top: scrollPos, behavior: 'instant' }); - }, 100); - } - }); - - router.addListener('same', () => { - scrollContainer.scroll({ top: 0, behavior: 'smooth' }); - }); - }); -} diff --git a/packages/frontend/src/router/main.ts b/packages/frontend/src/router/main.ts index 3932a8bac8..2373c87717 100644 --- a/packages/frontend/src/router/main.ts +++ b/packages/frontend/src/router/main.ts @@ -19,15 +19,15 @@ export function setupRouter(app: App, routerFactory: ((path: string) => IRouter) const mainRouter = routerFactory(location.pathname + location.search + location.hash); window.addEventListener('popstate', (event) => { - mainRouter.replace(location.pathname + location.search + location.hash, event.state?.key); + mainRouter.replace(location.pathname + location.search + location.hash); }); mainRouter.addListener('push', ctx => { - window.history.pushState({ key: ctx.key }, '', ctx.path); + window.history.pushState({ }, '', ctx.path); }); mainRouter.addListener('replace', ctx => { - window.history.replaceState({ key: ctx.key }, '', ctx.path); + window.history.replaceState({ }, '', ctx.path); }); mainRouter.addListener('change', ctx => { @@ -96,10 +96,6 @@ class MainRouterProxy implements IRouter { this.supplier().navHook = value; } - getCurrentKey(): string { - return this.supplier().getCurrentKey(); - } - getCurrentPath(): string { return this.supplier().getCurrentPath(); } From 7d4045e8b43f847b62576d82d2f6e891a1b0e6a7 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:24:56 +0900 Subject: [PATCH 02/12] refactor(frontend): router refactoring --- .../components/global/NestedRouterView.vue | 4 +- .../src/components/global/RouterView.vue | 4 +- .../components/global/StackingRouterView.vue | 4 +- packages/frontend/src/di.ts | 4 +- packages/frontend/src/{nirax.ts => router.ts} | 84 +------------------ packages/frontend/src/router/definition.ts | 6 +- packages/frontend/src/router/main.ts | 18 ++-- packages/frontend/src/router/supplier.ts | 10 +-- .../frontend/src/utility/get-user-menu.ts | 4 +- packages/frontend/src/utility/lookup.ts | 2 +- 10 files changed, 29 insertions(+), 111 deletions(-) rename packages/frontend/src/{nirax.ts => router.ts} (79%) diff --git a/packages/frontend/src/components/global/NestedRouterView.vue b/packages/frontend/src/components/global/NestedRouterView.vue index 40ee21c674..5b22d0b7a8 100644 --- a/packages/frontend/src/components/global/NestedRouterView.vue +++ b/packages/frontend/src/components/global/NestedRouterView.vue @@ -15,12 +15,12 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend/src/components/global/RouterView.vue b/packages/frontend/src/components/global/RouterView.vue index 720034a942..fbdb7d261e 100644 --- a/packages/frontend/src/components/global/RouterView.vue +++ b/packages/frontend/src/components/global/RouterView.vue @@ -5,10 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend/src/components/global/StackingRouterView.vue b/packages/frontend/src/components/global/StackingRouterView.vue index b94e020072..c95c74aef3 100644 --- a/packages/frontend/src/components/global/StackingRouterView.vue +++ b/packages/frontend/src/components/global/StackingRouterView.vue @@ -13,7 +13,7 @@ SPDX-License-Identifier: AGPL-3.0-only :duration="200" tag="div" :class="$style.tabs" > -
+
@@ -41,10 +41,9 @@ SPDX-License-Identifier: AGPL-3.0-only diff --git a/packages/frontend/src/events.ts b/packages/frontend/src/events.ts index a74018223c..dfd3d4120c 100644 --- a/packages/frontend/src/events.ts +++ b/packages/frontend/src/events.ts @@ -10,5 +10,4 @@ export const globalEvents = new EventEmitter<{ themeChanging: () => void; themeChanged: () => void; clientNotification: (notification: Misskey.entities.Notification) => void; - requestClearPageCache: () => void; }>(); diff --git a/packages/frontend/src/lib/nirax.ts b/packages/frontend/src/lib/nirax.ts index cc20d497e6..8783874bc2 100644 --- a/packages/frontend/src/lib/nirax.ts +++ b/packages/frontend/src/lib/nirax.ts @@ -5,7 +5,7 @@ // NIRAX --- A lightweight router -import { onMounted, shallowRef } from 'vue'; +import { onBeforeUnmount, onMounted, shallowRef } from 'vue'; import { EventEmitter } from 'eventemitter3'; import type { Component, ShallowRef } from 'vue'; @@ -45,28 +45,28 @@ type ParsedPath = (string | { optional?: boolean; })[]; -export type RouterEvent = { +export type RouterEvents = { change: (ctx: { - beforePath: string; - path: string; - resolved: Resolved; + beforeFullPath: string; + fullPath: string; + resolved: PathResolvedResult; }) => void; replace: (ctx: { - path: string; + fullPath: string; }) => void; push: (ctx: { - beforePath: string; - path: string; + beforeFullPath: string; + fullPath: string; route: RouteDef | null; props: Map | null; }) => void; same: () => void; }; -export type Resolved = { +export type PathResolvedResult = { route: RouteDef; props: Map; - child?: Resolved; + child?: PathResolvedResult; redirected?: boolean; /** @internal */ @@ -102,39 +102,39 @@ function parsePath(path: string): ParsedPath { return res; } -export class Nirax extends EventEmitter { +export class Nirax extends EventEmitter { private routes: DEF; - public current: Resolved; - public currentRef: ShallowRef; + public current: PathResolvedResult; + public currentRef: ShallowRef; public currentRoute: ShallowRef; - private currentPath: string; + private currentFullPath: string; // /foo/bar?baz=qux#hash private isLoggedIn: boolean; private notFoundPageComponent: Component; private redirectCount = 0; - public navHook: ((path: string, flag?: RouterFlag) => boolean) | null = null; + public navHook: ((fullPath: string, flag?: RouterFlag) => boolean) | null = null; - constructor(routes: DEF, currentPath: Nirax['currentPath'], isLoggedIn: boolean, notFoundPageComponent: Component) { + constructor(routes: DEF, currentFullPath: Nirax['currentFullPath'], isLoggedIn: boolean, notFoundPageComponent: Component) { super(); this.routes = routes; - this.current = this.resolve(currentPath)!; + this.current = this.resolve(currentFullPath)!; this.currentRef = shallowRef(this.current); this.currentRoute = shallowRef(this.current.route); - this.currentPath = currentPath; + this.currentFullPath = currentFullPath; this.isLoggedIn = isLoggedIn; this.notFoundPageComponent = notFoundPageComponent; } public init() { - const res = this.navigate(this.currentPath, false); + const res = this.navigate(this.currentFullPath, false); this.emit('replace', { - path: res._parsedRoute.fullPath, + fullPath: res._parsedRoute.fullPath, }); } - public resolve(path: string): Resolved | null { - const fullPath = path; + public resolve(fullPath: string): PathResolvedResult | null { + let path = fullPath; let queryString: string | null = null; let hash: string | null = null; if (path[0] === '/') path = path.substring(1); @@ -153,7 +153,7 @@ export class Nirax extends EventEmitter { hash, }; - function check(routes: RouteDef[], _parts: string[]): Resolved | null { + function check(routes: RouteDef[], _parts: string[]): PathResolvedResult | null { forEachRouteLoop: for (const route of routes) { let parts = [..._parts]; @@ -256,14 +256,14 @@ export class Nirax extends EventEmitter { return check(this.routes, _parts); } - private navigate(path: string, emitChange = true, _redirected = false): Resolved { - const beforePath = this.currentPath; - this.currentPath = path; + private navigate(fullPath: string, emitChange = true, _redirected = false): PathResolvedResult { + const beforeFullPath = this.currentFullPath; + this.currentFullPath = fullPath; - const res = this.resolve(this.currentPath); + const res = this.resolve(this.currentFullPath); if (res == null) { - throw new Error('no route found for: ' + path); + throw new Error('no route found for: ' + fullPath); } if ('redirect' in res.route) { @@ -291,8 +291,8 @@ export class Nirax extends EventEmitter { if (emitChange && res.route.path !== '/:(*)') { this.emit('change', { - beforePath, - path, + beforeFullPath, + fullPath, resolved: res, }); } @@ -304,37 +304,45 @@ export class Nirax extends EventEmitter { }; } - public getCurrentPath() { - return this.currentPath; + public getCurrentFullPath() { + return this.currentFullPath; } - public push(path: string, flag?: RouterFlag) { - const beforePath = this.currentPath; - if (path === beforePath) { + public push(fullPath: string, flag?: RouterFlag) { + const beforeFullPath = this.currentFullPath; + if (fullPath === beforeFullPath) { this.emit('same'); return; } if (this.navHook) { - const cancel = this.navHook(path, flag); + const cancel = this.navHook(fullPath, flag); if (cancel) return; } - const res = this.navigate(path); + const res = this.navigate(fullPath); if (res.route.path === '/:(*)') { - location.href = path; + location.href = fullPath; } else { this.emit('push', { - beforePath, - path: res._parsedRoute.fullPath, + beforeFullPath, + fullPath: res._parsedRoute.fullPath, route: res.route, props: res.props, }); } } - public replace(path: string) { - const res = this.navigate(path); + public replace(fullPath: string) { + const res = this.navigate(fullPath); this.emit('replace', { - path: res._parsedRoute.fullPath, + fullPath: res._parsedRoute.fullPath, + }); + } + + public useListener(event: E, listener: L) { + this.addListener(event, listener); + + onBeforeUnmount(() => { + this.removeListener(event, listener); }); } } diff --git a/packages/frontend/src/pages/settings/profile.vue b/packages/frontend/src/pages/settings/profile.vue index e9b1ee8101..30b7cf9a86 100644 --- a/packages/frontend/src/pages/settings/profile.vue +++ b/packages/frontend/src/pages/settings/profile.vue @@ -169,7 +169,6 @@ import { langmap } from '@/utility/langmap.js'; import { definePage } from '@/page.js'; import { claimAchievement } from '@/utility/achievements.js'; import { store } from '@/store.js'; -import { globalEvents } from '@/events.js'; import MkInfo from '@/components/MkInfo.vue'; import MkTextarea from '@/components/MkTextarea.vue'; @@ -223,7 +222,6 @@ function saveFields() { os.apiWithDialog('i/update', { fields: fields.value.filter(field => field.name !== '' && field.value !== '').map(field => ({ name: field.name, value: field.value })), }); - globalEvents.emit('requestClearPageCache'); } function save() { @@ -249,7 +247,6 @@ function save() { text: i18n.ts.yourNameContainsProhibitedWordsDescription, }, }); - globalEvents.emit('requestClearPageCache'); claimAchievement('profileFilled'); if (profile.name === 'syuilo' || profile.name === 'しゅいろ') { claimAchievement('setNameToSyuilo'); @@ -281,7 +278,6 @@ function changeAvatar(ev) { }); $i.avatarId = i.avatarId; $i.avatarUrl = i.avatarUrl; - globalEvents.emit('requestClearPageCache'); claimAchievement('profileFilled'); }); } @@ -308,7 +304,6 @@ function changeBanner(ev) { }); $i.bannerId = i.bannerId; $i.bannerUrl = i.bannerUrl; - globalEvents.emit('requestClearPageCache'); }); } diff --git a/packages/frontend/src/router.ts b/packages/frontend/src/router.ts index b5f59b30c1..dd70571d64 100644 --- a/packages/frontend/src/router.ts +++ b/packages/frontend/src/router.ts @@ -13,8 +13,8 @@ import { DI } from '@/di.js'; export type Router = Nirax; -export function createRouter(path: string): Router { - return new Nirax(ROUTE_DEF, path, !!$i, page(() => import('@/pages/not-found.vue'))); +export function createRouter(fullPath: string): Router { + return new Nirax(ROUTE_DEF, fullPath, !!$i, page(() => import('@/pages/not-found.vue'))); } export const mainRouter = createRouter(location.pathname + location.search + location.hash); @@ -24,23 +24,23 @@ window.addEventListener('popstate', (event) => { }); mainRouter.addListener('push', ctx => { - window.history.pushState({ }, '', ctx.path); + window.history.pushState({ }, '', ctx.fullPath); }); mainRouter.addListener('replace', ctx => { - window.history.replaceState({ }, '', ctx.path); + window.history.replaceState({ }, '', ctx.fullPath); }); mainRouter.addListener('change', ctx => { - console.log('mainRouter: change', ctx.path); + console.log('mainRouter: change', ctx.fullPath); analytics.page({ - path: ctx.path, - title: ctx.path, + path: ctx.fullPath, + title: ctx.fullPath, }); }); mainRouter.init(); export function useRouter(): Router { - return inject(DI.router, null) ?? mainRouter; + return inject(DI.router) ?? mainRouter; } diff --git a/packages/frontend/src/ui/classic.vue b/packages/frontend/src/ui/classic.vue index fa63586ef7..2ef06726f9 100644 --- a/packages/frontend/src/ui/classic.vue +++ b/packages/frontend/src/ui/classic.vue @@ -112,7 +112,7 @@ function onContextmenu(ev: MouseEvent) { if (isLink(ev.target)) return; if (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO', 'CANVAS'].includes(ev.target.tagName) || ev.target.attributes['contenteditable']) return; if (window.getSelection().toString() !== '') return; - const path = mainRouter.getCurrentPath(); + const path = mainRouter.getCurrentFullPath(); os.contextMenu([{ type: 'label', text: path, diff --git a/packages/frontend/src/ui/universal.vue b/packages/frontend/src/ui/universal.vue index a6695de39d..133360972b 100644 --- a/packages/frontend/src/ui/universal.vue +++ b/packages/frontend/src/ui/universal.vue @@ -186,7 +186,7 @@ const onContextmenu = (ev) => { if (isLink(ev.target)) return; if (['INPUT', 'TEXTAREA', 'IMG', 'VIDEO', 'CANVAS'].includes(ev.target.tagName) || ev.target.attributes['contenteditable']) return; if (window.getSelection()?.toString() !== '') return; - const path = mainRouter.getCurrentPath(); + const path = mainRouter.getCurrentFullPath(); os.contextMenu([{ type: 'label', text: path, From 7b323031b774745ee2146c89ead2a9ebe628d613 Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:46:03 +0900 Subject: [PATCH 07/12] refactor(frontend): use useTemplateRef for DOM referencing --- .../src/components/MkAbuseReportWindow.vue | 4 ++-- packages/frontend/src/components/MkAnimBg.vue | 4 ++-- .../src/components/MkAnnouncementDialog.vue | 6 ++--- .../src/components/MkAntennaEditorDialog.vue | 4 ++-- .../src/components/MkAutocomplete.vue | 4 ++-- packages/frontend/src/components/MkButton.vue | 6 ++--- .../frontend/src/components/MkCaptcha.vue | 4 ++-- packages/frontend/src/components/MkChart.vue | 14 ++++------- .../frontend/src/components/MkCodeEditor.vue | 4 ++-- .../frontend/src/components/MkColorInput.vue | 4 ++-- .../frontend/src/components/MkContainer.vue | 8 +++---- .../frontend/src/components/MkContextMenu.vue | 4 ++-- .../src/components/MkCropperDialog.vue | 6 ++--- .../MkCustomEmojiDetailedDialog.vue | 6 ++--- packages/frontend/src/components/MkDialog.vue | 4 ++-- packages/frontend/src/components/MkDrive.vue | 6 ++--- .../src/components/MkDriveSelectDialog.vue | 4 ++-- .../src/components/MkEmbedCodeGenDialog.vue | 8 +++---- .../frontend/src/components/MkEmojiPicker.vue | 6 ++--- .../src/components/MkEmojiPickerDialog.vue | 6 ++--- .../components/MkFileCaptionEditWindow.vue | 4 ++-- .../src/components/MkFoldableSection.vue | 4 ++-- packages/frontend/src/components/MkFolder.vue | 4 ++-- .../frontend/src/components/MkFormDialog.vue | 4 ++-- .../frontend/src/components/MkHeatmap.vue | 6 ++--- .../src/components/MkHorizontalSwipe.vue | 4 ++-- .../src/components/MkImgWithBlurhash.vue | 8 +++---- packages/frontend/src/components/MkInput.vue | 8 +++---- .../src/components/MkInstanceStats.vue | 8 +++---- .../frontend/src/components/MkLaunchPad.vue | 4 ++-- .../frontend/src/components/MkMediaAudio.vue | 6 ++--- .../frontend/src/components/MkMediaList.vue | 4 ++-- .../frontend/src/components/MkMediaVideo.vue | 6 ++--- .../frontend/src/components/MkMenu.child.vue | 4 ++-- packages/frontend/src/components/MkMenu.vue | 8 +++---- packages/frontend/src/components/MkModal.vue | 6 ++--- .../frontend/src/components/MkModalWindow.vue | 8 +++---- packages/frontend/src/components/MkNote.vue | 16 ++++++------- .../src/components/MkNoteDetailed.vue | 16 ++++++------- packages/frontend/src/components/MkNotes.vue | 4 ++-- .../components/MkNotificationSelectWindow.vue | 8 +++---- .../src/components/MkNotifications.vue | 4 ++-- packages/frontend/src/components/MkOmit.vue | 4 ++-- .../frontend/src/components/MkPageWindow.vue | 4 ++-- .../frontend/src/components/MkPagination.vue | 4 ++-- .../src/components/MkPasswordDialog.vue | 6 ++--- .../frontend/src/components/MkPopupMenu.vue | 4 ++-- .../frontend/src/components/MkPostForm.vue | 12 +++++----- .../src/components/MkPostFormDialog.vue | 7 +++--- .../src/components/MkPullToRefresh.vue | 6 ++--- packages/frontend/src/components/MkRange.vue | 6 ++--- .../src/components/MkReactionIcon.vue | 4 ++-- .../components/MkReactionsViewer.reaction.vue | 4 ++-- .../src/components/MkRetentionHeatmap.vue | 6 ++--- .../src/components/MkRetentionLineChart.vue | 4 ++-- .../src/components/MkSigninDialog.vue | 4 ++-- .../src/components/MkSignupDialog.vue | 4 ++-- .../frontend/src/components/MkSparkle.vue | 4 ++-- .../src/components/MkSystemWebhookEditor.vue | 8 +++---- .../frontend/src/components/MkTagCloud.vue | 8 +++---- .../frontend/src/components/MkTextarea.vue | 4 ++-- .../frontend/src/components/MkTimeline.vue | 6 ++--- .../src/components/MkTokenGenerateWindow.vue | 4 ++-- .../frontend/src/components/MkTooltip.vue | 4 ++-- .../src/components/MkTutorialDialog.vue | 6 ++--- .../frontend/src/components/MkUpdated.vue | 6 ++--- .../src/components/MkUserSelectDialog.vue | 4 ++-- .../src/components/MkUserSetupDialog.vue | 9 ++++--- .../src/components/MkVisibilityPicker.vue | 4 ++-- .../MkVisitorDashboard.ActiveUsersChart.vue | 4 ++-- .../src/components/MkWaitingDialog.vue | 4 ++-- packages/frontend/src/components/MkWindow.vue | 4 ++-- .../frontend/src/components/global/MkA.vue | 4 ++-- .../frontend/src/components/global/MkLazy.vue | 4 ++-- .../components/global/MkPageHeader.tabs.vue | 6 ++--- .../src/components/global/MkPageHeader.vue | 4 ++-- .../components/global/MkStickyContainer.vue | 3 +-- .../src/components/grid/MkDataCell.vue | 24 ++++++++++--------- packages/frontend/src/pages/about-misskey.vue | 4 ++-- .../frontend/src/pages/admin/_header_.vue | 6 ++--- .../notification-recipient.editor.vue | 6 ++--- packages/frontend/src/pages/admin/abuses.vue | 4 ++-- packages/frontend/src/pages/admin/invites.vue | 6 ++--- packages/frontend/src/pages/admin/modlog.vue | 4 ++-- .../src/pages/admin/overview.active-users.vue | 4 ++-- .../src/pages/admin/overview.ap-requests.vue | 6 ++--- .../frontend/src/pages/admin/overview.pie.vue | 4 ++-- .../src/pages/admin/overview.queue.chart.vue | 4 ++-- .../src/pages/admin/overview.queue.vue | 10 ++++---- .../frontend/src/pages/admin/overview.vue | 4 ++-- .../src/pages/admin/queue.chart.chart.vue | 4 ++-- .../frontend/src/pages/admin/queue.chart.vue | 10 ++++---- packages/frontend/src/pages/admin/users.vue | 4 ++-- .../frontend/src/pages/antenna-timeline.vue | 8 +++---- .../src/pages/custom-emojis-manager.vue | 4 ++-- .../src/pages/drop-and-fusion.game.vue | 6 ++--- packages/frontend/src/pages/explore.users.vue | 4 ++-- packages/frontend/src/pages/explore.vue | 4 ++-- .../frontend/src/pages/follow-requests.vue | 4 ++-- packages/frontend/src/pages/invite.vue | 4 ++-- .../frontend/src/pages/my-clips/index.vue | 4 ++-- .../page-editor/els/page-editor.el.text.vue | 5 ++-- .../src/pages/settings/2fa.qrdialog.vue | 4 ++-- .../settings/avatar-decoration.dialog.vue | 4 ++-- .../frontend/src/pages/settings/index.vue | 4 ++-- .../src/pages/settings/notifications.vue | 4 ++-- packages/frontend/src/pages/timeline.vue | 6 ++--- .../frontend/src/pages/user-list-timeline.vue | 8 +++---- .../src/pages/user/activity.following.vue | 8 +++---- .../src/pages/user/activity.notes.vue | 8 +++---- .../frontend/src/pages/user/activity.pv.vue | 8 +++---- .../src/pages/welcome.timeline.note.vue | 4 ++-- .../frontend/src/pages/welcome.timeline.vue | 6 ++--- packages/frontend/src/ui/classic.sidebar.vue | 4 ++-- packages/frontend/src/ui/classic.vue | 4 ++-- packages/frontend/src/ui/deck.vue | 4 ++-- .../frontend/src/ui/deck/antenna-column.vue | 4 ++-- .../frontend/src/ui/deck/channel-column.vue | 4 ++-- packages/frontend/src/ui/deck/column.vue | 4 ++-- packages/frontend/src/ui/deck/list-column.vue | 4 ++-- .../src/ui/deck/notifications-column.vue | 6 ++--- .../src/ui/deck/role-timeline-column.vue | 4 ++-- packages/frontend/src/ui/deck/tl-column.vue | 4 ++-- packages/frontend/src/ui/universal.vue | 4 ++-- .../frontend/src/widgets/WidgetAichan.vue | 4 ++-- .../src/widgets/WidgetInstanceCloud.vue | 8 +++---- .../frontend/src/widgets/WidgetSlideshow.vue | 8 +++---- 127 files changed, 353 insertions(+), 359 deletions(-) diff --git a/packages/frontend/src/components/MkAbuseReportWindow.vue b/packages/frontend/src/components/MkAbuseReportWindow.vue index a634a748e9..dbac5e9dd7 100644 --- a/packages/frontend/src/components/MkAbuseReportWindow.vue +++ b/packages/frontend/src/components/MkAbuseReportWindow.vue @@ -30,7 +30,7 @@ SPDX-License-Identifier: AGPL-3.0-only