zulip/components/nav-bar.js

64 lines
1.4 KiB
JavaScript
Raw Permalink Normal View History

2026-03-04 11:13:15 -08:00
// components/nav-bar.js
import { LitElement, html, css } from 'lit'
2026-03-04 18:26:43 -08:00
import { store } from '../store/index.js'
import { StoreController } from "../controllers/store-controller.js";
2026-03-04 11:13:15 -08:00
class NavBar extends LitElement {
2026-03-04 18:26:43 -08:00
#route = new StoreController(this, store, s => s.route)
2026-03-04 11:13:15 -08:00
static properties = {
2026-03-04 18:26:43 -08:00
user: { type: Object }
2026-03-04 11:13:15 -08:00
}
static styles = css`
:host {
display: block;
padding: 0 1.5rem;
border-bottom: 1px solid #e2e8f0;
}
nav {
display: flex;
align-items: center;
justify-content: space-between;
height: 3.5rem;
}
.links { display: flex; gap: 1.5rem; }
a {
cursor: pointer;
font-size: 0.9rem;
color: #64748b;
text-decoration: none;
}
a[active] { color: #0f172a; font-weight: 600; }
.user { font-size: 0.85rem; color: #94a3b8; }
`
#navigate(route, e) {
e.preventDefault()
2026-03-04 18:26:43 -08:00
store.getState().navigate(route)
2026-03-04 11:13:15 -08:00
}
#link(route, label) {
return html`
<a
2026-03-04 11:13:15 -08:00
href="/${route}"
2026-03-04 18:26:43 -08:00
?active=${this.#route.value === route}
2026-03-04 11:13:15 -08:00
@click=${(e) => this.#navigate(route, e)}
>${label}</a>
`
}
render() {
return html`
<nav>
<div class="links">
${this.#link('home', 'Home')}
${this.#link('items', 'Items')}
</div>
<span class="user">${this.user?.name ?? 'Guest'}</span>
</nav>
`
}
}
2026-03-04 18:26:43 -08:00
customElements.define('nav-bar', NavBar)