summaryrefslogtreecommitdiffstats
path: root/src/ui/objects/SideNavItem.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/objects/SideNavItem.tsx')
-rw-r--r--src/ui/objects/SideNavItem.tsx33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/ui/objects/SideNavItem.tsx b/src/ui/objects/SideNavItem.tsx
new file mode 100644
index 0000000..fb8f523
--- /dev/null
+++ b/src/ui/objects/SideNavItem.tsx
@@ -0,0 +1,33 @@
1import type { HTMLTag, Polymorphic } from "corvos/plugins/jsx.ts";
2
3export type Props<Tag extends HTMLTag> = Polymorphic<{
4 as: Tag;
5 icon?: JSX.Element;
6 pre?: JSX.Element;
7 post?: JSX.Element;
8 selected?: boolean;
9}>;
10
11export const SideNavItem = <T extends HTMLTag = "a">({
12 children,
13 as: Tag = "a" as T,
14 icon,
15 pre,
16 post,
17 selected,
18 class: cls,
19 ...props
20}: Props<T>) => (
21 <Tag
22 aria-current={selected ? "location" : undefined}
23 class:list={["o-side-nav__item", { "is-selected": selected }, cls]}
24 role="menuitem"
25 {...props}
26 >
27 {icon && <div class="l-media__block o-side-nav__icon-slot">{icon}</div>}
28
29 <div class="l-media__block l-media__block--main">
30 {pre} {children} {post}
31 </div>
32 </Tag>
33);