@@ -24,6 +24,7 @@
diff --git a/packages/frontend/src/directives/adaptive-bg.ts b/packages/frontend/src/directives/adaptive-bg.ts
index 313aad7996..83bcd7089d 100644
--- a/packages/frontend/src/directives/adaptive-bg.ts
+++ b/packages/frontend/src/directives/adaptive-bg.ts
@@ -10,7 +10,7 @@ export default {
return el.parentElement ? getBgColor(el.parentElement) : 'transparent';
}
};
-
+
const parentBg = getBgColor(src.parentElement);
const myBg = window.getComputedStyle(src).backgroundColor;
diff --git a/packages/frontend/src/directives/adaptive-border.ts b/packages/frontend/src/directives/adaptive-border.ts
index 619c9f0b6d..5bd04024be 100644
--- a/packages/frontend/src/directives/adaptive-border.ts
+++ b/packages/frontend/src/directives/adaptive-border.ts
@@ -10,7 +10,7 @@ export default {
return el.parentElement ? getBgColor(el.parentElement) : 'transparent';
}
};
-
+
const parentBg = getBgColor(src.parentElement);
const myBg = window.getComputedStyle(src).backgroundColor;
diff --git a/packages/frontend/src/directives/panel.ts b/packages/frontend/src/directives/panel.ts
index d31dc41ed4..8727183d36 100644
--- a/packages/frontend/src/directives/panel.ts
+++ b/packages/frontend/src/directives/panel.ts
@@ -10,7 +10,7 @@ export default {
return el.parentElement ? getBgColor(el.parentElement) : 'transparent';
}
};
-
+
const parentBg = getBgColor(src.parentElement);
const myBg = getComputedStyle(document.documentElement).getPropertyValue('--panel');
diff --git a/packages/frontend/src/filters/date.ts b/packages/frontend/src/filters/date.ts
index 706b7d60cc..9bc9bfe8ab 100644
--- a/packages/frontend/src/filters/date.ts
+++ b/packages/frontend/src/filters/date.ts
@@ -1,4 +1,4 @@
import { dateTimeFormat } from '@/scripts/intl-const';
-export default (d: Date | number | undefined) => dateTimeFormat.format(d);
+export default (d: Date | number | undefined) => dateTimeFormat.format(d);
export const dateString = (d: string) => dateTimeFormat.format(new Date(d));
diff --git a/packages/frontend/src/local-storage.ts b/packages/frontend/src/local-storage.ts
index ca4f21f79b..f9d04f7950 100644
--- a/packages/frontend/src/local-storage.ts
+++ b/packages/frontend/src/local-storage.ts
@@ -14,7 +14,7 @@ type Keys =
'wallpaper' |
'theme' |
'colorScheme' |
- 'useSystemFont' |
+ 'useSystemFont' |
'fontSize' |
'ui' |
'ui_temp' |
diff --git a/packages/frontend/src/nirax.ts b/packages/frontend/src/nirax.ts
index 68977ed796..3a03444de2 100644
--- a/packages/frontend/src/nirax.ts
+++ b/packages/frontend/src/nirax.ts
@@ -1,8 +1,7 @@
// NIRAX --- A lightweight router
import { EventEmitter } from 'eventemitter3';
-import { Component, shallowRef, ShallowRef } from 'vue';
-import { pleaseLogin } from '@/scripts/please-login';
+import { Component, onMounted, shallowRef, ShallowRef } from 'vue';
import { safeURIDecode } from '@/scripts/safe-uri-decode';
type RouteDef = {
@@ -23,7 +22,7 @@ type ParsedPath = (string | {
optional?: boolean;
})[];
-export type Resolved = { route: RouteDef; props: Map; child?: Resolved; };
+export type Resolved = { route: RouteDef; props: Map; child?: Resolved; };
function parsePath(path: string): ParsedPath {
const res = [] as ParsedPath;
@@ -75,15 +74,19 @@ export class Router extends EventEmitter<{
public currentRef: ShallowRef = shallowRef();
public currentRoute: ShallowRef = shallowRef();
private currentPath: string;
+ private isLoggedIn: boolean;
+ private notFoundPageComponent: Component;
private currentKey = Date.now().toString();
public navHook: ((path: string, flag?: any) => boolean) | null = null;
- constructor(routes: Router['routes'], currentPath: Router['currentPath']) {
+ constructor(routes: Router['routes'], currentPath: Router['currentPath'], isLoggedIn: boolean, notFoundPageComponent: Component) {
super();
this.routes = routes;
this.currentPath = currentPath;
+ this.isLoggedIn = isLoggedIn;
+ this.notFoundPageComponent = notFoundPageComponent;
this.navigate(currentPath, null, false);
}
@@ -159,11 +162,11 @@ export class Router extends EventEmitter<{
if (route.hash != null && hash != null) {
props.set(route.hash, safeURIDecode(hash));
}
-
+
if (route.query != null && queryString != null) {
const queryObject = [...new URLSearchParams(queryString).entries()]
.reduce((obj, entry) => ({ ...obj, [entry[0]]: entry[1] }), {});
-
+
for (const q in route.query) {
const as = route.query[q];
if (queryObject[q]) {
@@ -171,7 +174,7 @@ export class Router extends EventEmitter<{
}
}
}
-
+
return {
route,
props,
@@ -212,8 +215,9 @@ export class Router extends EventEmitter<{
throw new Error('no route found for: ' + path);
}
- if (res.route.loginRequired) {
- pleaseLogin('/');
+ if (res.route.loginRequired && !this.isLoggedIn) {
+ res.route.component = this.notFoundPageComponent;
+ res.props.set('showLoginPopup', true);
}
const isSamePath = beforePath === path;
@@ -263,13 +267,33 @@ export class Router extends EventEmitter<{
});
}
- public replace(path: string, key?: string | null, emitEvent = true) {
+ public replace(path: string, key?: string | null) {
this.navigate(path, key);
- if (emitEvent) {
- this.emit('replace', {
- path,
- key: this.currentKey,
- });
- }
}
}
+
+export function useScrollPositionManager(getScrollContainer: () => HTMLElement, router: Router) {
+ const scrollPosStore = new Map();
+
+ onMounted(() => {
+ const scrollContainer = getScrollContainer();
+
+ 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/os.ts b/packages/frontend/src/os.ts
index c44d348046..1a5ed90541 100644
--- a/packages/frontend/src/os.ts
+++ b/packages/frontend/src/os.ts
@@ -460,11 +460,13 @@ export async function pickEmoji(src: HTMLElement | null, opts) {
export async function cropImage(image: Misskey.entities.DriveFile, options: {
aspectRatio: number;
+ uploadFolder?: string | null;
}): Promise {
return new Promise((resolve, reject) => {
popup(defineAsyncComponent(() => import('@/components/MkCropperDialog.vue')), {
file: image,
aspectRatio: options.aspectRatio,
+ uploadFolder: options.uploadFolder,
}, {
ok: x => {
resolve(x);
diff --git a/packages/frontend/src/pages/about-misskey.vue b/packages/frontend/src/pages/about-misskey.vue
index 0017145fa1..b67cf26473 100644
--- a/packages/frontend/src/pages/about-misskey.vue
+++ b/packages/frontend/src/pages/about-misskey.vue
@@ -155,6 +155,12 @@ const patronsWithIcon = [{
}, {
name: 'spinlock',
icon: 'https://misskey-hub.net/patrons/6a1cebc819d540a78bf20e9e3115baa8.jpg',
+}, {
+ name: 'じゅくま',
+ icon: 'https://misskey-hub.net/patrons/3e56bdac69dd42f7a06e0f12cf2fc895.jpg',
+}, {
+ name: '清遊あみ',
+ icon: 'https://misskey-hub.net/patrons/de25195b88e940a388388bea2e7637d8.jpg',
}];
const patrons = [
diff --git a/packages/frontend/src/pages/about.emojis.vue b/packages/frontend/src/pages/about.emojis.vue
index 3744bed10f..cc0bf2eed2 100644
--- a/packages/frontend/src/pages/about.emojis.vue
+++ b/packages/frontend/src/pages/about.emojis.vue
@@ -20,7 +20,7 @@
-
+
{{ category || i18n.ts.other }}
@@ -56,7 +56,7 @@ function search() {
const queryarry = q.match(/\:([a-z0-9_]*)\:/g);
if (queryarry) {
- searchEmojis = customEmojis.value.filter(emoji =>
+ searchEmojis = customEmojis.value.filter(emoji =>
queryarry.includes(`:${emoji.name}:`),
);
} else {
diff --git a/packages/frontend/src/pages/admin/abuses.vue b/packages/frontend/src/pages/admin/abuses.vue
index 3bc5ee9723..9cf96d3d04 100644
--- a/packages/frontend/src/pages/admin/abuses.vue
+++ b/packages/frontend/src/pages/admin/abuses.vue
@@ -75,7 +75,7 @@ const pagination = {
};
function resolved(reportId) {
- reports.removeItem(item => item.id === reportId);
+ reports.removeItem(reportId);
}
const headerActions = $computed(() => []);
diff --git a/packages/frontend/src/pages/admin/ads.vue b/packages/frontend/src/pages/admin/ads.vue
index 2c9e18b0bf..9a5bd88b2e 100644
--- a/packages/frontend/src/pages/admin/ads.vue
+++ b/packages/frontend/src/pages/admin/ads.vue
@@ -36,6 +36,16 @@
{{ i18n.ts.expiration }}
+
+ {{ i18n.ts.advancedSettings }}
+
+ {{ i18n.ts._ad.timezoneinfo }}
+
+
+
+
+
+
{{ i18n.ts.memo }}
@@ -59,6 +69,7 @@ import MkButton from '@/components/MkButton.vue';
import MkInput from '@/components/MkInput.vue';
import MkTextarea from '@/components/MkTextarea.vue';
import MkRadios from '@/components/MkRadios.vue';
+import MkFolder from '@/components/MkFolder.vue';
import FormSplit from '@/components/form/split.vue';
import * as os from '@/os';
import { i18n } from '@/i18n';
@@ -69,6 +80,7 @@ let ads: any[] = $ref([]);
// ISO形式はTZがUTCになってしまうので、TZ分ずらして時間を初期化
const localTime = new Date();
const localTimeDiff = localTime.getTimezoneOffset() * 60 * 1000;
+const daysOfWeek: string[] = [i18n.ts._weekday.sunday, i18n.ts._weekday.monday, i18n.ts._weekday.tuesday, i18n.ts._weekday.wednesday, i18n.ts._weekday.thursday, i18n.ts._weekday.friday, i18n.ts._weekday.saturday];
os.api('admin/ad/list').then(adsResponse => {
ads = adsResponse.map(r => {
@@ -84,6 +96,11 @@ os.api('admin/ad/list').then(adsResponse => {
});
});
+// 選択された曜日(index)のビットフラグを操作する
+function toggleDayOfWeek(ad, index) {
+ ad.dayOfWeek ^= 1 << index;
+}
+
function add() {
ads.unshift({
id: null,
@@ -95,6 +112,7 @@ function add() {
imageUrl: null,
expiresAt: null,
startsAt: null,
+ dayOfWeek: 0,
});
}
@@ -105,6 +123,7 @@ function remove(ad) {
}).then(({ canceled }) => {
if (canceled) return;
ads = ads.filter(x => x !== ad);
+ if (ad.id == null) return;
os.apiWithDialog('admin/ad/delete', {
id: ad.id,
});
diff --git a/packages/frontend/src/pages/admin/index.vue b/packages/frontend/src/pages/admin/index.vue
index 8b083bc896..226eb8d026 100644
--- a/packages/frontend/src/pages/admin/index.vue
+++ b/packages/frontend/src/pages/admin/index.vue
@@ -1,6 +1,6 @@
-
+
diff --git a/packages/frontend/src/pages/admin/moderation.vue b/packages/frontend/src/pages/admin/moderation.vue
index e36c9ac91d..13789820a0 100644
--- a/packages/frontend/src/pages/admin/moderation.vue
+++ b/packages/frontend/src/pages/admin/moderation.vue
@@ -24,7 +24,7 @@
{{ i18n.ts.preservedUsernames }}
{{ i18n.ts.preservedUsernamesDescription }}
-
+
{{ i18n.ts.sensitiveWords }}
{{ i18n.ts.sensitiveWordsDescription }}
{{ i18n.ts.sensitiveWordsDescription2 }}
diff --git a/packages/frontend/src/pages/admin/other-settings.vue b/packages/frontend/src/pages/admin/other-settings.vue
index 15d720a070..13e3588740 100644
--- a/packages/frontend/src/pages/admin/other-settings.vue
+++ b/packages/frontend/src/pages/admin/other-settings.vue
@@ -3,14 +3,34 @@
-
-
- {{ i18n.ts.enableChartsForRemoteUser }}
-
+
+
+
+ {{ i18n.ts.enableServerMachineStats }}
+ {{ i18n.ts.turnOffToImprovePerformance }}
+
+
-
- {{ i18n.ts.enableChartsForFederatedInstances }}
-
+
+
+ {{ i18n.ts.enableIdenticonGeneration }}
+ {{ i18n.ts.turnOffToImprovePerformance }}
+
+
+
+
+
+ {{ i18n.ts.enableChartsForRemoteUser }}
+ {{ i18n.ts.turnOffToImprovePerformance }}
+
+
+
+
+
+ {{ i18n.ts.enableChartsForFederatedInstances }}
+ {{ i18n.ts.turnOffToImprovePerformance }}
+
+
@@ -27,17 +47,23 @@ import { i18n } from '@/i18n';
import { definePageMetadata } from '@/scripts/page-metadata';
import MkSwitch from '@/components/MkSwitch.vue';
+let enableServerMachineStats: boolean = $ref(false);
+let enableIdenticonGeneration: boolean = $ref(false);
let enableChartsForRemoteUser: boolean = $ref(false);
let enableChartsForFederatedInstances: boolean = $ref(false);
async function init() {
const meta = await os.api('admin/meta');
+ enableServerMachineStats = meta.enableServerMachineStats;
+ enableIdenticonGeneration = meta.enableIdenticonGeneration;
enableChartsForRemoteUser = meta.enableChartsForRemoteUser;
enableChartsForFederatedInstances = meta.enableChartsForFederatedInstances;
}
function save() {
os.apiWithDialog('admin/update-meta', {
+ enableServerMachineStats,
+ enableIdenticonGeneration,
enableChartsForRemoteUser,
enableChartsForFederatedInstances,
}).then(() => {
diff --git a/packages/frontend/src/pages/admin/overview.ap-requests.vue b/packages/frontend/src/pages/admin/overview.ap-requests.vue
index ad8e623415..bde5580366 100644
--- a/packages/frontend/src/pages/admin/overview.ap-requests.vue
+++ b/packages/frontend/src/pages/admin/overview.ap-requests.vue
@@ -259,7 +259,7 @@ onMounted(async () => {
},
plugins: [chartVLine(vLineColor)],
});
-
+
fetching = false;
});
diff --git a/packages/frontend/src/pages/admin/overview.federation.vue b/packages/frontend/src/pages/admin/overview.federation.vue
index ab78c4c393..469d2e6927 100644
--- a/packages/frontend/src/pages/admin/overview.federation.vue
+++ b/packages/frontend/src/pages/admin/overview.federation.vue
@@ -58,7 +58,7 @@ let federationSubActiveDiff = $ref
(null);
let fetching = $ref(true);
const { handler: externalTooltipHandler } = useChartTooltip();
-
+
onMounted(async () => {
const chart = await os.apiGet('charts/federation', { limit: 2, span: 'day' });
federationPubActive = chart.pubActive[0];
diff --git a/packages/frontend/src/pages/admin/overview.queue.vue b/packages/frontend/src/pages/admin/overview.queue.vue
index 69ca89e226..b08757aeb8 100644
--- a/packages/frontend/src/pages/admin/overview.queue.vue
+++ b/packages/frontend/src/pages/admin/overview.queue.vue
@@ -122,4 +122,4 @@ onUnmounted(() => {
}
}
}
-
+
diff --git a/packages/frontend/src/pages/admin/overview.stats.vue b/packages/frontend/src/pages/admin/overview.stats.vue
index 142e70c698..f746ad14b9 100644
--- a/packages/frontend/src/pages/admin/overview.stats.vue
+++ b/packages/frontend/src/pages/admin/overview.stats.vue
@@ -73,7 +73,7 @@ let fetching = $ref(true);
onMounted(async () => {
const [_stats, _onlineUsersCount] = await Promise.all([
os.api('stats', {}),
- os.api('get-online-users-count').then(res => res.count),
+ os.apiGet('get-online-users-count').then(res => res.count),
]);
stats = _stats;
onlineUsersCount = _onlineUsersCount;
diff --git a/packages/frontend/src/pages/admin/overview.vue b/packages/frontend/src/pages/admin/overview.vue
index e8295c81b5..838c197f05 100644
--- a/packages/frontend/src/pages/admin/overview.vue
+++ b/packages/frontend/src/pages/admin/overview.vue
@@ -30,7 +30,7 @@
Federation
-
+
Instances
diff --git a/packages/frontend/src/pages/admin/roles.editor.vue b/packages/frontend/src/pages/admin/roles.editor.vue
index a1fa9d2932..02a2d4366a 100644
--- a/packages/frontend/src/pages/admin/roles.editor.vue
+++ b/packages/frontend/src/pages/admin/roles.editor.vue
@@ -210,7 +210,7 @@
-
+
{{ i18n.ts._role._options.driveCapacity }}
diff --git a/packages/frontend/src/pages/channel-editor.vue b/packages/frontend/src/pages/channel-editor.vue
index 0a358a141b..cacdab040f 100644
--- a/packages/frontend/src/pages/channel-editor.vue
+++ b/packages/frontend/src/pages/channel-editor.vue
@@ -25,11 +25,11 @@
{{ i18n.ts.pinnedNotes }}
-
+
-
props.clipId, async () => {
favorited = clip.isFavorited;
}, {
immediate: true,
-});
+});
provide('currentClip', $$(clip));
diff --git a/packages/frontend/src/pages/custom-emojis-manager.vue b/packages/frontend/src/pages/custom-emojis-manager.vue
index 3da6a0d9cb..dde4d67f18 100644
--- a/packages/frontend/src/pages/custom-emojis-manager.vue
+++ b/packages/frontend/src/pages/custom-emojis-manager.vue
@@ -144,7 +144,7 @@ const edit = (emoji) => {
...result.updated,
}));
} else if (result.deleted) {
- emojisPaginationComponent.value.removeItem((item) => item.id === emoji.id);
+ emojisPaginationComponent.value.removeItem(emoji.id);
}
},
}, 'closed');
@@ -311,13 +311,13 @@ definePageMetadata(computed(() => ({
.empty {
margin: var(--margin);
}
-
+
.ldhfsamy {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(190px, 1fr));
grid-gap: 12px;
margin: var(--margin) 0;
-
+
> .emoji {
display: flex;
align-items: center;
diff --git a/packages/frontend/src/pages/follow.vue b/packages/frontend/src/pages/follow.vue
index d14b663364..2d08b66868 100644
--- a/packages/frontend/src/pages/follow.vue
+++ b/packages/frontend/src/pages/follow.vue
@@ -20,7 +20,7 @@ async function follow(user): Promise {
window.close();
return;
}
-
+
os.apiWithDialog('following/create', {
userId: user.id,
});
diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue
index 83997b2555..ac765e88b7 100644
--- a/packages/frontend/src/pages/instance-info.vue
+++ b/packages/frontend/src/pages/instance-info.vue
@@ -49,7 +49,7 @@
N/A
-
+
Following (Pub)
diff --git a/packages/frontend/src/pages/list.vue b/packages/frontend/src/pages/list.vue
index 40934fb71d..3307eef359 100644
--- a/packages/frontend/src/pages/list.vue
+++ b/packages/frontend/src/pages/list.vue
@@ -112,7 +112,7 @@ definePageMetadata(computed(() => list ? {
flex: 1;
min-width: 0;
margin-right: 8px;
-
+
&:hover {
text-decoration: none;
}
diff --git a/packages/frontend/src/pages/not-found.vue b/packages/frontend/src/pages/not-found.vue
index 43dc41e7cc..d10f221b8c 100644
--- a/packages/frontend/src/pages/not-found.vue
+++ b/packages/frontend/src/pages/not-found.vue
@@ -10,8 +10,17 @@
@@ -177,7 +177,7 @@ onMounted(() => {
> .post {
display: inline-block;
-
+
> .button {
width: 40px;
height: 40px;
diff --git a/packages/frontend/src/ui/classic.vue b/packages/frontend/src/ui/classic.vue
index d50f2b0454..2c58c29840 100644
--- a/packages/frontend/src/ui/classic.vue
+++ b/packages/frontend/src/ui/classic.vue
@@ -219,7 +219,7 @@ onMounted(() => {
&.fullView {
margin: 0;
-
+
> .sidebar {
display: none;
}
diff --git a/packages/frontend/src/ui/deck/antenna-column.vue b/packages/frontend/src/ui/deck/antenna-column.vue
index d21a9cc580..a1ca32724f 100644
--- a/packages/frontend/src/ui/deck/antenna-column.vue
+++ b/packages/frontend/src/ui/deck/antenna-column.vue
@@ -44,11 +44,22 @@ async function setAntenna() {
});
}
-const menu = [{
- icon: 'ti ti-pencil',
- text: i18n.ts.selectAntenna,
- action: setAntenna,
-}];
+function editAntenna() {
+ os.pageWindow('my/antennas/' + props.column.antennaId);
+}
+
+const menu = [
+ {
+ icon: 'ti ti-pencil',
+ text: i18n.ts.selectAntenna,
+ action: setAntenna,
+ },
+ {
+ icon: 'ti ti-settings',
+ text: i18n.ts.editAntenna,
+ action: editAntenna,
+ },
+];
/*
function focus() {
diff --git a/packages/frontend/src/ui/deck/list-column.vue b/packages/frontend/src/ui/deck/list-column.vue
index f36dc6151c..3d6256c4fd 100644
--- a/packages/frontend/src/ui/deck/list-column.vue
+++ b/packages/frontend/src/ui/deck/list-column.vue
@@ -42,9 +42,20 @@ async function setList() {
});
}
-const menu = [{
- icon: 'ti ti-pencil',
- text: i18n.ts.selectList,
- action: setList,
-}];
+function editList() {
+ os.pageWindow('my/lists/' + props.column.listId);
+}
+
+const menu = [
+ {
+ icon: 'ti ti-pencil',
+ text: i18n.ts.selectList,
+ action: setList,
+ },
+ {
+ icon: 'ti ti-settings',
+ text: i18n.ts.editList,
+ action: editList,
+ },
+];
diff --git a/packages/frontend/src/ui/deck/main-column.vue b/packages/frontend/src/ui/deck/main-column.vue
index 169fac70a2..0413307955 100644
--- a/packages/frontend/src/ui/deck/main-column.vue
+++ b/packages/frontend/src/ui/deck/main-column.vue
@@ -7,24 +7,29 @@
-
+
+
+
diff --git a/packages/frontend/src/ui/minimum.vue b/packages/frontend/src/ui/minimum.vue
index e656f00bb2..baba9e4da5 100644
--- a/packages/frontend/src/ui/minimum.vue
+++ b/packages/frontend/src/ui/minimum.vue
@@ -1,6 +1,8 @@
-
-
+
diff --git a/packages/frontend/src/ui/universal.vue b/packages/frontend/src/ui/universal.vue
index 8abb20300f..9ae43c39d3 100644
--- a/packages/frontend/src/ui/universal.vue
+++ b/packages/frontend/src/ui/universal.vue
@@ -95,6 +95,7 @@ import { PageMetadata, provideMetadataReceiver } from '@/scripts/page-metadata';
import { deviceKind } from '@/scripts/device-kind';
import { miLocalStorage } from '@/local-storage';
import { CURRENT_STICKY_BOTTOM } from '@/const';
+import { useScrollPositionManager } from '@/nirax';
const XWidgets = defineAsyncComponent(() => import('./universal.widgets.vue'));
const XSidebar = defineAsyncComponent(() => import('@/ui/_common_/navbar.vue'));
@@ -213,6 +214,8 @@ watch($$(navFooter), () => {
}, {
immediate: true,
});
+
+useScrollPositionManager(() => contents.value.rootEl, mainRouter);