diff options
| author | かっこかり <67428053+kakkokari-gtyih@users.noreply.github.com> | 2025-05-04 15:50:05 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-05-04 15:50:05 +0900 |
| commit | e75d7497843bab2ee2fd0493ad14b8dff33a358f (patch) | |
| tree | 81c9fd188d4d69fe81c2cdf2c8d662311a004684 /packages/frontend/src/components/MkAnnouncementDialog.vue | |
| parent | fix(deps): update dependency vite to v6.3.4 [security] (#15918) (diff) | |
| download | misskey-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/components/MkAnnouncementDialog.vue')
| -rw-r--r-- | packages/frontend/src/components/MkAnnouncementDialog.vue | 62 |
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> |