import { LitElement, html, css } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import './ui-link'; @customElement('nav-bar') export class NavBar extends LitElement { static styles = css` nav { backdrop-filter: blur(18px) saturate(180%); -webkit-backdrop-filter: blur(18px) saturate(180%); background: var(--color-bg-nav); border-bottom: 1px solid var(--color-border); display: flex; justify-content: space-between; align-items: center; padding: 0 2rem; height: 3.5rem; position: sticky; top: 0; z-index: 100; transition: background 0.3s ease; } .brand { display: flex; align-items: center; gap: 0.65rem; user-select: none; cursor: default; } .brand img { width: auto; height: 1.6rem; flex-shrink: 0; } .brand span { font-weight: 700; font-size: 1.05rem; letter-spacing: -0.02em; background: linear-gradient( 135deg, var(--color-text) 0%, var(--color-accent) 100% ); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .links { display: flex; gap: 1.75rem; align-items: center; } .theme-toggle { position: relative; display: grid; place-items: center; width: 2.25rem; height: 2.25rem; padding: 0; margin-left: 0.5rem; background: transparent; border: 1px solid var(--color-border); border-radius: 0.5rem; color: var(--color-text); cursor: pointer; transition: border-color 0.25s ease, color 0.25s ease, background 0.25s ease, transform 0.2s ease; overflow: hidden; } .theme-toggle:hover { border-color: var(--color-accent); color: var(--color-accent); background: color-mix(in srgb, var(--color-accent) 8%, transparent); transform: scale(1.05); } .theme-toggle:active { transform: scale(0.95); } .icon { position: absolute; width: 1.1rem; height: 1.1rem; opacity: 0; transform: rotate(-90deg) scale(0.6); transition: opacity 0.35s ease, transform 0.35s ease; pointer-events: none; } .icon.visible { opacity: 1; transform: rotate(0deg) scale(1); } `; @state() theme: 'light' | 'dark' = (localStorage.getItem('theme') as 'light' | 'dark') || (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'); firstUpdated() { document.documentElement.setAttribute('data-theme', this.theme); } toggleTheme() { this.theme = this.theme === 'light' ? 'dark' : 'light'; document.documentElement.setAttribute('data-theme', this.theme); localStorage.setItem('theme', this.theme); } render() { return html` `; } }