Revert "chore: rebase to v13 MkFolder"

This reverts commit 8783cf0adfc7018ac1053d0ec1cd5df1517229ca.
This commit is contained in:
ThatOneCalculator 2023-05-25 22:17:19 -07:00
parent f738da9842
commit 3f1aeda46c

View file

@ -1,260 +1,195 @@
<template> <template>
<div ref="rootEl" :class="$style.root" role="group" :aria-expanded="opened"> <div v-size="{ max: [500] }" class="ssazuxis">
<MkStickyContainer> <header
<template #header>
<div
:class="[$style.header, { [$style.opened]: opened }]"
class="_button" class="_button"
role="button" :style="{ background: bg }"
data-cy-folder-header @click="showBody = !showBody"
@click="toggle"
> >
<div :class="$style.headerIcon"> <div class="title"><slot name="header"></slot></div>
<slot name="icon"></slot> <div class="divider"></div>
</div> <button class="_button">
<div :class="$style.headerText"> <template v-if="showBody"
<div :class="$style.headerTextMain"> ><i class="ph-caret-up ph-bold ph-lg"></i
<MkCondensedLine :minScale="2 / 3" ></template>
><slot name="label"></slot <template v-else
></MkCondensedLine> ><i class="ph-caret-down ph-bold ph-lg"></i
</div> ></template>
<div :class="$style.headerTextSub"> </button>
<slot name="caption"></slot> </header>
</div> <transition
</div> :name="$store.state.animation ? 'folder-toggle' : ''"
<div :class="$style.headerRight">
<span :class="$style.headerRightText"
><slot name="suffix"></slot
></span>
<i v-if="opened" class="ti ti-chevron-up icon"></i>
<i v-else class="ti ti-chevron-down icon"></i>
</div>
</div>
</template>
<div
v-if="openedAtLeastOnce"
:class="[$style.body, { [$style.bgSame]: bgSame }]"
:style="{
maxHeight: maxHeight ? `${maxHeight}px` : null,
overflow: maxHeight ? `auto` : null,
}"
:aria-hidden="!opened"
>
<Transition
:enterActiveClass="
defaultStore.state.animation
? $style.transition_toggle_enterActive
: ''
"
:leaveActiveClass="
defaultStore.state.animation
? $style.transition_toggle_leaveActive
: ''
"
:enterFromClass="
defaultStore.state.animation
? $style.transition_toggle_enterFrom
: ''
"
:leaveToClass="
defaultStore.state.animation
? $style.transition_toggle_leaveTo
: ''
"
@enter="enter" @enter="enter"
@afterEnter="afterEnter" @after-enter="afterEnter"
@leave="leave" @leave="leave"
@afterLeave="afterLeave" @after-leave="afterLeave"
> >
<KeepAlive> <div v-show="showBody">
<div v-show="opened">
<MkSpacer :marginMin="14" :marginMax="22">
<slot></slot> <slot></slot>
</MkSpacer>
</div> </div>
</KeepAlive> </transition>
</Transition>
</div>
</MkStickyContainer>
</div> </div>
</template> </template>
<script lang="ts" setup> <script lang="ts">
import { nextTick, onMounted } from "vue"; import { defineComponent } from "vue";
import { defaultStore } from "@/store"; import tinycolor from "tinycolor2";
const props = withDefaults( const localStoragePrefix = "ui:folder:";
defineProps<{
defaultOpen?: boolean; export default defineComponent({
maxHeight?: number | null; props: {
}>(), expanded: {
{ type: Boolean,
defaultOpen: false, required: false,
maxHeight: null, default: true,
},
persistKey: {
type: String,
required: false,
default: null,
},
},
data() {
return {
bg: null,
showBody:
this.persistKey &&
localStorage.getItem(localStoragePrefix + this.persistKey)
? localStorage.getItem(
localStoragePrefix + this.persistKey
) === "t"
: this.expanded,
};
},
watch: {
showBody() {
if (this.persistKey) {
localStorage.setItem(
localStoragePrefix + this.persistKey,
this.showBody ? "t" : "f"
);
} }
); },
},
const getBgColor = (el: HTMLElement) => { mounted() {
const style = window.getComputedStyle(el); function getParentBg(el: Element | null): string {
if ( if (el == null || el.tagName === "BODY") return "var(--bg)";
style.backgroundColor && const bg = el.style.background || el.style.backgroundColor;
!["rgba(0, 0, 0, 0)", "rgba(0,0,0,0)", "transparent"].includes( if (bg) {
style.backgroundColor return bg;
)
) {
return style.backgroundColor;
} else { } else {
return el.parentElement ? getBgColor(el.parentElement) : "transparent"; return getParentBg(el.parentElement);
} }
}; }
const rawBg = getParentBg(this.$el);
const bg = tinycolor(
rawBg.startsWith("var(")
? getComputedStyle(document.documentElement).getPropertyValue(
rawBg.slice(4, -1)
)
: rawBg
);
bg.setAlpha(0.85);
this.bg = bg.toRgbString();
},
methods: {
toggleContent(show: boolean) {
this.showBody = show;
},
let rootEl = $shallowRef<HTMLElement>(); enter(el) {
let bgSame = $ref(false);
let opened = $ref(props.defaultOpen);
let openedAtLeastOnce = $ref(props.defaultOpen);
function enter(el) {
const elementHeight = el.getBoundingClientRect().height; const elementHeight = el.getBoundingClientRect().height;
el.style.height = 0; el.style.height = 0;
el.offsetHeight; // reflow el.offsetHeight; // reflow
el.style.height = el.style.height = elementHeight + "px";
Math.min(elementHeight, props.maxHeight ?? Infinity) + "px"; },
} afterEnter(el) {
function afterEnter(el) {
el.style.height = null; el.style.height = null;
} },
leave(el) {
function leave(el) {
const elementHeight = el.getBoundingClientRect().height; const elementHeight = el.getBoundingClientRect().height;
el.style.height = elementHeight + "px"; el.style.height = elementHeight + "px";
el.offsetHeight; // reflow el.offsetHeight; // reflow
el.style.height = 0; el.style.height = 0;
} },
afterLeave(el) {
function afterLeave(el) {
el.style.height = null; el.style.height = null;
} },
},
function toggle() {
if (!opened) {
openedAtLeastOnce = true;
}
nextTick(() => {
opened = !opened;
});
}
onMounted(() => {
const computedStyle = getComputedStyle(document.documentElement);
const parentBg = getBgColor(rootEl.parentElement);
const myBg = computedStyle.getPropertyValue("--panel");
bgSame = parentBg === myBg;
}); });
</script> </script>
<style lang="scss" module> <style lang="scss" scoped>
.transition_toggle_enterActive, .folder-toggle-enter-active,
.transition_toggle_leaveActive { .folder-toggle-leave-active {
overflow-y: clip; overflow-y: hidden;
transition: opacity 0.3s, height 0.3s, transform 0.3s !important; transition: opacity 0.5s, height 0.5s !important;
} }
.transition_toggle_enterFrom, .folder-toggle-enter-from {
.transition_toggle_leaveTo { opacity: 0;
}
.folder-toggle-leave-to {
opacity: 0; opacity: 0;
} }
.root { .ssazuxis {
display: block; position: relative;
}
.header { > header {
display: flex; display: flex;
align-items: center; position: relative;
width: 100%; z-index: 10;
box-sizing: border-box; position: sticky;
padding: 9px 12px 9px 12px; top: var(--stickyTop, 0px);
background: var(--buttonBg); padding: var(--x-padding);
-webkit-backdrop-filter: var(--blur, blur(15px)); -webkit-backdrop-filter: var(--blur, blur(8px));
backdrop-filter: var(--blur, blur(15px)); backdrop-filter: var(--blur, blur(20px));
border-radius: 6px; margin-inline: -12px;
transition: border-radius 0.3s; padding-inline: 12px;
mask: linear-gradient(
to right,
transparent,
black 12px calc(100% - 12px),
transparent
);
-webkit-mask: linear-gradient(
to right,
transparent,
black 12px calc(100% - 12px),
transparent
);
&:hover { > .title {
text-decoration: none; margin: 0;
background: var(--buttonHoverBg); padding: 12px 16px 12px 0;
> i {
margin-right: 6px;
} }
&.active {
color: var(--accent);
background: var(--buttonHoverBg);
}
&.opened {
border-radius: 6px 6px 0 0;
}
}
.headerUpper {
display: flex;
align-items: center;
}
.headerLower {
color: var(--fgTransparentWeak);
font-size: 0.85em;
padding-left: 4px;
}
.headerIcon {
margin-right: 0.75em;
flex-shrink: 0;
text-align: center;
opacity: 0.8;
&:empty { &:empty {
display: none; display: none;
& + .headerText {
padding-left: 4px;
} }
} }
}
.headerText { > .divider {
white-space: nowrap; flex: 1;
text-overflow: ellipsis; margin: auto;
overflow: hidden; height: 1px;
padding-right: 12px; background: var(--divider);
} }
.headerTextMain { > button {
} padding: 12px 0 12px 16px;
}
}
.headerTextSub { &.max-width_500px {
color: var(--fgTransparentWeak); > header {
font-size: 0.85em; > .title {
} padding: 8px 10px 8px 0;
}
.headerRight { }
margin-left: auto;
color: var(--fgTransparentWeak);
white-space: nowrap;
}
.headerRightText:not(:empty) {
margin-right: 0.75em;
}
.body {
background: var(--panel);
border-radius: 0 0 6px 6px;
container-type: inline-size;
&.bgSame {
background: var(--bg);
} }
} }
</style> </style>