-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathheader.tsx
More file actions
120 lines (106 loc) · 3.22 KB
/
header.tsx
File metadata and controls
120 lines (106 loc) · 3.22 KB
1
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import type { Page } from "@greenwood/cli";
import wccLogo from "../../assets/wcc-logo.svg?type=raw";
import mobileMenuIcon from "../../assets/tile.svg?type=raw";
import styles from "./header.module.css";
function getNavItemsHtml(navItems: Page[], isMobile: boolean, currentRoute: string): string {
const itemClass = isMobile ? styles.mobileMenuListItem : styles.navBarMenuItem;
return navItems
.map((item) => {
const { route, label } = item;
const isActiveClass = currentRoute === item.route ? 'class="active"' : "";
return `
<li class="${itemClass}">
<a href="${route}" ${isActiveClass} title="${label}">${label}</a>
</li>
`;
})
.join("");
}
export default class Header extends HTMLElement {
currentRoute: string;
navItems: Page[];
constructor() {
super();
this.currentRoute = "";
this.navItems = [];
}
async connectedCallback() {
this.currentRoute = "/playground/";
this.navItems = [
{
id: "index",
title: "Home",
route: "http://wcc.dev/",
label: "Home",
},
{
id: "docs",
title: "Docs",
route: "http://wcc.dev/docs/",
label: "Docs",
},
{
id: "examples",
title: "Examples",
route: "http://wcc.dev/examples/",
label: "Examples",
},
{
id: "playground",
title: "Playground",
route: "/playground/",
label: "Playground",
},
];
this.render();
}
render() {
const mainNavHtml = getNavItemsHtml(this.navItems, false, this.currentRoute);
const mobileNavHtml = getNavItemsHtml(this.navItems, true, this.currentRoute);
return (
<header class={styles.container}>
<a href="/" title="WCC Home Page" class={styles.logoLink}>
{wccLogo}
</a>
<div class={styles.navBar}>
<nav role="navigation" aria-label="Main">
<ul class={styles.navBarMenu}>{mainNavHtml}</ul>
</nav>
</div>
<div class={styles.badgeContainer}>
<a class={styles.badge} href="https://github.com/ProjectEvergreen/wcc" target="_blank">
<img
src="https://img.shields.io/github/stars/ProjectEvergreen/wcc?style=social&label=GitHub"
alt="WCC GitHub badge"
width={135}
class="github-badge"
/>
</a>
</div>
<button
class={styles.mobileMenuIcon}
popovertarget="mobile-menu"
aria-label="Mobile Menu Icon Button"
>
{mobileMenuIcon}
</button>
<div id="mobile-menu" popover="manual" class={styles.mobileMenuContainer}>
<div class={styles.mobileMenuBackdrop}>
<button
class={styles.mobileMenuCloseButton}
popovertarget="mobile-menu"
popovertargetaction="hide"
aria-label="Mobile Menu Close Button"
>
×
</button>
<nav role="navigation" aria-label="Mobile">
<ul class={styles.mobileMenuList}>{mobileNavHtml}</ul>
</nav>
</div>
</div>
</header>
);
}
}
customElements.define("wcc-header", Header);