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> class="_button"
<div :style="{ background: bg }"
:class="[$style.header, { [$style.opened]: opened }]" @click="showBody = !showBody"
class="_button" >
role="button" <div class="title"><slot name="header"></slot></div>
data-cy-folder-header <div class="divider"></div>
@click="toggle" <button class="_button">
> <template v-if="showBody"
<div :class="$style.headerIcon"> ><i class="ph-caret-up ph-bold ph-lg"></i
<slot name="icon"></slot> ></template>
</div> <template v-else
<div :class="$style.headerText"> ><i class="ph-caret-down ph-bold ph-lg"></i
<div :class="$style.headerTextMain"> ></template>
<MkCondensedLine :minScale="2 / 3" </button>
><slot name="label"></slot </header>
></MkCondensedLine> <transition
</div> :name="$store.state.animation ? 'folder-toggle' : ''"
<div :class="$style.headerTextSub"> @enter="enter"
<slot name="caption"></slot> @after-enter="afterEnter"
</div> @leave="leave"
</div> @after-leave="afterLeave"
<div :class="$style.headerRight"> >
<span :class="$style.headerRightText" <div v-show="showBody">
><slot name="suffix"></slot <slot></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"
@afterEnter="afterEnter"
@leave="leave"
@afterLeave="afterLeave"
>
<KeepAlive>
<div v-show="opened">
<MkSpacer :marginMin="14" :marginMax="22">
<slot></slot>
</MkSpacer>
</div>
</KeepAlive>
</Transition>
</div> </div>
</MkStickyContainer> </transition>
</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;
maxHeight?: number | null;
}>(),
{
defaultOpen: false,
maxHeight: null,
}
);
const getBgColor = (el: HTMLElement) => { export default defineComponent({
const style = window.getComputedStyle(el); props: {
if ( expanded: {
style.backgroundColor && type: Boolean,
!["rgba(0, 0, 0, 0)", "rgba(0,0,0,0)", "transparent"].includes( required: false,
style.backgroundColor default: true,
) },
) { persistKey: {
return style.backgroundColor; type: String,
} else { required: false,
return el.parentElement ? getBgColor(el.parentElement) : "transparent"; 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"
);
}
},
},
mounted() {
function getParentBg(el: Element | null): string {
if (el == null || el.tagName === "BODY") return "var(--bg)";
const bg = el.style.background || el.style.backgroundColor;
if (bg) {
return bg;
} else {
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); const elementHeight = el.getBoundingClientRect().height;
let opened = $ref(props.defaultOpen); el.style.height = 0;
let openedAtLeastOnce = $ref(props.defaultOpen); el.offsetHeight; // reflow
el.style.height = elementHeight + "px";
function enter(el) { },
const elementHeight = el.getBoundingClientRect().height; afterEnter(el) {
el.style.height = 0; el.style.height = null;
el.offsetHeight; // reflow },
el.style.height = leave(el) {
Math.min(elementHeight, props.maxHeight ?? Infinity) + "px"; const elementHeight = el.getBoundingClientRect().height;
} el.style.height = elementHeight + "px";
el.offsetHeight; // reflow
function afterEnter(el) { el.style.height = 0;
el.style.height = null; },
} afterLeave(el) {
el.style.height = null;
function leave(el) { },
const elementHeight = el.getBoundingClientRect().height; },
el.style.height = elementHeight + "px";
el.offsetHeight; // reflow
el.style.height = 0;
}
function afterLeave(el) {
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;
}
&:empty {
display: none;
}
}
> .divider {
flex: 1;
margin: auto;
height: 1px;
background: var(--divider);
}
> button {
padding: 12px 0 12px 16px;
}
} }
&.active { &.max-width_500px {
color: var(--accent); > header {
background: var(--buttonHoverBg); > .title {
} padding: 8px 10px 8px 0;
}
&.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 {
display: none;
& + .headerText {
padding-left: 4px;
} }
} }
} }
.headerText {
white-space: nowrap;
text-overflow: ellipsis;
overflow: hidden;
padding-right: 12px;
}
.headerTextMain {
}
.headerTextSub {
color: var(--fgTransparentWeak);
font-size: 0.85em;
}
.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>