summaryrefslogtreecommitdiff
path: root/packages/frontend/src
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2025-05-04 15:50:05 +0900
committerGitHub <noreply@github.com>2025-05-04 15:50:05 +0900
commite75d7497843bab2ee2fd0493ad14b8dff33a358f (patch)
tree81c9fd188d4d69fe81c2cdf2c8d662311a004684 /packages/frontend/src
parentfix(deps): update dependency vite to v6.3.4 [security] (#15918) (diff)
downloadmisskey-e75d7497843bab2ee2fd0493ad14b8dff33a358f.tar.gz
misskey-e75d7497843bab2ee2fd0493ad14b8dff33a358f.tar.bz2
misskey-e75d7497843bab2ee2fd0493ad14b8dff33a358f.zip
fix(frontend): ダイアログのお知らせが画面からはみ出ることがある問題を修正 (#15878)
* fix(frontend): ダイアログのお知らせが画面からはみ出ることがある問題を修正 * Update Changelog * :art: * :art: * enhance: スクロールしないと閉じられないように * Update CHANGELOG.md
Diffstat (limited to 'packages/frontend/src')
-rw-r--r--packages/frontend/src/components/MkAnnouncementDialog.vue62
1 files changed, 55 insertions, 7 deletions
diff --git a/packages/frontend/src/components/MkAnnouncementDialog.vue b/packages/frontend/src/components/MkAnnouncementDialog.vue
index 6e5b29654b..81c92bfb5c 100644
--- a/packages/frontend/src/components/MkAnnouncementDialog.vue
+++ b/packages/frontend/src/components/MkAnnouncementDialog.vue
@@ -4,7 +4,7 @@ SPDX-License-Identifier: AGPL-3.0-only
-->
<template>
-<MkModal ref="modal" :zPriority="'middle'" @closed="$emit('closed')" @click="onBgClick">
+<MkModal ref="modal" :zPriority="'middle'" :preferType="'dialog'" @closed="$emit('closed')" @click="onBgClick">
<div ref="rootEl" :class="$style.root">
<div :class="$style.header">
<span :class="$style.icon">
@@ -16,13 +16,21 @@ SPDX-License-Identifier: AGPL-3.0-only
<span :class="$style.title">{{ announcement.title }}</span>
</div>
<div :class="$style.text"><Mfm :text="announcement.text"/></div>
- <MkButton primary full @click="ok">{{ i18n.ts.ok }}</MkButton>
+ <div ref="bottomEl"></div>
+ <div :class="$style.footer">
+ <MkButton
+ primary
+ full
+ :disabled="!hasReachedBottom"
+ @click="ok"
+ >{{ hasReachedBottom ? i18n.ts.close : i18n.ts.scrollToClose }}</MkButton>
+ </div>
</div>
</MkModal>
</template>
<script lang="ts" setup>
-import { onMounted, useTemplateRef } from 'vue';
+import { onMounted, ref, useTemplateRef } from 'vue';
import * as Misskey from 'misskey-js';
import * as os from '@/os.js';
import { misskeyApi } from '@/utility/misskey-api.js';
@@ -32,12 +40,12 @@ import { i18n } from '@/i18n.js';
import { $i } from '@/i.js';
import { updateCurrentAccountPartial } from '@/accounts.js';
-const props = withDefaults(defineProps<{
+const props = defineProps<{
announcement: Misskey.entities.Announcement;
-}>(), {
-});
+}>();
const rootEl = useTemplateRef('rootEl');
+const bottomEl = useTemplateRef('bottomEl');
const modal = useTemplateRef('modal');
async function ok() {
@@ -72,7 +80,34 @@ function onBgClick() {
});
}
+const hasReachedBottom = ref(false);
+
onMounted(() => {
+ if (bottomEl.value && rootEl.value) {
+ const bottomElRect = bottomEl.value.getBoundingClientRect();
+ const rootElRect = rootEl.value.getBoundingClientRect();
+ if (
+ bottomElRect.top >= rootElRect.top &&
+ bottomElRect.top <= (rootElRect.bottom - 66) // 66 ≒ 75 * 0.9 (modalのアニメーション分)
+ ) {
+ hasReachedBottom.value = true;
+ return;
+ }
+
+ const observer = new IntersectionObserver(entries => {
+ for (const entry of entries) {
+ if (entry.isIntersecting) {
+ hasReachedBottom.value = true;
+ observer.disconnect();
+ }
+ }
+ }, {
+ root: rootEl.value,
+ rootMargin: '0px 0px -75px 0px',
+ });
+
+ observer.observe(bottomEl.value);
+ }
});
</script>
@@ -80,9 +115,12 @@ onMounted(() => {
.root {
margin: auto;
position: relative;
- padding: 32px;
+ padding: 32px 32px 0;
min-width: 320px;
max-width: 480px;
+ max-height: 100%;
+ overflow-y: auto;
+ overflow-x: hidden;
box-sizing: border-box;
background: var(--MI_THEME-panel);
border-radius: var(--MI-radius);
@@ -103,4 +141,14 @@ onMounted(() => {
.text {
margin: 1em 0;
}
+
+.footer {
+ position: sticky;
+ bottom: 0;
+ left: -32px;
+ backdrop-filter: var(--MI-blur, blur(15px));
+ background: color(from var(--MI_THEME-bg) srgb r g b / 0.5);
+ margin: 0 -32px;
+ padding: 24px 32px;
+}
</style>