tethys.backend/resources/js/Components/NavBarItem.vue
Arno Kaimbacher cefd9081ae
Some checks failed
CI Pipeline / japa-tests (push) Failing after 52s
- add AvatarController.ts
- adapted menu.ts, NavBar.vue, NavBarItem.vue for highlighting active nav item
- NavBarItemLabel.vue for app menu highlighting
- adapted routes.ts
- adapted app.edge for new favicon
- adapted LayoutAuthenticated.vue (:showAsideMenu="false") for showing AsideMenu optional
- new material icons: BriefcaseCheck.vue, SwapHorizontal.vue, AccountGroup.vue, Lock.vue
- started with FirstRunWizard
2023-12-15 17:17:33 +01:00

143 lines
3.5 KiB
Vue

<script lang="ts" setup>
import { StyleService } from '@/Stores/style';
// import { Link } from '@inertiajs/vue3'
import { Link } from '@inertiajs/vue3';
import { computed } from 'vue';
import { stardust } from '@eidellev/adonis-stardust/client';
const props = defineProps({
href: {
type: String,
default: null,
},
routeName: {
type: String,
default: null,
},
param: {
type: Number,
},
type: {
type: String,
default: 'flex',
},
activeColor: {
type: String,
default: null,
},
isDesktopIconOnly: Boolean,
dropdown: Boolean,
active: Boolean,
underline: {
type: Boolean,
default: false,
},
});
const is = computed(() => {
if (props.href) {
return 'a';
}
if (props.routeName) {
return Link;
}
return 'div';
});
const styleStore = StyleService();
// const activeColor = props.activeColor ?? `${styleStore.navBarItemLabelActiveColorStyle} dark:text-slate-400`;
// const active = computed(() => {
// if (props.routeName && stardust.isCurrent(props.routeName)) {
// return true;
// }
// else {
// return false;
// }
// });
const activeClass = computed(() => {
if (props.routeName && stardust.isCurrent(props.routeName)) {
// console.log(props.item.route);
const activeCls = [
styleStore.navBarItemLabelActiveColorStyle,
'dark:text-slate-400'
];
if (props.underline) {
activeCls.push('app-menu-entry__active');
}
// return `${styleStore.navBarItemLabelActiveColorStyle} dark:text-slate-400 app-menu-entry__active`;
return activeCls;
} else {
return null;
}
});
// const activeClass = computed(
// // () => props.routeName && route().current(props.routeName) == true ? props.activeColor : null
// () => (props.routeName && stardust.isCurrent(props.routeName) ? props.activeColor : null),
// );
// const itemRoute = computed(() => (props.routeName ? stardust.route(props.routeName): ''));
const componentClass = computed(() => {
const base = [
props.type,
`${styleStore.navBarItemLabelStyle} dark:text-white dark:hover:text-slate-400 ${styleStore.navBarItemLabelHoverStyle}`,
// props.active
// ? activeColor
// : `${styleStore.navBarItemLabelStyle} dark:text-white dark:hover:text-slate-400 ${styleStore.navBarItemLabelHoverStyle}`,
];
if (props.type === 'block') {
base.push('lg:flex');
}
if (!props.dropdown) {
base.push('py-2', 'px-3');
} else {
base.push('p-0', 'lg:py-2', 'lg:px-3');
}
if (props.isDesktopIconOnly) {
base.push('lg:w-16', 'lg:justify-center');
}
return base;
});
</script>
<template>
<component :is="is" class="items-center grow-0 shrink-0 relative cursor-pointer" :class="[componentClass, activeClass]"
:href="routeName ? stardust.route(props.routeName, [props.param]) : href">
<slot />
</component>
</template>
<style lang="css" scoped>
.app-menu-entry__active {
opacity: 1;
}
.app-menu-entry__active::before {
content: "___";
position: absolute;
pointer-events: none;
/* border-bottom-color: var(--color-main-background); */
/* transform: translateX(-50%); */
width: 100%;
/* height: 5px; */
border-radius: 3px;
background-color: var(--color-primary-element-text);
/* left: 50%; */
bottom: 6px;
display: block;
transition: all 0.1s ease-in-out;
opacity: 1;
}
</style>