{
// glob('src/{components,pages,ui,widgets}/**/*.vue')
(async () => {
- const globs = await Promise.all([
- glob('src/components/global/Mk*.vue'),
- glob('src/components/global/RouterView.vue'),
- glob('src/components/MkAbuseReportWindow.vue'),
- glob('src/components/MkAccountMoved.vue'),
- glob('src/components/MkAchievements.vue'),
- glob('src/components/MkAnalogClock.vue'),
- glob('src/components/MkAnimBg.vue'),
- glob('src/components/MkAnnouncementDialog.vue'),
- glob('src/components/MkAntennaEditor.vue'),
- glob('src/components/MkAntennaEditorDialog.vue'),
- glob('src/components/MkAsUi.vue'),
- glob('src/components/MkAutocomplete.vue'),
- glob('src/components/MkAvatars.vue'),
- glob('src/components/Mk[B-E]*.vue'),
- glob('src/components/MkFlashPreview.vue'),
- glob('src/components/MkGalleryPostPreview.vue'),
- glob('src/components/MkSignupServerRules.vue'),
- glob('src/components/MkUserSetupDialog.vue'),
- glob('src/components/MkUserSetupDialog.*.vue'),
- glob('src/components/MkImgPreviewDialog.vue'),
- glob('src/components/MkInstanceCardMini.vue'),
- glob('src/components/MkInviteCode.vue'),
- glob('src/components/MkTagItem.vue'),
- glob('src/components/MkRoleSelectDialog.vue'),
- glob('src/components/grid/MkGrid.vue'),
- glob('src/pages/admin/custom-emojis-manager2.vue'),
- glob('src/pages/admin/overview.ap-requests.vue'),
- glob('src/pages/user/home.vue'),
- glob('src/pages/search.vue'),
- ]);
- const components = globs.flat();
+ const components = [
+ globSync('src/components/global/Mk*.vue'),
+ globSync('src/components/global/RouterView.vue'),
+ globSync('src/components/MkAbuseReportWindow.vue'),
+ globSync('src/components/MkAccountMoved.vue'),
+ globSync('src/components/MkAchievements.vue'),
+ globSync('src/components/MkAnalogClock.vue'),
+ globSync('src/components/MkAnimBg.vue'),
+ globSync('src/components/MkAnnouncementDialog.vue'),
+ globSync('src/components/MkAntennaEditor.vue'),
+ globSync('src/components/MkAntennaEditorDialog.vue'),
+ globSync('src/components/MkAsUi.vue'),
+ globSync('src/components/MkAutocomplete.vue'),
+ globSync('src/components/MkAvatars.vue'),
+ globSync('src/components/Mk[B-E]*.vue'),
+ globSync('src/components/MkFlashPreview.vue'),
+ globSync('src/components/MkGalleryPostPreview.vue'),
+ globSync('src/components/MkSignupServerRules.vue'),
+ globSync('src/components/MkUserSetupDialog.vue'),
+ globSync('src/components/MkUserSetupDialog.*.vue'),
+ globSync('src/components/MkImgPreviewDialog.vue'),
+ globSync('src/components/MkInstanceCardMini.vue'),
+ globSync('src/components/MkInviteCode.vue'),
+ globSync('src/components/MkTagItem.vue'),
+ globSync('src/components/MkRoleSelectDialog.vue'),
+ globSync('src/components/grid/MkGrid.vue'),
+ globSync('src/pages/admin/custom-emojis-manager2.vue'),
+ globSync('src/pages/admin/overview.ap-requests.vue'),
+ globSync('src/pages/user/home.vue'),
+ globSync('src/pages/search.vue'),
+ ].flat();
await Promise.all(components.map(async (component) => {
const stories = component.replace(/\.vue$/, '.stories.ts');
await writeFile(stories, await toStories(component));
diff --git a/packages/frontend/lib/vite-plugin-create-search-index.ts b/packages/frontend/lib/vite-plugin-create-search-index.ts
index f17b43b0e3..cfbba0823c 100644
--- a/packages/frontend/lib/vite-plugin-create-search-index.ts
+++ b/packages/frontend/lib/vite-plugin-create-search-index.ts
@@ -16,7 +16,6 @@ import {
type PluginOption
} from 'vite';
import fs from 'node:fs';
-import { glob } from 'glob';
import JSON5 from 'json5';
import MagicString, { SourceMap } from 'magic-string';
import path from 'node:path'
@@ -724,7 +723,7 @@ export function pluginCreateSearchIndexVirtualModule(options: Options, asigner:
async load(id) {
if (id == '\0' + allSearchIndexFile) {
- const files = await Promise.all(options.targetFilePaths.map(async (filePathPattern) => await glob(filePathPattern))).then(paths => paths.flat());
+ const files = options.targetFilePaths.map((filePathPattern) => fs.globSync(filePathPattern)).flat();
let generatedFile = '';
let arrayElements = '';
for (let file of files) {
diff --git a/packages/frontend/package.json b/packages/frontend/package.json
index c3baf5ea74..361ab2f923 100644
--- a/packages/frontend/package.json
+++ b/packages/frontend/package.json
@@ -19,21 +19,19 @@
"@analytics/google-analytics": "1.1.0",
"@discordapp/twemoji": "16.0.1",
"@github/webauthn-json": "2.1.1",
- "@mcaptcha/vanilla-glue": "0.1.0-alpha-3",
+ "@mcaptcha/vanilla-glue": "0.1.0-rc2",
"i18n": "workspace:*",
"@misskey-dev/browser-image-resizer": "2024.1.0",
"@rollup/plugin-json": "6.1.0",
"@rollup/plugin-replace": "6.0.3",
"@rollup/pluginutils": "5.3.0",
- "@sentry/vue": "10.26.0",
+ "@sentry/vue": "10.29.0",
"@syuilo/aiscript": "1.2.0",
"@syuilo/aiscript-0-19-0": "npm:@syuilo/aiscript@^0.19.0",
"@twemoji/parser": "16.0.0",
"@vitejs/plugin-vue": "6.0.2",
- "@vue/compiler-sfc": "3.5.24",
- "aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.1.15",
+ "aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.1.16",
"analytics": "0.8.19",
- "astring": "1.9.0",
"broadcast-channel": "7.2.0",
"buraha": "0.0.1",
"canvas-confetti": "1.9.4",
@@ -46,10 +44,9 @@
"compare-versions": "6.1.1",
"cropperjs": "2.1.0",
"date-fns": "4.1.0",
- "estree-walker": "3.0.3",
"eventemitter3": "5.0.1",
- "execa": "9.6.0",
- "exifreader": "4.32.0",
+ "execa": "9.6.1",
+ "exifreader": "4.33.1",
"frontend-shared": "workspace:*",
"icons-subsetter": "workspace:*",
"idb-keyval": "6.2.2",
@@ -57,9 +54,8 @@
"ios-haptics": "0.1.4",
"is-file-animated": "1.0.2",
"json5": "2.2.3",
- "magic-string": "0.30.21",
"matter-js": "0.20.0",
- "mediabunny": "1.25.1",
+ "mediabunny": "1.25.7",
"mfm-js": "0.25.0",
"misskey-bubble-game": "workspace:*",
"misskey-js": "workspace:*",
@@ -70,19 +66,15 @@
"qr-scanner": "1.4.2",
"rollup": "4.53.3",
"sanitize-html": "2.17.0",
- "sass": "1.94.2",
- "shiki": "3.15.0",
- "strict-event-emitter-types": "2.0.0",
+ "sass": "1.95.0",
+ "shiki": "3.19.0",
"textarea-caret": "3.1.0",
"three": "0.181.2",
"throttle-debounce": "5.0.2",
"tinycolor2": "1.6.0",
- "tsc-alias": "1.8.16",
- "tsconfig-paths": "4.2.0",
- "typescript": "5.9.3",
"v-code-diff": "1.13.1",
- "vite": "7.2.4",
- "vue": "3.5.24",
+ "vite": "7.2.7",
+ "vue": "3.5.25",
"vuedraggable": "next",
"wanakana": "5.3.1"
},
@@ -90,7 +82,7 @@
"@misskey-dev/summaly": "5.2.5",
"@storybook/addon-essentials": "8.6.14",
"@storybook/addon-interactions": "8.6.14",
- "@storybook/addon-links": "10.0.8",
+ "@storybook/addon-links": "10.1.4",
"@storybook/addon-mdx-gfm": "8.6.14",
"@storybook/addon-storysource": "8.6.14",
"@storybook/blocks": "8.6.14",
@@ -98,58 +90,59 @@
"@storybook/core-events": "8.6.14",
"@storybook/manager-api": "8.6.14",
"@storybook/preview-api": "8.6.14",
- "@storybook/react": "10.0.8",
- "@storybook/react-vite": "10.0.8",
+ "@storybook/react": "10.1.4",
+ "@storybook/react-vite": "10.1.4",
"@storybook/test": "8.6.14",
"@storybook/theming": "8.6.14",
"@storybook/types": "8.6.14",
- "@storybook/vue3": "10.0.8",
- "@storybook/vue3-vite": "10.0.8",
+ "@storybook/vue3": "10.1.4",
+ "@storybook/vue3-vite": "10.1.4",
"@tabler/icons-webfont": "3.35.0",
"@testing-library/vue": "8.1.0",
"@types/canvas-confetti": "1.9.0",
"@types/estree": "1.0.8",
"@types/matter-js": "0.20.2",
"@types/micromatch": "4.0.10",
- "@types/node": "24.10.1",
+ "@types/node": "24.10.2",
"@types/punycode.js": "npm:@types/punycode@2.1.4",
"@types/sanitize-html": "2.16.0",
"@types/seedrandom": "3.0.8",
"@types/throttle-debounce": "5.0.2",
"@types/tinycolor2": "1.4.6",
- "@types/ws": "8.18.1",
- "@typescript-eslint/eslint-plugin": "8.47.0",
- "@typescript-eslint/parser": "8.47.0",
- "@vitest/coverage-v8": "4.0.13",
- "@vue/compiler-core": "3.5.24",
- "@vue/runtime-core": "3.5.24",
+ "@typescript-eslint/eslint-plugin": "8.49.0",
+ "@typescript-eslint/parser": "8.49.0",
+ "@vitest/coverage-v8": "4.0.15",
+ "@vue/compiler-core": "3.5.25",
"acorn": "8.15.0",
+ "astring": "1.9.0",
"cross-env": "10.1.0",
- "cypress": "15.7.0",
+ "cypress": "15.7.1",
"eslint-plugin-import": "2.32.0",
- "eslint-plugin-vue": "10.6.0",
- "fast-glob": "3.3.3",
- "happy-dom": "20.0.10",
+ "eslint-plugin-vue": "10.6.2",
+ "estree-walker": "3.0.3",
+ "happy-dom": "20.0.11",
"intersection-observer": "0.12.2",
+ "magic-string": "0.30.21",
"micromatch": "4.0.8",
"minimatch": "10.1.1",
- "msw": "2.12.2",
+ "msw": "2.12.4",
"msw-storybook-addon": "2.0.6",
"nodemon": "3.1.11",
- "prettier": "3.6.2",
- "react": "19.2.0",
- "react-dom": "19.2.0",
+ "prettier": "3.7.4",
+ "react": "19.2.1",
+ "react-dom": "19.2.1",
"seedrandom": "3.0.5",
"start-server-and-test": "2.1.3",
- "storybook": "10.0.8",
+ "storybook": "10.1.4",
"storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme",
- "tsx": "4.20.6",
- "vite-plugin-glsl": "1.5.4",
+ "tsx": "4.21.0",
+ "typescript": "5.9.3",
+ "vite-plugin-glsl": "1.5.5",
"vite-plugin-turbosnap": "1.0.3",
- "vitest": "4.0.13",
+ "vitest": "4.0.15",
"vitest-fetch-mock": "0.4.5",
- "vue-component-type-helpers": "3.1.5",
+ "vue-component-type-helpers": "3.1.7",
"vue-eslint-parser": "10.2.0",
- "vue-tsc": "3.1.5"
+ "vue-tsc": "3.1.8"
}
}
diff --git a/packages/frontend/public/loader/boot.js b/packages/frontend/public/loader/boot.js
index ab4b158287..8aafb282aa 100644
--- a/packages/frontend/public/loader/boot.js
+++ b/packages/frontend/public/loader/boot.js
@@ -42,6 +42,8 @@
console.error('invalid lang value detected!!!', typeof lang, lang);
lang = 'en-US';
}
+
+ localStorage.setItem('lang', lang);
//#endregion
//#region Script
diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue
index b84532b40b..d8c949d8eb 100644
--- a/packages/frontend/src/components/MkDrive.vue
+++ b/packages/frontend/src/components/MkDrive.vue
@@ -83,34 +83,58 @@ SPDX-License-Identifier: AGPL-3.0-only
{{ i18n.ts.loadMore }}
-
-
-
- {{ item.date.getFullYear() }}/{{ item.date.getMonth() + 1 }}
-
-
+
+
+
+
+ {{ item.date.getFullYear() }}/{{ item.date.getMonth() + 1 }}
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
{{ i18n.ts.loadMore }}
@@ -217,6 +241,7 @@ const foldersPaginator = markRaw(new Paginator('drive/folders', {
}));
const filesTimeline = makeDateGroupedTimelineComputedRef(filesPaginator.items, 'month');
+const shouldBeGroupedByDate = computed(() => ['+createdAt', '-createdAt'].includes(sortModeSelect.value));
watch(folder, () => emit('cd', folder.value));
watch(sortModeSelect, () => {
diff --git a/packages/frontend/src/components/MkImgPreviewDialog.vue b/packages/frontend/src/components/MkImgPreviewDialog.vue
index 3e6e4e0ec9..e17a1651cf 100644
--- a/packages/frontend/src/components/MkImgPreviewDialog.vue
+++ b/packages/frontend/src/components/MkImgPreviewDialog.vue
@@ -19,7 +19,7 @@ SPDX-License-Identifier: AGPL-3.0-only