mirror of
https://github.com/muerwre/muerwre.github.io.git
synced 2025-04-25 02:46:39 +07:00
158 lines
2.6 KiB
Vue
158 lines
2.6 KiB
Vue
<template>
|
|
<div
|
|
v-if="children?.length || !url"
|
|
:class="[$style.container, { [$style.secondary]: secondary }]"
|
|
>
|
|
<div :class="$style.heading">
|
|
{{ title }}
|
|
</div>
|
|
|
|
<div :class="$style.children">
|
|
<LayoutMainMenuRow
|
|
v-for="item in children"
|
|
key="item._path"
|
|
:title="item.title"
|
|
:url="item._path"
|
|
:children="item.children"
|
|
secondary
|
|
/>
|
|
</div>
|
|
</div>
|
|
|
|
<div v-else :class="$style.row">
|
|
<NuxtLink :to="url" :class="$style.link" :exactActiveClass="$style.active"
|
|
>{{ title }}
|
|
</NuxtLink>
|
|
</div>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
interface Props {
|
|
title: string;
|
|
url?: string;
|
|
children?: Child[];
|
|
secondary?: boolean;
|
|
}
|
|
|
|
interface Child {
|
|
title: string;
|
|
_path: string;
|
|
children: Child[];
|
|
}
|
|
|
|
defineProps<Props>();
|
|
</script>
|
|
|
|
<script lang="ts">
|
|
export default defineComponent({
|
|
mounted() {
|
|
const active = document.querySelector(
|
|
`.${this.$style.link}.${this.$style.active}`
|
|
);
|
|
if (!active) return;
|
|
|
|
active?.scrollIntoView({ block: "center" });
|
|
},
|
|
});
|
|
</script>
|
|
|
|
<style lang="scss" module>
|
|
@mixin tree {
|
|
&::before {
|
|
content: " ";
|
|
background-color: var(--color-menu-line);
|
|
width: 10px;
|
|
height: 1px;
|
|
position: absolute;
|
|
top: 0.6em;
|
|
left: -17px;
|
|
}
|
|
}
|
|
|
|
.container {
|
|
position: relative;
|
|
|
|
&.secondary {
|
|
padding: 7px 2px 0;
|
|
|
|
&::before {
|
|
content: " ";
|
|
background-color: var(--color-menu-line);
|
|
width: 1px;
|
|
position: absolute;
|
|
top: -22px;
|
|
bottom: 13px;
|
|
left: -16px;
|
|
}
|
|
|
|
&:first-child::before {
|
|
top: -4px;
|
|
}
|
|
|
|
&:last-child::before {
|
|
bottom: auto;
|
|
height: 40px;
|
|
}
|
|
}
|
|
}
|
|
.row {
|
|
padding: 3px 2px;
|
|
position: relative;
|
|
|
|
&::before {
|
|
content: " ";
|
|
background-color: var(--color-menu-line);
|
|
width: 1px;
|
|
position: absolute;
|
|
top: -14px;
|
|
bottom: 13px;
|
|
left: -16px;
|
|
}
|
|
|
|
&:first-child::before {
|
|
top: -4px;
|
|
}
|
|
|
|
&:last-child::before {
|
|
bottom: auto;
|
|
height: 30px;
|
|
}
|
|
|
|
&:only-child::before {
|
|
height: 19px;
|
|
}
|
|
}
|
|
|
|
.heading {
|
|
font-weight: 600;
|
|
display: flex;
|
|
align-items: center;
|
|
text-transform: uppercase;
|
|
position: relative;
|
|
color: var(--color-menu-title);
|
|
|
|
.secondary & {
|
|
@include tree;
|
|
}
|
|
}
|
|
|
|
.link {
|
|
color: var(--color-menu-link);
|
|
text-decoration: none;
|
|
line-height: 1.4em;
|
|
position: relative;
|
|
|
|
@include tree;
|
|
|
|
&.active {
|
|
color: var(--color-menu-link-active);
|
|
font-weight: bold;
|
|
}
|
|
}
|
|
|
|
.children {
|
|
padding: 0 0 0 16px;
|
|
margin: 10px 3px;
|
|
position: relative;
|
|
}
|
|
</style>
|