Newer
Older
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<template v-if="Array.isArray(nav)">
<ol
v-if="nav.length > 0"
class="a-nav-menu tw-p-0 tw-m-0 tw-mb-2 tw-flex tw-flex-col tw-gap-2"
:class="`a-nav-menu-level-${level}`"
v-bind="attrs"
>
<li v-for="(navItem, navItemIndex) of nav" :key="navItemIndex" class="tw-block">
<ANavMenu :nav="navItem" :level="level + 1" />
</li>
</ol>
</template>
<template v-else>
<RouterLink
v-if="nav.link && !nav.link.requiresAdmin"
:to="nav.link.route"
:data-testid="nav.link.testId"
active-class="has-active-child"
exact-active-class="is-active"
class="a-nav-link tw-no-underline tw-block tw-py-3 tw-px-6"
v-bind="attrs"
>
<SafeHTML :html="nav.link.label" sanitize-preset="inline-noninteractive" />
</RouterLink>
<template v-if="nav.menus">
<template v-for="(menuItem, menuItemIndex) in nav.menus" :key="menuItemIndex">
<div class="tw-ml-4 tw-mt-2">
<p
class="a-nav-label tw-m-0 tw-px-6 tw-py-1 tw-text-gray-500 tw-text-sm tw-leading-snug tw-truncate"
v-bind="attrs"
:title="sanitizeHTML(menuItem.title, 'strip')"
>
<SafeHTML :html="menuItem.title" sanitize-preset="inline-noninteractive" />
</p>
<ANavMenu :nav="menuItem.items" :level="level" />
</div>
</template>
</template>
<script setup lang="ts">
import SafeHTML from '@/components/generic/SafeHTML'
import { MenuItem } from '@/components/nav/nav'
import { useAttrs } from 'vue'
import { sanitizeHTML } from '@/util'
defineOptions({
inheritAttrs: false,
compatConfig: { MODE: 3 },
})
withDefaults(
defineProps<{
nav: MenuItem | MenuItem[]
level?: number
}>(),
{
level: 0,
},
)
const attrs = useAttrs()
</script>
<style lang="postcss" scoped>
.a-nav-menu {
@apply tw-font-medium;
&.a-nav-menu-level-0 > li {
&:has(ol) + li {
@apply !tw-mt-3;
}
}
@apply tw-bg-white tw-rounded tw-transition-colors tw-border tw-border-solid tw-border-black/5;
color: inherit;
&:hover {
@apply tw-bg-blue-100;
}
&.is-active {
@apply tw-bg-aura-primary tw-text-white;