character-ref/src/components/navigation.webc

181 lines
3.6 KiB
Text

<nav :aria-label="label" webc:root="override">
<a class="home link" href="/#characters"><icon icon="fa7-solid:chevron-left"></icon>Home</a>
<label for="nav-toggle">
<icon icon="fa7-solid:bars"></icon>
</label>
<input type="checkbox" id="nav-toggle" />
<template
webc:nokeep
@html="eleventyNavigationToHtml(eleventyNavigation($data.collections[collection]), {
listClass: 'list',
listItemClass: 'item',
listItemHasChildrenClass: 'hasChildren',
activeListItemClass: 'item-active',
anchorClass: 'link',
activeAnchorClass: 'link-active',
activeKey: $data.eleventyNavigation.key,
showExcerpt: false
})"
></template>
</nav>
<style webc:scoped="character-nav">
:host {
--nav-spacing: 1em;
--nav-background-color: var(--clr-nav-background);
--nav-border: var(--border-thin) solid var(--clr-box-border);
--box-shadow: 0.125em 0.125em 0.75em 0.25em var(--clr-box-shadow);
position: sticky;
inset: 0.5em;
display: grid;
grid-auto-flow: column;
justify-content: space-between;
justify-items: end;
align-items: center;
gap: 1em;
background-color: var(--nav-background-color);
box-shadow: var(--box-shadow);
margin-block: 0.5em 0;
margin-inline: 0.5em;
border-radius: inherit;
border-block-end: var(--nav-border);
z-index: 2;
@media (min-width: 48em) {
--nav-spacing: 1.5em;
--nav-background-color: transparent;
--nav-border: none;
box-shadow: none;
}
@media (min-width: 64em) {
--nav-spacing: 1.5em;
}
}
:host:has(#nav-toggle:checked) .list {
opacity: 1;
}
:host:has(#nav-toggle:checked) .item {
height: 100%;
}
:host label[for='nav-toggle'] {
width: 1.5em;
height: 1.5em;
margin-block: 0.75em;
margin-inline: 1em;
@media (min-width: 48em) {
display: none;
}
}
:host label[for='nav-toggle']:hover {
cursor: pointer;
}
:host #nav-toggle {
display: none;
}
:host .list {
--nav-items-position: absolute;
--nav-items-orientation: column nowrap;
position: var(--nav-items-position);
top: 3.5em;
display: flex;
flex-flow: var(--nav-items-orientation);
text-align: end;
list-style: none;
background-color: var(--clr-nav-background);
box-shadow: var(--box-shadow);
margin: 0;
border-block-start: none;
border-inline-end: none;
border-radius: inherit;
padding-inline: var(--nav-spacing);
z-index: 3;
opacity: 0;
transition: opacity 0.4s ease-in-out;
@media (min-width: 48em) {
--nav-items-position: static;
--nav-items-orientation: row nowrap;
align-items: start;
gap: 1em;
opacity: 1;
}
}
:host .item {
overflow: hidden;
height: 0;
transition: height 0.4s ease-in-out;
@media (min-width: 48em) {
height: 100%;
}
}
:host .link {
display: block;
font-weight: 500;
text-decoration: none;
color: var(--clr-nav-link, inherit);
padding-block: calc(var(--nav-spacing) / 2);
transition: color 0.4s ease;
& svg {
width: 1.25em;
height: 1.25em;
transition: fill 0.4s ease;
}
}
:host .home {
display: flex;
align-items: center;
gap: 0.125em;
padding-inline: 0.75em 1em;
z-index: 3;
@media (min-width: 48em) {
background-color: var(--clr-nav-background);
box-shadow: var(--box-shadow);
border-radius: inherit;
}
}
:host .link:hover {
color: var(--clr-nav-link-hover);
& svg {
fill: var(--clr-nav-link-hover);
}
}
:host .link-active {
color: var(--clr-nav-link-active);
}
</style>