diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ee51b3d2b..8533a4d393 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -43,11 +43,14 @@ - Enhance: ノートのサーバー情報のデザインを改善・パフォーマンス向上 (Based on https://github.com/taiyme/misskey/pull/198, https://github.com/taiyme/misskey/pull/211, https://github.com/taiyme/misskey/pull/283) - Enhance: ユーザー設定でURLプレビューを無効化できるように +- Enhance: ヒントとコツを追加 +- Enhance: ヒントとコツを再表示できるように - Enhance: AiScriptからtoastを表示する関数 `Mk:toast` を追加 - Enhance: シンタックスハイライトのエンジンをJavaScriptベースのものに変更 - フロントエンドの読み込みサイズを軽量化しました - ほとんどの言語のハイライトは問題なく行えますが、互換性の問題により一部の言語が正常にハイライトできなくなる可能性があります。詳しくは https://shiki.style/references/engine-js-compat をご覧ください。 - Fix: "時計"ウィジェット(Clock)において、Transparent設定が有効でも、その背景が透過されない問題を修正 +- Fix: 一定時間操作がなかったら動画プレイヤーのコントロールを隠すように ### Server - Enhance: チャットルームの最大メンバー数を30人から50人に調整 @@ -58,6 +61,7 @@ - Fix: ユーザ除外アンテナをインポートできない問題を修正 - Fix: アンテナのセンシティブなチャンネルのノートを含むかどうかの情報がエクスポートされない問題を修正 - Fix: 連合モードが「なし」の場合に、生成されるHTML内のactivity jsonへのリンクタグを省略するように +- Fix: コントロールパネルから招待コードを作成すると作成者の情報が記録されない問題を修正 ## 2025.5.0 diff --git a/locales/index.d.ts b/locales/index.d.ts index b5a4267098..b3f5ff4938 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -5461,6 +5461,18 @@ export interface Locale extends ILocale { * 中止 */ "abort": string; + /** + * ヒントとコツ + */ + "tip": string; + /** + * 全ての「ヒントとコツ」を再表示 + */ + "redisplayAllTips": string; + /** + * 全ての「ヒントとコツ」を非表示 + */ + "hideAllTips": string; "_chat": { /** * まだメッセージはありません @@ -11941,6 +11953,10 @@ export interface Locale extends ILocale { * アップロード可能なファイル種別 */ "allowedTypes": string; + /** + * ファイルはまだアップロードされていません。このダイアログで、アップロード前の確認・リネーム・圧縮・クロッピングなどが行えます。準備が出来たら、「アップロード」ボタンを押してアップロードを開始できます。 + */ + "tip": string; }; "_clientPerformanceIssueTip": { /** @@ -11972,6 +11988,18 @@ export interface Locale extends ILocale { */ "makeSureDisabledAddons_description": string; }; + "_clip": { + /** + * クリップは、ノートをまとめることができる機能です。 + */ + "tip": string; + }; + "_userLists": { + /** + * 任意のユーザーが含まれるリストを作成できます。作成したリストはタイムラインとして表示可能です。 + */ + "tip": string; + }; } declare const locales: { [lang: string]: Locale; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index fd794fffd6..44e6af61c7 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1360,6 +1360,9 @@ emojiUnmute: "絵文字ミュート解除" muteX: "{x}をミュート" unmuteX: "{x}のミュートを解除" abort: "中止" +tip: "ヒントとコツ" +redisplayAllTips: "全ての「ヒントとコツ」を再表示" +hideAllTips: "全ての「ヒントとコツ」を非表示" _chat: noMessagesYet: "まだメッセージはありません" @@ -3194,6 +3197,7 @@ _uploader: doneConfirm: "アップロードされていないファイルがありますが、完了しますか?" maxFileSizeIsX: "アップロード可能な最大ファイルサイズは{x}です。" allowedTypes: "アップロード可能なファイル種別" + tip: "ファイルはまだアップロードされていません。このダイアログで、アップロード前の確認・リネーム・圧縮・クロッピングなどが行えます。準備が出来たら、「アップロード」ボタンを押してアップロードを開始できます。" _clientPerformanceIssueTip: title: "バッテリー消費が多いと感じたら" @@ -3203,3 +3207,9 @@ _clientPerformanceIssueTip: makeSureDisabledCustomCss_description: "スタイルを上書きするとパフォーマンスに影響を及ぼすことがあります。カスタムCSSや、スタイルを上書きする拡張機能が有効になっていないか確認してください。" makeSureDisabledAddons: "拡張機能を無効にしてください" makeSureDisabledAddons_description: "一部の拡張機能はクライアントの動作に干渉しパフォーマンスに影響を及ぼすことがあります。ブラウザの拡張機能を無効にして改善するか確認してください。" + +_clip: + tip: "クリップは、ノートをまとめることができる機能です。" + +_userLists: + tip: "任意のユーザーが含まれるリストを作成できます。作成したリストはタイムラインとして表示可能です。" diff --git a/package.json b/package.json index 0f050b78fe..50c2542ffb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "misskey", - "version": "2025.5.1-alpha.4", + "version": "2025.5.1-beta.0", "codename": "nasubi", "repository": { "type": "git", diff --git a/packages/backend/src/server/api/endpoints/admin/invite/create.ts b/packages/backend/src/server/api/endpoints/admin/invite/create.ts index 5ecae3161a..e52b177e2b 100644 --- a/packages/backend/src/server/api/endpoints/admin/invite/create.ts +++ b/packages/backend/src/server/api/endpoints/admin/invite/create.ts @@ -68,6 +68,8 @@ export default class extends Endpoint { // eslint- for (let i = 0; i < ps.count; i++) { ticketsPromises.push(this.registrationTicketsRepository.insertOne({ id: this.idService.gen(), + createdBy: me, + createdById: me.id, expiresAt: ps.expiresAt ? new Date(ps.expiresAt) : null, code: generateInviteCode(), })); diff --git a/packages/backend/src/server/api/openapi/schemas.ts b/packages/backend/src/server/api/openapi/schemas.ts index c80dda8d96..1cdcbebd1a 100644 --- a/packages/backend/src/server/api/openapi/schemas.ts +++ b/packages/backend/src/server/api/openapi/schemas.ts @@ -38,14 +38,13 @@ export function convertSchemaToOpenApiSchema(schema: Schema, type: 'param' | 're if (type === 'res' && schema.ref && (!schema.selfRef || includeSelfRef)) { const $ref = `#/components/schemas/${schema.ref}`; - if (schema.nullable || schema.optional) { - res.allOf = [{ $ref }]; + if (schema.nullable) { + res.oneOf = [{ $ref }, { type: 'null' }]; } else { res.$ref = $ref; } - } - - if (schema.nullable) { + delete res.type; + } else if (schema.nullable) { if (Array.isArray(schema.type) && !schema.type.includes('null')) { res.type.push('null'); } else if (typeof schema.type === 'string') { diff --git a/packages/frontend/src/components/MkDrive.vue b/packages/frontend/src/components/MkDrive.vue index 5604f0226f..7e955f1529 100644 --- a/packages/frontend/src/components/MkDrive.vue +++ b/packages/frontend/src/components/MkDrive.vue @@ -60,9 +60,7 @@ SPDX-License-Identifier: AGPL-3.0-only @drop.prevent.stop="onDrop" @contextmenu.stop="onContextmenu" > -
-
-
+
{ if (file.folderId === (folder.value?.id ?? null)) { filesPaginator.prepend(file); diff --git a/packages/frontend/src/components/MkFolderPage.vue b/packages/frontend/src/components/MkFolderPage.vue index 6d9ee1af1d..edc954cf91 100644 --- a/packages/frontend/src/components/MkFolderPage.vue +++ b/packages/frontend/src/components/MkFolderPage.vue @@ -110,6 +110,8 @@ function onClosed() { right: 0; width: 100%; height: 100%; + box-sizing: border-box; + padding-bottom: env(safe-area-inset-bottom, 0px); margin: auto; background: var(--MI_THEME-bg); container-type: size; diff --git a/packages/frontend/src/components/MkMediaVideo.vue b/packages/frontend/src/components/MkMediaVideo.vue index 0e5f1e28b9..81a5ab27c7 100644 --- a/packages/frontend/src/components/MkMediaVideo.vue +++ b/packages/frontend/src/components/MkMediaVideo.vue @@ -13,8 +13,9 @@ SPDX-License-Identifier: AGPL-3.0-only controlsShowing && $style.active, (video.isSensitive && prefer.s.highlightSensitiveMedia) && $style.sensitive, ]" - @mouseover="onMouseOver" - @mouseleave="onMouseLeave" + @mouseover.passive="onMouseOver" + @mousemove.passive="onMouseMove" + @mouseleave.passive="onMouseLeave" @contextmenu.stop @keydown.stop > @@ -309,7 +310,7 @@ const controlsShowing = computed(() => { return false; }); const isFullscreen = ref(false); -let controlStateTimer: string | number; +let controlStateTimer: number | null = null; // MediaControl: Common State const oncePlayed = ref(false); @@ -342,9 +343,26 @@ function onMouseOver() { window.clearTimeout(controlStateTimer); } isHoverring.value = true; + + controlStateTimer = window.setTimeout(() => { + isHoverring.value = false; + }, 3000); +} + +function onMouseMove() { + if (controlStateTimer) { + window.clearTimeout(controlStateTimer); + } + isHoverring.value = true; + controlStateTimer = window.setTimeout(() => { + isHoverring.value = false; + }, 3000); } function onMouseLeave() { + if (controlStateTimer) { + window.clearTimeout(controlStateTimer); + } controlStateTimer = window.setTimeout(() => { isHoverring.value = false; }, 100); @@ -509,6 +527,10 @@ onDeactivated(() => { window.cancelAnimationFrame(mediaTickFrameId); mediaTickFrameId = null; } + if (controlStateTimer) { + window.clearTimeout(controlStateTimer); + controlStateTimer = null; + } }); diff --git a/packages/frontend/src/components/MkUploaderDialog.vue b/packages/frontend/src/components/MkUploaderDialog.vue index fb27dcbf58..4c928c7f6a 100644 --- a/packages/frontend/src/components/MkUploaderDialog.vue +++ b/packages/frontend/src/components/MkUploaderDialog.vue @@ -19,6 +19,10 @@ SPDX-License-Identifier: AGPL-3.0-only
+ + {{ i18n.ts._uploader.tip }} + +
{ + const { result, canceled } = await os.inputText({ + type: 'text', + title: i18n.ts.rename, + placeholder: item.name, + default: item.name, + }); + if (canceled) return; + if (result.trim() === '') return; + + item.name = result; + }, + }); + if (CROPPING_SUPPORTED_TYPES.includes(item.file.type) && !item.waiting && !item.uploading && !item.uploaded) { menu.push({ icon: 'ti ti-crop', diff --git a/packages/frontend/src/components/global/MkResult.vue b/packages/frontend/src/components/global/MkResult.vue index fdfc7091e8..fc8206f814 100644 --- a/packages/frontend/src/components/global/MkResult.vue +++ b/packages/frontend/src/components/global/MkResult.vue @@ -41,6 +41,7 @@ const props = defineProps<{ .img { vertical-align: bottom; height: 128px; + aspect-ratio: 1; margin-bottom: 16px; border-radius: 16px; } diff --git a/packages/frontend/src/components/global/MkTip.vue b/packages/frontend/src/components/global/MkTip.vue new file mode 100644 index 0000000000..384511a0ed --- /dev/null +++ b/packages/frontend/src/components/global/MkTip.vue @@ -0,0 +1,48 @@ + + + + + + + diff --git a/packages/frontend/src/components/index.ts b/packages/frontend/src/components/index.ts index 9981772ae8..19766e8575 100644 --- a/packages/frontend/src/components/index.ts +++ b/packages/frontend/src/components/index.ts @@ -26,6 +26,7 @@ import MkStickyContainer from './global/MkStickyContainer.vue'; import MkLazy from './global/MkLazy.vue'; import MkResult from './global/MkResult.vue'; import MkSystemIcon from './global/MkSystemIcon.vue'; +import MkTip from './global/MkTip.vue'; import PageWithHeader from './global/PageWithHeader.vue'; import PageWithAnimBg from './global/PageWithAnimBg.vue'; import SearchMarker from './global/SearchMarker.vue'; @@ -65,6 +66,7 @@ export const components = { MkLazy: MkLazy, MkResult: MkResult, MkSystemIcon: MkSystemIcon, + MkTip: MkTip, PageWithHeader: PageWithHeader, PageWithAnimBg: PageWithAnimBg, SearchMarker: SearchMarker, @@ -98,6 +100,7 @@ declare module '@vue/runtime-core' { MkLazy: typeof MkLazy; MkResult: typeof MkResult; MkSystemIcon: typeof MkSystemIcon; + MkTip: typeof MkTip; PageWithHeader: typeof PageWithHeader; PageWithAnimBg: typeof PageWithAnimBg; SearchMarker: typeof SearchMarker; diff --git a/packages/frontend/src/pages/admin/abuses.vue b/packages/frontend/src/pages/admin/abuses.vue index 14e8e600b0..4dbb573ceb 100644 --- a/packages/frontend/src/pages/admin/abuses.vue +++ b/packages/frontend/src/pages/admin/abuses.vue @@ -11,9 +11,9 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.notificationSetting }}
- + {{ i18n.ts._abuseUserReport.resolveTutorial }} - +
@@ -65,7 +65,6 @@ import XAbuseReport from '@/components/MkAbuseReport.vue'; import { i18n } from '@/i18n.js'; import { definePage } from '@/page.js'; import MkButton from '@/components/MkButton.vue'; -import MkInfo from '@/components/MkInfo.vue'; import { store } from '@/store.js'; const reports = useTemplateRef('reports'); @@ -90,10 +89,6 @@ function resolved(reportId) { reports.value?.paginator.removeItem(reportId); } -function closeTutorial() { - store.set('abusesTutorial', false); -} - const headerActions = computed(() => []); const headerTabs = computed(() => []); diff --git a/packages/frontend/src/pages/my-clips/index.vue b/packages/frontend/src/pages/my-clips/index.vue index 4dafd87b80..c386ed7239 100644 --- a/packages/frontend/src/pages/my-clips/index.vue +++ b/packages/frontend/src/pages/my-clips/index.vue @@ -5,7 +5,10 @@ SPDX-License-Identifier: AGPL-3.0-only