diff options
Diffstat (limited to 'src/ui/components/SiteNav.tsx')
| -rw-r--r-- | src/ui/components/SiteNav.tsx | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/ui/components/SiteNav.tsx b/src/ui/components/SiteNav.tsx new file mode 100644 index 0000000..7518e3c --- /dev/null +++ b/src/ui/components/SiteNav.tsx | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | import { Icon } from "$/ui/objects/Icon.tsx"; | ||
| 2 | |||
| 3 | import { nav } from "../../data/nav.ts"; | ||
| 4 | import { Navbar } from "../objects/Navbar.tsx"; | ||
| 5 | import { NavbarItem } from "../objects/NavbarItem.tsx"; | ||
| 6 | |||
| 7 | export interface Props { | ||
| 8 | url: string; | ||
| 9 | } | ||
| 10 | |||
| 11 | export const SiteNav = ({ url }: Props) => { | ||
| 12 | const navItems = nav | ||
| 13 | .filter((item) => !item.hidden) | ||
| 14 | .map((item) => ({ | ||
| 15 | ...item, | ||
| 16 | selected: item.url === "/" ? item.url === url : new RegExp(`^${item.url}`).test(url), | ||
| 17 | })); | ||
| 18 | |||
| 19 | return ( | ||
| 20 | <> | ||
| 21 | <div class="c-site-nav-placeholder"></div> | ||
| 22 | |||
| 23 | <footer class="c-site-nav"> | ||
| 24 | <Navbar aria-label="Mainmenu" quiet variant="static-white"> | ||
| 25 | {navItems.map((item) => ( | ||
| 26 | <NavbarItem | ||
| 27 | href={item.url} | ||
| 28 | icon={<Icon icon={item.icon} variant={item.selected ? "fill" : "regular"} />} | ||
| 29 | selected={item.selected} | ||
| 30 | > | ||
| 31 | {item.label} | ||
| 32 | </NavbarItem> | ||
| 33 | ))} | ||
| 34 | </Navbar> | ||
| 35 | </footer> | ||
| 36 | </> | ||
| 37 | ); | ||
| 38 | }; | ||
