From 7dc9fe4e24a3974bd61b05002af4864aa1ad8564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=8B=E3=81=A3=E3=81=93=E3=81=8B=E3=82=8A?= <67428053+kakkokari-gtyih@users.noreply.github.com> Date: Fri, 22 Sep 2023 16:03:10 +0900 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20=E3=82=BB=E3=83=B3=E3=82=B7?= =?UTF-8?q?=E3=83=86=E3=82=A3=E3=83=96=E3=81=AA=E3=83=A1=E3=83=87=E3=82=A3?= =?UTF-8?q?=E3=82=A2=E3=82=92=E7=9B=AE=E7=AB=8B=E3=81=9F=E3=81=9B=E3=82=8B?= =?UTF-8?q?=E8=A8=AD=E5=AE=9A=E3=82=92=E8=BF=BD=E5=8A=A0=20(#11851)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * (add) highlight sensitive image * Update Changelog * (change) è¨å®šã®ä½ç½® * (add) apply mediaHighlight to video * (change) image -> media * Update CHANGELOG * ã‚„ã£ã±ã‚‚ã†ã¡ã‚‡ã£ã¨å¤ªã„æ–¹ãŒã„ã„ * (fix) style * Update ja-JP.yml --------- Co-authored-by: syuilo <Syuilotan@yahoo.co.jp> --- CHANGELOG.md | 1 + locales/index.d.ts | 1 + locales/ja-JP.yml | 1 + .../frontend/src/components/MkMediaImage.vue | 20 +++++++++++++++++-- .../frontend/src/components/MkMediaVideo.vue | 20 +++++++++++++++++-- .../frontend/src/pages/settings/general.vue | 3 +++ packages/frontend/src/store.ts | 4 ++++ 7 files changed, 46 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92bb2c8161..68db7f41c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ - Feat: æ–°ã—ã„å®Ÿç¸¾ã‚’è¿½åŠ - Enhance: ノート詳細ページã§ãƒªãƒŽãƒ¼ãƒˆä¸€è¦§ã€ãƒªã‚¢ã‚¯ã‚·ãƒ§ãƒ³ä¸€è¦§ã‚¿ãƒ–ã‚’è¿½åŠ - ノートã®ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰ã¯å½“è©²é …ç›®ã¯æ¶ˆãˆã¾ã—㟠+- Enhance: センシティブãªãƒ¡ãƒ‡ã‚£ã‚¢ã‚’目立ãŸã›ã‚‹è¨å®šã‚’è¿½åŠ - Enhance: プãƒãƒ•ã‚£ãƒ¼ãƒ«ã«ãã®äººãŒä½œã£ãŸPlayã®ä¸€è¦§å‡ºã›ã‚‹ã‚ˆã†ã« - Enhance: メニューã®ã‚¹ã‚¤ãƒƒãƒã®å‹•ä½œã‚’改善 - Enhance: 絵文å—ピッカーã®æ¤œç´¢ã®è¡¨ç¤ºä»¶æ•°ã‚’100件ã«å¢—åŠ diff --git a/locales/index.d.ts b/locales/index.d.ts index f7bc350e2b..3009c99185 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -713,6 +713,7 @@ export interface Locale { "alwaysMarkSensitive": string; "loadRawImages": string; "disableShowingAnimatedImages": string; + "highlightSensitiveMedia": string; "verificationEmailSent": string; "notSet": string; "emailVerified": string; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 5436cf0494..b30fd5333d 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -710,6 +710,7 @@ lockedAccountInfo: "フォãƒãƒ¼ã‚’承èªåˆ¶ã«ã—ã¦ã‚‚ã€ãƒŽãƒ¼ãƒˆã®å…¬é–‹ç¯„ alwaysMarkSensitive: "デフォルトã§ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’センシティブè¨å®šã«ã™ã‚‹" loadRawImages: "添付画åƒã®ã‚µãƒ ãƒã‚¤ãƒ«ã‚’オリジナル画質ã«ã™ã‚‹" disableShowingAnimatedImages: "アニメーション画åƒã‚’å†ç”Ÿã—ãªã„" +highlightSensitiveMedia: "メディアãŒã‚»ãƒ³ã‚·ãƒ†ã‚£ãƒ–ã§ã‚ã‚‹ã“ã¨ã‚’分ã‹ã‚Šã‚„ã™ã表示" verificationEmailSent: "確èªã®ãƒ¡ãƒ¼ãƒ«ã‚’é€ä¿¡ã—ã¾ã—ãŸã€‚メールã«è¨˜è¼‰ã•ã‚ŒãŸãƒªãƒ³ã‚¯ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã€è¨å®šã‚’完了ã—ã¦ãã ã•ã„。" notSet: "未è¨å®š" emailVerified: "メールアドレスãŒç¢ºèªã•ã‚Œã¾ã—ãŸ" diff --git a/packages/frontend/src/components/MkMediaImage.vue b/packages/frontend/src/components/MkMediaImage.vue index c2d442f59f..cc1c28a9e1 100644 --- a/packages/frontend/src/components/MkMediaImage.vue +++ b/packages/frontend/src/components/MkMediaImage.vue @@ -4,7 +4,7 @@ SPDX-License-Identifier: AGPL-3.0-only --> <template> -<div :class="hide ? $style.hidden : $style.visible" :style="darkMode ? '--c: rgb(255 255 255 / 2%);' : '--c: rgb(0 0 0 / 2%);'" @click="onclick"> +<div :class="[hide ? $style.hidden : $style.visible, (image.isSensitive && defaultStore.state.highlightSensitiveMedia) && $style.sensitive]" :style="darkMode ? '--c: rgb(255 255 255 / 2%);' : '--c: rgb(0 0 0 / 2%);'" @click="onclick"> <component :is="disableImageLink ? 'div' : 'a'" v-bind="disableImageLink ? { @@ -26,7 +26,7 @@ SPDX-License-Identifier: AGPL-3.0-only :title="image.comment || image.name" :width="image.properties.width" :height="image.properties.height" - :style="hide ? 'filter: brightness(0.5);' : null" + :style="hide ? 'filter: brightness(0.7);' : null" /> </component> <template v-if="hide"> @@ -124,6 +124,22 @@ function showMenu(ev: MouseEvent) { position: relative; } +.sensitive { + position: relative; + + &::after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + border-radius: inherit; + box-shadow: inset 0 0 0 4px var(--warn); + } +} + .hiddenText { position: absolute; left: 0; diff --git a/packages/frontend/src/components/MkMediaVideo.vue b/packages/frontend/src/components/MkMediaVideo.vue index c5afe09745..751b5f7570 100644 --- a/packages/frontend/src/components/MkMediaVideo.vue +++ b/packages/frontend/src/components/MkMediaVideo.vue @@ -4,7 +4,7 @@ SPDX-License-Identifier: AGPL-3.0-only --> <template> -<div v-if="hide" :class="$style.hidden" @click="hide = false"> +<div v-if="hide" :class="[$style.hidden, (video.isSensitive && defaultStore.state.highlightSensitiveMedia) && $style.sensitiveContainer]" @click="hide = false"> <!-- ã€æ³¨æ„】dataSaverMode ãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã‚‹éš›ã«ã¯ã€hide ㌠false ã«ãªã‚‹ã¾ã§ã‚µãƒ ãƒã‚¤ãƒ«ã‚„動画をèªã¿è¾¼ã¾ãªã„よã†ã«ã™ã‚‹ã“㨠--> <div :class="$style.sensitive"> <b v-if="video.isSensitive" style="display: block;"><i class="ti ti-alert-triangle"></i> {{ i18n.ts.sensitive }}{{ defaultStore.state.enableDataSaverMode ? ` (${i18n.ts.video}${video.size ? ' ' + bytes(video.size) : ''})` : '' }}</b> @@ -12,7 +12,7 @@ SPDX-License-Identifier: AGPL-3.0-only <span>{{ i18n.ts.clickToShow }}</span> </div> </div> -<div v-else :class="$style.visible"> +<div v-else :class="[$style.visible, (video.isSensitive && defaultStore.state.highlightSensitiveMedia) && $style.sensitiveContainer]"> <video :class="$style.video" :poster="video.thumbnailUrl" @@ -49,6 +49,22 @@ const hide = ref((defaultStore.state.nsfw === 'force' || defaultStore.state.enab position: relative; } +.sensitiveContainer { + position: relative; + + &::after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + pointer-events: none; + border-radius: inherit; + box-shadow: inset 0 0 0 4px var(--warn); + } +} + .hide { display: block; position: absolute; diff --git a/packages/frontend/src/pages/settings/general.vue b/packages/frontend/src/pages/settings/general.vue index 6c59830614..a536bd1baa 100644 --- a/packages/frontend/src/pages/settings/general.vue +++ b/packages/frontend/src/pages/settings/general.vue @@ -115,6 +115,7 @@ SPDX-License-Identifier: AGPL-3.0-only <MkSwitch v-model="useBlurEffect">{{ i18n.ts.useBlurEffect }}</MkSwitch> <MkSwitch v-model="useBlurEffectForModal">{{ i18n.ts.useBlurEffectForModal }}</MkSwitch> <MkSwitch v-model="disableShowingAnimatedImages">{{ i18n.ts.disableShowingAnimatedImages }}</MkSwitch> + <MkSwitch v-model="highlightSensitiveMedia">{{ i18n.ts.highlightSensitiveMedia }}</MkSwitch> <MkSwitch v-model="squareAvatars">{{ i18n.ts.squareAvatars }}</MkSwitch> <MkSwitch v-model="useSystemFont">{{ i18n.ts.useSystemFont }}</MkSwitch> <MkSwitch v-model="disableDrawer">{{ i18n.ts.disableDrawer }}</MkSwitch> @@ -234,6 +235,7 @@ const disableDrawer = computed(defaultStore.makeGetterSetter('disableDrawer')); const disableShowingAnimatedImages = computed(defaultStore.makeGetterSetter('disableShowingAnimatedImages')); const forceShowAds = computed(defaultStore.makeGetterSetter('forceShowAds')); const loadRawImages = computed(defaultStore.makeGetterSetter('loadRawImages')); +const highlightSensitiveMedia = computed(defaultStore.makeGetterSetter('highlightSensitiveMedia')); const enableDataSaverMode = computed(defaultStore.makeGetterSetter('enableDataSaverMode')); const imageNewTab = computed(defaultStore.makeGetterSetter('imageNewTab')); const nsfw = computed(defaultStore.makeGetterSetter('nsfw')); @@ -283,6 +285,7 @@ watch([ overridedDeviceKind, mediaListWithOneImageAppearance, reactionsDisplaySize, + highlightSensitiveMedia, keepScreenOn, ], async () => { await reloadAsk(); diff --git a/packages/frontend/src/store.ts b/packages/frontend/src/store.ts index 8a43ba892d..16483f0cf7 100644 --- a/packages/frontend/src/store.ts +++ b/packages/frontend/src/store.ts @@ -185,6 +185,10 @@ export const defaultStore = markRaw(new Storage('base', { where: 'device', default: 'respect' as 'respect' | 'force' | 'ignore', }, + highlightSensitiveMedia: { + where: 'device', + default: false, + }, animation: { where: 'device', default: !window.matchMedia('(prefers-reduced-motion)').matches, -- GitLab