summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorかっこかり <67428053+kakkokari-gtyih@users.noreply.github.com>2024-10-19 18:02:09 +0900
committerGitHub <noreply@github.com>2024-10-19 18:02:09 +0900
commit2250e521e4bcfa1b162cd46091da1bead5abcac0 (patch)
tree908aac984abb83e32dee350e5b06b74a9f8fbb0f
parentenhance(frontend): Bull Dashboard に relationship queue を追加 (#14777) (diff)
downloadsharkey-2250e521e4bcfa1b162cd46091da1bead5abcac0.tar.gz
sharkey-2250e521e4bcfa1b162cd46091da1bead5abcac0.tar.bz2
sharkey-2250e521e4bcfa1b162cd46091da1bead5abcac0.zip
refactor(frontend): getBgColorを共通化 (#14782)
* refactor: getBgColor関数の切り出し + fix types (taiyme#291) * move thing * revert unnecesary changes --------- Co-authored-by: taiy <53635909+taiyme@users.noreply.github.com>
-rw-r--r--packages/frontend/src/components/MkContainer.vue24
-rw-r--r--packages/frontend/src/components/MkDateSeparatedList.vue8
-rw-r--r--packages/frontend/src/components/MkFoldableSection.vue52
-rw-r--r--packages/frontend/src/components/MkFolder.vue38
-rw-r--r--packages/frontend/src/components/global/MkPageHeader.tabs.vue27
-rw-r--r--packages/frontend/src/directives/adaptive-bg.ts12
-rw-r--r--packages/frontend/src/directives/adaptive-border.ts12
-rw-r--r--packages/frontend/src/directives/panel.ts12
-rw-r--r--packages/frontend/src/scripts/get-bg-color.ts18
9 files changed, 94 insertions, 109 deletions
diff --git a/packages/frontend/src/components/MkContainer.vue b/packages/frontend/src/components/MkContainer.vue
index 8ab01d7db8..f513795c56 100644
--- a/packages/frontend/src/components/MkContainer.vue
+++ b/packages/frontend/src/components/MkContainer.vue
@@ -64,26 +64,30 @@ const showBody = ref(props.expanded);
const ignoreOmit = ref(false);
const omitted = ref(false);
-function enter(el) {
+function enter(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
const elementHeight = el.getBoundingClientRect().height;
- el.style.height = 0;
+ el.style.height = '0';
el.offsetHeight; // reflow
- el.style.height = Math.min(elementHeight, props.maxHeight ?? Infinity) + 'px';
+ el.style.height = `${Math.min(elementHeight, props.maxHeight ?? Infinity)}px`;
}
-function afterEnter(el) {
- el.style.height = null;
+function afterEnter(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
+ el.style.height = '';
}
-function leave(el) {
+function leave(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
const elementHeight = el.getBoundingClientRect().height;
- el.style.height = elementHeight + 'px';
+ el.style.height = `${elementHeight}px`;
el.offsetHeight; // reflow
- el.style.height = 0;
+ el.style.height = '0';
}
-function afterLeave(el) {
- el.style.height = null;
+function afterLeave(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
+ el.style.height = '';
}
const calcOmit = () => {
diff --git a/packages/frontend/src/components/MkDateSeparatedList.vue b/packages/frontend/src/components/MkDateSeparatedList.vue
index f04e5cf7c6..9c75f91cb2 100644
--- a/packages/frontend/src/components/MkDateSeparatedList.vue
+++ b/packages/frontend/src/components/MkDateSeparatedList.vue
@@ -128,14 +128,14 @@ export default defineComponent({
return children;
};
- function onBeforeLeave(element: Element) {
- const el = element as HTMLElement;
+ function onBeforeLeave(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
el.style.top = `${el.offsetTop}px`;
el.style.left = `${el.offsetLeft}px`;
}
- function onLeaveCancelled(element: Element) {
- const el = element as HTMLElement;
+ function onLeaveCancelled(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
el.style.top = '';
el.style.left = '';
}
diff --git a/packages/frontend/src/components/MkFoldableSection.vue b/packages/frontend/src/components/MkFoldableSection.vue
index 1717f8fc98..fb1b5220fb 100644
--- a/packages/frontend/src/components/MkFoldableSection.vue
+++ b/packages/frontend/src/components/MkFoldableSection.vue
@@ -5,7 +5,7 @@ SPDX-License-Identifier: AGPL-3.0-only
<template>
<div ref="rootEl" :class="$style.root">
- <header :class="$style.header" class="_button" :style="{ background: bg }" @click="showBody = !showBody">
+ <header :class="$style.header" class="_button" @click="showBody = !showBody">
<div :class="$style.title"><div><slot name="header"></slot></div></div>
<div :class="$style.divider"></div>
<button class="_button" :class="$style.button">
@@ -32,21 +32,23 @@ SPDX-License-Identifier: AGPL-3.0-only
<script lang="ts" setup>
import { onMounted, ref, shallowRef, watch } from 'vue';
-import tinycolor from 'tinycolor2';
import { miLocalStorage } from '@/local-storage.js';
import { defaultStore } from '@/store.js';
+import { getBgColor } from '@/scripts/get-bg-color.js';
const miLocalStoragePrefix = 'ui:folder:' as const;
const props = withDefaults(defineProps<{
expanded?: boolean;
- persistKey?: string;
+ persistKey?: string | null;
}>(), {
expanded: true,
+ persistKey: null,
});
-const rootEl = shallowRef<HTMLDivElement>();
-const bg = ref<string>();
+const rootEl = shallowRef<HTMLElement>();
+const parentBg = ref<string | null>(null);
+// eslint-disable-next-line vue/no-setup-props-reactivity-loss
const showBody = ref((props.persistKey && miLocalStorage.getItem(`${miLocalStoragePrefix}${props.persistKey}`)) ? (miLocalStorage.getItem(`${miLocalStoragePrefix}${props.persistKey}`) === 't') : props.expanded);
watch(showBody, () => {
@@ -55,47 +57,34 @@ watch(showBody, () => {
}
});
-function enter(element: Element) {
- const el = element as HTMLElement;
+function enter(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
const elementHeight = el.getBoundingClientRect().height;
el.style.height = '0';
el.offsetHeight; // reflow
- el.style.height = elementHeight + 'px';
+ el.style.height = `${elementHeight}px`;
}
-function afterEnter(element: Element) {
- const el = element as HTMLElement;
- el.style.height = 'unset';
+function afterEnter(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
+ el.style.height = '';
}
-function leave(element: Element) {
- const el = element as HTMLElement;
+function leave(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
const elementHeight = el.getBoundingClientRect().height;
- el.style.height = elementHeight + 'px';
+ el.style.height = `${elementHeight}px`;
el.offsetHeight; // reflow
el.style.height = '0';
}
-function afterLeave(element: Element) {
- const el = element as HTMLElement;
- el.style.height = 'unset';
+function afterLeave(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
+ el.style.height = '';
}
onMounted(() => {
- function getParentBg(el?: HTMLElement | null): string {
- if (el == null || el.tagName === 'BODY') return 'var(--MI_THEME-bg)';
- const background = el.style.background || el.style.backgroundColor;
- if (background) {
- return background;
- } else {
- return getParentBg(el.parentElement);
- }
- }
-
- const rawBg = getParentBg(rootEl.value);
- const _bg = tinycolor(rawBg.startsWith('var(') ? getComputedStyle(document.documentElement).getPropertyValue(rawBg.slice(4, -1)) : rawBg);
- _bg.setAlpha(0.85);
- bg.value = _bg.toRgbString();
+ parentBg.value = getBgColor(rootEl.value?.parentElement);
});
</script>
@@ -121,6 +110,7 @@ onMounted(() => {
top: var(--MI-stickyTop, 0px);
-webkit-backdrop-filter: var(--MI-blur, blur(8px));
backdrop-filter: var(--MI-blur, blur(20px));
+ background-color: color(from v-bind("parentBg ?? 'var(--bg)'") srgb r g b / 0.85);
}
.title {
diff --git a/packages/frontend/src/components/MkFolder.vue b/packages/frontend/src/components/MkFolder.vue
index 5f9500d923..7bdc06a8b4 100644
--- a/packages/frontend/src/components/MkFolder.vue
+++ b/packages/frontend/src/components/MkFolder.vue
@@ -56,8 +56,9 @@ SPDX-License-Identifier: AGPL-3.0-only
</template>
<script lang="ts" setup>
-import { nextTick, onMounted, shallowRef, ref } from 'vue';
+import { nextTick, onMounted, ref, shallowRef } from 'vue';
import { defaultStore } from '@/store.js';
+import { getBgColor } from '@/scripts/get-bg-color.js';
const props = withDefaults(defineProps<{
defaultOpen?: boolean;
@@ -69,40 +70,35 @@ const props = withDefaults(defineProps<{
withSpacer: true,
});
-const getBgColor = (el: HTMLElement) => {
- const style = window.getComputedStyle(el);
- if (style.backgroundColor && !['rgba(0, 0, 0, 0)', 'rgba(0,0,0,0)', 'transparent'].includes(style.backgroundColor)) {
- return style.backgroundColor;
- } else {
- return el.parentElement ? getBgColor(el.parentElement) : 'transparent';
- }
-};
-
const rootEl = shallowRef<HTMLElement>();
const bgSame = ref(false);
const opened = ref(props.defaultOpen);
const openedAtLeastOnce = ref(props.defaultOpen);
-function enter(el) {
+function enter(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
const elementHeight = el.getBoundingClientRect().height;
- el.style.height = 0;
+ el.style.height = '0';
el.offsetHeight; // reflow
- el.style.height = Math.min(elementHeight, props.maxHeight ?? Infinity) + 'px';
+ el.style.height = `${Math.min(elementHeight, props.maxHeight ?? Infinity)}px`;
}
-function afterEnter(el) {
- el.style.height = null;
+function afterEnter(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
+ el.style.height = '';
}
-function leave(el) {
+function leave(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
const elementHeight = el.getBoundingClientRect().height;
- el.style.height = elementHeight + 'px';
+ el.style.height = `${elementHeight}px`;
el.offsetHeight; // reflow
- el.style.height = 0;
+ el.style.height = '0';
}
-function afterLeave(el) {
- el.style.height = null;
+function afterLeave(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
+ el.style.height = '';
}
function toggle() {
@@ -117,7 +113,7 @@ function toggle() {
onMounted(() => {
const computedStyle = getComputedStyle(document.documentElement);
- const parentBg = getBgColor(rootEl.value!.parentElement!);
+ const parentBg = getBgColor(rootEl.value?.parentElement) ?? 'transparent';
const myBg = computedStyle.getPropertyValue('--MI_THEME-panel');
bgSame.value = parentBg === myBg;
});
diff --git a/packages/frontend/src/components/global/MkPageHeader.tabs.vue b/packages/frontend/src/components/global/MkPageHeader.tabs.vue
index adf8638dae..aaef8b8fca 100644
--- a/packages/frontend/src/components/global/MkPageHeader.tabs.vue
+++ b/packages/frontend/src/components/global/MkPageHeader.tabs.vue
@@ -53,7 +53,7 @@ export type Tab = {
</script>
<script lang="ts" setup>
-import { onMounted, onUnmounted, watch, nextTick, shallowRef } from 'vue';
+import { nextTick, onMounted, onUnmounted, shallowRef, watch } from 'vue';
import { defaultStore } from '@/store.js';
const props = withDefaults(defineProps<{
@@ -120,14 +120,14 @@ function onTabWheel(ev: WheelEvent) {
let entering = false;
-async function enter(element: Element) {
+async function enter(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
entering = true;
- const el = element as HTMLElement;
const elementWidth = el.getBoundingClientRect().width;
el.style.width = '0';
el.style.paddingLeft = '0';
- el.offsetWidth; // force reflow
- el.style.width = elementWidth + 'px';
+ el.offsetWidth; // reflow
+ el.style.width = `${elementWidth}px`;
el.style.paddingLeft = '';
nextTick(() => {
entering = false;
@@ -136,22 +136,23 @@ async function enter(element: Element) {
setTimeout(renderTab, 170);
}
-function afterEnter(element: Element) {
- //el.style.width = '';
+function afterEnter(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
+ // element.style.width = '';
}
-async function leave(element: Element) {
- const el = element as HTMLElement;
+async function leave(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
const elementWidth = el.getBoundingClientRect().width;
- el.style.width = elementWidth + 'px';
+ el.style.width = `${elementWidth}px`;
el.style.paddingLeft = '';
- el.offsetWidth; // force reflow
+ el.offsetWidth; // reflow
el.style.width = '0';
el.style.paddingLeft = '0';
}
-function afterLeave(element: Element) {
- const el = element as HTMLElement;
+function afterLeave(el: Element) {
+ if (!(el instanceof HTMLElement)) return;
el.style.width = '';
}
diff --git a/packages/frontend/src/directives/adaptive-bg.ts b/packages/frontend/src/directives/adaptive-bg.ts
index 45891de889..f88996019f 100644
--- a/packages/frontend/src/directives/adaptive-bg.ts
+++ b/packages/frontend/src/directives/adaptive-bg.ts
@@ -4,19 +4,11 @@
*/
import { Directive } from 'vue';
+import { getBgColor } from '@/scripts/get-bg-color.js';
export default {
mounted(src, binding, vn) {
- const getBgColor = (el: HTMLElement) => {
- const style = window.getComputedStyle(el);
- if (style.backgroundColor && !['rgba(0, 0, 0, 0)', 'rgba(0,0,0,0)', 'transparent'].includes(style.backgroundColor)) {
- return style.backgroundColor;
- } else {
- return el.parentElement ? getBgColor(el.parentElement) : 'transparent';
- }
- };
-
- const parentBg = getBgColor(src.parentElement);
+ const parentBg = getBgColor(src.parentElement) ?? 'transparent';
const myBg = window.getComputedStyle(src).backgroundColor;
diff --git a/packages/frontend/src/directives/adaptive-border.ts b/packages/frontend/src/directives/adaptive-border.ts
index 685ca38e96..1305f312bd 100644
--- a/packages/frontend/src/directives/adaptive-border.ts
+++ b/packages/frontend/src/directives/adaptive-border.ts
@@ -4,19 +4,11 @@
*/
import { Directive } from 'vue';
+import { getBgColor } from '@/scripts/get-bg-color.js';
export default {
mounted(src, binding, vn) {
- const getBgColor = (el: HTMLElement) => {
- const style = window.getComputedStyle(el);
- if (style.backgroundColor && !['rgba(0, 0, 0, 0)', 'rgba(0,0,0,0)', 'transparent'].includes(style.backgroundColor)) {
- return style.backgroundColor;
- } else {
- return el.parentElement ? getBgColor(el.parentElement) : 'transparent';
- }
- };
-
- const parentBg = getBgColor(src.parentElement);
+ const parentBg = getBgColor(src.parentElement) ?? 'transparent';
const myBg = window.getComputedStyle(src).backgroundColor;
diff --git a/packages/frontend/src/directives/panel.ts b/packages/frontend/src/directives/panel.ts
index 7b5969c679..aa26b94d0b 100644
--- a/packages/frontend/src/directives/panel.ts
+++ b/packages/frontend/src/directives/panel.ts
@@ -4,19 +4,11 @@
*/
import { Directive } from 'vue';
+import { getBgColor } from '@/scripts/get-bg-color.js';
export default {
mounted(src, binding, vn) {
- const getBgColor = (el: HTMLElement) => {
- const style = window.getComputedStyle(el);
- if (style.backgroundColor && !['rgba(0, 0, 0, 0)', 'rgba(0,0,0,0)', 'transparent'].includes(style.backgroundColor)) {
- return style.backgroundColor;
- } else {
- return el.parentElement ? getBgColor(el.parentElement) : 'transparent';
- }
- };
-
- const parentBg = getBgColor(src.parentElement);
+ const parentBg = getBgColor(src.parentElement) ?? 'transparent';
const myBg = getComputedStyle(document.documentElement).getPropertyValue('--MI_THEME-panel');
diff --git a/packages/frontend/src/scripts/get-bg-color.ts b/packages/frontend/src/scripts/get-bg-color.ts
new file mode 100644
index 0000000000..ccf60b454f
--- /dev/null
+++ b/packages/frontend/src/scripts/get-bg-color.ts
@@ -0,0 +1,18 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import tinycolor from 'tinycolor2';
+
+export const getBgColor = (elem?: Element | null | undefined): string | null => {
+ if (elem == null) return null;
+
+ const { backgroundColor: bg } = window.getComputedStyle(elem);
+
+ if (bg && tinycolor(bg).getAlpha() !== 0) {
+ return bg;
+ }
+
+ return getBgColor(elem.parentElement);
+};