-
@@ -195,11 +199,21 @@ watch(() => props.user.avatarBlurhash, () => {
> .plot {
contain: strict;
+ position: absolute;
width: 100%;
height: 100%;
clip-path: path('M0 0H1V1H0z');
transform: scale(32767);
transform-origin: 0 0;
+ opacity: 0.5;
+
+ &:first-child {
+ opacity: 1;
+ }
+
+ &:last-child {
+ opacity: calc(1 / 3);
+ }
}
}
}
@@ -221,6 +235,14 @@ watch(() => props.user.avatarBlurhash, () => {
> .plot {
background-position: 20% 10%; /* ~= 37.5deg */
+
+ &:first-child {
+ background-position-x: 21%;
+ }
+
+ &:last-child {
+ background-position-y: 11%;
+ }
}
}
}
@@ -241,7 +263,16 @@ watch(() => props.user.avatarBlurhash, () => {
-38.5857864376%); /* 40 - 2 * sqrt(2) */
> .plot {
+ position: absolute;
background-position: 80% 10%; /* ~= 37.5deg */
+
+ &:first-child {
+ background-position-x: 79%;
+ }
+
+ &:last-child {
+ background-position-y: 11%;
+ }
}
}
}
diff --git a/packages/frontend/src/directives/user-preview.ts b/packages/frontend/src/directives/user-preview.ts
index ae12f2670a..397f449bd1 100644
--- a/packages/frontend/src/directives/user-preview.ts
+++ b/packages/frontend/src/directives/user-preview.ts
@@ -13,8 +13,6 @@ export class UserPreview {
this.el = el;
this.user = user;
- this.attach();
-
this.show = this.show.bind(this);
this.close = this.close.bind(this);
this.onMouseover = this.onMouseover.bind(this);
@@ -22,6 +20,8 @@ export class UserPreview {
this.onClick = this.onClick.bind(this);
this.attach = this.attach.bind(this);
this.detach = this.detach.bind(this);
+
+ this.attach();
}
private show() {
diff --git a/packages/frontend/src/init.ts b/packages/frontend/src/init.ts
index 7809017951..5b3e7ec932 100644
--- a/packages/frontend/src/init.ts
+++ b/packages/frontend/src/init.ts
@@ -187,7 +187,7 @@ try {
} catch (err) {}
const app = createApp(
- window.location.search === '?zen' ? defineAsyncComponent(() => import('@/ui/zen.vue')) :
+ new URLSearchParams(window.location.search).has('zen') ? defineAsyncComponent(() => import('@/ui/zen.vue')) :
!$i ? defineAsyncComponent(() => import('@/ui/visitor.vue')) :
ui === 'deck' ? defineAsyncComponent(() => import('@/ui/deck.vue')) :
ui === 'classic' ? defineAsyncComponent(() => import('@/ui/classic.vue')) :
diff --git a/packages/frontend/src/pages/admin/ads.vue b/packages/frontend/src/pages/admin/ads.vue
index 828bfe6007..803e8cb7b0 100644
--- a/packages/frontend/src/pages/admin/ads.vue
+++ b/packages/frontend/src/pages/admin/ads.vue
@@ -113,16 +113,37 @@ function remove(ad) {
function save(ad) {
if (ad.id == null) {
- os.apiWithDialog('admin/ad/create', {
+ os.api('admin/ad/create', {
...ad,
expiresAt: new Date(ad.expiresAt).getTime(),
startsAt: new Date(ad.startsAt).getTime(),
+ }).then(() => {
+ os.alert({
+ type: 'success',
+ text: i18n.ts.saved,
+ });
+ refresh();
+ }).catch(err => {
+ os.alert({
+ type: 'error',
+ text: err,
+ });
});
} else {
- os.apiWithDialog('admin/ad/update', {
+ os.api('admin/ad/update', {
...ad,
expiresAt: new Date(ad.expiresAt).getTime(),
startsAt: new Date(ad.startsAt).getTime(),
+ }).then(() => {
+ os.alert({
+ type: 'success',
+ text: i18n.ts.saved,
+ });
+ }).catch(err => {
+ os.alert({
+ type: 'error',
+ text: err,
+ });
});
}
}
@@ -141,6 +162,25 @@ function more() {
}));
});
}
+
+function refresh() {
+ os.api('admin/ad/list').then(adsResponse => {
+ ads = adsResponse.map(r => {
+ const exdate = new Date(r.expiresAt);
+ const stdate = new Date(r.startsAt);
+ exdate.setMilliseconds(exdate.getMilliseconds() - localTimeDiff);
+ stdate.setMilliseconds(stdate.getMilliseconds() - localTimeDiff);
+ return {
+ ...r,
+ expiresAt: exdate.toISOString().slice(0, 16),
+ startsAt: stdate.toISOString().slice(0, 16),
+ };
+ });
+ });
+}
+
+refresh();
+
const headerActions = $computed(() => [{
asFullButton: true,
icon: 'ti ti-plus',
diff --git a/packages/frontend/src/pages/admin/announcements.vue b/packages/frontend/src/pages/admin/announcements.vue
index d5d177bf76..b76e4b9114 100644
--- a/packages/frontend/src/pages/admin/announcements.vue
+++ b/packages/frontend/src/pages/admin/announcements.vue
@@ -69,6 +69,7 @@ function save(announcement) {
type: 'success',
text: i18n.ts.saved,
});
+ refresh();
}).catch(err => {
os.alert({
type: 'error',
@@ -90,6 +91,14 @@ function save(announcement) {
}
}
+function refresh() {
+ os.api('admin/announcements/list').then(announcementResponse => {
+ announcements = announcementResponse;
+ });
+}
+
+refresh();
+
const headerActions = $computed(() => [{
asFullButton: true,
icon: 'ti ti-plus',
diff --git a/packages/frontend/src/pages/channel-editor.vue b/packages/frontend/src/pages/channel-editor.vue
index 667caab966..9cb440d2bb 100644
--- a/packages/frontend/src/pages/channel-editor.vue
+++ b/packages/frontend/src/pages/channel-editor.vue
@@ -2,7 +2,7 @@
-
+
{{ i18n.ts.name }}
diff --git a/packages/frontend/src/pages/channels.vue b/packages/frontend/src/pages/channels.vue
index fd1d2d03cf..3a5aa00c5b 100644
--- a/packages/frontend/src/pages/channels.vue
+++ b/packages/frontend/src/pages/channels.vue
@@ -47,6 +47,7 @@ const featuredPagination = {
const favoritesPagination = {
endpoint: 'channels/my-favorites' as const,
limit: 100,
+ noPaging: true,
};
const followingPagination = {
endpoint: 'channels/followed' as const,
diff --git a/packages/frontend/src/pages/explore.users.vue b/packages/frontend/src/pages/explore.users.vue
index c441407d97..3f4ff5182b 100644
--- a/packages/frontend/src/pages/explore.users.vue
+++ b/packages/frontend/src/pages/explore.users.vue
@@ -88,7 +88,7 @@ const tagUsers = $computed(() => ({
},
}));
-const pinnedUsers = { endpoint: 'pinned-users' };
+const pinnedUsers = { endpoint: 'pinned-users', noPaging: true };
const popularUsers = { endpoint: 'users', limit: 10, noPaging: true, params: {
state: 'alive',
origin: 'local',
diff --git a/packages/frontend/src/pages/my-antennas/index.vue b/packages/frontend/src/pages/my-antennas/index.vue
index 9daf23f9b5..f1764b1aad 100644
--- a/packages/frontend/src/pages/my-antennas/index.vue
+++ b/packages/frontend/src/pages/my-antennas/index.vue
@@ -24,6 +24,7 @@ import { definePageMetadata } from '@/scripts/page-metadata';
const pagination = {
endpoint: 'antennas/list' as const,
+ noPaging: true,
limit: 10,
};
diff --git a/packages/frontend/src/pages/my-clips/index.vue b/packages/frontend/src/pages/my-clips/index.vue
index aad914d6bb..ccffa7b563 100644
--- a/packages/frontend/src/pages/my-clips/index.vue
+++ b/packages/frontend/src/pages/my-clips/index.vue
@@ -32,6 +32,7 @@ import { clipsCache } from '@/cache';
const pagination = {
endpoint: 'clips/list' as const,
+ noPaging: true,
limit: 10,
};
diff --git a/packages/frontend/src/pages/my-lists/index.vue b/packages/frontend/src/pages/my-lists/index.vue
index 11a2aca8c5..47437f3e57 100644
--- a/packages/frontend/src/pages/my-lists/index.vue
+++ b/packages/frontend/src/pages/my-lists/index.vue
@@ -30,6 +30,7 @@ const pagingComponent = $shallowRef
>();
const pagination = {
endpoint: 'users/lists/list' as const,
+ noPaging: true,
limit: 10,
};
diff --git a/packages/frontend/src/pages/settings/index.vue b/packages/frontend/src/pages/settings/index.vue
index ae36466eec..17af7417fd 100644
--- a/packages/frontend/src/pages/settings/index.vue
+++ b/packages/frontend/src/pages/settings/index.vue
@@ -130,11 +130,6 @@ const menuDef = computed(() => [{
}, {
title: i18n.ts.otherSettings,
items: [{
- icon: 'ti ti-package',
- text: i18n.ts.importAndExport,
- to: '/settings/import-export',
- active: currentPage?.route.name === 'import-export',
- }, {
icon: 'ti ti-badges',
text: i18n.ts.roles,
to: '/settings/roles',
@@ -165,6 +160,16 @@ const menuDef = computed(() => [{
to: '/settings/webhook',
active: currentPage?.route.name === 'webhook',
}, {
+ icon: 'ti ti-package',
+ text: i18n.ts.importAndExport,
+ to: '/settings/import-export',
+ active: currentPage?.route.name === 'import-export',
+ }, /*{
+ icon: 'ti ti-plane',
+ text: i18n.ts.accountMigration,
+ to: '/settings/migration',
+ active: currentPage?.route.name === 'migration',
+ },*/ {
icon: 'ti ti-dots',
text: i18n.ts.other,
to: '/settings/other',
@@ -231,7 +236,7 @@ onUnmounted(() => {
});
watch(router.currentRef, (to) => {
- if (to.route.name === "settings" && to.child?.route.name == null && !narrow) {
+ if (to.route.name === 'settings' && to.child?.route.name == null && !narrow) {
router.replace('/settings/profile');
}
});
diff --git a/packages/frontend/src/pages/settings/migration.vue b/packages/frontend/src/pages/settings/migration.vue
new file mode 100644
index 0000000000..2ef8af7481
--- /dev/null
+++ b/packages/frontend/src/pages/settings/migration.vue
@@ -0,0 +1,73 @@
+
+
+
+ {{ i18n.ts._accountMigration.moveTo }}
+
+
+ {{ i18n.ts._accountMigration.moveToLabel }}
+
+
+ {{ i18n.ts._accountMigration.moveAccountDescription }}
+
+
+ {{ i18n.ts._accountMigration.moveFrom }}
+
+
+ {{ i18n.ts._accountMigration.moveFromLabel }}
+
+
+ {{ i18n.ts._accountMigration.moveFromDescription }}
+
+
+
+
+
+
diff --git a/packages/frontend/src/pages/user/home.vue b/packages/frontend/src/pages/user/home.vue
index 1ce0bedbe3..8c3478d8f2 100644
--- a/packages/frontend/src/pages/user/home.vue
+++ b/packages/frontend/src/pages/user/home.vue
@@ -7,6 +7,7 @@
+
@@ -117,6 +118,7 @@ import calcAge from 's-age';
import * as misskey from 'misskey-js';
import MkNote from '@/components/MkNote.vue';
import MkFollowButton from '@/components/MkFollowButton.vue';
+import MkAccountMoved from '@/components/MkAccountMoved.vue';
import MkRemoteCaution from '@/components/MkRemoteCaution.vue';
import MkOmit from '@/components/MkOmit.vue';
import MkInfo from '@/components/MkInfo.vue';
diff --git a/packages/frontend/src/router.ts b/packages/frontend/src/router.ts
index c8077edd28..0769ec2614 100644
--- a/packages/frontend/src/router.ts
+++ b/packages/frontend/src/router.ts
@@ -161,6 +161,10 @@ export const routes = [{
path: '/preferences-backups',
name: 'preferences-backups',
component: page(() => import('./pages/settings/preferences-backups.vue')),
+ }, {
+ path: '/migration',
+ name: 'migration',
+ component: page(() => import('./pages/settings/migration.vue'))
}, {
path: '/custom-css',
name: 'general',
diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md
index 2511f14dcc..67d12000b8 100644
--- a/packages/misskey-js/etc/misskey-js.api.md
+++ b/packages/misskey-js/etc/misskey-js.api.md
@@ -1353,6 +1353,14 @@ export type Endpoints = {
req: TODO;
res: TODO;
};
+ 'i/move': {
+ req: TODO;
+ res: TODO;
+ };
+ 'i/known-as': {
+ req: TODO;
+ res: TODO;
+ };
'i/notifications': {
req: {
limit?: number;
@@ -2688,6 +2696,8 @@ type UserLite = {
onlineStatus: 'online' | 'active' | 'offline' | 'unknown';
avatarUrl: string;
avatarBlurhash: string;
+ alsoKnownAs: string[];
+ movedToUri: any;
emojis: {
name: string;
url: string;
@@ -2709,7 +2719,7 @@ type UserSorting = '+follower' | '-follower' | '+createdAt' | '-createdAt' | '+u
//
// src/api.types.ts:16:32 - (ae-forgotten-export) The symbol "TODO" needs to be exported by the entry point index.d.ts
// src/api.types.ts:18:25 - (ae-forgotten-export) The symbol "NoParams" needs to be exported by the entry point index.d.ts
-// src/api.types.ts:594:18 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts
+// src/api.types.ts:596:18 - (ae-forgotten-export) The symbol "ShowUserReq" needs to be exported by the entry point index.d.ts
// src/streaming.types.ts:33:4 - (ae-forgotten-export) The symbol "FIXME" needs to be exported by the entry point index.d.ts
// (No @packageDocumentation comment for this package)
diff --git a/packages/misskey-js/src/api.types.ts b/packages/misskey-js/src/api.types.ts
index d72e163cd4..aed9f5bf84 100644
--- a/packages/misskey-js/src/api.types.ts
+++ b/packages/misskey-js/src/api.types.ts
@@ -362,6 +362,8 @@ export type Endpoints = {
'i/get-word-muted-notes-count': { req: TODO; res: TODO; };
'i/import-following': { req: TODO; res: TODO; };
'i/import-user-lists': { req: TODO; res: TODO; };
+ 'i/move': { req: TODO; res: TODO; };
+ 'i/known-as': { req: TODO; res: TODO; };
'i/notifications': { req: {
limit?: number;
sinceId?: Notification['id'];
diff --git a/packages/misskey-js/src/entities.ts b/packages/misskey-js/src/entities.ts
index 7343fd74ad..0c90e44494 100644
--- a/packages/misskey-js/src/entities.ts
+++ b/packages/misskey-js/src/entities.ts
@@ -14,6 +14,8 @@ export type UserLite = {
onlineStatus: 'online' | 'active' | 'offline' | 'unknown';
avatarUrl: string;
avatarBlurhash: string;
+ alsoKnownAs: string[];
+ movedToUri: any;
emojis: {
name: string;
url: string;